diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..1d74e21
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1 @@
+.vscode/
diff --git a/Makefile b/Makefile
new file mode 100644
index 0000000..8c69de3
--- /dev/null
+++ b/Makefile
@@ -0,0 +1,157 @@
+#!/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
+FILE_VERSION = VERSION.md
+DEPENDS = /bin/cmake
+PREFIX ?= /usr
+PKGNAME = $(MAKEFILE_DIR)
+#PKGNAME = ubl-settings-manager
+
+default_target: all
+
+.PHONY: all init depend debug prepare check build uninstall install clean up_ver help
+
+all: init build
+
+init:
+ @echo "Initialize ..."; \
+ sed -r "s/(version_application = ).*/\1\"$$(grep 'VERSION' ${FILE_VERSION} | cut -d" " -f2)\";/" -i source/ubl-settings-quotas.cc; \
+ 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:
+ @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 "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
+ @for SIZE in 16x16 32x32 48x48 scalable; do \
+ $(RM) "${DESTDIR}${PREFIX}/share/icons/hicolor/$${SIZE}/apps/com.ublinux.${PKGNAME}.svg"; \
+ $(RM) "${DESTDIR}${PREFIX}/share/icons/hicolor/$${SIZE}/apps/com.ublinux.${PKGNAME}.png"; \
+ done
+ @for FILE_SVG in $(wildcard *.svg); do \
+ for SIZE in 16x16 32x32 48x48 scalable; do \
+ $(RM) "${DESTDIR}${PREFIX}/share/icons/hicolor/$${SIZE}/status/$${FILE_SVG%.*}".{svg,png,jpg}; \
+ done; \
+ done
+ @$(RM) "${DESTDIR}${PREFIX}/bin/${PKGNAME}"
+ @$(RM) "${DESTDIR}${PREFIX}/share/applications/${PKGNAME}.desktop"
+ @$(RM) "${DESTDIR}${PREFIX}/share/icons/hicolor/scalable/apps/com.ublinux.${PKGNAME}.svg"
+ @$(RM) -rd "${DESTDIR}${PREFIX}/share/${PKGNAME}"
+ @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 ..."
+ @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
+ @for SIZE in 16 32 48; do \
+ install -dm755 "${DESTDIR}${PREFIX}/share/icons/hicolor/$${SIZE}x$${SIZE}/apps"; \
+ rsvg-convert -w $${SIZE} -h $${SIZE} -f svg --keep-image-data "com.ublinux.${PKGNAME}.svg" -o "${DESTDIR}${PREFIX}/share/icons/hicolor/$${SIZE}x$${SIZE}/apps/com.ublinux.${PKGNAME}.svg"; \
+ done
+ @install -dm755 "${DESTDIR}${PREFIX}/share/icons/hicolor/scalable/apps"
+ @install -Dm644 -t "${DESTDIR}${PREFIX}/share/icons/hicolor/scalable/apps/" "com.ublinux.${PKGNAME}.svg"
+ @install -Dm755 -t "${DESTDIR}${PREFIX}/bin/" "${CMAKE_BUILD_DIR}/${PKGNAME}"
+ @install -dm755 "${DESTDIR}/etc/xdg"
+ @install -dm755 "${DESTDIR}${PREFIX}/share/applications"
+ @install -Dm644 -t "${DESTDIR}${PREFIX}/share/applications/" "${PKGNAME}.desktop"
+ @install -dm755 "${DESTDIR}${PREFIX}/share/${PKGNAME}"/{ui,css,images}
+ @install -Dm644 -t "${DESTDIR}${PREFIX}/share/${PKGNAME}/ui/" "${PKGNAME}.glade"
+ @install -Dm644 -t "${DESTDIR}${PREFIX}/share/${PKGNAME}/css/" "${PKGNAME}.css"
+ @install -Dm644 -t "${DESTDIR}${PREFIX}/share/${PKGNAME}/ui/" "${PKGNAME}-banner.png"
+ @install -Dm644 -t "${DESTDIR}${PREFIX}/share/icons/hicolor/scalable/status/" "com.ublinux.ubl-settings-quotas.checked.svg"
+ @install -Dm644 -t "${DESTDIR}${PREFIX}/share/icons/hicolor/scalable/status/" "com.ublinux.ubl-settings-quotas.warning.svg"
+ @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"
+
+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/README.md b/README.md
index eaa8e8c..ef1382a 100644
--- a/README.md
+++ b/README.md
@@ -1,2 +1,44 @@
# ubl-settings-quotas
+# Настройки квот
+[RU] Утилита для настройки квот
+Utility for setting the date and time
+
+
+
+# Build
+In order to build ubl-settings-quotas you will need:
+
+- CMake
+- C compiler
+- GTK+ 3 & dependencies
+
+Once you have all the necessary dependencies, you can use:
+```sh
+$ make
+```
+
+# Installation
+After a successful build, just use:
+```sh
+$ sudo make install clean
+```
+
+# Uninstallation
+After a successful build, just use:
+```sh
+$ sudo make uninstall
+```
+# Usage
+```sh
+$ ubl-settings-quotas --help
+GTK settings quotas for UBLinux
+
+Usage: ubl-settings-quotas [OPTIONS...]
+Options:
+ -h, --help Show this help
+ -V, --version Show package version
+
+$ ubl-settings-quotas --version
+ubl-settings-quotas version: x.xx
+```
diff --git a/VERSION.md b/VERSION.md
new file mode 100644
index 0000000..12ebd01
--- /dev/null
+++ b/VERSION.md
@@ -0,0 +1 @@
+VERSION 1.0
diff --git a/com.ublinux.ubl-settings-quotas.checked.svg b/com.ublinux.ubl-settings-quotas.checked.svg
new file mode 100644
index 0000000..e3cab42
--- /dev/null
+++ b/com.ublinux.ubl-settings-quotas.checked.svg
@@ -0,0 +1,327 @@
+
+
diff --git a/com.ublinux.ubl-settings-quotas.svg b/com.ublinux.ubl-settings-quotas.svg
new file mode 100644
index 0000000..f636c26
--- /dev/null
+++ b/com.ublinux.ubl-settings-quotas.svg
@@ -0,0 +1,4957 @@
+
+
diff --git a/com.ublinux.ubl-settings-quotas.warning.svg b/com.ublinux.ubl-settings-quotas.warning.svg
new file mode 100644
index 0000000..9a90dba
--- /dev/null
+++ b/com.ublinux.ubl-settings-quotas.warning.svg
@@ -0,0 +1,55 @@
+
+
diff --git a/screenshot/screenshot.png b/screenshot/screenshot.png
new file mode 100644
index 0000000..3fa8cdd
Binary files /dev/null and b/screenshot/screenshot.png differ
diff --git a/source/CMakeLists.txt b/source/CMakeLists.txt
new file mode 100644
index 0000000..9e72be6
--- /dev/null
+++ b/source/CMakeLists.txt
@@ -0,0 +1,33 @@
+cmake_minimum_required(VERSION 3.7)
+project(ubl-settings-quotas)
+
+find_package(PkgConfig REQUIRED)
+
+pkg_check_modules(GTK REQUIRED gtkmm-3.0)
+include_directories(${GTK_INCLUDE_DIRS})
+link_directories(${GTK_LIBRARY_DIRS})
+add_definitions(${GTK_CFLAGS_OTHER})
+find_package(ICU REQUIRED COMPONENTS uc dt in io)
+
+#set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -pedantic -Wall -Wextra -Werror -Wmissing-declarations -fdiagnostics-color=always -std=c++2a")
+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 -g")
+
+set(SOURCE_FILES
+ util.h
+ util.cc
+ ubl-util-standard.h
+ ubl-util-standard.c
+ ubl-settings-quotas.h
+ ubl-settings-quotas.cc
+ main.cc)
+
+set(LIBRARIES
+ ${GTK_LIBRARIES}
+ pthread)
+
+add_executable(ubl-settings-quotas ${SOURCE_FILES})
+target_link_libraries(ubl-settings-quotas ${LIBRARIES} ${ICU_LIBRARIES})
+install(TARGETS ubl-settings-quotas DESTINATION bin)
\ No newline at end of file
diff --git a/source/main.cc b/source/main.cc
new file mode 100644
index 0000000..4aa2a5a
--- /dev/null
+++ b/source/main.cc
@@ -0,0 +1,76 @@
+#include "ubl-settings-quotas.h"
+
+
+void pars_flag(int index_start, int argc, char* argv[]);
+
+int main(int argc, char** argv) {
+ string str_argv= "";
+ string str_cmd_argv = "";
+ for (int i=1; i 1){
+ str_argv = argv[1];
+ }
+ bindtextdomain(app_name.c_str(), "/usr/share/locale/");
+ bind_textdomain_codeset(app_name.c_str(), "UTF-8");
+ textdomain(app_name.c_str());
+ if (str_argv.find("--socket-id") != std::string::npos) {
+ auto app = Gtk::Application::create(argc, argv, "org.gtkmm.example.plug");
+ auto builder = Gtk::Builder::create_from_file(path_glade);
+ Glib::init();
+ setlocale(LC_ALL, "");
+ Glib::OptionContext context;
+
+ CmdArgParser parser{
+ "Socket ID",
+ "Command line argument for socket ID communication.",
+ "No help available, sorry"
+ };
+
+ context.set_main_group(parser);
+ context.parse(argc, argv);
+
+ ::Window socketID = parser.GetSocketID();
+
+ // Handle plug:
+ SettingsPlug plug{socketID, builder};
+ plug.show();
+
+ app->run(plug);
+ return 0;
+ }
+ else if (str_argv.find("-") != std::string::npos || argc == 1) {
+ int len_argv = 1;
+ auto app = Gtk::Application::create(len_argv, argv, "org.gtkmm.example.plug");
+ auto builder = Gtk::Builder::create_from_file(path_glade);
+ pars_flag(1, argc, argv);
+ MainWindow* wnd = nullptr;
+ builder->get_widget_derived("MainWindow", wnd);
+ auto r = app->run(*wnd);
+ delete wnd;
+ return r;
+ }
+
+}
+void pars_flag(int index_start, int argc, char* argv[]) {
+ string str_argv = "";
+ for (int i = index_start; i const& builder)
+ : Gtk::ApplicationWindow(obj), builder{builder} {
+ this->builder = builder;
+ this->settings();
+}
+
+MainWindow::MainWindow(Glib::RefPtr const& builder) {
+ this->builder = builder;
+ this->settings();
+}
+
+void MainWindow::settings() {
+ this->get_builder();
+ this->lacalization();
+ this->add_CSS();
+ btnBoxAboutDialog->set_visible(false);
+ Gtk::Widget *boxWidget;
+ builder->get_widget("boxColor", boxWidget);
+ HeadOverlay->add_overlay(*boxWidget);
+ ubl_make_plugs(boxSave, boxButton, socket_ext_id_I, socket_trd_id_I);
+ if (geteuid() == 0) {
+ }
+ else {
+ boxFuncs->set_sensitive(false);
+ btnSave->set_sensitive(false);
+ btnLoad->set_sensitive(false);
+ imgInfo->set_from_icon_name("com.ublinux.ubl-settings-datetime.warning", Gtk::ICON_SIZE_MENU);
+ info_status_app("boxInfoMessError");
+ lblWarning->set_text(gettext("The program must be run as root"));
+ }
+}
+
+void MainWindow::lacalization() {
+ time_t now = time(0);
+ tm *ltm = localtime(&now);
+ unsigned int year = 1900+ ltm->tm_year;
+ string str_authors = string(gettext("Copyright © UBSoft LLC, 2022 - ")) + to_string(year);
+ aboutWindows->set_copyright(str_authors);
+ aboutWindows->set_comments(gettext("Date and Time"));
+ aboutWindows->set_website(gettext("https://wiki.ublinux.com"));
+ aboutWindows->set_version(gettext(version_application.c_str()));
+ aboutWindows->set_website_label(gettext("Project Home Page"));
+ generalTabLabel->set_text(gettext("General settings"));
+ GroupsTabLabel->set_text(gettext("Groups"));
+ UsersTabLabel->set_text(gettext("Users"));
+ generalDeviceLabel->set_text(gettext("Device:"));
+ generalFileSystemLabel->set_text(gettext("File system:"));
+ generalGroupsFrameLabel->set_text(gettext("quotas for groups"));
+ generalGroupsEnableCheck->set_label(gettext("Enable"));
+ generalUsersEnableCheck->set_label(gettext("Enable"));
+ generalUsersFrameLabel->set_label(gettext("quotas for users"));
+ generalGroupsSizeLabel->set_text(gettext("Excess size delay period"));
+ generalGroupsFilesLabel->set_text(gettext("Excess files delay period"));
+ generalUsersSizeLabel->set_text(gettext("Excess size delay period"));
+ generalUsersFilesLabel->set_text(gettext("Excess files delay period"));
+ generalGroupsSizeWeeksLabel->set_text(gettext("weeks"));
+ generalGroupsFilesWeeksLabel->set_text(gettext("weeks"));
+ generalUsersSizeWeeksLabel->set_text(gettext("weeks"));
+ generalUsersFilesWeeksLabel->set_text(gettext("weeks"));
+ generalGroupsSizeDaysLabel->set_text(gettext("days"));
+ generalGroupsFilesDaysLabel->set_text(gettext("days"));
+ generalUsersSizeDaysLabel->set_text(gettext("days"));
+ generalUsersFilesDaysLabel->set_text(gettext("days"));
+ generalGroupsSizeHoursLabel->set_text(gettext("hours"));
+ generalGroupsFilesHoursLabel->set_text(gettext("hours"));
+ generalUsersSizeHoursLabel->set_text(gettext("hours"));
+ generalUsersFilesHoursLabel->set_text(gettext("hours"));
+ generalGroupsSizeMinutesLabel->set_text(gettext("minutes"));
+ generalGroupsFilesMinutesLabel->set_text(gettext("minutes"));
+ generalUsersSizeMinutesLabel->set_text(gettext("minutes"));
+ generalUsersFilesMinutesLabel->set_text(gettext("minutes"));
+ lblLoad->set_text(gettext("Load"));
+ lblSave->set_text(gettext("Save"));
+}
+
+void MainWindow::add_CSS() {
+ Glib::RefPtr cssProvider = Gtk::CssProvider::create();
+ cssProvider->load_from_path(path_css);
+ Glib::RefPtr styleContext = Gtk::StyleContext::create();
+ Glib::RefPtr screen = Gdk::Screen::get_default();//get default screen
+ styleContext->add_provider_for_screen(screen, cssProvider, GTK_STYLE_PROVIDER_PRIORITY_APPLICATION);//add provider for screen in all application
+ HeadBackgroundImage->set(path_img_head_background);
+ //Glib::RefPtr headerTopic_css = headerTopic->get_style_context();
+ Glib::RefPtr boxButton_css = boxButton->get_style_context();
+ Glib::RefPtr boxSave_css = boxSave->get_style_context();
+ Glib::RefPtr headerBar_css = headerBar->get_style_context();
+ if (socket_trd_id_I == 0 && socket_ext_id_I == 0){
+ boxButton_css->add_class("bkim_no_plug");
+ boxSave_css->add_class("bkim_no_plug");
+ }
+
+ //headerTopic_css->add_class("textHead");
+}
+
+
+
+void MainWindow::get_builder() {
+ builder->set_translation_domain(path_app);
+ builder->get_widget("headerTopic", headerTopic);
+ builder->get_widget("boxButton", boxButton);
+ builder->get_widget("boxSave", boxSave);
+ builder->get_widget("aboutWindows", aboutWindows);
+ builder->get_widget("HeadOverlay", HeadOverlay);
+ builder->get_widget("headerBar", headerBar);
+ builder->get_widget("boxFuncs", boxFuncs);
+ builder->get_widget("btnLoad", btnLoad);
+ builder->get_widget("btnSave", btnSave);
+ builder->get_widget("btnBoxAboutDialog", btnBoxAboutDialog);
+ builder->get_widget("HeadBackgroundImage", HeadBackgroundImage);
+ builder->get_widget("imgInfo", imgInfo);
+ builder->get_widget("lblWarning", lblWarning);
+ builder->get_widget("boxInfoError", boxInfoError);
+ builder->get_widget("imgInfo", imgInfo);
+ builder->get_widget("generalTabLabel", generalTabLabel);
+ builder->get_widget("GroupsTabLabel", GroupsTabLabel);
+ builder->get_widget("UsersTabLabel", UsersTabLabel);
+ builder->get_widget("generalDeviceLabel", generalDeviceLabel);
+ builder->get_widget("generalGroupsFrameLabel", generalGroupsFrameLabel);
+ builder->get_widget("generalGroupsSizeLabel", generalGroupsSizeLabel);
+ builder->get_widget("generalGroupsFilesLabel", generalGroupsFilesLabel);
+ builder->get_widget("generalUsersFrameLabel", generalUsersFrameLabel);
+ builder->get_widget("generalUsersSizeLabel", generalUsersSizeLabel);
+ builder->get_widget("generalUsersFilesLabel", generalUsersFilesLabel);
+ builder->get_widget("generalGroupsSizeWeeksLabel", generalGroupsSizeWeeksLabel);
+ builder->get_widget("generalGroupsFilesWeeksLabel", generalGroupsFilesWeeksLabel);
+ builder->get_widget("generalUsersSizeWeeksLabel", generalUsersSizeWeeksLabel);
+ builder->get_widget("generalUsersFilesWeeksLabel", generalUsersFilesWeeksLabel);
+ builder->get_widget("generalGroupsSizeDaysLabel", generalGroupsSizeDaysLabel);
+ builder->get_widget("generalGroupsFilesDaysLabel", generalGroupsFilesDaysLabel);
+ builder->get_widget("generalUsersSizeDaysLabel", generalUsersSizeDaysLabel);
+ builder->get_widget("generalUsersFilesDaysLabel", generalUsersFilesDaysLabel);
+ builder->get_widget("generalGroupsSizeHoursLabel", generalGroupsSizeHoursLabel);
+ builder->get_widget("generalGroupsFilesHoursLabel", generalGroupsFilesHoursLabel);
+ builder->get_widget("generalUsersSizeHoursLabel", generalUsersSizeHoursLabel);
+ builder->get_widget("generalUsersFilesHoursLabel", generalUsersFilesHoursLabel);
+ builder->get_widget("generalGroupsSizeMinutesLabel", generalGroupsSizeMinutesLabel);
+ builder->get_widget("generalGroupsFilesMinutesLabel", generalGroupsFilesMinutesLabel);
+ builder->get_widget("generalUsersSizeMinutesLabel", generalUsersSizeMinutesLabel);
+ builder->get_widget("generalUsersFilesMinutesLabel", generalUsersFilesMinutesLabel);
+ builder->get_widget("generalFileSystemLabel", generalFileSystemLabel);
+ builder->get_widget("generalGroupsEnableCheck", generalGroupsEnableCheck);
+ builder->get_widget("generalUsersEnableCheck", generalUsersEnableCheck);
+ builder->get_widget("lblLoad", lblLoad);
+ builder->get_widget("lblSave", lblSave);
+ builder->get_widget("btnSettings", btnSettings);
+}
+
+void MainWindow::event() {
+ btnLoadGlob->signal_activate().connect([&]() {});
+ btnLoadLocal->signal_activate().connect([&]() {});
+ btnSynopsis->signal_activate().connect([&]() {});
+ btnAbout->signal_activate().connect([&]() {});
+ btnSaveLocalGlob->signal_activate().connect([&]() {});
+ btnSaveGlob->signal_activate().connect([&]() {});
+ btnSaveLocal->signal_activate().connect([&]() {});
+}
+
+void MainWindow::info_status_app(string stule) {
+ Glib::RefPtr boxInfo = boxInfoError->get_style_context();
+ boxInfo->remove_class("boxInfoMessOK");
+ boxInfo->remove_class("boxInfoMessError");
+ boxInfo->add_class(stule);
+}
+
+SettingsPlug::SettingsPlug(::Window p_socketID, Glib::RefPtr builder)
+ :Gtk::Plug{p_socketID} {
+ MainWindow* wnd = nullptr;
+ builder->get_widget_derived("window", wnd);
+ builder->get_widget("plugBox", plugBox);
+ plugBox->get_parent()->remove(*plugBox);
+ add(*plugBox);
+ show_all_children();
+}
+
+void help() {
+ string version = string(gettext("ubl-settings-quotas version: ")) + version_application + "\n";
+ cout << version.c_str();
+ string help;
+ help = "GTK settings quotas. for UBLinux\n\n"
+ "Usage: ubl-settings-quotas [OPTIONS...]\n"
+ "Options:\n"
+ " -h, --help Show this help\n"
+ " -V, --version Show package version\n";
+ cout << gettext(help.c_str());
+
+}
+
diff --git a/source/ubl-settings-quotas.h b/source/ubl-settings-quotas.h
new file mode 100644
index 0000000..72c223f
--- /dev/null
+++ b/source/ubl-settings-quotas.h
@@ -0,0 +1,117 @@
+#ifndef UBL_SETTINGS_QUOTAS_H
+#define UBL_SETTINGS_QUOTAS_H
+#include
+#include
+#include
+#include
+#include
+
+#include "ubl-util-standard.c"
+#include "util.h"
+
+
+using namespace std;
+
+extern const string path_app;
+extern const string path_glade;
+extern const string app_name;
+extern const string path_locale;
+extern const string path_css;
+extern const string path_img_head_background;
+extern int socket_ext_id_I;
+extern int socket_trd_id_I;
+extern string version_application;
+class CmdArgParser : public Glib::OptionGroup {
+public:
+ CmdArgParser(const std::string& p_name, const std::string& p_description, const std::string& p_help);
+ ::Window GetSocketID() const;
+private:
+ int m_socketID = 0;
+
+};
+
+class MainWindow : public Gtk::ApplicationWindow {
+ public:
+ Glib::RefPtr builder;
+ template
+ struct Result{
+ Type response;
+ int error;
+ };
+ Gtk::Label *headerTopic;
+ Gtk::AboutDialog *aboutWindows;
+ Gtk::Overlay *HeadOverlay;
+ Gtk::HeaderBar *headerBar;
+ Gtk::Box *boxSave;
+ Gtk::Box *boxButton;
+ Gtk::Box *boxFuncs;
+ Gtk::MenuButton *btnSave;
+ Gtk::MenuButton *btnLoad;
+ Gtk::MenuButton *btnSettings;
+ Gtk::ButtonBox *btnBoxAboutDialog;
+ Gtk::Image *HeadBackgroundImage;
+ Gtk::Image *imgInfo;
+ Gtk::Box *boxInfoError;
+ Gtk::Label *lblWarning;
+ Gtk::Label *generalTabLabel;
+ Gtk::Label *UsersTabLabel;
+ Gtk::Label *GroupsTabLabel;
+ Gtk::Label *generalDeviceLabel;
+ Gtk::Label *generalGroupsFrameLabel;
+ Gtk::Label *generalGroupsSizeLabel;
+ Gtk::Label *generalGroupsFilesLabel;
+ Gtk::Label *generalUsersFrameLabel;
+ Gtk::Label *generalUsersSizeLabel;
+ Gtk::Label *generalUsersFilesLabel;
+ Gtk::Label *generalGroupsSizeWeeksLabel;
+ Gtk::Label *generalGroupsFilesWeeksLabel;
+ Gtk::Label *generalUsersSizeWeeksLabel;
+ Gtk::Label *generalUsersFilesWeeksLabel;
+ Gtk::Label *generalGroupsSizeDaysLabel;
+ Gtk::Label *generalGroupsFilesDaysLabel;
+ Gtk::Label *generalUsersSizeDaysLabel;
+ Gtk::Label *generalUsersFilesDaysLabel;
+ Gtk::Label *generalGroupsSizeHoursLabel;
+ Gtk::Label *generalGroupsFilesHoursLabel;
+ Gtk::Label *generalUsersSizeHoursLabel;
+ Gtk::Label *generalUsersFilesHoursLabel;
+ Gtk::Label *generalGroupsSizeMinutesLabel;
+ Gtk::Label *generalGroupsFilesMinutesLabel;
+ Gtk::Label *generalUsersSizeMinutesLabel;
+ Gtk::Label *generalUsersFilesMinutesLabel;
+ Gtk::Label *generalFileSystemLabel;
+ Gtk::Label *lblLoad;
+ Gtk::Label *lblSave;
+ Gtk::CheckButton *generalGroupsEnableCheck;
+ Gtk::CheckButton *generalUsersEnableCheck;
+ Gtk::MenuItem *btnLoadGlob;
+ Gtk::MenuItem *btnLoadLocal;
+ Gtk::MenuItem *btnSynopsis;
+ Gtk::MenuItem *btnAbout;
+ Gtk::MenuItem *btnSaveLocalGlob;
+ Gtk::MenuItem *btnSaveGlob;
+ Gtk::MenuItem *btnSaveLocal;
+ public:
+ MainWindow(BaseObjectType* obj, Glib::RefPtr const& builder);
+ MainWindow(Glib::RefPtr const& builder);
+ void settings();
+ void lacalization();
+ void add_CSS();
+ void get_builder();
+ void event();
+ void info_status_app(string stule);
+
+
+};
+
+class SettingsPlug : public Gtk::Plug{
+public:
+ Gtk::Window *window;
+ SettingsPlug(::Window p_socketID, Glib::RefPtr builder);
+
+private:
+ Gtk::Widget *plugBox;
+ Gtk::Widget *parent;
+};
+void help();
+#endif
diff --git a/source/ubl-util-standard.c b/source/ubl-util-standard.c
new file mode 100644
index 0000000..3b753b1
--- /dev/null
+++ b/source/ubl-util-standard.c
@@ -0,0 +1,91 @@
+#include "ubl-util-standard.h"
+#ifndef __cplusplus
+#ifndef UBL_GET_STANDARD_UI
+#define UBL_GET_STANDARD_UI
+
+
+inline returnstruct *ubl_make_plugs(GtkWidget *LeftWidget, GtkWidget *RightWidget, int left_plug_id, int right_plug_id){
+ returnstruct *ret=(returnstruct*)malloc(sizeof(returnstruct*));
+ if (left_plug_id>0&&LeftWidget){
+ GtkWidget *plug=gtk_plug_new(left_plug_id);
+ GtkWidget *toplug=LeftWidget;
+ if (gtk_widget_get_parent(GTK_WIDGET(toplug))){
+ g_object_ref(G_OBJECT(toplug));
+ GtkWidget *parent=gtk_widget_get_parent(toplug);
+ gtk_container_remove(GTK_CONTAINER(parent),toplug);
+ gtk_container_add(GTK_CONTAINER(plug),GTK_WIDGET(toplug));
+ } else
+ gtk_container_add(GTK_CONTAINER(plug),GTK_WIDGET(toplug));
+ gtk_widget_show(GTK_WIDGET(plug));
+ ret->plugLeft=plug;
+ }
+ if (right_plug_id>0&&RightWidget){
+ GtkWidget *plug=gtk_plug_new(right_plug_id);
+ GtkWidget *toplug=RightWidget;
+ if (gtk_widget_get_parent(GTK_WIDGET(toplug))){
+ g_object_ref(G_OBJECT(toplug));
+ GtkWidget *parent=gtk_widget_get_parent(toplug);
+ gtk_container_remove(GTK_CONTAINER(parent),toplug);
+ gtk_container_add(GTK_CONTAINER(plug),GTK_WIDGET(toplug));
+ } else
+ gtk_container_add(GTK_CONTAINER(plug),GTK_WIDGET(toplug));
+ gtk_widget_show(GTK_WIDGET(plug));
+ ret->plugRight=plug;
+ }
+ return ret;
+}
+
+#endif
+
+#else
+
+
+inline void ubl_make_plugs(Gtk::Widget *LeftWidget, Gtk::Widget *RightWidget, int left_plug_id, int right_plug_id){
+ if (left_plug_id>0&&LeftWidget){
+ GtkWidget *plug=gtk_plug_new(left_plug_id);
+ GtkWidget *toplug=GTK_WIDGET(LeftWidget->gobj());
+ {GdkScreen *screen = gtk_widget_get_screen(plug);
+ gtk_widget_set_app_paintable(plug,TRUE);
+ GdkVisual *colormap = gdk_screen_get_rgba_visual(screen);
+ gtk_widget_set_visual(plug, colormap);}
+ {GdkScreen *screen = gtk_widget_get_screen(toplug);
+ gtk_widget_set_app_paintable(toplug,TRUE);
+ GdkVisual *colormap = gdk_screen_get_rgba_visual(screen);
+ gtk_widget_set_visual(toplug, colormap);}
+ if (gtk_widget_get_parent(GTK_WIDGET(toplug))){
+ g_object_ref(G_OBJECT(toplug));
+ GtkWidget *parent=gtk_widget_get_parent(toplug);
+ gtk_container_remove(GTK_CONTAINER(parent),toplug);
+ gtk_container_add(GTK_CONTAINER(plug),GTK_WIDGET(toplug));
+ } else
+ gtk_container_add(GTK_CONTAINER(plug),GTK_WIDGET(toplug));
+ gtk_widget_show(GTK_WIDGET(plug));
+ gtk_style_context_add_class(gtk_widget_get_style_context(plug),"bkim");
+ gtk_style_context_add_class(gtk_widget_get_style_context(toplug),"bkim");
+ gtk_style_context_add_class(gtk_widget_get_style_context(plug),"primary-toolbar");
+ }
+ if (right_plug_id>0&&RightWidget){
+ GtkWidget *plug=gtk_plug_new(right_plug_id);
+ GtkWidget *toplug=GTK_WIDGET(RightWidget->gobj());
+ {GdkScreen *screen = gtk_widget_get_screen(plug);
+ gtk_widget_set_app_paintable(plug,TRUE);
+ GdkVisual *colormap = gdk_screen_get_rgba_visual(screen);
+ gtk_widget_set_visual(plug, colormap);}
+ {GdkScreen *screen = gtk_widget_get_screen(toplug);
+ gtk_widget_set_app_paintable(toplug,TRUE);
+ GdkVisual *colormap = gdk_screen_get_rgba_visual(screen);
+ gtk_widget_set_visual(toplug, colormap);}
+ if (gtk_widget_get_parent(GTK_WIDGET(toplug))){
+ g_object_ref(G_OBJECT(toplug));
+ GtkWidget *parent=gtk_widget_get_parent(toplug);
+ gtk_container_remove(GTK_CONTAINER(parent),toplug);
+ gtk_container_add(GTK_CONTAINER(plug),GTK_WIDGET(toplug));
+ } else
+ gtk_container_add(GTK_CONTAINER(plug),GTK_WIDGET(toplug));
+ gtk_widget_show(GTK_WIDGET(plug));
+ gtk_style_context_add_class(gtk_widget_get_style_context(plug),"bkim");
+ gtk_style_context_add_class(gtk_widget_get_style_context(toplug),"bkim");
+ gtk_style_context_add_class(gtk_widget_get_style_context(plug),"primary-toolbar");
+ }
+}
+#endif
\ No newline at end of file
diff --git a/source/ubl-util-standard.h b/source/ubl-util-standard.h
new file mode 100644
index 0000000..3209625
--- /dev/null
+++ b/source/ubl-util-standard.h
@@ -0,0 +1,20 @@
+#ifndef __cplusplus
+#include
+#include
+
+typedef struct {
+ GtkWidget *plugLeft;
+ GtkWidget *plugRight;
+
+
+} returnstruct;
+static returnstruct *ubl_make_plugs(GtkWidget *LeftWidget, GtkWidget *RightWidget, int left_plug_id, int right_plug_id);
+#else
+#include
+#include
+#include
+#include
+
+
+static void ubl_make_plugs(Gtk::Widget *LeftWidget, Gtk::Widget *RightWidget, int left_plug_id, int right_plug_id);
+#endif
\ No newline at end of file
diff --git a/source/util.cc b/source/util.cc
new file mode 100644
index 0000000..d2ca2dd
--- /dev/null
+++ b/source/util.cc
@@ -0,0 +1,195 @@
+#include "util.h"
+
+
+array, 5> read_csv(const string& filename) {
+ array, 5> array_vectors;
+ vector vec_option;
+ vector vec_opcision;
+ ifstream file(filename);
+ string line;
+ char delimiter = ',';
+ getline(file, line);
+ while (getline(file, line)) {
+ stringstream stream(line);
+ string option;
+ string opcision;
+ getline(stream, option, delimiter);
+ string line_local = stream.str();
+ if (line_local.find("\"") != string::npos) {
+ string str_delimiter = "\"";
+ vector point = find_all(line_local, str_delimiter);
+ size_t len = point.size();
+ if (len >= 2) {
+ int index_start = point[len-2];
+ int index_end = point[len-1];
+ opcision = line_local.substr(index_start, index_end);
+ index_end = opcision.find("\"");
+ if (opcision.find("\"") != string::npos) {
+ opcision.replace(index_end, opcision.length(), "");
+ }
+
+ }
+ else {
+ opcision = "error";
+ }
+
+
+ }
+ else{
+ getline(stream, opcision, delimiter);
+ }
+
+
+ vec_option.push_back(option);
+ vec_opcision.push_back(opcision);
+ }
+
+ array_vectors[0] = vec_option;
+ array_vectors[1] = vec_opcision;
+ return array_vectors;
+}
+
+string call(string cmd) {
+ FILE *fp;
+ int status;
+ char path[PATH_MAX] = {0};
+ fp = popen(cmd.c_str(), "r");
+ if (fp == NULL) {
+ exit(1);
+ }
+ while (fgets(path, PATH_MAX, fp) != NULL) {
+ break;
+ }
+ status = pclose(fp);
+ if (status == -1) {
+ exit(1);
+ }
+ return path;
+}
+vector find_all(string &str_ntp, string substr) {
+ size_t index = 0;
+ vector sub_index;
+ while ((index = str_ntp.find(substr, index)) != std::string::npos) {
+ index += substr.length();
+ sub_index.push_back(index);
+ }
+ return sub_index;
+}
+
+void str_remove(std::string& source, std::string to_remove) {
+ string::size_type n = to_remove.length();
+ for (string::size_type i = source.find(to_remove);
+ i != string::npos;
+ i = source.find(to_remove))
+ source.erase(i, n);
+}
+
+void str_replace_all(std::string& str_base, string str_find, string sReplacement)
+{
+ size_t pos = 0, fpos;
+ while ((fpos = str_base.find(str_find, pos)) != std::string::npos)
+ {
+ str_base.replace(fpos, str_find.size(), sReplacement);
+ pos = fpos + sReplacement.size();
+ }
+}
+std::vector split(std::string text, char delim) {
+ std::string line;
+ std::vector vec;
+ std::stringstream ss(text);
+ while(std::getline(ss, line, delim)) {
+ vec.push_back(line);
+ }
+ return vec;
+}
+unsigned short read_uid_min_max(string filename, string search) {
+ std::string line;
+ int uid = 0;
+ string remove_tab = "\t";
+ string remove_space = " ";
+ std::ifstream in(filename); // окрываем файл для чтения
+ if (in.is_open()){
+ while (getline(in, line)){
+ try{
+ if (line.find(search) != string::npos && (line.find("SYS_"+search) == string::npos)) {
+ str_remove(line, search);
+ str_remove(line, remove_space);
+ str_remove(line, remove_tab);
+ uid = atoi(line.c_str());
+ }
+ }
+ catch (int x) {
+ if (search == "UID_MIN"){
+ uid = 1000;
+ }
+ else{
+ uid = 65534;
+ }
+
+ }
+
+ }
+ }
+ else{
+ if (search == "UID_MIN") {
+ uid = 1000;
+ }
+ else{
+ uid = 65534;
+ }
+ }
+ in.close();
+ return uid;
+
+}
+
+vector pars_users() {
+ vector vec_users;
+ unsigned short uid_min = read_uid_min_max("/etc/login.defs", "UID_MIN");
+ unsigned short uid_max =read_uid_min_max("/etc/login.defs", "UID_MAX");
+ while (true) {
+ errno = 0;
+ passwd* entry = getpwent();
+ if (!entry) {
+ if (errno) {
+ break;
+ }
+ break;
+ }
+ if ((entry->pw_uid >= uid_min && entry->pw_uid < uid_max) || entry->pw_uid == 0) {
+ vec_users.push_back(string(entry->pw_name));
+ }
+ }
+ endpwent();
+ return vec_users;
+}
+
+string read_passwd(string username) {
+ string passwd = "";
+ std::string line;
+ std::ifstream in("/etc/shadow");
+ if (in.is_open()) {
+ while (getline(in, line)) {
+ if (line.find(username) != string::npos) {
+ size_t index_start = line.find(":");
+ if (index_start != string::npos) {
+ size_t index_end = line.find(":", index_start + 1);
+ passwd = line.substr(index_start+1, index_end - index_start-1);
+ break;
+ }
+ }
+ }
+ }
+ in.close();
+ return passwd;
+}
+
+int synopsis_show(string str_link) {
+ // gettext("https://wiki.ublinux.com/ru/Программное_обеспечение/Программы_и_утилиты/Все/")
+ string cmd = "xdg-open " + str_link;
+ if (geteuid() == 0) {
+ string response_user = getlogin();
+ cmd = "su -l " + response_user + " -c \" DISPLAY=$DISPLAY " + cmd + " \"";
+ }
+ return system(cmd.c_str());
+}
\ No newline at end of file
diff --git a/source/util.h b/source/util.h
new file mode 100644
index 0000000..6c569e5
--- /dev/null
+++ b/source/util.h
@@ -0,0 +1,41 @@
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include