diff --git a/ubl-settings-repo-back/Makefile b/ubl-settings-repo-back/Makefile
new file mode 100644
index 0000000..f84e9df
--- /dev/null
+++ b/ubl-settings-repo-back/Makefile
@@ -0,0 +1,146 @@
+#!/usr/bin/make -f
+
+#SHELL := /bin/bash
+MAKEFILE_FILEPATH := $(abspath $(lastword $(MAKEFILE_LIST)))
+MAKEFILE_DIR := $(notdir $(patsubst %/,%,$(dir $(MAKEFILE_FILEPATH))))
+MAKEFILE_PATH := $(dir $(MAKEFILE_FILEPATH))
+
+CMAKE_COMMAND = cmake
+CMAKE_SOURCE_DIR = $(MAKEFILE_PATH)source
+CMAKE_BUILD_DIR = $(MAKEFILE_PATH)compile
+#CMAKE_SOURCE_DIR = ./source
+#CMAKE_BUILD_DIR = ./compile
+DEPENDS = /bin/cmake
+PREFIX ?= /usr
+PKGNAME = $(MAKEFILE_DIR)
+#PKGNAME = ubl-settings-manager
+LATEST_TAG=
+default_target: all
+
+.PHONY: all init depend debug prepare check build uninstall install clean help
+
+all: init build
+
+init:
+ @echo "Initialize ..."; \
+ if [ -d ".git" ]; then \
+ LATEST_TAG=$$(git describe --tags | sed 's/^v//'|grep -oE "^[0-9]{1,}.[0-9]{1,}"); \
+ else \
+ LATEST_TAG="0.0"; \
+ fi; \
+ sed -r "s/^(string version_application).*/\1=\"$${LATEST_TAG}\";/" -i source/${PKGNAME}.h; \
+ echo "-- Build path: ${CMAKE_BUILD_DIR}"
+
+depend:
+ @echo "Check depends ..."
+ @for FILE_DEPEND in $(DEPENDS); do \
+ if [ ! -f $${FILE_DEPEND} ]; then \
+ echo "ERROR: Depend '$${FILE_DEPEND}' not found !"; \
+ exit 1; \
+ fi; \
+ done; \
+ echo "Check depends: OK"
+# $(CMAKE_COMMAND) -S$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) --check-build-system CMakeFiles/Makefile.cmake 1
+
+debug: init build
+ @echo "Debug ..."; \
+ if [ ! -d ${CMAKE_BUILD_DIR} ]; then \
+ $(CMAKE_COMMAND) -S${CMAKE_SOURCE_DIR} -B${CMAKE_BUILD_DIR} -DCMAKE_BUILD_TYPE=Debug -DCMAKE_INSTALL_PREFIX="${PREFIX}"; \
+ fi; \
+ echo "${CMAKE_BUILD_DIR}/${PKGNAME}"; \
+ cp ${CMAKE_BUILD_DIR}/${PKGNAME} ./; \
+ echo "Debug: OK"
+
+prepare:
+ @echo "Prepare ..."; \
+ if [ ! -d ${CMAKE_BUILD_DIR} ]; then \
+ $(CMAKE_COMMAND) -S${CMAKE_SOURCE_DIR} -B${CMAKE_BUILD_DIR} -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX="${PREFIX}"; \
+ fi; \
+ echo "Prepare: OK"
+
+check:
+ @echo "Check ..."; \
+ if [ -f ${CMAKE_BUILD_DIR}/${PKGNAME} ]; then \
+ echo "Check: OK"; \
+ else \
+ echo "Check: ${CMAKE_BUILD_DIR}/${PKGNAME} not found !"; \
+ exit 1; \
+ fi
+
+build: depend prepare
+ @echo "Build ..."; \
+ make --directory=${CMAKE_BUILD_DIR}; \
+ echo "Build: OK"
+
+uninstall:
+ @echo "Uninstall ..."
+ @for FILE_PO in $(wildcard *.po); do \
+ LANG=$${FILE_PO##*_};LANG=$${LANG%.*}; \
+ FILE_MO=$${FILE_PO##*/}; FILE_MO="$${FILE_MO%_*.po}.mo"; \
+ PATH_FILE_MO="${DESTDIR}${PREFIX}/share/locale/$${LANG}/LC_MESSAGES/$${FILE_MO}"; \
+ $(RM) "$${PATH_FILE_MO}"; \
+ done
+ @$(RM) "${DESTDIR}${PREFIX}/bin/${PKGNAME}"
+ @$(RM) "${DESTDIR}${PREFIX}/share/polkit-1/actions/com.ublinux.${PKGNAME}.policy"
+ @if [ -z ${DESTDIR} ]; then \
+ [ -d "${DESTDIR}${PREFIX}/share/icons/hicolor/" ] && gtk-update-icon-cache -fiq "${DESTDIR}${PREFIX}/share/icons/hicolor/" &>/dev/null || true; \
+ update-desktop-database --quiet &>/dev/null || true; \
+ [ -d "${DESTDIR}${PREFIX}/share/applications" ] && touch "${DESTDIR}${PREFIX}/share/applications" &>/dev/null || true; \
+ fi
+ @echo "Uninstall: OK"
+
+install: check uninstall
+ @echo "Install ..."
+#################################################### УДАЛИТЬ ПЕРЕД КОММИТОМ ################################################################################
+ @gcc source/ubl-settings-repo-back.c source/ubl-settings-repo-back.h source/ubl-strings.h -o ubl-settings-repo-back `pkg-config --cflags --libs gtk+-3.0 vte-2.91 webkit2gtk-4.0 webkit2gtk-web-extension-4.0` -g
+#################################################### УДАЛИТЬ ПЕРЕД КОММИТОМ ################################################################################
+ @for FILE_PO in $(wildcard *.po); do \
+ LANG=$${FILE_PO##*_};LANG=$${LANG%.*}; \
+ install -dm755 "${DESTDIR}${PREFIX}/share/locale/$${LANG}/LC_MESSAGES"; \
+ FILE_MO=$${FILE_PO##*/}; FILE_MO="$${FILE_MO%_*.po}.mo"; \
+ PATH_FILE_MO="${DESTDIR}${PREFIX}/share/locale/$${LANG}/LC_MESSAGES/$${FILE_MO}"; \
+ echo "$${FILE_PO}"; \
+ msgfmt "$${FILE_PO}" -v -f -o "$${PATH_FILE_MO}"; \
+ done
+ @install -dm755 "${DESTDIR}${PREFIX}/share/icons/hicolor/scalable/apps"
+ @install -dm755 "${DESTDIR}${PREFIX}/share/polkit-1/actions"
+ @install -Dm644 -t "${DESTDIR}${PREFIX}/share/polkit-1/actions/" "com.ublinux.${PKGNAME}.policy"
+ @install -Dm755 -t "${DESTDIR}${PREFIX}/bin/" "${CMAKE_BUILD_DIR}/${PKGNAME}"
+ @install -dm755 "${DESTDIR}/etc/xdg"
+ @install -dm755 "${DESTDIR}${PREFIX}/share/applications"
+ @if [ -z ${DESTDIR} ]; then \
+ [ -d "${DESTDIR}${PREFIX}/share/icons/hicolor/" ] && gtk-update-icon-cache -fiq "${DESTDIR}${PREFIX}/share/icons/hicolor/" &>/dev/null || true; \
+ update-desktop-database --quiet &>/dev/null || true; \
+ [ -d "${DESTDIR}${PREFIX}/share/applications" ] && touch "${DESTDIR}${PREFIX}/share/applications" &>/dev/null || true; \
+ fi
+ @echo "Install: OK"
+ @sed -r "s/^(string version_application=\"*\").*/string version_application;/" -i source/${PKGNAME}.h; \
+
+clean:
+ @echo "Clean ..."
+ @$(RM) -rd ${CMAKE_BUILD_DIR}
+ @if [ -d ${CMAKE_BUILD_DIR} ]; then \
+ echo "Clean: error, compile directory exist ${CMAKE_BUILD_DIR}"; \
+ else \
+ echo "Clean: OK"; \
+ fi
+
+up_ver:
+ @CURRENT=$$(grep 'VERSION' ${FILE_VERSION} | cut -d" " -f2); \
+ MAJOR=$$(cut -d. -f1 <<< $${CURRENT}); \
+ MINOR=$$(cut -d. -f2 <<< $${CURRENT}); \
+ VER="$${MAJOR}.$$(($${MINOR}+1))"; \
+ sed "s/VERSION *[[:digit:]]*.*/VERSION $${VER}/" -i ${FILE_VERSION}; \
+ echo "Updated version to VERSION.md: $${CURRENT} to $${VER}"
+
+help:
+ @echo "The following are some of the valid targets for this Makefile:"; \
+ echo "... all (the default if no target is provided)"; \
+ echo "... init"; \
+ echo "... debug"; \
+ echo "... prepare"; \
+ echo "... compile"; \
+ echo "... install"; \
+ echo "... uninstall"; \
+ echo "... clean"; \
+ echo "... up_ver"
diff --git a/ubl-settings-repo-back/com.ublinux.ubl-settings-repo-back.policy b/ubl-settings-repo-back/com.ublinux.ubl-settings-repo-back.policy
new file mode 100644
index 0000000..2dd9623
--- /dev/null
+++ b/ubl-settings-repo-back/com.ublinux.ubl-settings-repo-back.policy
@@ -0,0 +1,24 @@
+
+
+
+
+ UBLinux
+ https://ublinux.ru
+
+
+ Run ubl-settings-repo-back as root
+ Запуск утилиты ubl-settings-repo-back с правами root
+ Authentication is required to run ubl-settings-repo-back
+ Требуется авторизация для запуска утилиты ubl-settings-repo-back с правами root
+
+ auth_admin
+ auth_admin
+ auth_admin
+
+ /usr/bin/ubl-settings-repo-back
+ true
+
+
+
diff --git a/ubl-settings-repo-back/source/CMakeLists.txt b/ubl-settings-repo-back/source/CMakeLists.txt
new file mode 100644
index 0000000..9ed448b
--- /dev/null
+++ b/ubl-settings-repo-back/source/CMakeLists.txt
@@ -0,0 +1,31 @@
+cmake_minimum_required(VERSION 3.7)
+project(ubl-settings-repo-back)
+
+find_package(PkgConfig REQUIRED)
+
+pkg_check_modules(GTK REQUIRED glib-2.0)
+include_directories(${GTK_INCLUDE_DIRS})
+link_directories(${GTK_LIBRARY_DIRS})
+add_definitions(${GTK_CFLAGS_OTHER})
+
+set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -pedantic -Wall -Wextra -Werror -Wmissing-declarations -fdiagnostics-color=always \
+ -O2 -pipe -fno-plt -fexceptions \
+ -Wp,-D_FORTIFY_SOURCE=2 -Wformat -Werror=format-security \
+ -fstack-clash-protection -fcf-protection")
+
+
+set(SOURCE_FILES
+ ubl-settings-repo-back.c
+ ubl-settings-repo-back.h
+ # ubl-strings.h
+ )
+
+set(LIBRARIES
+ ${GTK_LIBRARIES}
+ pthread)
+
+
+add_executable(${PROJECT_NAME} ${SOURCE_FILES})
+target_link_libraries(${PROJECT_NAME} PUBLIC ${LIBRARIES})
+target_include_directories(${PROJECT_NAME} PUBLIC ${PROJECT_BINARY_DIR})
+install(TARGETS ${PROJECT_NAME} DESTINATION bin)
\ No newline at end of file
diff --git a/ubl-settings-repo-back/source/ubl-settings-repo-back.c b/ubl-settings-repo-back/source/ubl-settings-repo-back.c
new file mode 100644
index 0000000..f8a7dee
--- /dev/null
+++ b/ubl-settings-repo-back/source/ubl-settings-repo-back.c
@@ -0,0 +1,141 @@
+#include "ubl-settings-repo-back.h"
+
+
+dict_simple *yon_dict_new(){
+ dict_simple *dict = (dict_simple*)malloc(sizeof(dict_simple));
+ dict->first=dict;
+ dict->next=NULL;
+ dict->data=NULL;
+ return dict;
+}
+
+dict_simple *yon_dict_append(dict_simple *dictionary_to_append){
+ dict_simple *dict = (dict_simple*)malloc(sizeof(dict_simple));
+ dictionary_to_append->next=dict;
+ dict->first=dictionary_to_append->first;
+ dict->next=NULL;
+ dict->data=NULL;
+ return dict;
+}
+
+repo_operation *yon_operation_new(){
+ repo_operation *operation = (repo_operation*)malloc(sizeof(repo_operation));
+ operation->package_add=NULL;
+ operation->package_remove=NULL;
+ operation->rename=NULL;
+ operation->target=NULL;
+ operation->create=0;
+ return operation;
+}
+
+char *yon_string_append(char *source, char *append){
+ int size = (strlen(source)+strlen(append)+2);
+ char *n_source = (char*)malloc(sizeof(char)*size);
+ memset(n_source,0,size);
+ memcpy(n_source,source,strlen(source));
+ memcpy(n_source+strlen(source)," ",1);
+ memcpy(n_source+strlen(source)+1,append,strlen(append));
+ return n_source;
+}
+
+char *yon_string_copy(char *string){
+ if (string){
+ char *str = malloc(sizeof(char)*strlen(string)+1);
+ memset(str,0,strlen(string)+1);
+ memcpy(str,string,strlen(string));
+ return str;
+ } else return NULL;
+}
+
+char *yon_string_find_last(char *source, char *find){
+
+ for (char *found = strstr(source,find);found;found=strstr(found,find)){
+ if (found);
+ }
+}
+
+int yon_repo_proceed(int argc, char *argv[]){
+ int option_index=0;
+ int show_help=0;
+ {
+ struct option long_options[] = {
+ {"repo-new", 1, 0, 1},
+ {"package-add", 1, 0, 2},
+ {"package-remove", 1, 0, 3},
+ {"repo-rename", 1, 0, 4},
+ {"origin", 1, 0, 'o'},
+ { NULL, 0, NULL, 0 }
+ };
+ dict_simple *dict = yon_dict_new();
+ repo_operation *operation = yon_operation_new();
+ dict->data=(void*)operation;
+ #define curpack(dict) ((repo_operation*)dict->data)
+ for (int i=0;ipackage_add = yon_string_append(curpack(dict)->package_add,yon_string_copy(optarg));
+ break;
+ case 3: curpack(dict)->package_remove = yon_string_append(curpack(dict)->package_add,yon_string_copy(optarg));
+ break;
+ case 4: curpack(dict)->rename=yon_string_copy(optarg);
+ case 1:
+ if (!((repo_operation*)dict->data)->target) ((repo_operation*)dict->data)->target=yon_string_copy(optarg);
+ else {
+ dict = yon_dict_append(dict);
+ operation = yon_operation_new();
+ dict->data=(void*)operation;
+ ((repo_operation*)dict->data)->target=yon_string_copy(optarg);
+ }
+ ((repo_operation*)dict->data)->create=1;
+ break;
+ case 'o':
+ if (!((repo_operation*)dict->data)->target) ((repo_operation*)dict->data)->target=yon_string_copy(optarg);
+ else {
+ dict = yon_dict_append(dict);
+ operation = yon_operation_new();
+ dict->data=(void*)operation;
+ ((repo_operation*)dict->data)->target=yon_string_copy(optarg);
+ }
+ break;
+ case '?': printf("%s: %c\n",UNKNOWN_ARGUMENT_LABEL,argument);
+ break;
+ }
+ }
+ for (dict_simple *dct=dict->first;dct;dct=dct->next){
+ if (curpack(dct)->target){
+ if (curpack(dct)->create){
+ GKeyFile *file = g_key_file_new();
+ g_key_file_load_from_file(file,"/etc/pacman.conf",G_KEY_FILE_KEEP_COMMENTS,NULL);
+ g_key_file_set_string(file,curpack(dct)->target,"Server",curpack(dct)->target);
+ char *command = yon_string_append("repo-add ",curpack(dct)->target);
+ if (curpack(dct)->package_add){
+ command = yon_string_append(command," ");
+ command = yon_string_append(command,curpack(dct)->package_add);
+ }
+ system(command);
+
+ } else if (curpack(dct)->package_remove){
+ char *command = yon_string_append("repo-remove ",curpack(dct)->target);
+ command = yon_string_append(command," ");
+ command = yon_string_append(command,curpack(dct)->package_remove);
+ system(command);
+ }
+ if (curpack(dct)->package_add){
+ char *command = yon_string_append("repo-add ",curpack(dct)->target);
+ command = yon_string_append(command," ");
+ command = yon_string_append(command,curpack(dct)->package_add);
+ }
+ system(command);
+
+
+ }
+ }
+ }
+}
+
+int main(int argc, char *argv[]){
+ char *local=setlocale(LC_ALL, "");
+ textdomain (LocaleName);
+ yon_repo_proceed(argc, argv);
+
+}
diff --git a/ubl-settings-repo-back/source/ubl-settings-repo-back.h b/ubl-settings-repo-back/source/ubl-settings-repo-back.h
new file mode 100644
index 0000000..fcc8d86
--- /dev/null
+++ b/ubl-settings-repo-back/source/ubl-settings-repo-back.h
@@ -0,0 +1,32 @@
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include "ubl-strings.h"
+
+#define LocaleName "ubl-settings-repo-back"
+
+
+#define _(String) gettext(String)
+
+typedef struct {
+ char *target;
+ char *package_add;
+ char *package_remove;
+ char *rename;
+ int create;
+
+} repo_operation;
+
+typedef struct {
+ struct dict_simple *first;
+ struct dict_simple *next;
+ void *data;
+} dict_simple;
+
+char *yon_string_append(char *source, char *append);
+char *yon_string_copy(char *string);
\ No newline at end of file
diff --git a/ubl-settings-repo-back/source/ubl-strings.h b/ubl-settings-repo-back/source/ubl-strings.h
new file mode 100644
index 0000000..290f02c
--- /dev/null
+++ b/ubl-settings-repo-back/source/ubl-strings.h
@@ -0,0 +1 @@
+#define UNKNOWN_ARGUMENT_LABEL _("Unknown argument has been given")
\ No newline at end of file
diff --git a/ubl-settings-repo-back/ubl-settings-repo-back b/ubl-settings-repo-back/ubl-settings-repo-back
new file mode 100755
index 0000000..28783d8
Binary files /dev/null and b/ubl-settings-repo-back/ubl-settings-repo-back differ