From bc73285ea37a68483b0ef7e38061fafda156adee Mon Sep 17 00:00:00 2001 From: Igor Belitskiy Date: Tue, 4 Apr 2023 14:31:45 +0600 Subject: [PATCH 01/51] =?UTF-8?q?=D0=A1=D0=B4=D0=B5=D0=BB=D0=B0=D0=BB=20?= =?UTF-8?q?=D0=BE=D0=B1=D0=BE=D0=BB=D0=BE=D1=87=D0=BA=D1=83?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 1 + Makefile | 157 + README.md | 42 + VERSION.md | 1 + com.ublinux.ubl-settings-quotas.checked.svg | 327 ++ com.ublinux.ubl-settings-quotas.svg | 4957 +++++++++++++++++++ com.ublinux.ubl-settings-quotas.warning.svg | 55 + screenshot/screenshot.png | Bin 0 -> 144454 bytes source/CMakeLists.txt | 33 + source/main.cc | 76 + source/ubl-settings-quotas.cc | 224 + source/ubl-settings-quotas.h | 117 + source/ubl-util-standard.c | 91 + source/ubl-util-standard.h | 20 + source/util.cc | 195 + source/util.h | 41 + ubl-settings-quotas-banner.png | Bin 0 -> 33872 bytes ubl-settings-quotas.css | 149 + ubl-settings-quotas.desktop | 15 + ubl-settings-quotas.glade | 3383 +++++++++++++ ubl-settings-quotas.glade~ | 3383 +++++++++++++ 21 files changed, 13267 insertions(+) create mode 100644 .gitignore create mode 100644 Makefile create mode 100644 VERSION.md create mode 100644 com.ublinux.ubl-settings-quotas.checked.svg create mode 100644 com.ublinux.ubl-settings-quotas.svg create mode 100644 com.ublinux.ubl-settings-quotas.warning.svg create mode 100644 screenshot/screenshot.png create mode 100644 source/CMakeLists.txt create mode 100644 source/main.cc create mode 100755 source/ubl-settings-quotas.cc create mode 100644 source/ubl-settings-quotas.h create mode 100644 source/ubl-util-standard.c create mode 100644 source/ubl-util-standard.h create mode 100644 source/util.cc create mode 100644 source/util.h create mode 100644 ubl-settings-quotas-banner.png create mode 100644 ubl-settings-quotas.css create mode 100644 ubl-settings-quotas.desktop create mode 100644 ubl-settings-quotas.glade create mode 100644 ubl-settings-quotas.glade~ 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 + +![alt text](screenshot/screenshot.png) + +# 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 @@ + + + + + + image/svg+xml + + + + + + + + diff --git a/screenshot/screenshot.png b/screenshot/screenshot.png new file mode 100644 index 0000000000000000000000000000000000000000..3fa8cdddb67af82da1aaaa5d6d91d454c4f916b3 GIT binary patch literal 144454 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�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 CbJ} 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 +#include +#include +#include +#include +#include +#include +#include +#include + +using namespace std; + + +struct Passwd { + string user; + int uid; +}; + +std::array, 5> read_csv(const std::string& filename); +std::string call(std::string cmd); +vector find_all(string &str_ntp, string substr); +void str_remove(std::string& source, std::string to_remove); +void str_replace_all(string &str_base, string str_find, string str_replace); +std::vector split(std::string text, char delim); +unsigned short read_uid_min_max(string filename, string search); +vector pars_users(); +string read_passwd(string username); +int synopsis_show(string str_link); diff --git a/ubl-settings-quotas-banner.png b/ubl-settings-quotas-banner.png new file mode 100644 index 0000000000000000000000000000000000000000..8eb67cbc38babeaf498d981356cf7e77e2741f12 GIT binary patch literal 33872 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 { + border-color:alpha(@theme_text_color, 0.01); +} +.menuitembottom{ + margin-top:0px; + margin-bottom:3px; +} +.menuitemmiddle{ + margin-top:0px; + margin-bottom:0px; +} + +.menuitemtop{ + margin-bottom:0px; +} +.menuitemtop *{ + margin:2px 2px 0 2px; + padding: 5px 10px 3px 5px; +} +.menuitemmiddle *{ + margin:0 2px 0 2px; + padding: 3px 10px 3px 5px; +} +.menuitembottom *{ + margin:0 2px 2px 2px; + padding: 3px 10px 5px 5px; +} +.menuitemtop:hover { + background:@theme_bg_color; + border-color:inherit; + border-left-width:inherit; + border-right-width:inherit; +} +.menuitemmiddle:hover { + background:@theme_bg_color; + border-color:inherit; + border-left-width:inherit; + border-right-width:inherit; +} +.menuitembottom:hover { + background:@theme_bg_color; + border-color:inherit; + border-left-width:inherit; + border-right-width:inherit; + +} +.menuitemtop:hover* { + margin:2px 2px 0 2px; + padding: 5px 10px 3px 5px; + background:@theme_selected_bg_color; + border-radius:2px; +} +.menuitemmiddle:hover* { + margin:0 2px 0 2px; + padding: 3px 10px 3px 5px; + background:@theme_selected_bg_color; + border-radius:2px; +} +.menuitembottom:hover* { + margin:0 2px 2px 2px; + padding: 3px 10px 5px 5px; + background:@theme_selected_bg_color; + border-radius:2px; +} + +.workingbg, #workingbg { + background-color:@theme_base_color; +} +.workingbg.view.cell:selected { + background-color:@theme_selected_bg_color; +} +.workingbg.view.cell:hover { + background-color:darker(@theme_selected_bg_color); + color:@theme_selected_text_color; + border-radius:3px; +} +.bkim { + transition: 200ms ease-out; + background-image: none; +} +.noborder{ +border:none; +} + +.bkim{ +opacity:0.99; +border:none; +} + +.bkim_no_plug{ +background-color: transparent; +opacity:0.99; +} + + diff --git a/ubl-settings-quotas.desktop b/ubl-settings-quotas.desktop new file mode 100644 index 0000000..ddea473 --- /dev/null +++ b/ubl-settings-quotas.desktop @@ -0,0 +1,15 @@ +[Desktop Entry] +Encoding=UTF-8 +Name=ubl-settings-quotas +Name[ru]=Настройки квот +GenericName=ubl-settings-quotas +GenericName[ru]=Настройки квот +Comment=ubl-settings-quotas +Comment[ru]=Приложение для управления настройками квот +Type=Application +Exec=ubl-settings-quotas +Icon=com.ublinux.ubl-settings-quotas +Terminal=false +X-XfcePluggable=true +X-UBLPluggable=true +Categories=XFCE;GTK;Settings;DesktopSettings;X-XFCE-SettingsDialog;X-XFCE-SystemSettings; diff --git a/ubl-settings-quotas.glade b/ubl-settings-quotas.glade new file mode 100644 index 0000000..33419f1 --- /dev/null +++ b/ubl-settings-quotas.glade @@ -0,0 +1,3383 @@ + + + + + + + + + + + + False + UBConfig - Quotas + com.ublinux.ubl-settings-quotas + + + True + False + 5 + 5 + 5 + 5 + vertical + + + Name + True + True + False + start + True + + + False + True + 0 + + + + + Quotas + True + True + False + start + True + + + False + True + 1 + + + + + Size + True + True + False + start + True + + + False + True + 2 + + + + + Soft limit (size) + True + True + False + start + True + + + False + True + 3 + + + + + Hard limit (size) + True + True + False + start + True + + + False + True + 4 + + + + + Hard limit (size) delay + True + True + False + start + True + + + False + True + 5 + + + + + Hard limit (size) activation time + True + True + False + start + True + + + False + True + 6 + + + + + Files + True + True + False + start + True + + + False + True + 7 + + + + + Soft limit (files) + True + True + False + start + True + + + False + True + 8 + + + + + Hard limit (files) + True + True + False + start + True + + + False + True + 9 + + + + + Hard limit (files) delay + True + True + False + start + True + + + False + True + 10 + + + + + Hard limit (file) activation time + True + True + False + start + True + + + False + True + 11 + + + + + True + False + end + 5 + 5 + True + + + Cancel + True + True + True + center + + + False + True + 0 + + + + + Save + True + True + True + center + + + False + True + 1 + + + + + False + True + 12 + + + + + + + + + + + + + Byte + + + Kb + + + Mb + + + Gb + + + Tb + + + + + False + False + True + center + com.ublinux.ubl-settings-quotas + dialog + True + Quotas Manager + 1.1 + Copyright © 2022 - 2023, UBSoft LLC + Sum up system information + https://ublinux.ru/ + Project Home Page + Это приложение распространяется без каких-либо гарантий. +Подробнее в <a href="https://www.gnu.org/licenses/old-licenses/gpl-2.0.html">GNU General Public License, версии 2 или позднее</a>. + UBGroup + UBGroup + com.ublinux.ubl-settings-quotas + True + gpl-2-0 + + + True + False + vertical + 2 + + + False + end + + + False + False + 1 + + + + + + + True + False + + + True + False + 5 + 5 + 5 + 5 + 2 + System quotas + + + + + + + + + + True + False + + + 90 + True + False + 5 + 5 + 5 + 5 + 6 + 6 + 69 + com.ublinux.ubl-settings-quotas + + + False + True + 0 + + + + + True + False + + + True + False + + + True + False + vertical + + + 255 + True + False + Configuration of disk quotas parameters for system groups and users + + + + + + + + True + True + 0 + + + + + False + True + 0 + + + + + True + True + 0 + + + + + True + True + 1 + + + + + 6 + 1 + 10 + + + 23 + 1 + 10 + + + 59 + 1 + 10 + + + 100 + 1 + 10 + + + 6 + 1 + 10 + + + 23 + 1 + 10 + + + 59 + 1 + 10 + + + 100 + 1 + 10 + + + 6 + 1 + 10 + + + 23 + 1 + 10 + + + 59 + 1 + 10 + + + 100 + 1 + 10 + + + 6 + 1 + 10 + + + 23 + 1 + 10 + + + 59 + 1 + 10 + + + 100 + 1 + 10 + + + + True + False + False + False + + + True + False + Help + + + + + + True + False + About + True + + + + + True + False + + + True + False + Load from global configuration + True + + + + + True + False + Load from local configuration + True + + + + + True + False + + + True + False + Save to global and local configuration + True + + + + + True + False + Save to global configuration + True + + + + + True + False + Save to local configuration + True + + + + + False + com.ublinux.ubl-settings-quotas + + + True + False + vertical + + + True + False + vertical + + + True + False + + + True + False + 5 + 5 + 5 + 5 + 6 + 6 + 25 + 1 + + + False + True + 0 + + + + + True + False + start + 5 + 5 + 5 + 5 + 6 + 6 + + + + + + + True + True + 1 + + + + + False + True + 0 + + + + + True + False + vertical + + + 81 + True + False + + + True + False + start + + + -1 + + + + + False + True + 0 + + + + + False + True + 1 + + + + + True + False + 5 + 5 + 5 + 5 + True + True + vertical + + + True + True + + + True + False + vertical + + + True + False + 5 + 5 + 5 + 5 + + + 135 + True + False + 5 + 5 + Device: + 0 + + + False + True + 0 + + + + + True + False + DeviceStore + + + True + True + 1 + + + + + 135 + True + False + 5 + 5 + File system: + 0 + + + False + True + 2 + + + + + False + True + 0 + + + + + True + False + 5 + 5 + 0.019999999552965164 + in + + + True + False + 5 + 5 + 12 + 5 + + + True + False + vertical + + + Enable + True + True + False + start + True + + + False + True + 0 + + + + + True + False + 20 + + + True + False + vertical + + + True + False + Excess size delay period + 0 + + + False + True + 0 + + + + + True + False + Excess files delay period + 0 + + + False + True + 1 + + + + + False + True + 0 + + + + + True + False + vertical + 5 + + + True + False + 5 + + + True + True + 0 + generalGroupsSizeWeeksSpin + + + False + True + 0 + + + + + True + False + weeks + + + False + True + 1 + + + + + False + True + 0 + + + + + True + False + 5 + + + True + True + 0 + generalGroupsFilesWeeksSpin + + + False + True + 0 + + + + + True + False + weeks + + + False + True + 1 + + + + + False + True + 1 + + + + + False + True + 1 + + + + + True + False + vertical + 5 + + + True + False + 5 + + + True + True + 0 + generalGroupsSizeDaysSpin + + + False + True + 0 + + + + + True + False + days + + + False + True + 1 + + + + + False + True + 0 + + + + + True + False + 5 + + + True + True + 0 + generalGroupsFilesDaysSpin + + + False + True + 0 + + + + + True + False + days + + + False + True + 1 + + + + + False + True + 1 + + + + + False + True + 2 + + + + + True + False + vertical + 5 + + + True + False + 5 + + + True + True + 0 + generalGroupsSizeHoursSpin + + + False + True + 0 + + + + + True + False + hours + + + False + True + 1 + + + + + False + True + 0 + + + + + True + False + 5 + + + True + True + 0 + generalGroupsFilesHoursSpin + + + False + True + 0 + + + + + True + False + hours + + + False + True + 1 + + + + + False + True + 1 + + + + + False + True + 3 + + + + + True + False + vertical + 5 + + + True + False + 5 + + + True + True + 0 + generalGroupsSizeMinutesSpin + + + False + True + 0 + + + + + True + False + minutes + + + False + True + 1 + + + + + False + True + 0 + + + + + True + False + 5 + + + True + True + 0 + generalGroupsFilesMinutesSpin + + + False + True + 0 + + + + + True + False + minutes + + + False + True + 1 + + + + + False + True + 1 + + + + + False + True + 4 + + + + + False + True + 1 + + + + + + + + + True + False + quotas for groups + 0 + + + + + False + True + 1 + + + + + True + False + 5 + 5 + 5 + 0.019999999552965164 + in + + + True + False + 5 + 5 + 12 + 5 + + + True + False + vertical + + + Enable + True + True + False + start + True + + + False + True + 0 + + + + + True + False + 20 + + + True + False + vertical + + + True + False + Excess size delay period + 0 + + + False + True + 0 + + + + + True + False + Excess files delay period + 0 + + + False + True + 1 + + + + + False + True + 0 + + + + + True + False + vertical + 5 + + + True + False + 5 + + + True + True + 0 + generalUsersSizeWeeksSpin + + + False + True + 0 + + + + + True + False + weeks + + + False + True + 1 + + + + + False + True + 0 + + + + + True + False + 5 + + + True + True + 0 + generalUsersFilesWeeksSpin + + + False + True + 0 + + + + + True + False + weeks + + + False + True + 1 + + + + + False + True + 1 + + + + + False + True + 1 + + + + + True + False + vertical + 5 + + + True + False + 5 + + + True + True + 0 + generalUsersSizeDaysSpin + + + False + True + 0 + + + + + True + False + days + + + False + True + 1 + + + + + False + True + 0 + + + + + True + False + 5 + + + True + True + 0 + generalUsersFilesDaysSpin + + + False + True + 0 + + + + + True + False + days + + + False + True + 1 + + + + + False + True + 1 + + + + + False + True + 2 + + + + + True + False + vertical + 5 + + + True + False + 5 + + + True + True + 0 + generalUsersSizeHoursSpin + + + False + True + 0 + + + + + True + False + hours + + + False + True + 1 + + + + + False + True + 0 + + + + + True + False + 5 + + + True + True + 0 + generalUsersFilesHourSpin + + + False + True + 0 + + + + + True + False + hours + + + False + True + 1 + + + + + False + True + 1 + + + + + False + True + 3 + + + + + True + False + vertical + 5 + + + True + False + 5 + + + True + True + 0 + generalUsersSizeMinutesSpin + + + False + True + 0 + + + + + True + False + minutes + + + False + True + 1 + + + + + False + True + 0 + + + + + True + False + 5 + + + True + True + 0 + generalUsersFilesMinuteSpin + + + False + True + 0 + + + + + True + False + minutes + + + False + True + 1 + + + + + False + True + 1 + + + + + False + True + 4 + + + + + False + True + 1 + + + + + + + + + True + False + quotas for users + 0 + + + + + False + True + 2 + + + + + + + True + False + General settings + + + False + + + + + True + False + vertical + + + True + False + 5 + 5 + 5 + 5 + + + True + False + Device: + + + False + True + 0 + + + + + True + False + DeviceStore + + + True + True + 1 + + + + + True + False + 5 + 5 + File system: + + + False + True + 2 + + + + + Filters + True + True + True + + + False + True + 3 + + + + + False + True + 0 + + + + + True + True + liststore1 + + + + + + Name + + + + + Quotas + + + + + Size + + + + + Soft limit +(size) + + + + + Hard limit +(size) + + + + + Hard limit +(size) delay + + + + + Hard limit +(Size) activation +time + + + + + Files + + + + + Soft limit +(files) + + + + + Hard limit +(files) + + + + + Hard limit +(files) delay + + + + + Hard limit +(files) activation +time + + + + + False + True + 1 + + + + + 1 + + + + + True + False + Groups + + + 1 + False + + + + + True + False + vertical + + + True + False + 5 + 5 + 5 + 5 + + + True + False + Device: + + + False + True + 0 + + + + + True + False + DeviceStore + + + True + True + 1 + + + + + True + False + 5 + 5 + File system: + + + False + True + 2 + + + + + Filters + True + True + True + + + False + True + 3 + + + + + False + True + 0 + + + + + True + True + liststore1 + + + + + + Name + + + + + Quotas + + + + + Size + + + + + Soft limit +(size) + + + + + Hard limit +(size) + + + + + Hard limit +(size) delay + + + + + Hard limit +(Size) activation +time + + + + + Files + + + + + Soft limit +(files) + + + + + Hard limit +(files) + + + + + Hard limit +(files) delay + + + + + Hard limit +(files) activation +time + + + + + False + True + 1 + + + + + 2 + + + + + True + False + Users + + + 2 + False + + + + + True + True + 0 + + + + + False + True + 2 + + + + + True + True + 0 + + + + + + + True + False + True + + + True + False + 5 + 5 + 5 + 5 + 2 + UBConfig - Quotas + + + + + + + + True + False + 5 + 5 + 5 + 5 + 6 + 6 + 32 + com.ublinux.ubl-settings-quotas + + + + + True + False + + + True + True + False + True + menuLoad + + + True + False + + + True + False + Load + + + False + True + 0 + + + + + True + False + pan-down-symbolic + + + False + True + 1 + + + + + + + False + True + 0 + + + + + 2 + + + + + True + False + + + True + True + False + True + menuSave + + + True + False + + + True + False + Save + + + False + True + 0 + + + + + True + False + pan-down-symbolic + + + False + True + 1 + + + + + + + False + True + 0 + + + + + True + True + True + False + True + True + menuAbout + none + + + True + False + open-menu-symbolic + + + + + + False + True + 1 + + + + + end + 3 + + + + + + + + + + + + + vertical + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 1000000 + 1 + 10 + + + 1000000 + 1 + 10 + + + 1024 + 1 + 10 + + + 1024 + 1 + 10 + + + False + UBConfig - Quotas + com.ublinux.ubl-settings-quotas + + + True + False + 5 + 5 + 5 + 5 + vertical + + + True + False + vertical + 5 + + + True + False + 5 + + + True + False + Device: + + + False + True + 0 + + + + + True + False + DeviceStore + + + True + True + 1 + + + + + True + False + start + File system: + 0 + + + False + True + 2 + + + + + False + True + 0 + + + + + True + False + Disk quotas for this device: + 0 + + + False + True + 1 + + + + + True + False + Group quotas for this device: + 0 + + + False + True + 2 + + + + + False + True + 0 + + + + + True + False + True + + + True + False + 5 + 5 + 5 + 5 + 5 + 0.019999999552965164 + in + + + True + False + 5 + 5 + 12 + 5 + + + True + False + vertical + + + True + False + Currently using: + + + False + True + 0 + + + + + True + False + Soft limit + 0 + + + False + True + 1 + + + + + True + False + 5 + + + True + True + False + right + True + + + False + True + 0 + + + + + True + True + quotegroupSizeSoftLimitAdjustment + + + True + True + 1 + + + + + True + False + + Kb + Mb + Gb + Tb + + + + False + True + 2 + + + + + True + True + 2 + + + + + True + False + Hard limit + 0 + + + False + True + 3 + + + + + True + False + False + 5 + + + True + True + False + right + True + + + False + True + 0 + + + + + True + True + quotegroupSizeHardLimitAdjustment + + + True + True + 1 + + + + + True + False + + Kb + Mb + Gb + Tb + + + + False + True + 2 + + + + + True + True + 4 + + + + + + + + + True + False + Size + + + + + True + True + 0 + + + + + True + False + 5 + 5 + 5 + 5 + 5 + 0.019999999552965164 + in + + + True + False + 5 + 5 + 12 + 5 + + + True + False + vertical + + + True + False + Currently using: + + + False + True + 0 + + + + + True + False + Soft limit + 0 + + + False + True + 1 + + + + + True + False + 5 + + + True + True + False + right + True + + + False + True + 0 + + + + + True + True + quotegroupFilesSoftLimitAdjustment + + + True + True + 1 + + + + + True + False + files + + + False + True + 2 + + + + + True + True + 2 + + + + + True + False + Hard limit + 0 + + + False + True + 3 + + + + + True + False + 5 + + + True + True + False + right + True + + + False + True + 0 + + + + + True + True + quotegroupFilesHardLimitAdjustment + + + True + True + 1 + + + + + True + False + files + + + False + True + 2 + + + + + True + True + 4 + + + + + + + + + True + False + Files + + + + + True + True + 1 + + + + + False + True + 1 + + + + + True + False + 5 + vertical + True + + + True + False + end + 5 + True + + + Cancel + True + True + True + + + False + True + 0 + + + + + Save + True + True + True + + + False + True + 1 + + + + + False + True + 0 + + + + + False + True + 2 + + + + + + + 1000000 + 1 + 10 + + + 1000000 + 1 + 10 + + + 1024 + 1 + 10 + + + 1024 + 1 + 10 + + + False + UBConfig - Quotas + com.ublinux.ubl-settings-quotas + + + True + False + 5 + 5 + 5 + 5 + 5 + 5 + vertical + + + True + False + vertical + 5 + + + True + False + 5 + + + True + False + Device: + + + False + True + 0 + + + + + True + False + DeviceStore + + + True + True + 1 + + + + + True + False + start + File system: + 0 + + + False + True + 2 + + + + + False + True + 0 + + + + + True + False + Disk quotas for this device: + 0 + + + False + True + 1 + + + + + True + False + User quotas for this device: + 0 + + + False + True + 2 + + + + + False + True + 0 + + + + + True + False + True + + + True + False + 5 + 5 + 5 + 5 + 5 + 0.019999999552965164 + in + + + True + False + 5 + 5 + 12 + 5 + + + True + False + vertical + + + True + False + Currently using: + + + False + True + 0 + + + + + True + False + Soft limit + 0 + + + False + True + 1 + + + + + True + False + 5 + + + True + True + False + right + True + + + False + True + 0 + + + + + True + True + quoteuserSizeSoftLimitAdjustment + + + True + True + 1 + + + + + True + False + + Kb + Mb + Gb + Tb + + + + False + True + 2 + + + + + True + True + 2 + + + + + True + False + Hard limit + 0 + + + False + True + 3 + + + + + True + False + False + 5 + + + True + True + False + right + True + + + False + True + 0 + + + + + True + True + quoteuserSizeHardLimitAdjustment + + + True + True + 1 + + + + + True + False + + Kb + Mb + Gb + Tb + + + + False + True + 2 + + + + + True + True + 4 + + + + + + + + + True + False + Size + + + + + True + True + 0 + + + + + True + False + 5 + 5 + 5 + 5 + 5 + 0.019999999552965164 + in + + + True + False + 5 + 5 + 12 + 5 + + + True + False + vertical + + + True + False + Currently using: + + + False + True + 0 + + + + + True + False + Soft limit + 0 + + + False + True + 1 + + + + + True + False + 5 + + + True + True + False + right + True + + + False + True + 0 + + + + + True + True + quoteuserFilesSoftLimitAdjustment + + + True + True + 1 + + + + + True + False + files + + + False + True + 2 + + + + + True + True + 2 + + + + + True + False + Hard limit + 0 + + + False + True + 3 + + + + + True + False + 5 + + + True + True + False + right + True + + + False + True + 0 + + + + + True + True + quoteuserFilesHardLimitAdjustment + + + True + True + 1 + + + + + True + False + files + + + False + True + 2 + + + + + True + True + 4 + + + + + + + + + True + False + Files + + + + + True + True + 1 + + + + + False + True + 1 + + + + + True + False + 5 + vertical + True + + + True + False + end + 5 + True + + + Cancel + True + True + True + 5 + 5 + + + False + True + 0 + + + + + Save + True + True + True + 5 + 5 + + + False + True + 1 + + + + + False + True + 0 + + + + + False + True + 2 + + + + + + diff --git a/ubl-settings-quotas.glade~ b/ubl-settings-quotas.glade~ new file mode 100644 index 0000000..1882970 --- /dev/null +++ b/ubl-settings-quotas.glade~ @@ -0,0 +1,3383 @@ + + + + + + + + + + + + False + UBConfig - Quotas + com.ublinux.ubl-settings-quotas + + + True + False + 5 + 5 + 5 + 5 + vertical + + + Name + True + True + False + start + True + + + False + True + 0 + + + + + Quotas + True + True + False + start + True + + + False + True + 1 + + + + + Size + True + True + False + start + True + + + False + True + 2 + + + + + Soft limit (size) + True + True + False + start + True + + + False + True + 3 + + + + + Hard limit (size) + True + True + False + start + True + + + False + True + 4 + + + + + Hard limit (size) delay + True + True + False + start + True + + + False + True + 5 + + + + + Hard limit (size) activation time + True + True + False + start + True + + + False + True + 6 + + + + + Files + True + True + False + start + True + + + False + True + 7 + + + + + Soft limit (files) + True + True + False + start + True + + + False + True + 8 + + + + + Hard limit (files) + True + True + False + start + True + + + False + True + 9 + + + + + Hard limit (files) delay + True + True + False + start + True + + + False + True + 10 + + + + + Hard limit (file) activation time + True + True + False + start + True + + + False + True + 11 + + + + + True + False + end + 5 + 5 + True + + + Cancel + True + True + True + center + + + False + True + 0 + + + + + Save + True + True + True + center + + + False + True + 1 + + + + + False + True + 12 + + + + + + + + + + + + + Byte + + + Kb + + + Mb + + + Gb + + + Tb + + + + + False + False + True + center + com.ublinux.ubl-settings-quotas + dialog + True + Quotas Manager + 1.1 + Copyright © 2022 - 2023, UBSoft LLC + Sum up system information + https://ublinux.ru/ + Project Home Page + Это приложение распространяется без каких-либо гарантий. +Подробнее в <a href="https://www.gnu.org/licenses/old-licenses/gpl-2.0.html">GNU General Public License, версии 2 или позднее</a>. + UBGroup + UBGroup + com.ublinux.ubl-settings-quotas + True + gpl-2-0 + + + True + False + vertical + 2 + + + False + end + + + False + False + 1 + + + + + + + True + False + + + True + False + 5 + 5 + 5 + 5 + 2 + System quotas + + + + + + + + + + True + False + + + 90 + True + False + 5 + 5 + 5 + 5 + 6 + 6 + 69 + com.ublinux.ubl-settings-quotas + + + False + True + 0 + + + + + True + False + + + True + False + + + True + False + vertical + + + 255 + True + False + Configuration of disk quotas parameters for system groups and users + + + + + + + + True + True + 0 + + + + + False + True + 0 + + + + + True + True + 0 + + + + + True + True + 1 + + + + + 6 + 1 + 10 + + + 23 + 1 + 10 + + + 59 + 1 + 10 + + + 100 + 1 + 10 + + + 6 + 1 + 10 + + + 23 + 1 + 10 + + + 59 + 1 + 10 + + + 100 + 1 + 10 + + + 6 + 1 + 10 + + + 23 + 1 + 10 + + + 59 + 1 + 10 + + + 100 + 1 + 10 + + + 6 + 1 + 10 + + + 23 + 1 + 10 + + + 59 + 1 + 10 + + + 100 + 1 + 10 + + + + True + False + False + False + + + True + False + Help + + + + + + True + False + About + True + + + + + True + False + + + True + False + Load from global configuration + True + + + + + True + False + Load from local configuration + True + + + + + True + False + + + True + False + Save to global and local configuration + True + + + + + True + False + Save to global configuration + True + + + + + True + False + Save to local configuration + True + + + + + False + com.ublinux.ubl-settings-quotas + + + True + False + vertical + + + True + False + vertical + + + True + False + + + True + False + 5 + 5 + 5 + 5 + 6 + 6 + 25 + 1 + + + False + True + 0 + + + + + True + False + start + 5 + 5 + 5 + 5 + 6 + 6 + + + + + + + True + True + 1 + + + + + False + True + 0 + + + + + True + False + vertical + + + 81 + True + False + + + True + False + start + + + -1 + + + + + False + True + 0 + + + + + False + True + 1 + + + + + True + False + 5 + 5 + 5 + 5 + True + True + vertical + + + True + True + + + True + False + vertical + + + True + False + 5 + 5 + 5 + 5 + + + 135 + True + False + 5 + 5 + Device: + 0 + + + False + True + 0 + + + + + True + False + DeviceStore + + + True + True + 1 + + + + + 135 + True + False + 5 + 5 + File system: + 0 + + + False + True + 2 + + + + + False + True + 0 + + + + + True + False + 5 + 5 + 0.019999999552965164 + in + + + True + False + 5 + 5 + 12 + 5 + + + True + False + vertical + + + Enable + True + True + False + start + True + + + False + True + 0 + + + + + True + False + 20 + + + True + False + vertical + + + True + False + Excess size delay period + 0 + + + False + True + 0 + + + + + True + False + Excess files delay period + 0 + + + False + True + 1 + + + + + False + True + 0 + + + + + True + False + vertical + 5 + + + True + False + 5 + + + True + True + 0 + generalGroupsSizeWeeksSpin + + + False + True + 0 + + + + + True + False + weeks + + + False + True + 1 + + + + + False + True + 0 + + + + + True + False + 5 + + + True + True + 0 + generalGroupsFilesWeeksSpin + + + False + True + 0 + + + + + True + False + weeks + + + False + True + 1 + + + + + False + True + 1 + + + + + False + True + 1 + + + + + True + False + vertical + 5 + + + True + False + 5 + + + True + True + 0 + generalGroupsSizeDaysSpin + + + False + True + 0 + + + + + True + False + days + + + False + True + 1 + + + + + False + True + 0 + + + + + True + False + 5 + + + True + True + 0 + generalGroupsFilesDaysSpin + + + False + True + 0 + + + + + True + False + days + + + False + True + 1 + + + + + False + True + 1 + + + + + False + True + 2 + + + + + True + False + vertical + 5 + + + True + False + 5 + + + True + True + 0 + generalGroupsSizeHoursSpin + + + False + True + 0 + + + + + True + False + hours + + + False + True + 1 + + + + + False + True + 0 + + + + + True + False + 5 + + + True + True + 0 + generalGroupsFilesHoursSpin + + + False + True + 0 + + + + + True + False + hours + + + False + True + 1 + + + + + False + True + 1 + + + + + False + True + 3 + + + + + True + False + vertical + 5 + + + True + False + 5 + + + True + True + 0 + generalGroupsSizeMinutesSpin + + + False + True + 0 + + + + + True + False + minutes + + + False + True + 1 + + + + + False + True + 0 + + + + + True + False + 5 + + + True + True + 0 + generalGroupsFilesMinutesSpin + + + False + True + 0 + + + + + True + False + minutes + + + False + True + 1 + + + + + False + True + 1 + + + + + False + True + 4 + + + + + False + True + 1 + + + + + + + + + True + False + quotas for groups + 0 + + + + + False + True + 1 + + + + + True + False + 5 + 5 + 5 + 0.019999999552965164 + in + + + True + False + 5 + 5 + 12 + 5 + + + True + False + vertical + + + Enable + True + True + False + start + True + + + False + True + 0 + + + + + True + False + 20 + + + True + False + vertical + + + True + False + Excess size delay period + 0 + + + False + True + 0 + + + + + True + False + Excess files delay period + 0 + + + False + True + 1 + + + + + False + True + 0 + + + + + True + False + vertical + 5 + + + True + False + 5 + + + True + True + 0 + generalUsersSizeWeeksSpin + + + False + True + 0 + + + + + True + False + weeks + + + False + True + 1 + + + + + False + True + 0 + + + + + True + False + 5 + + + True + True + 0 + generalUsersFilesWeeksSpin + + + False + True + 0 + + + + + True + False + weeks + + + False + True + 1 + + + + + False + True + 1 + + + + + False + True + 1 + + + + + True + False + vertical + 5 + + + True + False + 5 + + + True + True + 0 + generalUsersSizeDaysSpin + + + False + True + 0 + + + + + True + False + days + + + False + True + 1 + + + + + False + True + 0 + + + + + True + False + 5 + + + True + True + 0 + generalUsersFilesDaysSpin + + + False + True + 0 + + + + + True + False + days + + + False + True + 1 + + + + + False + True + 1 + + + + + False + True + 2 + + + + + True + False + vertical + 5 + + + True + False + 5 + + + True + True + 0 + generalUsersSizeHoursSpin + + + False + True + 0 + + + + + True + False + hours + + + False + True + 1 + + + + + False + True + 0 + + + + + True + False + 5 + + + True + True + 0 + generalUsersFilesHourSpin + + + False + True + 0 + + + + + True + False + hours + + + False + True + 1 + + + + + False + True + 1 + + + + + False + True + 3 + + + + + True + False + vertical + 5 + + + True + False + 5 + + + True + True + 0 + generalUsersSizeMinutesSpin + + + False + True + 0 + + + + + True + False + minutes + + + False + True + 1 + + + + + False + True + 0 + + + + + True + False + 5 + + + True + True + 0 + generalUsersFilesMinuteSpin + + + False + True + 0 + + + + + True + False + minutes + + + False + True + 1 + + + + + False + True + 1 + + + + + False + True + 4 + + + + + False + True + 1 + + + + + + + + + True + False + quotas for users + 0 + + + + + False + True + 2 + + + + + + + True + False + General settings + + + False + + + + + True + False + vertical + + + True + False + 5 + 5 + 5 + 5 + + + True + False + Device: + + + False + True + 0 + + + + + True + False + DeviceStore + + + True + True + 1 + + + + + True + False + 5 + 5 + File system: + + + False + True + 2 + + + + + Filters + True + True + True + + + False + True + 3 + + + + + False + True + 0 + + + + + True + True + liststore1 + + + + + + Name + + + + + Quotas + + + + + Size + + + + + Soft limit +(size) + + + + + Hard limit +(size) + + + + + Hard limit +(size) delay + + + + + Hard limit +(Size) activation +time + + + + + Files + + + + + Soft limit +(files) + + + + + Hard limit +(files) + + + + + Hard limit +(files) delay + + + + + Hard limit +(files) activation +time + + + + + False + True + 1 + + + + + 1 + + + + + True + False + Groups + + + 1 + False + + + + + True + False + vertical + + + True + False + 5 + 5 + 5 + 5 + + + True + False + Device: + + + False + True + 0 + + + + + True + False + DeviceStore + + + True + True + 1 + + + + + True + False + 5 + 5 + File system: + + + False + True + 2 + + + + + Filters + True + True + True + + + False + True + 3 + + + + + False + True + 0 + + + + + True + True + liststore1 + + + + + + Name + + + + + Quotas + + + + + Size + + + + + Soft limit +(size) + + + + + Hard limit +(size) + + + + + Hard limit +(size) delay + + + + + Hard limit +(Size) activation +time + + + + + Files + + + + + Soft limit +(files) + + + + + Hard limit +(files) + + + + + Hard limit +(files) delay + + + + + Hard limit +(files) activation +time + + + + + False + True + 1 + + + + + 2 + + + + + True + False + Users + + + 2 + False + + + + + True + True + 0 + + + + + False + True + 2 + + + + + True + True + 0 + + + + + + + True + False + True + + + True + False + 5 + 5 + 5 + 5 + 2 + UBConfig - Quotas + + + + + + + + True + False + 5 + 5 + 5 + 5 + 6 + 6 + 32 + com.ublinux.ubl-settings-quotas + + + + + True + False + + + True + True + False + True + menuLoad + + + True + False + + + True + False + Load + + + False + True + 0 + + + + + True + False + pan-down-symbolic + + + False + True + 1 + + + + + + + False + True + 0 + + + + + 2 + + + + + True + False + + + True + True + False + True + menuSave + + + True + False + + + True + False + Save + + + False + True + 0 + + + + + True + False + pan-down-symbolic + + + False + True + 1 + + + + + + + False + True + 0 + + + + + True + True + True + False + True + True + menuAbout + none + + + True + False + open-menu-symbolic + + + + + + False + True + 1 + + + + + end + 3 + + + + + + + + + + + + + vertical + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 1000000 + 1 + 10 + + + 1000000 + 1 + 10 + + + 1024 + 1 + 10 + + + 1024 + 1 + 10 + + + False + UBConfig - Quotas + com.ublinux.ubl-settings-quotas + + + True + False + 5 + 5 + 5 + 5 + vertical + + + True + False + vertical + 5 + + + True + False + 5 + + + True + False + Device: + + + False + True + 0 + + + + + True + False + DeviceStore + + + True + True + 1 + + + + + True + False + start + File system: + 0 + + + False + True + 2 + + + + + False + True + 0 + + + + + True + False + Disk quotas for this device: + 0 + + + False + True + 1 + + + + + True + False + Group quotas for this device: + 0 + + + False + True + 2 + + + + + False + True + 0 + + + + + True + False + True + + + True + False + 5 + 5 + 5 + 5 + 5 + 0.019999999552965164 + in + + + True + False + 5 + 5 + 12 + 5 + + + True + False + vertical + + + True + False + Currently using: + + + False + True + 0 + + + + + True + False + Soft limit + 0 + + + False + True + 1 + + + + + True + False + 5 + + + True + True + False + right + True + + + False + True + 0 + + + + + True + True + quotegroupSizeSoftLimitAdjustment + + + True + True + 1 + + + + + True + False + + Kb + Mb + Gb + Tb + + + + False + True + 2 + + + + + True + True + 2 + + + + + True + False + Hard limit + 0 + + + False + True + 3 + + + + + True + False + False + 5 + + + True + True + False + right + True + + + False + True + 0 + + + + + True + True + quotegroupSizeHardLimitAdjustment + + + True + True + 1 + + + + + True + False + + Kb + Mb + Gb + Tb + + + + False + True + 2 + + + + + True + True + 4 + + + + + + + + + True + False + Size + + + + + True + True + 0 + + + + + True + False + 5 + 5 + 5 + 5 + 5 + 0.019999999552965164 + in + + + True + False + 5 + 5 + 12 + 5 + + + True + False + vertical + + + True + False + Currently using: + + + False + True + 0 + + + + + True + False + Soft limit + 0 + + + False + True + 1 + + + + + True + False + 5 + + + True + True + False + right + True + + + False + True + 0 + + + + + True + True + quotegroupFilesSoftLimitAdjustment + + + True + True + 1 + + + + + True + False + files + + + False + True + 2 + + + + + True + True + 2 + + + + + True + False + Hard limit + 0 + + + False + True + 3 + + + + + True + False + 5 + + + True + True + False + right + True + + + False + True + 0 + + + + + True + True + quotegroupFilesHardLimitAdjustment + + + True + True + 1 + + + + + True + False + files + + + False + True + 2 + + + + + True + True + 4 + + + + + + + + + True + False + Files + + + + + True + True + 1 + + + + + False + True + 1 + + + + + True + False + 5 + vertical + True + + + True + False + end + 5 + True + + + Cancel + True + True + True + + + False + True + 0 + + + + + Save + True + True + True + + + False + True + 1 + + + + + False + True + 0 + + + + + False + True + 2 + + + + + + + 1000000 + 1 + 10 + + + 1000000 + 1 + 10 + + + 1024 + 1 + 10 + + + 1024 + 1 + 10 + + + False + UBConfig - Quotas + com.ublinux.ubl-settings-quotas + + + True + False + 5 + 5 + 5 + 5 + 5 + 5 + vertical + + + True + False + vertical + 5 + + + True + False + 5 + + + True + False + Device: + + + False + True + 0 + + + + + True + False + DeviceStore + + + True + True + 1 + + + + + True + False + start + File system: + 0 + + + False + True + 2 + + + + + False + True + 0 + + + + + True + False + Disk quotas for this device: + 0 + + + False + True + 1 + + + + + True + False + User quotas for this device: + 0 + + + False + True + 2 + + + + + False + True + 0 + + + + + True + False + True + + + True + False + 5 + 5 + 5 + 5 + 5 + 0.019999999552965164 + in + + + True + False + 5 + 5 + 12 + 5 + + + True + False + vertical + + + True + False + Currently using: + + + False + True + 0 + + + + + True + False + Soft limit + 0 + + + False + True + 1 + + + + + True + False + 5 + + + True + True + False + right + True + + + False + True + 0 + + + + + True + True + quoteuserSizeSoftLimitAdjustment + + + True + True + 1 + + + + + True + False + + Kb + Mb + Gb + Tb + + + + False + True + 2 + + + + + True + True + 2 + + + + + True + False + Hard limit + 0 + + + False + True + 3 + + + + + True + False + False + 5 + + + True + True + False + right + True + + + False + True + 0 + + + + + True + True + quoteuserSizeHardLimitAdjustment + + + True + True + 1 + + + + + True + False + + Kb + Mb + Gb + Tb + + + + False + True + 2 + + + + + True + True + 4 + + + + + + + + + True + False + Size + + + + + True + True + 0 + + + + + True + False + 5 + 5 + 5 + 5 + 5 + 0.019999999552965164 + in + + + True + False + 5 + 5 + 12 + 5 + + + True + False + vertical + + + True + False + Currently using: + + + False + True + 0 + + + + + True + False + Soft limit + 0 + + + False + True + 1 + + + + + True + False + 5 + + + True + True + False + right + True + + + False + True + 0 + + + + + True + True + quoteuserFilesSoftLimitAdjustment + + + True + True + 1 + + + + + True + False + files + + + False + True + 2 + + + + + True + True + 2 + + + + + True + False + Hard limit + 0 + + + False + True + 3 + + + + + True + False + 5 + + + True + True + False + right + True + + + False + True + 0 + + + + + True + True + quoteuserFilesHardLimitAdjustment + + + True + True + 1 + + + + + True + False + files + + + False + True + 2 + + + + + True + True + 4 + + + + + + + + + True + False + Files + + + + + True + True + 1 + + + + + False + True + 1 + + + + + True + False + 5 + vertical + True + + + True + False + end + 5 + True + + + Cancel + True + True + True + 5 + 5 + + + False + True + 0 + + + + + Save + True + True + True + 5 + 5 + + + False + True + 1 + + + + + False + True + 0 + + + + + False + True + 2 + + + + + + From 334892672aec3a7c0961486f6252cb2eadf7566b Mon Sep 17 00:00:00 2001 From: Igor Belitskiy Date: Tue, 4 Apr 2023 16:49:44 +0600 Subject: [PATCH 02/51] =?UTF-8?q?=D0=A7=D0=B0=D1=81=D1=82=D0=B8=D1=87?= =?UTF-8?q?=D0=BD=D0=BE=20=D0=B4=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5=D0=BD?= =?UTF-8?q?=D0=B0=20=D0=BB=D0=BE=D0=BA=D0=B0=D0=BB=D0=B8=D0=B7=D0=B0=D1=86?= =?UTF-8?q?=D0=B8=D1=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 2 + source/ubl-settings-quotas.cc | 107 +- source/ubl-settings-quotas.h | 44 + ubl-settings-quotas.glade | 445 +++-- ubl-settings-quotas.glade~ | 3383 --------------------------------- ubl-settings-quotas.pot | 257 +++ ubl-settings-quotas_ru.po | 289 +++ 7 files changed, 993 insertions(+), 3534 deletions(-) delete mode 100644 ubl-settings-quotas.glade~ create mode 100644 ubl-settings-quotas.pot create mode 100644 ubl-settings-quotas_ru.po diff --git a/.gitignore b/.gitignore index 1d74e21..9af9bbd 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,3 @@ .vscode/ +ubl-settings-quotas.glade~ +ubl-settings-quotas_ru.po~ diff --git a/source/ubl-settings-quotas.cc b/source/ubl-settings-quotas.cc index a02ded3..008909f 100755 --- a/source/ubl-settings-quotas.cc +++ b/source/ubl-settings-quotas.cc @@ -56,6 +56,10 @@ void MainWindow::settings() { HeadOverlay->add_overlay(*boxWidget); ubl_make_plugs(boxSave, boxButton, socket_ext_id_I, socket_trd_id_I); if (geteuid() == 0) { + this->view_add_columns(*usersQuotasTree); + this->view_add_columns(*groupsQuotasTree); + this->event(); + } else { boxFuncs->set_sensitive(false); @@ -106,8 +110,27 @@ void MainWindow::lacalization() { generalGroupsFilesMinutesLabel->set_text(gettext("minutes")); generalUsersSizeMinutesLabel->set_text(gettext("minutes")); generalUsersFilesMinutesLabel->set_text(gettext("minutes")); + groupsFileSystemLabel->set_text(gettext("File system:")); + usersFileSystemLabel->set_text(gettext("File system:")); + usersFiltersButton->set_label(gettext("Filters")); + groupsFiltersButton->set_label(gettext("Filters")); lblLoad->set_text(gettext("Load")); - lblSave->set_text(gettext("Save")); + lblSave->set_text(gettext("Save")); + groupsDeviceLabel->set_label(gettext("Device:")); + usersDeviceLabel->set_label(gettext("Device:")); + headLabel->set_label(gettext("Configuration of disk quotas parameters for system groups and users")); + filtersNameFilterCheckbox->set_label(gettext("Name")); + filtersQuotasFilterCheckbox->set_label(gettext("Quotas")); + filtersSizeFilterCheckbox->set_label(gettext("Size")); + filtersSoftSizeFilterCheckbox->set_label(gettext("Soft limit (size)")); + filtersHardSizeFilterCheckbox->set_label(gettext("Hard limit (size)")); + filtersHardSizeDelayFilterCheckbox->set_label(gettext("Hard limit (size) delay")); + filtersHardSizeActivationFilterCheckbox->set_label(gettext("Hard limit (size) activation time")); + filtersFilesFilterCheckbox->set_label(gettext("Files")); + filtersSoftFilesFilterCheckbox->set_label(gettext("Soft limit (files)")); + filtersHardFilesFilterCheckbox->set_label(gettext("Hard limit (files)")); + filtersHardFilesDelayFilterCheckbox->set_label(gettext("Hard limit (files) delay")); + filtersHardFilesActivationFilterCheckbox->set_label(gettext("Hard limit (file) activation time")); } void MainWindow::add_CSS() { @@ -180,6 +203,38 @@ void MainWindow::get_builder() { builder->get_widget("lblLoad", lblLoad); builder->get_widget("lblSave", lblSave); builder->get_widget("btnSettings", btnSettings); + builder->get_widget("groupsFileSystemLabel", groupsFileSystemLabel); + builder->get_widget("groupsFiltersButton", groupsFiltersButton); + builder->get_widget("btnSettings", btnSettings); + builder->get_widget("usersFiltersButton", usersFiltersButton); + builder->get_widget("usersFileSystemLabel", usersFileSystemLabel); + builder->get_widget("groupsDeviceLabel", groupsDeviceLabel); + builder->get_widget("usersDeviceLabel", usersDeviceLabel); + builder->get_widget("headLabel", headLabel); + builder->get_widget("FiltersWindow", FiltersWindow); + builder->get_widget("filtersNameFilterCheckbox", filtersNameFilterCheckbox); + builder->get_widget("filtersQuotasFilterCheckbox", filtersQuotasFilterCheckbox); + builder->get_widget("filtersSizeFilterCheckbox", filtersSizeFilterCheckbox); + builder->get_widget("filtersSoftSizeFilterCheckbox", filtersSoftSizeFilterCheckbox); + builder->get_widget("filtersHardSizeFilterCheckbox", filtersHardSizeFilterCheckbox); + builder->get_widget("filtersHardSizeDelayFilterCheckbox", filtersHardSizeDelayFilterCheckbox); + builder->get_widget("filtersHardSizeActivationFilterCheckbox", filtersHardSizeActivationFilterCheckbox); + builder->get_widget("filtersFilesFilterCheckbox", filtersFilesFilterCheckbox); + builder->get_widget("filtersSoftFilesFilterCheckbox", filtersSoftFilesFilterCheckbox); + builder->get_widget("filtersHardFilesFilterCheckbox", filtersHardFilesFilterCheckbox); + builder->get_widget("filtersHardFilesDelayFilterCheckbox", filtersHardFilesDelayFilterCheckbox); + builder->get_widget("filtersHardFilesActivationFilterCheckbox", filtersHardFilesActivationFilterCheckbox); + builder->get_widget("filtersHardFilesActivationFilterCheckbox", filtersHardFilesActivationFilterCheckbox); + builder->get_widget("btnLoadGlob", btnLoadGlob); + builder->get_widget("btnLoadLocal", btnLoadLocal); + builder->get_widget("btnSynopsis", btnSynopsis); + builder->get_widget("btnAbout", btnAbout); + builder->get_widget("btnSaveLocalGlob", btnSaveLocalGlob); + builder->get_widget("btnSaveGlob", btnSaveGlob); + builder->get_widget("btnSaveLocal", btnSaveLocal); + builder->get_widget("GroupsTabLabel", GroupsTabLabel); + builder->get_widget("groupsQuotasTree", groupsQuotasTree); + builder->get_widget("usersQuotasTree", usersQuotasTree); } void MainWindow::event() { @@ -190,6 +245,27 @@ void MainWindow::event() { btnSaveLocalGlob->signal_activate().connect([&]() {}); btnSaveGlob->signal_activate().connect([&]() {}); btnSaveLocal->signal_activate().connect([&]() {}); + groupsFiltersButton->signal_clicked().connect(sigc::mem_fun(*this, &MainWindow::groupsFilters_show)); + usersFiltersButton->signal_clicked().connect(sigc::mem_fun(*this, &MainWindow::groupsFilters_show)); +} + +void MainWindow::groupsFilters_show() { + FiltersWindow->show_all(); +} + +void MainWindow::view_add_columns(Gtk::TreeView &treeView) { + treeView.append_column(gettext("Name"), m_columns.name); + treeView.append_column_editable(gettext("Quotas"), m_columns.quotas); + treeView.append_column(gettext("Size"), m_columns.size); + treeView.append_column(gettext("Soft limit\n(size)"), m_columns.soft_limit_size); + treeView.append_column(gettext("Hard limit\n(size)"), m_columns.hard_limit_size); + treeView.append_column(gettext("Hard limit\n(size) delay"), m_columns.hard_limit_size_delay); + treeView.append_column(gettext("Hard limit\n(Size) activation\ntime"), m_columns.hard_limit_activ_time); + treeView.append_column(gettext("Files"), m_columns.files); + treeView.append_column(gettext("Soft limit\n(files)"), m_columns.soft_limit_files); + treeView.append_column(gettext("Hard limit\n(files)"), m_columns.hard_limit_files); + treeView.append_column(gettext("Hard limit\n(files) delay"), m_columns.hard_limit_delay); + treeView.append_column(gettext("Hard limit\n(files) activation\ntime"), m_columns.hard_limit_files_activ_time); } void MainWindow::info_status_app(string stule) { @@ -199,6 +275,35 @@ void MainWindow::info_status_app(string stule) { boxInfo->add_class(stule); } + + + + + + + + + + + + + + + + + + + + + + + + + + + + + SettingsPlug::SettingsPlug(::Window p_socketID, Glib::RefPtr builder) :Gtk::Plug{p_socketID} { MainWindow* wnd = nullptr; diff --git a/source/ubl-settings-quotas.h b/source/ubl-settings-quotas.h index 72c223f..34a9cca 100644 --- a/source/ubl-settings-quotas.h +++ b/source/ubl-settings-quotas.h @@ -32,6 +32,26 @@ private: class MainWindow : public Gtk::ApplicationWindow { public: + class ModelColumns : public Gtk::TreeModel::ColumnRecord { + public: + ModelColumns() {add(name), add(quotas); add(size), + add(soft_limit_size), add(hard_limit_size); add(hard_limit_size_delay), + add(hard_limit_activ_time), add(files); add(soft_limit_files), + add(hard_limit_files), add(hard_limit_delay); add(hard_limit_files_activ_time); } + Gtk::TreeModelColumn name; + Gtk::TreeModelColumn quotas; + Gtk::TreeModelColumn size; + Gtk::TreeModelColumn soft_limit_size; + Gtk::TreeModelColumn hard_limit_size; + Gtk::TreeModelColumn hard_limit_size_delay; + Gtk::TreeModelColumn hard_limit_activ_time; + Gtk::TreeModelColumn files; + Gtk::TreeModelColumn soft_limit_files; + Gtk::TreeModelColumn hard_limit_files; + Gtk::TreeModelColumn hard_limit_delay; + Gtk::TreeModelColumn hard_limit_files_activ_time; + }; + ModelColumns m_columns; Glib::RefPtr builder; template struct Result{ @@ -91,6 +111,28 @@ class MainWindow : public Gtk::ApplicationWindow { Gtk::MenuItem *btnSaveLocalGlob; Gtk::MenuItem *btnSaveGlob; Gtk::MenuItem *btnSaveLocal; + Gtk::Label *groupsFileSystemLabel; + Gtk::Label *usersFileSystemLabel; + Gtk::Button *groupsFiltersButton; + Gtk::Button *usersFiltersButton; + Gtk::Label *groupsDeviceLabel; + Gtk::Label *usersDeviceLabel; + Gtk::Label *headLabel; + Gtk::Window *FiltersWindow; + Gtk::CheckButton *filtersNameFilterCheckbox; + Gtk::CheckButton *filtersQuotasFilterCheckbox; + Gtk::CheckButton *filtersSizeFilterCheckbox; + Gtk::CheckButton *filtersSoftSizeFilterCheckbox; + Gtk::CheckButton *filtersHardSizeFilterCheckbox; + Gtk::CheckButton *filtersHardSizeDelayFilterCheckbox; + Gtk::CheckButton *filtersHardSizeActivationFilterCheckbox; + Gtk::CheckButton *filtersFilesFilterCheckbox; + Gtk::CheckButton *filtersSoftFilesFilterCheckbox; + Gtk::CheckButton *filtersHardFilesFilterCheckbox; + Gtk::CheckButton *filtersHardFilesDelayFilterCheckbox; + Gtk::CheckButton *filtersHardFilesActivationFilterCheckbox; + Gtk::TreeView *groupsQuotasTree; + Gtk::TreeView *usersQuotasTree; public: MainWindow(BaseObjectType* obj, Glib::RefPtr const& builder); MainWindow(Glib::RefPtr const& builder); @@ -100,6 +142,8 @@ class MainWindow : public Gtk::ApplicationWindow { void get_builder(); void event(); void info_status_app(string stule); + void groupsFilters_show(); + void view_add_columns(Gtk::TreeView &treeView); }; diff --git a/ubl-settings-quotas.glade b/ubl-settings-quotas.glade index 33419f1..850ab4e 100644 --- a/ubl-settings-quotas.glade +++ b/ubl-settings-quotas.glade @@ -10,12 +10,14 @@ False - UBConfig - Quotas - com.ublinux.ubl-settings-quotas + start + False True False + 5 + 5 5 5 5 @@ -28,6 +30,7 @@ True False start + 6 True @@ -98,7 +101,7 @@ - Hard limit (size) delay + Hard limit (size) delay True True False @@ -211,11 +214,12 @@ True - Cancel + gtk-cancel True True True center + True False @@ -225,11 +229,273 @@ - Save + gtk-save + True + True + True + center + True + + + False + True + 1 + + + + + False + True + 12 + + + + + + + True + False + UBConfig - Quotas + True + + + True + False + 32 + com.ublinux.ubl-settings-quotas + 5 + + + + + + + False + start + False + + + True + False + 5 + 5 + 5 + 5 + 5 + 5 + vertical + + + Name + True + True + False + start + 6 + True + + + False + True + 0 + + + + + Quotas + True + True + False + start + True + + + False + True + 1 + + + + + Size + True + True + False + start + True + + + False + True + 2 + + + + + Soft limit (size) + True + True + False + start + True + + + False + True + 3 + + + + + Hard limit (size) + True + True + False + start + True + + + False + True + 4 + + + + + Hard limit (size) delay + True + True + False + start + True + + + False + True + 5 + + + + + Hard limit (size) activation time + True + True + False + start + True + + + False + True + 6 + + + + + Files + True + True + False + start + True + + + False + True + 7 + + + + + Soft limit (files) + True + True + False + start + True + + + False + True + 8 + + + + + Hard limit (files) + True + True + False + start + True + + + False + True + 9 + + + + + Hard limit (files) delay + True + True + False + start + True + + + False + True + 10 + + + + + Hard limit (file) activation time + True + True + False + start + True + + + False + True + 11 + + + + + True + False + end + 5 + 5 + True + + + gtk-cancel + True + True + True + center + True + + + False + True + 0 + + + + + gtk-save True True True center + True False @@ -246,6 +512,22 @@ + + + True + False + UBConfig - Quotas + + + True + False + 32 + com.ublinux.ubl-settings-quotas + 5 + + + + @@ -555,7 +837,7 @@ - + True False Save to local configuration @@ -1677,7 +1959,7 @@ True False - Device: + Device: False @@ -1739,76 +2021,6 @@ - - - Name - - - - - Quotas - - - - - Size - - - - - Soft limit -(size) - - - - - Hard limit -(size) - - - - - Hard limit -(size) delay - - - - - Hard limit -(Size) activation -time - - - - - Files - - - - - Soft limit -(files) - - - - - Hard limit -(files) - - - - - Hard limit -(files) delay - - - - - Hard limit -(files) activation -time - - False @@ -1911,76 +2123,6 @@ time - - - Name - - - - - Quotas - - - - - Size - - - - - Soft limit -(size) - - - - - Hard limit -(size) - - - - - Hard limit -(size) delay - - - - - Hard limit -(Size) activation -time - - - - - Files - - - - - Soft limit -(files) - - - - - Hard limit -(files) - - - - - Hard limit -(files) delay - - - - - Hard limit -(files) activation -time - - False @@ -2109,6 +2251,9 @@ time 0 + 2 @@ -2179,9 +2324,6 @@ time open-menu-symbolic - False @@ -2189,6 +2331,9 @@ time 1 + end diff --git a/ubl-settings-quotas.glade~ b/ubl-settings-quotas.glade~ deleted file mode 100644 index 1882970..0000000 --- a/ubl-settings-quotas.glade~ +++ /dev/null @@ -1,3383 +0,0 @@ - - - - - - - - - - - - False - UBConfig - Quotas - com.ublinux.ubl-settings-quotas - - - True - False - 5 - 5 - 5 - 5 - vertical - - - Name - True - True - False - start - True - - - False - True - 0 - - - - - Quotas - True - True - False - start - True - - - False - True - 1 - - - - - Size - True - True - False - start - True - - - False - True - 2 - - - - - Soft limit (size) - True - True - False - start - True - - - False - True - 3 - - - - - Hard limit (size) - True - True - False - start - True - - - False - True - 4 - - - - - Hard limit (size) delay - True - True - False - start - True - - - False - True - 5 - - - - - Hard limit (size) activation time - True - True - False - start - True - - - False - True - 6 - - - - - Files - True - True - False - start - True - - - False - True - 7 - - - - - Soft limit (files) - True - True - False - start - True - - - False - True - 8 - - - - - Hard limit (files) - True - True - False - start - True - - - False - True - 9 - - - - - Hard limit (files) delay - True - True - False - start - True - - - False - True - 10 - - - - - Hard limit (file) activation time - True - True - False - start - True - - - False - True - 11 - - - - - True - False - end - 5 - 5 - True - - - Cancel - True - True - True - center - - - False - True - 0 - - - - - Save - True - True - True - center - - - False - True - 1 - - - - - False - True - 12 - - - - - - - - - - - - - Byte - - - Kb - - - Mb - - - Gb - - - Tb - - - - - False - False - True - center - com.ublinux.ubl-settings-quotas - dialog - True - Quotas Manager - 1.1 - Copyright © 2022 - 2023, UBSoft LLC - Sum up system information - https://ublinux.ru/ - Project Home Page - Это приложение распространяется без каких-либо гарантий. -Подробнее в <a href="https://www.gnu.org/licenses/old-licenses/gpl-2.0.html">GNU General Public License, версии 2 или позднее</a>. - UBGroup - UBGroup - com.ublinux.ubl-settings-quotas - True - gpl-2-0 - - - True - False - vertical - 2 - - - False - end - - - False - False - 1 - - - - - - - True - False - - - True - False - 5 - 5 - 5 - 5 - 2 - System quotas - - - - - - - - - - True - False - - - 90 - True - False - 5 - 5 - 5 - 5 - 6 - 6 - 69 - com.ublinux.ubl-settings-quotas - - - False - True - 0 - - - - - True - False - - - True - False - - - True - False - vertical - - - 255 - True - False - Configuration of disk quotas parameters for system groups and users - - - - - - - - True - True - 0 - - - - - False - True - 0 - - - - - True - True - 0 - - - - - True - True - 1 - - - - - 6 - 1 - 10 - - - 23 - 1 - 10 - - - 59 - 1 - 10 - - - 100 - 1 - 10 - - - 6 - 1 - 10 - - - 23 - 1 - 10 - - - 59 - 1 - 10 - - - 100 - 1 - 10 - - - 6 - 1 - 10 - - - 23 - 1 - 10 - - - 59 - 1 - 10 - - - 100 - 1 - 10 - - - 6 - 1 - 10 - - - 23 - 1 - 10 - - - 59 - 1 - 10 - - - 100 - 1 - 10 - - - - True - False - False - False - - - True - False - Help - - - - - - True - False - About - True - - - - - True - False - - - True - False - Load from global configuration - True - - - - - True - False - Load from local configuration - True - - - - - True - False - - - True - False - Save to global and local configuration - True - - - - - True - False - Save to global configuration - True - - - - - True - False - Save to local configuration - True - - - - - False - com.ublinux.ubl-settings-quotas - - - True - False - vertical - - - True - False - vertical - - - True - False - - - True - False - 5 - 5 - 5 - 5 - 6 - 6 - 25 - 1 - - - False - True - 0 - - - - - True - False - start - 5 - 5 - 5 - 5 - 6 - 6 - - - - - - - True - True - 1 - - - - - False - True - 0 - - - - - True - False - vertical - - - 81 - True - False - - - True - False - start - - - -1 - - - - - False - True - 0 - - - - - False - True - 1 - - - - - True - False - 5 - 5 - 5 - 5 - True - True - vertical - - - True - True - - - True - False - vertical - - - True - False - 5 - 5 - 5 - 5 - - - 135 - True - False - 5 - 5 - Device: - 0 - - - False - True - 0 - - - - - True - False - DeviceStore - - - True - True - 1 - - - - - 135 - True - False - 5 - 5 - File system: - 0 - - - False - True - 2 - - - - - False - True - 0 - - - - - True - False - 5 - 5 - 0.019999999552965164 - in - - - True - False - 5 - 5 - 12 - 5 - - - True - False - vertical - - - Enable - True - True - False - start - True - - - False - True - 0 - - - - - True - False - 20 - - - True - False - vertical - - - True - False - Excess size delay period - 0 - - - False - True - 0 - - - - - True - False - Excess files delay period - 0 - - - False - True - 1 - - - - - False - True - 0 - - - - - True - False - vertical - 5 - - - True - False - 5 - - - True - True - 0 - generalGroupsSizeWeeksSpin - - - False - True - 0 - - - - - True - False - weeks - - - False - True - 1 - - - - - False - True - 0 - - - - - True - False - 5 - - - True - True - 0 - generalGroupsFilesWeeksSpin - - - False - True - 0 - - - - - True - False - weeks - - - False - True - 1 - - - - - False - True - 1 - - - - - False - True - 1 - - - - - True - False - vertical - 5 - - - True - False - 5 - - - True - True - 0 - generalGroupsSizeDaysSpin - - - False - True - 0 - - - - - True - False - days - - - False - True - 1 - - - - - False - True - 0 - - - - - True - False - 5 - - - True - True - 0 - generalGroupsFilesDaysSpin - - - False - True - 0 - - - - - True - False - days - - - False - True - 1 - - - - - False - True - 1 - - - - - False - True - 2 - - - - - True - False - vertical - 5 - - - True - False - 5 - - - True - True - 0 - generalGroupsSizeHoursSpin - - - False - True - 0 - - - - - True - False - hours - - - False - True - 1 - - - - - False - True - 0 - - - - - True - False - 5 - - - True - True - 0 - generalGroupsFilesHoursSpin - - - False - True - 0 - - - - - True - False - hours - - - False - True - 1 - - - - - False - True - 1 - - - - - False - True - 3 - - - - - True - False - vertical - 5 - - - True - False - 5 - - - True - True - 0 - generalGroupsSizeMinutesSpin - - - False - True - 0 - - - - - True - False - minutes - - - False - True - 1 - - - - - False - True - 0 - - - - - True - False - 5 - - - True - True - 0 - generalGroupsFilesMinutesSpin - - - False - True - 0 - - - - - True - False - minutes - - - False - True - 1 - - - - - False - True - 1 - - - - - False - True - 4 - - - - - False - True - 1 - - - - - - - - - True - False - quotas for groups - 0 - - - - - False - True - 1 - - - - - True - False - 5 - 5 - 5 - 0.019999999552965164 - in - - - True - False - 5 - 5 - 12 - 5 - - - True - False - vertical - - - Enable - True - True - False - start - True - - - False - True - 0 - - - - - True - False - 20 - - - True - False - vertical - - - True - False - Excess size delay period - 0 - - - False - True - 0 - - - - - True - False - Excess files delay period - 0 - - - False - True - 1 - - - - - False - True - 0 - - - - - True - False - vertical - 5 - - - True - False - 5 - - - True - True - 0 - generalUsersSizeWeeksSpin - - - False - True - 0 - - - - - True - False - weeks - - - False - True - 1 - - - - - False - True - 0 - - - - - True - False - 5 - - - True - True - 0 - generalUsersFilesWeeksSpin - - - False - True - 0 - - - - - True - False - weeks - - - False - True - 1 - - - - - False - True - 1 - - - - - False - True - 1 - - - - - True - False - vertical - 5 - - - True - False - 5 - - - True - True - 0 - generalUsersSizeDaysSpin - - - False - True - 0 - - - - - True - False - days - - - False - True - 1 - - - - - False - True - 0 - - - - - True - False - 5 - - - True - True - 0 - generalUsersFilesDaysSpin - - - False - True - 0 - - - - - True - False - days - - - False - True - 1 - - - - - False - True - 1 - - - - - False - True - 2 - - - - - True - False - vertical - 5 - - - True - False - 5 - - - True - True - 0 - generalUsersSizeHoursSpin - - - False - True - 0 - - - - - True - False - hours - - - False - True - 1 - - - - - False - True - 0 - - - - - True - False - 5 - - - True - True - 0 - generalUsersFilesHourSpin - - - False - True - 0 - - - - - True - False - hours - - - False - True - 1 - - - - - False - True - 1 - - - - - False - True - 3 - - - - - True - False - vertical - 5 - - - True - False - 5 - - - True - True - 0 - generalUsersSizeMinutesSpin - - - False - True - 0 - - - - - True - False - minutes - - - False - True - 1 - - - - - False - True - 0 - - - - - True - False - 5 - - - True - True - 0 - generalUsersFilesMinuteSpin - - - False - True - 0 - - - - - True - False - minutes - - - False - True - 1 - - - - - False - True - 1 - - - - - False - True - 4 - - - - - False - True - 1 - - - - - - - - - True - False - quotas for users - 0 - - - - - False - True - 2 - - - - - - - True - False - General settings - - - False - - - - - True - False - vertical - - - True - False - 5 - 5 - 5 - 5 - - - True - False - Device: - - - False - True - 0 - - - - - True - False - DeviceStore - - - True - True - 1 - - - - - True - False - 5 - 5 - File system: - - - False - True - 2 - - - - - Filters - True - True - True - - - False - True - 3 - - - - - False - True - 0 - - - - - True - True - liststore1 - - - - - - Name - - - - - Quotas - - - - - Size - - - - - Soft limit -(size) - - - - - Hard limit -(size) - - - - - Hard limit -(size) delay - - - - - Hard limit -(Size) activation -time - - - - - Files - - - - - Soft limit -(files) - - - - - Hard limit -(files) - - - - - Hard limit -(files) delay - - - - - Hard limit -(files) activation -time - - - - - False - True - 1 - - - - - 1 - - - - - True - False - Groups - - - 1 - False - - - - - True - False - vertical - - - True - False - 5 - 5 - 5 - 5 - - - True - False - Device: - - - False - True - 0 - - - - - True - False - DeviceStore - - - True - True - 1 - - - - - True - False - 5 - 5 - File system: - - - False - True - 2 - - - - - Filters - True - True - True - - - False - True - 3 - - - - - False - True - 0 - - - - - True - True - liststore1 - - - - - - Name - - - - - Quotas - - - - - Size - - - - - Soft limit -(size) - - - - - Hard limit -(size) - - - - - Hard limit -(size) delay - - - - - Hard limit -(Size) activation -time - - - - - Files - - - - - Soft limit -(files) - - - - - Hard limit -(files) - - - - - Hard limit -(files) delay - - - - - Hard limit -(files) activation -time - - - - - False - True - 1 - - - - - 2 - - - - - True - False - Users - - - 2 - False - - - - - True - True - 0 - - - - - False - True - 2 - - - - - True - True - 0 - - - - - - - True - False - True - - - True - False - 5 - 5 - 5 - 5 - 2 - UBConfig - Quotas - - - - - - - - True - False - 5 - 5 - 5 - 5 - 6 - 6 - 32 - com.ublinux.ubl-settings-quotas - - - - - True - False - - - True - True - False - True - menuLoad - - - True - False - - - True - False - Load - - - False - True - 0 - - - - - True - False - pan-down-symbolic - - - False - True - 1 - - - - - - - False - True - 0 - - - - - 2 - - - - - True - False - - - True - True - False - True - menuSave - - - True - False - - - True - False - Save - - - False - True - 0 - - - - - True - False - pan-down-symbolic - - - False - True - 1 - - - - - - - False - True - 0 - - - - - True - True - True - False - True - True - menuAbout - none - - - True - False - open-menu-symbolic - - - - - - False - True - 1 - - - - - end - 3 - - - - - - - - - - - - - vertical - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 1000000 - 1 - 10 - - - 1000000 - 1 - 10 - - - 1024 - 1 - 10 - - - 1024 - 1 - 10 - - - False - UBConfig - Quotas - com.ublinux.ubl-settings-quotas - - - True - False - 5 - 5 - 5 - 5 - vertical - - - True - False - vertical - 5 - - - True - False - 5 - - - True - False - Device: - - - False - True - 0 - - - - - True - False - DeviceStore - - - True - True - 1 - - - - - True - False - start - File system: - 0 - - - False - True - 2 - - - - - False - True - 0 - - - - - True - False - Disk quotas for this device: - 0 - - - False - True - 1 - - - - - True - False - Group quotas for this device: - 0 - - - False - True - 2 - - - - - False - True - 0 - - - - - True - False - True - - - True - False - 5 - 5 - 5 - 5 - 5 - 0.019999999552965164 - in - - - True - False - 5 - 5 - 12 - 5 - - - True - False - vertical - - - True - False - Currently using: - - - False - True - 0 - - - - - True - False - Soft limit - 0 - - - False - True - 1 - - - - - True - False - 5 - - - True - True - False - right - True - - - False - True - 0 - - - - - True - True - quotegroupSizeSoftLimitAdjustment - - - True - True - 1 - - - - - True - False - - Kb - Mb - Gb - Tb - - - - False - True - 2 - - - - - True - True - 2 - - - - - True - False - Hard limit - 0 - - - False - True - 3 - - - - - True - False - False - 5 - - - True - True - False - right - True - - - False - True - 0 - - - - - True - True - quotegroupSizeHardLimitAdjustment - - - True - True - 1 - - - - - True - False - - Kb - Mb - Gb - Tb - - - - False - True - 2 - - - - - True - True - 4 - - - - - - - - - True - False - Size - - - - - True - True - 0 - - - - - True - False - 5 - 5 - 5 - 5 - 5 - 0.019999999552965164 - in - - - True - False - 5 - 5 - 12 - 5 - - - True - False - vertical - - - True - False - Currently using: - - - False - True - 0 - - - - - True - False - Soft limit - 0 - - - False - True - 1 - - - - - True - False - 5 - - - True - True - False - right - True - - - False - True - 0 - - - - - True - True - quotegroupFilesSoftLimitAdjustment - - - True - True - 1 - - - - - True - False - files - - - False - True - 2 - - - - - True - True - 2 - - - - - True - False - Hard limit - 0 - - - False - True - 3 - - - - - True - False - 5 - - - True - True - False - right - True - - - False - True - 0 - - - - - True - True - quotegroupFilesHardLimitAdjustment - - - True - True - 1 - - - - - True - False - files - - - False - True - 2 - - - - - True - True - 4 - - - - - - - - - True - False - Files - - - - - True - True - 1 - - - - - False - True - 1 - - - - - True - False - 5 - vertical - True - - - True - False - end - 5 - True - - - Cancel - True - True - True - - - False - True - 0 - - - - - Save - True - True - True - - - False - True - 1 - - - - - False - True - 0 - - - - - False - True - 2 - - - - - - - 1000000 - 1 - 10 - - - 1000000 - 1 - 10 - - - 1024 - 1 - 10 - - - 1024 - 1 - 10 - - - False - UBConfig - Quotas - com.ublinux.ubl-settings-quotas - - - True - False - 5 - 5 - 5 - 5 - 5 - 5 - vertical - - - True - False - vertical - 5 - - - True - False - 5 - - - True - False - Device: - - - False - True - 0 - - - - - True - False - DeviceStore - - - True - True - 1 - - - - - True - False - start - File system: - 0 - - - False - True - 2 - - - - - False - True - 0 - - - - - True - False - Disk quotas for this device: - 0 - - - False - True - 1 - - - - - True - False - User quotas for this device: - 0 - - - False - True - 2 - - - - - False - True - 0 - - - - - True - False - True - - - True - False - 5 - 5 - 5 - 5 - 5 - 0.019999999552965164 - in - - - True - False - 5 - 5 - 12 - 5 - - - True - False - vertical - - - True - False - Currently using: - - - False - True - 0 - - - - - True - False - Soft limit - 0 - - - False - True - 1 - - - - - True - False - 5 - - - True - True - False - right - True - - - False - True - 0 - - - - - True - True - quoteuserSizeSoftLimitAdjustment - - - True - True - 1 - - - - - True - False - - Kb - Mb - Gb - Tb - - - - False - True - 2 - - - - - True - True - 2 - - - - - True - False - Hard limit - 0 - - - False - True - 3 - - - - - True - False - False - 5 - - - True - True - False - right - True - - - False - True - 0 - - - - - True - True - quoteuserSizeHardLimitAdjustment - - - True - True - 1 - - - - - True - False - - Kb - Mb - Gb - Tb - - - - False - True - 2 - - - - - True - True - 4 - - - - - - - - - True - False - Size - - - - - True - True - 0 - - - - - True - False - 5 - 5 - 5 - 5 - 5 - 0.019999999552965164 - in - - - True - False - 5 - 5 - 12 - 5 - - - True - False - vertical - - - True - False - Currently using: - - - False - True - 0 - - - - - True - False - Soft limit - 0 - - - False - True - 1 - - - - - True - False - 5 - - - True - True - False - right - True - - - False - True - 0 - - - - - True - True - quoteuserFilesSoftLimitAdjustment - - - True - True - 1 - - - - - True - False - files - - - False - True - 2 - - - - - True - True - 2 - - - - - True - False - Hard limit - 0 - - - False - True - 3 - - - - - True - False - 5 - - - True - True - False - right - True - - - False - True - 0 - - - - - True - True - quoteuserFilesHardLimitAdjustment - - - True - True - 1 - - - - - True - False - files - - - False - True - 2 - - - - - True - True - 4 - - - - - - - - - True - False - Files - - - - - True - True - 1 - - - - - False - True - 1 - - - - - True - False - 5 - vertical - True - - - True - False - end - 5 - True - - - Cancel - True - True - True - 5 - 5 - - - False - True - 0 - - - - - Save - True - True - True - 5 - 5 - - - False - True - 1 - - - - - False - True - 0 - - - - - False - True - 2 - - - - - - diff --git a/ubl-settings-quotas.pot b/ubl-settings-quotas.pot new file mode 100644 index 0000000..1e0c779 --- /dev/null +++ b/ubl-settings-quotas.pot @@ -0,0 +1,257 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2023-04-04 16:45+0600\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: source/ubl-settings-quotas.cc:121 source/ubl-settings-quotas.cc:118 +msgid "Configuration of disk quotas parameters for system groups and users" +msgstr "" + +#: source/ubl-settings-quotas.cc:78 source/ubl-settings-quotas.cc:75 +#: source/ubl-settings-quotas.cc:74 +msgid "Copyright © UBSoft LLC, 2022 - " +msgstr "" + +#: source/ubl-settings-quotas.cc:80 source/ubl-settings-quotas.cc:77 +#: source/ubl-settings-quotas.cc:76 +msgid "Date and Time" +msgstr "" + +#: source/ubl-settings-quotas.cc:87 source/ubl-settings-quotas.cc:119 +#: source/ubl-settings-quotas.cc:120 source/ubl-settings-quotas.cc:84 +#: source/ubl-settings-quotas.cc:116 source/ubl-settings-quotas.cc:117 +#: source/ubl-settings-quotas.cc:83 +msgid "Device:" +msgstr "" + +#: source/ubl-settings-quotas.cc:90 source/ubl-settings-quotas.cc:91 +#: source/ubl-settings-quotas.cc:87 source/ubl-settings-quotas.cc:88 +#: source/ubl-settings-quotas.cc:86 +msgid "Enable" +msgstr "" + +#: source/ubl-settings-quotas.cc:94 source/ubl-settings-quotas.cc:96 +#: source/ubl-settings-quotas.cc:91 source/ubl-settings-quotas.cc:93 +#: source/ubl-settings-quotas.cc:90 source/ubl-settings-quotas.cc:92 +msgid "Excess files delay period" +msgstr "" + +#: source/ubl-settings-quotas.cc:93 source/ubl-settings-quotas.cc:95 +#: source/ubl-settings-quotas.cc:90 source/ubl-settings-quotas.cc:92 +#: source/ubl-settings-quotas.cc:89 source/ubl-settings-quotas.cc:91 +msgid "Excess size delay period" +msgstr "" + +#: source/ubl-settings-quotas.cc:88 source/ubl-settings-quotas.cc:113 +#: source/ubl-settings-quotas.cc:114 source/ubl-settings-quotas.cc:85 +#: source/ubl-settings-quotas.cc:110 source/ubl-settings-quotas.cc:111 +#: source/ubl-settings-quotas.cc:84 +msgid "File system:" +msgstr "" + +#: source/ubl-settings-quotas.cc:129 source/ubl-settings-quotas.cc:264 +#: source/ubl-settings-quotas.cc:126 +msgid "Files" +msgstr "" + +#: source/ubl-settings-quotas.cc:115 source/ubl-settings-quotas.cc:116 +#: source/ubl-settings-quotas.cc:112 source/ubl-settings-quotas.cc:113 +msgid "Filters" +msgstr "" + +#: source/ubl-settings-quotas.cc:84 source/ubl-settings-quotas.cc:81 +#: source/ubl-settings-quotas.cc:80 +msgid "General settings" +msgstr "" + +#: source/ubl-settings-quotas.cc:85 source/ubl-settings-quotas.cc:82 +#: source/ubl-settings-quotas.cc:81 +msgid "Groups" +msgstr "" + +#: source/ubl-settings-quotas.cc:263 +msgid "" +"Hard limit\n" +"(Size) activation\n" +"time" +msgstr "" + +#: source/ubl-settings-quotas.cc:266 +msgid "" +"Hard limit\n" +"(files)" +msgstr "" + +#: source/ubl-settings-quotas.cc:268 +msgid "" +"Hard limit\n" +"(files) activation\n" +"time" +msgstr "" + +#: source/ubl-settings-quotas.cc:267 +msgid "" +"Hard limit\n" +"(files) delay" +msgstr "" + +#: source/ubl-settings-quotas.cc:261 +msgid "" +"Hard limit\n" +"(size)" +msgstr "" + +#: source/ubl-settings-quotas.cc:262 +msgid "" +"Hard limit\n" +"(size) delay" +msgstr "" + +#: source/ubl-settings-quotas.cc:133 source/ubl-settings-quotas.cc:130 +msgid "Hard limit (file) activation time" +msgstr "" + +#: source/ubl-settings-quotas.cc:131 source/ubl-settings-quotas.cc:128 +msgid "Hard limit (files)" +msgstr "" + +#: source/ubl-settings-quotas.cc:132 source/ubl-settings-quotas.cc:129 +msgid "Hard limit (files) delay" +msgstr "" + +#: source/ubl-settings-quotas.cc:126 source/ubl-settings-quotas.cc:123 +msgid "Hard limit (size)" +msgstr "" + +#: source/ubl-settings-quotas.cc:128 source/ubl-settings-quotas.cc:125 +msgid "Hard limit (size) activation time" +msgstr "" + +#: source/ubl-settings-quotas.cc:127 source/ubl-settings-quotas.cc:124 +msgid "Hard limit (size) delay" +msgstr "" + +#: source/ubl-settings-quotas.cc:117 source/ubl-settings-quotas.cc:114 +#: source/ubl-settings-quotas.cc:109 +msgid "Load" +msgstr "" + +#: source/ubl-settings-quotas.cc:122 source/ubl-settings-quotas.cc:119 +msgid "Name" +msgstr "" + +#: source/ubl-settings-quotas.cc:83 source/ubl-settings-quotas.cc:80 +#: source/ubl-settings-quotas.cc:79 +msgid "Project Home Page" +msgstr "" + +#: source/ubl-settings-quotas.cc:123 source/ubl-settings-quotas.cc:258 +#: source/ubl-settings-quotas.cc:120 +msgid "Quotas" +msgstr "" + +#: source/ubl-settings-quotas.cc:118 source/ubl-settings-quotas.cc:115 +#: source/ubl-settings-quotas.cc:110 +msgid "Save" +msgstr "" + +#: source/ubl-settings-quotas.cc:124 source/ubl-settings-quotas.cc:259 +#: source/ubl-settings-quotas.cc:121 +msgid "Size" +msgstr "" + +#: source/ubl-settings-quotas.cc:265 +msgid "" +"Soft limit\n" +"(files)" +msgstr "" + +#: source/ubl-settings-quotas.cc:260 +msgid "" +"Soft limit\n" +"(size)" +msgstr "" + +#: source/ubl-settings-quotas.cc:130 source/ubl-settings-quotas.cc:127 +msgid "Soft limit (files)" +msgstr "" + +#: source/ubl-settings-quotas.cc:125 source/ubl-settings-quotas.cc:122 +msgid "Soft limit (size)" +msgstr "" + +#: source/ubl-settings-quotas.cc:70 source/ubl-settings-quotas.cc:67 +#: source/ubl-settings-quotas.cc:66 +msgid "The program must be run as root" +msgstr "" + +#: source/ubl-settings-quotas.cc:86 source/ubl-settings-quotas.cc:83 +#: source/ubl-settings-quotas.cc:82 +msgid "Users" +msgstr "" + +#: source/ubl-settings-quotas.cc:101 source/ubl-settings-quotas.cc:102 +#: source/ubl-settings-quotas.cc:103 source/ubl-settings-quotas.cc:104 +#: source/ubl-settings-quotas.cc:98 source/ubl-settings-quotas.cc:99 +#: source/ubl-settings-quotas.cc:100 source/ubl-settings-quotas.cc:97 +msgid "days" +msgstr "" + +#: source/ubl-settings-quotas.cc:105 source/ubl-settings-quotas.cc:106 +#: source/ubl-settings-quotas.cc:107 source/ubl-settings-quotas.cc:108 +#: source/ubl-settings-quotas.cc:102 source/ubl-settings-quotas.cc:103 +#: source/ubl-settings-quotas.cc:104 source/ubl-settings-quotas.cc:101 +msgid "hours" +msgstr "" + +#: source/ubl-settings-quotas.cc:81 source/ubl-settings-quotas.cc:78 +#: source/ubl-settings-quotas.cc:77 +msgid "https://wiki.ublinux.com" +msgstr "" + +#: source/ubl-settings-quotas.cc:109 source/ubl-settings-quotas.cc:110 +#: source/ubl-settings-quotas.cc:111 source/ubl-settings-quotas.cc:112 +#: source/ubl-settings-quotas.cc:106 source/ubl-settings-quotas.cc:107 +#: source/ubl-settings-quotas.cc:108 source/ubl-settings-quotas.cc:105 +msgid "minutes" +msgstr "" + +#: source/ubl-settings-quotas.cc:257 +msgid "name" +msgstr "" + +#: source/ubl-settings-quotas.cc:89 source/ubl-settings-quotas.cc:86 +#: source/ubl-settings-quotas.cc:85 +msgid "quotas for groups" +msgstr "" + +#: source/ubl-settings-quotas.cc:92 source/ubl-settings-quotas.cc:89 +#: source/ubl-settings-quotas.cc:88 +msgid "quotas for users" +msgstr "" + +#: source/ubl-settings-quotas.cc:318 source/ubl-settings-quotas.cc:267 +#: source/ubl-settings-quotas.cc:213 +msgid "ubl-settings-quotas version: " +msgstr "" + +#: source/ubl-settings-quotas.cc:97 source/ubl-settings-quotas.cc:98 +#: source/ubl-settings-quotas.cc:99 source/ubl-settings-quotas.cc:100 +#: source/ubl-settings-quotas.cc:94 source/ubl-settings-quotas.cc:95 +#: source/ubl-settings-quotas.cc:96 source/ubl-settings-quotas.cc:93 +msgid "weeks" +msgstr "" diff --git a/ubl-settings-quotas_ru.po b/ubl-settings-quotas_ru.po new file mode 100644 index 0000000..a2449e8 --- /dev/null +++ b/ubl-settings-quotas_ru.po @@ -0,0 +1,289 @@ +# Russian translations for ublexec package. +# Copyright (C) 2022, UBTech LLC +# This file is distributed under the same license as the ublexec package. +# UBLinux Team , 2022 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: ublexec 1.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2023-04-04 16:45+0600\n" +"PO-Revision-Date: 2023-01-01 00:00+0600\n" +"Last-Translator: UBLinux Team \n" +"Language-Team: Russian - UBLinux Team \n" +"Language: Russian\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: source/ubl-settings-quotas.cc:121 source/ubl-settings-quotas.cc:118 +msgid "Configuration of disk quotas parameters for system groups and users" +msgstr "Настройка параметров дисковых квот для системных групп и пользователей" + +#: source/ubl-settings-quotas.cc:78 source/ubl-settings-quotas.cc:75 +#: source/ubl-settings-quotas.cc:74 +msgid "Copyright © UBSoft LLC, 2022 - " +msgstr "" + +#: source/ubl-settings-quotas.cc:80 source/ubl-settings-quotas.cc:77 +#: source/ubl-settings-quotas.cc:76 +msgid "Date and Time" +msgstr "Дата и время" + +#: source/ubl-settings-quotas.cc:87 source/ubl-settings-quotas.cc:119 +#: source/ubl-settings-quotas.cc:120 source/ubl-settings-quotas.cc:84 +#: source/ubl-settings-quotas.cc:116 source/ubl-settings-quotas.cc:117 +#: source/ubl-settings-quotas.cc:83 +msgid "Device:" +msgstr "Устройство:" + +#: source/ubl-settings-quotas.cc:90 source/ubl-settings-quotas.cc:91 +#: source/ubl-settings-quotas.cc:87 source/ubl-settings-quotas.cc:88 +#: source/ubl-settings-quotas.cc:86 +msgid "Enable" +msgstr "Включить" + +#: source/ubl-settings-quotas.cc:94 source/ubl-settings-quotas.cc:96 +#: source/ubl-settings-quotas.cc:91 source/ubl-settings-quotas.cc:93 +#: source/ubl-settings-quotas.cc:90 source/ubl-settings-quotas.cc:92 +msgid "Excess files delay period" +msgstr "Превышение периода задержки файлов" + +#: source/ubl-settings-quotas.cc:93 source/ubl-settings-quotas.cc:95 +#: source/ubl-settings-quotas.cc:90 source/ubl-settings-quotas.cc:92 +#: source/ubl-settings-quotas.cc:89 source/ubl-settings-quotas.cc:91 +msgid "Excess size delay period" +msgstr "Период задержки превышения размера" + +#: source/ubl-settings-quotas.cc:88 source/ubl-settings-quotas.cc:113 +#: source/ubl-settings-quotas.cc:114 source/ubl-settings-quotas.cc:85 +#: source/ubl-settings-quotas.cc:110 source/ubl-settings-quotas.cc:111 +#: source/ubl-settings-quotas.cc:84 +msgid "File system:" +msgstr "Файловая система:" + +#: source/ubl-settings-quotas.cc:129 source/ubl-settings-quotas.cc:264 +#: source/ubl-settings-quotas.cc:126 +msgid "Files" +msgstr "Файлы" + +#: source/ubl-settings-quotas.cc:115 source/ubl-settings-quotas.cc:116 +#: source/ubl-settings-quotas.cc:112 source/ubl-settings-quotas.cc:113 +msgid "Filters" +msgstr "Фильтры" + +#: source/ubl-settings-quotas.cc:84 source/ubl-settings-quotas.cc:81 +#: source/ubl-settings-quotas.cc:80 +msgid "General settings" +msgstr "Общие настройки" + +#: source/ubl-settings-quotas.cc:85 source/ubl-settings-quotas.cc:82 +#: source/ubl-settings-quotas.cc:81 +msgid "Groups" +msgstr "Группы" + +#: source/ubl-settings-quotas.cc:263 +#, fuzzy +msgid "" +"Hard limit\n" +"(Size) activation\n" +"time" +msgstr "Жесткий предел\n(размер)" + +#: source/ubl-settings-quotas.cc:266 +#, fuzzy +msgid "" +"Hard limit\n" +"(files)" +msgstr "Жесткий лимит\n(файлы)" + +#: source/ubl-settings-quotas.cc:268 +#, fuzzy +msgid "" +"Hard limit\n" +"(files) activation\n" +"time" +msgstr "Время активации\nжесткого лимита (файла)" + +#: source/ubl-settings-quotas.cc:267 +#, fuzzy +msgid "" +"Hard limit\n" +"(files) delay" +msgstr "Жесткий лимит\n(файлы)" + +#: source/ubl-settings-quotas.cc:261 +#, fuzzy +msgid "" +"Hard limit\n" +"(size)" +msgstr "Жесткий предел\n(размер) задержки" + +#: source/ubl-settings-quotas.cc:262 +#, fuzzy +msgid "" +"Hard limit\n" +"(size) delay" +msgstr "Жесткий предел\n(размер) задержки" + +#: source/ubl-settings-quotas.cc:133 source/ubl-settings-quotas.cc:130 +msgid "Hard limit (file) activation time" +msgstr "Время активации жесткого лимита (файла)" + +#: source/ubl-settings-quotas.cc:131 source/ubl-settings-quotas.cc:128 +msgid "Hard limit (files)" +msgstr "Жесткий лимит (файлы)" + +#: source/ubl-settings-quotas.cc:132 source/ubl-settings-quotas.cc:129 +msgid "Hard limit (files) delay" +msgstr "Жесткий лимит (файлы)" + +#: source/ubl-settings-quotas.cc:126 source/ubl-settings-quotas.cc:123 +msgid "Hard limit (size)" +msgstr "Жесткий предел (размер) задержки" + +#: source/ubl-settings-quotas.cc:128 source/ubl-settings-quotas.cc:125 +msgid "Hard limit (size) activation time" +msgstr "Жесткий предел (размер)" + +#: source/ubl-settings-quotas.cc:127 source/ubl-settings-quotas.cc:124 +msgid "Hard limit (size) delay" +msgstr "Жесткий предел (размер) задержки" + +#: source/ubl-settings-quotas.cc:117 source/ubl-settings-quotas.cc:114 +#: source/ubl-settings-quotas.cc:109 +msgid "Load" +msgstr "Загрузить" + +#: source/ubl-settings-quotas.cc:122 source/ubl-settings-quotas.cc:119 +msgid "Name" +msgstr "Имя" + +#: source/ubl-settings-quotas.cc:83 source/ubl-settings-quotas.cc:80 +#: source/ubl-settings-quotas.cc:79 +msgid "Project Home Page" +msgstr "Главная страница проекта" + +#: source/ubl-settings-quotas.cc:123 source/ubl-settings-quotas.cc:258 +#: source/ubl-settings-quotas.cc:120 +msgid "Quotas" +msgstr "Квоты" + +#: source/ubl-settings-quotas.cc:118 source/ubl-settings-quotas.cc:115 +#: source/ubl-settings-quotas.cc:110 +msgid "Save" +msgstr "Сохранить" + +#: source/ubl-settings-quotas.cc:124 source/ubl-settings-quotas.cc:259 +#: source/ubl-settings-quotas.cc:121 +msgid "Size" +msgstr "Размер" + +#: source/ubl-settings-quotas.cc:265 +#, fuzzy +msgid "" +"Soft limit\n" +"(files)" +msgstr "Мягкий лимит\n(файлы)" + +#: source/ubl-settings-quotas.cc:260 +#, fuzzy +msgid "" +"Soft limit\n" +"(size)" +msgstr "Мягкий предел\n(размер)" + +#: source/ubl-settings-quotas.cc:130 source/ubl-settings-quotas.cc:127 +msgid "Soft limit (files)" +msgstr "Мягкий лимит\n(файлы)" + +#: source/ubl-settings-quotas.cc:125 source/ubl-settings-quotas.cc:122 +msgid "Soft limit (size)" +msgstr "Мягкий предел\n(размер)" + +#: source/ubl-settings-quotas.cc:70 source/ubl-settings-quotas.cc:67 +#: source/ubl-settings-quotas.cc:66 +msgid "The program must be run as root" +msgstr "Программа должна быть запущена от имени root" + +#: source/ubl-settings-quotas.cc:86 source/ubl-settings-quotas.cc:83 +#: source/ubl-settings-quotas.cc:82 +msgid "Users" +msgstr "Пользователи" + +#: source/ubl-settings-quotas.cc:101 source/ubl-settings-quotas.cc:102 +#: source/ubl-settings-quotas.cc:103 source/ubl-settings-quotas.cc:104 +#: source/ubl-settings-quotas.cc:98 source/ubl-settings-quotas.cc:99 +#: source/ubl-settings-quotas.cc:100 source/ubl-settings-quotas.cc:97 +msgid "days" +msgstr "дни" + +#: source/ubl-settings-quotas.cc:105 source/ubl-settings-quotas.cc:106 +#: source/ubl-settings-quotas.cc:107 source/ubl-settings-quotas.cc:108 +#: source/ubl-settings-quotas.cc:102 source/ubl-settings-quotas.cc:103 +#: source/ubl-settings-quotas.cc:104 source/ubl-settings-quotas.cc:101 +msgid "hours" +msgstr "часы" + +#: source/ubl-settings-quotas.cc:81 source/ubl-settings-quotas.cc:78 +#: source/ubl-settings-quotas.cc:77 +msgid "https://wiki.ublinux.com" +msgstr "https://wiki.ublinux.ru" + +#: source/ubl-settings-quotas.cc:109 source/ubl-settings-quotas.cc:110 +#: source/ubl-settings-quotas.cc:111 source/ubl-settings-quotas.cc:112 +#: source/ubl-settings-quotas.cc:106 source/ubl-settings-quotas.cc:107 +#: source/ubl-settings-quotas.cc:108 source/ubl-settings-quotas.cc:105 +msgid "minutes" +msgstr "минуты" + +#: source/ubl-settings-quotas.cc:257 +msgid "name" +msgstr "" + +#: source/ubl-settings-quotas.cc:89 source/ubl-settings-quotas.cc:86 +#: source/ubl-settings-quotas.cc:85 +msgid "quotas for groups" +msgstr "квоты для групп" + +#: source/ubl-settings-quotas.cc:92 source/ubl-settings-quotas.cc:89 +#: source/ubl-settings-quotas.cc:88 +msgid "quotas for users" +msgstr "квоты для пользователей" + +#: source/ubl-settings-quotas.cc:318 source/ubl-settings-quotas.cc:267 +#: source/ubl-settings-quotas.cc:213 +msgid "ubl-settings-quotas version: " +msgstr "ubl-settings-quotas версия:" + +#: source/ubl-settings-quotas.cc:97 source/ubl-settings-quotas.cc:98 +#: source/ubl-settings-quotas.cc:99 source/ubl-settings-quotas.cc:100 +#: source/ubl-settings-quotas.cc:94 source/ubl-settings-quotas.cc:95 +#: source/ubl-settings-quotas.cc:96 source/ubl-settings-quotas.cc:93 +msgid "weeks" +msgstr "недели" + +#~ msgid "Nothing to save!" +#~ msgstr "Нечего сохранять!" + +#~ msgid "Help" +#~ msgstr "Справка" + +#~ msgid "About" +#~ msgstr "О программе" + +#~ msgid "Save to global configuration" +#~ msgstr "Сохранить глобальную конфигурацию" + +#~ msgid "Save to local configuration" +#~ msgstr "Сохранить локальную конфигурацию" + +#~ msgid "Save to global and local configuration" +#~ msgstr "Сохранить глобальную и локальную конфигурацию" + +#~ msgid "Load from global configuration" +#~ msgstr "Загрузить глобальную конфигурацию" + +#~ msgid "Load from local configuration" +#~ msgstr "Загрузить локальную конфигурацию" From 5d89bf2d6bff8d506bd4e2c34e6aba64aec1dae1 Mon Sep 17 00:00:00 2001 From: Igor Belitskiy Date: Tue, 4 Apr 2023 17:54:01 +0600 Subject: [PATCH 03/51] =?UTF-8?q?=D0=A7=D0=B0=D1=81=D1=82=D0=B8=D1=87?= =?UTF-8?q?=D0=BD=D0=BE=20=D0=B4=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5=D0=BD?= =?UTF-8?q?=D0=B0=20=D0=BB=D0=BE=D0=BA=D0=B0=D0=BB=D0=B8=D0=B7=D0=B0=D1=86?= =?UTF-8?q?=D0=B8=D1=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- screenshot/screenshot.png | Bin 144454 -> 74219 bytes source/ubl-settings-quotas.cc | 92 +++++++---- source/ubl-settings-quotas.h | 31 +++- ubl-settings-quotas.glade | 286 ++-------------------------------- ubl-settings-quotas.pot | 91 ++++++++--- ubl-settings-quotas_ru.po | 148 +++++++++++++----- 6 files changed, 287 insertions(+), 361 deletions(-) diff --git a/screenshot/screenshot.png b/screenshot/screenshot.png index 3fa8cdddb67af82da1aaaa5d6d91d454c4f916b3..8eea794a517778ef27655639d82959f8caad0421 100644 GIT binary patch literal 74219 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�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 CbJ}view_add_columns(*usersQuotasTree); this->view_add_columns(*groupsQuotasTree); this->event(); - } else { boxFuncs->set_sensitive(false); @@ -131,6 +130,32 @@ void MainWindow::lacalization() { filtersHardFilesFilterCheckbox->set_label(gettext("Hard limit (files)")); filtersHardFilesDelayFilterCheckbox->set_label(gettext("Hard limit (files) delay")); filtersHardFilesActivationFilterCheckbox->set_label(gettext("Hard limit (file) activation time")); + quotegroupDeviceLabel->set_text(gettext("Device:")); + quotegroupDiskQuotasLabel->set_text(gettext("Disk quotas for this device:")); + quotegroupGroupQuotasLabel->set_text(gettext("Group quotas for this device:")); + quotegroupSizeFrameLabel->set_text(gettext("Size")); + quotegroupFilesFrameLabel->set_text(gettext("Files")); + quotegroupSizeCurrentlyLabel->set_text(gettext("Currently using:")); + quotegroupSizeSoftLimitLabel->set_text(gettext("Soft limit")); + quoteSizeHardLimitLabel->set_text(gettext("Hard limit")); + quoteFilesHardLimitLabel->set_text(gettext("Hard limit")); + quotegroupFilesSoftLimitLabel->set_text(gettext("Soft limit")); + quotegroupFilesCurrentlyLabel->set_text(gettext("Currently using:")); + quoteuserDiskQuotasLabel->set_text(gettext("Disk quotas for this device:")); + quoteuserDeviceLabel->set_text(gettext("Device:")); + quoteuserGroupQuotasLabel->set_text(gettext("User quotas for this device: ")); + quoteuserSizeFrameLabel->set_text(gettext("Size")); + quoteuserSizeCurrentlyLabel->set_text(gettext("Currently using:")); + quoteuserSizeSoftLimitLabel->set_text(gettext("Soft limit")); + quoteuserSizeHardLimitLabel1->set_text(gettext("Hard limit")); + quoteuserFileSystemLabel->set_text(gettext("File system:")); + quoteuserFilesFrameLabel->set_text(gettext("Files")); + quoteuserFilesCurrentlyLabel->set_text(gettext("Currently using: ")); + quoteuserFilesSoftLimitLabel->set_text(gettext("Soft limit")); + quoteFilesHardLimitLabel1->set_text(gettext("Hard limit")); + quoteuserFilesHarLimitLabel->set_text(gettext("files")); + quoteuserFilesSoftLimitlabel->set_text(gettext("files")); + quotegroupFileSystemLabel->set_text(gettext("File system:")); } void MainWindow::add_CSS() { @@ -140,7 +165,7 @@ void MainWindow::add_CSS() { 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 headLabel_css = headLabel->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(); @@ -149,7 +174,7 @@ void MainWindow::add_CSS() { boxSave_css->add_class("bkim_no_plug"); } - //headerTopic_css->add_class("textHead"); + headLabel_css->add_class("textHead"); } @@ -235,6 +260,36 @@ void MainWindow::get_builder() { builder->get_widget("GroupsTabLabel", GroupsTabLabel); builder->get_widget("groupsQuotasTree", groupsQuotasTree); builder->get_widget("usersQuotasTree", usersQuotasTree); + builder->get_widget("quotegroupDeviceLabel", quotegroupDeviceLabel); + builder->get_widget("quotegroupFileSystemLabel", quotegroupFileSystemLabel); + builder->get_widget("quotegroupDiskQuotasLabel", quotegroupDiskQuotasLabel); + builder->get_widget("quotegroupGroupQuotasLabel", quotegroupGroupQuotasLabel); + builder->get_widget("quotegroupSizeFrameLabel", quotegroupSizeFrameLabel); + builder->get_widget("quotegroupFilesFrameLabel", quotegroupFilesFrameLabel); + builder->get_widget("quotegroupSizeCurrentlyLabel", quotegroupSizeCurrentlyLabel); + builder->get_widget("quotegroupFilesCurrentlyLabel", quotegroupFilesCurrentlyLabel); + builder->get_widget("quotegroupSizeSoftLimitLabel", quotegroupSizeSoftLimitLabel); + builder->get_widget("quoteSizeHardLimitLabel", quoteSizeHardLimitLabel); + builder->get_widget("quotegroupFilesSoftLimitLabel", quotegroupFilesSoftLimitLabel); + builder->get_widget("quoteFilesHardLimitLabel", quoteFilesHardLimitLabel); + builder->get_widget("quotegroupFilesHarLimitLabel", quotegroupFilesHarLimitLabel); + builder->get_widget("quoteuserDeviceLabel", quoteuserDeviceLabel); + builder->get_widget("quoteuserFileSystemLabel", quoteuserFileSystemLabel); + builder->get_widget("quoteuserDiskQuotasLabel", quoteuserDiskQuotasLabel); + builder->get_widget("quoteuserGroupQuotasLabel", quoteuserGroupQuotasLabel); + builder->get_widget("quoteuserSizeFrameLabel", quoteuserSizeFrameLabel); + builder->get_widget("quoteuserSizeCurrentlyLabel", quoteuserSizeCurrentlyLabel); + builder->get_widget("quoteuserSizeSoftLimitLabel", quoteuserSizeSoftLimitLabel); + builder->get_widget("quoteuserSizeHardLimitLabel1", quoteuserSizeHardLimitLabel1); + builder->get_widget("quoteuserFilesFrameLabel", quoteuserFilesFrameLabel); + builder->get_widget("quoteuserFilesCurrentlyLabel", quoteuserFilesCurrentlyLabel); + builder->get_widget("quoteuserFilesSoftLimitLabel", quoteuserFilesSoftLimitLabel); + builder->get_widget("quoteFilesHardLimitLabel1", quoteFilesHardLimitLabel1); + builder->get_widget("quoteuserFilesHarLimitLabel", quoteuserFilesHarLimitLabel); + builder->get_widget("quoteuserFilesSoftLimitlabel", quoteuserFilesSoftLimitlabel); + builder->get_widget("QuotasEditWindow", QuotasEditWindow); + builder->get_widget("QuotasUserEditWindow", QuotasUserEditWindow); + } void MainWindow::event() { @@ -254,6 +309,8 @@ void MainWindow::groupsFilters_show() { } void MainWindow::view_add_columns(Gtk::TreeView &treeView) { + // TODO: + // Не готово treeView.append_column(gettext("Name"), m_columns.name); treeView.append_column_editable(gettext("Quotas"), m_columns.quotas); treeView.append_column(gettext("Size"), m_columns.size); @@ -275,35 +332,6 @@ void MainWindow::info_status_app(string stule) { boxInfo->add_class(stule); } - - - - - - - - - - - - - - - - - - - - - - - - - - - - - SettingsPlug::SettingsPlug(::Window p_socketID, Glib::RefPtr builder) :Gtk::Plug{p_socketID} { MainWindow* wnd = nullptr; diff --git a/source/ubl-settings-quotas.h b/source/ubl-settings-quotas.h index 34a9cca..bdafc06 100644 --- a/source/ubl-settings-quotas.h +++ b/source/ubl-settings-quotas.h @@ -132,7 +132,36 @@ class MainWindow : public Gtk::ApplicationWindow { Gtk::CheckButton *filtersHardFilesDelayFilterCheckbox; Gtk::CheckButton *filtersHardFilesActivationFilterCheckbox; Gtk::TreeView *groupsQuotasTree; - Gtk::TreeView *usersQuotasTree; + Gtk::TreeView *usersQuotasTree; + Gtk::Label *quotegroupDeviceLabel; + Gtk::Label *quotegroupFileSystemLabel; + Gtk::Label *quotegroupDiskQuotasLabel; + Gtk::Label *quotegroupGroupQuotasLabel; + Gtk::Label *quotegroupSizeFrameLabel; + Gtk::Label *quotegroupSizeCurrentlyLabel; + Gtk::Label *quoteSizeHardLimitLabel; + Gtk::Label *quotegroupFilesFrameLabel; + Gtk::Label *quotegroupFilesCurrentlyLabel; + Gtk::Label *quotegroupFilesSoftLimitLabel; + Gtk::Label *quoteFilesHardLimitLabel; + Gtk::Label *quotegroupFilesHarLimitLabel; + Gtk::Label *quoteuserDeviceLabel; + Gtk::Label *quoteuserDiskQuotasLabel; + Gtk::Label *quoteuserFileSystemLabel; + Gtk::Label *quoteuserGroupQuotasLabel; + Gtk::Label *quoteuserSizeFrameLabel; + Gtk::Label *quoteuserSizeCurrentlyLabel; + Gtk::Label *quoteuserSizeSoftLimitLabel; + Gtk::Label *quoteuserSizeHardLimitLabel1; + Gtk::Label *quoteuserFilesCurrentlyLabel; + Gtk::Label *quoteuserFilesSoftLimitLabel; + Gtk::Label *quoteFilesHardLimitLabel1; + Gtk::Label *quoteuserFilesHarLimitLabel; + Gtk::Label *quoteuserFilesFrameLabel; + Gtk::Label *quotegroupSizeSoftLimitLabel; + Gtk::Label *quoteuserFilesSoftLimitlabel; + Gtk::Window *QuotasUserEditWindow; + Gtk::Window *QuotasEditWindow; public: MainWindow(BaseObjectType* obj, Glib::RefPtr const& builder); MainWindow(Glib::RefPtr const& builder); diff --git a/ubl-settings-quotas.glade b/ubl-settings-quotas.glade index 850ab4e..7e731f6 100644 --- a/ubl-settings-quotas.glade +++ b/ubl-settings-quotas.glade @@ -269,266 +269,6 @@
- - False - start - False - - - True - False - 5 - 5 - 5 - 5 - 5 - 5 - vertical - - - Name - True - True - False - start - 6 - True - - - False - True - 0 - - - - - Quotas - True - True - False - start - True - - - False - True - 1 - - - - - Size - True - True - False - start - True - - - False - True - 2 - - - - - Soft limit (size) - True - True - False - start - True - - - False - True - 3 - - - - - Hard limit (size) - True - True - False - start - True - - - False - True - 4 - - - - - Hard limit (size) delay - True - True - False - start - True - - - False - True - 5 - - - - - Hard limit (size) activation time - True - True - False - start - True - - - False - True - 6 - - - - - Files - True - True - False - start - True - - - False - True - 7 - - - - - Soft limit (files) - True - True - False - start - True - - - False - True - 8 - - - - - Hard limit (files) - True - True - False - start - True - - - False - True - 9 - - - - - Hard limit (files) delay - True - True - False - start - True - - - False - True - 10 - - - - - Hard limit (file) activation time - True - True - False - start - True - - - False - True - 11 - - - - - True - False - end - 5 - 5 - True - - - gtk-cancel - True - True - True - center - True - - - False - True - 0 - - - - - gtk-save - True - True - True - center - True - - - False - True - 1 - - - - - False - True - 12 - - - - - - - True - False - UBConfig - Quotas - - - True - False - 32 - com.ublinux.ubl-settings-quotas - 5 - - - - - @@ -2443,7 +2183,7 @@ True False - Device: + Device: False @@ -2468,7 +2208,7 @@ True False start - File system: + File system: 0 @@ -2501,7 +2241,7 @@ True False - Group quotas for this device: + Group quotas for this device: 0 @@ -2741,7 +2481,7 @@ True False - Currently using: + Currently using: False @@ -2916,10 +2656,11 @@ True - Cancel + gtk-cancel True True True + True False @@ -2929,10 +2670,11 @@ - Save + gtk-save True True True + True False @@ -3007,7 +2749,7 @@ True False - Device: + Device: False @@ -3032,7 +2774,7 @@ True False start - File system: + File system: 0
@@ -3114,7 +2856,7 @@ True False - Currently using: + Currently using: False @@ -3480,12 +3222,13 @@ True - Cancel + gtk-cancel True True True 5 5 + True False @@ -3495,12 +3238,13 @@ - Save + gtk-save True True True 5 5 + True False diff --git a/ubl-settings-quotas.pot b/ubl-settings-quotas.pot index 1e0c779..56c39b0 100644 --- a/ubl-settings-quotas.pot +++ b/ubl-settings-quotas.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-04-04 16:45+0600\n" +"POT-Creation-Date: 2023-04-04 17:17+0600\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -26,18 +26,32 @@ msgstr "" msgid "Copyright © UBSoft LLC, 2022 - " msgstr "" +#: source/ubl-settings-quotas.cc:139 source/ubl-settings-quotas.cc:144 +#: source/ubl-settings-quotas.cc:149 +msgid "Currently using:" +msgstr "" + +#: source/ubl-settings-quotas.cc:154 +msgid "Currently using: " +msgstr "" + #: source/ubl-settings-quotas.cc:80 source/ubl-settings-quotas.cc:77 #: source/ubl-settings-quotas.cc:76 msgid "Date and Time" msgstr "" #: source/ubl-settings-quotas.cc:87 source/ubl-settings-quotas.cc:119 -#: source/ubl-settings-quotas.cc:120 source/ubl-settings-quotas.cc:84 +#: source/ubl-settings-quotas.cc:120 source/ubl-settings-quotas.cc:134 +#: source/ubl-settings-quotas.cc:146 source/ubl-settings-quotas.cc:84 #: source/ubl-settings-quotas.cc:116 source/ubl-settings-quotas.cc:117 #: source/ubl-settings-quotas.cc:83 msgid "Device:" msgstr "" +#: source/ubl-settings-quotas.cc:135 source/ubl-settings-quotas.cc:145 +msgid "Disk quotas for this device:" +msgstr "" + #: source/ubl-settings-quotas.cc:90 source/ubl-settings-quotas.cc:91 #: source/ubl-settings-quotas.cc:87 source/ubl-settings-quotas.cc:88 #: source/ubl-settings-quotas.cc:86 @@ -57,14 +71,15 @@ msgid "Excess size delay period" msgstr "" #: source/ubl-settings-quotas.cc:88 source/ubl-settings-quotas.cc:113 -#: source/ubl-settings-quotas.cc:114 source/ubl-settings-quotas.cc:85 -#: source/ubl-settings-quotas.cc:110 source/ubl-settings-quotas.cc:111 -#: source/ubl-settings-quotas.cc:84 +#: source/ubl-settings-quotas.cc:114 source/ubl-settings-quotas.cc:152 +#: source/ubl-settings-quotas.cc:85 source/ubl-settings-quotas.cc:110 +#: source/ubl-settings-quotas.cc:111 source/ubl-settings-quotas.cc:84 msgid "File system:" msgstr "" -#: source/ubl-settings-quotas.cc:129 source/ubl-settings-quotas.cc:264 -#: source/ubl-settings-quotas.cc:126 +#: source/ubl-settings-quotas.cc:129 source/ubl-settings-quotas.cc:138 +#: source/ubl-settings-quotas.cc:153 source/ubl-settings-quotas.cc:317 +#: source/ubl-settings-quotas.cc:264 source/ubl-settings-quotas.cc:126 msgid "Files" msgstr "" @@ -78,44 +93,53 @@ msgstr "" msgid "General settings" msgstr "" +#: source/ubl-settings-quotas.cc:136 +msgid "Group quotas for this device:" +msgstr "" + #: source/ubl-settings-quotas.cc:85 source/ubl-settings-quotas.cc:82 #: source/ubl-settings-quotas.cc:81 msgid "Groups" msgstr "" -#: source/ubl-settings-quotas.cc:263 +#: source/ubl-settings-quotas.cc:141 source/ubl-settings-quotas.cc:142 +#: source/ubl-settings-quotas.cc:151 source/ubl-settings-quotas.cc:156 +msgid "Hard limit" +msgstr "" + +#: source/ubl-settings-quotas.cc:316 source/ubl-settings-quotas.cc:263 msgid "" "Hard limit\n" "(Size) activation\n" "time" msgstr "" -#: source/ubl-settings-quotas.cc:266 +#: source/ubl-settings-quotas.cc:319 source/ubl-settings-quotas.cc:266 msgid "" "Hard limit\n" "(files)" msgstr "" -#: source/ubl-settings-quotas.cc:268 +#: source/ubl-settings-quotas.cc:321 source/ubl-settings-quotas.cc:268 msgid "" "Hard limit\n" "(files) activation\n" "time" msgstr "" -#: source/ubl-settings-quotas.cc:267 +#: source/ubl-settings-quotas.cc:320 source/ubl-settings-quotas.cc:267 msgid "" "Hard limit\n" "(files) delay" msgstr "" -#: source/ubl-settings-quotas.cc:261 +#: source/ubl-settings-quotas.cc:314 source/ubl-settings-quotas.cc:261 msgid "" "Hard limit\n" "(size)" msgstr "" -#: source/ubl-settings-quotas.cc:262 +#: source/ubl-settings-quotas.cc:315 source/ubl-settings-quotas.cc:262 msgid "" "Hard limit\n" "(size) delay" @@ -150,7 +174,8 @@ msgstr "" msgid "Load" msgstr "" -#: source/ubl-settings-quotas.cc:122 source/ubl-settings-quotas.cc:119 +#: source/ubl-settings-quotas.cc:122 source/ubl-settings-quotas.cc:310 +#: source/ubl-settings-quotas.cc:119 msgid "Name" msgstr "" @@ -159,8 +184,8 @@ msgstr "" msgid "Project Home Page" msgstr "" -#: source/ubl-settings-quotas.cc:123 source/ubl-settings-quotas.cc:258 -#: source/ubl-settings-quotas.cc:120 +#: source/ubl-settings-quotas.cc:123 source/ubl-settings-quotas.cc:311 +#: source/ubl-settings-quotas.cc:258 source/ubl-settings-quotas.cc:120 msgid "Quotas" msgstr "" @@ -169,18 +194,24 @@ msgstr "" msgid "Save" msgstr "" -#: source/ubl-settings-quotas.cc:124 source/ubl-settings-quotas.cc:259 -#: source/ubl-settings-quotas.cc:121 +#: source/ubl-settings-quotas.cc:124 source/ubl-settings-quotas.cc:137 +#: source/ubl-settings-quotas.cc:148 source/ubl-settings-quotas.cc:312 +#: source/ubl-settings-quotas.cc:259 source/ubl-settings-quotas.cc:121 msgid "Size" msgstr "" -#: source/ubl-settings-quotas.cc:265 +#: source/ubl-settings-quotas.cc:140 source/ubl-settings-quotas.cc:143 +#: source/ubl-settings-quotas.cc:150 source/ubl-settings-quotas.cc:155 +msgid "Soft limit" +msgstr "" + +#: source/ubl-settings-quotas.cc:318 source/ubl-settings-quotas.cc:265 msgid "" "Soft limit\n" "(files)" msgstr "" -#: source/ubl-settings-quotas.cc:260 +#: source/ubl-settings-quotas.cc:313 source/ubl-settings-quotas.cc:260 msgid "" "Soft limit\n" "(size)" @@ -199,6 +230,10 @@ msgstr "" msgid "The program must be run as root" msgstr "" +#: source/ubl-settings-quotas.cc:147 +msgid "User quotas for this device: " +msgstr "" + #: source/ubl-settings-quotas.cc:86 source/ubl-settings-quotas.cc:83 #: source/ubl-settings-quotas.cc:82 msgid "Users" @@ -211,6 +246,10 @@ msgstr "" msgid "days" msgstr "" +#: source/ubl-settings-quotas.cc:157 source/ubl-settings-quotas.cc:158 +msgid "files" +msgstr "" + #: source/ubl-settings-quotas.cc:105 source/ubl-settings-quotas.cc:106 #: source/ubl-settings-quotas.cc:107 source/ubl-settings-quotas.cc:108 #: source/ubl-settings-quotas.cc:102 source/ubl-settings-quotas.cc:103 @@ -244,8 +283,8 @@ msgstr "" msgid "quotas for users" msgstr "" -#: source/ubl-settings-quotas.cc:318 source/ubl-settings-quotas.cc:267 -#: source/ubl-settings-quotas.cc:213 +#: source/ubl-settings-quotas.cc:371 source/ubl-settings-quotas.cc:318 +#: source/ubl-settings-quotas.cc:267 source/ubl-settings-quotas.cc:213 msgid "ubl-settings-quotas version: " msgstr "" @@ -255,3 +294,11 @@ msgstr "" #: source/ubl-settings-quotas.cc:96 source/ubl-settings-quotas.cc:93 msgid "weeks" msgstr "" + +msgid "" +"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" +msgstr "" \ No newline at end of file diff --git a/ubl-settings-quotas_ru.po b/ubl-settings-quotas_ru.po index a2449e8..05795b7 100644 --- a/ubl-settings-quotas_ru.po +++ b/ubl-settings-quotas_ru.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: ublexec 1.0\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-04-04 16:45+0600\n" +"POT-Creation-Date: 2023-04-04 17:17+0600\n" "PO-Revision-Date: 2023-01-01 00:00+0600\n" "Last-Translator: UBLinux Team \n" "Language-Team: Russian - UBLinux Team \n" @@ -26,18 +26,32 @@ msgstr "Настройка параметров дисковых квот для msgid "Copyright © UBSoft LLC, 2022 - " msgstr "" +#: source/ubl-settings-quotas.cc:139 source/ubl-settings-quotas.cc:144 +#: source/ubl-settings-quotas.cc:149 +msgid "Currently using:" +msgstr "В настоящее время используется:" + +#: source/ubl-settings-quotas.cc:154 +msgid "Currently using: " +msgstr "В настоящее время используется: " + #: source/ubl-settings-quotas.cc:80 source/ubl-settings-quotas.cc:77 #: source/ubl-settings-quotas.cc:76 msgid "Date and Time" msgstr "Дата и время" #: source/ubl-settings-quotas.cc:87 source/ubl-settings-quotas.cc:119 -#: source/ubl-settings-quotas.cc:120 source/ubl-settings-quotas.cc:84 +#: source/ubl-settings-quotas.cc:120 source/ubl-settings-quotas.cc:134 +#: source/ubl-settings-quotas.cc:146 source/ubl-settings-quotas.cc:84 #: source/ubl-settings-quotas.cc:116 source/ubl-settings-quotas.cc:117 #: source/ubl-settings-quotas.cc:83 msgid "Device:" msgstr "Устройство:" +#: source/ubl-settings-quotas.cc:135 source/ubl-settings-quotas.cc:145 +msgid "Disk quotas for this device:" +msgstr "Дисковые квоты для этого устройства:" + #: source/ubl-settings-quotas.cc:90 source/ubl-settings-quotas.cc:91 #: source/ubl-settings-quotas.cc:87 source/ubl-settings-quotas.cc:88 #: source/ubl-settings-quotas.cc:86 @@ -57,14 +71,15 @@ msgid "Excess size delay period" msgstr "Период задержки превышения размера" #: source/ubl-settings-quotas.cc:88 source/ubl-settings-quotas.cc:113 -#: source/ubl-settings-quotas.cc:114 source/ubl-settings-quotas.cc:85 -#: source/ubl-settings-quotas.cc:110 source/ubl-settings-quotas.cc:111 -#: source/ubl-settings-quotas.cc:84 +#: source/ubl-settings-quotas.cc:114 source/ubl-settings-quotas.cc:152 +#: source/ubl-settings-quotas.cc:85 source/ubl-settings-quotas.cc:110 +#: source/ubl-settings-quotas.cc:111 source/ubl-settings-quotas.cc:84 msgid "File system:" msgstr "Файловая система:" -#: source/ubl-settings-quotas.cc:129 source/ubl-settings-quotas.cc:264 -#: source/ubl-settings-quotas.cc:126 +#: source/ubl-settings-quotas.cc:129 source/ubl-settings-quotas.cc:138 +#: source/ubl-settings-quotas.cc:153 source/ubl-settings-quotas.cc:317 +#: source/ubl-settings-quotas.cc:264 source/ubl-settings-quotas.cc:126 msgid "Files" msgstr "Файлы" @@ -78,54 +93,76 @@ msgstr "Фильтры" msgid "General settings" msgstr "Общие настройки" +#: source/ubl-settings-quotas.cc:136 +msgid "Group quotas for this device:" +msgstr "Групповые квоты для этого устройства:" + #: source/ubl-settings-quotas.cc:85 source/ubl-settings-quotas.cc:82 #: source/ubl-settings-quotas.cc:81 msgid "Groups" msgstr "Группы" -#: source/ubl-settings-quotas.cc:263 +#: source/ubl-settings-quotas.cc:141 source/ubl-settings-quotas.cc:142 +#: source/ubl-settings-quotas.cc:151 source/ubl-settings-quotas.cc:156 +#, fuzzy +msgid "Hard limit" +msgstr "Жесткий предел" + +#: source/ubl-settings-quotas.cc:316 source/ubl-settings-quotas.cc:263 #, fuzzy msgid "" "Hard limit\n" "(Size) activation\n" "time" -msgstr "Жесткий предел\n(размер)" +msgstr "" +"Жесткий предел\n" +"(размер)" -#: source/ubl-settings-quotas.cc:266 +#: source/ubl-settings-quotas.cc:319 source/ubl-settings-quotas.cc:266 #, fuzzy msgid "" "Hard limit\n" "(files)" -msgstr "Жесткий лимит\n(файлы)" +msgstr "" +"Жесткий лимит\n" +"(файлы)" -#: source/ubl-settings-quotas.cc:268 +#: source/ubl-settings-quotas.cc:321 source/ubl-settings-quotas.cc:268 #, fuzzy msgid "" "Hard limit\n" "(files) activation\n" "time" -msgstr "Время активации\nжесткого лимита (файла)" +msgstr "" +"Время активации\n" +"жесткого лимита (файла)" -#: source/ubl-settings-quotas.cc:267 +#: source/ubl-settings-quotas.cc:320 source/ubl-settings-quotas.cc:267 #, fuzzy msgid "" "Hard limit\n" "(files) delay" -msgstr "Жесткий лимит\n(файлы)" +msgstr "" +"Жесткий лимит\n" +"(файлы)" -#: source/ubl-settings-quotas.cc:261 +#: source/ubl-settings-quotas.cc:314 source/ubl-settings-quotas.cc:261 #, fuzzy msgid "" "Hard limit\n" "(size)" -msgstr "Жесткий предел\n(размер) задержки" +msgstr "" +"Жесткий предел\n" +"(размер) задержки" -#: source/ubl-settings-quotas.cc:262 +#: source/ubl-settings-quotas.cc:315 source/ubl-settings-quotas.cc:262 #, fuzzy msgid "" "Hard limit\n" "(size) delay" -msgstr "Жесткий предел\n(размер) задержки" +msgstr "" +"Жесткий предел\n" +"(размер) задержки" #: source/ubl-settings-quotas.cc:133 source/ubl-settings-quotas.cc:130 msgid "Hard limit (file) activation time" @@ -156,7 +193,8 @@ msgstr "Жесткий предел (размер) задержки" msgid "Load" msgstr "Загрузить" -#: source/ubl-settings-quotas.cc:122 source/ubl-settings-quotas.cc:119 +#: source/ubl-settings-quotas.cc:122 source/ubl-settings-quotas.cc:310 +#: source/ubl-settings-quotas.cc:119 msgid "Name" msgstr "Имя" @@ -165,8 +203,8 @@ msgstr "Имя" msgid "Project Home Page" msgstr "Главная страница проекта" -#: source/ubl-settings-quotas.cc:123 source/ubl-settings-quotas.cc:258 -#: source/ubl-settings-quotas.cc:120 +#: source/ubl-settings-quotas.cc:123 source/ubl-settings-quotas.cc:311 +#: source/ubl-settings-quotas.cc:258 source/ubl-settings-quotas.cc:120 msgid "Quotas" msgstr "Квоты" @@ -175,38 +213,59 @@ msgstr "Квоты" msgid "Save" msgstr "Сохранить" -#: source/ubl-settings-quotas.cc:124 source/ubl-settings-quotas.cc:259 -#: source/ubl-settings-quotas.cc:121 +#: source/ubl-settings-quotas.cc:124 source/ubl-settings-quotas.cc:137 +#: source/ubl-settings-quotas.cc:148 source/ubl-settings-quotas.cc:312 +#: source/ubl-settings-quotas.cc:259 source/ubl-settings-quotas.cc:121 msgid "Size" -msgstr "Размер" +msgstr "Объём" -#: source/ubl-settings-quotas.cc:265 +#: source/ubl-settings-quotas.cc:140 source/ubl-settings-quotas.cc:143 +#: source/ubl-settings-quotas.cc:150 source/ubl-settings-quotas.cc:155 +#, fuzzy +msgid "Soft limit" +msgstr "" +"Мягкий предел\n" +"(размер)" + +#: source/ubl-settings-quotas.cc:318 source/ubl-settings-quotas.cc:265 #, fuzzy msgid "" "Soft limit\n" "(files)" -msgstr "Мягкий лимит\n(файлы)" +msgstr "" +"Мягкий лимит\n" +"(файлы)" -#: source/ubl-settings-quotas.cc:260 +#: source/ubl-settings-quotas.cc:313 source/ubl-settings-quotas.cc:260 #, fuzzy msgid "" "Soft limit\n" "(size)" -msgstr "Мягкий предел\n(размер)" +msgstr "" +"Мягкий предел\n" +"(размер)" #: source/ubl-settings-quotas.cc:130 source/ubl-settings-quotas.cc:127 msgid "Soft limit (files)" -msgstr "Мягкий лимит\n(файлы)" +msgstr "" +"Мягкий лимит\n" +"(файлы)" #: source/ubl-settings-quotas.cc:125 source/ubl-settings-quotas.cc:122 msgid "Soft limit (size)" -msgstr "Мягкий предел\n(размер)" +msgstr "" +"Мягкий предел\n" +"(размер)" #: source/ubl-settings-quotas.cc:70 source/ubl-settings-quotas.cc:67 #: source/ubl-settings-quotas.cc:66 msgid "The program must be run as root" msgstr "Программа должна быть запущена от имени root" +#: source/ubl-settings-quotas.cc:147 +msgid "User quotas for this device: " +msgstr "Квоты пользователей для этого устройства: " + #: source/ubl-settings-quotas.cc:86 source/ubl-settings-quotas.cc:83 #: source/ubl-settings-quotas.cc:82 msgid "Users" @@ -219,6 +278,11 @@ msgstr "Пользователи" msgid "days" msgstr "дни" +#: source/ubl-settings-quotas.cc:157 source/ubl-settings-quotas.cc:158 +#, fuzzy +msgid "files" +msgstr "Файлы" + #: source/ubl-settings-quotas.cc:105 source/ubl-settings-quotas.cc:106 #: source/ubl-settings-quotas.cc:107 source/ubl-settings-quotas.cc:108 #: source/ubl-settings-quotas.cc:102 source/ubl-settings-quotas.cc:103 @@ -240,7 +304,7 @@ msgstr "минуты" #: source/ubl-settings-quotas.cc:257 msgid "name" -msgstr "" +msgstr "имя" #: source/ubl-settings-quotas.cc:89 source/ubl-settings-quotas.cc:86 #: source/ubl-settings-quotas.cc:85 @@ -252,10 +316,10 @@ msgstr "квоты для групп" msgid "quotas for users" msgstr "квоты для пользователей" -#: source/ubl-settings-quotas.cc:318 source/ubl-settings-quotas.cc:267 -#: source/ubl-settings-quotas.cc:213 +#: source/ubl-settings-quotas.cc:371 source/ubl-settings-quotas.cc:318 +#: source/ubl-settings-quotas.cc:267 source/ubl-settings-quotas.cc:213 msgid "ubl-settings-quotas version: " -msgstr "ubl-settings-quotas версия:" +msgstr "ubl-settings-quotas версия: " #: source/ubl-settings-quotas.cc:97 source/ubl-settings-quotas.cc:98 #: source/ubl-settings-quotas.cc:99 source/ubl-settings-quotas.cc:100 @@ -287,3 +351,17 @@ msgstr "недели" #~ msgid "Load from local configuration" #~ msgstr "Загрузить локальную конфигурацию" + +msgid "" +"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" +msgstr "" +"GTK-утилита настройки квот для UBLinux\n" +"\n" +"Использование: ubl-settings-quotas [Параметры приложения...]\n" +"Параметры приложения:\n" +" -h, --help\t Показать параметры справки\n" +" -V, --version\t Показать версию пакета\n" \ No newline at end of file From ac77b6b4d656c569258568549849bd68a504739f Mon Sep 17 00:00:00 2001 From: Igor Belitskiy Date: Wed, 5 Apr 2023 09:48:44 +0600 Subject: [PATCH 04/51] =?UTF-8?q?=D0=98=D1=81=D0=BF=D1=80=D0=B0=D0=B2?= =?UTF-8?q?=D0=BB=D0=B5=D0=BD=20Makefile?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Makefile | 36 +++++++++++++++++++----------------- 1 file changed, 19 insertions(+), 17 deletions(-) diff --git a/Makefile b/Makefile index 8c69de3..ebf196f 100644 --- a/Makefile +++ b/Makefile @@ -14,7 +14,7 @@ FILE_VERSION = VERSION.md DEPENDS = /bin/cmake PREFIX ?= /usr PKGNAME = $(MAKEFILE_DIR) -#PKGNAME = ubl-settings-manager +#PKGNAME = ubl-settings-datetime default_target: all @@ -24,7 +24,7 @@ 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; \ + sed -r "s/(version_application = ).*/\1\"$$(grep 'VERSION' ${FILE_VERSION} | cut -d" " -f2)\";/" -i source/ubl-settings-datetime.cc; \ echo "-- Build path: ${CMAKE_BUILD_DIR}" depend: @@ -85,6 +85,8 @@ uninstall: done @$(RM) "${DESTDIR}${PREFIX}/bin/${PKGNAME}" @$(RM) "${DESTDIR}${PREFIX}/share/applications/${PKGNAME}.desktop" + @$(RM) "${DESTDIR}${PREFIX}/share/${PKGNAME}/images/logo-background.png" + @$(RM) "${DESTDIR}${PREFIX}/share/polkit-1/actions/com.ublinux.pkexec.${PKGNAME}.exec.policy" @$(RM) "${DESTDIR}${PREFIX}/share/icons/hicolor/scalable/apps/com.ublinux.${PKGNAME}.svg" @$(RM) -rd "${DESTDIR}${PREFIX}/share/${PKGNAME}" @if [ -z ${DESTDIR} ]; then \ @@ -106,20 +108,21 @@ install: check uninstall 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"; \ + rsvg-convert -w $${SIZE} -h $${SIZE} -f png --keep-image-data "com.ublinux.${PKGNAME}.svg" -o "${DESTDIR}${PREFIX}/share/icons/hicolor/$${SIZE}x$${SIZE}/apps/com.ublinux.${PKGNAME}.png"; \ 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/polkit-1/actions" + @install -Dm644 -t "${DESTDIR}${PREFIX}/share/polkit-1/actions/" "com.ublinux.pkexec.${PKGNAME}.exec.policy" @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" + @install -Dm644 -t "${DESTDIR}${PREFIX}/share/${PKGNAME}/images/" "logo-background.png" + @install -Dm644 -t "${DESTDIR}${PREFIX}/share/icons/hicolor/scalable/status/" "com.ublinux.${PKGNAME}.checked.svg" + @install -Dm644 -t "${DESTDIR}${PREFIX}/share/icons/hicolor/scalable/status/" "com.ublinux.${PKGNAME}.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; \ @@ -145,13 +148,12 @@ up_ver: 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" + @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" From a9253f510e394010fdc69f7fff4c1550340194e9 Mon Sep 17 00:00:00 2001 From: Igor Belitskiy Date: Wed, 5 Apr 2023 09:49:19 +0600 Subject: [PATCH 05/51] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=20=D1=84=D0=B0=D0=B9=D0=BB=20policy?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...nux.pkexec.ubl-settings-quotas.exec.policy | 24 +++++++++++++++++++ 1 file changed, 24 insertions(+) create mode 100644 com.ublinux.pkexec.ubl-settings-quotas.exec.policy diff --git a/com.ublinux.pkexec.ubl-settings-quotas.exec.policy b/com.ublinux.pkexec.ubl-settings-quotas.exec.policy new file mode 100644 index 0000000..f7a538c --- /dev/null +++ b/com.ublinux.pkexec.ubl-settings-quotas.exec.policy @@ -0,0 +1,24 @@ + + + + + UBLinux + https://ublinux.ru + + + Run "ubl-settings-quotas" as root + Запус "Загрузка системы" с правами root + Authentication is required to run "ubl-settings-quotas" + Требуется авторизация для запуска "Загрузка системы" с правами root + + auth_admin + auth_admin + auth_admin + + /usr/bin/ubl-settings-quotas + true + + + From 07098d2c803c7a902aaf8e0f6fd233f62cce39c0 Mon Sep 17 00:00:00 2001 From: Igor Belitskiy Date: Wed, 5 Apr 2023 09:50:09 +0600 Subject: [PATCH 06/51] =?UTF-8?q?=D0=98=D1=81=D0=BF=D1=80=D0=B0=D0=B2?= =?UTF-8?q?=D0=BB=D0=B5=D0=BD=D0=BE=20=D0=BD=D0=B0=D0=B7=D0=B2=D0=B0=D0=BD?= =?UTF-8?q?=D0=B8=D0=B5=20=D1=84=D0=BE=D0=BD=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...s-quotas-banner.png => logo-background.png | Bin source/main.cc | 4 +- source/process.cc | 10 + source/process.h | 22 ++ source/ubl-settings-quotas.cc | 196 +++++++-------- source/ubl-settings-quotas.h | 1 + source/util.h | 5 + ubl-settings-quotas.pot | 209 +++++++++------- ubl-settings-quotas_ru.po | 223 +++++++++++------- 9 files changed, 405 insertions(+), 265 deletions(-) rename ubl-settings-quotas-banner.png => logo-background.png (100%) create mode 100644 source/process.cc create mode 100644 source/process.h diff --git a/ubl-settings-quotas-banner.png b/logo-background.png similarity index 100% rename from ubl-settings-quotas-banner.png rename to logo-background.png diff --git a/source/main.cc b/source/main.cc index 4aa2a5a..a0ef5e8 100644 --- a/source/main.cc +++ b/source/main.cc @@ -62,13 +62,13 @@ void pars_flag(int index_start, int argc, char* argv[]) { exit(1); } else if (str_argv == "--version" || str_argv == "-v"){ - string version = string(gettext("ubl-settings-quotas version: ")) + version_application + "\n"; + string version = string(_("ubl-settings-quotas version: ")) + version_application + "\n"; cout << version.c_str(); exit(1); } else{ if (index_start == 1){ - cout << (gettext("Argument not recognized\n")) << endl; + cout << (_("Argument not recognized\n")) << endl; } } diff --git a/source/process.cc b/source/process.cc new file mode 100644 index 0000000..00c83c5 --- /dev/null +++ b/source/process.cc @@ -0,0 +1,10 @@ +#include "process.h" + +struct Result Process_call::call(string cmd) {} +int Process::get_count_error() { + return this->i_error; +} +void Process::set_count_error(int count_error) { + this->i_error = count_error; +} +void Process_system::call(string cmd) {} \ No newline at end of file diff --git a/source/process.h b/source/process.h new file mode 100644 index 0000000..8266223 --- /dev/null +++ b/source/process.h @@ -0,0 +1,22 @@ +#include "util.h" + +class Process { + int i_error = 0; + int i_error_old = 0; + virtual int get_count_error() = 0; + virtual void set_count_error(int count_error) = 0; +}; + + +class Process_call: Process { + public: + Process_call(); + struct Result call(string cmd); + +}; +class Process_system: Process { + public: + Process_system(); + void call(string cmd); + +}; \ No newline at end of file diff --git a/source/ubl-settings-quotas.cc b/source/ubl-settings-quotas.cc index 28bf58e..2d187b3 100755 --- a/source/ubl-settings-quotas.cc +++ b/source/ubl-settings-quotas.cc @@ -56,8 +56,7 @@ void MainWindow::settings() { HeadOverlay->add_overlay(*boxWidget); ubl_make_plugs(boxSave, boxButton, socket_ext_id_I, socket_trd_id_I); if (geteuid() == 0) { - this->view_add_columns(*usersQuotasTree); - this->view_add_columns(*groupsQuotasTree); + this->init_tree_view(); this->event(); } else { @@ -66,96 +65,101 @@ void MainWindow::settings() { 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")); + lblWarning->set_text(_("The program must be run as root")); } } +void MainWindow::init_tree_view() { + this->view_add_columns(*usersQuotasTree); + this->view_add_columns(*groupsQuotasTree); +} + 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); + string str_authors = string(_("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_comments(_("Date and Time")); + aboutWindows->set_website(_("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")); - groupsFileSystemLabel->set_text(gettext("File system:")); - usersFileSystemLabel->set_text(gettext("File system:")); - usersFiltersButton->set_label(gettext("Filters")); - groupsFiltersButton->set_label(gettext("Filters")); - lblLoad->set_text(gettext("Load")); - lblSave->set_text(gettext("Save")); - groupsDeviceLabel->set_label(gettext("Device:")); - usersDeviceLabel->set_label(gettext("Device:")); - headLabel->set_label(gettext("Configuration of disk quotas parameters for system groups and users")); - filtersNameFilterCheckbox->set_label(gettext("Name")); - filtersQuotasFilterCheckbox->set_label(gettext("Quotas")); - filtersSizeFilterCheckbox->set_label(gettext("Size")); - filtersSoftSizeFilterCheckbox->set_label(gettext("Soft limit (size)")); - filtersHardSizeFilterCheckbox->set_label(gettext("Hard limit (size)")); - filtersHardSizeDelayFilterCheckbox->set_label(gettext("Hard limit (size) delay")); - filtersHardSizeActivationFilterCheckbox->set_label(gettext("Hard limit (size) activation time")); - filtersFilesFilterCheckbox->set_label(gettext("Files")); - filtersSoftFilesFilterCheckbox->set_label(gettext("Soft limit (files)")); - filtersHardFilesFilterCheckbox->set_label(gettext("Hard limit (files)")); - filtersHardFilesDelayFilterCheckbox->set_label(gettext("Hard limit (files) delay")); - filtersHardFilesActivationFilterCheckbox->set_label(gettext("Hard limit (file) activation time")); - quotegroupDeviceLabel->set_text(gettext("Device:")); - quotegroupDiskQuotasLabel->set_text(gettext("Disk quotas for this device:")); - quotegroupGroupQuotasLabel->set_text(gettext("Group quotas for this device:")); - quotegroupSizeFrameLabel->set_text(gettext("Size")); - quotegroupFilesFrameLabel->set_text(gettext("Files")); - quotegroupSizeCurrentlyLabel->set_text(gettext("Currently using:")); - quotegroupSizeSoftLimitLabel->set_text(gettext("Soft limit")); - quoteSizeHardLimitLabel->set_text(gettext("Hard limit")); - quoteFilesHardLimitLabel->set_text(gettext("Hard limit")); - quotegroupFilesSoftLimitLabel->set_text(gettext("Soft limit")); - quotegroupFilesCurrentlyLabel->set_text(gettext("Currently using:")); - quoteuserDiskQuotasLabel->set_text(gettext("Disk quotas for this device:")); - quoteuserDeviceLabel->set_text(gettext("Device:")); - quoteuserGroupQuotasLabel->set_text(gettext("User quotas for this device: ")); - quoteuserSizeFrameLabel->set_text(gettext("Size")); - quoteuserSizeCurrentlyLabel->set_text(gettext("Currently using:")); - quoteuserSizeSoftLimitLabel->set_text(gettext("Soft limit")); - quoteuserSizeHardLimitLabel1->set_text(gettext("Hard limit")); - quoteuserFileSystemLabel->set_text(gettext("File system:")); - quoteuserFilesFrameLabel->set_text(gettext("Files")); - quoteuserFilesCurrentlyLabel->set_text(gettext("Currently using: ")); - quoteuserFilesSoftLimitLabel->set_text(gettext("Soft limit")); - quoteFilesHardLimitLabel1->set_text(gettext("Hard limit")); - quoteuserFilesHarLimitLabel->set_text(gettext("files")); - quoteuserFilesSoftLimitlabel->set_text(gettext("files")); - quotegroupFileSystemLabel->set_text(gettext("File system:")); + aboutWindows->set_website_label(_("Project Home Page")); + generalTabLabel->set_text(_("General settings")); + GroupsTabLabel->set_text(_("Groups")); + UsersTabLabel->set_text(_("Users")); + generalDeviceLabel->set_text(_("Device:")); + generalFileSystemLabel->set_text(_("File system:")); + generalGroupsFrameLabel->set_text(_("quotas for groups")); + generalGroupsEnableCheck->set_label(_("Enable")); + generalUsersEnableCheck->set_label(_("Enable")); + generalUsersFrameLabel->set_label(_("quotas for users")); + generalGroupsSizeLabel->set_text(_("Excess size delay period")); + generalGroupsFilesLabel->set_text(_("Excess files delay period")); + generalUsersSizeLabel->set_text(_("Excess size delay period")); + generalUsersFilesLabel->set_text(_("Excess files delay period")); + generalGroupsSizeWeeksLabel->set_text(_("weeks")); + generalGroupsFilesWeeksLabel->set_text(_("weeks")); + generalUsersSizeWeeksLabel->set_text(_("weeks")); + generalUsersFilesWeeksLabel->set_text(_("weeks")); + generalGroupsSizeDaysLabel->set_text(_("days")); + generalGroupsFilesDaysLabel->set_text(_("days")); + generalUsersSizeDaysLabel->set_text(_("days")); + generalUsersFilesDaysLabel->set_text(_("days")); + generalGroupsSizeHoursLabel->set_text(_("hours")); + generalGroupsFilesHoursLabel->set_text(_("hours")); + generalUsersSizeHoursLabel->set_text(_("hours")); + generalUsersFilesHoursLabel->set_text(_("hours")); + generalGroupsSizeMinutesLabel->set_text(_("minutes")); + generalGroupsFilesMinutesLabel->set_text(_("minutes")); + generalUsersSizeMinutesLabel->set_text(_("minutes")); + generalUsersFilesMinutesLabel->set_text(_("minutes")); + groupsFileSystemLabel->set_text(_("File system:")); + usersFileSystemLabel->set_text(_("File system:")); + usersFiltersButton->set_label(_("Filters")); + groupsFiltersButton->set_label(_("Filters")); + lblLoad->set_text(_("Load")); + lblSave->set_text(_("Save")); + groupsDeviceLabel->set_label(_("Device:")); + usersDeviceLabel->set_label(_("Device:")); + headLabel->set_label(_("Configuration of disk quotas parameters for system groups and users")); + filtersNameFilterCheckbox->set_label(_("Name")); + filtersQuotasFilterCheckbox->set_label(_("Quotas")); + filtersSizeFilterCheckbox->set_label(_("Size")); + filtersSoftSizeFilterCheckbox->set_label(_("Soft limit (size)")); + filtersHardSizeFilterCheckbox->set_label(_("Hard limit (size)")); + filtersHardSizeDelayFilterCheckbox->set_label(_("Hard limit (size) delay")); + filtersHardSizeActivationFilterCheckbox->set_label(_("Hard limit (size) activation time")); + filtersFilesFilterCheckbox->set_label(_("Files")); + filtersSoftFilesFilterCheckbox->set_label(_("Soft limit (files)")); + filtersHardFilesFilterCheckbox->set_label(_("Hard limit (files)")); + filtersHardFilesDelayFilterCheckbox->set_label(_("Hard limit (files) delay")); + filtersHardFilesActivationFilterCheckbox->set_label(_("Hard limit (file) activation time")); + quotegroupDeviceLabel->set_text(_("Device:")); + quotegroupDiskQuotasLabel->set_text(_("Disk quotas for this device:")); + quotegroupGroupQuotasLabel->set_text(_("Group quotas for this device:")); + quotegroupSizeFrameLabel->set_text(_("Size")); + quotegroupFilesFrameLabel->set_text(_("Files")); + quotegroupSizeCurrentlyLabel->set_text(_("Currently using:")); + quotegroupSizeSoftLimitLabel->set_text(_("Soft limit")); + quoteSizeHardLimitLabel->set_text(_("Hard limit")); + quoteFilesHardLimitLabel->set_text(_("Hard limit")); + quotegroupFilesSoftLimitLabel->set_text(_("Soft limit")); + quotegroupFilesCurrentlyLabel->set_text(_("Currently using:")); + quoteuserDiskQuotasLabel->set_text(_("Disk quotas for this device:")); + quoteuserDeviceLabel->set_text(_("Device:")); + quoteuserGroupQuotasLabel->set_text(_("User quotas for this device: ")); + quoteuserSizeFrameLabel->set_text(_("Size")); + quoteuserSizeCurrentlyLabel->set_text(_("Currently using:")); + quoteuserSizeSoftLimitLabel->set_text(_("Soft limit")); + quoteuserSizeHardLimitLabel1->set_text(_("Hard limit")); + quoteuserFileSystemLabel->set_text(_("File system:")); + quoteuserFilesFrameLabel->set_text(_("Files")); + quoteuserFilesCurrentlyLabel->set_text(_("Currently using: ")); + quoteuserFilesSoftLimitLabel->set_text(_("Soft limit")); + quoteFilesHardLimitLabel1->set_text(_("Hard limit")); + quoteuserFilesHarLimitLabel->set_text(_("files")); + quoteuserFilesSoftLimitlabel->set_text(_("files")); + quotegroupFileSystemLabel->set_text(_("File system:")); } void MainWindow::add_CSS() { @@ -311,18 +315,18 @@ void MainWindow::groupsFilters_show() { void MainWindow::view_add_columns(Gtk::TreeView &treeView) { // TODO: // Не готово - treeView.append_column(gettext("Name"), m_columns.name); - treeView.append_column_editable(gettext("Quotas"), m_columns.quotas); - treeView.append_column(gettext("Size"), m_columns.size); - treeView.append_column(gettext("Soft limit\n(size)"), m_columns.soft_limit_size); - treeView.append_column(gettext("Hard limit\n(size)"), m_columns.hard_limit_size); - treeView.append_column(gettext("Hard limit\n(size) delay"), m_columns.hard_limit_size_delay); - treeView.append_column(gettext("Hard limit\n(Size) activation\ntime"), m_columns.hard_limit_activ_time); - treeView.append_column(gettext("Files"), m_columns.files); - treeView.append_column(gettext("Soft limit\n(files)"), m_columns.soft_limit_files); - treeView.append_column(gettext("Hard limit\n(files)"), m_columns.hard_limit_files); - treeView.append_column(gettext("Hard limit\n(files) delay"), m_columns.hard_limit_delay); - treeView.append_column(gettext("Hard limit\n(files) activation\ntime"), m_columns.hard_limit_files_activ_time); + treeView.append_column(_("Name"), m_columns.name); + treeView.append_column_editable(_("Quotas"), m_columns.quotas); + treeView.append_column(_("Size"), m_columns.size); + treeView.append_column(_("Soft limit\n(size)"), m_columns.soft_limit_size); + treeView.append_column(_("Hard limit\n(size)"), m_columns.hard_limit_size); + treeView.append_column(_("Hard limit\n(size) delay"), m_columns.hard_limit_size_delay); + treeView.append_column(_("Hard limit\n(Size) activation\ntime"), m_columns.hard_limit_activ_time); + treeView.append_column(_("Files"), m_columns.files); + treeView.append_column(_("Soft limit\n(files)"), m_columns.soft_limit_files); + treeView.append_column(_("Hard limit\n(files)"), m_columns.hard_limit_files); + treeView.append_column(_("Hard limit\n(files) delay"), m_columns.hard_limit_delay); + treeView.append_column(_("Hard limit\n(files) activation\ntime"), m_columns.hard_limit_files_activ_time); } void MainWindow::info_status_app(string stule) { @@ -343,7 +347,7 @@ SettingsPlug::SettingsPlug(::Window p_socketID, Glib::RefPtr build } void help() { - string version = string(gettext("ubl-settings-quotas version: ")) + version_application + "\n"; + string version = string(_("ubl-settings-quotas version: ")) + version_application + "\n"; cout << version.c_str(); string help; help = "GTK settings quotas. for UBLinux\n\n" diff --git a/source/ubl-settings-quotas.h b/source/ubl-settings-quotas.h index bdafc06..a26f830 100644 --- a/source/ubl-settings-quotas.h +++ b/source/ubl-settings-quotas.h @@ -172,6 +172,7 @@ class MainWindow : public Gtk::ApplicationWindow { void event(); void info_status_app(string stule); void groupsFilters_show(); + void init_tree_view(); void view_add_columns(Gtk::TreeView &treeView); diff --git a/source/util.h b/source/util.h index 6c569e5..fa83ff8 100644 --- a/source/util.h +++ b/source/util.h @@ -23,6 +23,11 @@ using namespace std; +template +struct Result{ + Type response; + int error; +}; struct Passwd { string user; diff --git a/ubl-settings-quotas.pot b/ubl-settings-quotas.pot index 56c39b0..2a9b1b5 100644 --- a/ubl-settings-quotas.pot +++ b/ubl-settings-quotas.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-04-04 17:17+0600\n" +"POT-Creation-Date: 2023-04-05 09:19+0600\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -17,255 +17,309 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -#: source/ubl-settings-quotas.cc:121 source/ubl-settings-quotas.cc:118 +#: source/ubl-settings-quotas.cc:124 source/ubl-settings-quotas.cc:121 +#: source/ubl-settings-quotas.cc:118 msgid "Configuration of disk quotas parameters for system groups and users" msgstr "" -#: source/ubl-settings-quotas.cc:78 source/ubl-settings-quotas.cc:75 -#: source/ubl-settings-quotas.cc:74 +#: source/ubl-settings-quotas.cc:81 source/ubl-settings-quotas.cc:78 +#: source/ubl-settings-quotas.cc:75 source/ubl-settings-quotas.cc:74 msgid "Copyright © UBSoft LLC, 2022 - " msgstr "" -#: source/ubl-settings-quotas.cc:139 source/ubl-settings-quotas.cc:144 -#: source/ubl-settings-quotas.cc:149 +#: source/ubl-settings-quotas.cc:142 source/ubl-settings-quotas.cc:147 +#: source/ubl-settings-quotas.cc:152 source/ubl-settings-quotas.cc:139 +#: source/ubl-settings-quotas.cc:144 source/ubl-settings-quotas.cc:149 msgid "Currently using:" msgstr "" -#: source/ubl-settings-quotas.cc:154 +#: source/ubl-settings-quotas.cc:157 source/ubl-settings-quotas.cc:154 msgid "Currently using: " msgstr "" -#: source/ubl-settings-quotas.cc:80 source/ubl-settings-quotas.cc:77 -#: source/ubl-settings-quotas.cc:76 +#: source/ubl-settings-quotas.cc:83 source/ubl-settings-quotas.cc:80 +#: source/ubl-settings-quotas.cc:77 source/ubl-settings-quotas.cc:76 msgid "Date and Time" msgstr "" -#: source/ubl-settings-quotas.cc:87 source/ubl-settings-quotas.cc:119 -#: source/ubl-settings-quotas.cc:120 source/ubl-settings-quotas.cc:134 -#: source/ubl-settings-quotas.cc:146 source/ubl-settings-quotas.cc:84 -#: source/ubl-settings-quotas.cc:116 source/ubl-settings-quotas.cc:117 -#: source/ubl-settings-quotas.cc:83 +#: source/ubl-settings-quotas.cc:90 source/ubl-settings-quotas.cc:122 +#: source/ubl-settings-quotas.cc:123 source/ubl-settings-quotas.cc:137 +#: source/ubl-settings-quotas.cc:149 source/ubl-settings-quotas.cc:87 +#: source/ubl-settings-quotas.cc:119 source/ubl-settings-quotas.cc:120 +#: source/ubl-settings-quotas.cc:134 source/ubl-settings-quotas.cc:146 +#: source/ubl-settings-quotas.cc:84 source/ubl-settings-quotas.cc:116 +#: source/ubl-settings-quotas.cc:117 source/ubl-settings-quotas.cc:83 msgid "Device:" msgstr "" +#: source/ubl-settings-quotas.cc:138 source/ubl-settings-quotas.cc:148 #: source/ubl-settings-quotas.cc:135 source/ubl-settings-quotas.cc:145 msgid "Disk quotas for this device:" msgstr "" +#: source/ubl-settings-quotas.cc:93 source/ubl-settings-quotas.cc:94 #: source/ubl-settings-quotas.cc:90 source/ubl-settings-quotas.cc:91 #: source/ubl-settings-quotas.cc:87 source/ubl-settings-quotas.cc:88 #: source/ubl-settings-quotas.cc:86 msgid "Enable" msgstr "" +#: source/ubl-settings-quotas.cc:97 source/ubl-settings-quotas.cc:99 #: source/ubl-settings-quotas.cc:94 source/ubl-settings-quotas.cc:96 #: source/ubl-settings-quotas.cc:91 source/ubl-settings-quotas.cc:93 #: source/ubl-settings-quotas.cc:90 source/ubl-settings-quotas.cc:92 msgid "Excess files delay period" msgstr "" +#: source/ubl-settings-quotas.cc:96 source/ubl-settings-quotas.cc:98 #: source/ubl-settings-quotas.cc:93 source/ubl-settings-quotas.cc:95 #: source/ubl-settings-quotas.cc:90 source/ubl-settings-quotas.cc:92 #: source/ubl-settings-quotas.cc:89 source/ubl-settings-quotas.cc:91 msgid "Excess size delay period" msgstr "" -#: source/ubl-settings-quotas.cc:88 source/ubl-settings-quotas.cc:113 -#: source/ubl-settings-quotas.cc:114 source/ubl-settings-quotas.cc:152 -#: source/ubl-settings-quotas.cc:85 source/ubl-settings-quotas.cc:110 -#: source/ubl-settings-quotas.cc:111 source/ubl-settings-quotas.cc:84 +#: source/ubl-settings-quotas.cc:91 source/ubl-settings-quotas.cc:116 +#: source/ubl-settings-quotas.cc:117 source/ubl-settings-quotas.cc:155 +#: source/ubl-settings-quotas.cc:162 source/ubl-settings-quotas.cc:88 +#: source/ubl-settings-quotas.cc:113 source/ubl-settings-quotas.cc:114 +#: source/ubl-settings-quotas.cc:152 source/ubl-settings-quotas.cc:85 +#: source/ubl-settings-quotas.cc:110 source/ubl-settings-quotas.cc:111 +#: source/ubl-settings-quotas.cc:84 msgid "File system:" msgstr "" +#: source/ubl-settings-quotas.cc:132 source/ubl-settings-quotas.cc:141 +#: source/ubl-settings-quotas.cc:156 source/ubl-settings-quotas.cc:325 #: source/ubl-settings-quotas.cc:129 source/ubl-settings-quotas.cc:138 #: source/ubl-settings-quotas.cc:153 source/ubl-settings-quotas.cc:317 #: source/ubl-settings-quotas.cc:264 source/ubl-settings-quotas.cc:126 msgid "Files" msgstr "" +#: source/ubl-settings-quotas.cc:118 source/ubl-settings-quotas.cc:119 #: source/ubl-settings-quotas.cc:115 source/ubl-settings-quotas.cc:116 #: source/ubl-settings-quotas.cc:112 source/ubl-settings-quotas.cc:113 msgid "Filters" msgstr "" -#: source/ubl-settings-quotas.cc:84 source/ubl-settings-quotas.cc:81 -#: source/ubl-settings-quotas.cc:80 +msgid "" +"GTK settings quotas. for UBLinux\n" +"\n" +"Usage: ubl-settings-quotas [OPTIONS...]\n" +"Options:\n" +" -h, --help\t Show this help\n" +" -V, --version\t Show package version\n" +msgstr "" + +#: source/ubl-settings-quotas.cc:87 source/ubl-settings-quotas.cc:84 +#: source/ubl-settings-quotas.cc:81 source/ubl-settings-quotas.cc:80 msgid "General settings" msgstr "" -#: source/ubl-settings-quotas.cc:136 +#: source/ubl-settings-quotas.cc:139 source/ubl-settings-quotas.cc:136 msgid "Group quotas for this device:" msgstr "" -#: source/ubl-settings-quotas.cc:85 source/ubl-settings-quotas.cc:82 -#: source/ubl-settings-quotas.cc:81 +#: source/ubl-settings-quotas.cc:88 source/ubl-settings-quotas.cc:85 +#: source/ubl-settings-quotas.cc:82 source/ubl-settings-quotas.cc:81 msgid "Groups" msgstr "" +#: source/ubl-settings-quotas.cc:144 source/ubl-settings-quotas.cc:145 +#: source/ubl-settings-quotas.cc:154 source/ubl-settings-quotas.cc:159 #: source/ubl-settings-quotas.cc:141 source/ubl-settings-quotas.cc:142 #: source/ubl-settings-quotas.cc:151 source/ubl-settings-quotas.cc:156 msgid "Hard limit" msgstr "" -#: source/ubl-settings-quotas.cc:316 source/ubl-settings-quotas.cc:263 +#: source/ubl-settings-quotas.cc:324 source/ubl-settings-quotas.cc:316 +#: source/ubl-settings-quotas.cc:263 msgid "" "Hard limit\n" "(Size) activation\n" "time" msgstr "" -#: source/ubl-settings-quotas.cc:319 source/ubl-settings-quotas.cc:266 +#: source/ubl-settings-quotas.cc:327 source/ubl-settings-quotas.cc:319 +#: source/ubl-settings-quotas.cc:266 msgid "" "Hard limit\n" "(files)" msgstr "" -#: source/ubl-settings-quotas.cc:321 source/ubl-settings-quotas.cc:268 +#: source/ubl-settings-quotas.cc:329 source/ubl-settings-quotas.cc:321 +#: source/ubl-settings-quotas.cc:268 msgid "" "Hard limit\n" "(files) activation\n" "time" msgstr "" -#: source/ubl-settings-quotas.cc:320 source/ubl-settings-quotas.cc:267 +#: source/ubl-settings-quotas.cc:328 source/ubl-settings-quotas.cc:320 +#: source/ubl-settings-quotas.cc:267 msgid "" "Hard limit\n" "(files) delay" msgstr "" -#: source/ubl-settings-quotas.cc:314 source/ubl-settings-quotas.cc:261 +#: source/ubl-settings-quotas.cc:322 source/ubl-settings-quotas.cc:314 +#: source/ubl-settings-quotas.cc:261 msgid "" "Hard limit\n" "(size)" msgstr "" -#: source/ubl-settings-quotas.cc:315 source/ubl-settings-quotas.cc:262 +#: source/ubl-settings-quotas.cc:323 source/ubl-settings-quotas.cc:315 +#: source/ubl-settings-quotas.cc:262 msgid "" "Hard limit\n" "(size) delay" msgstr "" -#: source/ubl-settings-quotas.cc:133 source/ubl-settings-quotas.cc:130 +#: source/ubl-settings-quotas.cc:136 source/ubl-settings-quotas.cc:133 +#: source/ubl-settings-quotas.cc:130 msgid "Hard limit (file) activation time" msgstr "" -#: source/ubl-settings-quotas.cc:131 source/ubl-settings-quotas.cc:128 +#: source/ubl-settings-quotas.cc:134 source/ubl-settings-quotas.cc:131 +#: source/ubl-settings-quotas.cc:128 msgid "Hard limit (files)" msgstr "" -#: source/ubl-settings-quotas.cc:132 source/ubl-settings-quotas.cc:129 +#: source/ubl-settings-quotas.cc:135 source/ubl-settings-quotas.cc:132 +#: source/ubl-settings-quotas.cc:129 msgid "Hard limit (files) delay" msgstr "" -#: source/ubl-settings-quotas.cc:126 source/ubl-settings-quotas.cc:123 +#: source/ubl-settings-quotas.cc:129 source/ubl-settings-quotas.cc:126 +#: source/ubl-settings-quotas.cc:123 msgid "Hard limit (size)" msgstr "" -#: source/ubl-settings-quotas.cc:128 source/ubl-settings-quotas.cc:125 +#: source/ubl-settings-quotas.cc:131 source/ubl-settings-quotas.cc:128 +#: source/ubl-settings-quotas.cc:125 msgid "Hard limit (size) activation time" msgstr "" -#: source/ubl-settings-quotas.cc:127 source/ubl-settings-quotas.cc:124 +#: source/ubl-settings-quotas.cc:130 source/ubl-settings-quotas.cc:127 +#: source/ubl-settings-quotas.cc:124 msgid "Hard limit (size) delay" msgstr "" -#: source/ubl-settings-quotas.cc:117 source/ubl-settings-quotas.cc:114 -#: source/ubl-settings-quotas.cc:109 +#: source/ubl-settings-quotas.cc:120 source/ubl-settings-quotas.cc:117 +#: source/ubl-settings-quotas.cc:114 source/ubl-settings-quotas.cc:109 msgid "Load" msgstr "" +#: source/ubl-settings-quotas.cc:125 source/ubl-settings-quotas.cc:318 #: source/ubl-settings-quotas.cc:122 source/ubl-settings-quotas.cc:310 #: source/ubl-settings-quotas.cc:119 msgid "Name" msgstr "" -#: source/ubl-settings-quotas.cc:83 source/ubl-settings-quotas.cc:80 -#: source/ubl-settings-quotas.cc:79 +#: source/ubl-settings-quotas.cc:86 source/ubl-settings-quotas.cc:83 +#: source/ubl-settings-quotas.cc:80 source/ubl-settings-quotas.cc:79 msgid "Project Home Page" msgstr "" +#: source/ubl-settings-quotas.cc:126 source/ubl-settings-quotas.cc:319 #: source/ubl-settings-quotas.cc:123 source/ubl-settings-quotas.cc:311 #: source/ubl-settings-quotas.cc:258 source/ubl-settings-quotas.cc:120 msgid "Quotas" msgstr "" -#: source/ubl-settings-quotas.cc:118 source/ubl-settings-quotas.cc:115 -#: source/ubl-settings-quotas.cc:110 +#: source/ubl-settings-quotas.cc:121 source/ubl-settings-quotas.cc:118 +#: source/ubl-settings-quotas.cc:115 source/ubl-settings-quotas.cc:110 msgid "Save" msgstr "" +#: source/ubl-settings-quotas.cc:127 source/ubl-settings-quotas.cc:140 +#: source/ubl-settings-quotas.cc:151 source/ubl-settings-quotas.cc:320 #: source/ubl-settings-quotas.cc:124 source/ubl-settings-quotas.cc:137 #: source/ubl-settings-quotas.cc:148 source/ubl-settings-quotas.cc:312 #: source/ubl-settings-quotas.cc:259 source/ubl-settings-quotas.cc:121 msgid "Size" msgstr "" -#: source/ubl-settings-quotas.cc:140 source/ubl-settings-quotas.cc:143 -#: source/ubl-settings-quotas.cc:150 source/ubl-settings-quotas.cc:155 +#: source/ubl-settings-quotas.cc:143 source/ubl-settings-quotas.cc:146 +#: source/ubl-settings-quotas.cc:153 source/ubl-settings-quotas.cc:158 +#: source/ubl-settings-quotas.cc:140 source/ubl-settings-quotas.cc:150 +#: source/ubl-settings-quotas.cc:155 msgid "Soft limit" msgstr "" -#: source/ubl-settings-quotas.cc:318 source/ubl-settings-quotas.cc:265 +#: source/ubl-settings-quotas.cc:326 source/ubl-settings-quotas.cc:318 +#: source/ubl-settings-quotas.cc:265 msgid "" "Soft limit\n" "(files)" msgstr "" -#: source/ubl-settings-quotas.cc:313 source/ubl-settings-quotas.cc:260 +#: source/ubl-settings-quotas.cc:321 source/ubl-settings-quotas.cc:313 +#: source/ubl-settings-quotas.cc:260 msgid "" "Soft limit\n" "(size)" msgstr "" -#: source/ubl-settings-quotas.cc:130 source/ubl-settings-quotas.cc:127 +#: source/ubl-settings-quotas.cc:133 source/ubl-settings-quotas.cc:130 +#: source/ubl-settings-quotas.cc:127 msgid "Soft limit (files)" msgstr "" -#: source/ubl-settings-quotas.cc:125 source/ubl-settings-quotas.cc:122 +#: source/ubl-settings-quotas.cc:128 source/ubl-settings-quotas.cc:125 +#: source/ubl-settings-quotas.cc:122 msgid "Soft limit (size)" msgstr "" -#: source/ubl-settings-quotas.cc:70 source/ubl-settings-quotas.cc:67 -#: source/ubl-settings-quotas.cc:66 +#: source/ubl-settings-quotas.cc:68 source/ubl-settings-quotas.cc:70 +#: source/ubl-settings-quotas.cc:67 source/ubl-settings-quotas.cc:66 msgid "The program must be run as root" msgstr "" -#: source/ubl-settings-quotas.cc:147 +#: source/ubl-settings-quotas.cc:150 source/ubl-settings-quotas.cc:147 msgid "User quotas for this device: " msgstr "" -#: source/ubl-settings-quotas.cc:86 source/ubl-settings-quotas.cc:83 -#: source/ubl-settings-quotas.cc:82 +#: source/ubl-settings-quotas.cc:89 source/ubl-settings-quotas.cc:86 +#: source/ubl-settings-quotas.cc:83 source/ubl-settings-quotas.cc:82 msgid "Users" msgstr "" +#: source/ubl-settings-quotas.cc:104 source/ubl-settings-quotas.cc:105 +#: source/ubl-settings-quotas.cc:106 source/ubl-settings-quotas.cc:107 #: source/ubl-settings-quotas.cc:101 source/ubl-settings-quotas.cc:102 -#: source/ubl-settings-quotas.cc:103 source/ubl-settings-quotas.cc:104 -#: source/ubl-settings-quotas.cc:98 source/ubl-settings-quotas.cc:99 -#: source/ubl-settings-quotas.cc:100 source/ubl-settings-quotas.cc:97 +#: source/ubl-settings-quotas.cc:103 source/ubl-settings-quotas.cc:98 +#: source/ubl-settings-quotas.cc:99 source/ubl-settings-quotas.cc:100 +#: source/ubl-settings-quotas.cc:97 msgid "days" msgstr "" +#: source/ubl-settings-quotas.cc:160 source/ubl-settings-quotas.cc:161 #: source/ubl-settings-quotas.cc:157 source/ubl-settings-quotas.cc:158 msgid "files" msgstr "" +#: source/ubl-settings-quotas.cc:108 source/ubl-settings-quotas.cc:109 +#: source/ubl-settings-quotas.cc:110 source/ubl-settings-quotas.cc:111 #: source/ubl-settings-quotas.cc:105 source/ubl-settings-quotas.cc:106 -#: source/ubl-settings-quotas.cc:107 source/ubl-settings-quotas.cc:108 -#: source/ubl-settings-quotas.cc:102 source/ubl-settings-quotas.cc:103 -#: source/ubl-settings-quotas.cc:104 source/ubl-settings-quotas.cc:101 +#: source/ubl-settings-quotas.cc:107 source/ubl-settings-quotas.cc:102 +#: source/ubl-settings-quotas.cc:103 source/ubl-settings-quotas.cc:104 +#: source/ubl-settings-quotas.cc:101 msgid "hours" msgstr "" -#: source/ubl-settings-quotas.cc:81 source/ubl-settings-quotas.cc:78 -#: source/ubl-settings-quotas.cc:77 +#: source/ubl-settings-quotas.cc:84 source/ubl-settings-quotas.cc:81 +#: source/ubl-settings-quotas.cc:78 source/ubl-settings-quotas.cc:77 msgid "https://wiki.ublinux.com" msgstr "" +#: source/ubl-settings-quotas.cc:112 source/ubl-settings-quotas.cc:113 +#: source/ubl-settings-quotas.cc:114 source/ubl-settings-quotas.cc:115 #: source/ubl-settings-quotas.cc:109 source/ubl-settings-quotas.cc:110 -#: source/ubl-settings-quotas.cc:111 source/ubl-settings-quotas.cc:112 -#: source/ubl-settings-quotas.cc:106 source/ubl-settings-quotas.cc:107 -#: source/ubl-settings-quotas.cc:108 source/ubl-settings-quotas.cc:105 +#: source/ubl-settings-quotas.cc:111 source/ubl-settings-quotas.cc:106 +#: source/ubl-settings-quotas.cc:107 source/ubl-settings-quotas.cc:108 +#: source/ubl-settings-quotas.cc:105 msgid "minutes" msgstr "" @@ -273,32 +327,27 @@ msgstr "" msgid "name" msgstr "" -#: source/ubl-settings-quotas.cc:89 source/ubl-settings-quotas.cc:86 -#: source/ubl-settings-quotas.cc:85 +#: source/ubl-settings-quotas.cc:92 source/ubl-settings-quotas.cc:89 +#: source/ubl-settings-quotas.cc:86 source/ubl-settings-quotas.cc:85 msgid "quotas for groups" msgstr "" -#: source/ubl-settings-quotas.cc:92 source/ubl-settings-quotas.cc:89 -#: source/ubl-settings-quotas.cc:88 +#: source/ubl-settings-quotas.cc:95 source/ubl-settings-quotas.cc:92 +#: source/ubl-settings-quotas.cc:89 source/ubl-settings-quotas.cc:88 msgid "quotas for users" msgstr "" -#: source/ubl-settings-quotas.cc:371 source/ubl-settings-quotas.cc:318 -#: source/ubl-settings-quotas.cc:267 source/ubl-settings-quotas.cc:213 +#: source/ubl-settings-quotas.cc:350 source/ubl-settings-quotas.cc:371 +#: source/ubl-settings-quotas.cc:318 source/ubl-settings-quotas.cc:267 +#: source/ubl-settings-quotas.cc:213 msgid "ubl-settings-quotas version: " msgstr "" +#: source/ubl-settings-quotas.cc:100 source/ubl-settings-quotas.cc:101 +#: source/ubl-settings-quotas.cc:102 source/ubl-settings-quotas.cc:103 #: source/ubl-settings-quotas.cc:97 source/ubl-settings-quotas.cc:98 -#: source/ubl-settings-quotas.cc:99 source/ubl-settings-quotas.cc:100 -#: source/ubl-settings-quotas.cc:94 source/ubl-settings-quotas.cc:95 -#: source/ubl-settings-quotas.cc:96 source/ubl-settings-quotas.cc:93 +#: source/ubl-settings-quotas.cc:99 source/ubl-settings-quotas.cc:94 +#: source/ubl-settings-quotas.cc:95 source/ubl-settings-quotas.cc:96 +#: source/ubl-settings-quotas.cc:93 msgid "weeks" msgstr "" - -msgid "" -"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" -msgstr "" \ No newline at end of file diff --git a/ubl-settings-quotas_ru.po b/ubl-settings-quotas_ru.po index 05795b7..e2975c4 100644 --- a/ubl-settings-quotas_ru.po +++ b/ubl-settings-quotas_ru.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: ublexec 1.0\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-04-04 17:17+0600\n" +"POT-Creation-Date: 2023-04-05 09:18+0600\n" "PO-Revision-Date: 2023-01-01 00:00+0600\n" "Last-Translator: UBLinux Team \n" "Language-Team: Russian - UBLinux Team \n" @@ -17,98 +17,130 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -#: source/ubl-settings-quotas.cc:121 source/ubl-settings-quotas.cc:118 +#: source/ubl-settings-quotas.cc:124 source/ubl-settings-quotas.cc:121 +#: source/ubl-settings-quotas.cc:118 msgid "Configuration of disk quotas parameters for system groups and users" msgstr "Настройка параметров дисковых квот для системных групп и пользователей" -#: source/ubl-settings-quotas.cc:78 source/ubl-settings-quotas.cc:75 -#: source/ubl-settings-quotas.cc:74 +#: source/ubl-settings-quotas.cc:81 source/ubl-settings-quotas.cc:78 +#: source/ubl-settings-quotas.cc:75 source/ubl-settings-quotas.cc:74 msgid "Copyright © UBSoft LLC, 2022 - " msgstr "" -#: source/ubl-settings-quotas.cc:139 source/ubl-settings-quotas.cc:144 -#: source/ubl-settings-quotas.cc:149 +#: source/ubl-settings-quotas.cc:142 source/ubl-settings-quotas.cc:147 +#: source/ubl-settings-quotas.cc:152 source/ubl-settings-quotas.cc:139 +#: source/ubl-settings-quotas.cc:144 source/ubl-settings-quotas.cc:149 msgid "Currently using:" msgstr "В настоящее время используется:" -#: source/ubl-settings-quotas.cc:154 +#: source/ubl-settings-quotas.cc:157 source/ubl-settings-quotas.cc:154 msgid "Currently using: " msgstr "В настоящее время используется: " -#: source/ubl-settings-quotas.cc:80 source/ubl-settings-quotas.cc:77 -#: source/ubl-settings-quotas.cc:76 +#: source/ubl-settings-quotas.cc:83 source/ubl-settings-quotas.cc:80 +#: source/ubl-settings-quotas.cc:77 source/ubl-settings-quotas.cc:76 msgid "Date and Time" msgstr "Дата и время" -#: source/ubl-settings-quotas.cc:87 source/ubl-settings-quotas.cc:119 -#: source/ubl-settings-quotas.cc:120 source/ubl-settings-quotas.cc:134 -#: source/ubl-settings-quotas.cc:146 source/ubl-settings-quotas.cc:84 -#: source/ubl-settings-quotas.cc:116 source/ubl-settings-quotas.cc:117 -#: source/ubl-settings-quotas.cc:83 +#: source/ubl-settings-quotas.cc:90 source/ubl-settings-quotas.cc:122 +#: source/ubl-settings-quotas.cc:123 source/ubl-settings-quotas.cc:137 +#: source/ubl-settings-quotas.cc:149 source/ubl-settings-quotas.cc:87 +#: source/ubl-settings-quotas.cc:119 source/ubl-settings-quotas.cc:120 +#: source/ubl-settings-quotas.cc:134 source/ubl-settings-quotas.cc:146 +#: source/ubl-settings-quotas.cc:84 source/ubl-settings-quotas.cc:116 +#: source/ubl-settings-quotas.cc:117 source/ubl-settings-quotas.cc:83 msgid "Device:" msgstr "Устройство:" +#: source/ubl-settings-quotas.cc:138 source/ubl-settings-quotas.cc:148 #: source/ubl-settings-quotas.cc:135 source/ubl-settings-quotas.cc:145 msgid "Disk quotas for this device:" msgstr "Дисковые квоты для этого устройства:" +#: source/ubl-settings-quotas.cc:93 source/ubl-settings-quotas.cc:94 #: source/ubl-settings-quotas.cc:90 source/ubl-settings-quotas.cc:91 #: source/ubl-settings-quotas.cc:87 source/ubl-settings-quotas.cc:88 #: source/ubl-settings-quotas.cc:86 msgid "Enable" msgstr "Включить" +#: source/ubl-settings-quotas.cc:97 source/ubl-settings-quotas.cc:99 #: source/ubl-settings-quotas.cc:94 source/ubl-settings-quotas.cc:96 #: source/ubl-settings-quotas.cc:91 source/ubl-settings-quotas.cc:93 #: source/ubl-settings-quotas.cc:90 source/ubl-settings-quotas.cc:92 msgid "Excess files delay period" msgstr "Превышение периода задержки файлов" +#: source/ubl-settings-quotas.cc:96 source/ubl-settings-quotas.cc:98 #: source/ubl-settings-quotas.cc:93 source/ubl-settings-quotas.cc:95 #: source/ubl-settings-quotas.cc:90 source/ubl-settings-quotas.cc:92 #: source/ubl-settings-quotas.cc:89 source/ubl-settings-quotas.cc:91 msgid "Excess size delay period" msgstr "Период задержки превышения размера" -#: source/ubl-settings-quotas.cc:88 source/ubl-settings-quotas.cc:113 -#: source/ubl-settings-quotas.cc:114 source/ubl-settings-quotas.cc:152 -#: source/ubl-settings-quotas.cc:85 source/ubl-settings-quotas.cc:110 -#: source/ubl-settings-quotas.cc:111 source/ubl-settings-quotas.cc:84 +#: source/ubl-settings-quotas.cc:91 source/ubl-settings-quotas.cc:116 +#: source/ubl-settings-quotas.cc:117 source/ubl-settings-quotas.cc:155 +#: source/ubl-settings-quotas.cc:162 source/ubl-settings-quotas.cc:88 +#: source/ubl-settings-quotas.cc:113 source/ubl-settings-quotas.cc:114 +#: source/ubl-settings-quotas.cc:152 source/ubl-settings-quotas.cc:85 +#: source/ubl-settings-quotas.cc:110 source/ubl-settings-quotas.cc:111 +#: source/ubl-settings-quotas.cc:84 msgid "File system:" msgstr "Файловая система:" +#: source/ubl-settings-quotas.cc:132 source/ubl-settings-quotas.cc:141 +#: source/ubl-settings-quotas.cc:156 source/ubl-settings-quotas.cc:325 #: source/ubl-settings-quotas.cc:129 source/ubl-settings-quotas.cc:138 #: source/ubl-settings-quotas.cc:153 source/ubl-settings-quotas.cc:317 #: source/ubl-settings-quotas.cc:264 source/ubl-settings-quotas.cc:126 msgid "Files" msgstr "Файлы" +#: source/ubl-settings-quotas.cc:118 source/ubl-settings-quotas.cc:119 #: source/ubl-settings-quotas.cc:115 source/ubl-settings-quotas.cc:116 #: source/ubl-settings-quotas.cc:112 source/ubl-settings-quotas.cc:113 msgid "Filters" msgstr "Фильтры" -#: source/ubl-settings-quotas.cc:84 source/ubl-settings-quotas.cc:81 -#: source/ubl-settings-quotas.cc:80 +msgid "" +"GTK settings quotas. for UBLinux\n" +"\n" +"Usage: ubl-settings-quotas [OPTIONS...]\n" +"Options:\n" +" -h, --help\t Show this help\n" +" -V, --version\t Show package version\n" +msgstr "" +"GTK-утилита настройки квот для UBLinux\n" +"\n" +"Использование: ubl-settings-quotas [Параметры приложения...]\n" +"Параметры приложения:\n" +" -h, --help\t Показать параметры справки\n" +" -V, --version\t Показать версию пакета\n" + +#: source/ubl-settings-quotas.cc:87 source/ubl-settings-quotas.cc:84 +#: source/ubl-settings-quotas.cc:81 source/ubl-settings-quotas.cc:80 msgid "General settings" msgstr "Общие настройки" -#: source/ubl-settings-quotas.cc:136 +#: source/ubl-settings-quotas.cc:139 source/ubl-settings-quotas.cc:136 msgid "Group quotas for this device:" msgstr "Групповые квоты для этого устройства:" -#: source/ubl-settings-quotas.cc:85 source/ubl-settings-quotas.cc:82 -#: source/ubl-settings-quotas.cc:81 +#: source/ubl-settings-quotas.cc:88 source/ubl-settings-quotas.cc:85 +#: source/ubl-settings-quotas.cc:82 source/ubl-settings-quotas.cc:81 msgid "Groups" msgstr "Группы" +#: source/ubl-settings-quotas.cc:144 source/ubl-settings-quotas.cc:145 +#: source/ubl-settings-quotas.cc:154 source/ubl-settings-quotas.cc:159 #: source/ubl-settings-quotas.cc:141 source/ubl-settings-quotas.cc:142 #: source/ubl-settings-quotas.cc:151 source/ubl-settings-quotas.cc:156 #, fuzzy msgid "Hard limit" msgstr "Жесткий предел" -#: source/ubl-settings-quotas.cc:316 source/ubl-settings-quotas.cc:263 +#: source/ubl-settings-quotas.cc:324 source/ubl-settings-quotas.cc:316 +#: source/ubl-settings-quotas.cc:263 #, fuzzy msgid "" "Hard limit\n" @@ -118,7 +150,8 @@ msgstr "" "Жесткий предел\n" "(размер)" -#: source/ubl-settings-quotas.cc:319 source/ubl-settings-quotas.cc:266 +#: source/ubl-settings-quotas.cc:327 source/ubl-settings-quotas.cc:319 +#: source/ubl-settings-quotas.cc:266 #, fuzzy msgid "" "Hard limit\n" @@ -127,7 +160,8 @@ msgstr "" "Жесткий лимит\n" "(файлы)" -#: source/ubl-settings-quotas.cc:321 source/ubl-settings-quotas.cc:268 +#: source/ubl-settings-quotas.cc:329 source/ubl-settings-quotas.cc:321 +#: source/ubl-settings-quotas.cc:268 #, fuzzy msgid "" "Hard limit\n" @@ -137,7 +171,8 @@ msgstr "" "Время активации\n" "жесткого лимита (файла)" -#: source/ubl-settings-quotas.cc:320 source/ubl-settings-quotas.cc:267 +#: source/ubl-settings-quotas.cc:328 source/ubl-settings-quotas.cc:320 +#: source/ubl-settings-quotas.cc:267 #, fuzzy msgid "" "Hard limit\n" @@ -146,7 +181,8 @@ msgstr "" "Жесткий лимит\n" "(файлы)" -#: source/ubl-settings-quotas.cc:314 source/ubl-settings-quotas.cc:261 +#: source/ubl-settings-quotas.cc:322 source/ubl-settings-quotas.cc:314 +#: source/ubl-settings-quotas.cc:261 #, fuzzy msgid "" "Hard limit\n" @@ -155,7 +191,8 @@ msgstr "" "Жесткий предел\n" "(размер) задержки" -#: source/ubl-settings-quotas.cc:315 source/ubl-settings-quotas.cc:262 +#: source/ubl-settings-quotas.cc:323 source/ubl-settings-quotas.cc:315 +#: source/ubl-settings-quotas.cc:262 #, fuzzy msgid "" "Hard limit\n" @@ -164,70 +201,83 @@ msgstr "" "Жесткий предел\n" "(размер) задержки" -#: source/ubl-settings-quotas.cc:133 source/ubl-settings-quotas.cc:130 +#: source/ubl-settings-quotas.cc:136 source/ubl-settings-quotas.cc:133 +#: source/ubl-settings-quotas.cc:130 msgid "Hard limit (file) activation time" msgstr "Время активации жесткого лимита (файла)" -#: source/ubl-settings-quotas.cc:131 source/ubl-settings-quotas.cc:128 +#: source/ubl-settings-quotas.cc:134 source/ubl-settings-quotas.cc:131 +#: source/ubl-settings-quotas.cc:128 msgid "Hard limit (files)" msgstr "Жесткий лимит (файлы)" -#: source/ubl-settings-quotas.cc:132 source/ubl-settings-quotas.cc:129 +#: source/ubl-settings-quotas.cc:135 source/ubl-settings-quotas.cc:132 +#: source/ubl-settings-quotas.cc:129 msgid "Hard limit (files) delay" msgstr "Жесткий лимит (файлы)" -#: source/ubl-settings-quotas.cc:126 source/ubl-settings-quotas.cc:123 +#: source/ubl-settings-quotas.cc:129 source/ubl-settings-quotas.cc:126 +#: source/ubl-settings-quotas.cc:123 msgid "Hard limit (size)" msgstr "Жесткий предел (размер) задержки" -#: source/ubl-settings-quotas.cc:128 source/ubl-settings-quotas.cc:125 +#: source/ubl-settings-quotas.cc:131 source/ubl-settings-quotas.cc:128 +#: source/ubl-settings-quotas.cc:125 msgid "Hard limit (size) activation time" msgstr "Жесткий предел (размер)" -#: source/ubl-settings-quotas.cc:127 source/ubl-settings-quotas.cc:124 +#: source/ubl-settings-quotas.cc:130 source/ubl-settings-quotas.cc:127 +#: source/ubl-settings-quotas.cc:124 msgid "Hard limit (size) delay" msgstr "Жесткий предел (размер) задержки" -#: source/ubl-settings-quotas.cc:117 source/ubl-settings-quotas.cc:114 -#: source/ubl-settings-quotas.cc:109 +#: source/ubl-settings-quotas.cc:120 source/ubl-settings-quotas.cc:117 +#: source/ubl-settings-quotas.cc:114 source/ubl-settings-quotas.cc:109 msgid "Load" msgstr "Загрузить" +#: source/ubl-settings-quotas.cc:125 source/ubl-settings-quotas.cc:318 #: source/ubl-settings-quotas.cc:122 source/ubl-settings-quotas.cc:310 #: source/ubl-settings-quotas.cc:119 msgid "Name" msgstr "Имя" -#: source/ubl-settings-quotas.cc:83 source/ubl-settings-quotas.cc:80 -#: source/ubl-settings-quotas.cc:79 +#: source/ubl-settings-quotas.cc:86 source/ubl-settings-quotas.cc:83 +#: source/ubl-settings-quotas.cc:80 source/ubl-settings-quotas.cc:79 msgid "Project Home Page" msgstr "Главная страница проекта" +#: source/ubl-settings-quotas.cc:126 source/ubl-settings-quotas.cc:319 #: source/ubl-settings-quotas.cc:123 source/ubl-settings-quotas.cc:311 #: source/ubl-settings-quotas.cc:258 source/ubl-settings-quotas.cc:120 msgid "Quotas" msgstr "Квоты" -#: source/ubl-settings-quotas.cc:118 source/ubl-settings-quotas.cc:115 -#: source/ubl-settings-quotas.cc:110 +#: source/ubl-settings-quotas.cc:121 source/ubl-settings-quotas.cc:118 +#: source/ubl-settings-quotas.cc:115 source/ubl-settings-quotas.cc:110 msgid "Save" msgstr "Сохранить" +#: source/ubl-settings-quotas.cc:127 source/ubl-settings-quotas.cc:140 +#: source/ubl-settings-quotas.cc:151 source/ubl-settings-quotas.cc:320 #: source/ubl-settings-quotas.cc:124 source/ubl-settings-quotas.cc:137 #: source/ubl-settings-quotas.cc:148 source/ubl-settings-quotas.cc:312 #: source/ubl-settings-quotas.cc:259 source/ubl-settings-quotas.cc:121 msgid "Size" msgstr "Объём" -#: source/ubl-settings-quotas.cc:140 source/ubl-settings-quotas.cc:143 -#: source/ubl-settings-quotas.cc:150 source/ubl-settings-quotas.cc:155 +#: source/ubl-settings-quotas.cc:143 source/ubl-settings-quotas.cc:146 +#: source/ubl-settings-quotas.cc:153 source/ubl-settings-quotas.cc:158 +#: source/ubl-settings-quotas.cc:140 source/ubl-settings-quotas.cc:150 +#: source/ubl-settings-quotas.cc:155 #, fuzzy msgid "Soft limit" msgstr "" "Мягкий предел\n" "(размер)" -#: source/ubl-settings-quotas.cc:318 source/ubl-settings-quotas.cc:265 +#: source/ubl-settings-quotas.cc:326 source/ubl-settings-quotas.cc:318 +#: source/ubl-settings-quotas.cc:265 #, fuzzy msgid "" "Soft limit\n" @@ -236,7 +286,8 @@ msgstr "" "Мягкий лимит\n" "(файлы)" -#: source/ubl-settings-quotas.cc:313 source/ubl-settings-quotas.cc:260 +#: source/ubl-settings-quotas.cc:321 source/ubl-settings-quotas.cc:313 +#: source/ubl-settings-quotas.cc:260 #, fuzzy msgid "" "Soft limit\n" @@ -245,60 +296,69 @@ msgstr "" "Мягкий предел\n" "(размер)" -#: source/ubl-settings-quotas.cc:130 source/ubl-settings-quotas.cc:127 +#: source/ubl-settings-quotas.cc:133 source/ubl-settings-quotas.cc:130 +#: source/ubl-settings-quotas.cc:127 msgid "Soft limit (files)" msgstr "" "Мягкий лимит\n" "(файлы)" -#: source/ubl-settings-quotas.cc:125 source/ubl-settings-quotas.cc:122 +#: source/ubl-settings-quotas.cc:128 source/ubl-settings-quotas.cc:125 +#: source/ubl-settings-quotas.cc:122 msgid "Soft limit (size)" msgstr "" "Мягкий предел\n" "(размер)" -#: source/ubl-settings-quotas.cc:70 source/ubl-settings-quotas.cc:67 -#: source/ubl-settings-quotas.cc:66 +#: source/ubl-settings-quotas.cc:68 source/ubl-settings-quotas.cc:70 +#: source/ubl-settings-quotas.cc:67 source/ubl-settings-quotas.cc:66 msgid "The program must be run as root" msgstr "Программа должна быть запущена от имени root" -#: source/ubl-settings-quotas.cc:147 +#: source/ubl-settings-quotas.cc:150 source/ubl-settings-quotas.cc:147 msgid "User quotas for this device: " -msgstr "Квоты пользователей для этого устройства: " +msgstr "Квоты пользователей для этого устройства: " -#: source/ubl-settings-quotas.cc:86 source/ubl-settings-quotas.cc:83 -#: source/ubl-settings-quotas.cc:82 +#: source/ubl-settings-quotas.cc:89 source/ubl-settings-quotas.cc:86 +#: source/ubl-settings-quotas.cc:83 source/ubl-settings-quotas.cc:82 msgid "Users" msgstr "Пользователи" +#: source/ubl-settings-quotas.cc:104 source/ubl-settings-quotas.cc:105 +#: source/ubl-settings-quotas.cc:106 source/ubl-settings-quotas.cc:107 #: source/ubl-settings-quotas.cc:101 source/ubl-settings-quotas.cc:102 -#: source/ubl-settings-quotas.cc:103 source/ubl-settings-quotas.cc:104 -#: source/ubl-settings-quotas.cc:98 source/ubl-settings-quotas.cc:99 -#: source/ubl-settings-quotas.cc:100 source/ubl-settings-quotas.cc:97 +#: source/ubl-settings-quotas.cc:103 source/ubl-settings-quotas.cc:98 +#: source/ubl-settings-quotas.cc:99 source/ubl-settings-quotas.cc:100 +#: source/ubl-settings-quotas.cc:97 msgid "days" msgstr "дни" +#: source/ubl-settings-quotas.cc:160 source/ubl-settings-quotas.cc:161 #: source/ubl-settings-quotas.cc:157 source/ubl-settings-quotas.cc:158 #, fuzzy msgid "files" msgstr "Файлы" +#: source/ubl-settings-quotas.cc:108 source/ubl-settings-quotas.cc:109 +#: source/ubl-settings-quotas.cc:110 source/ubl-settings-quotas.cc:111 #: source/ubl-settings-quotas.cc:105 source/ubl-settings-quotas.cc:106 -#: source/ubl-settings-quotas.cc:107 source/ubl-settings-quotas.cc:108 -#: source/ubl-settings-quotas.cc:102 source/ubl-settings-quotas.cc:103 -#: source/ubl-settings-quotas.cc:104 source/ubl-settings-quotas.cc:101 +#: source/ubl-settings-quotas.cc:107 source/ubl-settings-quotas.cc:102 +#: source/ubl-settings-quotas.cc:103 source/ubl-settings-quotas.cc:104 +#: source/ubl-settings-quotas.cc:101 msgid "hours" msgstr "часы" -#: source/ubl-settings-quotas.cc:81 source/ubl-settings-quotas.cc:78 -#: source/ubl-settings-quotas.cc:77 +#: source/ubl-settings-quotas.cc:84 source/ubl-settings-quotas.cc:81 +#: source/ubl-settings-quotas.cc:78 source/ubl-settings-quotas.cc:77 msgid "https://wiki.ublinux.com" msgstr "https://wiki.ublinux.ru" +#: source/ubl-settings-quotas.cc:112 source/ubl-settings-quotas.cc:113 +#: source/ubl-settings-quotas.cc:114 source/ubl-settings-quotas.cc:115 #: source/ubl-settings-quotas.cc:109 source/ubl-settings-quotas.cc:110 -#: source/ubl-settings-quotas.cc:111 source/ubl-settings-quotas.cc:112 -#: source/ubl-settings-quotas.cc:106 source/ubl-settings-quotas.cc:107 -#: source/ubl-settings-quotas.cc:108 source/ubl-settings-quotas.cc:105 +#: source/ubl-settings-quotas.cc:111 source/ubl-settings-quotas.cc:106 +#: source/ubl-settings-quotas.cc:107 source/ubl-settings-quotas.cc:108 +#: source/ubl-settings-quotas.cc:105 msgid "minutes" msgstr "минуты" @@ -306,25 +366,28 @@ msgstr "минуты" msgid "name" msgstr "имя" -#: source/ubl-settings-quotas.cc:89 source/ubl-settings-quotas.cc:86 -#: source/ubl-settings-quotas.cc:85 +#: source/ubl-settings-quotas.cc:92 source/ubl-settings-quotas.cc:89 +#: source/ubl-settings-quotas.cc:86 source/ubl-settings-quotas.cc:85 msgid "quotas for groups" msgstr "квоты для групп" -#: source/ubl-settings-quotas.cc:92 source/ubl-settings-quotas.cc:89 -#: source/ubl-settings-quotas.cc:88 +#: source/ubl-settings-quotas.cc:95 source/ubl-settings-quotas.cc:92 +#: source/ubl-settings-quotas.cc:89 source/ubl-settings-quotas.cc:88 msgid "quotas for users" msgstr "квоты для пользователей" -#: source/ubl-settings-quotas.cc:371 source/ubl-settings-quotas.cc:318 -#: source/ubl-settings-quotas.cc:267 source/ubl-settings-quotas.cc:213 +#: source/ubl-settings-quotas.cc:350 source/ubl-settings-quotas.cc:371 +#: source/ubl-settings-quotas.cc:318 source/ubl-settings-quotas.cc:267 +#: source/ubl-settings-quotas.cc:213 msgid "ubl-settings-quotas version: " msgstr "ubl-settings-quotas версия: " +#: source/ubl-settings-quotas.cc:100 source/ubl-settings-quotas.cc:101 +#: source/ubl-settings-quotas.cc:102 source/ubl-settings-quotas.cc:103 #: source/ubl-settings-quotas.cc:97 source/ubl-settings-quotas.cc:98 -#: source/ubl-settings-quotas.cc:99 source/ubl-settings-quotas.cc:100 -#: source/ubl-settings-quotas.cc:94 source/ubl-settings-quotas.cc:95 -#: source/ubl-settings-quotas.cc:96 source/ubl-settings-quotas.cc:93 +#: source/ubl-settings-quotas.cc:99 source/ubl-settings-quotas.cc:94 +#: source/ubl-settings-quotas.cc:95 source/ubl-settings-quotas.cc:96 +#: source/ubl-settings-quotas.cc:93 msgid "weeks" msgstr "недели" @@ -351,17 +414,3 @@ msgstr "недели" #~ msgid "Load from local configuration" #~ msgstr "Загрузить локальную конфигурацию" - -msgid "" -"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" -msgstr "" -"GTK-утилита настройки квот для UBLinux\n" -"\n" -"Использование: ubl-settings-quotas [Параметры приложения...]\n" -"Параметры приложения:\n" -" -h, --help\t Показать параметры справки\n" -" -V, --version\t Показать версию пакета\n" \ No newline at end of file From 61d7305766e86a2a28ea5aa016b1c498e15e3989 Mon Sep 17 00:00:00 2001 From: Igor Belitskiy Date: Wed, 5 Apr 2023 09:53:08 +0600 Subject: [PATCH 07/51] =?UTF-8?q?=D0=98=D1=81=D0=BF=D1=80=D0=B0=D0=B2?= =?UTF-8?q?=D0=BB=D0=B5=D0=BD=20.desktop=20=D0=B8=D1=81=D0=BF=D1=80=D0=B0?= =?UTF-8?q?=D0=B2=D0=BB=D0=B5=D0=BD=20=D0=BF=D1=83=D1=82=D1=8C=20=D0=BA=20?= =?UTF-8?q?=D1=84=D0=BE=D0=BD=D1=83?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- source/ubl-settings-quotas.cc | 2 +- ubl-settings-quotas.desktop | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/source/ubl-settings-quotas.cc b/source/ubl-settings-quotas.cc index 2d187b3..ef9f7b8 100755 --- a/source/ubl-settings-quotas.cc +++ b/source/ubl-settings-quotas.cc @@ -7,7 +7,7 @@ const string path_glade = "/usr/share/ubl-settings-quotas/ui/ubl-settings-quotas const string app_name = "ubl-settings-quotas"; const string path_locale = "/usr/share/locale/"; const string path_css = "/usr/share/ubl-settings-quotas/css/ubl-settings-quotas.css"; -const string path_img_head_background = "/usr/share/ubl-settings-quotas/ui/ubl-settings-quotas-banner.png"; +const string path_img_head_background = "/usr/share/ubl-settings-quotas/images/logo-background.png"; int socket_ext_id_I = 0; int socket_trd_id_I = 0; diff --git a/ubl-settings-quotas.desktop b/ubl-settings-quotas.desktop index ddea473..a1848f4 100644 --- a/ubl-settings-quotas.desktop +++ b/ubl-settings-quotas.desktop @@ -7,7 +7,7 @@ GenericName[ru]=Настройки квот Comment=ubl-settings-quotas Comment[ru]=Приложение для управления настройками квот Type=Application -Exec=ubl-settings-quotas +Exec=pkexec ubl-settings-quotas Icon=com.ublinux.ubl-settings-quotas Terminal=false X-XfcePluggable=true From 06b177887e225d8063a251ea3a73347d45b88c20 Mon Sep 17 00:00:00 2001 From: Igor Belitskiy Date: Wed, 5 Apr 2023 17:58:04 +0600 Subject: [PATCH 08/51] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=D1=8B=20=D0=B1=D0=B8=D0=B1=D0=BB=D0=B8=D0=BE=D1=82?= =?UTF-8?q?=D0=B5=D0=BA=D0=B8=20"=D1=81=D0=BE=D1=85=D1=80=D0=B0=D0=BD?= =?UTF-8?q?=D0=B5=D0=BD=D0=B8=D1=8F",=20"=D0=B7=D0=B0=D0=B3=D1=80=D1=83?= =?UTF-8?q?=D0=B7=D0=BA=D0=B8",=20"=D0=B2=D1=8B=D0=BF=D0=BE=D0=BB=D0=BD?= =?UTF-8?q?=D0=B5=D0=BD=D0=B8=D1=8F"?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- source/CMakeLists.txt | 2 +- source/load.cc | 33 ++++++++++++++++ source/load.h | 20 ++++++++++ source/my_process.cc | 73 ++++++++++++++++++++++++++++++++++++ source/my_process.h | 34 +++++++++++++++++ source/process.cc | 10 ----- source/process.h | 22 ----------- source/save.cc | 87 +++++++++++++++++++++++++++++++++++++++++++ source/save.h | 27 ++++++++++++++ source/util.cc | 3 ++ source/util.h | 5 +++ 11 files changed, 283 insertions(+), 33 deletions(-) create mode 100644 source/load.cc create mode 100644 source/load.h create mode 100644 source/my_process.cc create mode 100644 source/my_process.h delete mode 100644 source/process.cc delete mode 100644 source/process.h create mode 100644 source/save.cc create mode 100644 source/save.h diff --git a/source/CMakeLists.txt b/source/CMakeLists.txt index 9e72be6..ec3f582 100644 --- a/source/CMakeLists.txt +++ b/source/CMakeLists.txt @@ -7,7 +7,7 @@ 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 \ diff --git a/source/load.cc b/source/load.cc new file mode 100644 index 0000000..558f211 --- /dev/null +++ b/source/load.cc @@ -0,0 +1,33 @@ +#include "load.h" + +namespace Lib_Load{ + void Load::set_sections(vector vec_sections){ + this->vec_sections = vec_sections; + } + map Load::get_load_data(string str_flag_load) { + string cmd = ""; + string response = ""; + string key = ""; + string value = ""; + map map_data; + for (const string §ion: this->vec_sections) { + cmd = "ubconfig --default --source " + str_flag_load + " get " + section; + response = process.call_all_sections(cmd); + vector vec_str_key_value = Utils::split(response, '\n'); + for (const string ¶m: vec_str_key_value) { + if ((param.find("(null)") == std::string::npos) && (param.length() != 0 )) { + if (param.find("=") != std::string::npos) { + size_t index = param.find("="); + key = param.substr(0, index); + value = param.substr(index + 1, param.length()); + map_data[key] = value; + cout << key << "=" << value << endl; + } + } + + } + } + return map_data; + } + +} \ No newline at end of file diff --git a/source/load.h b/source/load.h new file mode 100644 index 0000000..0a42947 --- /dev/null +++ b/source/load.h @@ -0,0 +1,20 @@ +#ifndef LOAD_H +#define LOAD_H + +#include "my_process.h" +namespace Lib_Load{ + class Load { + + private: + vector vec_sections; + My_Process::My_Process_call process = My_Process::My_Process_call(); + public: + Load(/* args */); + ~Load(); + void set_sections(vector vec_sections); + map get_load_data(string str_flag_load); + }; + + +} +#endif \ No newline at end of file diff --git a/source/my_process.cc b/source/my_process.cc new file mode 100644 index 0000000..43d37c3 --- /dev/null +++ b/source/my_process.cc @@ -0,0 +1,73 @@ +#include "my_process.h" +#include "util.h" + +namespace My_Process{ + +struct Utils::Result My_Process_call::call(string cmd) { + this->i_error_old = this->i_error; + struct Utils::Result obj_result; + string response = Utils::call(cmd); + obj_result.response = response; + if ((response.find("(null)") == std::string::npos) && (response.length() != 0 )) { + if (response.find("=") != std::string::npos) { + if (response.find("\n") != std::string::npos) { + response = response.substr(response.find("=")+1,response.length()); + response = response.substr(0,response.find("\n")); + obj_result.response = response; + obj_result.error = 0; + } + else { + obj_result.error = 1; + this->i_error += 1; + this->log_mess_error(cmd); + } + } + else { + obj_result.error = 2; + this->i_error += 1; + str_cmd_error = cmd; + this->log_mess_error(cmd); + } + } + else { + obj_result.error = 3; + this->i_error += 1; + str_cmd_error = cmd; + this->log_mess_error(cmd); + } + return obj_result; +} + +int My_Process::get_count_error() { + return this->i_error; +} + +void My_Process::set_back_count_error() { + this->i_error = this->i_error_old; +} + +void My_Process_system::call(string cmd, string thread_str = "") { + string cmd_new = cmd + " " + thread_str; + int response_cmd = system(cmd_new.c_str()); + if (response_cmd != 0) { + this->i_error += 1; + } +} + +void My_Process::set_count_error(int count_error) { + this->i_error = count_error; + this->str_cmd_error = ""; +} + +void My_Process::log_mess_error(string cmd) { + +} + +string My_Process::get_cmd_error() { + return this->str_cmd_error; +} +string My_Process_call::call_all_sections(string cmd) { + string response = Utils::call(cmd); + return response; +} +} \ No newline at end of file diff --git a/source/my_process.h b/source/my_process.h new file mode 100644 index 0000000..7f271c9 --- /dev/null +++ b/source/my_process.h @@ -0,0 +1,34 @@ +#ifndef SAVE_H +#define SAVE_H + +#include "util.h" +namespace My_Process{ +class My_Process { + public: + int i_error = 0; + int i_error_old = 0; + string str_cmd_error = ""; + int get_count_error(); + void set_count_error(int count_error); + void set_back_count_error(); + void log_mess_error(string cmd); + string get_cmd_error(); +}; + + +class My_Process_call: My_Process { + public: + My_Process_call(); + struct Utils::Result call(string cmd); + string call_all_sections(string cmd); + +}; + +class My_Process_system: My_Process { + public: + My_Process_system(); + void call(string cmd, string thread_str); + +}; +} +#endif \ No newline at end of file diff --git a/source/process.cc b/source/process.cc deleted file mode 100644 index 00c83c5..0000000 --- a/source/process.cc +++ /dev/null @@ -1,10 +0,0 @@ -#include "process.h" - -struct Result Process_call::call(string cmd) {} -int Process::get_count_error() { - return this->i_error; -} -void Process::set_count_error(int count_error) { - this->i_error = count_error; -} -void Process_system::call(string cmd) {} \ No newline at end of file diff --git a/source/process.h b/source/process.h deleted file mode 100644 index 8266223..0000000 --- a/source/process.h +++ /dev/null @@ -1,22 +0,0 @@ -#include "util.h" - -class Process { - int i_error = 0; - int i_error_old = 0; - virtual int get_count_error() = 0; - virtual void set_count_error(int count_error) = 0; -}; - - -class Process_call: Process { - public: - Process_call(); - struct Result call(string cmd); - -}; -class Process_system: Process { - public: - Process_system(); - void call(string cmd); - -}; \ No newline at end of file diff --git a/source/save.cc b/source/save.cc new file mode 100644 index 0000000..c36d9c5 --- /dev/null +++ b/source/save.cc @@ -0,0 +1,87 @@ +#include "save.h" + +namespace Lib_save { + +vector Save::get_error() { + return this->vec_errors; +} + +bool Save::get_state_save() { + return this->flag_no_save; +} + +void Save::set_data_local(std::map &map_global) { + this->map_global = &map_global; +} + +void Save::set_data_local(std::map &map_local) { + this->map_local = &map_local; +} + +void Save::set_data_local(std::map &map_gui) { + this->map_gui = &map_gui; +} + +bool Save::check_save(string flag_save, string key_name) { + std::map :: iterator iter_map_data; + std::map :: iterator iter_map_data_old; + std::map *map_data_old; + if (flag_save == "system") { + map_data_old = map_local; + } + else if (flag_save == "global") { + map_data_old = map_global; + } + iter_map_data = (*map_gui).find(key_name); + iter_map_data_old = (*map_data_old).find(key_name); + if (iter_map_data_old == (*map_data_old).end() && iter_map_data != (*map_gui).end()) { + return true; + } + else if (iter_map_data->second != iter_map_data_old->second) { + return true; + } + else if (iter_map_data->second.length() == 0 && iter_map_data_old->second.length() == 0) { + return false; + } + else if (iter_map_data->second == iter_map_data_old->second) { + return false; + } + else { + return true; + } + return true; +} + +void Save::save(std::map &map_gui, std::map &map_temp,string sections, string str_flag_save) { + string key = ""; + string value = ""; + string cmd = ""; + string str_error = ""; + this->flag_no_save = false; + for (const auto &map_iter: map_gui) { + key = map_iter.first; + value = map_iter.second; + if (this->check_save(str_flag_save, key) == true) { + if (value.length() != 0) { + cmd = "ubconfig --target " + str_flag_save + " set " + sections + " " + + key + "=\"" + value + "\""; + } + else if (value.length() == 0) { + cmd = "ubconfig --target " + str_flag_save + " remove " + sections + " " + key; + } + else { + cmd = ""; + } + if (cmd.length() != 0) { + process.call(cmd, ""); + this->flag_no_save = true; + str_error = process.get_cmd_error(); + if (str_error.length() != 0) { + this->vec_errors.push_back(str_error); + str_error = ""; + } + } + } + } +} +} diff --git a/source/save.h b/source/save.h new file mode 100644 index 0000000..1f5f194 --- /dev/null +++ b/source/save.h @@ -0,0 +1,27 @@ +#ifndef MY_PROCESS_H +#define MY_PROCESS_H + +#include "my_process.h" +namespace Lib_save { + +class Save { +private: + std::map *map_global; + std::map *map_local; + std::map *map_gui; + vector vec_errors; + My_Process::My_Process_system process = My_Process::My_Process_system(); + bool flag_no_save; +public: + Save(/* args */); + ~Save(); + void set_data_local(std::map &map_global); + void set_data_local(std::map &map_local); + void set_data_local(std::map &map_gui); + bool check_save(string flag_save, string key_name); + bool get_state_save(); + void save(std::map &map_gui, std::map &map_temp,string sections, string str_flag_save) ; + vector get_error(); +}; +} +#endif \ No newline at end of file diff --git a/source/util.cc b/source/util.cc index d2ca2dd..8d8c496 100644 --- a/source/util.cc +++ b/source/util.cc @@ -1,5 +1,6 @@ #include "util.h" +namespace Utils { array, 5> read_csv(const string& filename) { array, 5> array_vectors; @@ -66,6 +67,7 @@ string call(string cmd) { } return path; } + vector find_all(string &str_ntp, string substr) { size_t index = 0; vector sub_index; @@ -192,4 +194,5 @@ int synopsis_show(string str_link) { 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 index fa83ff8..9044b95 100644 --- a/source/util.h +++ b/source/util.h @@ -1,3 +1,5 @@ +#ifndef UTIL_H +#define UTIL_H #include #include #include @@ -23,6 +25,7 @@ using namespace std; +namespace Utils { template struct Result{ Type response; @@ -44,3 +47,5 @@ unsigned short read_uid_min_max(string filename, string search); vector pars_users(); string read_passwd(string username); int synopsis_show(string str_link); +} +#endif \ No newline at end of file From 9227ac62164bbbc1a9c0ae7c39e838d883453d0b Mon Sep 17 00:00:00 2001 From: Igor Belitskiy Date: Thu, 6 Apr 2023 09:20:52 +0600 Subject: [PATCH 09/51] =?UTF-8?q?=D0=9D=D0=B0=D0=BF=D0=B8=D1=81=D0=B0?= =?UTF-8?q?=D0=BD=D0=B0=20=D1=83=D0=BD=D0=B8=D0=B2=D0=B5=D1=80=D1=81=D0=B0?= =?UTF-8?q?=D0=BB=D1=8C=D0=BD=D0=B0=D1=8F=20=D0=B1=D0=B8=D0=B1=D0=BB=D0=B8?= =?UTF-8?q?=D0=BE=D1=82=D0=B5=D0=BA=D0=B0=20=D0=B4=D0=BB=D1=8F=20=D1=81?= =?UTF-8?q?=D0=BE=D1=85=D1=80=D0=B0=D0=BD=D0=B5=D0=BD=D0=B8=D1=8F=20=D0=B8?= =?UTF-8?q?=20=D0=B7=D0=B0=D0=B3=D1=80=D1=83=D0=B7=D0=BA=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- source/CMakeLists.txt | 10 ++++++++-- source/my_process.cc | 5 ++--- source/my_process.h | 6 +++--- source/save.cc | 6 +++--- source/save.h | 6 +++--- 5 files changed, 19 insertions(+), 14 deletions(-) diff --git a/source/CMakeLists.txt b/source/CMakeLists.txt index ec3f582..c4a700b 100644 --- a/source/CMakeLists.txt +++ b/source/CMakeLists.txt @@ -16,12 +16,18 @@ set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -pedantic -Wall -Wextra -Werror -Wmissin -fstack-clash-protection -fcf-protection -g") set(SOURCE_FILES + ubl-settings-quotas.h + ubl-settings-quotas.cc + save.h + save.cc + load.h + load.cc + my_process.h + my_process.cc util.h util.cc ubl-util-standard.h ubl-util-standard.c - ubl-settings-quotas.h - ubl-settings-quotas.cc main.cc) set(LIBRARIES diff --git a/source/my_process.cc b/source/my_process.cc index 43d37c3..79dad92 100644 --- a/source/my_process.cc +++ b/source/my_process.cc @@ -2,7 +2,7 @@ #include "util.h" namespace My_Process{ - +#define debug false struct Utils::Result My_Process_call::call(string cmd) { this->i_error_old = this->i_error; struct Utils::Result obj_result; @@ -59,8 +59,7 @@ void My_Process::set_count_error(int count_error) { this->str_cmd_error = ""; } -void My_Process::log_mess_error(string cmd) { - +void My_Process::log_mess_error(string) { } string My_Process::get_cmd_error() { diff --git a/source/my_process.h b/source/my_process.h index 7f271c9..809afe5 100644 --- a/source/my_process.h +++ b/source/my_process.h @@ -11,12 +11,12 @@ class My_Process { int get_count_error(); void set_count_error(int count_error); void set_back_count_error(); - void log_mess_error(string cmd); + void log_mess_error(string); string get_cmd_error(); }; -class My_Process_call: My_Process { +class My_Process_call: public My_Process { public: My_Process_call(); struct Utils::Result call(string cmd); @@ -24,7 +24,7 @@ class My_Process_call: My_Process { }; -class My_Process_system: My_Process { +class My_Process_system: public My_Process { public: My_Process_system(); void call(string cmd, string thread_str); diff --git a/source/save.cc b/source/save.cc index c36d9c5..3c155db 100644 --- a/source/save.cc +++ b/source/save.cc @@ -10,7 +10,7 @@ bool Save::get_state_save() { return this->flag_no_save; } -void Save::set_data_local(std::map &map_global) { +void Save::set_data_global(std::map &map_global) { this->map_global = &map_global; } @@ -18,7 +18,7 @@ void Save::set_data_local(std::map &map_local) { this->map_local = &map_local; } -void Save::set_data_local(std::map &map_gui) { +void Save::set_data_gui(std::map &map_gui) { this->map_gui = &map_gui; } @@ -52,7 +52,7 @@ bool Save::check_save(string flag_save, string key_name) { return true; } -void Save::save(std::map &map_gui, std::map &map_temp,string sections, string str_flag_save) { +void Save::save(std::map &map_gui, string sections, string str_flag_save) { string key = ""; string value = ""; string cmd = ""; diff --git a/source/save.h b/source/save.h index 1f5f194..8a9e90e 100644 --- a/source/save.h +++ b/source/save.h @@ -15,12 +15,12 @@ private: public: Save(/* args */); ~Save(); - void set_data_local(std::map &map_global); + void set_data_global(std::map &map_global); void set_data_local(std::map &map_local); - void set_data_local(std::map &map_gui); + void set_data_gui(std::map &map_gui); bool check_save(string flag_save, string key_name); bool get_state_save(); - void save(std::map &map_gui, std::map &map_temp,string sections, string str_flag_save) ; + void save(std::map &map_gui, string sections, string str_flag_save) ; vector get_error(); }; } From 04a4399222ada717faa214213fa7718f7dd939e0 Mon Sep 17 00:00:00 2001 From: Igor Belitskiy Date: Fri, 7 Apr 2023 15:11:37 +0600 Subject: [PATCH 10/51] =?UTF-8?q?=D0=98=D1=81=D0=BF=D1=80=D0=B0=D0=B2?= =?UTF-8?q?=D0=BB=D0=B5=D0=BD=D0=B0=20=D0=B1=D0=B8=D0=B1=D0=BB=D0=B8=D0=BE?= =?UTF-8?q?=D1=82=D0=B5=D0=BA=D0=B0=20=D0=B7=D0=B0=D0=B3=D1=80=D1=83=D0=B7?= =?UTF-8?q?=D0=BA=D0=B8=20=D0=B8=20=D1=81=D0=BE=D1=85=D1=80=D0=B0=D0=BD?= =?UTF-8?q?=D0=B5=D0=BD=D0=B8=D1=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- source/load.cc | 44 +++++++++-------- source/load.h | 11 +++-- source/my_process.cc | 18 +++++-- source/my_process.h | 2 - source/save.cc | 112 ++++++++++++++++++++++++++++++++++--------- source/save.h | 10 ++-- 6 files changed, 143 insertions(+), 54 deletions(-) diff --git a/source/load.cc b/source/load.cc index 558f211..e8a361b 100644 --- a/source/load.cc +++ b/source/load.cc @@ -1,33 +1,39 @@ #include "load.h" namespace Lib_Load{ - void Load::set_sections(vector vec_sections){ - this->vec_sections = vec_sections; + void Load::set_sections(string sections){ + this->sections = sections; } - map Load::get_load_data(string str_flag_load) { + void Load::set_count_error(int count_error) { + process.set_count_error(count_error); + } + string Load::get_cmd_error() { + return process.get_cmd_error(); + } + map& Load::get_load_data(std::map &map_temp, string str_flag_load) { string cmd = ""; string response = ""; string key = ""; string value = ""; - map map_data; - for (const string §ion: this->vec_sections) { - cmd = "ubconfig --default --source " + str_flag_load + " get " + section; - response = process.call_all_sections(cmd); - vector vec_str_key_value = Utils::split(response, '\n'); - for (const string ¶m: vec_str_key_value) { - if ((param.find("(null)") == std::string::npos) && (param.length() != 0 )) { - if (param.find("=") != std::string::npos) { - size_t index = param.find("="); - key = param.substr(0, index); - value = param.substr(index + 1, param.length()); - map_data[key] = value; - cout << key << "=" << value << endl; - } + cmd = "ubconfig --default --source " + str_flag_load + " get " + this->sections; + response = process.call_all_sections(cmd); + vector vec_str_key_value = Utils::split(response, '\n'); + for (const string ¶m: vec_str_key_value) { + if ((param.find("(null)") == std::string::npos) && (param.length() != 0 )) { + if (param.find("=") != std::string::npos) { + size_t index = param.find("="); + key = param.substr(0, index); + value = param.substr(index + 1, param.length()); + Utils::str_replace_all(value, " \"",""); + Utils::str_replace_all(value, "\"",""); + map_temp[key] = value; } - } } - return map_data; + return map_temp; + } + int Load::get_count_error() { + return process.get_count_error(); } } \ No newline at end of file diff --git a/source/load.h b/source/load.h index 0a42947..26aaf96 100644 --- a/source/load.h +++ b/source/load.h @@ -6,13 +6,14 @@ namespace Lib_Load{ class Load { private: - vector vec_sections; + string sections; My_Process::My_Process_call process = My_Process::My_Process_call(); public: - Load(/* args */); - ~Load(); - void set_sections(vector vec_sections); - map get_load_data(string str_flag_load); + void set_sections(string sections); + int get_count_error(); + void set_count_error(int count_error); + string get_cmd_error(); + map& get_load_data(std::map &map_temp, string str_flag_load); }; diff --git a/source/my_process.cc b/source/my_process.cc index 79dad92..658afd5 100644 --- a/source/my_process.cc +++ b/source/my_process.cc @@ -1,7 +1,7 @@ #include "my_process.h" #include "util.h" -namespace My_Process{ +namespace My_Process { #define debug false struct Utils::Result My_Process_call::call(string cmd) { this->i_error_old = this->i_error; @@ -66,7 +66,19 @@ string My_Process::get_cmd_error() { return this->str_cmd_error; } string My_Process_call::call_all_sections(string cmd) { - string response = Utils::call(cmd); - return response; + char buffer[PATH_MAX] = {0}; + std::string result = ""; + FILE* pipe = popen(cmd.c_str(), "r"); + if (!pipe) throw std::runtime_error("popen() failed!"); + try { + while (fgets(buffer, sizeof buffer, pipe) != NULL) { + result += buffer; + } + } catch (...) { + pclose(pipe); + throw; + } + pclose(pipe); + return result; } } \ No newline at end of file diff --git a/source/my_process.h b/source/my_process.h index 809afe5..f780860 100644 --- a/source/my_process.h +++ b/source/my_process.h @@ -18,7 +18,6 @@ class My_Process { class My_Process_call: public My_Process { public: - My_Process_call(); struct Utils::Result call(string cmd); string call_all_sections(string cmd); @@ -26,7 +25,6 @@ class My_Process_call: public My_Process { class My_Process_system: public My_Process { public: - My_Process_system(); void call(string cmd, string thread_str); }; diff --git a/source/save.cc b/source/save.cc index 3c155db..584e7ea 100644 --- a/source/save.cc +++ b/source/save.cc @@ -34,6 +34,11 @@ bool Save::check_save(string flag_save, string key_name) { } iter_map_data = (*map_gui).find(key_name); iter_map_data_old = (*map_data_old).find(key_name); + if ((*map_local).find(key_name) != (*map_local).end() && (*map_global).find(key_name) != (*map_global).end()) { + if ((*map_local)[key_name] != (*map_global)[key_name]) { + return true; + } + } if (iter_map_data_old == (*map_data_old).end() && iter_map_data != (*map_gui).end()) { return true; } @@ -52,36 +57,99 @@ bool Save::check_save(string flag_save, string key_name) { return true; } -void Save::save(std::map &map_gui, string sections, string str_flag_save) { +int Save::get_count_error() { + return process.get_count_error(); +} + +string Save::get_cmd_error() { + return process.get_cmd_error(); +} + +void Save::set_count_error(int count_error) { + process.set_count_error(count_error); +} + +void Save::set_vec_params(vector& vec_param_names) { + this->vec_param_names = &vec_param_names; +} + +void Save::save(string sections, string str_flag_save) { string key = ""; string value = ""; string cmd = ""; string str_error = ""; - this->flag_no_save = false; - for (const auto &map_iter: map_gui) { - key = map_iter.first; - value = map_iter.second; - if (this->check_save(str_flag_save, key) == true) { - if (value.length() != 0) { - cmd = "ubconfig --target " + str_flag_save + " set " + sections + " " + - key + "=\"" + value + "\""; - } - else if (value.length() == 0) { - cmd = "ubconfig --target " + str_flag_save + " remove " + sections + " " + key; - } - else { - cmd = ""; + this->flag_no_save = true; + for (const auto &key: *vec_param_names) { + if (map_gui->find(key) != map_gui->end()) { + value = (*map_gui)[key]; + if (this->check_save(str_flag_save, key)) { + if (value.length() != 0) { + cmd = "ubconfig --target " + str_flag_save + " set " + sections + " " + + key + "=\"" + value + "\""; + } + else if (value.length() == 0) { + cmd = "ubconfig --target " + str_flag_save + " remove " + sections + " " + key; + } + else { + cmd = ""; + } + if (cmd.length() != 0) { + process.call(cmd, ""); + this->flag_no_save = false; + str_error = process.get_cmd_error(); + if (str_error.length() != 0) { + this->vec_errors.push_back(str_error); + str_error = ""; + } + } } - if (cmd.length() != 0) { - process.call(cmd, ""); - this->flag_no_save = true; - str_error = process.get_cmd_error(); - if (str_error.length() != 0) { - this->vec_errors.push_back(str_error); - str_error = ""; + } + + } +} +void Save::save_all(string sections, string str_flag_save) { + string key = ""; + string value = ""; + string cmd_all = "ubconfig --target " + str_flag_save + " set " + sections; + size_t len_start_cmd_all = cmd_all.length(); + string str_error = ""; + this->flag_no_save = true; + string cmd = ""; + string cmd_remove = ""; + for (const auto &key: *vec_param_names) { + if (map_gui->find(key) != map_gui->end()) { + value = (*map_gui)[key]; + if (this->check_save(str_flag_save, key)) { + if (value.length() != 0) { + cmd_all += " " + key + "=\"" + value + "\""; + } + else if (value.length() == 0) { + cmd = "ubconfig --target " + str_flag_save + " remove " + sections + " " + key; + } + else { + cmd = ""; + } + if (cmd.length() != 0) { + process.call(cmd, ""); + this->flag_no_save = false; + str_error = process.get_cmd_error(); + if (str_error.length() != 0) { + this->vec_errors.push_back(str_error); + str_error = ""; + } } } } + + } + if (len_start_cmd_all != cmd_all.length()) { + process.call(cmd, ""); + this->flag_no_save = false; + str_error = process.get_cmd_error(); + if (str_error.length() != 0) { + this->vec_errors.push_back(str_error); + str_error = ""; + } } } } diff --git a/source/save.h b/source/save.h index 8a9e90e..bdc2f56 100644 --- a/source/save.h +++ b/source/save.h @@ -10,17 +10,21 @@ private: std::map *map_local; std::map *map_gui; vector vec_errors; + vector* vec_param_names; My_Process::My_Process_system process = My_Process::My_Process_system(); bool flag_no_save; public: - Save(/* args */); - ~Save(); void set_data_global(std::map &map_global); void set_data_local(std::map &map_local); void set_data_gui(std::map &map_gui); bool check_save(string flag_save, string key_name); bool get_state_save(); - void save(std::map &map_gui, string sections, string str_flag_save) ; + int get_count_error(); + string get_cmd_error(); + void save_all(string sections, string str_flag_save); + void set_count_error(int count_error); + void set_vec_params(vector& vec_param_names); + void save(string sections, string str_flag_save) ; vector get_error(); }; } From 43a295cf22a84428d8c18b59308b56a670425113 Mon Sep 17 00:00:00 2001 From: Igor Belitskiy Date: Fri, 7 Apr 2023 15:52:34 +0600 Subject: [PATCH 11/51] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=D1=8B=20=D0=BD=D0=BE=D0=B2=D1=8B=D0=B5=20=D1=84?= =?UTF-8?q?=D0=B0=D0=B9=D0=BB=D1=8B=20=D0=BA=D0=BE=D0=B4=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- source/CMakeLists.txt | 2 ++ source/my_type.h | 11 +++++++++ source/project_lib.h | 42 +++++++++++++++++++++++++++++++++++ source/ubl-settings-quotas.cc | 14 ++++++++++-- source/ubl-settings-quotas.h | 6 ----- source/util.h | 23 +------------------ 6 files changed, 68 insertions(+), 30 deletions(-) create mode 100644 source/my_type.h create mode 100644 source/project_lib.h diff --git a/source/CMakeLists.txt b/source/CMakeLists.txt index c4a700b..6449680 100644 --- a/source/CMakeLists.txt +++ b/source/CMakeLists.txt @@ -16,8 +16,10 @@ set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -pedantic -Wall -Wextra -Werror -Wmissin -fstack-clash-protection -fcf-protection -g") set(SOURCE_FILES + project_lib.h ubl-settings-quotas.h ubl-settings-quotas.cc + my_type.h save.h save.cc load.h diff --git a/source/my_type.h b/source/my_type.h new file mode 100644 index 0000000..7431181 --- /dev/null +++ b/source/my_type.h @@ -0,0 +1,11 @@ +#ifndef MY_TYPE_H +#define MY_TYPE_H + +#include +#include +typedef unsigned long max_num_T; + +tuple tuple_user_grups; + +#endif \ No newline at end of file diff --git a/source/project_lib.h b/source/project_lib.h new file mode 100644 index 0000000..907db55 --- /dev/null +++ b/source/project_lib.h @@ -0,0 +1,42 @@ +#ifndef PROJECT_LIB_H +#define PROJECT_LIB_H + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "ubl-util-standard.c" + +#endif \ No newline at end of file diff --git a/source/ubl-settings-quotas.cc b/source/ubl-settings-quotas.cc index ef9f7b8..665d2ae 100755 --- a/source/ubl-settings-quotas.cc +++ b/source/ubl-settings-quotas.cc @@ -177,11 +177,22 @@ void MainWindow::add_CSS() { boxButton_css->add_class("bkim_no_plug"); boxSave_css->add_class("bkim_no_plug"); } - headLabel_css->add_class("textHead"); } +/* +void init_treeview_user() { +} +void MainWindow::view_add_data(Gtk::TreeModel::Row &row, Glib::RefPtr list_store_m , std::array, 5> &arr_view , size_t index) { + row = *(list_store_m->append()); + bool flag_chb = false; + string name = arr_view[0][index]; + row[m_columns.check_button] = flag_chb; + row[m_columns.name] = _(name.c_str()); + row[m_columns.description] = _(arr_view[1][index].c_str()); +} +*/ void MainWindow::get_builder() { builder->set_translation_domain(path_app); @@ -293,7 +304,6 @@ void MainWindow::get_builder() { builder->get_widget("quoteuserFilesSoftLimitlabel", quoteuserFilesSoftLimitlabel); builder->get_widget("QuotasEditWindow", QuotasEditWindow); builder->get_widget("QuotasUserEditWindow", QuotasUserEditWindow); - } void MainWindow::event() { diff --git a/source/ubl-settings-quotas.h b/source/ubl-settings-quotas.h index a26f830..b953ff4 100644 --- a/source/ubl-settings-quotas.h +++ b/source/ubl-settings-quotas.h @@ -1,12 +1,6 @@ #ifndef UBL_SETTINGS_QUOTAS_H #define UBL_SETTINGS_QUOTAS_H -#include -#include -#include -#include -#include -#include "ubl-util-standard.c" #include "util.h" diff --git a/source/util.h b/source/util.h index 9044b95..603e9a3 100644 --- a/source/util.h +++ b/source/util.h @@ -1,27 +1,6 @@ #ifndef UTIL_H #define UTIL_H -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include +#include "project_lib.h" using namespace std; From 7b57b7d5141f8946ee7aa443667192e964c52710 Mon Sep 17 00:00:00 2001 From: Igor Belitskiy Date: Fri, 7 Apr 2023 17:56:59 +0600 Subject: [PATCH 12/51] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=D1=8B=20=D0=BD=D0=BE=D0=B2=D1=8B=D0=B5=20=D1=84?= =?UTF-8?q?=D0=B0=D0=B9=D0=BB,=20=D0=B4=D0=BB=D1=8F=20=D0=B1=D0=BE=D0=BB?= =?UTF-8?q?=D0=B5=D0=B5=20=D1=83=D0=BD=D0=B8=D0=B2=D0=B5=D1=80=D1=81=D0=B0?= =?UTF-8?q?=D0=BB=D1=8C=D0=BD=D0=BE=D0=B9=20=D1=80=D0=B0=D0=B7=D1=80=D0=B0?= =?UTF-8?q?=D0=B1=D0=BE=D1=82=D0=BA=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- source/CMakeLists.txt | 2 + source/main.cc | 2 +- source/my_plug.cc | 41 ++++++++ source/my_plug.h | 20 ++++ source/my_type.h | 25 ++++- source/project_lib.h | 15 --- source/ubl-settings-quotas.cc | 173 +++++++++++++++++++++++++++------- source/ubl-settings-quotas.h | 52 ++++++---- ubl-settings-quotas.glade | 104 ++++++++++++++++++-- ubl-settings-quotas_ru.po | 8 +- 10 files changed, 358 insertions(+), 84 deletions(-) create mode 100644 source/my_plug.cc create mode 100644 source/my_plug.h diff --git a/source/CMakeLists.txt b/source/CMakeLists.txt index 6449680..1223788 100644 --- a/source/CMakeLists.txt +++ b/source/CMakeLists.txt @@ -28,6 +28,8 @@ set(SOURCE_FILES my_process.cc util.h util.cc + my_plug.h + my_plug.cc ubl-util-standard.h ubl-util-standard.c main.cc) diff --git a/source/main.cc b/source/main.cc index a0ef5e8..3426bf9 100644 --- a/source/main.cc +++ b/source/main.cc @@ -1,5 +1,5 @@ #include "ubl-settings-quotas.h" - +#include "my_plug.h" void pars_flag(int index_start, int argc, char* argv[]); diff --git a/source/my_plug.cc b/source/my_plug.cc new file mode 100644 index 0000000..db266d9 --- /dev/null +++ b/source/my_plug.cc @@ -0,0 +1,41 @@ +#ifndef MY_PLUG_H +#define MY_PLUG_H + +#include "my_plug.h" +#include "ubl-settings-quotas.h" + + + + +CmdArgParser::CmdArgParser(const std::string& p_name, const std::string& p_description, const std::string& p_help) +: Glib::OptionGroup{p_name, p_description, p_help} { + Glib::OptionEntry socketIDArg; + socketIDArg.set_long_name("socket-id"); + socketIDArg.set_flags(Glib::OptionEntry::FLAG_IN_MAIN); + socketIDArg.set_description("Settings manager socket"); + Glib::OptionEntry socketExtId; + socketExtId.set_long_name("socket-ext-id"); + socketExtId.set_flags(Glib::OptionEntry::FLAG_IN_MAIN); + socketExtId.set_description("Settings manager secondary socket"); + Glib::OptionEntry socketTrdId; + socketTrdId.set_long_name("socket-trd-id"); + socketTrdId.set_flags(Glib::OptionEntry::FLAG_IN_MAIN); + socketTrdId.set_description("Settings manager secondary socket"); + add_entry(socketIDArg, m_socketID); + add_entry(socketExtId, socket_ext_id_I); + add_entry(socketTrdId, socket_trd_id_I); +} +::Window CmdArgParser::GetSocketID() const{ + return m_socketID; +} + +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(); +} +#endif \ No newline at end of file diff --git a/source/my_plug.h b/source/my_plug.h new file mode 100644 index 0000000..7b98857 --- /dev/null +++ b/source/my_plug.h @@ -0,0 +1,20 @@ +#include "project_lib.h" + + +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 SettingsPlug : public Gtk::Plug{ +public: + Gtk::Window *window; + SettingsPlug(::Window p_socketID, Glib::RefPtr builder); + +private: + Gtk::Widget *plugBox; + Gtk::Widget *parent; +}; \ No newline at end of file diff --git a/source/my_type.h b/source/my_type.h index 7431181..f92948e 100644 --- a/source/my_type.h +++ b/source/my_type.h @@ -1,11 +1,28 @@ #ifndef MY_TYPE_H #define MY_TYPE_H -#include -#include +#include "project_lib.h" + +using namespace std; + typedef unsigned long max_num_T; -tuple tuple_user_grups; +struct users_grups{ + string name; + bool state; + max_num_T size_data; + max_num_T soft_limit_size; + max_num_T severe_restriction_size; + max_num_T postponement_size_brat; + max_num_T hard_limit_activation_time_size; + max_num_T file; + max_num_T soft_file_limitation; + max_num_T hard_file_restriction; + max_num_T postponement_hard_file_restriction; + max_num_T hard_limit_activation_time; + }; +typedef struct users_grups USER_GRUPS; +typedef map map_str_str; +typedef map * map_s_s_ptr; #endif \ No newline at end of file diff --git a/source/project_lib.h b/source/project_lib.h index 907db55..da1025e 100644 --- a/source/project_lib.h +++ b/source/project_lib.h @@ -2,38 +2,23 @@ #define PROJECT_LIB_H #include -#include #include -#include #include #include #include #include -#include -#include #include #include #include -#include -#include -#include -#include #include #include -#include -#include #include #include -#include #include -#include -#include -#include #include #include #include #include -#include #include #include #include diff --git a/source/ubl-settings-quotas.cc b/source/ubl-settings-quotas.cc index 665d2ae..4e869d8 100755 --- a/source/ubl-settings-quotas.cc +++ b/source/ubl-settings-quotas.cc @@ -11,29 +11,8 @@ const string path_img_head_background = "/usr/share/ubl-settings-quotas/images/l int socket_ext_id_I = 0; int socket_trd_id_I = 0; -string version_application = "1.0"; -CmdArgParser::CmdArgParser(const std::string& p_name, const std::string& p_description, const std::string& p_help) -: Glib::OptionGroup{p_name, p_description, p_help} { - Glib::OptionEntry socketIDArg; - socketIDArg.set_long_name("socket-id"); - socketIDArg.set_flags(Glib::OptionEntry::FLAG_IN_MAIN); - socketIDArg.set_description("Settings manager socket"); - Glib::OptionEntry socketExtId; - socketExtId.set_long_name("socket-ext-id"); - socketExtId.set_flags(Glib::OptionEntry::FLAG_IN_MAIN); - socketExtId.set_description("Settings manager secondary socket"); - Glib::OptionEntry socketTrdId; - socketTrdId.set_long_name("socket-trd-id"); - socketTrdId.set_flags(Glib::OptionEntry::FLAG_IN_MAIN); - socketTrdId.set_description("Settings manager secondary socket"); - add_entry(socketIDArg, m_socketID); - add_entry(socketExtId, socket_ext_id_I); - add_entry(socketTrdId, socket_trd_id_I); -} -::Window CmdArgParser::GetSocketID() const{ - return m_socketID; -} +string version_application = "1.0"; MainWindow::MainWindow(BaseObjectType* obj, Glib::RefPtr const& builder) : Gtk::ApplicationWindow(obj), builder{builder} { @@ -89,10 +68,10 @@ void MainWindow::lacalization() { UsersTabLabel->set_text(_("Users")); generalDeviceLabel->set_text(_("Device:")); generalFileSystemLabel->set_text(_("File system:")); - generalGroupsFrameLabel->set_text(_("quotas for groups")); + generalGroupsFrameLabel->set_text(_("Quotas for groups")); generalGroupsEnableCheck->set_label(_("Enable")); generalUsersEnableCheck->set_label(_("Enable")); - generalUsersFrameLabel->set_label(_("quotas for users")); + generalUsersFrameLabel->set_label(_("Quotas for users")); generalGroupsSizeLabel->set_text(_("Excess size delay period")); generalGroupsFilesLabel->set_text(_("Excess files delay period")); generalUsersSizeLabel->set_text(_("Excess size delay period")); @@ -346,14 +325,144 @@ void MainWindow::info_status_app(string stule) { 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 MainWindow::init_dict(string flag_load) { + std::map map_gui_cfg_n; + map_gui_cfg_n[""] = ""; + + map_gui_cfg = map_gui_cfg_n; + if (flag_load == "global") { + map_global_cfg = map_gui_cfg_n; + } + else if (flag_load == "system") { + map_system_cfg = map_gui_cfg_n; + } +} + +bool MainWindow::save_template(string section, string flag_save) { + bool flag_no_save = true; + obj_save.set_data_local(map_system_cfg); + obj_save.set_data_global(map_global_cfg); + obj_save.set_data_gui(map_gui_cfg); + obj_save.set_vec_params(vec_param_names); + obj_save.save(section, flag_save); + vector obj_vec_error = obj_save.get_error(); + flag_no_save = obj_save.get_state_save(); + return flag_no_save; +} + +void MainWindow::wrapper_save_all_cfg() { + this->set_data_cfg(); + bool _flag_save_global = this->save_template("boot", "global");; + bool _flag_save_local = this->save_template("boot", "system"); + if (_flag_save_global && _flag_save_local) { + this->info_warning_error(5); + } + else { + info_warning_error(4); + } + map_global_cfg = map_gui_cfg; + map_system_cfg = map_gui_cfg; + +} + +void MainWindow::load_global_cfg() { + this->load_template(&map_global_cfg, "global"); + info_warning_error(1); + map_gui_cfg = map_global_cfg; +} + +void MainWindow::load_system_cfg() { + this->load_template(&map_system_cfg, "system"); + info_warning_error(0); + map_gui_cfg = map_system_cfg; +} + +void MainWindow::set_data_cfg() { + // TODO: + // Написать функцию +} +void MainWindow::wrapper_save_global_cfg() { + this->set_data_cfg(); + if (this->save_template("boot", "global")) { + this->info_warning_error(5); + } + else { + info_warning_error(3); + } + map_global_cfg = map_gui_cfg; + +} + +void MainWindow::wrapper_save_local_cfg() { + this->set_data_cfg(); + if (this->save_template("boot", "system")) { + this->info_warning_error(5); + } + else { + info_warning_error(2); + } + map_system_cfg = map_gui_cfg; +} + +void MainWindow::load_template(map_str_str* map_temp, string str_load) { + this->init_dict(str_load); + string sections; + sections = "boot"; + obj_load.set_sections(sections); + *map_temp = obj_load.get_load_data(*map_temp, str_load); +} + +void MainWindow::info_warning_error(int mess) { + if (obj_load.get_count_error() > 0 || obj_save.get_count_error() > 0) { + info_status_app("boxInfoMessError"); + imgInfo->set_from_icon_name("com.ublinux.ubl-settings-bootloader.warning", Gtk::ICON_SIZE_MENU); + string mess_error = ""; + if (mess == 0) { + mess_error = string(_("Local configuration reading error")) + str_cmd_error; + lblWarning->set_text(mess_error); + } + else if (mess == 1) { + mess_error = string(_("Global configuration read error")) + str_cmd_error; + lblWarning->set_text(mess_error); + } + else if (mess == 2) { + mess_error = string(_("Local configuration write error")) + str_cmd_error; + lblWarning->set_text(mess_error); + } + else if (mess == 3) { + mess_error = string(_("Global configuration write error")) + str_cmd_error; + lblWarning->set_text(mess_error); + } + else if (mess == 4) { + mess_error = string(_("Error saved local and global configuration")) + str_cmd_error; + lblWarning->set_text(mess_error); + } + str_cmd_error = ""; + obj_load.set_count_error(0); + obj_save.set_count_error(0); + } + else { + info_status_app("boxInfoMessOK"); + imgInfo->set_from_icon_name("com.ublinux.ubl-settings-bootloader.checked", Gtk::ICON_SIZE_MENU); + if (mess == 0) { + lblWarning->set_text(_("Local configuration downloaded successfully")); + } + else if (mess == 1) { + lblWarning->set_text(_("Global configuration downloaded successfully")); + } + else if (mess == 2) { + lblWarning->set_text(_("Local configuration successfully written")); + } + else if (mess == 3) { + lblWarning->set_text(_("Global configuration successfully written")); + } + else if (mess == 4) { + lblWarning->set_text(_("Successfully saved local and global configuration")); + } + else if (mess == 5) { + lblWarning->set_text(_("Nothing to save!")); + } + } } void help() { diff --git a/source/ubl-settings-quotas.h b/source/ubl-settings-quotas.h index b953ff4..b3ba81a 100644 --- a/source/ubl-settings-quotas.h +++ b/source/ubl-settings-quotas.h @@ -2,8 +2,15 @@ #define UBL_SETTINGS_QUOTAS_H #include "util.h" +#include "load.h" +#include "save.h" +#include "my_process.h" +#include "my_type.h" +extern int socket_ext_id_I; +extern int socket_trd_id_I; + using namespace std; extern const string path_app; @@ -12,17 +19,10 @@ 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: @@ -155,7 +155,20 @@ class MainWindow : public Gtk::ApplicationWindow { Gtk::Label *quotegroupSizeSoftLimitLabel; Gtk::Label *quoteuserFilesSoftLimitlabel; Gtk::Window *QuotasUserEditWindow; - Gtk::Window *QuotasEditWindow; + Gtk::Window *QuotasEditWindow; + + public: + Lib_save::Save obj_save = Lib_save::Save(); + Lib_Load::Load obj_load = Lib_Load::Load(); + vector vec_param_names; + My_Process::My_Process_system obj_process_system = My_Process::My_Process_system(); + My_Process::My_Process_call obj_process_call = My_Process::My_Process_call(); + map_str_str map_gui_cfg; + map_str_str map_global_cfg; + map_str_str map_system_cfg; + + string str_cmd_error; + public: MainWindow(BaseObjectType* obj, Glib::RefPtr const& builder); MainWindow(Glib::RefPtr const& builder); @@ -167,19 +180,20 @@ class MainWindow : public Gtk::ApplicationWindow { void info_status_app(string stule); void groupsFilters_show(); void init_tree_view(); + void load_template(map_str_str* map_temp, string str_load); + void info_warning_error(int mess); + void wrapper_save_local_cfg(); + void wrapper_save_global_cfg(); + void wrapper_save_all_cfg(); + void init_dict(string flag_load); + void set_data_cfg(); + void load_global_cfg(); + void load_system_cfg(); + bool save_template(string section, string flag_save); void view_add_columns(Gtk::TreeView &treeView); }; -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/ubl-settings-quotas.glade b/ubl-settings-quotas.glade index 7e731f6..56c9797 100644 --- a/ubl-settings-quotas.glade +++ b/ubl-settings-quotas.glade @@ -742,7 +742,7 @@ - 135 + 0 True False 5 @@ -756,6 +756,24 @@ 2 + + + True + False + 5 + 5 + 5 + 5 + 6 + 6 + **** + + + False + True + 3 + + False @@ -1205,7 +1223,7 @@ True False - quotas for groups + Quotas for groups 0 @@ -1659,7 +1677,7 @@ True False - quotas for users + Quotas for users 0
@@ -1733,6 +1751,24 @@ 2 + + + True + False + 5 + 5 + 5 + 5 + 6 + 6 + **** + + + False + True + 3 + + Filters @@ -1743,7 +1779,7 @@ False True - 3 + 4 @@ -1835,6 +1871,24 @@ 2 + + + True + False + 5 + 5 + 5 + 5 + 6 + 6 + **** + + + False + True + 3 + + Filters @@ -1845,7 +1899,7 @@ False True - 3 + 4 @@ -2157,8 +2211,8 @@
False - UBConfig - Quotas - com.ublinux.ubl-settings-quotas + start + False True @@ -2698,6 +2752,22 @@ + + + True + False + UBConfig - Quotas + + + True + False + 32 + com.ublinux.ubl-settings-quotas + 5 + + + + 1000000 @@ -2721,8 +2791,8 @@ False - UBConfig - Quotas - com.ublinux.ubl-settings-quotas + start + False True @@ -3268,5 +3338,21 @@ + + + True + False + UBConfig - Quotas + + + True + False + 32 + com.ublinux.ubl-settings-quotas + 5 + + + + diff --git a/ubl-settings-quotas_ru.po b/ubl-settings-quotas_ru.po index e2975c4..92410aa 100644 --- a/ubl-settings-quotas_ru.po +++ b/ubl-settings-quotas_ru.po @@ -368,13 +368,13 @@ msgstr "имя" #: source/ubl-settings-quotas.cc:92 source/ubl-settings-quotas.cc:89 #: source/ubl-settings-quotas.cc:86 source/ubl-settings-quotas.cc:85 -msgid "quotas for groups" -msgstr "квоты для групп" +msgid "Quotas for groups" +msgstr "Квоты для групп" #: source/ubl-settings-quotas.cc:95 source/ubl-settings-quotas.cc:92 #: source/ubl-settings-quotas.cc:89 source/ubl-settings-quotas.cc:88 -msgid "quotas for users" -msgstr "квоты для пользователей" +msgid "Quotas for users" +msgstr "Квоты для пользователей" #: source/ubl-settings-quotas.cc:350 source/ubl-settings-quotas.cc:371 #: source/ubl-settings-quotas.cc:318 source/ubl-settings-quotas.cc:267 From 67fc59263872f8537e8f7164d2530d58f72157e1 Mon Sep 17 00:00:00 2001 From: Igor Belitskiy Date: Mon, 10 Apr 2023 09:22:20 +0000 Subject: [PATCH 13/51] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=B8?= =?UTF-8?q?=D0=BB=20=D1=81=D1=82=D0=B8=D0=BB=D0=B8=20=D0=B4=D0=BB=D1=8F=20?= =?UTF-8?q?=D0=BA=D0=BD=D0=BE=D0=BF=D0=BE=D0=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- source/my_plug.cc | 3 - source/ubl-settings-quotas.cc | 7 + ubl-settings-quotas.glade | 20 ++- ubl-settings-quotas.pot | 277 +++++++++++++++++++++--------- ubl-settings-quotas_ru.po | 313 +++++++++++++++++++++++----------- 5 files changed, 436 insertions(+), 184 deletions(-) diff --git a/source/my_plug.cc b/source/my_plug.cc index db266d9..966d79b 100644 --- a/source/my_plug.cc +++ b/source/my_plug.cc @@ -4,9 +4,6 @@ #include "my_plug.h" #include "ubl-settings-quotas.h" - - - CmdArgParser::CmdArgParser(const std::string& p_name, const std::string& p_description, const std::string& p_help) : Glib::OptionGroup{p_name, p_description, p_help} { Glib::OptionEntry socketIDArg; diff --git a/source/ubl-settings-quotas.cc b/source/ubl-settings-quotas.cc index 4e869d8..9928ec8 100755 --- a/source/ubl-settings-quotas.cc +++ b/source/ubl-settings-quotas.cc @@ -139,6 +139,13 @@ void MainWindow::lacalization() { quoteuserFilesHarLimitLabel->set_text(_("files")); quoteuserFilesSoftLimitlabel->set_text(_("files")); quotegroupFileSystemLabel->set_text(_("File system:")); + btnLoadGlob->set_label(_("Load from global configuration")); + btnLoadLocal->set_label(_("Load from local configuration")); + btnAbout->set_label(_("About")); + btnSynopsis->set_label(_("Help")); + btnSaveLocalGlob->set_label(_("Save to global and local configuration")); + btnSaveGlob->set_label(_("Save to global configuration")); + btnSaveLocal->set_label(_("Save to local configuration")); } void MainWindow::add_CSS() { diff --git a/ubl-settings-quotas.glade b/ubl-settings-quotas.glade index 56c9797..12bf6d2 100644 --- a/ubl-settings-quotas.glade +++ b/ubl-settings-quotas.glade @@ -524,7 +524,7 @@ False Help
@@ -534,6 +534,9 @@ False About True +
@@ -546,6 +549,9 @@ False Load from global configuration True + @@ -554,6 +560,9 @@ False Load from local configuration True + @@ -566,6 +575,9 @@ False Save to global and local configuration True + @@ -574,6 +586,9 @@ False Save to global configuration True + @@ -582,6 +597,9 @@ False Save to local configuration True + diff --git a/ubl-settings-quotas.pot b/ubl-settings-quotas.pot index 2a9b1b5..14d9572 100644 --- a/ubl-settings-quotas.pot +++ b/ubl-settings-quotas.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-04-05 09:19+0600\n" +"POT-Creation-Date: 2023-04-10 09:09+0000\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -17,46 +17,59 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -#: source/ubl-settings-quotas.cc:124 source/ubl-settings-quotas.cc:121 -#: source/ubl-settings-quotas.cc:118 +#: source/ubl-settings-quotas.cc:144 +msgid "About" +msgstr "" + +#: source/ubl-settings-quotas.cc:103 source/ubl-settings-quotas.cc:124 +#: source/ubl-settings-quotas.cc:121 source/ubl-settings-quotas.cc:118 msgid "Configuration of disk quotas parameters for system groups and users" msgstr "" -#: source/ubl-settings-quotas.cc:81 source/ubl-settings-quotas.cc:78 -#: source/ubl-settings-quotas.cc:75 source/ubl-settings-quotas.cc:74 +#: source/ubl-settings-quotas.cc:60 source/ubl-settings-quotas.cc:81 +#: source/ubl-settings-quotas.cc:78 source/ubl-settings-quotas.cc:75 +#: source/ubl-settings-quotas.cc:74 msgid "Copyright © UBSoft LLC, 2022 - " msgstr "" -#: source/ubl-settings-quotas.cc:142 source/ubl-settings-quotas.cc:147 -#: source/ubl-settings-quotas.cc:152 source/ubl-settings-quotas.cc:139 -#: source/ubl-settings-quotas.cc:144 source/ubl-settings-quotas.cc:149 +#: source/ubl-settings-quotas.cc:121 source/ubl-settings-quotas.cc:126 +#: source/ubl-settings-quotas.cc:131 source/ubl-settings-quotas.cc:142 +#: source/ubl-settings-quotas.cc:147 source/ubl-settings-quotas.cc:152 +#: source/ubl-settings-quotas.cc:139 source/ubl-settings-quotas.cc:144 +#: source/ubl-settings-quotas.cc:149 msgid "Currently using:" msgstr "" -#: source/ubl-settings-quotas.cc:157 source/ubl-settings-quotas.cc:154 +#: source/ubl-settings-quotas.cc:136 source/ubl-settings-quotas.cc:157 +#: source/ubl-settings-quotas.cc:154 msgid "Currently using: " msgstr "" -#: source/ubl-settings-quotas.cc:83 source/ubl-settings-quotas.cc:80 -#: source/ubl-settings-quotas.cc:77 source/ubl-settings-quotas.cc:76 +#: source/ubl-settings-quotas.cc:62 source/ubl-settings-quotas.cc:83 +#: source/ubl-settings-quotas.cc:80 source/ubl-settings-quotas.cc:77 +#: source/ubl-settings-quotas.cc:76 msgid "Date and Time" msgstr "" -#: source/ubl-settings-quotas.cc:90 source/ubl-settings-quotas.cc:122 -#: source/ubl-settings-quotas.cc:123 source/ubl-settings-quotas.cc:137 -#: source/ubl-settings-quotas.cc:149 source/ubl-settings-quotas.cc:87 -#: source/ubl-settings-quotas.cc:119 source/ubl-settings-quotas.cc:120 -#: source/ubl-settings-quotas.cc:134 source/ubl-settings-quotas.cc:146 -#: source/ubl-settings-quotas.cc:84 source/ubl-settings-quotas.cc:116 +#: source/ubl-settings-quotas.cc:69 source/ubl-settings-quotas.cc:101 +#: source/ubl-settings-quotas.cc:102 source/ubl-settings-quotas.cc:116 +#: source/ubl-settings-quotas.cc:128 source/ubl-settings-quotas.cc:90 +#: source/ubl-settings-quotas.cc:122 source/ubl-settings-quotas.cc:123 +#: source/ubl-settings-quotas.cc:137 source/ubl-settings-quotas.cc:149 +#: source/ubl-settings-quotas.cc:87 source/ubl-settings-quotas.cc:119 +#: source/ubl-settings-quotas.cc:120 source/ubl-settings-quotas.cc:134 +#: source/ubl-settings-quotas.cc:146 source/ubl-settings-quotas.cc:84 #: source/ubl-settings-quotas.cc:117 source/ubl-settings-quotas.cc:83 msgid "Device:" msgstr "" +#: source/ubl-settings-quotas.cc:117 source/ubl-settings-quotas.cc:127 #: source/ubl-settings-quotas.cc:138 source/ubl-settings-quotas.cc:148 #: source/ubl-settings-quotas.cc:135 source/ubl-settings-quotas.cc:145 msgid "Disk quotas for this device:" msgstr "" +#: source/ubl-settings-quotas.cc:72 source/ubl-settings-quotas.cc:73 #: source/ubl-settings-quotas.cc:93 source/ubl-settings-quotas.cc:94 #: source/ubl-settings-quotas.cc:90 source/ubl-settings-quotas.cc:91 #: source/ubl-settings-quotas.cc:87 source/ubl-settings-quotas.cc:88 @@ -64,6 +77,11 @@ msgstr "" msgid "Enable" msgstr "" +#: source/ubl-settings-quotas.cc:444 +msgid "Error saved local and global configuration" +msgstr "" + +#: source/ubl-settings-quotas.cc:76 source/ubl-settings-quotas.cc:78 #: source/ubl-settings-quotas.cc:97 source/ubl-settings-quotas.cc:99 #: source/ubl-settings-quotas.cc:94 source/ubl-settings-quotas.cc:96 #: source/ubl-settings-quotas.cc:91 source/ubl-settings-quotas.cc:93 @@ -71,6 +89,7 @@ msgstr "" msgid "Excess files delay period" msgstr "" +#: source/ubl-settings-quotas.cc:75 source/ubl-settings-quotas.cc:77 #: source/ubl-settings-quotas.cc:96 source/ubl-settings-quotas.cc:98 #: source/ubl-settings-quotas.cc:93 source/ubl-settings-quotas.cc:95 #: source/ubl-settings-quotas.cc:90 source/ubl-settings-quotas.cc:92 @@ -78,16 +97,20 @@ msgstr "" msgid "Excess size delay period" msgstr "" -#: source/ubl-settings-quotas.cc:91 source/ubl-settings-quotas.cc:116 -#: source/ubl-settings-quotas.cc:117 source/ubl-settings-quotas.cc:155 -#: source/ubl-settings-quotas.cc:162 source/ubl-settings-quotas.cc:88 -#: source/ubl-settings-quotas.cc:113 source/ubl-settings-quotas.cc:114 -#: source/ubl-settings-quotas.cc:152 source/ubl-settings-quotas.cc:85 -#: source/ubl-settings-quotas.cc:110 source/ubl-settings-quotas.cc:111 -#: source/ubl-settings-quotas.cc:84 +#: source/ubl-settings-quotas.cc:70 source/ubl-settings-quotas.cc:95 +#: source/ubl-settings-quotas.cc:96 source/ubl-settings-quotas.cc:134 +#: source/ubl-settings-quotas.cc:141 source/ubl-settings-quotas.cc:91 +#: source/ubl-settings-quotas.cc:116 source/ubl-settings-quotas.cc:117 +#: source/ubl-settings-quotas.cc:155 source/ubl-settings-quotas.cc:162 +#: source/ubl-settings-quotas.cc:88 source/ubl-settings-quotas.cc:113 +#: source/ubl-settings-quotas.cc:114 source/ubl-settings-quotas.cc:152 +#: source/ubl-settings-quotas.cc:85 source/ubl-settings-quotas.cc:110 +#: source/ubl-settings-quotas.cc:111 source/ubl-settings-quotas.cc:84 msgid "File system:" msgstr "" +#: source/ubl-settings-quotas.cc:111 source/ubl-settings-quotas.cc:120 +#: source/ubl-settings-quotas.cc:135 source/ubl-settings-quotas.cc:321 #: source/ubl-settings-quotas.cc:132 source/ubl-settings-quotas.cc:141 #: source/ubl-settings-quotas.cc:156 source/ubl-settings-quotas.cc:325 #: source/ubl-settings-quotas.cc:129 source/ubl-settings-quotas.cc:138 @@ -96,6 +119,7 @@ msgstr "" msgid "Files" msgstr "" +#: source/ubl-settings-quotas.cc:97 source/ubl-settings-quotas.cc:98 #: source/ubl-settings-quotas.cc:118 source/ubl-settings-quotas.cc:119 #: source/ubl-settings-quotas.cc:115 source/ubl-settings-quotas.cc:116 #: source/ubl-settings-quotas.cc:112 source/ubl-settings-quotas.cc:113 @@ -111,20 +135,41 @@ msgid "" " -V, --version\t Show package version\n" msgstr "" -#: source/ubl-settings-quotas.cc:87 source/ubl-settings-quotas.cc:84 -#: source/ubl-settings-quotas.cc:81 source/ubl-settings-quotas.cc:80 +#: source/ubl-settings-quotas.cc:66 source/ubl-settings-quotas.cc:87 +#: source/ubl-settings-quotas.cc:84 source/ubl-settings-quotas.cc:81 +#: source/ubl-settings-quotas.cc:80 msgid "General settings" msgstr "" -#: source/ubl-settings-quotas.cc:139 source/ubl-settings-quotas.cc:136 +#: source/ubl-settings-quotas.cc:458 +msgid "Global configuration downloaded successfully" +msgstr "" + +#: source/ubl-settings-quotas.cc:432 +msgid "Global configuration read error" +msgstr "" + +#: source/ubl-settings-quotas.cc:464 +msgid "Global configuration successfully written" +msgstr "" + +#: source/ubl-settings-quotas.cc:440 +msgid "Global configuration write error" +msgstr "" + +#: source/ubl-settings-quotas.cc:118 source/ubl-settings-quotas.cc:139 +#: source/ubl-settings-quotas.cc:136 msgid "Group quotas for this device:" msgstr "" -#: source/ubl-settings-quotas.cc:88 source/ubl-settings-quotas.cc:85 -#: source/ubl-settings-quotas.cc:82 source/ubl-settings-quotas.cc:81 +#: source/ubl-settings-quotas.cc:67 source/ubl-settings-quotas.cc:88 +#: source/ubl-settings-quotas.cc:85 source/ubl-settings-quotas.cc:82 +#: source/ubl-settings-quotas.cc:81 msgid "Groups" msgstr "" +#: source/ubl-settings-quotas.cc:123 source/ubl-settings-quotas.cc:124 +#: source/ubl-settings-quotas.cc:133 source/ubl-settings-quotas.cc:138 #: source/ubl-settings-quotas.cc:144 source/ubl-settings-quotas.cc:145 #: source/ubl-settings-quotas.cc:154 source/ubl-settings-quotas.cc:159 #: source/ubl-settings-quotas.cc:141 source/ubl-settings-quotas.cc:142 @@ -132,107 +177,166 @@ msgstr "" msgid "Hard limit" msgstr "" -#: source/ubl-settings-quotas.cc:324 source/ubl-settings-quotas.cc:316 -#: source/ubl-settings-quotas.cc:263 +#: source/ubl-settings-quotas.cc:320 source/ubl-settings-quotas.cc:324 +#: source/ubl-settings-quotas.cc:316 source/ubl-settings-quotas.cc:263 msgid "" "Hard limit\n" "(Size) activation\n" "time" msgstr "" -#: source/ubl-settings-quotas.cc:327 source/ubl-settings-quotas.cc:319 -#: source/ubl-settings-quotas.cc:266 +#: source/ubl-settings-quotas.cc:323 source/ubl-settings-quotas.cc:327 +#: source/ubl-settings-quotas.cc:319 source/ubl-settings-quotas.cc:266 msgid "" "Hard limit\n" "(files)" msgstr "" -#: source/ubl-settings-quotas.cc:329 source/ubl-settings-quotas.cc:321 -#: source/ubl-settings-quotas.cc:268 +#: source/ubl-settings-quotas.cc:325 source/ubl-settings-quotas.cc:329 +#: source/ubl-settings-quotas.cc:321 source/ubl-settings-quotas.cc:268 msgid "" "Hard limit\n" "(files) activation\n" "time" msgstr "" -#: source/ubl-settings-quotas.cc:328 source/ubl-settings-quotas.cc:320 -#: source/ubl-settings-quotas.cc:267 +#: source/ubl-settings-quotas.cc:324 source/ubl-settings-quotas.cc:328 +#: source/ubl-settings-quotas.cc:320 source/ubl-settings-quotas.cc:267 msgid "" "Hard limit\n" "(files) delay" msgstr "" -#: source/ubl-settings-quotas.cc:322 source/ubl-settings-quotas.cc:314 -#: source/ubl-settings-quotas.cc:261 +#: source/ubl-settings-quotas.cc:318 source/ubl-settings-quotas.cc:322 +#: source/ubl-settings-quotas.cc:314 source/ubl-settings-quotas.cc:261 msgid "" "Hard limit\n" "(size)" msgstr "" -#: source/ubl-settings-quotas.cc:323 source/ubl-settings-quotas.cc:315 -#: source/ubl-settings-quotas.cc:262 +#: source/ubl-settings-quotas.cc:319 source/ubl-settings-quotas.cc:323 +#: source/ubl-settings-quotas.cc:315 source/ubl-settings-quotas.cc:262 msgid "" "Hard limit\n" "(size) delay" msgstr "" -#: source/ubl-settings-quotas.cc:136 source/ubl-settings-quotas.cc:133 -#: source/ubl-settings-quotas.cc:130 +#: source/ubl-settings-quotas.cc:115 source/ubl-settings-quotas.cc:136 +#: source/ubl-settings-quotas.cc:133 source/ubl-settings-quotas.cc:130 msgid "Hard limit (file) activation time" msgstr "" -#: source/ubl-settings-quotas.cc:134 source/ubl-settings-quotas.cc:131 -#: source/ubl-settings-quotas.cc:128 +#: source/ubl-settings-quotas.cc:113 source/ubl-settings-quotas.cc:134 +#: source/ubl-settings-quotas.cc:131 source/ubl-settings-quotas.cc:128 msgid "Hard limit (files)" msgstr "" -#: source/ubl-settings-quotas.cc:135 source/ubl-settings-quotas.cc:132 -#: source/ubl-settings-quotas.cc:129 +#: source/ubl-settings-quotas.cc:114 source/ubl-settings-quotas.cc:135 +#: source/ubl-settings-quotas.cc:132 source/ubl-settings-quotas.cc:129 msgid "Hard limit (files) delay" msgstr "" -#: source/ubl-settings-quotas.cc:129 source/ubl-settings-quotas.cc:126 -#: source/ubl-settings-quotas.cc:123 +#: source/ubl-settings-quotas.cc:108 source/ubl-settings-quotas.cc:129 +#: source/ubl-settings-quotas.cc:126 source/ubl-settings-quotas.cc:123 msgid "Hard limit (size)" msgstr "" -#: source/ubl-settings-quotas.cc:131 source/ubl-settings-quotas.cc:128 -#: source/ubl-settings-quotas.cc:125 +#: source/ubl-settings-quotas.cc:110 source/ubl-settings-quotas.cc:131 +#: source/ubl-settings-quotas.cc:128 source/ubl-settings-quotas.cc:125 msgid "Hard limit (size) activation time" msgstr "" -#: source/ubl-settings-quotas.cc:130 source/ubl-settings-quotas.cc:127 -#: source/ubl-settings-quotas.cc:124 +#: source/ubl-settings-quotas.cc:109 source/ubl-settings-quotas.cc:130 +#: source/ubl-settings-quotas.cc:127 source/ubl-settings-quotas.cc:124 msgid "Hard limit (size) delay" msgstr "" -#: source/ubl-settings-quotas.cc:120 source/ubl-settings-quotas.cc:117 -#: source/ubl-settings-quotas.cc:114 source/ubl-settings-quotas.cc:109 +#: source/ubl-settings-quotas.cc:145 +msgid "Help" +msgstr "" + +#: source/ubl-settings-quotas.cc:99 source/ubl-settings-quotas.cc:120 +#: source/ubl-settings-quotas.cc:117 source/ubl-settings-quotas.cc:114 +#: source/ubl-settings-quotas.cc:109 msgid "Load" msgstr "" +#: source/ubl-settings-quotas.cc:142 +msgid "Load from global configuration" +msgstr "" + +#: source/ubl-settings-quotas.cc:143 +msgid "Load from local configuration" +msgstr "" + +#: source/ubl-settings-quotas.cc:455 +msgid "Local configuration downloaded successfully" +msgstr "" + +#: source/ubl-settings-quotas.cc:428 +msgid "Local configuration reading error" +msgstr "" + +#: source/ubl-settings-quotas.cc:461 +msgid "Local configuration successfully written" +msgstr "" + +#: source/ubl-settings-quotas.cc:436 +msgid "Local configuration write error" +msgstr "" + +#: source/ubl-settings-quotas.cc:104 source/ubl-settings-quotas.cc:314 #: source/ubl-settings-quotas.cc:125 source/ubl-settings-quotas.cc:318 #: source/ubl-settings-quotas.cc:122 source/ubl-settings-quotas.cc:310 #: source/ubl-settings-quotas.cc:119 msgid "Name" msgstr "" -#: source/ubl-settings-quotas.cc:86 source/ubl-settings-quotas.cc:83 -#: source/ubl-settings-quotas.cc:80 source/ubl-settings-quotas.cc:79 +#: source/ubl-settings-quotas.cc:470 +msgid "Nothing to save!" +msgstr "" + +#: source/ubl-settings-quotas.cc:65 source/ubl-settings-quotas.cc:86 +#: source/ubl-settings-quotas.cc:83 source/ubl-settings-quotas.cc:80 +#: source/ubl-settings-quotas.cc:79 msgid "Project Home Page" msgstr "" +#: source/ubl-settings-quotas.cc:105 source/ubl-settings-quotas.cc:315 #: source/ubl-settings-quotas.cc:126 source/ubl-settings-quotas.cc:319 #: source/ubl-settings-quotas.cc:123 source/ubl-settings-quotas.cc:311 #: source/ubl-settings-quotas.cc:258 source/ubl-settings-quotas.cc:120 msgid "Quotas" msgstr "" -#: source/ubl-settings-quotas.cc:121 source/ubl-settings-quotas.cc:118 -#: source/ubl-settings-quotas.cc:115 source/ubl-settings-quotas.cc:110 +#: source/ubl-settings-quotas.cc:71 +msgid "Quotas for groups" +msgstr "" + +#: source/ubl-settings-quotas.cc:74 +msgid "Quotas for users" +msgstr "" + +#: source/ubl-settings-quotas.cc:100 source/ubl-settings-quotas.cc:121 +#: source/ubl-settings-quotas.cc:118 source/ubl-settings-quotas.cc:115 +#: source/ubl-settings-quotas.cc:110 msgid "Save" msgstr "" +#: source/ubl-settings-quotas.cc:146 +msgid "Save to global and local configuration" +msgstr "" + +#: source/ubl-settings-quotas.cc:147 +msgid "Save to global configuration" +msgstr "" + +#: source/ubl-settings-quotas.cc:148 +msgid "Save to local configuration" +msgstr "" + +#: source/ubl-settings-quotas.cc:106 source/ubl-settings-quotas.cc:119 +#: source/ubl-settings-quotas.cc:130 source/ubl-settings-quotas.cc:316 #: source/ubl-settings-quotas.cc:127 source/ubl-settings-quotas.cc:140 #: source/ubl-settings-quotas.cc:151 source/ubl-settings-quotas.cc:320 #: source/ubl-settings-quotas.cc:124 source/ubl-settings-quotas.cc:137 @@ -241,6 +345,8 @@ msgstr "" msgid "Size" msgstr "" +#: source/ubl-settings-quotas.cc:122 source/ubl-settings-quotas.cc:125 +#: source/ubl-settings-quotas.cc:132 source/ubl-settings-quotas.cc:137 #: source/ubl-settings-quotas.cc:143 source/ubl-settings-quotas.cc:146 #: source/ubl-settings-quotas.cc:153 source/ubl-settings-quotas.cc:158 #: source/ubl-settings-quotas.cc:140 source/ubl-settings-quotas.cc:150 @@ -248,44 +354,53 @@ msgstr "" msgid "Soft limit" msgstr "" -#: source/ubl-settings-quotas.cc:326 source/ubl-settings-quotas.cc:318 -#: source/ubl-settings-quotas.cc:265 +#: source/ubl-settings-quotas.cc:322 source/ubl-settings-quotas.cc:326 +#: source/ubl-settings-quotas.cc:318 source/ubl-settings-quotas.cc:265 msgid "" "Soft limit\n" "(files)" msgstr "" -#: source/ubl-settings-quotas.cc:321 source/ubl-settings-quotas.cc:313 -#: source/ubl-settings-quotas.cc:260 +#: source/ubl-settings-quotas.cc:317 source/ubl-settings-quotas.cc:321 +#: source/ubl-settings-quotas.cc:313 source/ubl-settings-quotas.cc:260 msgid "" "Soft limit\n" "(size)" msgstr "" -#: source/ubl-settings-quotas.cc:133 source/ubl-settings-quotas.cc:130 -#: source/ubl-settings-quotas.cc:127 +#: source/ubl-settings-quotas.cc:112 source/ubl-settings-quotas.cc:133 +#: source/ubl-settings-quotas.cc:130 source/ubl-settings-quotas.cc:127 msgid "Soft limit (files)" msgstr "" -#: source/ubl-settings-quotas.cc:128 source/ubl-settings-quotas.cc:125 -#: source/ubl-settings-quotas.cc:122 +#: source/ubl-settings-quotas.cc:107 source/ubl-settings-quotas.cc:128 +#: source/ubl-settings-quotas.cc:125 source/ubl-settings-quotas.cc:122 msgid "Soft limit (size)" msgstr "" -#: source/ubl-settings-quotas.cc:68 source/ubl-settings-quotas.cc:70 -#: source/ubl-settings-quotas.cc:67 source/ubl-settings-quotas.cc:66 +#: source/ubl-settings-quotas.cc:467 +msgid "Successfully saved local and global configuration" +msgstr "" + +#: source/ubl-settings-quotas.cc:47 source/ubl-settings-quotas.cc:68 +#: source/ubl-settings-quotas.cc:70 source/ubl-settings-quotas.cc:67 +#: source/ubl-settings-quotas.cc:66 msgid "The program must be run as root" msgstr "" -#: source/ubl-settings-quotas.cc:150 source/ubl-settings-quotas.cc:147 +#: source/ubl-settings-quotas.cc:129 source/ubl-settings-quotas.cc:150 +#: source/ubl-settings-quotas.cc:147 msgid "User quotas for this device: " msgstr "" -#: source/ubl-settings-quotas.cc:89 source/ubl-settings-quotas.cc:86 -#: source/ubl-settings-quotas.cc:83 source/ubl-settings-quotas.cc:82 +#: source/ubl-settings-quotas.cc:68 source/ubl-settings-quotas.cc:89 +#: source/ubl-settings-quotas.cc:86 source/ubl-settings-quotas.cc:83 +#: source/ubl-settings-quotas.cc:82 msgid "Users" msgstr "" +#: source/ubl-settings-quotas.cc:83 source/ubl-settings-quotas.cc:84 +#: source/ubl-settings-quotas.cc:85 source/ubl-settings-quotas.cc:86 #: source/ubl-settings-quotas.cc:104 source/ubl-settings-quotas.cc:105 #: source/ubl-settings-quotas.cc:106 source/ubl-settings-quotas.cc:107 #: source/ubl-settings-quotas.cc:101 source/ubl-settings-quotas.cc:102 @@ -295,11 +410,14 @@ msgstr "" msgid "days" msgstr "" +#: source/ubl-settings-quotas.cc:139 source/ubl-settings-quotas.cc:140 #: source/ubl-settings-quotas.cc:160 source/ubl-settings-quotas.cc:161 #: source/ubl-settings-quotas.cc:157 source/ubl-settings-quotas.cc:158 msgid "files" msgstr "" +#: source/ubl-settings-quotas.cc:87 source/ubl-settings-quotas.cc:88 +#: source/ubl-settings-quotas.cc:89 source/ubl-settings-quotas.cc:90 #: source/ubl-settings-quotas.cc:108 source/ubl-settings-quotas.cc:109 #: source/ubl-settings-quotas.cc:110 source/ubl-settings-quotas.cc:111 #: source/ubl-settings-quotas.cc:105 source/ubl-settings-quotas.cc:106 @@ -309,11 +427,14 @@ msgstr "" msgid "hours" msgstr "" -#: source/ubl-settings-quotas.cc:84 source/ubl-settings-quotas.cc:81 -#: source/ubl-settings-quotas.cc:78 source/ubl-settings-quotas.cc:77 +#: source/ubl-settings-quotas.cc:63 source/ubl-settings-quotas.cc:84 +#: source/ubl-settings-quotas.cc:81 source/ubl-settings-quotas.cc:78 +#: source/ubl-settings-quotas.cc:77 msgid "https://wiki.ublinux.com" msgstr "" +#: source/ubl-settings-quotas.cc:91 source/ubl-settings-quotas.cc:92 +#: source/ubl-settings-quotas.cc:93 source/ubl-settings-quotas.cc:94 #: source/ubl-settings-quotas.cc:112 source/ubl-settings-quotas.cc:113 #: source/ubl-settings-quotas.cc:114 source/ubl-settings-quotas.cc:115 #: source/ubl-settings-quotas.cc:109 source/ubl-settings-quotas.cc:110 @@ -337,12 +458,14 @@ msgstr "" msgid "quotas for users" msgstr "" -#: source/ubl-settings-quotas.cc:350 source/ubl-settings-quotas.cc:371 -#: source/ubl-settings-quotas.cc:318 source/ubl-settings-quotas.cc:267 -#: source/ubl-settings-quotas.cc:213 +#: source/ubl-settings-quotas.cc:476 source/ubl-settings-quotas.cc:350 +#: source/ubl-settings-quotas.cc:371 source/ubl-settings-quotas.cc:318 +#: source/ubl-settings-quotas.cc:267 source/ubl-settings-quotas.cc:213 msgid "ubl-settings-quotas version: " msgstr "" +#: source/ubl-settings-quotas.cc:79 source/ubl-settings-quotas.cc:80 +#: source/ubl-settings-quotas.cc:81 source/ubl-settings-quotas.cc:82 #: source/ubl-settings-quotas.cc:100 source/ubl-settings-quotas.cc:101 #: source/ubl-settings-quotas.cc:102 source/ubl-settings-quotas.cc:103 #: source/ubl-settings-quotas.cc:97 source/ubl-settings-quotas.cc:98 diff --git a/ubl-settings-quotas_ru.po b/ubl-settings-quotas_ru.po index 92410aa..cd8e2f6 100644 --- a/ubl-settings-quotas_ru.po +++ b/ubl-settings-quotas_ru.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: ublexec 1.0\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-04-05 09:18+0600\n" +"POT-Creation-Date: 2023-04-10 09:09+0000\n" "PO-Revision-Date: 2023-01-01 00:00+0600\n" "Last-Translator: UBLinux Team \n" "Language-Team: Russian - UBLinux Team \n" @@ -17,46 +17,59 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -#: source/ubl-settings-quotas.cc:124 source/ubl-settings-quotas.cc:121 -#: source/ubl-settings-quotas.cc:118 +#: source/ubl-settings-quotas.cc:144 +msgid "About" +msgstr "О программе" + +#: source/ubl-settings-quotas.cc:103 source/ubl-settings-quotas.cc:124 +#: source/ubl-settings-quotas.cc:121 source/ubl-settings-quotas.cc:118 msgid "Configuration of disk quotas parameters for system groups and users" msgstr "Настройка параметров дисковых квот для системных групп и пользователей" -#: source/ubl-settings-quotas.cc:81 source/ubl-settings-quotas.cc:78 -#: source/ubl-settings-quotas.cc:75 source/ubl-settings-quotas.cc:74 +#: source/ubl-settings-quotas.cc:60 source/ubl-settings-quotas.cc:81 +#: source/ubl-settings-quotas.cc:78 source/ubl-settings-quotas.cc:75 +#: source/ubl-settings-quotas.cc:74 msgid "Copyright © UBSoft LLC, 2022 - " msgstr "" -#: source/ubl-settings-quotas.cc:142 source/ubl-settings-quotas.cc:147 -#: source/ubl-settings-quotas.cc:152 source/ubl-settings-quotas.cc:139 -#: source/ubl-settings-quotas.cc:144 source/ubl-settings-quotas.cc:149 +#: source/ubl-settings-quotas.cc:121 source/ubl-settings-quotas.cc:126 +#: source/ubl-settings-quotas.cc:131 source/ubl-settings-quotas.cc:142 +#: source/ubl-settings-quotas.cc:147 source/ubl-settings-quotas.cc:152 +#: source/ubl-settings-quotas.cc:139 source/ubl-settings-quotas.cc:144 +#: source/ubl-settings-quotas.cc:149 msgid "Currently using:" msgstr "В настоящее время используется:" -#: source/ubl-settings-quotas.cc:157 source/ubl-settings-quotas.cc:154 +#: source/ubl-settings-quotas.cc:136 source/ubl-settings-quotas.cc:157 +#: source/ubl-settings-quotas.cc:154 msgid "Currently using: " msgstr "В настоящее время используется: " -#: source/ubl-settings-quotas.cc:83 source/ubl-settings-quotas.cc:80 -#: source/ubl-settings-quotas.cc:77 source/ubl-settings-quotas.cc:76 +#: source/ubl-settings-quotas.cc:62 source/ubl-settings-quotas.cc:83 +#: source/ubl-settings-quotas.cc:80 source/ubl-settings-quotas.cc:77 +#: source/ubl-settings-quotas.cc:76 msgid "Date and Time" msgstr "Дата и время" -#: source/ubl-settings-quotas.cc:90 source/ubl-settings-quotas.cc:122 -#: source/ubl-settings-quotas.cc:123 source/ubl-settings-quotas.cc:137 -#: source/ubl-settings-quotas.cc:149 source/ubl-settings-quotas.cc:87 -#: source/ubl-settings-quotas.cc:119 source/ubl-settings-quotas.cc:120 -#: source/ubl-settings-quotas.cc:134 source/ubl-settings-quotas.cc:146 -#: source/ubl-settings-quotas.cc:84 source/ubl-settings-quotas.cc:116 +#: source/ubl-settings-quotas.cc:69 source/ubl-settings-quotas.cc:101 +#: source/ubl-settings-quotas.cc:102 source/ubl-settings-quotas.cc:116 +#: source/ubl-settings-quotas.cc:128 source/ubl-settings-quotas.cc:90 +#: source/ubl-settings-quotas.cc:122 source/ubl-settings-quotas.cc:123 +#: source/ubl-settings-quotas.cc:137 source/ubl-settings-quotas.cc:149 +#: source/ubl-settings-quotas.cc:87 source/ubl-settings-quotas.cc:119 +#: source/ubl-settings-quotas.cc:120 source/ubl-settings-quotas.cc:134 +#: source/ubl-settings-quotas.cc:146 source/ubl-settings-quotas.cc:84 #: source/ubl-settings-quotas.cc:117 source/ubl-settings-quotas.cc:83 msgid "Device:" msgstr "Устройство:" +#: source/ubl-settings-quotas.cc:117 source/ubl-settings-quotas.cc:127 #: source/ubl-settings-quotas.cc:138 source/ubl-settings-quotas.cc:148 #: source/ubl-settings-quotas.cc:135 source/ubl-settings-quotas.cc:145 msgid "Disk quotas for this device:" msgstr "Дисковые квоты для этого устройства:" +#: source/ubl-settings-quotas.cc:72 source/ubl-settings-quotas.cc:73 #: source/ubl-settings-quotas.cc:93 source/ubl-settings-quotas.cc:94 #: source/ubl-settings-quotas.cc:90 source/ubl-settings-quotas.cc:91 #: source/ubl-settings-quotas.cc:87 source/ubl-settings-quotas.cc:88 @@ -64,6 +77,12 @@ msgstr "Дисковые квоты для этого устройства:" msgid "Enable" msgstr "Включить" +#: source/ubl-settings-quotas.cc:444 +#, fuzzy +msgid "Error saved local and global configuration" +msgstr "Сохранить глобальную и локальную конфигурацию" + +#: source/ubl-settings-quotas.cc:76 source/ubl-settings-quotas.cc:78 #: source/ubl-settings-quotas.cc:97 source/ubl-settings-quotas.cc:99 #: source/ubl-settings-quotas.cc:94 source/ubl-settings-quotas.cc:96 #: source/ubl-settings-quotas.cc:91 source/ubl-settings-quotas.cc:93 @@ -71,6 +90,7 @@ msgstr "Включить" msgid "Excess files delay period" msgstr "Превышение периода задержки файлов" +#: source/ubl-settings-quotas.cc:75 source/ubl-settings-quotas.cc:77 #: source/ubl-settings-quotas.cc:96 source/ubl-settings-quotas.cc:98 #: source/ubl-settings-quotas.cc:93 source/ubl-settings-quotas.cc:95 #: source/ubl-settings-quotas.cc:90 source/ubl-settings-quotas.cc:92 @@ -78,16 +98,20 @@ msgstr "Превышение периода задержки файлов" msgid "Excess size delay period" msgstr "Период задержки превышения размера" -#: source/ubl-settings-quotas.cc:91 source/ubl-settings-quotas.cc:116 -#: source/ubl-settings-quotas.cc:117 source/ubl-settings-quotas.cc:155 -#: source/ubl-settings-quotas.cc:162 source/ubl-settings-quotas.cc:88 -#: source/ubl-settings-quotas.cc:113 source/ubl-settings-quotas.cc:114 -#: source/ubl-settings-quotas.cc:152 source/ubl-settings-quotas.cc:85 -#: source/ubl-settings-quotas.cc:110 source/ubl-settings-quotas.cc:111 -#: source/ubl-settings-quotas.cc:84 +#: source/ubl-settings-quotas.cc:70 source/ubl-settings-quotas.cc:95 +#: source/ubl-settings-quotas.cc:96 source/ubl-settings-quotas.cc:134 +#: source/ubl-settings-quotas.cc:141 source/ubl-settings-quotas.cc:91 +#: source/ubl-settings-quotas.cc:116 source/ubl-settings-quotas.cc:117 +#: source/ubl-settings-quotas.cc:155 source/ubl-settings-quotas.cc:162 +#: source/ubl-settings-quotas.cc:88 source/ubl-settings-quotas.cc:113 +#: source/ubl-settings-quotas.cc:114 source/ubl-settings-quotas.cc:152 +#: source/ubl-settings-quotas.cc:85 source/ubl-settings-quotas.cc:110 +#: source/ubl-settings-quotas.cc:111 source/ubl-settings-quotas.cc:84 msgid "File system:" msgstr "Файловая система:" +#: source/ubl-settings-quotas.cc:111 source/ubl-settings-quotas.cc:120 +#: source/ubl-settings-quotas.cc:135 source/ubl-settings-quotas.cc:321 #: source/ubl-settings-quotas.cc:132 source/ubl-settings-quotas.cc:141 #: source/ubl-settings-quotas.cc:156 source/ubl-settings-quotas.cc:325 #: source/ubl-settings-quotas.cc:129 source/ubl-settings-quotas.cc:138 @@ -96,6 +120,7 @@ msgstr "Файловая система:" msgid "Files" msgstr "Файлы" +#: source/ubl-settings-quotas.cc:97 source/ubl-settings-quotas.cc:98 #: source/ubl-settings-quotas.cc:118 source/ubl-settings-quotas.cc:119 #: source/ubl-settings-quotas.cc:115 source/ubl-settings-quotas.cc:116 #: source/ubl-settings-quotas.cc:112 source/ubl-settings-quotas.cc:113 @@ -117,20 +142,43 @@ msgstr "" " -h, --help\t Показать параметры справки\n" " -V, --version\t Показать версию пакета\n" -#: source/ubl-settings-quotas.cc:87 source/ubl-settings-quotas.cc:84 -#: source/ubl-settings-quotas.cc:81 source/ubl-settings-quotas.cc:80 +#: source/ubl-settings-quotas.cc:66 source/ubl-settings-quotas.cc:87 +#: source/ubl-settings-quotas.cc:84 source/ubl-settings-quotas.cc:81 +#: source/ubl-settings-quotas.cc:80 msgid "General settings" msgstr "Общие настройки" -#: source/ubl-settings-quotas.cc:139 source/ubl-settings-quotas.cc:136 +#: source/ubl-settings-quotas.cc:458 +msgid "Global configuration downloaded successfully" +msgstr "" + +#: source/ubl-settings-quotas.cc:432 +#, fuzzy +msgid "Global configuration read error" +msgstr "Сохранить глобальную конфигурацию" + +#: source/ubl-settings-quotas.cc:464 +msgid "Global configuration successfully written" +msgstr "" + +#: source/ubl-settings-quotas.cc:440 +#, fuzzy +msgid "Global configuration write error" +msgstr "Сохранить глобальную конфигурацию" + +#: source/ubl-settings-quotas.cc:118 source/ubl-settings-quotas.cc:139 +#: source/ubl-settings-quotas.cc:136 msgid "Group quotas for this device:" msgstr "Групповые квоты для этого устройства:" -#: source/ubl-settings-quotas.cc:88 source/ubl-settings-quotas.cc:85 -#: source/ubl-settings-quotas.cc:82 source/ubl-settings-quotas.cc:81 +#: source/ubl-settings-quotas.cc:67 source/ubl-settings-quotas.cc:88 +#: source/ubl-settings-quotas.cc:85 source/ubl-settings-quotas.cc:82 +#: source/ubl-settings-quotas.cc:81 msgid "Groups" msgstr "Группы" +#: source/ubl-settings-quotas.cc:123 source/ubl-settings-quotas.cc:124 +#: source/ubl-settings-quotas.cc:133 source/ubl-settings-quotas.cc:138 #: source/ubl-settings-quotas.cc:144 source/ubl-settings-quotas.cc:145 #: source/ubl-settings-quotas.cc:154 source/ubl-settings-quotas.cc:159 #: source/ubl-settings-quotas.cc:141 source/ubl-settings-quotas.cc:142 @@ -139,8 +187,8 @@ msgstr "Группы" msgid "Hard limit" msgstr "Жесткий предел" -#: source/ubl-settings-quotas.cc:324 source/ubl-settings-quotas.cc:316 -#: source/ubl-settings-quotas.cc:263 +#: source/ubl-settings-quotas.cc:320 source/ubl-settings-quotas.cc:324 +#: source/ubl-settings-quotas.cc:316 source/ubl-settings-quotas.cc:263 #, fuzzy msgid "" "Hard limit\n" @@ -150,8 +198,8 @@ msgstr "" "Жесткий предел\n" "(размер)" -#: source/ubl-settings-quotas.cc:327 source/ubl-settings-quotas.cc:319 -#: source/ubl-settings-quotas.cc:266 +#: source/ubl-settings-quotas.cc:323 source/ubl-settings-quotas.cc:327 +#: source/ubl-settings-quotas.cc:319 source/ubl-settings-quotas.cc:266 #, fuzzy msgid "" "Hard limit\n" @@ -160,8 +208,8 @@ msgstr "" "Жесткий лимит\n" "(файлы)" -#: source/ubl-settings-quotas.cc:329 source/ubl-settings-quotas.cc:321 -#: source/ubl-settings-quotas.cc:268 +#: source/ubl-settings-quotas.cc:325 source/ubl-settings-quotas.cc:329 +#: source/ubl-settings-quotas.cc:321 source/ubl-settings-quotas.cc:268 #, fuzzy msgid "" "Hard limit\n" @@ -171,8 +219,8 @@ msgstr "" "Время активации\n" "жесткого лимита (файла)" -#: source/ubl-settings-quotas.cc:328 source/ubl-settings-quotas.cc:320 -#: source/ubl-settings-quotas.cc:267 +#: source/ubl-settings-quotas.cc:324 source/ubl-settings-quotas.cc:328 +#: source/ubl-settings-quotas.cc:320 source/ubl-settings-quotas.cc:267 #, fuzzy msgid "" "Hard limit\n" @@ -181,8 +229,8 @@ msgstr "" "Жесткий лимит\n" "(файлы)" -#: source/ubl-settings-quotas.cc:322 source/ubl-settings-quotas.cc:314 -#: source/ubl-settings-quotas.cc:261 +#: source/ubl-settings-quotas.cc:318 source/ubl-settings-quotas.cc:322 +#: source/ubl-settings-quotas.cc:314 source/ubl-settings-quotas.cc:261 #, fuzzy msgid "" "Hard limit\n" @@ -191,8 +239,8 @@ msgstr "" "Жесткий предел\n" "(размер) задержки" -#: source/ubl-settings-quotas.cc:323 source/ubl-settings-quotas.cc:315 -#: source/ubl-settings-quotas.cc:262 +#: source/ubl-settings-quotas.cc:319 source/ubl-settings-quotas.cc:323 +#: source/ubl-settings-quotas.cc:315 source/ubl-settings-quotas.cc:262 #, fuzzy msgid "" "Hard limit\n" @@ -201,63 +249,124 @@ msgstr "" "Жесткий предел\n" "(размер) задержки" -#: source/ubl-settings-quotas.cc:136 source/ubl-settings-quotas.cc:133 -#: source/ubl-settings-quotas.cc:130 +#: source/ubl-settings-quotas.cc:115 source/ubl-settings-quotas.cc:136 +#: source/ubl-settings-quotas.cc:133 source/ubl-settings-quotas.cc:130 msgid "Hard limit (file) activation time" msgstr "Время активации жесткого лимита (файла)" -#: source/ubl-settings-quotas.cc:134 source/ubl-settings-quotas.cc:131 -#: source/ubl-settings-quotas.cc:128 +#: source/ubl-settings-quotas.cc:113 source/ubl-settings-quotas.cc:134 +#: source/ubl-settings-quotas.cc:131 source/ubl-settings-quotas.cc:128 msgid "Hard limit (files)" msgstr "Жесткий лимит (файлы)" -#: source/ubl-settings-quotas.cc:135 source/ubl-settings-quotas.cc:132 -#: source/ubl-settings-quotas.cc:129 +#: source/ubl-settings-quotas.cc:114 source/ubl-settings-quotas.cc:135 +#: source/ubl-settings-quotas.cc:132 source/ubl-settings-quotas.cc:129 msgid "Hard limit (files) delay" msgstr "Жесткий лимит (файлы)" -#: source/ubl-settings-quotas.cc:129 source/ubl-settings-quotas.cc:126 -#: source/ubl-settings-quotas.cc:123 +#: source/ubl-settings-quotas.cc:108 source/ubl-settings-quotas.cc:129 +#: source/ubl-settings-quotas.cc:126 source/ubl-settings-quotas.cc:123 msgid "Hard limit (size)" msgstr "Жесткий предел (размер) задержки" -#: source/ubl-settings-quotas.cc:131 source/ubl-settings-quotas.cc:128 -#: source/ubl-settings-quotas.cc:125 +#: source/ubl-settings-quotas.cc:110 source/ubl-settings-quotas.cc:131 +#: source/ubl-settings-quotas.cc:128 source/ubl-settings-quotas.cc:125 msgid "Hard limit (size) activation time" msgstr "Жесткий предел (размер)" -#: source/ubl-settings-quotas.cc:130 source/ubl-settings-quotas.cc:127 -#: source/ubl-settings-quotas.cc:124 +#: source/ubl-settings-quotas.cc:109 source/ubl-settings-quotas.cc:130 +#: source/ubl-settings-quotas.cc:127 source/ubl-settings-quotas.cc:124 msgid "Hard limit (size) delay" msgstr "Жесткий предел (размер) задержки" -#: source/ubl-settings-quotas.cc:120 source/ubl-settings-quotas.cc:117 -#: source/ubl-settings-quotas.cc:114 source/ubl-settings-quotas.cc:109 +#: source/ubl-settings-quotas.cc:145 +msgid "Help" +msgstr "Справка" + +#: source/ubl-settings-quotas.cc:99 source/ubl-settings-quotas.cc:120 +#: source/ubl-settings-quotas.cc:117 source/ubl-settings-quotas.cc:114 +#: source/ubl-settings-quotas.cc:109 msgid "Load" msgstr "Загрузить" +#: source/ubl-settings-quotas.cc:142 +msgid "Load from global configuration" +msgstr "Загрузить глобальную конфигурацию" + +#: source/ubl-settings-quotas.cc:143 +msgid "Load from local configuration" +msgstr "Загрузить локальную конфигурацию" + +#: source/ubl-settings-quotas.cc:455 +msgid "Local configuration downloaded successfully" +msgstr "" + +#: source/ubl-settings-quotas.cc:428 +#, fuzzy +msgid "Local configuration reading error" +msgstr "Загрузить локальную конфигурацию" + +#: source/ubl-settings-quotas.cc:461 +msgid "Local configuration successfully written" +msgstr "" + +#: source/ubl-settings-quotas.cc:436 +#, fuzzy +msgid "Local configuration write error" +msgstr "Загрузить локальную конфигурацию" + +#: source/ubl-settings-quotas.cc:104 source/ubl-settings-quotas.cc:314 #: source/ubl-settings-quotas.cc:125 source/ubl-settings-quotas.cc:318 #: source/ubl-settings-quotas.cc:122 source/ubl-settings-quotas.cc:310 #: source/ubl-settings-quotas.cc:119 msgid "Name" msgstr "Имя" -#: source/ubl-settings-quotas.cc:86 source/ubl-settings-quotas.cc:83 -#: source/ubl-settings-quotas.cc:80 source/ubl-settings-quotas.cc:79 +#: source/ubl-settings-quotas.cc:470 +msgid "Nothing to save!" +msgstr "Нечего сохранять!" + +#: source/ubl-settings-quotas.cc:65 source/ubl-settings-quotas.cc:86 +#: source/ubl-settings-quotas.cc:83 source/ubl-settings-quotas.cc:80 +#: source/ubl-settings-quotas.cc:79 msgid "Project Home Page" msgstr "Главная страница проекта" +#: source/ubl-settings-quotas.cc:105 source/ubl-settings-quotas.cc:315 #: source/ubl-settings-quotas.cc:126 source/ubl-settings-quotas.cc:319 #: source/ubl-settings-quotas.cc:123 source/ubl-settings-quotas.cc:311 #: source/ubl-settings-quotas.cc:258 source/ubl-settings-quotas.cc:120 msgid "Quotas" msgstr "Квоты" -#: source/ubl-settings-quotas.cc:121 source/ubl-settings-quotas.cc:118 -#: source/ubl-settings-quotas.cc:115 source/ubl-settings-quotas.cc:110 +#: source/ubl-settings-quotas.cc:71 +msgid "Quotas for groups" +msgstr "Квоты для групп" + +#: source/ubl-settings-quotas.cc:74 +msgid "Quotas for users" +msgstr "Квоты для пользователей" + +#: source/ubl-settings-quotas.cc:100 source/ubl-settings-quotas.cc:121 +#: source/ubl-settings-quotas.cc:118 source/ubl-settings-quotas.cc:115 +#: source/ubl-settings-quotas.cc:110 msgid "Save" msgstr "Сохранить" +#: source/ubl-settings-quotas.cc:146 +msgid "Save to global and local configuration" +msgstr "Сохранить глобальную и локальную конфигурацию" + +#: source/ubl-settings-quotas.cc:147 +msgid "Save to global configuration" +msgstr "Сохранить глобальную конфигурацию" + +#: source/ubl-settings-quotas.cc:148 +msgid "Save to local configuration" +msgstr "Сохранить локальную конфигурацию" + +#: source/ubl-settings-quotas.cc:106 source/ubl-settings-quotas.cc:119 +#: source/ubl-settings-quotas.cc:130 source/ubl-settings-quotas.cc:316 #: source/ubl-settings-quotas.cc:127 source/ubl-settings-quotas.cc:140 #: source/ubl-settings-quotas.cc:151 source/ubl-settings-quotas.cc:320 #: source/ubl-settings-quotas.cc:124 source/ubl-settings-quotas.cc:137 @@ -266,6 +375,8 @@ msgstr "Сохранить" msgid "Size" msgstr "Объём" +#: source/ubl-settings-quotas.cc:122 source/ubl-settings-quotas.cc:125 +#: source/ubl-settings-quotas.cc:132 source/ubl-settings-quotas.cc:137 #: source/ubl-settings-quotas.cc:143 source/ubl-settings-quotas.cc:146 #: source/ubl-settings-quotas.cc:153 source/ubl-settings-quotas.cc:158 #: source/ubl-settings-quotas.cc:140 source/ubl-settings-quotas.cc:150 @@ -276,8 +387,8 @@ msgstr "" "Мягкий предел\n" "(размер)" -#: source/ubl-settings-quotas.cc:326 source/ubl-settings-quotas.cc:318 -#: source/ubl-settings-quotas.cc:265 +#: source/ubl-settings-quotas.cc:322 source/ubl-settings-quotas.cc:326 +#: source/ubl-settings-quotas.cc:318 source/ubl-settings-quotas.cc:265 #, fuzzy msgid "" "Soft limit\n" @@ -286,8 +397,8 @@ msgstr "" "Мягкий лимит\n" "(файлы)" -#: source/ubl-settings-quotas.cc:321 source/ubl-settings-quotas.cc:313 -#: source/ubl-settings-quotas.cc:260 +#: source/ubl-settings-quotas.cc:317 source/ubl-settings-quotas.cc:321 +#: source/ubl-settings-quotas.cc:313 source/ubl-settings-quotas.cc:260 #, fuzzy msgid "" "Soft limit\n" @@ -296,34 +407,44 @@ msgstr "" "Мягкий предел\n" "(размер)" -#: source/ubl-settings-quotas.cc:133 source/ubl-settings-quotas.cc:130 -#: source/ubl-settings-quotas.cc:127 +#: source/ubl-settings-quotas.cc:112 source/ubl-settings-quotas.cc:133 +#: source/ubl-settings-quotas.cc:130 source/ubl-settings-quotas.cc:127 msgid "Soft limit (files)" msgstr "" "Мягкий лимит\n" "(файлы)" -#: source/ubl-settings-quotas.cc:128 source/ubl-settings-quotas.cc:125 -#: source/ubl-settings-quotas.cc:122 +#: source/ubl-settings-quotas.cc:107 source/ubl-settings-quotas.cc:128 +#: source/ubl-settings-quotas.cc:125 source/ubl-settings-quotas.cc:122 msgid "Soft limit (size)" msgstr "" "Мягкий предел\n" "(размер)" -#: source/ubl-settings-quotas.cc:68 source/ubl-settings-quotas.cc:70 -#: source/ubl-settings-quotas.cc:67 source/ubl-settings-quotas.cc:66 +#: source/ubl-settings-quotas.cc:467 +#, fuzzy +msgid "Successfully saved local and global configuration" +msgstr "Сохранить глобальную и локальную конфигурацию" + +#: source/ubl-settings-quotas.cc:47 source/ubl-settings-quotas.cc:68 +#: source/ubl-settings-quotas.cc:70 source/ubl-settings-quotas.cc:67 +#: source/ubl-settings-quotas.cc:66 msgid "The program must be run as root" msgstr "Программа должна быть запущена от имени root" -#: source/ubl-settings-quotas.cc:150 source/ubl-settings-quotas.cc:147 +#: source/ubl-settings-quotas.cc:129 source/ubl-settings-quotas.cc:150 +#: source/ubl-settings-quotas.cc:147 msgid "User quotas for this device: " msgstr "Квоты пользователей для этого устройства: " -#: source/ubl-settings-quotas.cc:89 source/ubl-settings-quotas.cc:86 -#: source/ubl-settings-quotas.cc:83 source/ubl-settings-quotas.cc:82 +#: source/ubl-settings-quotas.cc:68 source/ubl-settings-quotas.cc:89 +#: source/ubl-settings-quotas.cc:86 source/ubl-settings-quotas.cc:83 +#: source/ubl-settings-quotas.cc:82 msgid "Users" msgstr "Пользователи" +#: source/ubl-settings-quotas.cc:83 source/ubl-settings-quotas.cc:84 +#: source/ubl-settings-quotas.cc:85 source/ubl-settings-quotas.cc:86 #: source/ubl-settings-quotas.cc:104 source/ubl-settings-quotas.cc:105 #: source/ubl-settings-quotas.cc:106 source/ubl-settings-quotas.cc:107 #: source/ubl-settings-quotas.cc:101 source/ubl-settings-quotas.cc:102 @@ -333,12 +454,15 @@ msgstr "Пользователи" msgid "days" msgstr "дни" +#: source/ubl-settings-quotas.cc:139 source/ubl-settings-quotas.cc:140 #: source/ubl-settings-quotas.cc:160 source/ubl-settings-quotas.cc:161 #: source/ubl-settings-quotas.cc:157 source/ubl-settings-quotas.cc:158 #, fuzzy msgid "files" msgstr "Файлы" +#: source/ubl-settings-quotas.cc:87 source/ubl-settings-quotas.cc:88 +#: source/ubl-settings-quotas.cc:89 source/ubl-settings-quotas.cc:90 #: source/ubl-settings-quotas.cc:108 source/ubl-settings-quotas.cc:109 #: source/ubl-settings-quotas.cc:110 source/ubl-settings-quotas.cc:111 #: source/ubl-settings-quotas.cc:105 source/ubl-settings-quotas.cc:106 @@ -348,11 +472,14 @@ msgstr "Файлы" msgid "hours" msgstr "часы" -#: source/ubl-settings-quotas.cc:84 source/ubl-settings-quotas.cc:81 -#: source/ubl-settings-quotas.cc:78 source/ubl-settings-quotas.cc:77 +#: source/ubl-settings-quotas.cc:63 source/ubl-settings-quotas.cc:84 +#: source/ubl-settings-quotas.cc:81 source/ubl-settings-quotas.cc:78 +#: source/ubl-settings-quotas.cc:77 msgid "https://wiki.ublinux.com" msgstr "https://wiki.ublinux.ru" +#: source/ubl-settings-quotas.cc:91 source/ubl-settings-quotas.cc:92 +#: source/ubl-settings-quotas.cc:93 source/ubl-settings-quotas.cc:94 #: source/ubl-settings-quotas.cc:112 source/ubl-settings-quotas.cc:113 #: source/ubl-settings-quotas.cc:114 source/ubl-settings-quotas.cc:115 #: source/ubl-settings-quotas.cc:109 source/ubl-settings-quotas.cc:110 @@ -368,20 +495,24 @@ msgstr "имя" #: source/ubl-settings-quotas.cc:92 source/ubl-settings-quotas.cc:89 #: source/ubl-settings-quotas.cc:86 source/ubl-settings-quotas.cc:85 -msgid "Quotas for groups" +#, fuzzy +msgid "quotas for groups" msgstr "Квоты для групп" #: source/ubl-settings-quotas.cc:95 source/ubl-settings-quotas.cc:92 #: source/ubl-settings-quotas.cc:89 source/ubl-settings-quotas.cc:88 -msgid "Quotas for users" +#, fuzzy +msgid "quotas for users" msgstr "Квоты для пользователей" -#: source/ubl-settings-quotas.cc:350 source/ubl-settings-quotas.cc:371 -#: source/ubl-settings-quotas.cc:318 source/ubl-settings-quotas.cc:267 -#: source/ubl-settings-quotas.cc:213 +#: source/ubl-settings-quotas.cc:476 source/ubl-settings-quotas.cc:350 +#: source/ubl-settings-quotas.cc:371 source/ubl-settings-quotas.cc:318 +#: source/ubl-settings-quotas.cc:267 source/ubl-settings-quotas.cc:213 msgid "ubl-settings-quotas version: " msgstr "ubl-settings-quotas версия: " +#: source/ubl-settings-quotas.cc:79 source/ubl-settings-quotas.cc:80 +#: source/ubl-settings-quotas.cc:81 source/ubl-settings-quotas.cc:82 #: source/ubl-settings-quotas.cc:100 source/ubl-settings-quotas.cc:101 #: source/ubl-settings-quotas.cc:102 source/ubl-settings-quotas.cc:103 #: source/ubl-settings-quotas.cc:97 source/ubl-settings-quotas.cc:98 @@ -390,27 +521,3 @@ msgstr "ubl-settings-quotas версия: " #: source/ubl-settings-quotas.cc:93 msgid "weeks" msgstr "недели" - -#~ msgid "Nothing to save!" -#~ msgstr "Нечего сохранять!" - -#~ msgid "Help" -#~ msgstr "Справка" - -#~ msgid "About" -#~ msgstr "О программе" - -#~ msgid "Save to global configuration" -#~ msgstr "Сохранить глобальную конфигурацию" - -#~ msgid "Save to local configuration" -#~ msgstr "Сохранить локальную конфигурацию" - -#~ msgid "Save to global and local configuration" -#~ msgstr "Сохранить глобальную и локальную конфигурацию" - -#~ msgid "Load from global configuration" -#~ msgstr "Загрузить глобальную конфигурацию" - -#~ msgid "Load from local configuration" -#~ msgstr "Загрузить локальную конфигурацию" From 01a1fb5d828db2ac1f2a8f826ad768fbf5cc2816 Mon Sep 17 00:00:00 2001 From: Igor Belitskiy Date: Mon, 10 Apr 2023 11:39:38 +0000 Subject: [PATCH 14/51] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=B8?= =?UTF-8?q?=D0=BB=20=D0=BA=D0=BE=D0=B4=20=D0=B4=D0=BB=D1=8F=20=D1=87=D1=82?= =?UTF-8?q?=D0=B5=D0=BD=D0=B8=D1=8F=20=D1=81=D0=BF=D0=B8=D1=81=D0=BA=D0=B0?= =?UTF-8?q?=20=D0=B1=D0=BB=D0=BE=D1=87=D0=BD=D1=8B=D1=85=20=D1=83=D1=81?= =?UTF-8?q?=D1=82=D1=80=D0=BE=D0=B9=D1=81=D1=82=D0=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- source/my_device.cc | 35 +++++++++++++++++++++++++++++++++++ source/my_device.h | 27 +++++++++++++++++++++++++++ 2 files changed, 62 insertions(+) create mode 100644 source/my_device.cc create mode 100644 source/my_device.h diff --git a/source/my_device.cc b/source/my_device.cc new file mode 100644 index 0000000..b17af36 --- /dev/null +++ b/source/my_device.cc @@ -0,0 +1,35 @@ +#include "my_device.h" + +namespace Devices { +std::vector Get_device::get_all_device() { + std::vector vec_mount_devices; + std::vector vec_str; + std::ifstream file("/proc/mounts"); + if (file.is_open()) { + std::string line; + while (std::getline(file, line)) { + vec_str = Utils::split(line, ' '); + struct Mount mount; + mount.device = vec_str[0]; + mount.destination = vec_str[1]; + mount.fstype = vec_str[2]; + mount.options = vec_str[3]; + mount.dump = vec_str[4]; + mount.pass = vec_str[5]; + vec_mount_devices.push_back(mount); + } + } + file.close(); + return vec_mount_devices; + +} +std::vector Get_device::get_part_devices(string find_device_name) { + std::vector vec_mount_devices; + for (const auto device: this->get_all_device) { + if (device.device.find(find_device_name) != std::string::npos) { + vec_mount_devices.push_back(device); + } + } + return vec_mount_devices; +} +} diff --git a/source/my_device.h b/source/my_device.h new file mode 100644 index 0000000..d52fce1 --- /dev/null +++ b/source/my_device.h @@ -0,0 +1,27 @@ +#ifndef MY_DEVICE_H +#define MY_DEVICE_H + +#include "project_lib.h" +#include "util.h" + + +namespace Devices { +class Get_device +{ +public: + struct Mount { + std::string device; + std::string destination; + std::string fstype; + std::string options; + std::string dump; + std::string pass; + }; + +public: + std::vector get_all_device(); + std::vector Get_device::get_part_devices(string find_device_name) +}; +} +#endif + From 63c100a8a5a46236e51acaccd2eb84fb9166802b Mon Sep 17 00:00:00 2001 From: Igor Belitskiy Date: Mon, 10 Apr 2023 11:41:04 +0000 Subject: [PATCH 15/51] =?UTF-8?q?=D0=98=D0=B7=D0=BC=D0=B5=D0=BD=D1=91?= =?UTF-8?q?=D0=BD=20=D0=B4=D0=B8=D0=B7=D0=B0=D0=B9=D0=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ubl-settings-quotas.glade | 41 +++++++++++++++++++++++++++++++-------- 1 file changed, 33 insertions(+), 8 deletions(-) diff --git a/ubl-settings-quotas.glade b/ubl-settings-quotas.glade index 12bf6d2..c7d3fe9 100644 --- a/ubl-settings-quotas.glade +++ b/ubl-settings-quotas.glade @@ -255,8 +255,17 @@ True False - UBConfig - Quotas True + + + True + False + System quotas + + + + + True @@ -300,10 +309,10 @@ com.ublinux.ubl-settings-quotas dialog True - Quotas Manager - 1.1 + ubl-settings-quotas + 1.0 Copyright © 2022 - 2023, UBSoft LLC - Sum up system information + Setting user quotas https://ublinux.ru/ Project Home Page Это приложение распространяется без каких-либо гарантий. @@ -336,6 +345,7 @@ True False + True True @@ -836,7 +846,7 @@ - + True False 20 @@ -1290,7 +1300,7 @@ - + True False 20 @@ -2774,7 +2784,13 @@ True False - UBConfig - Quotas + + + True + False + UBConfig - Quotas + + True @@ -3360,7 +3376,16 @@ True False - UBConfig - Quotas + + + True + False + UBConfig - Quotas + + + + + True From a5867aa1f6dd9789b5287593fc087277c2107184 Mon Sep 17 00:00:00 2001 From: Igor Belitskiy Date: Mon, 10 Apr 2023 11:42:14 +0000 Subject: [PATCH 16/51] =?UTF-8?q?=D0=98=D1=81=D0=BF=D1=80=D0=B0=D0=B2?= =?UTF-8?q?=D0=BB=D0=B5=D0=BD=D0=B0=20=D0=BB=D0=BE=D0=BA=D0=B0=D0=BB=D0=B8?= =?UTF-8?q?=D0=B7=D0=B0=D1=86=D0=B8=D1=8F,=20=D0=BD=D0=B0=D1=87=D0=B0?= =?UTF-8?q?=D0=BB=20=D1=80=D0=B0=D0=B1=D0=BE=D1=82=D1=83=20=D0=BD=D0=B0?= =?UTF-8?q?=D0=B4=20=D1=84=D1=83=D0=BD=D0=BA=D1=86=D0=B8=D0=BE=D0=BD=D0=B0?= =?UTF-8?q?=D0=BB=D0=BE=D0=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- source/CMakeLists.txt | 2 ++ source/project_lib.h | 1 - source/ubl-settings-quotas.cc | 40 +++++++++++++++++++++++++++++++---- source/ubl-settings-quotas.h | 15 +++++++++++-- ubl-settings-quotas_ru.po | 6 ++++++ 5 files changed, 57 insertions(+), 7 deletions(-) diff --git a/source/CMakeLists.txt b/source/CMakeLists.txt index 1223788..e3caf3b 100644 --- a/source/CMakeLists.txt +++ b/source/CMakeLists.txt @@ -16,6 +16,8 @@ set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -pedantic -Wall -Wextra -Werror -Wmissin -fstack-clash-protection -fcf-protection -g") set(SOURCE_FILES + my_device.h + my_device.cc project_lib.h ubl-settings-quotas.h ubl-settings-quotas.cc diff --git a/source/project_lib.h b/source/project_lib.h index da1025e..bc0b1d2 100644 --- a/source/project_lib.h +++ b/source/project_lib.h @@ -23,5 +23,4 @@ #include #include #include "ubl-util-standard.c" - #endif \ No newline at end of file diff --git a/source/ubl-settings-quotas.cc b/source/ubl-settings-quotas.cc index 9928ec8..f67757d 100755 --- a/source/ubl-settings-quotas.cc +++ b/source/ubl-settings-quotas.cc @@ -34,6 +34,8 @@ void MainWindow::settings() { builder->get_widget("boxColor", boxWidget); HeadOverlay->add_overlay(*boxWidget); ubl_make_plugs(boxSave, boxButton, socket_ext_id_I, socket_trd_id_I); + this->entry_generalGroupsEnableCheck(); + this->entry_generalUsersEnableCheck(); if (geteuid() == 0) { this->init_tree_view(); this->event(); @@ -56,15 +58,17 @@ void MainWindow::init_tree_view() { void MainWindow::lacalization() { time_t now = time(0); tm *ltm = localtime(&now); - unsigned int year = 1900+ ltm->tm_year; + unsigned int year = 1900 + ltm->tm_year; string str_authors = string(_("Copyright © UBSoft LLC, 2022 - ")) + to_string(year); aboutWindows->set_copyright(str_authors); - aboutWindows->set_comments(_("Date and Time")); + aboutWindows->set_comments(_("Setting user quotas")); aboutWindows->set_website(_("https://wiki.ublinux.com")); aboutWindows->set_version(gettext(version_application.c_str())); aboutWindows->set_website_label(_("Project Home Page")); generalTabLabel->set_text(_("General settings")); GroupsTabLabel->set_text(_("Groups")); + headerAboutTopic->set_label(_(app_name.c_str())); + headerTopic->set_label(_(app_name.c_str())); UsersTabLabel->set_text(_("Users")); generalDeviceLabel->set_text(_("Device:")); generalFileSystemLabel->set_text(_("File system:")); @@ -148,6 +152,14 @@ void MainWindow::lacalization() { btnSaveLocal->set_label(_("Save to local configuration")); } +void MainWindow::entry_generalGroupsEnableCheck() { + boxGeneralGroupsEnableCheck->set_sensitive(generalGroupsEnableCheck->get_active()); +} + +void MainWindow::entry_generalUsersEnableCheck() { + boxGeneralUsersEnableCheck->set_sensitive(generalUsersEnableCheck->get_active()); +} + void MainWindow::add_CSS() { Glib::RefPtr cssProvider = Gtk::CssProvider::create(); cssProvider->load_from_path(path_css); @@ -290,18 +302,29 @@ void MainWindow::get_builder() { builder->get_widget("quoteuserFilesSoftLimitlabel", quoteuserFilesSoftLimitlabel); builder->get_widget("QuotasEditWindow", QuotasEditWindow); builder->get_widget("QuotasUserEditWindow", QuotasUserEditWindow); + builder->get_widget("headerAboutTopic", headerAboutTopic); + builder->get_widget("lblHeadQuotasUserEditWindow", lblHeadQuotasUserEditWindow); + builder->get_widget("lblHeadQuotasEditWindow", lblHeadQuotasEditWindow); + builder->get_widget("lblHeadFiltersWindow", lblHeadFiltersWindow); + builder->get_widget("boxGeneralGroupsEnableCheck", boxGeneralGroupsEnableCheck); + builder->get_widget("generalGroupsEnableCheck", generalGroupsEnableCheck); + builder->get_widget("boxGeneralUsersEnableCheck", boxGeneralUsersEnableCheck); + } void MainWindow::event() { btnLoadGlob->signal_activate().connect([&]() {}); btnLoadLocal->signal_activate().connect([&]() {}); - btnSynopsis->signal_activate().connect([&]() {}); - btnAbout->signal_activate().connect([&]() {}); + btnSynopsis->signal_activate().connect([&]() {this->synopsis_show();}); + btnAbout->signal_activate().connect([&]() {aboutWindows->show();}); btnSaveLocalGlob->signal_activate().connect([&]() {}); btnSaveGlob->signal_activate().connect([&]() {}); btnSaveLocal->signal_activate().connect([&]() {}); groupsFiltersButton->signal_clicked().connect(sigc::mem_fun(*this, &MainWindow::groupsFilters_show)); usersFiltersButton->signal_clicked().connect(sigc::mem_fun(*this, &MainWindow::groupsFilters_show)); + generalGroupsEnableCheck->signal_toggled().connect(sigc::mem_fun(*this, &MainWindow::entry_generalGroupsEnableCheck)); + generalUsersEnableCheck->signal_toggled().connect(sigc::mem_fun(*this, &MainWindow::entry_generalUsersEnableCheck)); + } void MainWindow::groupsFilters_show() { @@ -400,6 +423,15 @@ void MainWindow::wrapper_save_global_cfg() { } +void MainWindow::synopsis_show() { + string cmd = "xdg-open " + string(_("https://wiki.ublinux.com/ru/Программное_обеспечение/Программы_и_утилиты/Все/")) + app_name; + if (geteuid() == 0) { + string response_user = getlogin(); + cmd = "su -l " + response_user + " -c \" DISPLAY=$DISPLAY " + cmd + " \""; + } + obj_process_system.call(cmd, "&"); +} + void MainWindow::wrapper_save_local_cfg() { this->set_data_cfg(); if (this->save_template("boot", "system")) { diff --git a/source/ubl-settings-quotas.h b/source/ubl-settings-quotas.h index b3ba81a..e55dd62 100644 --- a/source/ubl-settings-quotas.h +++ b/source/ubl-settings-quotas.h @@ -6,6 +6,7 @@ #include "save.h" #include "my_process.h" #include "my_type.h" +#include "my_device.h" extern int socket_ext_id_I; @@ -96,7 +97,6 @@ class MainWindow : public Gtk::ApplicationWindow { Gtk::Label *generalFileSystemLabel; Gtk::Label *lblLoad; Gtk::Label *lblSave; - Gtk::CheckButton *generalGroupsEnableCheck; Gtk::CheckButton *generalUsersEnableCheck; Gtk::MenuItem *btnLoadGlob; Gtk::MenuItem *btnLoadLocal; @@ -156,16 +156,24 @@ class MainWindow : public Gtk::ApplicationWindow { Gtk::Label *quoteuserFilesSoftLimitlabel; Gtk::Window *QuotasUserEditWindow; Gtk::Window *QuotasEditWindow; + Gtk::Label *headerAboutTopic; + Gtk::Label *lblHeadQuotasUserEditWindow; + Gtk::Label *lblHeadQuotasEditWindow; + Gtk::Label *lblHeadFiltersWindow; + Gtk::Box *boxGeneralGroupsEnableCheck; + Gtk::CheckButton *generalGroupsEnableCheck; + Gtk::Box *boxGeneralUsersEnableCheck; public: Lib_save::Save obj_save = Lib_save::Save(); Lib_Load::Load obj_load = Lib_Load::Load(); - vector vec_param_names; + Devices::Get_device obj_device = Devices::Get_device(); My_Process::My_Process_system obj_process_system = My_Process::My_Process_system(); My_Process::My_Process_call obj_process_call = My_Process::My_Process_call(); map_str_str map_gui_cfg; map_str_str map_global_cfg; map_str_str map_system_cfg; + vector vec_param_names; string str_cmd_error; @@ -177,7 +185,10 @@ class MainWindow : public Gtk::ApplicationWindow { void add_CSS(); void get_builder(); void event(); + void entry_generalGroupsEnableCheck(); + void synopsis_show(); void info_status_app(string stule); + void entry_generalUsersEnableCheck(); void groupsFilters_show(); void init_tree_view(); void load_template(map_str_str* map_temp, string str_load); diff --git a/ubl-settings-quotas_ru.po b/ubl-settings-quotas_ru.po index cd8e2f6..9bd1f21 100644 --- a/ubl-settings-quotas_ru.po +++ b/ubl-settings-quotas_ru.po @@ -17,6 +17,12 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" +msgid "Setting user quotas" +msgstr "Настройка квот пользователей" + +msgid "ubl-settings-quotas" +msgstr "Квоты" + #: source/ubl-settings-quotas.cc:144 msgid "About" msgstr "О программе" From 648472dfa6f0cf16e916ec727c9c8319d72acc37 Mon Sep 17 00:00:00 2001 From: Igor Belitskiy Date: Mon, 10 Apr 2023 15:22:00 +0000 Subject: [PATCH 17/51] =?UTF-8?q?=D0=9F=D0=BE=D0=B4=D0=BA=D0=BB=D1=8E?= =?UTF-8?q?=D1=87=D0=B5=D0=BD=D1=8B=20=D1=81=D0=BE=D0=B1=D1=8B=D1=82=D0=B8?= =?UTF-8?q?=D1=8F,=20=D0=B8=D1=81=D0=BF=D1=80=D0=B0=D0=B2=D0=BB=D0=B5?= =?UTF-8?q?=D0=BD=D0=B0=20=D0=BB=D0=BE=D0=BA=D0=B0=D0=BB=D0=B8=D0=B7=D0=B0?= =?UTF-8?q?=D1=86=D0=B8=D1=8F,=20=D0=B4=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=D0=BE=20=D0=B7=D0=B0=D0=BF=D0=BE=D0=BB=D0=BD=D0=B5?= =?UTF-8?q?=D0=BD=D0=B8=D0=B5=20combo=20box?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- source/my_device.cc | 16 +- source/my_device.h | 22 +- source/my_process.h | 2 +- source/my_type.h | 10 +- source/ubl-settings-quotas.cc | 159 ++++++++++++-- source/ubl-settings-quotas.h | 31 ++- ubl-settings-quotas.glade | 18 +- ubl-settings-quotas.pot | 331 ++++++++++++++++++---------- ubl-settings-quotas_ru.po | 391 ++++++++++++++++++++++------------ 9 files changed, 678 insertions(+), 302 deletions(-) diff --git a/source/my_device.cc b/source/my_device.cc index b17af36..8385e69 100644 --- a/source/my_device.cc +++ b/source/my_device.cc @@ -1,7 +1,7 @@ #include "my_device.h" namespace Devices { -std::vector Get_device::get_all_device() { +std::vector Get_device::get_all_device() { std::vector vec_mount_devices; std::vector vec_str; std::ifstream file("/proc/mounts"); @@ -23,13 +23,21 @@ std::vector Get_device::get_all_device() { return vec_mount_devices; } -std::vector Get_device::get_part_devices(string find_device_name) { +std::vector Get_device::get_part_devices(string find_device_name) { std::vector vec_mount_devices; - for (const auto device: this->get_all_device) { + for (const auto &device: this->get_all_device()) { if (device.device.find(find_device_name) != std::string::npos) { vec_mount_devices.push_back(device); } } return vec_mount_devices; } -} + +map_str_device Get_device::get_map_part_devices(string find_device_name) { + map_str_device map_device; + for (const auto &device: this->get_part_devices(find_device_name)) { + map_device[device.device] = device; + } + return map_device; + } +} \ No newline at end of file diff --git a/source/my_device.h b/source/my_device.h index d52fce1..6cabfb6 100644 --- a/source/my_device.h +++ b/source/my_device.h @@ -3,25 +3,17 @@ #include "project_lib.h" #include "util.h" +#include "my_type.h" namespace Devices { -class Get_device -{ -public: - struct Mount { - std::string device; - std::string destination; - std::string fstype; - std::string options; - std::string dump; - std::string pass; - }; +class Get_device { -public: - std::vector get_all_device(); - std::vector Get_device::get_part_devices(string find_device_name) -}; + public: + map_str_device get_map_part_devices(string find_device_name); + std::vector get_part_devices(string find_device_name); + std::vector get_all_device(); + }; } #endif diff --git a/source/my_process.h b/source/my_process.h index f780860..e07a89c 100644 --- a/source/my_process.h +++ b/source/my_process.h @@ -2,7 +2,7 @@ #define SAVE_H #include "util.h" -namespace My_Process{ +namespace My_Process { class My_Process { public: int i_error = 0; diff --git a/source/my_type.h b/source/my_type.h index f92948e..45c7148 100644 --- a/source/my_type.h +++ b/source/my_type.h @@ -21,8 +21,16 @@ struct users_grups{ max_num_T postponement_hard_file_restriction; max_num_T hard_limit_activation_time; }; - +struct Mount { + std::string device; + std::string destination; + std::string fstype; + std::string options; + std::string dump; + std::string pass; +}; typedef struct users_grups USER_GRUPS; typedef map map_str_str; typedef map * map_s_s_ptr; +typedef std::map map_str_device; #endif \ No newline at end of file diff --git a/source/ubl-settings-quotas.cc b/source/ubl-settings-quotas.cc index f67757d..335846c 100755 --- a/source/ubl-settings-quotas.cc +++ b/source/ubl-settings-quotas.cc @@ -36,20 +36,96 @@ void MainWindow::settings() { ubl_make_plugs(boxSave, boxButton, socket_ext_id_I, socket_trd_id_I); this->entry_generalGroupsEnableCheck(); this->entry_generalUsersEnableCheck(); + map_device = obj_device.get_map_part_devices("/dev/"); + this->filling_device_combo_box_template(generalDeviceCombo, map_device); + this->filling_device_combo_box_template(groupsDeviceCombo, map_device); + this->filling_device_combo_box_template(usersDeviceCombo, map_device); + this->entry_combo_box_temp(generalDeviceCombo,lblFstypeGeneralSettings); + this->entry_combo_box_temp(groupsDeviceCombo, lblFstypeGroups); + this->entry_combo_box_temp(usersDeviceCombo, lblFstypeUsers); + this->init_spin_all(); if (geteuid() == 0) { this->init_tree_view(); + this->load_system_cfg(); + this->load_global_cfg(); this->event(); } 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); + imgInfo->set_from_icon_name("com.ublinux.ubl-settings-quotas.warning", Gtk::ICON_SIZE_MENU); info_status_app("boxInfoMessError"); lblWarning->set_text(_("The program must be run as root")); } } +void MainWindow::init_spin_all() { + generalGroupsSizeWeeksSpi->set_range(0, 52); + generalGroupsSizeWeeksSpi->set_increments(1.0, 1.0); + generalGroupsSizeWeeksSpi->set_value(0); + + generalGroupsFileWeeksSpin->set_range(0, 52); + generalGroupsFileWeeksSpin->set_increments(1.0, 1.0); + generalGroupsFileWeeksSpin->set_value(0); + + generalUsersSizWeeksSpin->set_range(0, 52); + generalUsersSizWeeksSpin->set_increments(1.0, 1.0); + generalUsersSizWeeksSpin->set_value(0); + + generalUsersFileWeeksSpin->set_range(0, 52); + generalUsersFileWeeksSpin->set_increments(1.0, 1.0); + generalUsersFileWeeksSpin->set_value(0); + + generalGroupsSizeDaySpin->set_range(0, 31); + generalGroupsSizeDaySpin->set_increments(1.0, 1.0); + generalGroupsSizeDaySpin->set_value(0); + + generalGroupsFilesDaySpin->set_range(0, 31); + generalGroupsFilesDaySpin->set_increments(1.0, 1.0); + generalGroupsFilesDaySpin->set_value(0); + + generalUsersSizeDaySpin->set_range(0, 31); + generalUsersSizeDaySpin->set_increments(1.0, 1.0); + generalUsersSizeDaySpin->set_value(0); + + generalUsersFilesDaySpin->set_range(0, 31); + generalUsersFilesDaySpin->set_increments(1.0, 1.0); + generalUsersFilesDaySpin->set_value(0); + + generalGroupsSizeHourSpin->set_range(0, 23); + generalGroupsSizeHourSpin->set_increments(1.0, 1.0); + generalGroupsSizeHourSpin->set_value(0); + + generalGroupsFilesHourSpin->set_range(0, 23); + generalGroupsFilesHourSpin->set_increments(1.0, 1.0); + generalGroupsFilesHourSpin->set_value(0); + + generalUsersSizeHourSpin->set_range(0, 23); + generalUsersSizeHourSpin->set_increments(1.0, 1.0); + generalUsersSizeHourSpin->set_value(0); + + generalUsersFilesHoursSpin->set_range(0, 23); + generalUsersFilesHoursSpin->set_increments(1.0, 1.0); + generalUsersFilesHoursSpin->set_value(0); + + generalGroupsSizeMinuteSpin->set_range(0, 59); + generalGroupsSizeMinuteSpin->set_increments(1.0, 1.0); + generalGroupsSizeMinuteSpin->set_value(0); + + generalGroupsFilesMinuteSpin->set_range(0, 59); + generalGroupsFilesMinuteSpin->set_increments(1.0, 1.0); + generalGroupsFilesMinuteSpin->set_value(0); + + generalUsersSizeMinuteSpin->set_range(0, 59); + generalUsersSizeMinuteSpin->set_increments(1.0, 1.0); + generalUsersSizeMinuteSpin->set_value(0); + + generalUsersFilesMinutesSpin->set_range(0, 59); + generalUsersFilesMinutesSpin->set_increments(1.0, 1.0); + generalUsersFilesMinutesSpin->set_value(0); +} + void MainWindow::init_tree_view() { this->view_add_columns(*usersQuotasTree); this->view_add_columns(*groupsQuotasTree); @@ -152,6 +228,23 @@ void MainWindow::lacalization() { btnSaveLocal->set_label(_("Save to local configuration")); } +void MainWindow::filling_device_combo_box_template(Gtk::ComboBoxText *combo_box, map_str_device &map_device) { + if (map_device.size() != 0) { + for (const auto &device : map_device) { + combo_box->append(device.first.c_str()); + } + combo_box->set_active(0); + } +} + +void MainWindow::entry_combo_box_temp(Gtk::ComboBoxText *combo_box, Gtk::Label *label) { + string text = combo_box->get_active_text(); + if (map_device.find(text) != map_device.end()){ + auto value_device = map_device[text]; + label->set_text(value_device.fstype); + } +} + void MainWindow::entry_generalGroupsEnableCheck() { boxGeneralGroupsEnableCheck->set_sensitive(generalGroupsEnableCheck->get_active()); } @@ -309,22 +402,48 @@ void MainWindow::get_builder() { builder->get_widget("boxGeneralGroupsEnableCheck", boxGeneralGroupsEnableCheck); builder->get_widget("generalGroupsEnableCheck", generalGroupsEnableCheck); builder->get_widget("boxGeneralUsersEnableCheck", boxGeneralUsersEnableCheck); - + builder->get_widget("usersDeviceCombo", usersDeviceCombo); + builder->get_widget("GroupsTabLabel", GroupsTabLabel); + builder->get_widget("generalTabLabel", generalTabLabel); + builder->get_widget("generalDeviceCombo", generalDeviceCombo); + builder->get_widget("groupsDeviceCombo", groupsDeviceCombo); + builder->get_widget("lblFstypeUsers", lblFstypeUsers); + builder->get_widget("lblFstypeGroups", lblFstypeGroups); + builder->get_widget("lblFstypeGeneralSettings", lblFstypeGeneralSettings); + builder->get_widget("generalGroupsSizeWeeksSpi", generalGroupsSizeWeeksSpi); + builder->get_widget("generalGroupsFileWeeksSpin", generalGroupsFileWeeksSpin); + builder->get_widget("generalGroupsSizeDaySpin", generalGroupsSizeDaySpin); + builder->get_widget("generalGroupsFilesDaySpin", generalGroupsFilesDaySpin); + builder->get_widget("generalGroupsSizeHourSpin", generalGroupsSizeHourSpin); + builder->get_widget("generalGroupsFilesHourSpin", generalGroupsFilesHourSpin); + builder->get_widget("generalGroupsSizeMinuteSpin", generalGroupsSizeMinuteSpin); + builder->get_widget("generalGroupsFilesMinuteSpin", generalGroupsFilesMinuteSpin); + builder->get_widget("generalUsersSizWeeksSpin", generalUsersSizWeeksSpin); + builder->get_widget("generalUsersFileWeeksSpin", generalUsersFileWeeksSpin); + builder->get_widget("generalUsersSizeDaySpin", generalUsersSizeDaySpin); + builder->get_widget("generalUsersFilesDaySpin", generalUsersFilesDaySpin); + builder->get_widget("generalUsersSizeHourSpin", generalUsersSizeHourSpin); + builder->get_widget("generalUsersFilesHoursSpin", generalUsersFilesHoursSpin); + builder->get_widget("generalUsersSizeMinuteSpin", generalUsersSizeMinuteSpin); + builder->get_widget("generalUsersFilesMinutesSpin", generalUsersFilesMinutesSpin); + } void MainWindow::event() { - btnLoadGlob->signal_activate().connect([&]() {}); - btnLoadLocal->signal_activate().connect([&]() {}); + btnLoadGlob->signal_activate().connect([&]() {this->load_global_cfg();}); + btnLoadLocal->signal_activate().connect([&]() {this->load_system_cfg();}); btnSynopsis->signal_activate().connect([&]() {this->synopsis_show();}); btnAbout->signal_activate().connect([&]() {aboutWindows->show();}); - btnSaveLocalGlob->signal_activate().connect([&]() {}); - btnSaveGlob->signal_activate().connect([&]() {}); - btnSaveLocal->signal_activate().connect([&]() {}); + btnSaveLocalGlob->signal_activate().connect([&]() {this->wrapper_save_all_cfg();}); + btnSaveGlob->signal_activate().connect([&]() {this->wrapper_save_global_cfg();}); + btnSaveLocal->signal_activate().connect([&]() {this->wrapper_save_system_cfg();}); groupsFiltersButton->signal_clicked().connect(sigc::mem_fun(*this, &MainWindow::groupsFilters_show)); usersFiltersButton->signal_clicked().connect(sigc::mem_fun(*this, &MainWindow::groupsFilters_show)); generalGroupsEnableCheck->signal_toggled().connect(sigc::mem_fun(*this, &MainWindow::entry_generalGroupsEnableCheck)); generalUsersEnableCheck->signal_toggled().connect(sigc::mem_fun(*this, &MainWindow::entry_generalUsersEnableCheck)); - + generalDeviceCombo->signal_changed().connect([&]() {entry_combo_box_temp(generalDeviceCombo,lblFstypeGeneralSettings);}); + groupsDeviceCombo->signal_changed().connect([&]() {entry_combo_box_temp(groupsDeviceCombo, lblFstypeGroups);}); + usersDeviceCombo->signal_changed().connect([&]() {entry_combo_box_temp(usersDeviceCombo, lblFstypeUsers);}); } void MainWindow::groupsFilters_show() { @@ -338,14 +457,16 @@ void MainWindow::view_add_columns(Gtk::TreeView &treeView) { treeView.append_column_editable(_("Quotas"), m_columns.quotas); treeView.append_column(_("Size"), m_columns.size); treeView.append_column(_("Soft limit\n(size)"), m_columns.soft_limit_size); - treeView.append_column(_("Hard limit\n(size)"), m_columns.hard_limit_size); - treeView.append_column(_("Hard limit\n(size) delay"), m_columns.hard_limit_size_delay); - treeView.append_column(_("Hard limit\n(Size) activation\ntime"), m_columns.hard_limit_activ_time); + treeView.append_column(_("Severe\nlimitation\n(size)"), m_columns.hard_limit_size); + treeView.append_column(_("Deferring\na hard\nlimit\n(size)"), m_columns.hard_limit_size_delay); + treeView.append_column(_("Hard limit\n" + "activation\n" + "time (size)"), m_columns.hard_limit_activ_time); treeView.append_column(_("Files"), m_columns.files); - treeView.append_column(_("Soft limit\n(files)"), m_columns.soft_limit_files); - treeView.append_column(_("Hard limit\n(files)"), m_columns.hard_limit_files); - treeView.append_column(_("Hard limit\n(files) delay"), m_columns.hard_limit_delay); - treeView.append_column(_("Hard limit\n(files) activation\ntime"), m_columns.hard_limit_files_activ_time); + treeView.append_column(_("Soft\nRestriction\n(files)"), m_columns.soft_limit_files); + treeView.append_column(_("Severe\nlimitation\n(files)"), m_columns.hard_limit_files); + treeView.append_column(_("Deferring\na hard\nlimit\n(files)"), m_columns.hard_limit_delay); + treeView.append_column(_("Hard limit\nactivation\ntime (files)"), m_columns.hard_limit_files_activ_time); } void MainWindow::info_status_app(string stule) { @@ -432,7 +553,7 @@ void MainWindow::synopsis_show() { obj_process_system.call(cmd, "&"); } -void MainWindow::wrapper_save_local_cfg() { +void MainWindow::wrapper_save_system_cfg() { this->set_data_cfg(); if (this->save_template("boot", "system")) { this->info_warning_error(5); @@ -446,7 +567,7 @@ void MainWindow::wrapper_save_local_cfg() { void MainWindow::load_template(map_str_str* map_temp, string str_load) { this->init_dict(str_load); string sections; - sections = "boot"; + sections = "security"; obj_load.set_sections(sections); *map_temp = obj_load.get_load_data(*map_temp, str_load); } @@ -454,7 +575,7 @@ void MainWindow::load_template(map_str_str* map_temp, string str_load) { void MainWindow::info_warning_error(int mess) { if (obj_load.get_count_error() > 0 || obj_save.get_count_error() > 0) { info_status_app("boxInfoMessError"); - imgInfo->set_from_icon_name("com.ublinux.ubl-settings-bootloader.warning", Gtk::ICON_SIZE_MENU); + imgInfo->set_from_icon_name("com.ublinux.ubl-settings-quotas.warning", Gtk::ICON_SIZE_MENU); string mess_error = ""; if (mess == 0) { mess_error = string(_("Local configuration reading error")) + str_cmd_error; @@ -482,7 +603,7 @@ void MainWindow::info_warning_error(int mess) { } else { info_status_app("boxInfoMessOK"); - imgInfo->set_from_icon_name("com.ublinux.ubl-settings-bootloader.checked", Gtk::ICON_SIZE_MENU); + imgInfo->set_from_icon_name("com.ublinux.ubl-settings-quotas.checked", Gtk::ICON_SIZE_MENU); if (mess == 0) { lblWarning->set_text(_("Local configuration downloaded successfully")); } diff --git a/source/ubl-settings-quotas.h b/source/ubl-settings-quotas.h index e55dd62..4711e9b 100644 --- a/source/ubl-settings-quotas.h +++ b/source/ubl-settings-quotas.h @@ -163,6 +163,30 @@ class MainWindow : public Gtk::ApplicationWindow { Gtk::Box *boxGeneralGroupsEnableCheck; Gtk::CheckButton *generalGroupsEnableCheck; Gtk::Box *boxGeneralUsersEnableCheck; + Gtk::ComboBoxText *usersDeviceCombo; + Gtk::ComboBoxText *groupsDeviceCombo; + Gtk::ComboBoxText *generalDeviceCombo; + Gtk::Label *lblFstypeUsers; + Gtk::Label *lblFstypeGroups; + Gtk::Label *lblFstypeGeneralSettings; + Gtk::SpinButton *generalGroupsSizeWeeksSpi; + Gtk::SpinButton *generalGroupsFileWeeksSpin; + Gtk::SpinButton *generalGroupsSizeDaySpin; + Gtk::SpinButton *generalGroupsFilesDaySpin; + Gtk::SpinButton *generalGroupsSizeHourSpin; + Gtk::SpinButton *generalGroupsFilesHourSpin; + Gtk::SpinButton *generalGroupsSizeMinuteSpin; + Gtk::SpinButton *generalGroupsFilesMinuteSpin; + Gtk::SpinButton *generalUsersSizWeeksSpin; + Gtk::SpinButton *generalUsersFileWeeksSpin; + Gtk::SpinButton *generalUsersSizeDaySpin; + Gtk::SpinButton *generalUsersFilesDaySpin; + Gtk::SpinButton *generalUsersSizeHourSpin; + Gtk::SpinButton *generalUsersFilesHoursSpin; + Gtk::SpinButton *generalUsersSizeMinuteSpin; + Gtk::SpinButton *generalUsersFilesMinutesSpin; + + public: Lib_save::Save obj_save = Lib_save::Save(); @@ -174,7 +198,7 @@ class MainWindow : public Gtk::ApplicationWindow { map_str_str map_global_cfg; map_str_str map_system_cfg; vector vec_param_names; - + map_str_device map_device; string str_cmd_error; public: @@ -185,6 +209,7 @@ class MainWindow : public Gtk::ApplicationWindow { void add_CSS(); void get_builder(); void event(); + void entry_combo_box_temp(Gtk::ComboBoxText *combo_box, Gtk::Label *label); void entry_generalGroupsEnableCheck(); void synopsis_show(); void info_status_app(string stule); @@ -193,13 +218,15 @@ class MainWindow : public Gtk::ApplicationWindow { void init_tree_view(); void load_template(map_str_str* map_temp, string str_load); void info_warning_error(int mess); - void wrapper_save_local_cfg(); + void wrapper_save_system_cfg(); void wrapper_save_global_cfg(); void wrapper_save_all_cfg(); void init_dict(string flag_load); void set_data_cfg(); + void init_spin_all(); void load_global_cfg(); void load_system_cfg(); + void filling_device_combo_box_template(Gtk::ComboBoxText *combo_box, map_str_device &map_device); bool save_template(string section, string flag_save); void view_add_columns(Gtk::TreeView &treeView); diff --git a/ubl-settings-quotas.glade b/ubl-settings-quotas.glade index c7d3fe9..d783434 100644 --- a/ubl-settings-quotas.glade +++ b/ubl-settings-quotas.glade @@ -757,10 +757,9 @@ - + True False - DeviceStore True @@ -785,7 +784,7 @@ - + True False 5 @@ -794,7 +793,6 @@ 5 6 6 - **** False @@ -1754,10 +1752,9 @@ - + True False - DeviceStore True @@ -1780,7 +1777,7 @@ - + True False 5 @@ -1789,7 +1786,6 @@ 5 6 6 - **** False @@ -1874,10 +1870,9 @@ - + True False - DeviceStore True @@ -1900,7 +1895,7 @@ - + True False 5 @@ -1909,7 +1904,6 @@ 5 6 6 - **** False diff --git a/ubl-settings-quotas.pot b/ubl-settings-quotas.pot index 14d9572..1b89765 100644 --- a/ubl-settings-quotas.pot +++ b/ubl-settings-quotas.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-04-10 09:09+0000\n" +"POT-Creation-Date: 2023-04-10 14:57+0000\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -17,31 +17,33 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -#: source/ubl-settings-quotas.cc:144 +#: source/ubl-settings-quotas.cc:154 source/ubl-settings-quotas.cc:144 msgid "About" msgstr "" -#: source/ubl-settings-quotas.cc:103 source/ubl-settings-quotas.cc:124 -#: source/ubl-settings-quotas.cc:121 source/ubl-settings-quotas.cc:118 +#: source/ubl-settings-quotas.cc:113 source/ubl-settings-quotas.cc:103 +#: source/ubl-settings-quotas.cc:124 source/ubl-settings-quotas.cc:121 +#: source/ubl-settings-quotas.cc:118 msgid "Configuration of disk quotas parameters for system groups and users" msgstr "" -#: source/ubl-settings-quotas.cc:60 source/ubl-settings-quotas.cc:81 -#: source/ubl-settings-quotas.cc:78 source/ubl-settings-quotas.cc:75 -#: source/ubl-settings-quotas.cc:74 +#: source/ubl-settings-quotas.cc:68 source/ubl-settings-quotas.cc:60 +#: source/ubl-settings-quotas.cc:81 source/ubl-settings-quotas.cc:78 +#: source/ubl-settings-quotas.cc:75 source/ubl-settings-quotas.cc:74 msgid "Copyright © UBSoft LLC, 2022 - " msgstr "" -#: source/ubl-settings-quotas.cc:121 source/ubl-settings-quotas.cc:126 -#: source/ubl-settings-quotas.cc:131 source/ubl-settings-quotas.cc:142 +#: source/ubl-settings-quotas.cc:131 source/ubl-settings-quotas.cc:136 +#: source/ubl-settings-quotas.cc:141 source/ubl-settings-quotas.cc:121 +#: source/ubl-settings-quotas.cc:126 source/ubl-settings-quotas.cc:142 #: source/ubl-settings-quotas.cc:147 source/ubl-settings-quotas.cc:152 #: source/ubl-settings-quotas.cc:139 source/ubl-settings-quotas.cc:144 #: source/ubl-settings-quotas.cc:149 msgid "Currently using:" msgstr "" -#: source/ubl-settings-quotas.cc:136 source/ubl-settings-quotas.cc:157 -#: source/ubl-settings-quotas.cc:154 +#: source/ubl-settings-quotas.cc:146 source/ubl-settings-quotas.cc:136 +#: source/ubl-settings-quotas.cc:157 source/ubl-settings-quotas.cc:154 msgid "Currently using: " msgstr "" @@ -51,24 +53,45 @@ msgstr "" msgid "Date and Time" msgstr "" -#: source/ubl-settings-quotas.cc:69 source/ubl-settings-quotas.cc:101 -#: source/ubl-settings-quotas.cc:102 source/ubl-settings-quotas.cc:116 -#: source/ubl-settings-quotas.cc:128 source/ubl-settings-quotas.cc:90 -#: source/ubl-settings-quotas.cc:122 source/ubl-settings-quotas.cc:123 -#: source/ubl-settings-quotas.cc:137 source/ubl-settings-quotas.cc:149 -#: source/ubl-settings-quotas.cc:87 source/ubl-settings-quotas.cc:119 -#: source/ubl-settings-quotas.cc:120 source/ubl-settings-quotas.cc:134 -#: source/ubl-settings-quotas.cc:146 source/ubl-settings-quotas.cc:84 -#: source/ubl-settings-quotas.cc:117 source/ubl-settings-quotas.cc:83 +#: source/ubl-settings-quotas.cc:381 +msgid "" +"Deferring\n" +"a hard\n" +"limit\n" +"(files)" +msgstr "" + +#: source/ubl-settings-quotas.cc:374 +msgid "" +"Deferring\n" +"a hard\n" +"limit\n" +"(size)" +msgstr "" + +#: source/ubl-settings-quotas.cc:79 source/ubl-settings-quotas.cc:111 +#: source/ubl-settings-quotas.cc:112 source/ubl-settings-quotas.cc:126 +#: source/ubl-settings-quotas.cc:138 source/ubl-settings-quotas.cc:69 +#: source/ubl-settings-quotas.cc:101 source/ubl-settings-quotas.cc:102 +#: source/ubl-settings-quotas.cc:116 source/ubl-settings-quotas.cc:128 +#: source/ubl-settings-quotas.cc:90 source/ubl-settings-quotas.cc:122 +#: source/ubl-settings-quotas.cc:123 source/ubl-settings-quotas.cc:137 +#: source/ubl-settings-quotas.cc:149 source/ubl-settings-quotas.cc:87 +#: source/ubl-settings-quotas.cc:119 source/ubl-settings-quotas.cc:120 +#: source/ubl-settings-quotas.cc:134 source/ubl-settings-quotas.cc:146 +#: source/ubl-settings-quotas.cc:84 source/ubl-settings-quotas.cc:117 +#: source/ubl-settings-quotas.cc:83 msgid "Device:" msgstr "" -#: source/ubl-settings-quotas.cc:117 source/ubl-settings-quotas.cc:127 -#: source/ubl-settings-quotas.cc:138 source/ubl-settings-quotas.cc:148 -#: source/ubl-settings-quotas.cc:135 source/ubl-settings-quotas.cc:145 +#: source/ubl-settings-quotas.cc:127 source/ubl-settings-quotas.cc:137 +#: source/ubl-settings-quotas.cc:117 source/ubl-settings-quotas.cc:138 +#: source/ubl-settings-quotas.cc:148 source/ubl-settings-quotas.cc:135 +#: source/ubl-settings-quotas.cc:145 msgid "Disk quotas for this device:" msgstr "" +#: source/ubl-settings-quotas.cc:82 source/ubl-settings-quotas.cc:83 #: source/ubl-settings-quotas.cc:72 source/ubl-settings-quotas.cc:73 #: source/ubl-settings-quotas.cc:93 source/ubl-settings-quotas.cc:94 #: source/ubl-settings-quotas.cc:90 source/ubl-settings-quotas.cc:91 @@ -77,10 +100,11 @@ msgstr "" msgid "Enable" msgstr "" -#: source/ubl-settings-quotas.cc:444 +#: source/ubl-settings-quotas.cc:510 source/ubl-settings-quotas.cc:444 msgid "Error saved local and global configuration" msgstr "" +#: source/ubl-settings-quotas.cc:86 source/ubl-settings-quotas.cc:88 #: source/ubl-settings-quotas.cc:76 source/ubl-settings-quotas.cc:78 #: source/ubl-settings-quotas.cc:97 source/ubl-settings-quotas.cc:99 #: source/ubl-settings-quotas.cc:94 source/ubl-settings-quotas.cc:96 @@ -89,6 +113,7 @@ msgstr "" msgid "Excess files delay period" msgstr "" +#: source/ubl-settings-quotas.cc:85 source/ubl-settings-quotas.cc:87 #: source/ubl-settings-quotas.cc:75 source/ubl-settings-quotas.cc:77 #: source/ubl-settings-quotas.cc:96 source/ubl-settings-quotas.cc:98 #: source/ubl-settings-quotas.cc:93 source/ubl-settings-quotas.cc:95 @@ -97,18 +122,23 @@ msgstr "" msgid "Excess size delay period" msgstr "" -#: source/ubl-settings-quotas.cc:70 source/ubl-settings-quotas.cc:95 -#: source/ubl-settings-quotas.cc:96 source/ubl-settings-quotas.cc:134 -#: source/ubl-settings-quotas.cc:141 source/ubl-settings-quotas.cc:91 -#: source/ubl-settings-quotas.cc:116 source/ubl-settings-quotas.cc:117 -#: source/ubl-settings-quotas.cc:155 source/ubl-settings-quotas.cc:162 -#: source/ubl-settings-quotas.cc:88 source/ubl-settings-quotas.cc:113 -#: source/ubl-settings-quotas.cc:114 source/ubl-settings-quotas.cc:152 -#: source/ubl-settings-quotas.cc:85 source/ubl-settings-quotas.cc:110 -#: source/ubl-settings-quotas.cc:111 source/ubl-settings-quotas.cc:84 +#: source/ubl-settings-quotas.cc:80 source/ubl-settings-quotas.cc:105 +#: source/ubl-settings-quotas.cc:106 source/ubl-settings-quotas.cc:144 +#: source/ubl-settings-quotas.cc:151 source/ubl-settings-quotas.cc:70 +#: source/ubl-settings-quotas.cc:95 source/ubl-settings-quotas.cc:96 +#: source/ubl-settings-quotas.cc:134 source/ubl-settings-quotas.cc:141 +#: source/ubl-settings-quotas.cc:91 source/ubl-settings-quotas.cc:116 +#: source/ubl-settings-quotas.cc:117 source/ubl-settings-quotas.cc:155 +#: source/ubl-settings-quotas.cc:162 source/ubl-settings-quotas.cc:88 +#: source/ubl-settings-quotas.cc:113 source/ubl-settings-quotas.cc:114 +#: source/ubl-settings-quotas.cc:152 source/ubl-settings-quotas.cc:85 +#: source/ubl-settings-quotas.cc:110 source/ubl-settings-quotas.cc:111 +#: source/ubl-settings-quotas.cc:84 msgid "File system:" msgstr "" +#: source/ubl-settings-quotas.cc:121 source/ubl-settings-quotas.cc:130 +#: source/ubl-settings-quotas.cc:145 source/ubl-settings-quotas.cc:378 #: source/ubl-settings-quotas.cc:111 source/ubl-settings-quotas.cc:120 #: source/ubl-settings-quotas.cc:135 source/ubl-settings-quotas.cc:321 #: source/ubl-settings-quotas.cc:132 source/ubl-settings-quotas.cc:141 @@ -119,6 +149,7 @@ msgstr "" msgid "Files" msgstr "" +#: source/ubl-settings-quotas.cc:107 source/ubl-settings-quotas.cc:108 #: source/ubl-settings-quotas.cc:97 source/ubl-settings-quotas.cc:98 #: source/ubl-settings-quotas.cc:118 source/ubl-settings-quotas.cc:119 #: source/ubl-settings-quotas.cc:115 source/ubl-settings-quotas.cc:116 @@ -135,45 +166,47 @@ msgid "" " -V, --version\t Show package version\n" msgstr "" -#: source/ubl-settings-quotas.cc:66 source/ubl-settings-quotas.cc:87 -#: source/ubl-settings-quotas.cc:84 source/ubl-settings-quotas.cc:81 -#: source/ubl-settings-quotas.cc:80 +#: source/ubl-settings-quotas.cc:74 source/ubl-settings-quotas.cc:66 +#: source/ubl-settings-quotas.cc:87 source/ubl-settings-quotas.cc:84 +#: source/ubl-settings-quotas.cc:81 source/ubl-settings-quotas.cc:80 msgid "General settings" msgstr "" -#: source/ubl-settings-quotas.cc:458 +#: source/ubl-settings-quotas.cc:524 source/ubl-settings-quotas.cc:458 msgid "Global configuration downloaded successfully" msgstr "" -#: source/ubl-settings-quotas.cc:432 +#: source/ubl-settings-quotas.cc:498 source/ubl-settings-quotas.cc:432 msgid "Global configuration read error" msgstr "" -#: source/ubl-settings-quotas.cc:464 +#: source/ubl-settings-quotas.cc:530 source/ubl-settings-quotas.cc:464 msgid "Global configuration successfully written" msgstr "" -#: source/ubl-settings-quotas.cc:440 +#: source/ubl-settings-quotas.cc:506 source/ubl-settings-quotas.cc:440 msgid "Global configuration write error" msgstr "" -#: source/ubl-settings-quotas.cc:118 source/ubl-settings-quotas.cc:139 -#: source/ubl-settings-quotas.cc:136 +#: source/ubl-settings-quotas.cc:128 source/ubl-settings-quotas.cc:118 +#: source/ubl-settings-quotas.cc:139 source/ubl-settings-quotas.cc:136 msgid "Group quotas for this device:" msgstr "" -#: source/ubl-settings-quotas.cc:67 source/ubl-settings-quotas.cc:88 -#: source/ubl-settings-quotas.cc:85 source/ubl-settings-quotas.cc:82 -#: source/ubl-settings-quotas.cc:81 +#: source/ubl-settings-quotas.cc:75 source/ubl-settings-quotas.cc:67 +#: source/ubl-settings-quotas.cc:88 source/ubl-settings-quotas.cc:85 +#: source/ubl-settings-quotas.cc:82 source/ubl-settings-quotas.cc:81 msgid "Groups" msgstr "" +#: source/ubl-settings-quotas.cc:133 source/ubl-settings-quotas.cc:134 +#: source/ubl-settings-quotas.cc:143 source/ubl-settings-quotas.cc:148 #: source/ubl-settings-quotas.cc:123 source/ubl-settings-quotas.cc:124 -#: source/ubl-settings-quotas.cc:133 source/ubl-settings-quotas.cc:138 -#: source/ubl-settings-quotas.cc:144 source/ubl-settings-quotas.cc:145 -#: source/ubl-settings-quotas.cc:154 source/ubl-settings-quotas.cc:159 -#: source/ubl-settings-quotas.cc:141 source/ubl-settings-quotas.cc:142 -#: source/ubl-settings-quotas.cc:151 source/ubl-settings-quotas.cc:156 +#: source/ubl-settings-quotas.cc:138 source/ubl-settings-quotas.cc:144 +#: source/ubl-settings-quotas.cc:145 source/ubl-settings-quotas.cc:154 +#: source/ubl-settings-quotas.cc:159 source/ubl-settings-quotas.cc:141 +#: source/ubl-settings-quotas.cc:142 source/ubl-settings-quotas.cc:151 +#: source/ubl-settings-quotas.cc:156 msgid "Hard limit" msgstr "" @@ -221,70 +254,91 @@ msgid "" "(size) delay" msgstr "" -#: source/ubl-settings-quotas.cc:115 source/ubl-settings-quotas.cc:136 -#: source/ubl-settings-quotas.cc:133 source/ubl-settings-quotas.cc:130 +#: source/ubl-settings-quotas.cc:382 +msgid "" +"Hard limit\n" +"activation\n" +"time (files)" +msgstr "" + +#: source/ubl-settings-quotas.cc:375 +msgid "" +"Hard limit\n" +"activation\n" +"time (size)" +msgstr "" + +#: source/ubl-settings-quotas.cc:125 source/ubl-settings-quotas.cc:115 +#: source/ubl-settings-quotas.cc:136 source/ubl-settings-quotas.cc:133 +#: source/ubl-settings-quotas.cc:130 msgid "Hard limit (file) activation time" msgstr "" -#: source/ubl-settings-quotas.cc:113 source/ubl-settings-quotas.cc:134 -#: source/ubl-settings-quotas.cc:131 source/ubl-settings-quotas.cc:128 +#: source/ubl-settings-quotas.cc:123 source/ubl-settings-quotas.cc:113 +#: source/ubl-settings-quotas.cc:134 source/ubl-settings-quotas.cc:131 +#: source/ubl-settings-quotas.cc:128 msgid "Hard limit (files)" msgstr "" -#: source/ubl-settings-quotas.cc:114 source/ubl-settings-quotas.cc:135 -#: source/ubl-settings-quotas.cc:132 source/ubl-settings-quotas.cc:129 +#: source/ubl-settings-quotas.cc:124 source/ubl-settings-quotas.cc:114 +#: source/ubl-settings-quotas.cc:135 source/ubl-settings-quotas.cc:132 +#: source/ubl-settings-quotas.cc:129 msgid "Hard limit (files) delay" msgstr "" -#: source/ubl-settings-quotas.cc:108 source/ubl-settings-quotas.cc:129 -#: source/ubl-settings-quotas.cc:126 source/ubl-settings-quotas.cc:123 +#: source/ubl-settings-quotas.cc:118 source/ubl-settings-quotas.cc:108 +#: source/ubl-settings-quotas.cc:129 source/ubl-settings-quotas.cc:126 +#: source/ubl-settings-quotas.cc:123 msgid "Hard limit (size)" msgstr "" -#: source/ubl-settings-quotas.cc:110 source/ubl-settings-quotas.cc:131 -#: source/ubl-settings-quotas.cc:128 source/ubl-settings-quotas.cc:125 +#: source/ubl-settings-quotas.cc:120 source/ubl-settings-quotas.cc:110 +#: source/ubl-settings-quotas.cc:131 source/ubl-settings-quotas.cc:128 +#: source/ubl-settings-quotas.cc:125 msgid "Hard limit (size) activation time" msgstr "" -#: source/ubl-settings-quotas.cc:109 source/ubl-settings-quotas.cc:130 -#: source/ubl-settings-quotas.cc:127 source/ubl-settings-quotas.cc:124 +#: source/ubl-settings-quotas.cc:119 source/ubl-settings-quotas.cc:109 +#: source/ubl-settings-quotas.cc:130 source/ubl-settings-quotas.cc:127 +#: source/ubl-settings-quotas.cc:124 msgid "Hard limit (size) delay" msgstr "" -#: source/ubl-settings-quotas.cc:145 +#: source/ubl-settings-quotas.cc:155 source/ubl-settings-quotas.cc:145 msgid "Help" msgstr "" -#: source/ubl-settings-quotas.cc:99 source/ubl-settings-quotas.cc:120 -#: source/ubl-settings-quotas.cc:117 source/ubl-settings-quotas.cc:114 -#: source/ubl-settings-quotas.cc:109 +#: source/ubl-settings-quotas.cc:109 source/ubl-settings-quotas.cc:99 +#: source/ubl-settings-quotas.cc:120 source/ubl-settings-quotas.cc:117 +#: source/ubl-settings-quotas.cc:114 msgid "Load" msgstr "" -#: source/ubl-settings-quotas.cc:142 +#: source/ubl-settings-quotas.cc:152 source/ubl-settings-quotas.cc:142 msgid "Load from global configuration" msgstr "" -#: source/ubl-settings-quotas.cc:143 +#: source/ubl-settings-quotas.cc:153 source/ubl-settings-quotas.cc:143 msgid "Load from local configuration" msgstr "" -#: source/ubl-settings-quotas.cc:455 +#: source/ubl-settings-quotas.cc:521 source/ubl-settings-quotas.cc:455 msgid "Local configuration downloaded successfully" msgstr "" -#: source/ubl-settings-quotas.cc:428 +#: source/ubl-settings-quotas.cc:494 source/ubl-settings-quotas.cc:428 msgid "Local configuration reading error" msgstr "" -#: source/ubl-settings-quotas.cc:461 +#: source/ubl-settings-quotas.cc:527 source/ubl-settings-quotas.cc:461 msgid "Local configuration successfully written" msgstr "" -#: source/ubl-settings-quotas.cc:436 +#: source/ubl-settings-quotas.cc:502 source/ubl-settings-quotas.cc:436 msgid "Local configuration write error" msgstr "" +#: source/ubl-settings-quotas.cc:114 source/ubl-settings-quotas.cc:369 #: source/ubl-settings-quotas.cc:104 source/ubl-settings-quotas.cc:314 #: source/ubl-settings-quotas.cc:125 source/ubl-settings-quotas.cc:318 #: source/ubl-settings-quotas.cc:122 source/ubl-settings-quotas.cc:310 @@ -292,16 +346,17 @@ msgstr "" msgid "Name" msgstr "" -#: source/ubl-settings-quotas.cc:470 +#: source/ubl-settings-quotas.cc:536 source/ubl-settings-quotas.cc:470 msgid "Nothing to save!" msgstr "" -#: source/ubl-settings-quotas.cc:65 source/ubl-settings-quotas.cc:86 -#: source/ubl-settings-quotas.cc:83 source/ubl-settings-quotas.cc:80 -#: source/ubl-settings-quotas.cc:79 +#: source/ubl-settings-quotas.cc:73 source/ubl-settings-quotas.cc:65 +#: source/ubl-settings-quotas.cc:86 source/ubl-settings-quotas.cc:83 +#: source/ubl-settings-quotas.cc:80 source/ubl-settings-quotas.cc:79 msgid "Project Home Page" msgstr "" +#: source/ubl-settings-quotas.cc:115 source/ubl-settings-quotas.cc:370 #: source/ubl-settings-quotas.cc:105 source/ubl-settings-quotas.cc:315 #: source/ubl-settings-quotas.cc:126 source/ubl-settings-quotas.cc:319 #: source/ubl-settings-quotas.cc:123 source/ubl-settings-quotas.cc:311 @@ -309,48 +364,76 @@ msgstr "" msgid "Quotas" msgstr "" -#: source/ubl-settings-quotas.cc:71 +#: source/ubl-settings-quotas.cc:81 source/ubl-settings-quotas.cc:71 msgid "Quotas for groups" msgstr "" -#: source/ubl-settings-quotas.cc:74 +#: source/ubl-settings-quotas.cc:84 source/ubl-settings-quotas.cc:74 msgid "Quotas for users" msgstr "" -#: source/ubl-settings-quotas.cc:100 source/ubl-settings-quotas.cc:121 -#: source/ubl-settings-quotas.cc:118 source/ubl-settings-quotas.cc:115 -#: source/ubl-settings-quotas.cc:110 +#: source/ubl-settings-quotas.cc:110 source/ubl-settings-quotas.cc:100 +#: source/ubl-settings-quotas.cc:121 source/ubl-settings-quotas.cc:118 +#: source/ubl-settings-quotas.cc:115 msgid "Save" msgstr "" -#: source/ubl-settings-quotas.cc:146 +#: source/ubl-settings-quotas.cc:156 source/ubl-settings-quotas.cc:146 msgid "Save to global and local configuration" msgstr "" -#: source/ubl-settings-quotas.cc:147 +#: source/ubl-settings-quotas.cc:157 source/ubl-settings-quotas.cc:147 msgid "Save to global configuration" msgstr "" -#: source/ubl-settings-quotas.cc:148 +#: source/ubl-settings-quotas.cc:158 source/ubl-settings-quotas.cc:148 msgid "Save to local configuration" msgstr "" +#: source/ubl-settings-quotas.cc:70 +msgid "Setting user quotas" +msgstr "" + +#: source/ubl-settings-quotas.cc:380 +msgid "" +"Severe\n" +"limitation\n" +"(files)" +msgstr "" + +#: source/ubl-settings-quotas.cc:373 +msgid "" +"Severe\n" +"limitation\n" +"(size)" +msgstr "" + +#: source/ubl-settings-quotas.cc:116 source/ubl-settings-quotas.cc:129 +#: source/ubl-settings-quotas.cc:140 source/ubl-settings-quotas.cc:371 #: source/ubl-settings-quotas.cc:106 source/ubl-settings-quotas.cc:119 #: source/ubl-settings-quotas.cc:130 source/ubl-settings-quotas.cc:316 -#: source/ubl-settings-quotas.cc:127 source/ubl-settings-quotas.cc:140 -#: source/ubl-settings-quotas.cc:151 source/ubl-settings-quotas.cc:320 -#: source/ubl-settings-quotas.cc:124 source/ubl-settings-quotas.cc:137 -#: source/ubl-settings-quotas.cc:148 source/ubl-settings-quotas.cc:312 -#: source/ubl-settings-quotas.cc:259 source/ubl-settings-quotas.cc:121 +#: source/ubl-settings-quotas.cc:127 source/ubl-settings-quotas.cc:151 +#: source/ubl-settings-quotas.cc:320 source/ubl-settings-quotas.cc:124 +#: source/ubl-settings-quotas.cc:137 source/ubl-settings-quotas.cc:148 +#: source/ubl-settings-quotas.cc:312 source/ubl-settings-quotas.cc:259 +#: source/ubl-settings-quotas.cc:121 msgid "Size" msgstr "" +#: source/ubl-settings-quotas.cc:379 +msgid "" +"Soft\n" +"Restriction\n" +"(files)" +msgstr "" + +#: source/ubl-settings-quotas.cc:132 source/ubl-settings-quotas.cc:135 +#: source/ubl-settings-quotas.cc:142 source/ubl-settings-quotas.cc:147 #: source/ubl-settings-quotas.cc:122 source/ubl-settings-quotas.cc:125 -#: source/ubl-settings-quotas.cc:132 source/ubl-settings-quotas.cc:137 -#: source/ubl-settings-quotas.cc:143 source/ubl-settings-quotas.cc:146 -#: source/ubl-settings-quotas.cc:153 source/ubl-settings-quotas.cc:158 -#: source/ubl-settings-quotas.cc:140 source/ubl-settings-quotas.cc:150 -#: source/ubl-settings-quotas.cc:155 +#: source/ubl-settings-quotas.cc:137 source/ubl-settings-quotas.cc:143 +#: source/ubl-settings-quotas.cc:146 source/ubl-settings-quotas.cc:153 +#: source/ubl-settings-quotas.cc:158 source/ubl-settings-quotas.cc:140 +#: source/ubl-settings-quotas.cc:150 source/ubl-settings-quotas.cc:155 msgid "Soft limit" msgstr "" @@ -361,44 +444,49 @@ msgid "" "(files)" msgstr "" -#: source/ubl-settings-quotas.cc:317 source/ubl-settings-quotas.cc:321 -#: source/ubl-settings-quotas.cc:313 source/ubl-settings-quotas.cc:260 +#: source/ubl-settings-quotas.cc:372 source/ubl-settings-quotas.cc:317 +#: source/ubl-settings-quotas.cc:321 source/ubl-settings-quotas.cc:313 +#: source/ubl-settings-quotas.cc:260 msgid "" "Soft limit\n" "(size)" msgstr "" -#: source/ubl-settings-quotas.cc:112 source/ubl-settings-quotas.cc:133 -#: source/ubl-settings-quotas.cc:130 source/ubl-settings-quotas.cc:127 +#: source/ubl-settings-quotas.cc:122 source/ubl-settings-quotas.cc:112 +#: source/ubl-settings-quotas.cc:133 source/ubl-settings-quotas.cc:130 +#: source/ubl-settings-quotas.cc:127 msgid "Soft limit (files)" msgstr "" -#: source/ubl-settings-quotas.cc:107 source/ubl-settings-quotas.cc:128 -#: source/ubl-settings-quotas.cc:125 source/ubl-settings-quotas.cc:122 +#: source/ubl-settings-quotas.cc:117 source/ubl-settings-quotas.cc:107 +#: source/ubl-settings-quotas.cc:128 source/ubl-settings-quotas.cc:125 +#: source/ubl-settings-quotas.cc:122 msgid "Soft limit (size)" msgstr "" -#: source/ubl-settings-quotas.cc:467 +#: source/ubl-settings-quotas.cc:533 source/ubl-settings-quotas.cc:467 msgid "Successfully saved local and global configuration" msgstr "" -#: source/ubl-settings-quotas.cc:47 source/ubl-settings-quotas.cc:68 -#: source/ubl-settings-quotas.cc:70 source/ubl-settings-quotas.cc:67 -#: source/ubl-settings-quotas.cc:66 +#: source/ubl-settings-quotas.cc:55 source/ubl-settings-quotas.cc:47 +#: source/ubl-settings-quotas.cc:68 source/ubl-settings-quotas.cc:70 +#: source/ubl-settings-quotas.cc:67 source/ubl-settings-quotas.cc:66 msgid "The program must be run as root" msgstr "" -#: source/ubl-settings-quotas.cc:129 source/ubl-settings-quotas.cc:150 -#: source/ubl-settings-quotas.cc:147 +#: source/ubl-settings-quotas.cc:139 source/ubl-settings-quotas.cc:129 +#: source/ubl-settings-quotas.cc:150 source/ubl-settings-quotas.cc:147 msgid "User quotas for this device: " msgstr "" -#: source/ubl-settings-quotas.cc:68 source/ubl-settings-quotas.cc:89 -#: source/ubl-settings-quotas.cc:86 source/ubl-settings-quotas.cc:83 -#: source/ubl-settings-quotas.cc:82 +#: source/ubl-settings-quotas.cc:78 source/ubl-settings-quotas.cc:68 +#: source/ubl-settings-quotas.cc:89 source/ubl-settings-quotas.cc:86 +#: source/ubl-settings-quotas.cc:83 source/ubl-settings-quotas.cc:82 msgid "Users" msgstr "" +#: source/ubl-settings-quotas.cc:93 source/ubl-settings-quotas.cc:94 +#: source/ubl-settings-quotas.cc:95 source/ubl-settings-quotas.cc:96 #: source/ubl-settings-quotas.cc:83 source/ubl-settings-quotas.cc:84 #: source/ubl-settings-quotas.cc:85 source/ubl-settings-quotas.cc:86 #: source/ubl-settings-quotas.cc:104 source/ubl-settings-quotas.cc:105 @@ -410,12 +498,15 @@ msgstr "" msgid "days" msgstr "" +#: source/ubl-settings-quotas.cc:149 source/ubl-settings-quotas.cc:150 #: source/ubl-settings-quotas.cc:139 source/ubl-settings-quotas.cc:140 #: source/ubl-settings-quotas.cc:160 source/ubl-settings-quotas.cc:161 #: source/ubl-settings-quotas.cc:157 source/ubl-settings-quotas.cc:158 msgid "files" msgstr "" +#: source/ubl-settings-quotas.cc:97 source/ubl-settings-quotas.cc:98 +#: source/ubl-settings-quotas.cc:99 source/ubl-settings-quotas.cc:100 #: source/ubl-settings-quotas.cc:87 source/ubl-settings-quotas.cc:88 #: source/ubl-settings-quotas.cc:89 source/ubl-settings-quotas.cc:90 #: source/ubl-settings-quotas.cc:108 source/ubl-settings-quotas.cc:109 @@ -427,12 +518,19 @@ msgstr "" msgid "hours" msgstr "" -#: source/ubl-settings-quotas.cc:63 source/ubl-settings-quotas.cc:84 -#: source/ubl-settings-quotas.cc:81 source/ubl-settings-quotas.cc:78 -#: source/ubl-settings-quotas.cc:77 +#: source/ubl-settings-quotas.cc:71 source/ubl-settings-quotas.cc:63 +#: source/ubl-settings-quotas.cc:84 source/ubl-settings-quotas.cc:81 +#: source/ubl-settings-quotas.cc:78 source/ubl-settings-quotas.cc:77 msgid "https://wiki.ublinux.com" msgstr "" +#: source/ubl-settings-quotas.cc:461 +msgid "" +"https://wiki.ublinux.com/ru/Программное_обеспечение/Программы_и_утилиты/Все/" +msgstr "" + +#: source/ubl-settings-quotas.cc:101 source/ubl-settings-quotas.cc:102 +#: source/ubl-settings-quotas.cc:103 source/ubl-settings-quotas.cc:104 #: source/ubl-settings-quotas.cc:91 source/ubl-settings-quotas.cc:92 #: source/ubl-settings-quotas.cc:93 source/ubl-settings-quotas.cc:94 #: source/ubl-settings-quotas.cc:112 source/ubl-settings-quotas.cc:113 @@ -458,12 +556,15 @@ msgstr "" msgid "quotas for users" msgstr "" -#: source/ubl-settings-quotas.cc:476 source/ubl-settings-quotas.cc:350 -#: source/ubl-settings-quotas.cc:371 source/ubl-settings-quotas.cc:318 -#: source/ubl-settings-quotas.cc:267 source/ubl-settings-quotas.cc:213 +#: source/ubl-settings-quotas.cc:542 source/ubl-settings-quotas.cc:476 +#: source/ubl-settings-quotas.cc:350 source/ubl-settings-quotas.cc:371 +#: source/ubl-settings-quotas.cc:318 source/ubl-settings-quotas.cc:267 +#: source/ubl-settings-quotas.cc:213 msgid "ubl-settings-quotas version: " msgstr "" +#: source/ubl-settings-quotas.cc:89 source/ubl-settings-quotas.cc:90 +#: source/ubl-settings-quotas.cc:91 source/ubl-settings-quotas.cc:92 #: source/ubl-settings-quotas.cc:79 source/ubl-settings-quotas.cc:80 #: source/ubl-settings-quotas.cc:81 source/ubl-settings-quotas.cc:82 #: source/ubl-settings-quotas.cc:100 source/ubl-settings-quotas.cc:101 diff --git a/ubl-settings-quotas_ru.po b/ubl-settings-quotas_ru.po index 9bd1f21..e649c18 100644 --- a/ubl-settings-quotas_ru.po +++ b/ubl-settings-quotas_ru.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: ublexec 1.0\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-04-10 09:09+0000\n" +"POT-Creation-Date: 2023-04-10 14:57+0000\n" "PO-Revision-Date: 2023-01-01 00:00+0600\n" "Last-Translator: UBLinux Team \n" "Language-Team: Russian - UBLinux Team \n" @@ -17,37 +17,33 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -msgid "Setting user quotas" -msgstr "Настройка квот пользователей" - -msgid "ubl-settings-quotas" -msgstr "Квоты" - -#: source/ubl-settings-quotas.cc:144 +#: source/ubl-settings-quotas.cc:154 source/ubl-settings-quotas.cc:144 msgid "About" msgstr "О программе" -#: source/ubl-settings-quotas.cc:103 source/ubl-settings-quotas.cc:124 -#: source/ubl-settings-quotas.cc:121 source/ubl-settings-quotas.cc:118 +#: source/ubl-settings-quotas.cc:113 source/ubl-settings-quotas.cc:103 +#: source/ubl-settings-quotas.cc:124 source/ubl-settings-quotas.cc:121 +#: source/ubl-settings-quotas.cc:118 msgid "Configuration of disk quotas parameters for system groups and users" msgstr "Настройка параметров дисковых квот для системных групп и пользователей" -#: source/ubl-settings-quotas.cc:60 source/ubl-settings-quotas.cc:81 -#: source/ubl-settings-quotas.cc:78 source/ubl-settings-quotas.cc:75 -#: source/ubl-settings-quotas.cc:74 +#: source/ubl-settings-quotas.cc:68 source/ubl-settings-quotas.cc:60 +#: source/ubl-settings-quotas.cc:81 source/ubl-settings-quotas.cc:78 +#: source/ubl-settings-quotas.cc:75 source/ubl-settings-quotas.cc:74 msgid "Copyright © UBSoft LLC, 2022 - " msgstr "" -#: source/ubl-settings-quotas.cc:121 source/ubl-settings-quotas.cc:126 -#: source/ubl-settings-quotas.cc:131 source/ubl-settings-quotas.cc:142 +#: source/ubl-settings-quotas.cc:131 source/ubl-settings-quotas.cc:136 +#: source/ubl-settings-quotas.cc:141 source/ubl-settings-quotas.cc:121 +#: source/ubl-settings-quotas.cc:126 source/ubl-settings-quotas.cc:142 #: source/ubl-settings-quotas.cc:147 source/ubl-settings-quotas.cc:152 #: source/ubl-settings-quotas.cc:139 source/ubl-settings-quotas.cc:144 #: source/ubl-settings-quotas.cc:149 msgid "Currently using:" msgstr "В настоящее время используется:" -#: source/ubl-settings-quotas.cc:136 source/ubl-settings-quotas.cc:157 -#: source/ubl-settings-quotas.cc:154 +#: source/ubl-settings-quotas.cc:146 source/ubl-settings-quotas.cc:136 +#: source/ubl-settings-quotas.cc:157 source/ubl-settings-quotas.cc:154 msgid "Currently using: " msgstr "В настоящее время используется: " @@ -57,24 +53,53 @@ msgstr "В настоящее время используется: " msgid "Date and Time" msgstr "Дата и время" -#: source/ubl-settings-quotas.cc:69 source/ubl-settings-quotas.cc:101 -#: source/ubl-settings-quotas.cc:102 source/ubl-settings-quotas.cc:116 -#: source/ubl-settings-quotas.cc:128 source/ubl-settings-quotas.cc:90 -#: source/ubl-settings-quotas.cc:122 source/ubl-settings-quotas.cc:123 -#: source/ubl-settings-quotas.cc:137 source/ubl-settings-quotas.cc:149 -#: source/ubl-settings-quotas.cc:87 source/ubl-settings-quotas.cc:119 -#: source/ubl-settings-quotas.cc:120 source/ubl-settings-quotas.cc:134 -#: source/ubl-settings-quotas.cc:146 source/ubl-settings-quotas.cc:84 -#: source/ubl-settings-quotas.cc:117 source/ubl-settings-quotas.cc:83 +#: source/ubl-settings-quotas.cc:381 +msgid "" +"Deferring\n" +"a hard\n" +"limit\n" +"(files)" +msgstr "" +"Отсрочка\n" +"жесткого\n" +"ограничения\n" +"(файлы)" + +#: source/ubl-settings-quotas.cc:374 +msgid "" +"Deferring\n" +"a hard\n" +"limit\n" +"(size)" +msgstr "" +"Отсрочка\n" +"жесткого\n" +"ограничения\n" +"(объём)" + +#: source/ubl-settings-quotas.cc:79 source/ubl-settings-quotas.cc:111 +#: source/ubl-settings-quotas.cc:112 source/ubl-settings-quotas.cc:126 +#: source/ubl-settings-quotas.cc:138 source/ubl-settings-quotas.cc:69 +#: source/ubl-settings-quotas.cc:101 source/ubl-settings-quotas.cc:102 +#: source/ubl-settings-quotas.cc:116 source/ubl-settings-quotas.cc:128 +#: source/ubl-settings-quotas.cc:90 source/ubl-settings-quotas.cc:122 +#: source/ubl-settings-quotas.cc:123 source/ubl-settings-quotas.cc:137 +#: source/ubl-settings-quotas.cc:149 source/ubl-settings-quotas.cc:87 +#: source/ubl-settings-quotas.cc:119 source/ubl-settings-quotas.cc:120 +#: source/ubl-settings-quotas.cc:134 source/ubl-settings-quotas.cc:146 +#: source/ubl-settings-quotas.cc:84 source/ubl-settings-quotas.cc:117 +#: source/ubl-settings-quotas.cc:83 msgid "Device:" msgstr "Устройство:" -#: source/ubl-settings-quotas.cc:117 source/ubl-settings-quotas.cc:127 -#: source/ubl-settings-quotas.cc:138 source/ubl-settings-quotas.cc:148 -#: source/ubl-settings-quotas.cc:135 source/ubl-settings-quotas.cc:145 +#: source/ubl-settings-quotas.cc:127 source/ubl-settings-quotas.cc:137 +#: source/ubl-settings-quotas.cc:117 source/ubl-settings-quotas.cc:138 +#: source/ubl-settings-quotas.cc:148 source/ubl-settings-quotas.cc:135 +#: source/ubl-settings-quotas.cc:145 msgid "Disk quotas for this device:" msgstr "Дисковые квоты для этого устройства:" +#: source/ubl-settings-quotas.cc:82 source/ubl-settings-quotas.cc:83 #: source/ubl-settings-quotas.cc:72 source/ubl-settings-quotas.cc:73 #: source/ubl-settings-quotas.cc:93 source/ubl-settings-quotas.cc:94 #: source/ubl-settings-quotas.cc:90 source/ubl-settings-quotas.cc:91 @@ -83,11 +108,12 @@ msgstr "Дисковые квоты для этого устройства:" msgid "Enable" msgstr "Включить" -#: source/ubl-settings-quotas.cc:444 +#: source/ubl-settings-quotas.cc:510 source/ubl-settings-quotas.cc:444 #, fuzzy msgid "Error saved local and global configuration" msgstr "Сохранить глобальную и локальную конфигурацию" +#: source/ubl-settings-quotas.cc:86 source/ubl-settings-quotas.cc:88 #: source/ubl-settings-quotas.cc:76 source/ubl-settings-quotas.cc:78 #: source/ubl-settings-quotas.cc:97 source/ubl-settings-quotas.cc:99 #: source/ubl-settings-quotas.cc:94 source/ubl-settings-quotas.cc:96 @@ -96,6 +122,7 @@ msgstr "Сохранить глобальную и локальную конфи msgid "Excess files delay period" msgstr "Превышение периода задержки файлов" +#: source/ubl-settings-quotas.cc:85 source/ubl-settings-quotas.cc:87 #: source/ubl-settings-quotas.cc:75 source/ubl-settings-quotas.cc:77 #: source/ubl-settings-quotas.cc:96 source/ubl-settings-quotas.cc:98 #: source/ubl-settings-quotas.cc:93 source/ubl-settings-quotas.cc:95 @@ -104,18 +131,23 @@ msgstr "Превышение периода задержки файлов" msgid "Excess size delay period" msgstr "Период задержки превышения размера" -#: source/ubl-settings-quotas.cc:70 source/ubl-settings-quotas.cc:95 -#: source/ubl-settings-quotas.cc:96 source/ubl-settings-quotas.cc:134 -#: source/ubl-settings-quotas.cc:141 source/ubl-settings-quotas.cc:91 -#: source/ubl-settings-quotas.cc:116 source/ubl-settings-quotas.cc:117 -#: source/ubl-settings-quotas.cc:155 source/ubl-settings-quotas.cc:162 -#: source/ubl-settings-quotas.cc:88 source/ubl-settings-quotas.cc:113 -#: source/ubl-settings-quotas.cc:114 source/ubl-settings-quotas.cc:152 -#: source/ubl-settings-quotas.cc:85 source/ubl-settings-quotas.cc:110 -#: source/ubl-settings-quotas.cc:111 source/ubl-settings-quotas.cc:84 +#: source/ubl-settings-quotas.cc:80 source/ubl-settings-quotas.cc:105 +#: source/ubl-settings-quotas.cc:106 source/ubl-settings-quotas.cc:144 +#: source/ubl-settings-quotas.cc:151 source/ubl-settings-quotas.cc:70 +#: source/ubl-settings-quotas.cc:95 source/ubl-settings-quotas.cc:96 +#: source/ubl-settings-quotas.cc:134 source/ubl-settings-quotas.cc:141 +#: source/ubl-settings-quotas.cc:91 source/ubl-settings-quotas.cc:116 +#: source/ubl-settings-quotas.cc:117 source/ubl-settings-quotas.cc:155 +#: source/ubl-settings-quotas.cc:162 source/ubl-settings-quotas.cc:88 +#: source/ubl-settings-quotas.cc:113 source/ubl-settings-quotas.cc:114 +#: source/ubl-settings-quotas.cc:152 source/ubl-settings-quotas.cc:85 +#: source/ubl-settings-quotas.cc:110 source/ubl-settings-quotas.cc:111 +#: source/ubl-settings-quotas.cc:84 msgid "File system:" msgstr "Файловая система:" +#: source/ubl-settings-quotas.cc:121 source/ubl-settings-quotas.cc:130 +#: source/ubl-settings-quotas.cc:145 source/ubl-settings-quotas.cc:378 #: source/ubl-settings-quotas.cc:111 source/ubl-settings-quotas.cc:120 #: source/ubl-settings-quotas.cc:135 source/ubl-settings-quotas.cc:321 #: source/ubl-settings-quotas.cc:132 source/ubl-settings-quotas.cc:141 @@ -126,6 +158,7 @@ msgstr "Файловая система:" msgid "Files" msgstr "Файлы" +#: source/ubl-settings-quotas.cc:107 source/ubl-settings-quotas.cc:108 #: source/ubl-settings-quotas.cc:97 source/ubl-settings-quotas.cc:98 #: source/ubl-settings-quotas.cc:118 source/ubl-settings-quotas.cc:119 #: source/ubl-settings-quotas.cc:115 source/ubl-settings-quotas.cc:116 @@ -148,47 +181,49 @@ msgstr "" " -h, --help\t Показать параметры справки\n" " -V, --version\t Показать версию пакета\n" -#: source/ubl-settings-quotas.cc:66 source/ubl-settings-quotas.cc:87 -#: source/ubl-settings-quotas.cc:84 source/ubl-settings-quotas.cc:81 -#: source/ubl-settings-quotas.cc:80 +#: source/ubl-settings-quotas.cc:74 source/ubl-settings-quotas.cc:66 +#: source/ubl-settings-quotas.cc:87 source/ubl-settings-quotas.cc:84 +#: source/ubl-settings-quotas.cc:81 source/ubl-settings-quotas.cc:80 msgid "General settings" msgstr "Общие настройки" -#: source/ubl-settings-quotas.cc:458 +#: source/ubl-settings-quotas.cc:524 source/ubl-settings-quotas.cc:458 msgid "Global configuration downloaded successfully" -msgstr "" +msgstr "Успешно загружена глобальная конфигурация" -#: source/ubl-settings-quotas.cc:432 +#: source/ubl-settings-quotas.cc:498 source/ubl-settings-quotas.cc:432 #, fuzzy msgid "Global configuration read error" msgstr "Сохранить глобальную конфигурацию" -#: source/ubl-settings-quotas.cc:464 +#: source/ubl-settings-quotas.cc:530 source/ubl-settings-quotas.cc:464 msgid "Global configuration successfully written" -msgstr "" +msgstr "Успешно записана глобальная конфигурация" -#: source/ubl-settings-quotas.cc:440 +#: source/ubl-settings-quotas.cc:506 source/ubl-settings-quotas.cc:440 #, fuzzy msgid "Global configuration write error" msgstr "Сохранить глобальную конфигурацию" -#: source/ubl-settings-quotas.cc:118 source/ubl-settings-quotas.cc:139 -#: source/ubl-settings-quotas.cc:136 +#: source/ubl-settings-quotas.cc:128 source/ubl-settings-quotas.cc:118 +#: source/ubl-settings-quotas.cc:139 source/ubl-settings-quotas.cc:136 msgid "Group quotas for this device:" msgstr "Групповые квоты для этого устройства:" -#: source/ubl-settings-quotas.cc:67 source/ubl-settings-quotas.cc:88 -#: source/ubl-settings-quotas.cc:85 source/ubl-settings-quotas.cc:82 -#: source/ubl-settings-quotas.cc:81 +#: source/ubl-settings-quotas.cc:75 source/ubl-settings-quotas.cc:67 +#: source/ubl-settings-quotas.cc:88 source/ubl-settings-quotas.cc:85 +#: source/ubl-settings-quotas.cc:82 source/ubl-settings-quotas.cc:81 msgid "Groups" msgstr "Группы" +#: source/ubl-settings-quotas.cc:133 source/ubl-settings-quotas.cc:134 +#: source/ubl-settings-quotas.cc:143 source/ubl-settings-quotas.cc:148 #: source/ubl-settings-quotas.cc:123 source/ubl-settings-quotas.cc:124 -#: source/ubl-settings-quotas.cc:133 source/ubl-settings-quotas.cc:138 -#: source/ubl-settings-quotas.cc:144 source/ubl-settings-quotas.cc:145 -#: source/ubl-settings-quotas.cc:154 source/ubl-settings-quotas.cc:159 -#: source/ubl-settings-quotas.cc:141 source/ubl-settings-quotas.cc:142 -#: source/ubl-settings-quotas.cc:151 source/ubl-settings-quotas.cc:156 +#: source/ubl-settings-quotas.cc:138 source/ubl-settings-quotas.cc:144 +#: source/ubl-settings-quotas.cc:145 source/ubl-settings-quotas.cc:154 +#: source/ubl-settings-quotas.cc:159 source/ubl-settings-quotas.cc:141 +#: source/ubl-settings-quotas.cc:142 source/ubl-settings-quotas.cc:151 +#: source/ubl-settings-quotas.cc:156 #, fuzzy msgid "Hard limit" msgstr "Жесткий предел" @@ -222,8 +257,8 @@ msgid "" "(files) activation\n" "time" msgstr "" -"Время активации\n" -"жесткого лимита (файла)" +"Жесткий предел\n" +"(размер)" #: source/ubl-settings-quotas.cc:324 source/ubl-settings-quotas.cc:328 #: source/ubl-settings-quotas.cc:320 source/ubl-settings-quotas.cc:267 @@ -255,72 +290,100 @@ msgstr "" "Жесткий предел\n" "(размер) задержки" -#: source/ubl-settings-quotas.cc:115 source/ubl-settings-quotas.cc:136 -#: source/ubl-settings-quotas.cc:133 source/ubl-settings-quotas.cc:130 +#: source/ubl-settings-quotas.cc:382 +#, fuzzy +msgid "" +"Hard limit\n" +"activation\n" +"time (files)" +msgstr "" +"Время активации\n" +"жесткого лимита\n" +"(файла)" + +#: source/ubl-settings-quotas.cc:375 +msgid "" +"Hard limit\n" +"activation\n" +"time (size)" +msgstr "" +"Время активации\n" +"жесткого лимита\n" +"(объём)" + +#: source/ubl-settings-quotas.cc:125 source/ubl-settings-quotas.cc:115 +#: source/ubl-settings-quotas.cc:136 source/ubl-settings-quotas.cc:133 +#: source/ubl-settings-quotas.cc:130 msgid "Hard limit (file) activation time" msgstr "Время активации жесткого лимита (файла)" -#: source/ubl-settings-quotas.cc:113 source/ubl-settings-quotas.cc:134 -#: source/ubl-settings-quotas.cc:131 source/ubl-settings-quotas.cc:128 +#: source/ubl-settings-quotas.cc:123 source/ubl-settings-quotas.cc:113 +#: source/ubl-settings-quotas.cc:134 source/ubl-settings-quotas.cc:131 +#: source/ubl-settings-quotas.cc:128 msgid "Hard limit (files)" msgstr "Жесткий лимит (файлы)" -#: source/ubl-settings-quotas.cc:114 source/ubl-settings-quotas.cc:135 -#: source/ubl-settings-quotas.cc:132 source/ubl-settings-quotas.cc:129 +#: source/ubl-settings-quotas.cc:124 source/ubl-settings-quotas.cc:114 +#: source/ubl-settings-quotas.cc:135 source/ubl-settings-quotas.cc:132 +#: source/ubl-settings-quotas.cc:129 msgid "Hard limit (files) delay" msgstr "Жесткий лимит (файлы)" -#: source/ubl-settings-quotas.cc:108 source/ubl-settings-quotas.cc:129 -#: source/ubl-settings-quotas.cc:126 source/ubl-settings-quotas.cc:123 +#: source/ubl-settings-quotas.cc:118 source/ubl-settings-quotas.cc:108 +#: source/ubl-settings-quotas.cc:129 source/ubl-settings-quotas.cc:126 +#: source/ubl-settings-quotas.cc:123 msgid "Hard limit (size)" msgstr "Жесткий предел (размер) задержки" -#: source/ubl-settings-quotas.cc:110 source/ubl-settings-quotas.cc:131 -#: source/ubl-settings-quotas.cc:128 source/ubl-settings-quotas.cc:125 +#: source/ubl-settings-quotas.cc:120 source/ubl-settings-quotas.cc:110 +#: source/ubl-settings-quotas.cc:131 source/ubl-settings-quotas.cc:128 +#: source/ubl-settings-quotas.cc:125 msgid "Hard limit (size) activation time" msgstr "Жесткий предел (размер)" -#: source/ubl-settings-quotas.cc:109 source/ubl-settings-quotas.cc:130 -#: source/ubl-settings-quotas.cc:127 source/ubl-settings-quotas.cc:124 +#: source/ubl-settings-quotas.cc:119 source/ubl-settings-quotas.cc:109 +#: source/ubl-settings-quotas.cc:130 source/ubl-settings-quotas.cc:127 +#: source/ubl-settings-quotas.cc:124 msgid "Hard limit (size) delay" msgstr "Жесткий предел (размер) задержки" -#: source/ubl-settings-quotas.cc:145 +#: source/ubl-settings-quotas.cc:155 source/ubl-settings-quotas.cc:145 msgid "Help" msgstr "Справка" -#: source/ubl-settings-quotas.cc:99 source/ubl-settings-quotas.cc:120 -#: source/ubl-settings-quotas.cc:117 source/ubl-settings-quotas.cc:114 -#: source/ubl-settings-quotas.cc:109 +#: source/ubl-settings-quotas.cc:109 source/ubl-settings-quotas.cc:99 +#: source/ubl-settings-quotas.cc:120 source/ubl-settings-quotas.cc:117 +#: source/ubl-settings-quotas.cc:114 msgid "Load" msgstr "Загрузить" -#: source/ubl-settings-quotas.cc:142 +#: source/ubl-settings-quotas.cc:152 source/ubl-settings-quotas.cc:142 msgid "Load from global configuration" msgstr "Загрузить глобальную конфигурацию" -#: source/ubl-settings-quotas.cc:143 +#: source/ubl-settings-quotas.cc:153 source/ubl-settings-quotas.cc:143 msgid "Load from local configuration" msgstr "Загрузить локальную конфигурацию" -#: source/ubl-settings-quotas.cc:455 +#: source/ubl-settings-quotas.cc:521 source/ubl-settings-quotas.cc:455 msgid "Local configuration downloaded successfully" -msgstr "" +msgstr "Успешно загружена локальная конфигурация" -#: source/ubl-settings-quotas.cc:428 +#: source/ubl-settings-quotas.cc:494 source/ubl-settings-quotas.cc:428 #, fuzzy msgid "Local configuration reading error" msgstr "Загрузить локальную конфигурацию" -#: source/ubl-settings-quotas.cc:461 +#: source/ubl-settings-quotas.cc:527 source/ubl-settings-quotas.cc:461 msgid "Local configuration successfully written" -msgstr "" +msgstr "Успешно записана локальная конфигурация" -#: source/ubl-settings-quotas.cc:436 +#: source/ubl-settings-quotas.cc:502 source/ubl-settings-quotas.cc:436 #, fuzzy msgid "Local configuration write error" msgstr "Загрузить локальную конфигурацию" +#: source/ubl-settings-quotas.cc:114 source/ubl-settings-quotas.cc:369 #: source/ubl-settings-quotas.cc:104 source/ubl-settings-quotas.cc:314 #: source/ubl-settings-quotas.cc:125 source/ubl-settings-quotas.cc:318 #: source/ubl-settings-quotas.cc:122 source/ubl-settings-quotas.cc:310 @@ -328,16 +391,17 @@ msgstr "Загрузить локальную конфигурацию" msgid "Name" msgstr "Имя" -#: source/ubl-settings-quotas.cc:470 +#: source/ubl-settings-quotas.cc:536 source/ubl-settings-quotas.cc:470 msgid "Nothing to save!" msgstr "Нечего сохранять!" -#: source/ubl-settings-quotas.cc:65 source/ubl-settings-quotas.cc:86 -#: source/ubl-settings-quotas.cc:83 source/ubl-settings-quotas.cc:80 -#: source/ubl-settings-quotas.cc:79 +#: source/ubl-settings-quotas.cc:73 source/ubl-settings-quotas.cc:65 +#: source/ubl-settings-quotas.cc:86 source/ubl-settings-quotas.cc:83 +#: source/ubl-settings-quotas.cc:80 source/ubl-settings-quotas.cc:79 msgid "Project Home Page" msgstr "Главная страница проекта" +#: source/ubl-settings-quotas.cc:115 source/ubl-settings-quotas.cc:370 #: source/ubl-settings-quotas.cc:105 source/ubl-settings-quotas.cc:315 #: source/ubl-settings-quotas.cc:126 source/ubl-settings-quotas.cc:319 #: source/ubl-settings-quotas.cc:123 source/ubl-settings-quotas.cc:311 @@ -345,53 +409,90 @@ msgstr "Главная страница проекта" msgid "Quotas" msgstr "Квоты" -#: source/ubl-settings-quotas.cc:71 +#: source/ubl-settings-quotas.cc:81 source/ubl-settings-quotas.cc:71 msgid "Quotas for groups" msgstr "Квоты для групп" -#: source/ubl-settings-quotas.cc:74 +#: source/ubl-settings-quotas.cc:84 source/ubl-settings-quotas.cc:74 msgid "Quotas for users" msgstr "Квоты для пользователей" -#: source/ubl-settings-quotas.cc:100 source/ubl-settings-quotas.cc:121 -#: source/ubl-settings-quotas.cc:118 source/ubl-settings-quotas.cc:115 -#: source/ubl-settings-quotas.cc:110 +#: source/ubl-settings-quotas.cc:110 source/ubl-settings-quotas.cc:100 +#: source/ubl-settings-quotas.cc:121 source/ubl-settings-quotas.cc:118 +#: source/ubl-settings-quotas.cc:115 msgid "Save" msgstr "Сохранить" -#: source/ubl-settings-quotas.cc:146 +#: source/ubl-settings-quotas.cc:156 source/ubl-settings-quotas.cc:146 msgid "Save to global and local configuration" msgstr "Сохранить глобальную и локальную конфигурацию" -#: source/ubl-settings-quotas.cc:147 +#: source/ubl-settings-quotas.cc:157 source/ubl-settings-quotas.cc:147 msgid "Save to global configuration" msgstr "Сохранить глобальную конфигурацию" -#: source/ubl-settings-quotas.cc:148 +#: source/ubl-settings-quotas.cc:158 source/ubl-settings-quotas.cc:148 msgid "Save to local configuration" msgstr "Сохранить локальную конфигурацию" +#: source/ubl-settings-quotas.cc:70 +msgid "Setting user quotas" +msgstr "Настройка квот пользователей" + +#: source/ubl-settings-quotas.cc:380 +msgid "" +"Severe\n" +"limitation\n" +"(files)" +msgstr "" +"Жесткое\n" +"ограничение\n" +"(файлы)" + +#: source/ubl-settings-quotas.cc:373 +msgid "" +"Severe\n" +"limitation\n" +"(size)" +msgstr "" +"Жесткое\n" +"ограничение\n" +"(объём)" + +#: source/ubl-settings-quotas.cc:116 source/ubl-settings-quotas.cc:129 +#: source/ubl-settings-quotas.cc:140 source/ubl-settings-quotas.cc:371 #: source/ubl-settings-quotas.cc:106 source/ubl-settings-quotas.cc:119 #: source/ubl-settings-quotas.cc:130 source/ubl-settings-quotas.cc:316 -#: source/ubl-settings-quotas.cc:127 source/ubl-settings-quotas.cc:140 -#: source/ubl-settings-quotas.cc:151 source/ubl-settings-quotas.cc:320 -#: source/ubl-settings-quotas.cc:124 source/ubl-settings-quotas.cc:137 -#: source/ubl-settings-quotas.cc:148 source/ubl-settings-quotas.cc:312 -#: source/ubl-settings-quotas.cc:259 source/ubl-settings-quotas.cc:121 +#: source/ubl-settings-quotas.cc:127 source/ubl-settings-quotas.cc:151 +#: source/ubl-settings-quotas.cc:320 source/ubl-settings-quotas.cc:124 +#: source/ubl-settings-quotas.cc:137 source/ubl-settings-quotas.cc:148 +#: source/ubl-settings-quotas.cc:312 source/ubl-settings-quotas.cc:259 +#: source/ubl-settings-quotas.cc:121 msgid "Size" msgstr "Объём" +#: source/ubl-settings-quotas.cc:379 +msgid "" +"Soft\n" +"Restriction\n" +"(files)" +msgstr "" +"Мягкое\n" +"ограничение\n" +"(файлы)" + +#: source/ubl-settings-quotas.cc:132 source/ubl-settings-quotas.cc:135 +#: source/ubl-settings-quotas.cc:142 source/ubl-settings-quotas.cc:147 #: source/ubl-settings-quotas.cc:122 source/ubl-settings-quotas.cc:125 -#: source/ubl-settings-quotas.cc:132 source/ubl-settings-quotas.cc:137 -#: source/ubl-settings-quotas.cc:143 source/ubl-settings-quotas.cc:146 -#: source/ubl-settings-quotas.cc:153 source/ubl-settings-quotas.cc:158 -#: source/ubl-settings-quotas.cc:140 source/ubl-settings-quotas.cc:150 -#: source/ubl-settings-quotas.cc:155 +#: source/ubl-settings-quotas.cc:137 source/ubl-settings-quotas.cc:143 +#: source/ubl-settings-quotas.cc:146 source/ubl-settings-quotas.cc:153 +#: source/ubl-settings-quotas.cc:158 source/ubl-settings-quotas.cc:140 +#: source/ubl-settings-quotas.cc:150 source/ubl-settings-quotas.cc:155 #, fuzzy msgid "Soft limit" msgstr "" -"Мягкий предел\n" -"(размер)" +"Мягкий ограничение\n" +"(объём)" #: source/ubl-settings-quotas.cc:322 source/ubl-settings-quotas.cc:326 #: source/ubl-settings-quotas.cc:318 source/ubl-settings-quotas.cc:265 @@ -400,55 +501,60 @@ msgid "" "Soft limit\n" "(files)" msgstr "" -"Мягкий лимит\n" +"Мягкий ограничение\n" "(файлы)" -#: source/ubl-settings-quotas.cc:317 source/ubl-settings-quotas.cc:321 -#: source/ubl-settings-quotas.cc:313 source/ubl-settings-quotas.cc:260 +#: source/ubl-settings-quotas.cc:372 source/ubl-settings-quotas.cc:317 +#: source/ubl-settings-quotas.cc:321 source/ubl-settings-quotas.cc:313 +#: source/ubl-settings-quotas.cc:260 #, fuzzy msgid "" "Soft limit\n" "(size)" msgstr "" -"Мягкий предел\n" -"(размер)" +"Мягкий ограничение\n" +"(объём)" -#: source/ubl-settings-quotas.cc:112 source/ubl-settings-quotas.cc:133 -#: source/ubl-settings-quotas.cc:130 source/ubl-settings-quotas.cc:127 +#: source/ubl-settings-quotas.cc:122 source/ubl-settings-quotas.cc:112 +#: source/ubl-settings-quotas.cc:133 source/ubl-settings-quotas.cc:130 +#: source/ubl-settings-quotas.cc:127 msgid "Soft limit (files)" msgstr "" -"Мягкий лимит\n" +"Мягкий ограничение\n" "(файлы)" -#: source/ubl-settings-quotas.cc:107 source/ubl-settings-quotas.cc:128 -#: source/ubl-settings-quotas.cc:125 source/ubl-settings-quotas.cc:122 +#: source/ubl-settings-quotas.cc:117 source/ubl-settings-quotas.cc:107 +#: source/ubl-settings-quotas.cc:128 source/ubl-settings-quotas.cc:125 +#: source/ubl-settings-quotas.cc:122 msgid "Soft limit (size)" msgstr "" "Мягкий предел\n" "(размер)" -#: source/ubl-settings-quotas.cc:467 +#: source/ubl-settings-quotas.cc:533 source/ubl-settings-quotas.cc:467 #, fuzzy msgid "Successfully saved local and global configuration" msgstr "Сохранить глобальную и локальную конфигурацию" -#: source/ubl-settings-quotas.cc:47 source/ubl-settings-quotas.cc:68 -#: source/ubl-settings-quotas.cc:70 source/ubl-settings-quotas.cc:67 -#: source/ubl-settings-quotas.cc:66 +#: source/ubl-settings-quotas.cc:55 source/ubl-settings-quotas.cc:47 +#: source/ubl-settings-quotas.cc:68 source/ubl-settings-quotas.cc:70 +#: source/ubl-settings-quotas.cc:67 source/ubl-settings-quotas.cc:66 msgid "The program must be run as root" msgstr "Программа должна быть запущена от имени root" -#: source/ubl-settings-quotas.cc:129 source/ubl-settings-quotas.cc:150 -#: source/ubl-settings-quotas.cc:147 +#: source/ubl-settings-quotas.cc:139 source/ubl-settings-quotas.cc:129 +#: source/ubl-settings-quotas.cc:150 source/ubl-settings-quotas.cc:147 msgid "User quotas for this device: " msgstr "Квоты пользователей для этого устройства: " -#: source/ubl-settings-quotas.cc:68 source/ubl-settings-quotas.cc:89 -#: source/ubl-settings-quotas.cc:86 source/ubl-settings-quotas.cc:83 -#: source/ubl-settings-quotas.cc:82 +#: source/ubl-settings-quotas.cc:78 source/ubl-settings-quotas.cc:68 +#: source/ubl-settings-quotas.cc:89 source/ubl-settings-quotas.cc:86 +#: source/ubl-settings-quotas.cc:83 source/ubl-settings-quotas.cc:82 msgid "Users" msgstr "Пользователи" +#: source/ubl-settings-quotas.cc:93 source/ubl-settings-quotas.cc:94 +#: source/ubl-settings-quotas.cc:95 source/ubl-settings-quotas.cc:96 #: source/ubl-settings-quotas.cc:83 source/ubl-settings-quotas.cc:84 #: source/ubl-settings-quotas.cc:85 source/ubl-settings-quotas.cc:86 #: source/ubl-settings-quotas.cc:104 source/ubl-settings-quotas.cc:105 @@ -460,6 +566,7 @@ msgstr "Пользователи" msgid "days" msgstr "дни" +#: source/ubl-settings-quotas.cc:149 source/ubl-settings-quotas.cc:150 #: source/ubl-settings-quotas.cc:139 source/ubl-settings-quotas.cc:140 #: source/ubl-settings-quotas.cc:160 source/ubl-settings-quotas.cc:161 #: source/ubl-settings-quotas.cc:157 source/ubl-settings-quotas.cc:158 @@ -467,6 +574,8 @@ msgstr "дни" msgid "files" msgstr "Файлы" +#: source/ubl-settings-quotas.cc:97 source/ubl-settings-quotas.cc:98 +#: source/ubl-settings-quotas.cc:99 source/ubl-settings-quotas.cc:100 #: source/ubl-settings-quotas.cc:87 source/ubl-settings-quotas.cc:88 #: source/ubl-settings-quotas.cc:89 source/ubl-settings-quotas.cc:90 #: source/ubl-settings-quotas.cc:108 source/ubl-settings-quotas.cc:109 @@ -478,12 +587,19 @@ msgstr "Файлы" msgid "hours" msgstr "часы" -#: source/ubl-settings-quotas.cc:63 source/ubl-settings-quotas.cc:84 -#: source/ubl-settings-quotas.cc:81 source/ubl-settings-quotas.cc:78 -#: source/ubl-settings-quotas.cc:77 +#: source/ubl-settings-quotas.cc:71 source/ubl-settings-quotas.cc:63 +#: source/ubl-settings-quotas.cc:84 source/ubl-settings-quotas.cc:81 +#: source/ubl-settings-quotas.cc:78 source/ubl-settings-quotas.cc:77 msgid "https://wiki.ublinux.com" msgstr "https://wiki.ublinux.ru" +#: source/ubl-settings-quotas.cc:461 +msgid "" +"https://wiki.ublinux.com/ru/Программное_обеспечение/Программы_и_утилиты/Все/" +msgstr "" + +#: source/ubl-settings-quotas.cc:101 source/ubl-settings-quotas.cc:102 +#: source/ubl-settings-quotas.cc:103 source/ubl-settings-quotas.cc:104 #: source/ubl-settings-quotas.cc:91 source/ubl-settings-quotas.cc:92 #: source/ubl-settings-quotas.cc:93 source/ubl-settings-quotas.cc:94 #: source/ubl-settings-quotas.cc:112 source/ubl-settings-quotas.cc:113 @@ -511,12 +627,15 @@ msgstr "Квоты для групп" msgid "quotas for users" msgstr "Квоты для пользователей" -#: source/ubl-settings-quotas.cc:476 source/ubl-settings-quotas.cc:350 -#: source/ubl-settings-quotas.cc:371 source/ubl-settings-quotas.cc:318 -#: source/ubl-settings-quotas.cc:267 source/ubl-settings-quotas.cc:213 +#: source/ubl-settings-quotas.cc:542 source/ubl-settings-quotas.cc:476 +#: source/ubl-settings-quotas.cc:350 source/ubl-settings-quotas.cc:371 +#: source/ubl-settings-quotas.cc:318 source/ubl-settings-quotas.cc:267 +#: source/ubl-settings-quotas.cc:213 msgid "ubl-settings-quotas version: " msgstr "ubl-settings-quotas версия: " +#: source/ubl-settings-quotas.cc:89 source/ubl-settings-quotas.cc:90 +#: source/ubl-settings-quotas.cc:91 source/ubl-settings-quotas.cc:92 #: source/ubl-settings-quotas.cc:79 source/ubl-settings-quotas.cc:80 #: source/ubl-settings-quotas.cc:81 source/ubl-settings-quotas.cc:82 #: source/ubl-settings-quotas.cc:100 source/ubl-settings-quotas.cc:101 @@ -527,3 +646,9 @@ msgstr "ubl-settings-quotas версия: " #: source/ubl-settings-quotas.cc:93 msgid "weeks" msgstr "недели" + +#~ msgid "Deferring a hard limit (size)" +#~ msgstr "Отсрочка жесткого ограничения (объём)" + +#~ msgid "ubl-settings-quotas" +#~ msgstr "Квоты" From 6a58629b2b6c8b975b1de44270181335ac84b704 Mon Sep 17 00:00:00 2001 From: Igor Belitskiy Date: Mon, 10 Apr 2023 15:26:49 +0000 Subject: [PATCH 18/51] =?UTF-8?q?=D0=98=D1=81=D0=BF=D1=80=D0=B0=D0=B2?= =?UTF-8?q?=D0=BB=D0=B5=D0=BD=20=D1=81=D0=BA=D1=80=D0=B8=D0=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- screenshot/screenshot.png | Bin 74219 -> 77906 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/screenshot/screenshot.png b/screenshot/screenshot.png index 8eea794a517778ef27655639d82959f8caad0421..51bf4abac5dac49275751c3c2ae5617424329367 100644 GIT binary patch literal 77906 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

Q|8Qex{Eyf7I2}dy0;ts;P;pM)(vX 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∓yi8;h@u@a4esG;*G6(5Q4g>P(ld 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 WMe&b3#3kSi0m|gY1!>Z|fV9wi34|shAibAR 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 Date: Mon, 10 Apr 2023 16:10:18 +0000 Subject: [PATCH 19/51] =?UTF-8?q?=D0=98=D1=81=D0=BF=D1=80=D0=B0=D0=B2?= =?UTF-8?q?=D0=BB=D0=B5=D0=BD=D0=B0=20=D0=BB=D0=BE=D0=BA=D0=B0=D0=BB=D0=B8?= =?UTF-8?q?=D0=B7=D0=B0=D1=86=D0=B8=D1=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- source/ubl-settings-quotas.cc | 48 +++--- ubl-settings-quotas.glade | 2 + ubl-settings-quotas.pot | 295 +++++++++++++++++++------------ ubl-settings-quotas_ru.po | 316 +++++++++++++++++++++------------- 4 files changed, 412 insertions(+), 249 deletions(-) diff --git a/source/ubl-settings-quotas.cc b/source/ubl-settings-quotas.cc index 335846c..7088c5b 100755 --- a/source/ubl-settings-quotas.cc +++ b/source/ubl-settings-quotas.cc @@ -186,12 +186,12 @@ void MainWindow::lacalization() { filtersSizeFilterCheckbox->set_label(_("Size")); filtersSoftSizeFilterCheckbox->set_label(_("Soft limit (size)")); filtersHardSizeFilterCheckbox->set_label(_("Hard limit (size)")); - filtersHardSizeDelayFilterCheckbox->set_label(_("Hard limit (size) delay")); - filtersHardSizeActivationFilterCheckbox->set_label(_("Hard limit (size) activation time")); + filtersHardSizeDelayFilterCheckbox->set_label(_("Deferring a hard limit (size)")); + filtersHardSizeActivationFilterCheckbox->set_label(_("Hard limit activation time (size)")); filtersFilesFilterCheckbox->set_label(_("Files")); - filtersSoftFilesFilterCheckbox->set_label(_("Soft limit (files)")); - filtersHardFilesFilterCheckbox->set_label(_("Hard limit (files)")); - filtersHardFilesDelayFilterCheckbox->set_label(_("Hard limit (files) delay")); + filtersSoftFilesFilterCheckbox->set_label(_("Soft Restriction (files)")); + filtersHardFilesFilterCheckbox->set_label(_("Severe limitation (files)")); + filtersHardFilesDelayFilterCheckbox->set_label(_("Deferring a hard limit (files)")); filtersHardFilesActivationFilterCheckbox->set_label(_("Hard limit (file) activation time")); quotegroupDeviceLabel->set_text(_("Device:")); quotegroupDiskQuotasLabel->set_text(_("Disk quotas for this device:")); @@ -228,6 +228,25 @@ void MainWindow::lacalization() { btnSaveLocal->set_label(_("Save to local configuration")); } +void MainWindow::view_add_columns(Gtk::TreeView &treeView) { + // TODO: + // Не готово + treeView.append_column(_("Name"), m_columns.name); + treeView.append_column_editable(_("Quotas"), m_columns.quotas); + treeView.append_column(_("Size"), m_columns.size); + treeView.append_column(_("Soft limit\n(size)"), m_columns.soft_limit_size); + treeView.append_column(_("Severe\nlimitation\n(size)"), m_columns.hard_limit_size); + treeView.append_column(_("Deferring\na hard\nlimit\n(size)"), m_columns.hard_limit_size_delay); + treeView.append_column(_("Hard limit\n" + "activation\n" + "time (size)"), m_columns.hard_limit_activ_time); + treeView.append_column(_("Files"), m_columns.files); + treeView.append_column(_("Soft\nRestriction\n(files)"), m_columns.soft_limit_files); + treeView.append_column(_("Severe\nlimitation\n(files)"), m_columns.hard_limit_files); + treeView.append_column(_("Deferring\na hard\nlimit\n(files)"), m_columns.hard_limit_delay); + treeView.append_column(_("Hard limit\nactivation\ntime (files)"), m_columns.hard_limit_files_activ_time); +} + void MainWindow::filling_device_combo_box_template(Gtk::ComboBoxText *combo_box, map_str_device &map_device) { if (map_device.size() != 0) { for (const auto &device : map_device) { @@ -450,25 +469,6 @@ void MainWindow::groupsFilters_show() { FiltersWindow->show_all(); } -void MainWindow::view_add_columns(Gtk::TreeView &treeView) { - // TODO: - // Не готово - treeView.append_column(_("Name"), m_columns.name); - treeView.append_column_editable(_("Quotas"), m_columns.quotas); - treeView.append_column(_("Size"), m_columns.size); - treeView.append_column(_("Soft limit\n(size)"), m_columns.soft_limit_size); - treeView.append_column(_("Severe\nlimitation\n(size)"), m_columns.hard_limit_size); - treeView.append_column(_("Deferring\na hard\nlimit\n(size)"), m_columns.hard_limit_size_delay); - treeView.append_column(_("Hard limit\n" - "activation\n" - "time (size)"), m_columns.hard_limit_activ_time); - treeView.append_column(_("Files"), m_columns.files); - treeView.append_column(_("Soft\nRestriction\n(files)"), m_columns.soft_limit_files); - treeView.append_column(_("Severe\nlimitation\n(files)"), m_columns.hard_limit_files); - treeView.append_column(_("Deferring\na hard\nlimit\n(files)"), m_columns.hard_limit_delay); - treeView.append_column(_("Hard limit\nactivation\ntime (files)"), m_columns.hard_limit_files_activ_time); -} - void MainWindow::info_status_app(string stule) { Glib::RefPtr boxInfo = boxInfoError->get_style_context(); boxInfo->remove_class("boxInfoMessOK"); diff --git a/ubl-settings-quotas.glade b/ubl-settings-quotas.glade index d783434..bcb7715 100644 --- a/ubl-settings-quotas.glade +++ b/ubl-settings-quotas.glade @@ -1803,6 +1803,7 @@ False True + end 4 @@ -1921,6 +1922,7 @@ False True + end 4 diff --git a/ubl-settings-quotas.pot b/ubl-settings-quotas.pot index 1b89765..d0cf1c0 100644 --- a/ubl-settings-quotas.pot +++ b/ubl-settings-quotas.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-04-10 14:57+0000\n" +"POT-Creation-Date: 2023-04-10 16:09+0000\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -17,33 +17,37 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -#: source/ubl-settings-quotas.cc:154 source/ubl-settings-quotas.cc:144 +#: source/ubl-settings-quotas.cc:224 source/ubl-settings-quotas.cc:154 +#: source/ubl-settings-quotas.cc:144 msgid "About" msgstr "" -#: source/ubl-settings-quotas.cc:113 source/ubl-settings-quotas.cc:103 -#: source/ubl-settings-quotas.cc:124 source/ubl-settings-quotas.cc:121 -#: source/ubl-settings-quotas.cc:118 +#: source/ubl-settings-quotas.cc:183 source/ubl-settings-quotas.cc:113 +#: source/ubl-settings-quotas.cc:103 source/ubl-settings-quotas.cc:124 +#: source/ubl-settings-quotas.cc:121 source/ubl-settings-quotas.cc:118 msgid "Configuration of disk quotas parameters for system groups and users" msgstr "" -#: source/ubl-settings-quotas.cc:68 source/ubl-settings-quotas.cc:60 -#: source/ubl-settings-quotas.cc:81 source/ubl-settings-quotas.cc:78 -#: source/ubl-settings-quotas.cc:75 source/ubl-settings-quotas.cc:74 +#: source/ubl-settings-quotas.cc:138 source/ubl-settings-quotas.cc:68 +#: source/ubl-settings-quotas.cc:60 source/ubl-settings-quotas.cc:81 +#: source/ubl-settings-quotas.cc:78 source/ubl-settings-quotas.cc:75 +#: source/ubl-settings-quotas.cc:74 msgid "Copyright © UBSoft LLC, 2022 - " msgstr "" -#: source/ubl-settings-quotas.cc:131 source/ubl-settings-quotas.cc:136 -#: source/ubl-settings-quotas.cc:141 source/ubl-settings-quotas.cc:121 -#: source/ubl-settings-quotas.cc:126 source/ubl-settings-quotas.cc:142 -#: source/ubl-settings-quotas.cc:147 source/ubl-settings-quotas.cc:152 -#: source/ubl-settings-quotas.cc:139 source/ubl-settings-quotas.cc:144 -#: source/ubl-settings-quotas.cc:149 +#: source/ubl-settings-quotas.cc:201 source/ubl-settings-quotas.cc:206 +#: source/ubl-settings-quotas.cc:211 source/ubl-settings-quotas.cc:131 +#: source/ubl-settings-quotas.cc:136 source/ubl-settings-quotas.cc:141 +#: source/ubl-settings-quotas.cc:121 source/ubl-settings-quotas.cc:126 +#: source/ubl-settings-quotas.cc:142 source/ubl-settings-quotas.cc:147 +#: source/ubl-settings-quotas.cc:152 source/ubl-settings-quotas.cc:139 +#: source/ubl-settings-quotas.cc:144 source/ubl-settings-quotas.cc:149 msgid "Currently using:" msgstr "" -#: source/ubl-settings-quotas.cc:146 source/ubl-settings-quotas.cc:136 -#: source/ubl-settings-quotas.cc:157 source/ubl-settings-quotas.cc:154 +#: source/ubl-settings-quotas.cc:216 source/ubl-settings-quotas.cc:146 +#: source/ubl-settings-quotas.cc:136 source/ubl-settings-quotas.cc:157 +#: source/ubl-settings-quotas.cc:154 msgid "Currently using: " msgstr "" @@ -53,7 +57,7 @@ msgstr "" msgid "Date and Time" msgstr "" -#: source/ubl-settings-quotas.cc:381 +#: source/ubl-settings-quotas.cc:246 source/ubl-settings-quotas.cc:381 msgid "" "Deferring\n" "a hard\n" @@ -61,7 +65,7 @@ msgid "" "(files)" msgstr "" -#: source/ubl-settings-quotas.cc:374 +#: source/ubl-settings-quotas.cc:239 source/ubl-settings-quotas.cc:374 msgid "" "Deferring\n" "a hard\n" @@ -69,14 +73,24 @@ msgid "" "(size)" msgstr "" -#: source/ubl-settings-quotas.cc:79 source/ubl-settings-quotas.cc:111 -#: source/ubl-settings-quotas.cc:112 source/ubl-settings-quotas.cc:126 -#: source/ubl-settings-quotas.cc:138 source/ubl-settings-quotas.cc:69 -#: source/ubl-settings-quotas.cc:101 source/ubl-settings-quotas.cc:102 -#: source/ubl-settings-quotas.cc:116 source/ubl-settings-quotas.cc:128 -#: source/ubl-settings-quotas.cc:90 source/ubl-settings-quotas.cc:122 -#: source/ubl-settings-quotas.cc:123 source/ubl-settings-quotas.cc:137 -#: source/ubl-settings-quotas.cc:149 source/ubl-settings-quotas.cc:87 +#: source/ubl-settings-quotas.cc:194 +msgid "Deferring a hard limit (files)" +msgstr "" + +#: source/ubl-settings-quotas.cc:189 +msgid "Deferring a hard limit (size)" +msgstr "" + +#: source/ubl-settings-quotas.cc:149 source/ubl-settings-quotas.cc:181 +#: source/ubl-settings-quotas.cc:182 source/ubl-settings-quotas.cc:196 +#: source/ubl-settings-quotas.cc:208 source/ubl-settings-quotas.cc:79 +#: source/ubl-settings-quotas.cc:111 source/ubl-settings-quotas.cc:112 +#: source/ubl-settings-quotas.cc:126 source/ubl-settings-quotas.cc:138 +#: source/ubl-settings-quotas.cc:69 source/ubl-settings-quotas.cc:101 +#: source/ubl-settings-quotas.cc:102 source/ubl-settings-quotas.cc:116 +#: source/ubl-settings-quotas.cc:128 source/ubl-settings-quotas.cc:90 +#: source/ubl-settings-quotas.cc:122 source/ubl-settings-quotas.cc:123 +#: source/ubl-settings-quotas.cc:137 source/ubl-settings-quotas.cc:87 #: source/ubl-settings-quotas.cc:119 source/ubl-settings-quotas.cc:120 #: source/ubl-settings-quotas.cc:134 source/ubl-settings-quotas.cc:146 #: source/ubl-settings-quotas.cc:84 source/ubl-settings-quotas.cc:117 @@ -84,6 +98,7 @@ msgstr "" msgid "Device:" msgstr "" +#: source/ubl-settings-quotas.cc:197 source/ubl-settings-quotas.cc:207 #: source/ubl-settings-quotas.cc:127 source/ubl-settings-quotas.cc:137 #: source/ubl-settings-quotas.cc:117 source/ubl-settings-quotas.cc:138 #: source/ubl-settings-quotas.cc:148 source/ubl-settings-quotas.cc:135 @@ -91,6 +106,7 @@ msgstr "" msgid "Disk quotas for this device:" msgstr "" +#: source/ubl-settings-quotas.cc:152 source/ubl-settings-quotas.cc:153 #: source/ubl-settings-quotas.cc:82 source/ubl-settings-quotas.cc:83 #: source/ubl-settings-quotas.cc:72 source/ubl-settings-quotas.cc:73 #: source/ubl-settings-quotas.cc:93 source/ubl-settings-quotas.cc:94 @@ -100,10 +116,12 @@ msgstr "" msgid "Enable" msgstr "" -#: source/ubl-settings-quotas.cc:510 source/ubl-settings-quotas.cc:444 +#: source/ubl-settings-quotas.cc:597 source/ubl-settings-quotas.cc:510 +#: source/ubl-settings-quotas.cc:444 msgid "Error saved local and global configuration" msgstr "" +#: source/ubl-settings-quotas.cc:156 source/ubl-settings-quotas.cc:158 #: source/ubl-settings-quotas.cc:86 source/ubl-settings-quotas.cc:88 #: source/ubl-settings-quotas.cc:76 source/ubl-settings-quotas.cc:78 #: source/ubl-settings-quotas.cc:97 source/ubl-settings-quotas.cc:99 @@ -113,6 +131,7 @@ msgstr "" msgid "Excess files delay period" msgstr "" +#: source/ubl-settings-quotas.cc:155 source/ubl-settings-quotas.cc:157 #: source/ubl-settings-quotas.cc:85 source/ubl-settings-quotas.cc:87 #: source/ubl-settings-quotas.cc:75 source/ubl-settings-quotas.cc:77 #: source/ubl-settings-quotas.cc:96 source/ubl-settings-quotas.cc:98 @@ -122,21 +141,25 @@ msgstr "" msgid "Excess size delay period" msgstr "" -#: source/ubl-settings-quotas.cc:80 source/ubl-settings-quotas.cc:105 -#: source/ubl-settings-quotas.cc:106 source/ubl-settings-quotas.cc:144 -#: source/ubl-settings-quotas.cc:151 source/ubl-settings-quotas.cc:70 -#: source/ubl-settings-quotas.cc:95 source/ubl-settings-quotas.cc:96 -#: source/ubl-settings-quotas.cc:134 source/ubl-settings-quotas.cc:141 -#: source/ubl-settings-quotas.cc:91 source/ubl-settings-quotas.cc:116 -#: source/ubl-settings-quotas.cc:117 source/ubl-settings-quotas.cc:155 -#: source/ubl-settings-quotas.cc:162 source/ubl-settings-quotas.cc:88 -#: source/ubl-settings-quotas.cc:113 source/ubl-settings-quotas.cc:114 -#: source/ubl-settings-quotas.cc:152 source/ubl-settings-quotas.cc:85 -#: source/ubl-settings-quotas.cc:110 source/ubl-settings-quotas.cc:111 -#: source/ubl-settings-quotas.cc:84 +#: source/ubl-settings-quotas.cc:150 source/ubl-settings-quotas.cc:175 +#: source/ubl-settings-quotas.cc:176 source/ubl-settings-quotas.cc:214 +#: source/ubl-settings-quotas.cc:221 source/ubl-settings-quotas.cc:80 +#: source/ubl-settings-quotas.cc:105 source/ubl-settings-quotas.cc:106 +#: source/ubl-settings-quotas.cc:144 source/ubl-settings-quotas.cc:151 +#: source/ubl-settings-quotas.cc:70 source/ubl-settings-quotas.cc:95 +#: source/ubl-settings-quotas.cc:96 source/ubl-settings-quotas.cc:134 +#: source/ubl-settings-quotas.cc:141 source/ubl-settings-quotas.cc:91 +#: source/ubl-settings-quotas.cc:116 source/ubl-settings-quotas.cc:117 +#: source/ubl-settings-quotas.cc:155 source/ubl-settings-quotas.cc:162 +#: source/ubl-settings-quotas.cc:88 source/ubl-settings-quotas.cc:113 +#: source/ubl-settings-quotas.cc:114 source/ubl-settings-quotas.cc:152 +#: source/ubl-settings-quotas.cc:85 source/ubl-settings-quotas.cc:110 +#: source/ubl-settings-quotas.cc:111 source/ubl-settings-quotas.cc:84 msgid "File system:" msgstr "" +#: source/ubl-settings-quotas.cc:191 source/ubl-settings-quotas.cc:200 +#: source/ubl-settings-quotas.cc:215 source/ubl-settings-quotas.cc:243 #: source/ubl-settings-quotas.cc:121 source/ubl-settings-quotas.cc:130 #: source/ubl-settings-quotas.cc:145 source/ubl-settings-quotas.cc:378 #: source/ubl-settings-quotas.cc:111 source/ubl-settings-quotas.cc:120 @@ -149,6 +172,7 @@ msgstr "" msgid "Files" msgstr "" +#: source/ubl-settings-quotas.cc:177 source/ubl-settings-quotas.cc:178 #: source/ubl-settings-quotas.cc:107 source/ubl-settings-quotas.cc:108 #: source/ubl-settings-quotas.cc:97 source/ubl-settings-quotas.cc:98 #: source/ubl-settings-quotas.cc:118 source/ubl-settings-quotas.cc:119 @@ -166,39 +190,48 @@ msgid "" " -V, --version\t Show package version\n" msgstr "" -#: source/ubl-settings-quotas.cc:74 source/ubl-settings-quotas.cc:66 -#: source/ubl-settings-quotas.cc:87 source/ubl-settings-quotas.cc:84 -#: source/ubl-settings-quotas.cc:81 source/ubl-settings-quotas.cc:80 +#: source/ubl-settings-quotas.cc:144 source/ubl-settings-quotas.cc:74 +#: source/ubl-settings-quotas.cc:66 source/ubl-settings-quotas.cc:87 +#: source/ubl-settings-quotas.cc:84 source/ubl-settings-quotas.cc:81 +#: source/ubl-settings-quotas.cc:80 msgid "General settings" msgstr "" -#: source/ubl-settings-quotas.cc:524 source/ubl-settings-quotas.cc:458 +#: source/ubl-settings-quotas.cc:611 source/ubl-settings-quotas.cc:524 +#: source/ubl-settings-quotas.cc:458 msgid "Global configuration downloaded successfully" msgstr "" -#: source/ubl-settings-quotas.cc:498 source/ubl-settings-quotas.cc:432 +#: source/ubl-settings-quotas.cc:585 source/ubl-settings-quotas.cc:498 +#: source/ubl-settings-quotas.cc:432 msgid "Global configuration read error" msgstr "" -#: source/ubl-settings-quotas.cc:530 source/ubl-settings-quotas.cc:464 +#: source/ubl-settings-quotas.cc:617 source/ubl-settings-quotas.cc:530 +#: source/ubl-settings-quotas.cc:464 msgid "Global configuration successfully written" msgstr "" -#: source/ubl-settings-quotas.cc:506 source/ubl-settings-quotas.cc:440 +#: source/ubl-settings-quotas.cc:593 source/ubl-settings-quotas.cc:506 +#: source/ubl-settings-quotas.cc:440 msgid "Global configuration write error" msgstr "" -#: source/ubl-settings-quotas.cc:128 source/ubl-settings-quotas.cc:118 -#: source/ubl-settings-quotas.cc:139 source/ubl-settings-quotas.cc:136 +#: source/ubl-settings-quotas.cc:198 source/ubl-settings-quotas.cc:128 +#: source/ubl-settings-quotas.cc:118 source/ubl-settings-quotas.cc:139 +#: source/ubl-settings-quotas.cc:136 msgid "Group quotas for this device:" msgstr "" -#: source/ubl-settings-quotas.cc:75 source/ubl-settings-quotas.cc:67 -#: source/ubl-settings-quotas.cc:88 source/ubl-settings-quotas.cc:85 -#: source/ubl-settings-quotas.cc:82 source/ubl-settings-quotas.cc:81 +#: source/ubl-settings-quotas.cc:145 source/ubl-settings-quotas.cc:75 +#: source/ubl-settings-quotas.cc:67 source/ubl-settings-quotas.cc:88 +#: source/ubl-settings-quotas.cc:85 source/ubl-settings-quotas.cc:82 +#: source/ubl-settings-quotas.cc:81 msgid "Groups" msgstr "" +#: source/ubl-settings-quotas.cc:203 source/ubl-settings-quotas.cc:204 +#: source/ubl-settings-quotas.cc:213 source/ubl-settings-quotas.cc:218 #: source/ubl-settings-quotas.cc:133 source/ubl-settings-quotas.cc:134 #: source/ubl-settings-quotas.cc:143 source/ubl-settings-quotas.cc:148 #: source/ubl-settings-quotas.cc:123 source/ubl-settings-quotas.cc:124 @@ -254,23 +287,23 @@ msgid "" "(size) delay" msgstr "" -#: source/ubl-settings-quotas.cc:382 +#: source/ubl-settings-quotas.cc:247 source/ubl-settings-quotas.cc:382 msgid "" "Hard limit\n" "activation\n" "time (files)" msgstr "" -#: source/ubl-settings-quotas.cc:375 +#: source/ubl-settings-quotas.cc:240 source/ubl-settings-quotas.cc:375 msgid "" "Hard limit\n" "activation\n" "time (size)" msgstr "" -#: source/ubl-settings-quotas.cc:125 source/ubl-settings-quotas.cc:115 -#: source/ubl-settings-quotas.cc:136 source/ubl-settings-quotas.cc:133 -#: source/ubl-settings-quotas.cc:130 +#: source/ubl-settings-quotas.cc:195 source/ubl-settings-quotas.cc:125 +#: source/ubl-settings-quotas.cc:115 source/ubl-settings-quotas.cc:136 +#: source/ubl-settings-quotas.cc:133 source/ubl-settings-quotas.cc:130 msgid "Hard limit (file) activation time" msgstr "" @@ -286,9 +319,9 @@ msgstr "" msgid "Hard limit (files) delay" msgstr "" -#: source/ubl-settings-quotas.cc:118 source/ubl-settings-quotas.cc:108 -#: source/ubl-settings-quotas.cc:129 source/ubl-settings-quotas.cc:126 -#: source/ubl-settings-quotas.cc:123 +#: source/ubl-settings-quotas.cc:188 source/ubl-settings-quotas.cc:118 +#: source/ubl-settings-quotas.cc:108 source/ubl-settings-quotas.cc:129 +#: source/ubl-settings-quotas.cc:126 source/ubl-settings-quotas.cc:123 msgid "Hard limit (size)" msgstr "" @@ -304,40 +337,52 @@ msgstr "" msgid "Hard limit (size) delay" msgstr "" -#: source/ubl-settings-quotas.cc:155 source/ubl-settings-quotas.cc:145 +#: source/ubl-settings-quotas.cc:190 +msgid "Hard limit activation time (size)" +msgstr "" + +#: source/ubl-settings-quotas.cc:225 source/ubl-settings-quotas.cc:155 +#: source/ubl-settings-quotas.cc:145 msgid "Help" msgstr "" -#: source/ubl-settings-quotas.cc:109 source/ubl-settings-quotas.cc:99 -#: source/ubl-settings-quotas.cc:120 source/ubl-settings-quotas.cc:117 -#: source/ubl-settings-quotas.cc:114 +#: source/ubl-settings-quotas.cc:179 source/ubl-settings-quotas.cc:109 +#: source/ubl-settings-quotas.cc:99 source/ubl-settings-quotas.cc:120 +#: source/ubl-settings-quotas.cc:117 source/ubl-settings-quotas.cc:114 msgid "Load" msgstr "" -#: source/ubl-settings-quotas.cc:152 source/ubl-settings-quotas.cc:142 +#: source/ubl-settings-quotas.cc:222 source/ubl-settings-quotas.cc:152 +#: source/ubl-settings-quotas.cc:142 msgid "Load from global configuration" msgstr "" -#: source/ubl-settings-quotas.cc:153 source/ubl-settings-quotas.cc:143 +#: source/ubl-settings-quotas.cc:223 source/ubl-settings-quotas.cc:153 +#: source/ubl-settings-quotas.cc:143 msgid "Load from local configuration" msgstr "" -#: source/ubl-settings-quotas.cc:521 source/ubl-settings-quotas.cc:455 +#: source/ubl-settings-quotas.cc:608 source/ubl-settings-quotas.cc:521 +#: source/ubl-settings-quotas.cc:455 msgid "Local configuration downloaded successfully" msgstr "" -#: source/ubl-settings-quotas.cc:494 source/ubl-settings-quotas.cc:428 +#: source/ubl-settings-quotas.cc:581 source/ubl-settings-quotas.cc:494 +#: source/ubl-settings-quotas.cc:428 msgid "Local configuration reading error" msgstr "" -#: source/ubl-settings-quotas.cc:527 source/ubl-settings-quotas.cc:461 +#: source/ubl-settings-quotas.cc:614 source/ubl-settings-quotas.cc:527 +#: source/ubl-settings-quotas.cc:461 msgid "Local configuration successfully written" msgstr "" -#: source/ubl-settings-quotas.cc:502 source/ubl-settings-quotas.cc:436 +#: source/ubl-settings-quotas.cc:589 source/ubl-settings-quotas.cc:502 +#: source/ubl-settings-quotas.cc:436 msgid "Local configuration write error" msgstr "" +#: source/ubl-settings-quotas.cc:184 source/ubl-settings-quotas.cc:234 #: source/ubl-settings-quotas.cc:114 source/ubl-settings-quotas.cc:369 #: source/ubl-settings-quotas.cc:104 source/ubl-settings-quotas.cc:314 #: source/ubl-settings-quotas.cc:125 source/ubl-settings-quotas.cc:318 @@ -346,16 +391,19 @@ msgstr "" msgid "Name" msgstr "" -#: source/ubl-settings-quotas.cc:536 source/ubl-settings-quotas.cc:470 +#: source/ubl-settings-quotas.cc:623 source/ubl-settings-quotas.cc:536 +#: source/ubl-settings-quotas.cc:470 msgid "Nothing to save!" msgstr "" -#: source/ubl-settings-quotas.cc:73 source/ubl-settings-quotas.cc:65 -#: source/ubl-settings-quotas.cc:86 source/ubl-settings-quotas.cc:83 -#: source/ubl-settings-quotas.cc:80 source/ubl-settings-quotas.cc:79 +#: source/ubl-settings-quotas.cc:143 source/ubl-settings-quotas.cc:73 +#: source/ubl-settings-quotas.cc:65 source/ubl-settings-quotas.cc:86 +#: source/ubl-settings-quotas.cc:83 source/ubl-settings-quotas.cc:80 +#: source/ubl-settings-quotas.cc:79 msgid "Project Home Page" msgstr "" +#: source/ubl-settings-quotas.cc:185 source/ubl-settings-quotas.cc:235 #: source/ubl-settings-quotas.cc:115 source/ubl-settings-quotas.cc:370 #: source/ubl-settings-quotas.cc:105 source/ubl-settings-quotas.cc:315 #: source/ubl-settings-quotas.cc:126 source/ubl-settings-quotas.cc:319 @@ -364,50 +412,61 @@ msgstr "" msgid "Quotas" msgstr "" -#: source/ubl-settings-quotas.cc:81 source/ubl-settings-quotas.cc:71 +#: source/ubl-settings-quotas.cc:151 source/ubl-settings-quotas.cc:81 +#: source/ubl-settings-quotas.cc:71 msgid "Quotas for groups" msgstr "" -#: source/ubl-settings-quotas.cc:84 source/ubl-settings-quotas.cc:74 +#: source/ubl-settings-quotas.cc:154 source/ubl-settings-quotas.cc:84 +#: source/ubl-settings-quotas.cc:74 msgid "Quotas for users" msgstr "" -#: source/ubl-settings-quotas.cc:110 source/ubl-settings-quotas.cc:100 -#: source/ubl-settings-quotas.cc:121 source/ubl-settings-quotas.cc:118 -#: source/ubl-settings-quotas.cc:115 +#: source/ubl-settings-quotas.cc:180 source/ubl-settings-quotas.cc:110 +#: source/ubl-settings-quotas.cc:100 source/ubl-settings-quotas.cc:121 +#: source/ubl-settings-quotas.cc:118 source/ubl-settings-quotas.cc:115 msgid "Save" msgstr "" -#: source/ubl-settings-quotas.cc:156 source/ubl-settings-quotas.cc:146 +#: source/ubl-settings-quotas.cc:226 source/ubl-settings-quotas.cc:156 +#: source/ubl-settings-quotas.cc:146 msgid "Save to global and local configuration" msgstr "" -#: source/ubl-settings-quotas.cc:157 source/ubl-settings-quotas.cc:147 +#: source/ubl-settings-quotas.cc:227 source/ubl-settings-quotas.cc:157 +#: source/ubl-settings-quotas.cc:147 msgid "Save to global configuration" msgstr "" -#: source/ubl-settings-quotas.cc:158 source/ubl-settings-quotas.cc:148 +#: source/ubl-settings-quotas.cc:228 source/ubl-settings-quotas.cc:158 +#: source/ubl-settings-quotas.cc:148 msgid "Save to local configuration" msgstr "" -#: source/ubl-settings-quotas.cc:70 +#: source/ubl-settings-quotas.cc:140 source/ubl-settings-quotas.cc:70 msgid "Setting user quotas" msgstr "" -#: source/ubl-settings-quotas.cc:380 +#: source/ubl-settings-quotas.cc:245 source/ubl-settings-quotas.cc:380 msgid "" "Severe\n" "limitation\n" "(files)" msgstr "" -#: source/ubl-settings-quotas.cc:373 +#: source/ubl-settings-quotas.cc:238 source/ubl-settings-quotas.cc:373 msgid "" "Severe\n" "limitation\n" "(size)" msgstr "" +#: source/ubl-settings-quotas.cc:193 +msgid "Severe limitation (files)" +msgstr "" + +#: source/ubl-settings-quotas.cc:186 source/ubl-settings-quotas.cc:199 +#: source/ubl-settings-quotas.cc:210 source/ubl-settings-quotas.cc:236 #: source/ubl-settings-quotas.cc:116 source/ubl-settings-quotas.cc:129 #: source/ubl-settings-quotas.cc:140 source/ubl-settings-quotas.cc:371 #: source/ubl-settings-quotas.cc:106 source/ubl-settings-quotas.cc:119 @@ -420,13 +479,19 @@ msgstr "" msgid "Size" msgstr "" -#: source/ubl-settings-quotas.cc:379 +#: source/ubl-settings-quotas.cc:244 source/ubl-settings-quotas.cc:379 msgid "" "Soft\n" "Restriction\n" "(files)" msgstr "" +#: source/ubl-settings-quotas.cc:192 +msgid "Soft Restriction (files)" +msgstr "" + +#: source/ubl-settings-quotas.cc:202 source/ubl-settings-quotas.cc:205 +#: source/ubl-settings-quotas.cc:212 source/ubl-settings-quotas.cc:217 #: source/ubl-settings-quotas.cc:132 source/ubl-settings-quotas.cc:135 #: source/ubl-settings-quotas.cc:142 source/ubl-settings-quotas.cc:147 #: source/ubl-settings-quotas.cc:122 source/ubl-settings-quotas.cc:125 @@ -444,9 +509,9 @@ msgid "" "(files)" msgstr "" -#: source/ubl-settings-quotas.cc:372 source/ubl-settings-quotas.cc:317 -#: source/ubl-settings-quotas.cc:321 source/ubl-settings-quotas.cc:313 -#: source/ubl-settings-quotas.cc:260 +#: source/ubl-settings-quotas.cc:237 source/ubl-settings-quotas.cc:372 +#: source/ubl-settings-quotas.cc:317 source/ubl-settings-quotas.cc:321 +#: source/ubl-settings-quotas.cc:313 source/ubl-settings-quotas.cc:260 msgid "" "Soft limit\n" "(size)" @@ -458,33 +523,39 @@ msgstr "" msgid "Soft limit (files)" msgstr "" -#: source/ubl-settings-quotas.cc:117 source/ubl-settings-quotas.cc:107 -#: source/ubl-settings-quotas.cc:128 source/ubl-settings-quotas.cc:125 -#: source/ubl-settings-quotas.cc:122 +#: source/ubl-settings-quotas.cc:187 source/ubl-settings-quotas.cc:117 +#: source/ubl-settings-quotas.cc:107 source/ubl-settings-quotas.cc:128 +#: source/ubl-settings-quotas.cc:125 source/ubl-settings-quotas.cc:122 msgid "Soft limit (size)" msgstr "" -#: source/ubl-settings-quotas.cc:533 source/ubl-settings-quotas.cc:467 +#: source/ubl-settings-quotas.cc:620 source/ubl-settings-quotas.cc:533 +#: source/ubl-settings-quotas.cc:467 msgid "Successfully saved local and global configuration" msgstr "" -#: source/ubl-settings-quotas.cc:55 source/ubl-settings-quotas.cc:47 -#: source/ubl-settings-quotas.cc:68 source/ubl-settings-quotas.cc:70 -#: source/ubl-settings-quotas.cc:67 source/ubl-settings-quotas.cc:66 +#: source/ubl-settings-quotas.cc:59 source/ubl-settings-quotas.cc:55 +#: source/ubl-settings-quotas.cc:47 source/ubl-settings-quotas.cc:68 +#: source/ubl-settings-quotas.cc:70 source/ubl-settings-quotas.cc:67 +#: source/ubl-settings-quotas.cc:66 msgid "The program must be run as root" msgstr "" -#: source/ubl-settings-quotas.cc:139 source/ubl-settings-quotas.cc:129 -#: source/ubl-settings-quotas.cc:150 source/ubl-settings-quotas.cc:147 +#: source/ubl-settings-quotas.cc:209 source/ubl-settings-quotas.cc:139 +#: source/ubl-settings-quotas.cc:129 source/ubl-settings-quotas.cc:150 +#: source/ubl-settings-quotas.cc:147 msgid "User quotas for this device: " msgstr "" -#: source/ubl-settings-quotas.cc:78 source/ubl-settings-quotas.cc:68 -#: source/ubl-settings-quotas.cc:89 source/ubl-settings-quotas.cc:86 -#: source/ubl-settings-quotas.cc:83 source/ubl-settings-quotas.cc:82 +#: source/ubl-settings-quotas.cc:148 source/ubl-settings-quotas.cc:78 +#: source/ubl-settings-quotas.cc:68 source/ubl-settings-quotas.cc:89 +#: source/ubl-settings-quotas.cc:86 source/ubl-settings-quotas.cc:83 +#: source/ubl-settings-quotas.cc:82 msgid "Users" msgstr "" +#: source/ubl-settings-quotas.cc:163 source/ubl-settings-quotas.cc:164 +#: source/ubl-settings-quotas.cc:165 source/ubl-settings-quotas.cc:166 #: source/ubl-settings-quotas.cc:93 source/ubl-settings-quotas.cc:94 #: source/ubl-settings-quotas.cc:95 source/ubl-settings-quotas.cc:96 #: source/ubl-settings-quotas.cc:83 source/ubl-settings-quotas.cc:84 @@ -498,6 +569,7 @@ msgstr "" msgid "days" msgstr "" +#: source/ubl-settings-quotas.cc:219 source/ubl-settings-quotas.cc:220 #: source/ubl-settings-quotas.cc:149 source/ubl-settings-quotas.cc:150 #: source/ubl-settings-quotas.cc:139 source/ubl-settings-quotas.cc:140 #: source/ubl-settings-quotas.cc:160 source/ubl-settings-quotas.cc:161 @@ -505,6 +577,8 @@ msgstr "" msgid "files" msgstr "" +#: source/ubl-settings-quotas.cc:167 source/ubl-settings-quotas.cc:168 +#: source/ubl-settings-quotas.cc:169 source/ubl-settings-quotas.cc:170 #: source/ubl-settings-quotas.cc:97 source/ubl-settings-quotas.cc:98 #: source/ubl-settings-quotas.cc:99 source/ubl-settings-quotas.cc:100 #: source/ubl-settings-quotas.cc:87 source/ubl-settings-quotas.cc:88 @@ -518,17 +592,20 @@ msgstr "" msgid "hours" msgstr "" -#: source/ubl-settings-quotas.cc:71 source/ubl-settings-quotas.cc:63 -#: source/ubl-settings-quotas.cc:84 source/ubl-settings-quotas.cc:81 -#: source/ubl-settings-quotas.cc:78 source/ubl-settings-quotas.cc:77 +#: source/ubl-settings-quotas.cc:141 source/ubl-settings-quotas.cc:71 +#: source/ubl-settings-quotas.cc:63 source/ubl-settings-quotas.cc:84 +#: source/ubl-settings-quotas.cc:81 source/ubl-settings-quotas.cc:78 +#: source/ubl-settings-quotas.cc:77 msgid "https://wiki.ublinux.com" msgstr "" -#: source/ubl-settings-quotas.cc:461 +#: source/ubl-settings-quotas.cc:548 source/ubl-settings-quotas.cc:461 msgid "" "https://wiki.ublinux.com/ru/Программное_обеспечение/Программы_и_утилиты/Все/" msgstr "" +#: source/ubl-settings-quotas.cc:171 source/ubl-settings-quotas.cc:172 +#: source/ubl-settings-quotas.cc:173 source/ubl-settings-quotas.cc:174 #: source/ubl-settings-quotas.cc:101 source/ubl-settings-quotas.cc:102 #: source/ubl-settings-quotas.cc:103 source/ubl-settings-quotas.cc:104 #: source/ubl-settings-quotas.cc:91 source/ubl-settings-quotas.cc:92 @@ -556,13 +633,15 @@ msgstr "" msgid "quotas for users" msgstr "" -#: source/ubl-settings-quotas.cc:542 source/ubl-settings-quotas.cc:476 -#: source/ubl-settings-quotas.cc:350 source/ubl-settings-quotas.cc:371 -#: source/ubl-settings-quotas.cc:318 source/ubl-settings-quotas.cc:267 -#: source/ubl-settings-quotas.cc:213 +#: source/ubl-settings-quotas.cc:629 source/ubl-settings-quotas.cc:542 +#: source/ubl-settings-quotas.cc:476 source/ubl-settings-quotas.cc:350 +#: source/ubl-settings-quotas.cc:371 source/ubl-settings-quotas.cc:318 +#: source/ubl-settings-quotas.cc:267 source/ubl-settings-quotas.cc:213 msgid "ubl-settings-quotas version: " msgstr "" +#: source/ubl-settings-quotas.cc:159 source/ubl-settings-quotas.cc:160 +#: source/ubl-settings-quotas.cc:161 source/ubl-settings-quotas.cc:162 #: source/ubl-settings-quotas.cc:89 source/ubl-settings-quotas.cc:90 #: source/ubl-settings-quotas.cc:91 source/ubl-settings-quotas.cc:92 #: source/ubl-settings-quotas.cc:79 source/ubl-settings-quotas.cc:80 diff --git a/ubl-settings-quotas_ru.po b/ubl-settings-quotas_ru.po index e649c18..5bcd4a9 100644 --- a/ubl-settings-quotas_ru.po +++ b/ubl-settings-quotas_ru.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: ublexec 1.0\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-04-10 14:57+0000\n" +"POT-Creation-Date: 2023-04-10 16:09+0000\n" "PO-Revision-Date: 2023-01-01 00:00+0600\n" "Last-Translator: UBLinux Team \n" "Language-Team: Russian - UBLinux Team \n" @@ -17,33 +17,37 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -#: source/ubl-settings-quotas.cc:154 source/ubl-settings-quotas.cc:144 +#: source/ubl-settings-quotas.cc:224 source/ubl-settings-quotas.cc:154 +#: source/ubl-settings-quotas.cc:144 msgid "About" msgstr "О программе" -#: source/ubl-settings-quotas.cc:113 source/ubl-settings-quotas.cc:103 -#: source/ubl-settings-quotas.cc:124 source/ubl-settings-quotas.cc:121 -#: source/ubl-settings-quotas.cc:118 +#: source/ubl-settings-quotas.cc:183 source/ubl-settings-quotas.cc:113 +#: source/ubl-settings-quotas.cc:103 source/ubl-settings-quotas.cc:124 +#: source/ubl-settings-quotas.cc:121 source/ubl-settings-quotas.cc:118 msgid "Configuration of disk quotas parameters for system groups and users" msgstr "Настройка параметров дисковых квот для системных групп и пользователей" -#: source/ubl-settings-quotas.cc:68 source/ubl-settings-quotas.cc:60 -#: source/ubl-settings-quotas.cc:81 source/ubl-settings-quotas.cc:78 -#: source/ubl-settings-quotas.cc:75 source/ubl-settings-quotas.cc:74 +#: source/ubl-settings-quotas.cc:138 source/ubl-settings-quotas.cc:68 +#: source/ubl-settings-quotas.cc:60 source/ubl-settings-quotas.cc:81 +#: source/ubl-settings-quotas.cc:78 source/ubl-settings-quotas.cc:75 +#: source/ubl-settings-quotas.cc:74 msgid "Copyright © UBSoft LLC, 2022 - " msgstr "" -#: source/ubl-settings-quotas.cc:131 source/ubl-settings-quotas.cc:136 -#: source/ubl-settings-quotas.cc:141 source/ubl-settings-quotas.cc:121 -#: source/ubl-settings-quotas.cc:126 source/ubl-settings-quotas.cc:142 -#: source/ubl-settings-quotas.cc:147 source/ubl-settings-quotas.cc:152 -#: source/ubl-settings-quotas.cc:139 source/ubl-settings-quotas.cc:144 -#: source/ubl-settings-quotas.cc:149 +#: source/ubl-settings-quotas.cc:201 source/ubl-settings-quotas.cc:206 +#: source/ubl-settings-quotas.cc:211 source/ubl-settings-quotas.cc:131 +#: source/ubl-settings-quotas.cc:136 source/ubl-settings-quotas.cc:141 +#: source/ubl-settings-quotas.cc:121 source/ubl-settings-quotas.cc:126 +#: source/ubl-settings-quotas.cc:142 source/ubl-settings-quotas.cc:147 +#: source/ubl-settings-quotas.cc:152 source/ubl-settings-quotas.cc:139 +#: source/ubl-settings-quotas.cc:144 source/ubl-settings-quotas.cc:149 msgid "Currently using:" msgstr "В настоящее время используется:" -#: source/ubl-settings-quotas.cc:146 source/ubl-settings-quotas.cc:136 -#: source/ubl-settings-quotas.cc:157 source/ubl-settings-quotas.cc:154 +#: source/ubl-settings-quotas.cc:216 source/ubl-settings-quotas.cc:146 +#: source/ubl-settings-quotas.cc:136 source/ubl-settings-quotas.cc:157 +#: source/ubl-settings-quotas.cc:154 msgid "Currently using: " msgstr "В настоящее время используется: " @@ -53,7 +57,7 @@ msgstr "В настоящее время используется: " msgid "Date and Time" msgstr "Дата и время" -#: source/ubl-settings-quotas.cc:381 +#: source/ubl-settings-quotas.cc:246 source/ubl-settings-quotas.cc:381 msgid "" "Deferring\n" "a hard\n" @@ -65,7 +69,7 @@ msgstr "" "ограничения\n" "(файлы)" -#: source/ubl-settings-quotas.cc:374 +#: source/ubl-settings-quotas.cc:239 source/ubl-settings-quotas.cc:374 msgid "" "Deferring\n" "a hard\n" @@ -77,14 +81,24 @@ msgstr "" "ограничения\n" "(объём)" -#: source/ubl-settings-quotas.cc:79 source/ubl-settings-quotas.cc:111 -#: source/ubl-settings-quotas.cc:112 source/ubl-settings-quotas.cc:126 -#: source/ubl-settings-quotas.cc:138 source/ubl-settings-quotas.cc:69 -#: source/ubl-settings-quotas.cc:101 source/ubl-settings-quotas.cc:102 -#: source/ubl-settings-quotas.cc:116 source/ubl-settings-quotas.cc:128 -#: source/ubl-settings-quotas.cc:90 source/ubl-settings-quotas.cc:122 -#: source/ubl-settings-quotas.cc:123 source/ubl-settings-quotas.cc:137 -#: source/ubl-settings-quotas.cc:149 source/ubl-settings-quotas.cc:87 +#: source/ubl-settings-quotas.cc:194 +msgid "Deferring a hard limit (files)" +msgstr "Отсрочка жесткого ограничения (файлы)" + +#: source/ubl-settings-quotas.cc:189 +msgid "Deferring a hard limit (size)" +msgstr "Отсрочка жесткого ограничения (объём)" + +#: source/ubl-settings-quotas.cc:149 source/ubl-settings-quotas.cc:181 +#: source/ubl-settings-quotas.cc:182 source/ubl-settings-quotas.cc:196 +#: source/ubl-settings-quotas.cc:208 source/ubl-settings-quotas.cc:79 +#: source/ubl-settings-quotas.cc:111 source/ubl-settings-quotas.cc:112 +#: source/ubl-settings-quotas.cc:126 source/ubl-settings-quotas.cc:138 +#: source/ubl-settings-quotas.cc:69 source/ubl-settings-quotas.cc:101 +#: source/ubl-settings-quotas.cc:102 source/ubl-settings-quotas.cc:116 +#: source/ubl-settings-quotas.cc:128 source/ubl-settings-quotas.cc:90 +#: source/ubl-settings-quotas.cc:122 source/ubl-settings-quotas.cc:123 +#: source/ubl-settings-quotas.cc:137 source/ubl-settings-quotas.cc:87 #: source/ubl-settings-quotas.cc:119 source/ubl-settings-quotas.cc:120 #: source/ubl-settings-quotas.cc:134 source/ubl-settings-quotas.cc:146 #: source/ubl-settings-quotas.cc:84 source/ubl-settings-quotas.cc:117 @@ -92,6 +106,7 @@ msgstr "" msgid "Device:" msgstr "Устройство:" +#: source/ubl-settings-quotas.cc:197 source/ubl-settings-quotas.cc:207 #: source/ubl-settings-quotas.cc:127 source/ubl-settings-quotas.cc:137 #: source/ubl-settings-quotas.cc:117 source/ubl-settings-quotas.cc:138 #: source/ubl-settings-quotas.cc:148 source/ubl-settings-quotas.cc:135 @@ -99,6 +114,7 @@ msgstr "Устройство:" msgid "Disk quotas for this device:" msgstr "Дисковые квоты для этого устройства:" +#: source/ubl-settings-quotas.cc:152 source/ubl-settings-quotas.cc:153 #: source/ubl-settings-quotas.cc:82 source/ubl-settings-quotas.cc:83 #: source/ubl-settings-quotas.cc:72 source/ubl-settings-quotas.cc:73 #: source/ubl-settings-quotas.cc:93 source/ubl-settings-quotas.cc:94 @@ -108,11 +124,13 @@ msgstr "Дисковые квоты для этого устройства:" msgid "Enable" msgstr "Включить" -#: source/ubl-settings-quotas.cc:510 source/ubl-settings-quotas.cc:444 +#: source/ubl-settings-quotas.cc:597 source/ubl-settings-quotas.cc:510 +#: source/ubl-settings-quotas.cc:444 #, fuzzy msgid "Error saved local and global configuration" msgstr "Сохранить глобальную и локальную конфигурацию" +#: source/ubl-settings-quotas.cc:156 source/ubl-settings-quotas.cc:158 #: source/ubl-settings-quotas.cc:86 source/ubl-settings-quotas.cc:88 #: source/ubl-settings-quotas.cc:76 source/ubl-settings-quotas.cc:78 #: source/ubl-settings-quotas.cc:97 source/ubl-settings-quotas.cc:99 @@ -122,6 +140,7 @@ msgstr "Сохранить глобальную и локальную конфи msgid "Excess files delay period" msgstr "Превышение периода задержки файлов" +#: source/ubl-settings-quotas.cc:155 source/ubl-settings-quotas.cc:157 #: source/ubl-settings-quotas.cc:85 source/ubl-settings-quotas.cc:87 #: source/ubl-settings-quotas.cc:75 source/ubl-settings-quotas.cc:77 #: source/ubl-settings-quotas.cc:96 source/ubl-settings-quotas.cc:98 @@ -131,21 +150,25 @@ msgstr "Превышение периода задержки файлов" msgid "Excess size delay period" msgstr "Период задержки превышения размера" -#: source/ubl-settings-quotas.cc:80 source/ubl-settings-quotas.cc:105 -#: source/ubl-settings-quotas.cc:106 source/ubl-settings-quotas.cc:144 -#: source/ubl-settings-quotas.cc:151 source/ubl-settings-quotas.cc:70 -#: source/ubl-settings-quotas.cc:95 source/ubl-settings-quotas.cc:96 -#: source/ubl-settings-quotas.cc:134 source/ubl-settings-quotas.cc:141 -#: source/ubl-settings-quotas.cc:91 source/ubl-settings-quotas.cc:116 -#: source/ubl-settings-quotas.cc:117 source/ubl-settings-quotas.cc:155 -#: source/ubl-settings-quotas.cc:162 source/ubl-settings-quotas.cc:88 -#: source/ubl-settings-quotas.cc:113 source/ubl-settings-quotas.cc:114 -#: source/ubl-settings-quotas.cc:152 source/ubl-settings-quotas.cc:85 -#: source/ubl-settings-quotas.cc:110 source/ubl-settings-quotas.cc:111 -#: source/ubl-settings-quotas.cc:84 +#: source/ubl-settings-quotas.cc:150 source/ubl-settings-quotas.cc:175 +#: source/ubl-settings-quotas.cc:176 source/ubl-settings-quotas.cc:214 +#: source/ubl-settings-quotas.cc:221 source/ubl-settings-quotas.cc:80 +#: source/ubl-settings-quotas.cc:105 source/ubl-settings-quotas.cc:106 +#: source/ubl-settings-quotas.cc:144 source/ubl-settings-quotas.cc:151 +#: source/ubl-settings-quotas.cc:70 source/ubl-settings-quotas.cc:95 +#: source/ubl-settings-quotas.cc:96 source/ubl-settings-quotas.cc:134 +#: source/ubl-settings-quotas.cc:141 source/ubl-settings-quotas.cc:91 +#: source/ubl-settings-quotas.cc:116 source/ubl-settings-quotas.cc:117 +#: source/ubl-settings-quotas.cc:155 source/ubl-settings-quotas.cc:162 +#: source/ubl-settings-quotas.cc:88 source/ubl-settings-quotas.cc:113 +#: source/ubl-settings-quotas.cc:114 source/ubl-settings-quotas.cc:152 +#: source/ubl-settings-quotas.cc:85 source/ubl-settings-quotas.cc:110 +#: source/ubl-settings-quotas.cc:111 source/ubl-settings-quotas.cc:84 msgid "File system:" msgstr "Файловая система:" +#: source/ubl-settings-quotas.cc:191 source/ubl-settings-quotas.cc:200 +#: source/ubl-settings-quotas.cc:215 source/ubl-settings-quotas.cc:243 #: source/ubl-settings-quotas.cc:121 source/ubl-settings-quotas.cc:130 #: source/ubl-settings-quotas.cc:145 source/ubl-settings-quotas.cc:378 #: source/ubl-settings-quotas.cc:111 source/ubl-settings-quotas.cc:120 @@ -158,6 +181,7 @@ msgstr "Файловая система:" msgid "Files" msgstr "Файлы" +#: source/ubl-settings-quotas.cc:177 source/ubl-settings-quotas.cc:178 #: source/ubl-settings-quotas.cc:107 source/ubl-settings-quotas.cc:108 #: source/ubl-settings-quotas.cc:97 source/ubl-settings-quotas.cc:98 #: source/ubl-settings-quotas.cc:118 source/ubl-settings-quotas.cc:119 @@ -181,41 +205,50 @@ msgstr "" " -h, --help\t Показать параметры справки\n" " -V, --version\t Показать версию пакета\n" -#: source/ubl-settings-quotas.cc:74 source/ubl-settings-quotas.cc:66 -#: source/ubl-settings-quotas.cc:87 source/ubl-settings-quotas.cc:84 -#: source/ubl-settings-quotas.cc:81 source/ubl-settings-quotas.cc:80 +#: source/ubl-settings-quotas.cc:144 source/ubl-settings-quotas.cc:74 +#: source/ubl-settings-quotas.cc:66 source/ubl-settings-quotas.cc:87 +#: source/ubl-settings-quotas.cc:84 source/ubl-settings-quotas.cc:81 +#: source/ubl-settings-quotas.cc:80 msgid "General settings" msgstr "Общие настройки" -#: source/ubl-settings-quotas.cc:524 source/ubl-settings-quotas.cc:458 +#: source/ubl-settings-quotas.cc:611 source/ubl-settings-quotas.cc:524 +#: source/ubl-settings-quotas.cc:458 msgid "Global configuration downloaded successfully" msgstr "Успешно загружена глобальная конфигурация" -#: source/ubl-settings-quotas.cc:498 source/ubl-settings-quotas.cc:432 +#: source/ubl-settings-quotas.cc:585 source/ubl-settings-quotas.cc:498 +#: source/ubl-settings-quotas.cc:432 #, fuzzy msgid "Global configuration read error" msgstr "Сохранить глобальную конфигурацию" -#: source/ubl-settings-quotas.cc:530 source/ubl-settings-quotas.cc:464 +#: source/ubl-settings-quotas.cc:617 source/ubl-settings-quotas.cc:530 +#: source/ubl-settings-quotas.cc:464 msgid "Global configuration successfully written" msgstr "Успешно записана глобальная конфигурация" -#: source/ubl-settings-quotas.cc:506 source/ubl-settings-quotas.cc:440 +#: source/ubl-settings-quotas.cc:593 source/ubl-settings-quotas.cc:506 +#: source/ubl-settings-quotas.cc:440 #, fuzzy msgid "Global configuration write error" msgstr "Сохранить глобальную конфигурацию" -#: source/ubl-settings-quotas.cc:128 source/ubl-settings-quotas.cc:118 -#: source/ubl-settings-quotas.cc:139 source/ubl-settings-quotas.cc:136 +#: source/ubl-settings-quotas.cc:198 source/ubl-settings-quotas.cc:128 +#: source/ubl-settings-quotas.cc:118 source/ubl-settings-quotas.cc:139 +#: source/ubl-settings-quotas.cc:136 msgid "Group quotas for this device:" msgstr "Групповые квоты для этого устройства:" -#: source/ubl-settings-quotas.cc:75 source/ubl-settings-quotas.cc:67 -#: source/ubl-settings-quotas.cc:88 source/ubl-settings-quotas.cc:85 -#: source/ubl-settings-quotas.cc:82 source/ubl-settings-quotas.cc:81 +#: source/ubl-settings-quotas.cc:145 source/ubl-settings-quotas.cc:75 +#: source/ubl-settings-quotas.cc:67 source/ubl-settings-quotas.cc:88 +#: source/ubl-settings-quotas.cc:85 source/ubl-settings-quotas.cc:82 +#: source/ubl-settings-quotas.cc:81 msgid "Groups" msgstr "Группы" +#: source/ubl-settings-quotas.cc:203 source/ubl-settings-quotas.cc:204 +#: source/ubl-settings-quotas.cc:213 source/ubl-settings-quotas.cc:218 #: source/ubl-settings-quotas.cc:133 source/ubl-settings-quotas.cc:134 #: source/ubl-settings-quotas.cc:143 source/ubl-settings-quotas.cc:148 #: source/ubl-settings-quotas.cc:123 source/ubl-settings-quotas.cc:124 @@ -290,7 +323,7 @@ msgstr "" "Жесткий предел\n" "(размер) задержки" -#: source/ubl-settings-quotas.cc:382 +#: source/ubl-settings-quotas.cc:247 source/ubl-settings-quotas.cc:382 #, fuzzy msgid "" "Hard limit\n" @@ -301,7 +334,7 @@ msgstr "" "жесткого лимита\n" "(файла)" -#: source/ubl-settings-quotas.cc:375 +#: source/ubl-settings-quotas.cc:240 source/ubl-settings-quotas.cc:375 msgid "" "Hard limit\n" "activation\n" @@ -311,9 +344,9 @@ msgstr "" "жесткого лимита\n" "(объём)" -#: source/ubl-settings-quotas.cc:125 source/ubl-settings-quotas.cc:115 -#: source/ubl-settings-quotas.cc:136 source/ubl-settings-quotas.cc:133 -#: source/ubl-settings-quotas.cc:130 +#: source/ubl-settings-quotas.cc:195 source/ubl-settings-quotas.cc:125 +#: source/ubl-settings-quotas.cc:115 source/ubl-settings-quotas.cc:136 +#: source/ubl-settings-quotas.cc:133 source/ubl-settings-quotas.cc:130 msgid "Hard limit (file) activation time" msgstr "Время активации жесткого лимита (файла)" @@ -329,11 +362,11 @@ msgstr "Жесткий лимит (файлы)" msgid "Hard limit (files) delay" msgstr "Жесткий лимит (файлы)" -#: source/ubl-settings-quotas.cc:118 source/ubl-settings-quotas.cc:108 -#: source/ubl-settings-quotas.cc:129 source/ubl-settings-quotas.cc:126 -#: source/ubl-settings-quotas.cc:123 +#: source/ubl-settings-quotas.cc:188 source/ubl-settings-quotas.cc:118 +#: source/ubl-settings-quotas.cc:108 source/ubl-settings-quotas.cc:129 +#: source/ubl-settings-quotas.cc:126 source/ubl-settings-quotas.cc:123 msgid "Hard limit (size)" -msgstr "Жесткий предел (размер) задержки" +msgstr "Жесткий ограничение (объём)" #: source/ubl-settings-quotas.cc:120 source/ubl-settings-quotas.cc:110 #: source/ubl-settings-quotas.cc:131 source/ubl-settings-quotas.cc:128 @@ -347,42 +380,54 @@ msgstr "Жесткий предел (размер)" msgid "Hard limit (size) delay" msgstr "Жесткий предел (размер) задержки" -#: source/ubl-settings-quotas.cc:155 source/ubl-settings-quotas.cc:145 +#: source/ubl-settings-quotas.cc:190 +msgid "Hard limit activation time (size)" +msgstr "Время активации жесткого ограничения (объём)" + +#: source/ubl-settings-quotas.cc:225 source/ubl-settings-quotas.cc:155 +#: source/ubl-settings-quotas.cc:145 msgid "Help" msgstr "Справка" -#: source/ubl-settings-quotas.cc:109 source/ubl-settings-quotas.cc:99 -#: source/ubl-settings-quotas.cc:120 source/ubl-settings-quotas.cc:117 -#: source/ubl-settings-quotas.cc:114 +#: source/ubl-settings-quotas.cc:179 source/ubl-settings-quotas.cc:109 +#: source/ubl-settings-quotas.cc:99 source/ubl-settings-quotas.cc:120 +#: source/ubl-settings-quotas.cc:117 source/ubl-settings-quotas.cc:114 msgid "Load" msgstr "Загрузить" -#: source/ubl-settings-quotas.cc:152 source/ubl-settings-quotas.cc:142 +#: source/ubl-settings-quotas.cc:222 source/ubl-settings-quotas.cc:152 +#: source/ubl-settings-quotas.cc:142 msgid "Load from global configuration" msgstr "Загрузить глобальную конфигурацию" -#: source/ubl-settings-quotas.cc:153 source/ubl-settings-quotas.cc:143 +#: source/ubl-settings-quotas.cc:223 source/ubl-settings-quotas.cc:153 +#: source/ubl-settings-quotas.cc:143 msgid "Load from local configuration" msgstr "Загрузить локальную конфигурацию" -#: source/ubl-settings-quotas.cc:521 source/ubl-settings-quotas.cc:455 +#: source/ubl-settings-quotas.cc:608 source/ubl-settings-quotas.cc:521 +#: source/ubl-settings-quotas.cc:455 msgid "Local configuration downloaded successfully" msgstr "Успешно загружена локальная конфигурация" -#: source/ubl-settings-quotas.cc:494 source/ubl-settings-quotas.cc:428 +#: source/ubl-settings-quotas.cc:581 source/ubl-settings-quotas.cc:494 +#: source/ubl-settings-quotas.cc:428 #, fuzzy msgid "Local configuration reading error" msgstr "Загрузить локальную конфигурацию" -#: source/ubl-settings-quotas.cc:527 source/ubl-settings-quotas.cc:461 +#: source/ubl-settings-quotas.cc:614 source/ubl-settings-quotas.cc:527 +#: source/ubl-settings-quotas.cc:461 msgid "Local configuration successfully written" msgstr "Успешно записана локальная конфигурация" -#: source/ubl-settings-quotas.cc:502 source/ubl-settings-quotas.cc:436 +#: source/ubl-settings-quotas.cc:589 source/ubl-settings-quotas.cc:502 +#: source/ubl-settings-quotas.cc:436 #, fuzzy msgid "Local configuration write error" msgstr "Загрузить локальную конфигурацию" +#: source/ubl-settings-quotas.cc:184 source/ubl-settings-quotas.cc:234 #: source/ubl-settings-quotas.cc:114 source/ubl-settings-quotas.cc:369 #: source/ubl-settings-quotas.cc:104 source/ubl-settings-quotas.cc:314 #: source/ubl-settings-quotas.cc:125 source/ubl-settings-quotas.cc:318 @@ -391,16 +436,19 @@ msgstr "Загрузить локальную конфигурацию" msgid "Name" msgstr "Имя" -#: source/ubl-settings-quotas.cc:536 source/ubl-settings-quotas.cc:470 +#: source/ubl-settings-quotas.cc:623 source/ubl-settings-quotas.cc:536 +#: source/ubl-settings-quotas.cc:470 msgid "Nothing to save!" msgstr "Нечего сохранять!" -#: source/ubl-settings-quotas.cc:73 source/ubl-settings-quotas.cc:65 -#: source/ubl-settings-quotas.cc:86 source/ubl-settings-quotas.cc:83 -#: source/ubl-settings-quotas.cc:80 source/ubl-settings-quotas.cc:79 +#: source/ubl-settings-quotas.cc:143 source/ubl-settings-quotas.cc:73 +#: source/ubl-settings-quotas.cc:65 source/ubl-settings-quotas.cc:86 +#: source/ubl-settings-quotas.cc:83 source/ubl-settings-quotas.cc:80 +#: source/ubl-settings-quotas.cc:79 msgid "Project Home Page" msgstr "Главная страница проекта" +#: source/ubl-settings-quotas.cc:185 source/ubl-settings-quotas.cc:235 #: source/ubl-settings-quotas.cc:115 source/ubl-settings-quotas.cc:370 #: source/ubl-settings-quotas.cc:105 source/ubl-settings-quotas.cc:315 #: source/ubl-settings-quotas.cc:126 source/ubl-settings-quotas.cc:319 @@ -409,37 +457,42 @@ msgstr "Главная страница проекта" msgid "Quotas" msgstr "Квоты" -#: source/ubl-settings-quotas.cc:81 source/ubl-settings-quotas.cc:71 +#: source/ubl-settings-quotas.cc:151 source/ubl-settings-quotas.cc:81 +#: source/ubl-settings-quotas.cc:71 msgid "Quotas for groups" msgstr "Квоты для групп" -#: source/ubl-settings-quotas.cc:84 source/ubl-settings-quotas.cc:74 +#: source/ubl-settings-quotas.cc:154 source/ubl-settings-quotas.cc:84 +#: source/ubl-settings-quotas.cc:74 msgid "Quotas for users" msgstr "Квоты для пользователей" -#: source/ubl-settings-quotas.cc:110 source/ubl-settings-quotas.cc:100 -#: source/ubl-settings-quotas.cc:121 source/ubl-settings-quotas.cc:118 -#: source/ubl-settings-quotas.cc:115 +#: source/ubl-settings-quotas.cc:180 source/ubl-settings-quotas.cc:110 +#: source/ubl-settings-quotas.cc:100 source/ubl-settings-quotas.cc:121 +#: source/ubl-settings-quotas.cc:118 source/ubl-settings-quotas.cc:115 msgid "Save" msgstr "Сохранить" -#: source/ubl-settings-quotas.cc:156 source/ubl-settings-quotas.cc:146 +#: source/ubl-settings-quotas.cc:226 source/ubl-settings-quotas.cc:156 +#: source/ubl-settings-quotas.cc:146 msgid "Save to global and local configuration" msgstr "Сохранить глобальную и локальную конфигурацию" -#: source/ubl-settings-quotas.cc:157 source/ubl-settings-quotas.cc:147 +#: source/ubl-settings-quotas.cc:227 source/ubl-settings-quotas.cc:157 +#: source/ubl-settings-quotas.cc:147 msgid "Save to global configuration" msgstr "Сохранить глобальную конфигурацию" -#: source/ubl-settings-quotas.cc:158 source/ubl-settings-quotas.cc:148 +#: source/ubl-settings-quotas.cc:228 source/ubl-settings-quotas.cc:158 +#: source/ubl-settings-quotas.cc:148 msgid "Save to local configuration" msgstr "Сохранить локальную конфигурацию" -#: source/ubl-settings-quotas.cc:70 +#: source/ubl-settings-quotas.cc:140 source/ubl-settings-quotas.cc:70 msgid "Setting user quotas" msgstr "Настройка квот пользователей" -#: source/ubl-settings-quotas.cc:380 +#: source/ubl-settings-quotas.cc:245 source/ubl-settings-quotas.cc:380 msgid "" "Severe\n" "limitation\n" @@ -449,7 +502,7 @@ msgstr "" "ограничение\n" "(файлы)" -#: source/ubl-settings-quotas.cc:373 +#: source/ubl-settings-quotas.cc:238 source/ubl-settings-quotas.cc:373 msgid "" "Severe\n" "limitation\n" @@ -459,6 +512,12 @@ msgstr "" "ограничение\n" "(объём)" +#: source/ubl-settings-quotas.cc:193 +msgid "Severe limitation (files)" +msgstr "Жесткое ограничение (файлы)" + +#: source/ubl-settings-quotas.cc:186 source/ubl-settings-quotas.cc:199 +#: source/ubl-settings-quotas.cc:210 source/ubl-settings-quotas.cc:236 #: source/ubl-settings-quotas.cc:116 source/ubl-settings-quotas.cc:129 #: source/ubl-settings-quotas.cc:140 source/ubl-settings-quotas.cc:371 #: source/ubl-settings-quotas.cc:106 source/ubl-settings-quotas.cc:119 @@ -471,7 +530,7 @@ msgstr "" msgid "Size" msgstr "Объём" -#: source/ubl-settings-quotas.cc:379 +#: source/ubl-settings-quotas.cc:244 source/ubl-settings-quotas.cc:379 msgid "" "Soft\n" "Restriction\n" @@ -481,6 +540,12 @@ msgstr "" "ограничение\n" "(файлы)" +#: source/ubl-settings-quotas.cc:192 +msgid "Soft Restriction (files)" +msgstr "Мягкое ограничение (файлы)" + +#: source/ubl-settings-quotas.cc:202 source/ubl-settings-quotas.cc:205 +#: source/ubl-settings-quotas.cc:212 source/ubl-settings-quotas.cc:217 #: source/ubl-settings-quotas.cc:132 source/ubl-settings-quotas.cc:135 #: source/ubl-settings-quotas.cc:142 source/ubl-settings-quotas.cc:147 #: source/ubl-settings-quotas.cc:122 source/ubl-settings-quotas.cc:125 @@ -501,12 +566,13 @@ msgid "" "Soft limit\n" "(files)" msgstr "" -"Мягкий ограничение\n" -"(файлы)" +"Мягкий\n" +"ограничение\n" +"(объём)" -#: source/ubl-settings-quotas.cc:372 source/ubl-settings-quotas.cc:317 -#: source/ubl-settings-quotas.cc:321 source/ubl-settings-quotas.cc:313 -#: source/ubl-settings-quotas.cc:260 +#: source/ubl-settings-quotas.cc:237 source/ubl-settings-quotas.cc:372 +#: source/ubl-settings-quotas.cc:317 source/ubl-settings-quotas.cc:321 +#: source/ubl-settings-quotas.cc:313 source/ubl-settings-quotas.cc:260 #, fuzzy msgid "" "Soft limit\n" @@ -523,36 +589,40 @@ msgstr "" "Мягкий ограничение\n" "(файлы)" -#: source/ubl-settings-quotas.cc:117 source/ubl-settings-quotas.cc:107 -#: source/ubl-settings-quotas.cc:128 source/ubl-settings-quotas.cc:125 -#: source/ubl-settings-quotas.cc:122 +#: source/ubl-settings-quotas.cc:187 source/ubl-settings-quotas.cc:117 +#: source/ubl-settings-quotas.cc:107 source/ubl-settings-quotas.cc:128 +#: source/ubl-settings-quotas.cc:125 source/ubl-settings-quotas.cc:122 msgid "Soft limit (size)" -msgstr "" -"Мягкий предел\n" -"(размер)" +msgstr "Мягкий ограничение (объём)" -#: source/ubl-settings-quotas.cc:533 source/ubl-settings-quotas.cc:467 +#: source/ubl-settings-quotas.cc:620 source/ubl-settings-quotas.cc:533 +#: source/ubl-settings-quotas.cc:467 #, fuzzy msgid "Successfully saved local and global configuration" msgstr "Сохранить глобальную и локальную конфигурацию" -#: source/ubl-settings-quotas.cc:55 source/ubl-settings-quotas.cc:47 -#: source/ubl-settings-quotas.cc:68 source/ubl-settings-quotas.cc:70 -#: source/ubl-settings-quotas.cc:67 source/ubl-settings-quotas.cc:66 +#: source/ubl-settings-quotas.cc:59 source/ubl-settings-quotas.cc:55 +#: source/ubl-settings-quotas.cc:47 source/ubl-settings-quotas.cc:68 +#: source/ubl-settings-quotas.cc:70 source/ubl-settings-quotas.cc:67 +#: source/ubl-settings-quotas.cc:66 msgid "The program must be run as root" msgstr "Программа должна быть запущена от имени root" -#: source/ubl-settings-quotas.cc:139 source/ubl-settings-quotas.cc:129 -#: source/ubl-settings-quotas.cc:150 source/ubl-settings-quotas.cc:147 +#: source/ubl-settings-quotas.cc:209 source/ubl-settings-quotas.cc:139 +#: source/ubl-settings-quotas.cc:129 source/ubl-settings-quotas.cc:150 +#: source/ubl-settings-quotas.cc:147 msgid "User quotas for this device: " msgstr "Квоты пользователей для этого устройства: " -#: source/ubl-settings-quotas.cc:78 source/ubl-settings-quotas.cc:68 -#: source/ubl-settings-quotas.cc:89 source/ubl-settings-quotas.cc:86 -#: source/ubl-settings-quotas.cc:83 source/ubl-settings-quotas.cc:82 +#: source/ubl-settings-quotas.cc:148 source/ubl-settings-quotas.cc:78 +#: source/ubl-settings-quotas.cc:68 source/ubl-settings-quotas.cc:89 +#: source/ubl-settings-quotas.cc:86 source/ubl-settings-quotas.cc:83 +#: source/ubl-settings-quotas.cc:82 msgid "Users" msgstr "Пользователи" +#: source/ubl-settings-quotas.cc:163 source/ubl-settings-quotas.cc:164 +#: source/ubl-settings-quotas.cc:165 source/ubl-settings-quotas.cc:166 #: source/ubl-settings-quotas.cc:93 source/ubl-settings-quotas.cc:94 #: source/ubl-settings-quotas.cc:95 source/ubl-settings-quotas.cc:96 #: source/ubl-settings-quotas.cc:83 source/ubl-settings-quotas.cc:84 @@ -566,6 +636,7 @@ msgstr "Пользователи" msgid "days" msgstr "дни" +#: source/ubl-settings-quotas.cc:219 source/ubl-settings-quotas.cc:220 #: source/ubl-settings-quotas.cc:149 source/ubl-settings-quotas.cc:150 #: source/ubl-settings-quotas.cc:139 source/ubl-settings-quotas.cc:140 #: source/ubl-settings-quotas.cc:160 source/ubl-settings-quotas.cc:161 @@ -574,6 +645,8 @@ msgstr "дни" msgid "files" msgstr "Файлы" +#: source/ubl-settings-quotas.cc:167 source/ubl-settings-quotas.cc:168 +#: source/ubl-settings-quotas.cc:169 source/ubl-settings-quotas.cc:170 #: source/ubl-settings-quotas.cc:97 source/ubl-settings-quotas.cc:98 #: source/ubl-settings-quotas.cc:99 source/ubl-settings-quotas.cc:100 #: source/ubl-settings-quotas.cc:87 source/ubl-settings-quotas.cc:88 @@ -587,17 +660,20 @@ msgstr "Файлы" msgid "hours" msgstr "часы" -#: source/ubl-settings-quotas.cc:71 source/ubl-settings-quotas.cc:63 -#: source/ubl-settings-quotas.cc:84 source/ubl-settings-quotas.cc:81 -#: source/ubl-settings-quotas.cc:78 source/ubl-settings-quotas.cc:77 +#: source/ubl-settings-quotas.cc:141 source/ubl-settings-quotas.cc:71 +#: source/ubl-settings-quotas.cc:63 source/ubl-settings-quotas.cc:84 +#: source/ubl-settings-quotas.cc:81 source/ubl-settings-quotas.cc:78 +#: source/ubl-settings-quotas.cc:77 msgid "https://wiki.ublinux.com" msgstr "https://wiki.ublinux.ru" -#: source/ubl-settings-quotas.cc:461 +#: source/ubl-settings-quotas.cc:548 source/ubl-settings-quotas.cc:461 msgid "" "https://wiki.ublinux.com/ru/Программное_обеспечение/Программы_и_утилиты/Все/" msgstr "" +#: source/ubl-settings-quotas.cc:171 source/ubl-settings-quotas.cc:172 +#: source/ubl-settings-quotas.cc:173 source/ubl-settings-quotas.cc:174 #: source/ubl-settings-quotas.cc:101 source/ubl-settings-quotas.cc:102 #: source/ubl-settings-quotas.cc:103 source/ubl-settings-quotas.cc:104 #: source/ubl-settings-quotas.cc:91 source/ubl-settings-quotas.cc:92 @@ -627,13 +703,15 @@ msgstr "Квоты для групп" msgid "quotas for users" msgstr "Квоты для пользователей" -#: source/ubl-settings-quotas.cc:542 source/ubl-settings-quotas.cc:476 -#: source/ubl-settings-quotas.cc:350 source/ubl-settings-quotas.cc:371 -#: source/ubl-settings-quotas.cc:318 source/ubl-settings-quotas.cc:267 -#: source/ubl-settings-quotas.cc:213 +#: source/ubl-settings-quotas.cc:629 source/ubl-settings-quotas.cc:542 +#: source/ubl-settings-quotas.cc:476 source/ubl-settings-quotas.cc:350 +#: source/ubl-settings-quotas.cc:371 source/ubl-settings-quotas.cc:318 +#: source/ubl-settings-quotas.cc:267 source/ubl-settings-quotas.cc:213 msgid "ubl-settings-quotas version: " msgstr "ubl-settings-quotas версия: " +#: source/ubl-settings-quotas.cc:159 source/ubl-settings-quotas.cc:160 +#: source/ubl-settings-quotas.cc:161 source/ubl-settings-quotas.cc:162 #: source/ubl-settings-quotas.cc:89 source/ubl-settings-quotas.cc:90 #: source/ubl-settings-quotas.cc:91 source/ubl-settings-quotas.cc:92 #: source/ubl-settings-quotas.cc:79 source/ubl-settings-quotas.cc:80 @@ -647,8 +725,12 @@ msgstr "ubl-settings-quotas версия: " msgid "weeks" msgstr "недели" -#~ msgid "Deferring a hard limit (size)" -#~ msgstr "Отсрочка жесткого ограничения (объём)" - #~ msgid "ubl-settings-quotas" #~ msgstr "Квоты" + +#~ msgid "Severe limitation (size)" +#~ msgstr "Жесткое ограничение (объём)" + +#, fuzzy +#~ msgid "Hard limit activation time (files)" +#~ msgstr "Время активации жесткого граничения (файла)" From 4acb8c8bbaf2d5e5c0f011b1b9864abfda014f2e Mon Sep 17 00:00:00 2001 From: Igor Belitskiy Date: Mon, 10 Apr 2023 17:53:56 +0000 Subject: [PATCH 20/51] fix --- source/my_process.h | 4 ++-- source/ubl-settings-quotas.cc | 15 +++++++-------- source/ubl-settings-quotas.h | 7 ------- ubl-settings-quotas.desktop | 2 +- ubl-settings-quotas_ru.po | 4 ++-- 5 files changed, 12 insertions(+), 20 deletions(-) diff --git a/source/my_process.h b/source/my_process.h index e07a89c..3cc6f81 100644 --- a/source/my_process.h +++ b/source/my_process.h @@ -1,5 +1,5 @@ -#ifndef SAVE_H -#define SAVE_H +#ifndef MY_PROCESS_H +#define MY_PROCESS_H #include "util.h" namespace My_Process { diff --git a/source/ubl-settings-quotas.cc b/source/ubl-settings-quotas.cc index 7088c5b..34c4ff2 100755 --- a/source/ubl-settings-quotas.cc +++ b/source/ubl-settings-quotas.cc @@ -30,10 +30,6 @@ void MainWindow::settings() { 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); this->entry_generalGroupsEnableCheck(); this->entry_generalUsersEnableCheck(); map_device = obj_device.get_map_part_devices("/dev/"); @@ -43,9 +39,9 @@ void MainWindow::settings() { this->entry_combo_box_temp(generalDeviceCombo,lblFstypeGeneralSettings); this->entry_combo_box_temp(groupsDeviceCombo, lblFstypeGroups); this->entry_combo_box_temp(usersDeviceCombo, lblFstypeUsers); + this->init_tree_view(); this->init_spin_all(); if (geteuid() == 0) { - this->init_tree_view(); this->load_system_cfg(); this->load_global_cfg(); this->event(); @@ -58,6 +54,10 @@ void MainWindow::settings() { info_status_app("boxInfoMessError"); lblWarning->set_text(_("The program must be run as root")); } + 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); } void MainWindow::init_spin_all() { @@ -144,7 +144,7 @@ void MainWindow::lacalization() { generalTabLabel->set_text(_("General settings")); GroupsTabLabel->set_text(_("Groups")); headerAboutTopic->set_label(_(app_name.c_str())); - headerTopic->set_label(_(app_name.c_str())); + headerTopic->set_label(_("ubl-settings-quotas")); UsersTabLabel->set_text(_("Users")); generalDeviceLabel->set_text(_("Device:")); generalFileSystemLabel->set_text(_("File system:")); @@ -226,11 +226,10 @@ void MainWindow::lacalization() { btnSaveLocalGlob->set_label(_("Save to global and local configuration")); btnSaveGlob->set_label(_("Save to global configuration")); btnSaveLocal->set_label(_("Save to local configuration")); + lblHeadFiltersWindow->set_label(_("Filters")); } void MainWindow::view_add_columns(Gtk::TreeView &treeView) { - // TODO: - // Не готово treeView.append_column(_("Name"), m_columns.name); treeView.append_column_editable(_("Quotas"), m_columns.quotas); treeView.append_column(_("Size"), m_columns.size); diff --git a/source/ubl-settings-quotas.h b/source/ubl-settings-quotas.h index 4711e9b..b68274b 100644 --- a/source/ubl-settings-quotas.h +++ b/source/ubl-settings-quotas.h @@ -20,11 +20,8 @@ extern const string app_name; extern const string path_locale; extern const string path_css; extern const string path_img_head_background; - extern string version_application; - - class MainWindow : public Gtk::ApplicationWindow { public: class ModelColumns : public Gtk::TreeModel::ColumnRecord { @@ -185,9 +182,6 @@ class MainWindow : public Gtk::ApplicationWindow { Gtk::SpinButton *generalUsersFilesHoursSpin; Gtk::SpinButton *generalUsersSizeMinuteSpin; Gtk::SpinButton *generalUsersFilesMinutesSpin; - - - public: Lib_save::Save obj_save = Lib_save::Save(); Lib_Load::Load obj_load = Lib_Load::Load(); @@ -200,7 +194,6 @@ class MainWindow : public Gtk::ApplicationWindow { vector vec_param_names; map_str_device map_device; string str_cmd_error; - public: MainWindow(BaseObjectType* obj, Glib::RefPtr const& builder); MainWindow(Glib::RefPtr const& builder); diff --git a/ubl-settings-quotas.desktop b/ubl-settings-quotas.desktop index a1848f4..61cc341 100644 --- a/ubl-settings-quotas.desktop +++ b/ubl-settings-quotas.desktop @@ -12,4 +12,4 @@ Icon=com.ublinux.ubl-settings-quotas Terminal=false X-XfcePluggable=true X-UBLPluggable=true -Categories=XFCE;GTK;Settings;DesktopSettings;X-XFCE-SettingsDialog;X-XFCE-SystemSettings; +Categories=XFCE;GTK;Settings;DesktopSettings;X-XFCE-SettingsDialog;X-XFCE-SystemSettings;X-UBL-SettingsManager;X-UBL-SystemSettings; diff --git a/ubl-settings-quotas_ru.po b/ubl-settings-quotas_ru.po index 5bcd4a9..0d2240c 100644 --- a/ubl-settings-quotas_ru.po +++ b/ubl-settings-quotas_ru.po @@ -725,8 +725,8 @@ msgstr "ubl-settings-quotas версия: " msgid "weeks" msgstr "недели" -#~ msgid "ubl-settings-quotas" -#~ msgstr "Квоты" +msgid "ubl-settings-quotas" +msgstr "Квоты" #~ msgid "Severe limitation (size)" #~ msgstr "Жесткое ограничение (объём)" From 65894da802a6c34ac4ce432de68b5db3f941c0b5 Mon Sep 17 00:00:00 2001 From: Igor Belitskiy Date: Tue, 11 Apr 2023 10:42:40 +0000 Subject: [PATCH 21/51] =?UTF-8?q?=D0=98=D1=81=D0=BF=D1=80=D0=B0=D0=B2?= =?UTF-8?q?=D0=BB=D0=B5=D0=BD=D0=B0=20=D1=87=D1=82=D0=B5=D0=BD=D0=B8=D0=B9?= =?UTF-8?q?=20=D0=B8=D0=BC=D1=91=D0=BD=20=D0=B4=D0=B8=D1=81=D0=BA=D0=BE?= =?UTF-8?q?=D0=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- source/CMakeLists.txt | 4 +-- source/my_device.cc | 57 +++++++++++++---------------------- source/my_device.h | 13 ++++---- source/save.h | 5 +-- source/ubl-settings-quotas.cc | 7 ++--- source/ubl-settings-quotas.h | 6 ++-- 6 files changed, 39 insertions(+), 53 deletions(-) diff --git a/source/CMakeLists.txt b/source/CMakeLists.txt index e3caf3b..73f1eb7 100644 --- a/source/CMakeLists.txt +++ b/source/CMakeLists.txt @@ -16,11 +16,11 @@ set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -pedantic -Wall -Wextra -Werror -Wmissin -fstack-clash-protection -fcf-protection -g") set(SOURCE_FILES + ubl-settings-quotas.h + ubl-settings-quotas.cc my_device.h my_device.cc project_lib.h - ubl-settings-quotas.h - ubl-settings-quotas.cc my_type.h save.h save.cc diff --git a/source/my_device.cc b/source/my_device.cc index 8385e69..5005baf 100644 --- a/source/my_device.cc +++ b/source/my_device.cc @@ -1,43 +1,28 @@ #include "my_device.h" + namespace Devices { -std::vector Get_device::get_all_device() { - std::vector vec_mount_devices; - std::vector vec_str; - std::ifstream file("/proc/mounts"); - if (file.is_open()) { - std::string line; - while (std::getline(file, line)) { - vec_str = Utils::split(line, ' '); - struct Mount mount; - mount.device = vec_str[0]; - mount.destination = vec_str[1]; - mount.fstype = vec_str[2]; - mount.options = vec_str[3]; - mount.dump = vec_str[4]; - mount.pass = vec_str[5]; - vec_mount_devices.push_back(mount); + + map_str_str Parted::get_parted() { + string cmd = "lsblk --fs --raw --output PATH,FSTYPE --exclude 7,11,253"; + string response = obj_process_call.call_all_sections(cmd); + vector vec_parted = Utils::split(response, '\n'); + map_str_str dict_parted; + string key = ""; + if (vec_parted.size()>1) { + vec_parted.erase(vec_parted.begin()); } - } - file.close(); - return vec_mount_devices; - -} -std::vector Get_device::get_part_devices(string find_device_name) { - std::vector vec_mount_devices; - for (const auto &device: this->get_all_device()) { - if (device.device.find(find_device_name) != std::string::npos) { - vec_mount_devices.push_back(device); + for (const string& str_parted : vec_parted) { + key = str_parted.substr(0, str_parted.find(" ")); + if (str_parted.find(" ") != string::npos) { + dict_parted[key] = str_parted.substr(str_parted.find(" ") + 1, str_parted.length()); + } + else { + dict_parted[key] = ""; + } } + + return dict_parted; } - return vec_mount_devices; -} - -map_str_device Get_device::get_map_part_devices(string find_device_name) { - map_str_device map_device; - for (const auto &device: this->get_part_devices(find_device_name)) { - map_device[device.device] = device; - } - return map_device; - } + } \ No newline at end of file diff --git a/source/my_device.h b/source/my_device.h index 6cabfb6..1db5317 100644 --- a/source/my_device.h +++ b/source/my_device.h @@ -2,18 +2,19 @@ #define MY_DEVICE_H #include "project_lib.h" +#include "my_process.h" #include "util.h" #include "my_type.h" namespace Devices { -class Get_device { - - public: - map_str_device get_map_part_devices(string find_device_name); - std::vector get_part_devices(string find_device_name); - std::vector get_all_device(); + class Parted{ + protected: + My_Process::My_Process_call obj_process_call = My_Process::My_Process_call(); + public: + map_str_str get_parted(); }; + } #endif diff --git a/source/save.h b/source/save.h index bdc2f56..5449b69 100644 --- a/source/save.h +++ b/source/save.h @@ -1,7 +1,8 @@ -#ifndef MY_PROCESS_H -#define MY_PROCESS_H +#ifndef SAVE_H +#define SAVE_H #include "my_process.h" +#include "project_lib.h" namespace Lib_save { class Save { diff --git a/source/ubl-settings-quotas.cc b/source/ubl-settings-quotas.cc index 34c4ff2..aa38d13 100755 --- a/source/ubl-settings-quotas.cc +++ b/source/ubl-settings-quotas.cc @@ -32,7 +32,7 @@ void MainWindow::settings() { btnBoxAboutDialog->set_visible(false); this->entry_generalGroupsEnableCheck(); this->entry_generalUsersEnableCheck(); - map_device = obj_device.get_map_part_devices("/dev/"); + map_device = obj_device.get_parted(); this->filling_device_combo_box_template(generalDeviceCombo, map_device); this->filling_device_combo_box_template(groupsDeviceCombo, map_device); this->filling_device_combo_box_template(usersDeviceCombo, map_device); @@ -246,7 +246,7 @@ void MainWindow::view_add_columns(Gtk::TreeView &treeView) { treeView.append_column(_("Hard limit\nactivation\ntime (files)"), m_columns.hard_limit_files_activ_time); } -void MainWindow::filling_device_combo_box_template(Gtk::ComboBoxText *combo_box, map_str_device &map_device) { +void MainWindow::filling_device_combo_box_template(Gtk::ComboBoxText *combo_box, map_str_str &map_device) { if (map_device.size() != 0) { for (const auto &device : map_device) { combo_box->append(device.first.c_str()); @@ -258,8 +258,7 @@ void MainWindow::filling_device_combo_box_template(Gtk::ComboBoxText *combo_box, void MainWindow::entry_combo_box_temp(Gtk::ComboBoxText *combo_box, Gtk::Label *label) { string text = combo_box->get_active_text(); if (map_device.find(text) != map_device.end()){ - auto value_device = map_device[text]; - label->set_text(value_device.fstype); + label->set_text(map_device[text]); } } diff --git a/source/ubl-settings-quotas.h b/source/ubl-settings-quotas.h index b68274b..5f83161 100644 --- a/source/ubl-settings-quotas.h +++ b/source/ubl-settings-quotas.h @@ -185,14 +185,14 @@ class MainWindow : public Gtk::ApplicationWindow { public: Lib_save::Save obj_save = Lib_save::Save(); Lib_Load::Load obj_load = Lib_Load::Load(); - Devices::Get_device obj_device = Devices::Get_device(); + Devices::Parted obj_device = Devices::Parted(); My_Process::My_Process_system obj_process_system = My_Process::My_Process_system(); My_Process::My_Process_call obj_process_call = My_Process::My_Process_call(); map_str_str map_gui_cfg; map_str_str map_global_cfg; map_str_str map_system_cfg; vector vec_param_names; - map_str_device map_device; + map_str_str map_device; string str_cmd_error; public: MainWindow(BaseObjectType* obj, Glib::RefPtr const& builder); @@ -219,7 +219,7 @@ class MainWindow : public Gtk::ApplicationWindow { void init_spin_all(); void load_global_cfg(); void load_system_cfg(); - void filling_device_combo_box_template(Gtk::ComboBoxText *combo_box, map_str_device &map_device); + void filling_device_combo_box_template(Gtk::ComboBoxText *combo_box, map_str_str &map_device); bool save_template(string section, string flag_save); void view_add_columns(Gtk::TreeView &treeView); From b5b28e9e3e88be2d5e854b5381fa133eaa575f76 Mon Sep 17 00:00:00 2001 From: Igor Belitskiy Date: Fri, 14 Apr 2023 11:22:36 +0000 Subject: [PATCH 22/51] =?UTF-8?q?=D0=98=D1=81=D0=BF=D1=80=D0=B0=D0=B2?= =?UTF-8?q?=D0=BB=D0=B5=D0=BD=20=D0=BB=D0=BE=D0=B3=D0=BE=D1=82=D0=B8=D0=BF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- com.ublinux.ubl-settings-quotas.svg | 1238 +++++++++++++++++++++++---- 1 file changed, 1092 insertions(+), 146 deletions(-) diff --git a/com.ublinux.ubl-settings-quotas.svg b/com.ublinux.ubl-settings-quotas.svg index f636c26..708bd05 100644 --- a/com.ublinux.ubl-settings-quotas.svg +++ b/com.ublinux.ubl-settings-quotas.svg @@ -4,8 +4,8 @@ height="180" version="1.0" id="svg8" - sodipodi:docname="ublinux-ubconfig.svg" - inkscape:version="1.1.1 (3bf5ae0d25, 2021-09-20)" + sodipodi:docname="ubl-settings-quotas.svg" + inkscape:version="1.1.2 (0a00cf5339, 2022-02-04, custom)" inkscape:export-filename="/media/Data/ShareMX/temp/archtoub_icons/ublinux-logo.png" inkscape:export-xdpi="136.53334" inkscape:export-ydpi="136.53334" @@ -16,6 +16,24 @@ xmlns:svg="http://www.w3.org/2000/svg"> + + + + + + + + + + + + + + + + + + + + + + + + + + + + xlink:href="#linearGradient2580-3" /> + id="linearGradient2580-3" + x1="-183.25999" + x2="-133.33" + y1="-122.79" + y2="-134.57001" + gradientTransform="matrix(0.25137,0,0,0.25137,-7.3652,-24.336)" + gradientUnits="userSpaceOnUse"> + id="stop93" /> + id="stop95" /> + + + + + stdDeviation="0.43959997" + id="feGaussianBlur1137" /> + + xlink:href="#linearGradient2580-3" /> + + + + id="linearGradient6296" + x1="-183.25999" + x2="-133.33" + y1="-122.79" + y2="-134.57001" + gradientTransform="matrix(0.080474,0,0,0.080474,9.3119,27.811)" + gradientUnits="userSpaceOnUse" + xlink:href="#linearGradient2586" /> + + id="stop43" /> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + id="stop11-9" /> + + + + + color-interpolation-filters="sRGB" + height="1.12" + width="1.12" + y="-0.060000001" + x="-0.060000001" + id="m-5"> + + + + + + + + + + + + + + id="feGaussianBlur903" + stdDeviation="0.14999813" /> + y2="36" + y1="20" + x2="23.5" + x1="23.5" + id="k-2" + gradientTransform="translate(-3.4889408e-4,-3.4889408e-4)" /> + id="b"> + id="stop2-7" /> + id="stop4-9" /> + xlink:href="#b" + gradientUnits="userSpaceOnUse" + y2="36" + y1="30" + x2="32" + x1="32" + id="j-9" + gradientTransform="translate(-3.4889408e-4,-3.4889408e-4)" /> + + stop-color="#0ef1c9" /> + stop-color="#0e95f1" /> + xlink:href="#a" /> + + id="stop7-2" /> + + + + + + + + id="stop734" /> + + + + + + id="stop725" /> + id="stop727" /> + + + id="filter4227" + x="-0.135" + y="-0.135" + width="1.27" + height="1.27"> + id="feFlood4217" /> + id="feComposite4219" /> + id="feGaussianBlur4221" /> + id="feOffset4223" /> + id="feComposite4225" /> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -4927,31 +5741,163 @@ id="circle1671" /> - - + id="g912" + transform="matrix(2.0912263,0,0,2.0912263,23.080754,23.080758)" + style="filter:url(#filter4565)"> + + + + + + + + + + + + + + + + + + cx="32" + cy="32" + fill="url(#k)" + r="3" + id="circle71" + style="fill:url(#k)" /> + + + + + + + + + + + + + From 098edef3d1bb6f1040a813f2935d60faae71561c Mon Sep 17 00:00:00 2001 From: Igor Belitskiy Date: Fri, 14 Apr 2023 11:23:29 +0000 Subject: [PATCH 23/51] =?UTF-8?q?=D0=9D=D0=B0=D1=87=D0=B0=D0=BB=20=D1=80?= =?UTF-8?q?=D0=B0=D0=B1=D0=BE=D1=82=D1=83=20=D0=BF=D0=BE=20=D0=B4=D0=BE?= =?UTF-8?q?=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5=D0=BD=D0=B8=D1=8E=20=D0=BA=D0=BE?= =?UTF-8?q?=D0=BC=D0=B0=D0=BD=D0=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- source/CMakeLists.txt | 2 + source/global_var.h | 3 + source/my_device.cc | 9 +- source/my_type.h | 16 ++++ source/save.cc | 44 ++++++++++ source/save.h | 43 ++++----- source/system_cmd_quotas.cc | 159 +++++++++++++++++++++++++++++++++ source/system_cmd_quotas.h | 29 ++++++ source/ubl-settings-quotas.cc | 161 +++++++++++++++++++++++++++++++++- source/ubl-settings-quotas.h | 33 +++++++ ubl-settings-quotas.glade | 134 +++++++++++++++++++++++++++- 11 files changed, 605 insertions(+), 28 deletions(-) create mode 100644 source/global_var.h create mode 100644 source/system_cmd_quotas.cc create mode 100644 source/system_cmd_quotas.h diff --git a/source/CMakeLists.txt b/source/CMakeLists.txt index 73f1eb7..7c074b9 100644 --- a/source/CMakeLists.txt +++ b/source/CMakeLists.txt @@ -18,6 +18,8 @@ set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -pedantic -Wall -Wextra -Werror -Wmissin set(SOURCE_FILES ubl-settings-quotas.h ubl-settings-quotas.cc + system_cmd_quotas.cc + system_cmd_quotas.h my_device.h my_device.cc project_lib.h diff --git a/source/global_var.h b/source/global_var.h new file mode 100644 index 0000000..e88d924 --- /dev/null +++ b/source/global_var.h @@ -0,0 +1,3 @@ + +#include "project_lib.h" +#include "my_tupe.h" \ No newline at end of file diff --git a/source/my_device.cc b/source/my_device.cc index 5005baf..7dedf0c 100644 --- a/source/my_device.cc +++ b/source/my_device.cc @@ -9,16 +9,17 @@ namespace Devices { vector vec_parted = Utils::split(response, '\n'); map_str_str dict_parted; string key = ""; + string value = ""; if (vec_parted.size()>1) { vec_parted.erase(vec_parted.begin()); } for (const string& str_parted : vec_parted) { key = str_parted.substr(0, str_parted.find(" ")); if (str_parted.find(" ") != string::npos) { - dict_parted[key] = str_parted.substr(str_parted.find(" ") + 1, str_parted.length()); - } - else { - dict_parted[key] = ""; + value = str_parted.substr(str_parted.find(" ") + 1, str_parted.length()); + if (value.length()>0) { + dict_parted[key] = value; + } } } diff --git a/source/my_type.h b/source/my_type.h index 45c7148..cbf21fa 100644 --- a/source/my_type.h +++ b/source/my_type.h @@ -29,6 +29,22 @@ struct Mount { std::string dump; std::string pass; }; +struct partition_cmd { + string device; + string cmd; +}; +struct struct_quotas { + string device; + string cmd; + string type_quotas; + string name; +}; +struct status_quotas { + bool user; + bool group; + bool project; + bool status; +}; typedef struct users_grups USER_GRUPS; typedef map map_str_str; typedef map * map_s_s_ptr; diff --git a/source/save.cc b/source/save.cc index 584e7ea..7134507 100644 --- a/source/save.cc +++ b/source/save.cc @@ -152,4 +152,48 @@ void Save::save_all(string sections, string str_flag_save) { } } } +void Save::save_all_1(string sections, string str_flag_save) { + string key = ""; + string value = ""; + string cmd_all = "ubconfig --target " + str_flag_save + " set " + sections; + size_t len_start_cmd_all = cmd_all.length(); + string str_error = ""; + this->flag_no_save = true; + string cmd = ""; + string cmd_remove = ""; + for (const auto &iter: (*map_gui)) { + value = iter.second; + key = iter.first; + if (this->check_save(str_flag_save, key)) { + if (value.length() != 0) { + cmd_all += " " + key + "=\"" + value + "\""; + } + else if (value.length() == 0) { + cmd = "ubconfig --target " + str_flag_save + " remove " + sections + " " + key; + } + else { + cmd = ""; + } + if (cmd.length() != 0) { + process.call(cmd, ""); + this->flag_no_save = false; + str_error = process.get_cmd_error(); + if (str_error.length() != 0) { + this->vec_errors.push_back(str_error); + str_error = ""; + } + } + } + + } + if (len_start_cmd_all != cmd_all.length()) { + process.call(cmd, ""); + this->flag_no_save = false; + str_error = process.get_cmd_error(); + if (str_error.length() != 0) { + this->vec_errors.push_back(str_error); + str_error = ""; + } + } +} } diff --git a/source/save.h b/source/save.h index 5449b69..b5ed023 100644 --- a/source/save.h +++ b/source/save.h @@ -6,27 +6,28 @@ namespace Lib_save { class Save { -private: - std::map *map_global; - std::map *map_local; - std::map *map_gui; - vector vec_errors; - vector* vec_param_names; - My_Process::My_Process_system process = My_Process::My_Process_system(); - bool flag_no_save; -public: - void set_data_global(std::map &map_global); - void set_data_local(std::map &map_local); - void set_data_gui(std::map &map_gui); - bool check_save(string flag_save, string key_name); - bool get_state_save(); - int get_count_error(); - string get_cmd_error(); - void save_all(string sections, string str_flag_save); - void set_count_error(int count_error); - void set_vec_params(vector& vec_param_names); - void save(string sections, string str_flag_save) ; - vector get_error(); + private: + std::map *map_global; + std::map *map_local; + std::map *map_gui; + vector vec_errors; + vector* vec_param_names; + My_Process::My_Process_system process = My_Process::My_Process_system(); + bool flag_no_save; + public: + void set_data_global(std::map &map_global); + void set_data_local(std::map &map_local); + void set_data_gui(std::map &map_gui); + bool check_save(string flag_save, string key_name); + bool get_state_save(); + int get_count_error(); + string get_cmd_error(); + void save_all(string sections, string str_flag_save); + void save_all_1(string sections, string str_flag_save); + void set_count_error(int count_error); + void set_vec_params(vector& vec_param_names); + void save(string sections, string str_flag_save) ; + vector get_error(); }; } #endif \ No newline at end of file diff --git a/source/system_cmd_quotas.cc b/source/system_cmd_quotas.cc new file mode 100644 index 0000000..1b2ad1e --- /dev/null +++ b/source/system_cmd_quotas.cc @@ -0,0 +1,159 @@ +#include "system_cmd_quotas.h" + +namespace Quotas_sys { +Quotas_sys::Quotas_sys() { + map_hw_or_sw["ext2"] = "hw"; + map_hw_or_sw["ext3"] = "hw"; + map_hw_or_sw["nfs"] = "sw"; + map_hw_or_sw["NFS"] = "sw"; +} +void Quotas_sys::format_cmd_quotas_ubconfig(struct struct_quotas& _struct_quota) { + string key = "DISK_QUOTA["; + key += ":" + _struct_quota.device + "]"; + string value = _struct_quota.name + ":" + _struct_quota.cmd; + (*map_gui_cfg)[key] = value; +} + +void Quotas_sys::format_cmd_quotas_system(struct struct_quotas& _struct_quota) { + string key = "DISK_QUOTA["; + key += ":" + _struct_quota.device + "]"; + string value = _struct_quota.name + ":" + _struct_quota.cmd; + (*map_gui_cfg)[key] = value; +} + +void Quotas_sys::off_quota_ubconfig(Gtk::ComboBoxText* combo_box, string quota_type) { + string partition = combo_box->get_active_text(); + string key = "DISK_QUOTA[" + quota_type + ":" + partition + "]"; + string value = "disable"; + (*map_gui_cfg)[key] = value; +} + +void Quotas_sys::set_map_gui(map_str_str &map_gui) { + map_gui_cfg = &map_gui; +} + +bool Quotas_sys::check_on_quotas_system(string cmd) { + string response = obj_process_call.call_all_sections(cmd); + if (response.length() > 0) { + return true; + } + else { + return false; + } +} + +struct status_quotas Quotas_sys::check_on_quotas_system_2_hw(string params) { + string cmd = "quotaon -ugPvp " + params; + string response = obj_process_call.call_all_sections(cmd); + struct status_quotas status; + if (response.length() > 0 && response.find("Cannot find mountpoint for device ") == string::npos) { + status.status = true; + vector vec_str = Utils::split(response, '\n'); + string array_str[3] = {"group", "user", "project"}; + for (int index = 0; index < 3; index++) { + string u_g_p = array_str[index]; + for (const string& vec_u_g_p : vec_str) { + if (vec_u_g_p.find(u_g_p) != string::npos && vec_u_g_p.find("accounting") != string::npos ) { + if (index == 0) { + status.group = true; + } + else if (index == 1) { + status.user = true; + } + else if (index == 2) { + status.project = true; + } + } + else if (vec_u_g_p.find(u_g_p) != string::npos && vec_u_g_p.find("enforced") != string::npos){ + if (index == 0) { + status.group = false; + } + else if (index == 1) { + status.user = false; + } + else if (index == 2) { + status.project = false; + } + } + } + } + } + else { + status.group = false; + status.user = false; + status.project = false; + status.status = false; + } + return status; + +} +bool Quotas_sys::on_quota_hw(string partition, string cmd_hw, string cmd_sw) { + if (map_hw_or_sw.find(partition) != map_hw_or_sw.end()) { + if (map_hw_or_sw[partition] == "hw") { + obj_process_system.call(cmd_hw, ""); + obj_process_system.call("ubconfig set config SERVICESSTART+=,quotaon.service", ""); + return true; + } + else if (map_hw_or_sw[partition] == "sw") { + obj_process_system.call(cmd_sw, ""); + obj_process_system.call("ubconfig set config SERVICESSTART+=,quotaon.service", ""); + return true; + } + else{ + return false; + } + } + + return false; +} +bool Quotas_sys::on_quota_sw(string partition, int mode) { + if (map_hw_or_sw.find(partition) != map_hw_or_sw.end()) { + string cmd = ""; + if (mode == 0) { + cmd += "mount -vo remount,usrquota " + partition; + cmd += "quotacheck -ucm " + partition; + cmd += "quotaon -uv " + partition; + } + else if (mode == 1) { + cmd += "mount -vo remount,grpquota " + partition; + cmd += "quotacheck -gcm " + partition; + cmd += "quotaon -gv " + partition; + } + else if (mode == 2) { + cmd += "quotaon -ugPv " + partition; + } + else if (mode == 3) { + cmd += "quotaon -augPv"; + } + else { + return false; + } + cmd += "ubconfig set config SERVICESSTART+=,quotaon.service"; + obj_process_system.call(cmd, ""); + return true; + } + return false; + +} + +void Quotas_sys::off_quota_system(Gtk::ComboBoxText* combo_box, string quota_type) { + string partition = combo_box->get_active_text(); + string cmd = ""; + if (map_hw_or_sw.find(partition) != map_hw_or_sw.end()) { + if (map_hw_or_sw[partition] == "hw") { + cmd = "tune2fs -Q ^" + quota_type + " " + partition; + } + else if (map_hw_or_sw[partition] == "sw") { + cmd = "quotaoff -u " + quota_type.substr(0,1) + " " + partition; + + } + else { + // TODO: + // Убрать после тестирования + throw "Опа цэ!"; + } + obj_process_system.call(cmd, ""); + } + +} +} \ No newline at end of file diff --git a/source/system_cmd_quotas.h b/source/system_cmd_quotas.h new file mode 100644 index 0000000..71d8f08 --- /dev/null +++ b/source/system_cmd_quotas.h @@ -0,0 +1,29 @@ +#ifndef SYSTEM_CMD_QUOTAS +#define SYSTEM_CMD_QUOTAS +#include "project_lib.h" +#include "my_type.h" +#include "my_process.h" +#include "util.h" + +namespace Quotas_sys { +class Quotas_sys { + public: + map_str_str map_hw_or_sw; + + map_str_str* map_gui_cfg; + My_Process::My_Process_system obj_process_system = My_Process::My_Process_system(); + My_Process::My_Process_call obj_process_call = My_Process::My_Process_call(); + public: + Quotas_sys(); + void set_map_gui(map_str_str &map_gui); + void format_cmd_quotas_ubconfig(struct struct_quotas& _struct_quota); + void format_cmd_quotas_system(struct struct_quotas& _struct_quota); + void off_quota_ubconfig(Gtk::ComboBoxText* combo_box, string quota_type); + void off_quota_system(Gtk::ComboBoxText* combo_box, string quota_type); + bool check_on_quotas_system(string cmd); + struct status_quotas check_on_quotas_system_2_hw(string params); + bool on_quota_hw(string partition, string cmd_hw, string cmd_sw); + bool on_quota_sw(string partition, int mode); +}; +} +#endif \ No newline at end of file diff --git a/source/ubl-settings-quotas.cc b/source/ubl-settings-quotas.cc index aa38d13..da8eb3a 100755 --- a/source/ubl-settings-quotas.cc +++ b/source/ubl-settings-quotas.cc @@ -36,11 +36,26 @@ void MainWindow::settings() { this->filling_device_combo_box_template(generalDeviceCombo, map_device); this->filling_device_combo_box_template(groupsDeviceCombo, map_device); this->filling_device_combo_box_template(usersDeviceCombo, map_device); + this->filling_device_combo_box_template(quotegroupDeviceCombo, map_device); this->entry_combo_box_temp(generalDeviceCombo,lblFstypeGeneralSettings); this->entry_combo_box_temp(groupsDeviceCombo, lblFstypeGroups); this->entry_combo_box_temp(usersDeviceCombo, lblFstypeUsers); + this->entry_combo_box_temp(quotegroupDeviceCombo, lblEditWndFsys); this->init_tree_view(); this->init_spin_all(); + check_limit(quotegroupSizeSoftLimitCheck + ,quotegroupSizeSoftLimitSpin + ,quotegroupSizeSoftLimitCombo); + check_limit(quotegroupSizeHardLimitCheck + ,quotegroupSizeHardLimitSpin + ,quotegroupSizeHardLimitCombo); + check_limit(quotegroupFilesSoftLimitCheck + ,quotegroupFilesSoftLimitSpin + ,quotegroupFilesSoftLimitlabel); + check_limit(quotegroupFilesHardLimitCheck + ,quotegroupFilesHardLimitSpin + ,quotegroupFilesHarLimitLabel); + obj_quotas_sys.set_map_gui(map_gui_cfg); if (geteuid() == 0) { this->load_system_cfg(); this->load_global_cfg(); @@ -443,10 +458,29 @@ void MainWindow::get_builder() { builder->get_widget("generalUsersFilesHoursSpin", generalUsersFilesHoursSpin); builder->get_widget("generalUsersSizeMinuteSpin", generalUsersSizeMinuteSpin); builder->get_widget("generalUsersFilesMinutesSpin", generalUsersFilesMinutesSpin); - + builder->get_widget("lblEditWndFsys", lblEditWndFsys); + builder->get_widget("quotegroupSizeSoftLimitCheck", quotegroupSizeSoftLimitCheck); + builder->get_widget("quotegroupSizeHardLimitCheck", quotegroupSizeHardLimitCheck); + builder->get_widget("quotegroupFilesSoftLimitCheck", quotegroupFilesSoftLimitCheck); + builder->get_widget("quotegroupFilesHardLimitCheck", quotegroupFilesHardLimitCheck); + builder->get_widget("quotegroupSizeSoftLimitSpin", quotegroupSizeSoftLimitSpin); + builder->get_widget("quotegroupSizeSoftLimitCombo", quotegroupSizeSoftLimitCombo); + builder->get_widget("quotegroupSizeHardLimitSpin", quotegroupSizeHardLimitSpin); + builder->get_widget("quotegroupSizeHardLimitCombo", quotegroupSizeHardLimitCombo); + builder->get_widget("quotegroupFilesSoftLimitSpin", quotegroupFilesSoftLimitSpin); + builder->get_widget("quotegroupFilesSoftLimitlabel", quotegroupFilesSoftLimitlabel); + builder->get_widget("quotegroupFilesHardLimitSpin", quotegroupFilesHardLimitSpin); + builder->get_widget("quotegroupSaveButton", quotegroupSaveButton); + builder->get_widget("quotegroupCancelButton", quotegroupCancelButton); + builder->get_widget("quotegroupDeviceCombo", quotegroupDeviceCombo); + builder->get_widget("btnDeleteUserQuota", btnDeleteUserQuota); + builder->get_widget("btnDeleteGroupQuota", btnDeleteGroupQuota); } void MainWindow::event() { + quotegroupSaveButton->signal_clicked().connect([&]() {}); + btnDeleteGroupQuota->signal_clicked().connect([&]() {obj_quotas_sys.off_quota_ubconfig(groupsDeviceCombo, "grpquota");}); + btnDeleteUserQuota->signal_clicked().connect([&]() {obj_quotas_sys.off_quota_ubconfig(usersDeviceCombo, "usrquota");}); btnLoadGlob->signal_activate().connect([&]() {this->load_global_cfg();}); btnLoadLocal->signal_activate().connect([&]() {this->load_system_cfg();}); btnSynopsis->signal_activate().connect([&]() {this->synopsis_show();}); @@ -461,12 +495,137 @@ void MainWindow::event() { generalDeviceCombo->signal_changed().connect([&]() {entry_combo_box_temp(generalDeviceCombo,lblFstypeGeneralSettings);}); groupsDeviceCombo->signal_changed().connect([&]() {entry_combo_box_temp(groupsDeviceCombo, lblFstypeGroups);}); usersDeviceCombo->signal_changed().connect([&]() {entry_combo_box_temp(usersDeviceCombo, lblFstypeUsers);}); + quotegroupDeviceCombo->signal_changed().connect([&]() {entry_combo_box_temp(quotegroupDeviceCombo, lblEditWndFsys);}); + quotegroupSizeSoftLimitCheck->signal_toggled().connect([&]() { + check_limit(quotegroupSizeSoftLimitCheck + ,quotegroupSizeSoftLimitSpin + ,quotegroupSizeSoftLimitCombo); + }); + quotegroupSizeHardLimitCheck->signal_toggled().connect([&]() { + check_limit(quotegroupSizeHardLimitCheck + ,quotegroupSizeHardLimitSpin + ,quotegroupSizeHardLimitCombo); + }); + quotegroupFilesSoftLimitCheck->signal_toggled().connect([&]() { + check_limit(quotegroupFilesSoftLimitCheck + ,quotegroupFilesSoftLimitSpin + ,quotegroupFilesSoftLimitlabel); + }); + quotegroupFilesHardLimitCheck->signal_toggled().connect([&]() { + check_limit(quotegroupFilesHardLimitCheck + ,quotegroupFilesHardLimitSpin + ,quotegroupFilesHarLimitLabel); + }); + quotegroupCancelButton->signal_clicked().connect([&]() {QuotasEditWindow->hide();}); + QuotasEditWindow->show(); +} + +string MainWindow::format_str_size(Gtk::SpinButton* spb, Gtk::ComboBoxText* combo_box) { + string value = ""; + int num = spb->get_value(); + int index = combo_box->get_active_row_number(); + value = to_string(num); + if (num == 0) { + return value; + } + if (index == 1) { + value += "M"; + } + else if (index == 2) { + value += "G"; + } + else if (index == 3) { + value += "T"; + } + return value; +} +void MainWindow::wrapper_settings_quotas_temp(string save_user_or_group) { + struct partition_cmd _struct_partition_cmd = this->wrapper_settings_quotas(); + string device = _struct_partition_cmd.device; + string cmd = _struct_partition_cmd.cmd; + string type_quotas = save_user_or_group; + string user = ""; + struct struct_quotas _struct_quota; + _struct_quota.device = device; + _struct_quota.cmd = cmd; + _struct_quota.type_quotas = type_quotas; + _struct_quota.name = user; + obj_quotas_sys.format_cmd_quotas_ubconfig(_struct_quota); + +} +void MainWindow::save_quotegroupSaveButton() { + if (sys_or_ubconfig == "ubconfig") { + if (save_user_or_group == "usrquota") { + this->wrapper_settings_quotas_temp(save_user_or_group); + } + else { + this->wrapper_settings_quotas_temp(save_user_or_group); + } + } + else { + if (save_user_or_group == "usrquota") { + + } + else { + + } + } +} + + + + + +struct partition_cmd MainWindow::wrapper_settings_quotas() { + string str_parted = quotegroupDeviceCombo->get_active_text(); + string value = ""; + if (quotegroupSizeSoftLimitCheck->get_active()) { + value = format_str_size(quotegroupSizeSoftLimitSpin, quotegroupSizeSoftLimitCombo); + value += ":"; + } + else { + value += "0:"; + } + if (quotegroupSizeHardLimitCheck->get_active()) { + value += format_str_size(quotegroupSizeHardLimitSpin, quotegroupSizeHardLimitCombo); + value += ":"; + } + else { + value += "0:"; + } + if (quotegroupFilesSoftLimitCheck->get_active()) { + value += to_string(quotegroupFilesSoftLimitSpin->get_value()); + value += ":"; + } + else { + value += "0:"; + } + if (quotegroupFilesHardLimitCheck->get_active()) { + value += to_string(quotegroupFilesHardLimitSpin->get_value()); + value += ":"; + } + else { + value += "0:"; + } + struct partition_cmd _struct_partition_cmd; + _struct_partition_cmd.device = str_parted; + _struct_partition_cmd.cmd = value; + return _struct_partition_cmd; } void MainWindow::groupsFilters_show() { FiltersWindow->show_all(); } +void MainWindow::check_limit(Gtk::CheckButton *check_button, Gtk::SpinButton *spin, Gtk::ComboBoxText *combo_box) { + spin->set_sensitive(check_button->get_active()); + combo_box->set_sensitive(check_button->get_active()); +} +void MainWindow::check_limit(Gtk::CheckButton *check_button, Gtk::SpinButton *spin, Gtk::Label *combo_box) { + spin->set_sensitive(check_button->get_active()); + combo_box->set_sensitive(check_button->get_active()); +} + void MainWindow::info_status_app(string stule) { Glib::RefPtr boxInfo = boxInfoError->get_style_context(); boxInfo->remove_class("boxInfoMessOK"); diff --git a/source/ubl-settings-quotas.h b/source/ubl-settings-quotas.h index 5f83161..978da6b 100644 --- a/source/ubl-settings-quotas.h +++ b/source/ubl-settings-quotas.h @@ -7,6 +7,7 @@ #include "my_process.h" #include "my_type.h" #include "my_device.h" +#include "system_cmd_quotas.h" extern int socket_ext_id_I; @@ -182,10 +183,29 @@ class MainWindow : public Gtk::ApplicationWindow { Gtk::SpinButton *generalUsersFilesHoursSpin; Gtk::SpinButton *generalUsersSizeMinuteSpin; Gtk::SpinButton *generalUsersFilesMinutesSpin; + Gtk::Label *lblEditWndFsys; + Gtk::CheckButton *quotegroupSizeSoftLimitCheck; + Gtk::CheckButton *quotegroupSizeHardLimitCheck; + Gtk::CheckButton *quotegroupFilesSoftLimitCheck; + Gtk::CheckButton *quotegroupFilesHardLimitCheck; + Gtk::SpinButton *quotegroupSizeSoftLimitSpin; + Gtk::SpinButton *quotegroupSizeHardLimitSpin; + Gtk::SpinButton *quotegroupFilesSoftLimitSpin; + Gtk::SpinButton *quotegroupFilesHardLimitSpin; + Gtk::Label *quotegroupFilesSoftLimitlabel; + Gtk::ComboBoxText *quotegroupSizeSoftLimitCombo; + Gtk::ComboBoxText *quotegroupSizeHardLimitCombo; + Gtk::Button *quotegroupCancelButton; + Gtk::Button *quotegroupSaveButton; + Gtk::ComboBoxText *quotegroupDeviceCombo; + Gtk::Button *btnDeleteUserQuota; + Gtk::Button *btnDeleteGroupQuota; + public: Lib_save::Save obj_save = Lib_save::Save(); Lib_Load::Load obj_load = Lib_Load::Load(); Devices::Parted obj_device = Devices::Parted(); + Quotas_sys::Quotas_sys obj_quotas_sys = Quotas_sys::Quotas_sys(); My_Process::My_Process_system obj_process_system = My_Process::My_Process_system(); My_Process::My_Process_call obj_process_call = My_Process::My_Process_call(); map_str_str map_gui_cfg; @@ -194,6 +214,9 @@ class MainWindow : public Gtk::ApplicationWindow { vector vec_param_names; map_str_str map_device; string str_cmd_error; + string save_user_or_group; + string sys_or_ubconfig; + string hw_or_sw = ""; public: MainWindow(BaseObjectType* obj, Glib::RefPtr const& builder); MainWindow(Glib::RefPtr const& builder); @@ -211,17 +234,27 @@ class MainWindow : public Gtk::ApplicationWindow { void init_tree_view(); void load_template(map_str_str* map_temp, string str_load); void info_warning_error(int mess); + void off_quota_system(Gtk::ComboBoxText* combo_box, string quota_type); void wrapper_save_system_cfg(); void wrapper_save_global_cfg(); + string format_str_size(Gtk::SpinButton* spb, Gtk::ComboBoxText* combo_box); void wrapper_save_all_cfg(); void init_dict(string flag_load); void set_data_cfg(); + void save_quotegroupSaveButton(); + void wrapper_settings_quotas_temp(string save_user_or_group); + void off_quota_ubconfig(Gtk::ComboBoxText* combo_box, string quota_type); void init_spin_all(); + void format_cmd_quotas_system(struct struct_quotas& _struct_quota); + void format_cmd_quotas_ubconfig(struct struct_quotas& _struct_quota); void load_global_cfg(); void load_system_cfg(); + struct partition_cmd wrapper_settings_quotas(); void filling_device_combo_box_template(Gtk::ComboBoxText *combo_box, map_str_str &map_device); bool save_template(string section, string flag_save); void view_add_columns(Gtk::TreeView &treeView); + void check_limit(Gtk::CheckButton *check_button, Gtk::SpinButton *spin, Gtk::ComboBoxText *combo_box); + void check_limit(Gtk::CheckButton *check_button, Gtk::SpinButton *spin, Gtk::Label *combo_box); }; diff --git a/ubl-settings-quotas.glade b/ubl-settings-quotas.glade index bcb7715..2e6b382 100644 --- a/ubl-settings-quotas.glade +++ b/ubl-settings-quotas.glade @@ -1807,6 +1807,24 @@ 4 + + + gtk-remove + True + True + True + 5 + 5 + 5 + 5 + True + + + False + True + 5 + +

False @@ -1926,6 +1944,24 @@ 4
+ + + gtk-remove + True + True + True + 5 + 5 + 5 + 5 + True + + + False + True + 5 + +
False @@ -2261,6 +2297,12 @@ True False + 5 + 5 + 5 + 5 + 6 + 6 Device: @@ -2270,10 +2312,15 @@
- + True False - DeviceStore + 6 + 5 + 5 + 5 + 6 + 6 True @@ -2286,6 +2333,12 @@ True False start + 6 + 5 + 5 + 5 + 6 + 6 File system: 0 @@ -2295,6 +2348,23 @@ 2 + + + True + False + 5 + 5 + 5 + 5 + 6 + 6 + + + False + True + 3 + +
False @@ -2306,6 +2376,12 @@ True False + 6 + 5 + 5 + 5 + 6 + 6 Disk quotas for this device: 0 @@ -2319,6 +2395,12 @@ True False + 6 + 5 + 5 + 5 + 6 + 6 Group quotas for this device: 0 @@ -2368,6 +2450,12 @@ True False + 5 + 5 + 5 + 5 + 6 + 6 Currently using: @@ -2380,6 +2468,12 @@ True False + 6 + 5 + 5 + 5 + 6 + 6 Soft limit 0 @@ -2448,6 +2542,12 @@ True False + 6 + 5 + 5 + 5 + 6 + 6 Hard limit 0 @@ -2521,6 +2621,12 @@ True False + 6 + 5 + 5 + 5 + 6 + 6 Size
@@ -2559,6 +2665,12 @@ True False + 5 + 5 + 6 + 5 + 6 + 6 Currently using: @@ -2571,6 +2683,12 @@ True False + 5 + 5 + 5 + 5 + 6 + 6 Soft limit 0 @@ -2634,6 +2752,12 @@ True False + 5 + 5 + 5 + 5 + 6 + 6 Hard limit 0 @@ -2701,6 +2825,12 @@ True False + 5 + 5 + 5 + 5 + 6 + 6 Files From 4b6dc818b18e63d5a903715e982b39a60e970e72 Mon Sep 17 00:00:00 2001 From: Igor Belitskiy Date: Fri, 14 Apr 2023 12:29:43 +0000 Subject: [PATCH 24/51] =?UTF-8?q?=D0=98=D1=81=D0=BF=D1=80=D0=B0=D0=B2?= =?UTF-8?q?=D0=B8=D0=BB=20=D1=87=D0=B0=D1=81=D1=82=D1=8C=20=D0=B7=D0=B0?= =?UTF-8?q?=D0=BC=D0=B5=D1=87=D0=B0=D0=BD=D0=B8=D0=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Makefile | 4 +- ....pkexec.ubl-settings-diskquota.exec.policy | 0 ...ublinux.ubl-settings-diskquota.checked.svg | 0 ... => com.ublinux.ubl-settings-diskquota.svg | 0 ...ublinux.ubl-settings-diskquota.warning.svg | 0 source/CMakeLists.txt | 12 +- source/main.cc | 4 +- source/my_plug.cc | 2 +- ...gs-quotas.cc => ubl-settings-diskquota.cc} | 22 +- ...ings-quotas.h => ubl-settings-diskquota.h} | 0 ...s-quotas.css => ubl-settings-diskquota.css | 0 ....desktop => ubl-settings-diskquota.desktop | 12 +- ubl-settings-diskquota.glade | 3527 +++++++++++++++++ ...tas.glade => ubl-settings-diskquota.glade~ | 4 +- ubl-settings-diskquota.pot | 656 +++ ...otas_ru.po => ubl-settings-diskquota_ru.po | 4 +- ubl-settings-quotas.pot | 656 --- 17 files changed, 4215 insertions(+), 688 deletions(-) rename com.ublinux.pkexec.ubl-settings-quotas.exec.policy => com.ublinux.pkexec.ubl-settings-diskquota.exec.policy (100%) rename com.ublinux.ubl-settings-quotas.checked.svg => com.ublinux.ubl-settings-diskquota.checked.svg (100%) rename com.ublinux.ubl-settings-quotas.svg => com.ublinux.ubl-settings-diskquota.svg (100%) rename com.ublinux.ubl-settings-quotas.warning.svg => com.ublinux.ubl-settings-diskquota.warning.svg (100%) rename source/{ubl-settings-quotas.cc => ubl-settings-diskquota.cc} (97%) rename source/{ubl-settings-quotas.h => ubl-settings-diskquota.h} (100%) rename ubl-settings-quotas.css => ubl-settings-diskquota.css (100%) rename ubl-settings-quotas.desktop => ubl-settings-diskquota.desktop (51%) create mode 100644 ubl-settings-diskquota.glade rename ubl-settings-quotas.glade => ubl-settings-diskquota.glade~ (100%) create mode 100644 ubl-settings-diskquota.pot rename ubl-settings-quotas_ru.po => ubl-settings-diskquota_ru.po (99%) delete mode 100644 ubl-settings-quotas.pot diff --git a/Makefile b/Makefile index ebf196f..abf1568 100644 --- a/Makefile +++ b/Makefile @@ -14,7 +14,7 @@ FILE_VERSION = VERSION.md DEPENDS = /bin/cmake PREFIX ?= /usr PKGNAME = $(MAKEFILE_DIR) -#PKGNAME = ubl-settings-datetime +#PKGNAME = ubl-settings-diskquota default_target: all @@ -24,7 +24,7 @@ all: init build init: @echo "Initialize ..."; \ - sed -r "s/(version_application = ).*/\1\"$$(grep 'VERSION' ${FILE_VERSION} | cut -d" " -f2)\";/" -i source/ubl-settings-datetime.cc; \ + sed -r "s/(version_application = ).*/\1\"$$(grep 'VERSION' ${FILE_VERSION} | cut -d" " -f2)\";/" -i source/ubl-settings-diskquota.cc; \ echo "-- Build path: ${CMAKE_BUILD_DIR}" depend: diff --git a/com.ublinux.pkexec.ubl-settings-quotas.exec.policy b/com.ublinux.pkexec.ubl-settings-diskquota.exec.policy similarity index 100% rename from com.ublinux.pkexec.ubl-settings-quotas.exec.policy rename to com.ublinux.pkexec.ubl-settings-diskquota.exec.policy diff --git a/com.ublinux.ubl-settings-quotas.checked.svg b/com.ublinux.ubl-settings-diskquota.checked.svg similarity index 100% rename from com.ublinux.ubl-settings-quotas.checked.svg rename to com.ublinux.ubl-settings-diskquota.checked.svg diff --git a/com.ublinux.ubl-settings-quotas.svg b/com.ublinux.ubl-settings-diskquota.svg similarity index 100% rename from com.ublinux.ubl-settings-quotas.svg rename to com.ublinux.ubl-settings-diskquota.svg diff --git a/com.ublinux.ubl-settings-quotas.warning.svg b/com.ublinux.ubl-settings-diskquota.warning.svg similarity index 100% rename from com.ublinux.ubl-settings-quotas.warning.svg rename to com.ublinux.ubl-settings-diskquota.warning.svg diff --git a/source/CMakeLists.txt b/source/CMakeLists.txt index 7c074b9..86480bb 100644 --- a/source/CMakeLists.txt +++ b/source/CMakeLists.txt @@ -1,5 +1,5 @@ cmake_minimum_required(VERSION 3.7) -project(ubl-settings-quotas) +project(ubl-settings-diskquota) find_package(PkgConfig REQUIRED) @@ -16,8 +16,8 @@ set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -pedantic -Wall -Wextra -Werror -Wmissin -fstack-clash-protection -fcf-protection -g") set(SOURCE_FILES - ubl-settings-quotas.h - ubl-settings-quotas.cc + ubl-settings-diskquota.h + ubl-settings-diskquota.cc system_cmd_quotas.cc system_cmd_quotas.h my_device.h @@ -42,6 +42,6 @@ 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 +add_executable(ubl-settings-diskquota ${SOURCE_FILES}) +target_link_libraries(ubl-settings-diskquota ${LIBRARIES} ${ICU_LIBRARIES}) +install(TARGETS ubl-settings-diskquota DESTINATION bin) \ No newline at end of file diff --git a/source/main.cc b/source/main.cc index 3426bf9..fc79f20 100644 --- a/source/main.cc +++ b/source/main.cc @@ -1,4 +1,4 @@ -#include "ubl-settings-quotas.h" +#include "ubl-settings-diskquota.h" #include "my_plug.h" void pars_flag(int index_start, int argc, char* argv[]); @@ -62,7 +62,7 @@ void pars_flag(int index_start, int argc, char* argv[]) { exit(1); } else if (str_argv == "--version" || str_argv == "-v"){ - string version = string(_("ubl-settings-quotas version: ")) + version_application + "\n"; + string version = string(_("ubl-settings-diskquota version: ")) + version_application + "\n"; cout << version.c_str(); exit(1); } diff --git a/source/my_plug.cc b/source/my_plug.cc index 966d79b..ba95ed8 100644 --- a/source/my_plug.cc +++ b/source/my_plug.cc @@ -2,7 +2,7 @@ #define MY_PLUG_H #include "my_plug.h" -#include "ubl-settings-quotas.h" +#include "ubl-settings-diskquota.h" CmdArgParser::CmdArgParser(const std::string& p_name, const std::string& p_description, const std::string& p_help) : Glib::OptionGroup{p_name, p_description, p_help} { diff --git a/source/ubl-settings-quotas.cc b/source/ubl-settings-diskquota.cc similarity index 97% rename from source/ubl-settings-quotas.cc rename to source/ubl-settings-diskquota.cc index da8eb3a..ec2b482 100755 --- a/source/ubl-settings-quotas.cc +++ b/source/ubl-settings-diskquota.cc @@ -1,13 +1,13 @@ -#include "ubl-settings-quotas.h" +#include "ubl-settings-diskquota.h" using namespace std; const string path_app = "/usr/bin/"; -const string path_glade = "/usr/share/ubl-settings-quotas/ui/ubl-settings-quotas.glade"; -const string app_name = "ubl-settings-quotas"; +const string path_glade = "/usr/share/ubl-settings-diskquota/ui/ubl-settings-diskquota.glade"; +const string app_name = "ubl-settings-diskquota"; const string path_locale = "/usr/share/locale/"; -const string path_css = "/usr/share/ubl-settings-quotas/css/ubl-settings-quotas.css"; -const string path_img_head_background = "/usr/share/ubl-settings-quotas/images/logo-background.png"; +const string path_css = "/usr/share/ubl-settings-diskquota/css/ubl-settings-diskquota.css"; +const string path_img_head_background = "/usr/share/ubl-settings-diskquota/images/logo-background.png"; int socket_ext_id_I = 0; int socket_trd_id_I = 0; @@ -65,7 +65,7 @@ void MainWindow::settings() { boxFuncs->set_sensitive(false); btnSave->set_sensitive(false); btnLoad->set_sensitive(false); - imgInfo->set_from_icon_name("com.ublinux.ubl-settings-quotas.warning", Gtk::ICON_SIZE_MENU); + imgInfo->set_from_icon_name("com.ublinux.ubl-settings-diskquota.warning", Gtk::ICON_SIZE_MENU); info_status_app("boxInfoMessError"); lblWarning->set_text(_("The program must be run as root")); } @@ -159,7 +159,7 @@ void MainWindow::lacalization() { generalTabLabel->set_text(_("General settings")); GroupsTabLabel->set_text(_("Groups")); headerAboutTopic->set_label(_(app_name.c_str())); - headerTopic->set_label(_("ubl-settings-quotas")); + headerTopic->set_label(_("ubl-settings-diskquota")); UsersTabLabel->set_text(_("Users")); generalDeviceLabel->set_text(_("Device:")); generalFileSystemLabel->set_text(_("File system:")); @@ -732,7 +732,7 @@ void MainWindow::load_template(map_str_str* map_temp, string str_load) { void MainWindow::info_warning_error(int mess) { if (obj_load.get_count_error() > 0 || obj_save.get_count_error() > 0) { info_status_app("boxInfoMessError"); - imgInfo->set_from_icon_name("com.ublinux.ubl-settings-quotas.warning", Gtk::ICON_SIZE_MENU); + imgInfo->set_from_icon_name("com.ublinux.ubl-settings-diskquota.warning", Gtk::ICON_SIZE_MENU); string mess_error = ""; if (mess == 0) { mess_error = string(_("Local configuration reading error")) + str_cmd_error; @@ -760,7 +760,7 @@ void MainWindow::info_warning_error(int mess) { } else { info_status_app("boxInfoMessOK"); - imgInfo->set_from_icon_name("com.ublinux.ubl-settings-quotas.checked", Gtk::ICON_SIZE_MENU); + imgInfo->set_from_icon_name("com.ublinux.ubl-settings-diskquota.checked", Gtk::ICON_SIZE_MENU); if (mess == 0) { lblWarning->set_text(_("Local configuration downloaded successfully")); } @@ -783,11 +783,11 @@ void MainWindow::info_warning_error(int mess) { } void help() { - string version = string(_("ubl-settings-quotas version: ")) + version_application + "\n"; + string version = string(_("ubl-settings-diskquota version: ")) + version_application + "\n"; cout << version.c_str(); string help; help = "GTK settings quotas. for UBLinux\n\n" - "Usage: ubl-settings-quotas [OPTIONS...]\n" + "Usage: ubl-settings-diskquota [OPTIONS...]\n" "Options:\n" " -h, --help Show this help\n" " -V, --version Show package version\n"; diff --git a/source/ubl-settings-quotas.h b/source/ubl-settings-diskquota.h similarity index 100% rename from source/ubl-settings-quotas.h rename to source/ubl-settings-diskquota.h diff --git a/ubl-settings-quotas.css b/ubl-settings-diskquota.css similarity index 100% rename from ubl-settings-quotas.css rename to ubl-settings-diskquota.css diff --git a/ubl-settings-quotas.desktop b/ubl-settings-diskquota.desktop similarity index 51% rename from ubl-settings-quotas.desktop rename to ubl-settings-diskquota.desktop index 61cc341..942002a 100644 --- a/ubl-settings-quotas.desktop +++ b/ubl-settings-diskquota.desktop @@ -1,14 +1,14 @@ [Desktop Entry] Encoding=UTF-8 -Name=ubl-settings-quotas +Name=ubl-settings-diskquota Name[ru]=Настройки квот -GenericName=ubl-settings-quotas +GenericName=ubl-settings-diskquota GenericName[ru]=Настройки квот -Comment=ubl-settings-quotas -Comment[ru]=Приложение для управления настройками квот +Comment=Disk quota management and configuration application +Comment[ru]=Приложение управление и настройка дисковых квот Type=Application -Exec=pkexec ubl-settings-quotas -Icon=com.ublinux.ubl-settings-quotas +Exec=pkexec ubl-settings-diskquota +Icon=com.ublinux.ubl-settings-diskquota Terminal=false X-XfcePluggable=true X-UBLPluggable=true diff --git a/ubl-settings-diskquota.glade b/ubl-settings-diskquota.glade new file mode 100644 index 0000000..5cb60aa --- /dev/null +++ b/ubl-settings-diskquota.glade @@ -0,0 +1,3527 @@ + + + + + + + + + + + + False + start + False + + + True + False + 5 + 5 + 5 + 5 + 5 + 5 + vertical + + + Name + True + True + False + start + 6 + True + + + False + True + 0 + + + + + Quotas + True + True + False + start + True + + + False + True + 1 + + + + + Size + True + True + False + start + True + + + False + True + 2 + + + + + Soft limit (size) + True + True + False + start + True + + + False + True + 3 + + + + + Hard limit (size) + True + True + False + start + True + + + False + True + 4 + + + + + Hard limit (size) delay + True + True + False + start + True + + + False + True + 5 + + + + + Hard limit (size) activation time + True + True + False + start + True + + + False + True + 6 + + + + + Files + True + True + False + start + True + + + False + True + 7 + + + + + Soft limit (files) + True + True + False + start + True + + + False + True + 8 + + + + + Hard limit (files) + True + True + False + start + True + + + False + True + 9 + + + + + Hard limit (files) delay + True + True + False + start + True + + + False + True + 10 + + + + + Hard limit (file) activation time + True + True + False + start + True + + + False + True + 11 + + + + + True + False + end + 5 + 5 + True + + + gtk-cancel + True + True + True + center + True + + + False + True + 0 + + + + + gtk-save + True + True + True + center + True + + + False + True + 1 + + + + + False + True + 12 + + + + + + + True + False + True + + + True + False + System quotas + + + + + + + + True + False + 32 + com.ublinux.ubl-settings-diskquota + 5 + + + + + + + + + + + + + Byte + + + Kb + + + Mb + + + Gb + + + Tb + + + + + False + False + True + center + com.ublinux.ubl-settings-diskquota + dialog + True + ubl-settings-diskquota + 1.0 + Copyright © 2022 - 2023, UBSoft LLC + Setting user quotas + https://ublinux.ru/ + Project Home Page + Это приложение распространяется без каких-либо гарантий. +Подробнее в <a href="https://www.gnu.org/licenses/old-licenses/gpl-2.0.html">GNU General Public License, версии 2 или позднее</a>. + UBGroup + UBGroup + com.ublinux.ubl-settings-diskquota + True + gpl-2-0 + + + True + False + vertical + 2 + + + False + end + + + False + False + 1 + + + + + + + True + False + True + + + True + False + 5 + 5 + 5 + 5 + 2 + System quotas + + + + + + + + + + True + False + + + 90 + True + False + 5 + 5 + 5 + 5 + 6 + 6 + 69 + com.ublinux.ubl-settings-diskquota + + + False + True + 0 + + + + + True + False + + + True + False + + + True + False + vertical + + + 255 + True + False + Configuration of disk quotas parameters for system groups and users + + + + + + + + True + True + 0 + + + + + False + True + 0 + + + + + True + True + 0 + + + + + True + True + 1 + + + + + 6 + 1 + 10 + + + 23 + 1 + 10 + + + 59 + 1 + 10 + + + 100 + 1 + 10 + + + 6 + 1 + 10 + + + 23 + 1 + 10 + + + 59 + 1 + 10 + + + 100 + 1 + 10 + + + 6 + 1 + 10 + + + 23 + 1 + 10 + + + 59 + 1 + 10 + + + 100 + 1 + 10 + + + 6 + 1 + 10 + + + 23 + 1 + 10 + + + 59 + 1 + 10 + + + 100 + 1 + 10 + + + + True + False + False + False + + + True + False + Help + + + + + + True + False + About + True + + + + + + True + False + + + True + False + Load from global configuration + True + + + + + + True + False + Load from local configuration + True + + + + + + True + False + + + True + False + Save to global and local configuration + True + + + + + + True + False + Save to global configuration + True + + + + + + True + False + Save to local configuration + True + + + + + + False + com.ublinux.ubl-settings-diskquota + + + True + False + vertical + + + True + False + vertical + + + True + False + + + True + False + 5 + 5 + 5 + 5 + 6 + 6 + 25 + 1 + + + False + True + 0 + + + + + True + False + start + 5 + 5 + 5 + 5 + 6 + 6 + + + + + + + True + True + 1 + + + + + False + True + 0 + + + + + True + False + vertical + + + 81 + True + False + + + True + False + start + + + -1 + + + + + False + True + 0 + + + + + False + True + 1 + + + + + True + False + 5 + 5 + 5 + 5 + True + True + vertical + + + True + True + + + True + False + vertical + + + True + False + 5 + 5 + 5 + 5 + + + 135 + True + False + 5 + 5 + Device: + 0 + + + False + True + 0 + + + + + True + False + + + True + True + 1 + + + + + 0 + True + False + 5 + 5 + File system: + 0 + + + False + True + 2 + + + + + True + False + 5 + 5 + 5 + 5 + 6 + 6 + + + False + True + 3 + + + + + False + True + 0 + + + + + True + False + 5 + 5 + 0.019999999552965164 + in + + + True + False + 5 + 5 + 12 + 5 + + + True + False + vertical + + + Enable + True + True + False + start + True + + + False + True + 0 + + + + + True + False + 20 + + + True + False + vertical + + + True + False + Excess size delay period + 0 + + + False + True + 0 + + + + + True + False + Excess files delay period + 0 + + + False + True + 1 + + + + + False + True + 0 + + + + + True + False + vertical + 5 + + + True + False + 5 + + + True + True + 0 + generalGroupsSizeWeeksSpin + + + False + True + 0 + + + + + True + False + weeks + + + False + True + 1 + + + + + False + True + 0 + + + + + True + False + 5 + + + True + True + 0 + generalGroupsFilesWeeksSpin + + + False + True + 0 + + + + + True + False + weeks + + + False + True + 1 + + + + + False + True + 1 + + + + + False + True + 1 + + + + + True + False + vertical + 5 + + + True + False + 5 + + + True + True + 0 + generalGroupsSizeDaysSpin + + + False + True + 0 + + + + + True + False + days + + + False + True + 1 + + + + + False + True + 0 + + + + + True + False + 5 + + + True + True + 0 + generalGroupsFilesDaysSpin + + + False + True + 0 + + + + + True + False + days + + + False + True + 1 + + + + + False + True + 1 + + + + + False + True + 2 + + + + + True + False + vertical + 5 + + + True + False + 5 + + + True + True + 0 + generalGroupsSizeHoursSpin + + + False + True + 0 + + + + + True + False + hours + + + False + True + 1 + + + + + False + True + 0 + + + + + True + False + 5 + + + True + True + 0 + generalGroupsFilesHoursSpin + + + False + True + 0 + + + + + True + False + hours + + + False + True + 1 + + + + + False + True + 1 + + + + + False + True + 3 + + + + + True + False + vertical + 5 + + + True + False + 5 + + + True + True + 0 + generalGroupsSizeMinutesSpin + + + False + True + 0 + + + + + True + False + minutes + + + False + True + 1 + + + + + False + True + 0 + + + + + True + False + 5 + + + True + True + 0 + generalGroupsFilesMinutesSpin + + + False + True + 0 + + + + + True + False + minutes + + + False + True + 1 + + + + + False + True + 1 + + + + + False + True + 4 + + + + + False + True + 1 + + + + + + + + + True + False + Quotas for groups + 0 + + + + + False + True + 1 + + + + + True + False + 5 + 5 + 5 + 0.019999999552965164 + in + + + True + False + 5 + 5 + 12 + 5 + + + True + False + vertical + + + Enable + True + True + False + start + True + + + False + True + 0 + + + + + True + False + 20 + + + True + False + vertical + + + True + False + Excess size delay period + 0 + + + False + True + 0 + + + + + True + False + Excess files delay period + 0 + + + False + True + 1 + + + + + False + True + 0 + + + + + True + False + vertical + 5 + + + True + False + 5 + + + True + True + 0 + generalUsersSizeWeeksSpin + + + False + True + 0 + + + + + True + False + weeks + + + False + True + 1 + + + + + False + True + 0 + + + + + True + False + 5 + + + True + True + 0 + generalUsersFilesWeeksSpin + + + False + True + 0 + + + + + True + False + weeks + + + False + True + 1 + + + + + False + True + 1 + + + + + False + True + 1 + + + + + True + False + vertical + 5 + + + True + False + 5 + + + True + True + 0 + generalUsersSizeDaysSpin + + + False + True + 0 + + + + + True + False + days + + + False + True + 1 + + + + + False + True + 0 + + + + + True + False + 5 + + + True + True + 0 + generalUsersFilesDaysSpin + + + False + True + 0 + + + + + True + False + days + + + False + True + 1 + + + + + False + True + 1 + + + + + False + True + 2 + + + + + True + False + vertical + 5 + + + True + False + 5 + + + True + True + 0 + generalUsersSizeHoursSpin + + + False + True + 0 + + + + + True + False + hours + + + False + True + 1 + + + + + False + True + 0 + + + + + True + False + 5 + + + True + True + 0 + generalUsersFilesHourSpin + + + False + True + 0 + + + + + True + False + hours + + + False + True + 1 + + + + + False + True + 1 + + + + + False + True + 3 + + + + + True + False + vertical + 5 + + + True + False + 5 + + + True + True + 0 + generalUsersSizeMinutesSpin + + + False + True + 0 + + + + + True + False + minutes + + + False + True + 1 + + + + + False + True + 0 + + + + + True + False + 5 + + + True + True + 0 + generalUsersFilesMinuteSpin + + + False + True + 0 + + + + + True + False + minutes + + + False + True + 1 + + + + + False + True + 1 + + + + + False + True + 4 + + + + + False + True + 1 + + + + + + + + + True + False + Quotas for users + 0 + + + + + False + True + 2 + + + + + + + True + False + General settings + + + False + + + + + True + False + vertical + + + True + False + 5 + 5 + 5 + 5 + + + True + False + Device: + + + False + True + 0 + + + + + True + False + + + True + True + 1 + + + + + True + False + 5 + 5 + File system: + + + False + True + 2 + + + + + True + False + 5 + 5 + 5 + 5 + 6 + 6 + + + False + True + 3 + + + + + Filters + True + True + True + + + False + True + end + 4 + + + + + gtk-remove + True + True + True + 5 + 5 + 5 + 5 + True + + + False + True + 5 + + + + + False + True + 0 + + + + + True + True + liststore1 + + + + + + False + True + 1 + + + + + 1 + + + + + True + False + Groups + + + 1 + False + + + + + True + False + vertical + + + True + False + 5 + 5 + 5 + 5 + + + True + False + Device: + + + False + True + 0 + + + + + True + False + + + True + True + 1 + + + + + True + False + 5 + 5 + File system: + + + False + True + 2 + + + + + True + False + 5 + 5 + 5 + 5 + 6 + 6 + + + False + True + 3 + + + + + Filters + True + True + True + + + False + True + end + 4 + + + + + gtk-remove + True + True + True + 5 + 5 + 5 + 5 + True + + + False + True + 5 + + + + + False + True + 0 + + + + + True + True + liststore1 + + + + + + False + True + 1 + + + + + 2 + + + + + True + False + Users + + + 2 + False + + + + + True + True + 0 + + + + + False + True + 2 + + + + + True + True + 0 + + + + + + + True + False + True + + + True + False + 5 + 5 + 5 + 5 + 2 + UBConfig - Quotas + + + + + + + + True + False + 5 + 5 + 5 + 5 + 6 + 6 + 32 + com.ublinux.ubl-settings-diskquota + + + + + True + False + + + True + True + False + True + menuLoad + + + True + False + + + True + False + Load + + + False + True + 0 + + + + + True + False + pan-down-symbolic + + + False + True + 1 + + + + + + + False + True + 0 + + + + + + 2 + + + + + True + False + + + True + True + False + True + menuSave + + + True + False + + + True + False + Save + + + False + True + 0 + + + + + True + False + pan-down-symbolic + + + False + True + 1 + + + + + + + False + True + 0 + + + + + True + True + True + False + True + True + menuAbout + none + + + True + False + open-menu-symbolic + + + + + False + True + 1 + + + + + + end + 3 + + + + + + + + + + + + + vertical + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 1000000 + 1 + 10 + + + 1000000 + 1 + 10 + + + 1024 + 1 + 10 + + + 1024 + 1 + 10 + + + False + start + False + + + True + False + 5 + 5 + 5 + 5 + vertical + + + True + False + vertical + 5 + + + True + False + 5 + + + True + False + 5 + 5 + 5 + 5 + 6 + 6 + Device: + + + False + True + 0 + + + + + True + False + 6 + 5 + 5 + 5 + 6 + 6 + + + True + True + 1 + + + + + True + False + start + 6 + 5 + 5 + 5 + 6 + 6 + File system: + 0 + + + False + True + 2 + + + + + True + False + 5 + 5 + 5 + 5 + 6 + 6 + + + False + True + 3 + + + + + False + True + 0 + + + + + True + False + 6 + 5 + 5 + 5 + 6 + 6 + Disk quotas for this device: + 0 + + + False + True + 1 + + + + + True + False + 6 + 5 + 5 + 5 + 6 + 6 + Group quotas for this device: + 0 + + + False + True + 2 + + + + + False + True + 0 + + + + + True + False + True + + + True + False + 5 + 5 + 5 + 5 + 5 + 0.019999999552965164 + in + + + True + False + 5 + 5 + 12 + 5 + + + True + False + vertical + + + True + False + 5 + 5 + 5 + 5 + 6 + 6 + Currently using: + + + False + True + 0 + + + + + True + False + 6 + 5 + 5 + 5 + 6 + 6 + Soft limit + 0 + + + False + True + 1 + + + + + True + False + 5 + + + True + True + False + right + True + + + False + True + 0 + + + + + True + True + quotegroupSizeSoftLimitAdjustment + + + True + True + 1 + + + + + True + False + + Kb + Mb + Gb + Tb + + + + False + True + 2 + + + + + True + True + 2 + + + + + True + False + 6 + 5 + 5 + 5 + 6 + 6 + Hard limit + 0 + + + False + True + 3 + + + + + True + False + False + 5 + + + True + True + False + right + True + + + False + True + 0 + + + + + True + True + quotegroupSizeHardLimitAdjustment + + + True + True + 1 + + + + + True + False + + Kb + Mb + Gb + Tb + + + + False + True + 2 + + + + + True + True + 4 + + + + + + + + + True + False + 6 + 5 + 5 + 5 + 6 + 6 + Size + + + + + True + True + 0 + + + + + True + False + 5 + 5 + 5 + 5 + 5 + 0.019999999552965164 + in + + + True + False + 5 + 5 + 12 + 5 + + + True + False + vertical + + + True + False + 5 + 5 + 6 + 5 + 6 + 6 + Currently using: + + + False + True + 0 + + + + + True + False + 5 + 5 + 5 + 5 + 6 + 6 + Soft limit + 0 + + + False + True + 1 + + + + + True + False + 5 + + + True + True + False + right + True + + + False + True + 0 + + + + + True + True + quotegroupFilesSoftLimitAdjustment + + + True + True + 1 + + + + + True + False + files + + + False + True + 2 + + + + + True + True + 2 + + + + + True + False + 5 + 5 + 5 + 5 + 6 + 6 + Hard limit + 0 + + + False + True + 3 + + + + + True + False + 5 + + + True + True + False + right + True + + + False + True + 0 + + + + + True + True + quotegroupFilesHardLimitAdjustment + + + True + True + 1 + + + + + True + False + files + + + False + True + 2 + + + + + True + True + 4 + + + + + + + + + True + False + 5 + 5 + 5 + 5 + 6 + 6 + Files + + + + + True + True + 1 + + + + + False + True + 1 + + + + + True + False + 5 + vertical + True + + + True + False + end + 5 + True + + + gtk-cancel + True + True + True + True + + + False + True + 0 + + + + + gtk-save + True + True + True + True + + + False + True + 1 + + + + + False + True + 0 + + + + + False + True + 2 + + + + + + + True + False + + + True + False + UBConfig - Quotas + + + + + True + False + 32 + com.ublinux.ubl-settings-diskquota + 5 + + + + + + + 1000000 + 1 + 10 + + + 1000000 + 1 + 10 + + + 1024 + 1 + 10 + + + 1024 + 1 + 10 + + + False + start + False + + + True + False + 5 + 5 + 5 + 5 + 5 + 5 + vertical + + + True + False + vertical + 5 + + + True + False + 5 + + + True + False + Device: + + + False + True + 0 + + + + + True + False + DeviceStore + + + True + True + 1 + + + + + True + False + start + File system: + 0 + + + False + True + 2 + + + + + False + True + 0 + + + + + True + False + Disk quotas for this device: + 0 + + + False + True + 1 + + + + + True + False + User quotas for this device: + 0 + + + False + True + 2 + + + + + False + True + 0 + + + + + True + False + True + + + True + False + 5 + 5 + 5 + 5 + 5 + 0.019999999552965164 + in + + + True + False + 5 + 5 + 12 + 5 + + + True + False + vertical + + + True + False + Currently using: + + + False + True + 0 + + + + + True + False + Soft limit + 0 + + + False + True + 1 + + + + + True + False + 5 + + + True + True + False + right + True + + + False + True + 0 + + + + + True + True + quoteuserSizeSoftLimitAdjustment + + + True + True + 1 + + + + + True + False + + Kb + Mb + Gb + Tb + + + + False + True + 2 + + + + + True + True + 2 + + + + + True + False + Hard limit + 0 + + + False + True + 3 + + + + + True + False + False + 5 + + + True + True + False + right + True + + + False + True + 0 + + + + + True + True + quoteuserSizeHardLimitAdjustment + + + True + True + 1 + + + + + True + False + + Kb + Mb + Gb + Tb + + + + False + True + 2 + + + + + True + True + 4 + + + + + + + + + True + False + Size + + + + + True + True + 0 + + + + + True + False + 5 + 5 + 5 + 5 + 5 + 0.019999999552965164 + in + + + True + False + 5 + 5 + 12 + 5 + + + True + False + vertical + + + True + False + Currently using: + + + False + True + 0 + + + + + True + False + Soft limit + 0 + + + False + True + 1 + + + + + True + False + 5 + + + True + True + False + right + True + + + False + True + 0 + + + + + True + True + quoteuserFilesSoftLimitAdjustment + + + True + True + 1 + + + + + True + False + files + + + False + True + 2 + + + + + True + True + 2 + + + + + True + False + Hard limit + 0 + + + False + True + 3 + + + + + True + False + 5 + + + True + True + False + right + True + + + False + True + 0 + + + + + True + True + quoteuserFilesHardLimitAdjustment + + + True + True + 1 + + + + + True + False + files + + + False + True + 2 + + + + + True + True + 4 + + + + + + + + + True + False + Files + + + + + True + True + 1 + + + + + False + True + 1 + + + + + True + False + 5 + vertical + True + + + True + False + end + 5 + True + + + gtk-cancel + True + True + True + 5 + 5 + True + + + False + True + 0 + + + + + gtk-save + True + True + True + 5 + 5 + True + + + False + True + 1 + + + + + False + True + 0 + + + + + False + True + 2 + + + + + + + True + False + + + True + False + UBConfig - Quotas + + + + + + + + True + False + 32 + com.ublinux.ubl-settings-diskquota + 5 + + + + + + diff --git a/ubl-settings-quotas.glade b/ubl-settings-diskquota.glade~ similarity index 100% rename from ubl-settings-quotas.glade rename to ubl-settings-diskquota.glade~ index 2e6b382..a908617 100644 --- a/ubl-settings-quotas.glade +++ b/ubl-settings-diskquota.glade~ @@ -1808,7 +1808,7 @@ - + gtk-remove True True @@ -1945,7 +1945,7 @@ - + gtk-remove True True diff --git a/ubl-settings-diskquota.pot b/ubl-settings-diskquota.pot new file mode 100644 index 0000000..667fa56 --- /dev/null +++ b/ubl-settings-diskquota.pot @@ -0,0 +1,656 @@ +# Language translations for ubl-settings-diskquota package. +# Copyright (C) 2022, UBTech LLC +# This file is distributed under the same license as the ubl-settings-diskquota package. +# UBLinux Team , 2022 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2023-04-10 16:09+0000\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: source/ubl-settings-diskquota.cc:224 source/ubl-settings-diskquota.cc:154 +#: source/ubl-settings-diskquota.cc:144 +msgid "About" +msgstr "" + +#: source/ubl-settings-diskquota.cc:183 source/ubl-settings-diskquota.cc:113 +#: source/ubl-settings-diskquota.cc:103 source/ubl-settings-diskquota.cc:124 +#: source/ubl-settings-diskquota.cc:121 source/ubl-settings-diskquota.cc:118 +msgid "Configuration of disk quotas parameters for system groups and users" +msgstr "" + +#: source/ubl-settings-diskquota.cc:138 source/ubl-settings-diskquota.cc:68 +#: source/ubl-settings-diskquota.cc:60 source/ubl-settings-diskquota.cc:81 +#: source/ubl-settings-diskquota.cc:78 source/ubl-settings-diskquota.cc:75 +#: source/ubl-settings-diskquota.cc:74 +msgid "Copyright © UBSoft LLC, 2022 - " +msgstr "" + +#: source/ubl-settings-diskquota.cc:201 source/ubl-settings-diskquota.cc:206 +#: source/ubl-settings-diskquota.cc:211 source/ubl-settings-diskquota.cc:131 +#: source/ubl-settings-diskquota.cc:136 source/ubl-settings-diskquota.cc:141 +#: source/ubl-settings-diskquota.cc:121 source/ubl-settings-diskquota.cc:126 +#: source/ubl-settings-diskquota.cc:142 source/ubl-settings-diskquota.cc:147 +#: source/ubl-settings-diskquota.cc:152 source/ubl-settings-diskquota.cc:139 +#: source/ubl-settings-diskquota.cc:144 source/ubl-settings-diskquota.cc:149 +msgid "Currently using:" +msgstr "" + +#: source/ubl-settings-diskquota.cc:216 source/ubl-settings-diskquota.cc:146 +#: source/ubl-settings-diskquota.cc:136 source/ubl-settings-diskquota.cc:157 +#: source/ubl-settings-diskquota.cc:154 +msgid "Currently using: " +msgstr "" + +#: source/ubl-settings-diskquota.cc:62 source/ubl-settings-diskquota.cc:83 +#: source/ubl-settings-diskquota.cc:80 source/ubl-settings-diskquota.cc:77 +#: source/ubl-settings-diskquota.cc:76 +msgid "Date and Time" +msgstr "" + +#: source/ubl-settings-diskquota.cc:246 source/ubl-settings-diskquota.cc:381 +msgid "" +"Deferring\n" +"a hard\n" +"limit\n" +"(files)" +msgstr "" + +#: source/ubl-settings-diskquota.cc:239 source/ubl-settings-diskquota.cc:374 +msgid "" +"Deferring\n" +"a hard\n" +"limit\n" +"(size)" +msgstr "" + +#: source/ubl-settings-diskquota.cc:194 +msgid "Deferring a hard limit (files)" +msgstr "" + +#: source/ubl-settings-diskquota.cc:189 +msgid "Deferring a hard limit (size)" +msgstr "" + +#: source/ubl-settings-diskquota.cc:149 source/ubl-settings-diskquota.cc:181 +#: source/ubl-settings-diskquota.cc:182 source/ubl-settings-diskquota.cc:196 +#: source/ubl-settings-diskquota.cc:208 source/ubl-settings-diskquota.cc:79 +#: source/ubl-settings-diskquota.cc:111 source/ubl-settings-diskquota.cc:112 +#: source/ubl-settings-diskquota.cc:126 source/ubl-settings-diskquota.cc:138 +#: source/ubl-settings-diskquota.cc:69 source/ubl-settings-diskquota.cc:101 +#: source/ubl-settings-diskquota.cc:102 source/ubl-settings-diskquota.cc:116 +#: source/ubl-settings-diskquota.cc:128 source/ubl-settings-diskquota.cc:90 +#: source/ubl-settings-diskquota.cc:122 source/ubl-settings-diskquota.cc:123 +#: source/ubl-settings-diskquota.cc:137 source/ubl-settings-diskquota.cc:87 +#: source/ubl-settings-diskquota.cc:119 source/ubl-settings-diskquota.cc:120 +#: source/ubl-settings-diskquota.cc:134 source/ubl-settings-diskquota.cc:146 +#: source/ubl-settings-diskquota.cc:84 source/ubl-settings-diskquota.cc:117 +#: source/ubl-settings-diskquota.cc:83 +msgid "Device:" +msgstr "" + +#: source/ubl-settings-diskquota.cc:197 source/ubl-settings-diskquota.cc:207 +#: source/ubl-settings-diskquota.cc:127 source/ubl-settings-diskquota.cc:137 +#: source/ubl-settings-diskquota.cc:117 source/ubl-settings-diskquota.cc:138 +#: source/ubl-settings-diskquota.cc:148 source/ubl-settings-diskquota.cc:135 +#: source/ubl-settings-diskquota.cc:145 +msgid "Disk quotas for this device:" +msgstr "" + +#: source/ubl-settings-diskquota.cc:152 source/ubl-settings-diskquota.cc:153 +#: source/ubl-settings-diskquota.cc:82 source/ubl-settings-diskquota.cc:83 +#: source/ubl-settings-diskquota.cc:72 source/ubl-settings-diskquota.cc:73 +#: source/ubl-settings-diskquota.cc:93 source/ubl-settings-diskquota.cc:94 +#: source/ubl-settings-diskquota.cc:90 source/ubl-settings-diskquota.cc:91 +#: source/ubl-settings-diskquota.cc:87 source/ubl-settings-diskquota.cc:88 +#: source/ubl-settings-diskquota.cc:86 +msgid "Enable" +msgstr "" + +#: source/ubl-settings-diskquota.cc:597 source/ubl-settings-diskquota.cc:510 +#: source/ubl-settings-diskquota.cc:444 +msgid "Error saved local and global configuration" +msgstr "" + +#: source/ubl-settings-diskquota.cc:156 source/ubl-settings-diskquota.cc:158 +#: source/ubl-settings-diskquota.cc:86 source/ubl-settings-diskquota.cc:88 +#: source/ubl-settings-diskquota.cc:76 source/ubl-settings-diskquota.cc:78 +#: source/ubl-settings-diskquota.cc:97 source/ubl-settings-diskquota.cc:99 +#: source/ubl-settings-diskquota.cc:94 source/ubl-settings-diskquota.cc:96 +#: source/ubl-settings-diskquota.cc:91 source/ubl-settings-diskquota.cc:93 +#: source/ubl-settings-diskquota.cc:90 source/ubl-settings-diskquota.cc:92 +msgid "Excess files delay period" +msgstr "" + +#: source/ubl-settings-diskquota.cc:155 source/ubl-settings-diskquota.cc:157 +#: source/ubl-settings-diskquota.cc:85 source/ubl-settings-diskquota.cc:87 +#: source/ubl-settings-diskquota.cc:75 source/ubl-settings-diskquota.cc:77 +#: source/ubl-settings-diskquota.cc:96 source/ubl-settings-diskquota.cc:98 +#: source/ubl-settings-diskquota.cc:93 source/ubl-settings-diskquota.cc:95 +#: source/ubl-settings-diskquota.cc:90 source/ubl-settings-diskquota.cc:92 +#: source/ubl-settings-diskquota.cc:89 source/ubl-settings-diskquota.cc:91 +msgid "Excess size delay period" +msgstr "" + +#: source/ubl-settings-diskquota.cc:150 source/ubl-settings-diskquota.cc:175 +#: source/ubl-settings-diskquota.cc:176 source/ubl-settings-diskquota.cc:214 +#: source/ubl-settings-diskquota.cc:221 source/ubl-settings-diskquota.cc:80 +#: source/ubl-settings-diskquota.cc:105 source/ubl-settings-diskquota.cc:106 +#: source/ubl-settings-diskquota.cc:144 source/ubl-settings-diskquota.cc:151 +#: source/ubl-settings-diskquota.cc:70 source/ubl-settings-diskquota.cc:95 +#: source/ubl-settings-diskquota.cc:96 source/ubl-settings-diskquota.cc:134 +#: source/ubl-settings-diskquota.cc:141 source/ubl-settings-diskquota.cc:91 +#: source/ubl-settings-diskquota.cc:116 source/ubl-settings-diskquota.cc:117 +#: source/ubl-settings-diskquota.cc:155 source/ubl-settings-diskquota.cc:162 +#: source/ubl-settings-diskquota.cc:88 source/ubl-settings-diskquota.cc:113 +#: source/ubl-settings-diskquota.cc:114 source/ubl-settings-diskquota.cc:152 +#: source/ubl-settings-diskquota.cc:85 source/ubl-settings-diskquota.cc:110 +#: source/ubl-settings-diskquota.cc:111 source/ubl-settings-diskquota.cc:84 +msgid "File system:" +msgstr "" + +#: source/ubl-settings-diskquota.cc:191 source/ubl-settings-diskquota.cc:200 +#: source/ubl-settings-diskquota.cc:215 source/ubl-settings-diskquota.cc:243 +#: source/ubl-settings-diskquota.cc:121 source/ubl-settings-diskquota.cc:130 +#: source/ubl-settings-diskquota.cc:145 source/ubl-settings-diskquota.cc:378 +#: source/ubl-settings-diskquota.cc:111 source/ubl-settings-diskquota.cc:120 +#: source/ubl-settings-diskquota.cc:135 source/ubl-settings-diskquota.cc:321 +#: source/ubl-settings-diskquota.cc:132 source/ubl-settings-diskquota.cc:141 +#: source/ubl-settings-diskquota.cc:156 source/ubl-settings-diskquota.cc:325 +#: source/ubl-settings-diskquota.cc:129 source/ubl-settings-diskquota.cc:138 +#: source/ubl-settings-diskquota.cc:153 source/ubl-settings-diskquota.cc:317 +#: source/ubl-settings-diskquota.cc:264 source/ubl-settings-diskquota.cc:126 +msgid "Files" +msgstr "" + +#: source/ubl-settings-diskquota.cc:177 source/ubl-settings-diskquota.cc:178 +#: source/ubl-settings-diskquota.cc:107 source/ubl-settings-diskquota.cc:108 +#: source/ubl-settings-diskquota.cc:97 source/ubl-settings-diskquota.cc:98 +#: source/ubl-settings-diskquota.cc:118 source/ubl-settings-diskquota.cc:119 +#: source/ubl-settings-diskquota.cc:115 source/ubl-settings-diskquota.cc:116 +#: source/ubl-settings-diskquota.cc:112 source/ubl-settings-diskquota.cc:113 +msgid "Filters" +msgstr "" + +msgid "" +"GTK settings quotas. for UBLinux\n" +"\n" +"Usage: ubl-settings-diskquota [OPTIONS...]\n" +"Options:\n" +" -h, --help\t Show this help\n" +" -V, --version\t Show package version\n" +msgstr "" + +#: source/ubl-settings-diskquota.cc:144 source/ubl-settings-diskquota.cc:74 +#: source/ubl-settings-diskquota.cc:66 source/ubl-settings-diskquota.cc:87 +#: source/ubl-settings-diskquota.cc:84 source/ubl-settings-diskquota.cc:81 +#: source/ubl-settings-diskquota.cc:80 +msgid "General settings" +msgstr "" + +#: source/ubl-settings-diskquota.cc:611 source/ubl-settings-diskquota.cc:524 +#: source/ubl-settings-diskquota.cc:458 +msgid "Global configuration downloaded successfully" +msgstr "" + +#: source/ubl-settings-diskquota.cc:585 source/ubl-settings-diskquota.cc:498 +#: source/ubl-settings-diskquota.cc:432 +msgid "Global configuration read error" +msgstr "" + +#: source/ubl-settings-diskquota.cc:617 source/ubl-settings-diskquota.cc:530 +#: source/ubl-settings-diskquota.cc:464 +msgid "Global configuration successfully written" +msgstr "" + +#: source/ubl-settings-diskquota.cc:593 source/ubl-settings-diskquota.cc:506 +#: source/ubl-settings-diskquota.cc:440 +msgid "Global configuration write error" +msgstr "" + +#: source/ubl-settings-diskquota.cc:198 source/ubl-settings-diskquota.cc:128 +#: source/ubl-settings-diskquota.cc:118 source/ubl-settings-diskquota.cc:139 +#: source/ubl-settings-diskquota.cc:136 +msgid "Group quotas for this device:" +msgstr "" + +#: source/ubl-settings-diskquota.cc:145 source/ubl-settings-diskquota.cc:75 +#: source/ubl-settings-diskquota.cc:67 source/ubl-settings-diskquota.cc:88 +#: source/ubl-settings-diskquota.cc:85 source/ubl-settings-diskquota.cc:82 +#: source/ubl-settings-diskquota.cc:81 +msgid "Groups" +msgstr "" + +#: source/ubl-settings-diskquota.cc:203 source/ubl-settings-diskquota.cc:204 +#: source/ubl-settings-diskquota.cc:213 source/ubl-settings-diskquota.cc:218 +#: source/ubl-settings-diskquota.cc:133 source/ubl-settings-diskquota.cc:134 +#: source/ubl-settings-diskquota.cc:143 source/ubl-settings-diskquota.cc:148 +#: source/ubl-settings-diskquota.cc:123 source/ubl-settings-diskquota.cc:124 +#: source/ubl-settings-diskquota.cc:138 source/ubl-settings-diskquota.cc:144 +#: source/ubl-settings-diskquota.cc:145 source/ubl-settings-diskquota.cc:154 +#: source/ubl-settings-diskquota.cc:159 source/ubl-settings-diskquota.cc:141 +#: source/ubl-settings-diskquota.cc:142 source/ubl-settings-diskquota.cc:151 +#: source/ubl-settings-diskquota.cc:156 +msgid "Hard limit" +msgstr "" + +#: source/ubl-settings-diskquota.cc:320 source/ubl-settings-diskquota.cc:324 +#: source/ubl-settings-diskquota.cc:316 source/ubl-settings-diskquota.cc:263 +msgid "" +"Hard limit\n" +"(Size) activation\n" +"time" +msgstr "" + +#: source/ubl-settings-diskquota.cc:323 source/ubl-settings-diskquota.cc:327 +#: source/ubl-settings-diskquota.cc:319 source/ubl-settings-diskquota.cc:266 +msgid "" +"Hard limit\n" +"(files)" +msgstr "" + +#: source/ubl-settings-diskquota.cc:325 source/ubl-settings-diskquota.cc:329 +#: source/ubl-settings-diskquota.cc:321 source/ubl-settings-diskquota.cc:268 +msgid "" +"Hard limit\n" +"(files) activation\n" +"time" +msgstr "" + +#: source/ubl-settings-diskquota.cc:324 source/ubl-settings-diskquota.cc:328 +#: source/ubl-settings-diskquota.cc:320 source/ubl-settings-diskquota.cc:267 +msgid "" +"Hard limit\n" +"(files) delay" +msgstr "" + +#: source/ubl-settings-diskquota.cc:318 source/ubl-settings-diskquota.cc:322 +#: source/ubl-settings-diskquota.cc:314 source/ubl-settings-diskquota.cc:261 +msgid "" +"Hard limit\n" +"(size)" +msgstr "" + +#: source/ubl-settings-diskquota.cc:319 source/ubl-settings-diskquota.cc:323 +#: source/ubl-settings-diskquota.cc:315 source/ubl-settings-diskquota.cc:262 +msgid "" +"Hard limit\n" +"(size) delay" +msgstr "" + +#: source/ubl-settings-diskquota.cc:247 source/ubl-settings-diskquota.cc:382 +msgid "" +"Hard limit\n" +"activation\n" +"time (files)" +msgstr "" + +#: source/ubl-settings-diskquota.cc:240 source/ubl-settings-diskquota.cc:375 +msgid "" +"Hard limit\n" +"activation\n" +"time (size)" +msgstr "" + +#: source/ubl-settings-diskquota.cc:195 source/ubl-settings-diskquota.cc:125 +#: source/ubl-settings-diskquota.cc:115 source/ubl-settings-diskquota.cc:136 +#: source/ubl-settings-diskquota.cc:133 source/ubl-settings-diskquota.cc:130 +msgid "Hard limit (file) activation time" +msgstr "" + +#: source/ubl-settings-diskquota.cc:123 source/ubl-settings-diskquota.cc:113 +#: source/ubl-settings-diskquota.cc:134 source/ubl-settings-diskquota.cc:131 +#: source/ubl-settings-diskquota.cc:128 +msgid "Hard limit (files)" +msgstr "" + +#: source/ubl-settings-diskquota.cc:124 source/ubl-settings-diskquota.cc:114 +#: source/ubl-settings-diskquota.cc:135 source/ubl-settings-diskquota.cc:132 +#: source/ubl-settings-diskquota.cc:129 +msgid "Hard limit (files) delay" +msgstr "" + +#: source/ubl-settings-diskquota.cc:188 source/ubl-settings-diskquota.cc:118 +#: source/ubl-settings-diskquota.cc:108 source/ubl-settings-diskquota.cc:129 +#: source/ubl-settings-diskquota.cc:126 source/ubl-settings-diskquota.cc:123 +msgid "Hard limit (size)" +msgstr "" + +#: source/ubl-settings-diskquota.cc:120 source/ubl-settings-diskquota.cc:110 +#: source/ubl-settings-diskquota.cc:131 source/ubl-settings-diskquota.cc:128 +#: source/ubl-settings-diskquota.cc:125 +msgid "Hard limit (size) activation time" +msgstr "" + +#: source/ubl-settings-diskquota.cc:119 source/ubl-settings-diskquota.cc:109 +#: source/ubl-settings-diskquota.cc:130 source/ubl-settings-diskquota.cc:127 +#: source/ubl-settings-diskquota.cc:124 +msgid "Hard limit (size) delay" +msgstr "" + +#: source/ubl-settings-diskquota.cc:190 +msgid "Hard limit activation time (size)" +msgstr "" + +#: source/ubl-settings-diskquota.cc:225 source/ubl-settings-diskquota.cc:155 +#: source/ubl-settings-diskquota.cc:145 +msgid "Help" +msgstr "" + +#: source/ubl-settings-diskquota.cc:179 source/ubl-settings-diskquota.cc:109 +#: source/ubl-settings-diskquota.cc:99 source/ubl-settings-diskquota.cc:120 +#: source/ubl-settings-diskquota.cc:117 source/ubl-settings-diskquota.cc:114 +msgid "Load" +msgstr "" + +#: source/ubl-settings-diskquota.cc:222 source/ubl-settings-diskquota.cc:152 +#: source/ubl-settings-diskquota.cc:142 +msgid "Load from global configuration" +msgstr "" + +#: source/ubl-settings-diskquota.cc:223 source/ubl-settings-diskquota.cc:153 +#: source/ubl-settings-diskquota.cc:143 +msgid "Load from local configuration" +msgstr "" + +#: source/ubl-settings-diskquota.cc:608 source/ubl-settings-diskquota.cc:521 +#: source/ubl-settings-diskquota.cc:455 +msgid "Local configuration downloaded successfully" +msgstr "" + +#: source/ubl-settings-diskquota.cc:581 source/ubl-settings-diskquota.cc:494 +#: source/ubl-settings-diskquota.cc:428 +msgid "Local configuration reading error" +msgstr "" + +#: source/ubl-settings-diskquota.cc:614 source/ubl-settings-diskquota.cc:527 +#: source/ubl-settings-diskquota.cc:461 +msgid "Local configuration successfully written" +msgstr "" + +#: source/ubl-settings-diskquota.cc:589 source/ubl-settings-diskquota.cc:502 +#: source/ubl-settings-diskquota.cc:436 +msgid "Local configuration write error" +msgstr "" + +#: source/ubl-settings-diskquota.cc:184 source/ubl-settings-diskquota.cc:234 +#: source/ubl-settings-diskquota.cc:114 source/ubl-settings-diskquota.cc:369 +#: source/ubl-settings-diskquota.cc:104 source/ubl-settings-diskquota.cc:314 +#: source/ubl-settings-diskquota.cc:125 source/ubl-settings-diskquota.cc:318 +#: source/ubl-settings-diskquota.cc:122 source/ubl-settings-diskquota.cc:310 +#: source/ubl-settings-diskquota.cc:119 +msgid "Name" +msgstr "" + +#: source/ubl-settings-diskquota.cc:623 source/ubl-settings-diskquota.cc:536 +#: source/ubl-settings-diskquota.cc:470 +msgid "Nothing to save!" +msgstr "" + +#: source/ubl-settings-diskquota.cc:143 source/ubl-settings-diskquota.cc:73 +#: source/ubl-settings-diskquota.cc:65 source/ubl-settings-diskquota.cc:86 +#: source/ubl-settings-diskquota.cc:83 source/ubl-settings-diskquota.cc:80 +#: source/ubl-settings-diskquota.cc:79 +msgid "Project Home Page" +msgstr "" + +#: source/ubl-settings-diskquota.cc:185 source/ubl-settings-diskquota.cc:235 +#: source/ubl-settings-diskquota.cc:115 source/ubl-settings-diskquota.cc:370 +#: source/ubl-settings-diskquota.cc:105 source/ubl-settings-diskquota.cc:315 +#: source/ubl-settings-diskquota.cc:126 source/ubl-settings-diskquota.cc:319 +#: source/ubl-settings-diskquota.cc:123 source/ubl-settings-diskquota.cc:311 +#: source/ubl-settings-diskquota.cc:258 source/ubl-settings-diskquota.cc:120 +msgid "Quotas" +msgstr "" + +#: source/ubl-settings-diskquota.cc:151 source/ubl-settings-diskquota.cc:81 +#: source/ubl-settings-diskquota.cc:71 +msgid "Quotas for groups" +msgstr "" + +#: source/ubl-settings-diskquota.cc:154 source/ubl-settings-diskquota.cc:84 +#: source/ubl-settings-diskquota.cc:74 +msgid "Quotas for users" +msgstr "" + +#: source/ubl-settings-diskquota.cc:180 source/ubl-settings-diskquota.cc:110 +#: source/ubl-settings-diskquota.cc:100 source/ubl-settings-diskquota.cc:121 +#: source/ubl-settings-diskquota.cc:118 source/ubl-settings-diskquota.cc:115 +msgid "Save" +msgstr "" + +#: source/ubl-settings-diskquota.cc:226 source/ubl-settings-diskquota.cc:156 +#: source/ubl-settings-diskquota.cc:146 +msgid "Save to global and local configuration" +msgstr "" + +#: source/ubl-settings-diskquota.cc:227 source/ubl-settings-diskquota.cc:157 +#: source/ubl-settings-diskquota.cc:147 +msgid "Save to global configuration" +msgstr "" + +#: source/ubl-settings-diskquota.cc:228 source/ubl-settings-diskquota.cc:158 +#: source/ubl-settings-diskquota.cc:148 +msgid "Save to local configuration" +msgstr "" + +#: source/ubl-settings-diskquota.cc:140 source/ubl-settings-diskquota.cc:70 +msgid "Setting user quotas" +msgstr "" + +#: source/ubl-settings-diskquota.cc:245 source/ubl-settings-diskquota.cc:380 +msgid "" +"Severe\n" +"limitation\n" +"(files)" +msgstr "" + +#: source/ubl-settings-diskquota.cc:238 source/ubl-settings-diskquota.cc:373 +msgid "" +"Severe\n" +"limitation\n" +"(size)" +msgstr "" + +#: source/ubl-settings-diskquota.cc:193 +msgid "Severe limitation (files)" +msgstr "" + +#: source/ubl-settings-diskquota.cc:186 source/ubl-settings-diskquota.cc:199 +#: source/ubl-settings-diskquota.cc:210 source/ubl-settings-diskquota.cc:236 +#: source/ubl-settings-diskquota.cc:116 source/ubl-settings-diskquota.cc:129 +#: source/ubl-settings-diskquota.cc:140 source/ubl-settings-diskquota.cc:371 +#: source/ubl-settings-diskquota.cc:106 source/ubl-settings-diskquota.cc:119 +#: source/ubl-settings-diskquota.cc:130 source/ubl-settings-diskquota.cc:316 +#: source/ubl-settings-diskquota.cc:127 source/ubl-settings-diskquota.cc:151 +#: source/ubl-settings-diskquota.cc:320 source/ubl-settings-diskquota.cc:124 +#: source/ubl-settings-diskquota.cc:137 source/ubl-settings-diskquota.cc:148 +#: source/ubl-settings-diskquota.cc:312 source/ubl-settings-diskquota.cc:259 +#: source/ubl-settings-diskquota.cc:121 +msgid "Size" +msgstr "" + +#: source/ubl-settings-diskquota.cc:244 source/ubl-settings-diskquota.cc:379 +msgid "" +"Soft\n" +"Restriction\n" +"(files)" +msgstr "" + +#: source/ubl-settings-diskquota.cc:192 +msgid "Soft Restriction (files)" +msgstr "" + +#: source/ubl-settings-diskquota.cc:202 source/ubl-settings-diskquota.cc:205 +#: source/ubl-settings-diskquota.cc:212 source/ubl-settings-diskquota.cc:217 +#: source/ubl-settings-diskquota.cc:132 source/ubl-settings-diskquota.cc:135 +#: source/ubl-settings-diskquota.cc:142 source/ubl-settings-diskquota.cc:147 +#: source/ubl-settings-diskquota.cc:122 source/ubl-settings-diskquota.cc:125 +#: source/ubl-settings-diskquota.cc:137 source/ubl-settings-diskquota.cc:143 +#: source/ubl-settings-diskquota.cc:146 source/ubl-settings-diskquota.cc:153 +#: source/ubl-settings-diskquota.cc:158 source/ubl-settings-diskquota.cc:140 +#: source/ubl-settings-diskquota.cc:150 source/ubl-settings-diskquota.cc:155 +msgid "Soft limit" +msgstr "" + +#: source/ubl-settings-diskquota.cc:322 source/ubl-settings-diskquota.cc:326 +#: source/ubl-settings-diskquota.cc:318 source/ubl-settings-diskquota.cc:265 +msgid "" +"Soft limit\n" +"(files)" +msgstr "" + +#: source/ubl-settings-diskquota.cc:237 source/ubl-settings-diskquota.cc:372 +#: source/ubl-settings-diskquota.cc:317 source/ubl-settings-diskquota.cc:321 +#: source/ubl-settings-diskquota.cc:313 source/ubl-settings-diskquota.cc:260 +msgid "" +"Soft limit\n" +"(size)" +msgstr "" + +#: source/ubl-settings-diskquota.cc:122 source/ubl-settings-diskquota.cc:112 +#: source/ubl-settings-diskquota.cc:133 source/ubl-settings-diskquota.cc:130 +#: source/ubl-settings-diskquota.cc:127 +msgid "Soft limit (files)" +msgstr "" + +#: source/ubl-settings-diskquota.cc:187 source/ubl-settings-diskquota.cc:117 +#: source/ubl-settings-diskquota.cc:107 source/ubl-settings-diskquota.cc:128 +#: source/ubl-settings-diskquota.cc:125 source/ubl-settings-diskquota.cc:122 +msgid "Soft limit (size)" +msgstr "" + +#: source/ubl-settings-diskquota.cc:620 source/ubl-settings-diskquota.cc:533 +#: source/ubl-settings-diskquota.cc:467 +msgid "Successfully saved local and global configuration" +msgstr "" + +#: source/ubl-settings-diskquota.cc:59 source/ubl-settings-diskquota.cc:55 +#: source/ubl-settings-diskquota.cc:47 source/ubl-settings-diskquota.cc:68 +#: source/ubl-settings-diskquota.cc:70 source/ubl-settings-diskquota.cc:67 +#: source/ubl-settings-diskquota.cc:66 +msgid "The program must be run as root" +msgstr "" + +#: source/ubl-settings-diskquota.cc:209 source/ubl-settings-diskquota.cc:139 +#: source/ubl-settings-diskquota.cc:129 source/ubl-settings-diskquota.cc:150 +#: source/ubl-settings-diskquota.cc:147 +msgid "User quotas for this device: " +msgstr "" + +#: source/ubl-settings-diskquota.cc:148 source/ubl-settings-diskquota.cc:78 +#: source/ubl-settings-diskquota.cc:68 source/ubl-settings-diskquota.cc:89 +#: source/ubl-settings-diskquota.cc:86 source/ubl-settings-diskquota.cc:83 +#: source/ubl-settings-diskquota.cc:82 +msgid "Users" +msgstr "" + +#: source/ubl-settings-diskquota.cc:163 source/ubl-settings-diskquota.cc:164 +#: source/ubl-settings-diskquota.cc:165 source/ubl-settings-diskquota.cc:166 +#: source/ubl-settings-diskquota.cc:93 source/ubl-settings-diskquota.cc:94 +#: source/ubl-settings-diskquota.cc:95 source/ubl-settings-diskquota.cc:96 +#: source/ubl-settings-diskquota.cc:83 source/ubl-settings-diskquota.cc:84 +#: source/ubl-settings-diskquota.cc:85 source/ubl-settings-diskquota.cc:86 +#: source/ubl-settings-diskquota.cc:104 source/ubl-settings-diskquota.cc:105 +#: source/ubl-settings-diskquota.cc:106 source/ubl-settings-diskquota.cc:107 +#: source/ubl-settings-diskquota.cc:101 source/ubl-settings-diskquota.cc:102 +#: source/ubl-settings-diskquota.cc:103 source/ubl-settings-diskquota.cc:98 +#: source/ubl-settings-diskquota.cc:99 source/ubl-settings-diskquota.cc:100 +#: source/ubl-settings-diskquota.cc:97 +msgid "days" +msgstr "" + +#: source/ubl-settings-diskquota.cc:219 source/ubl-settings-diskquota.cc:220 +#: source/ubl-settings-diskquota.cc:149 source/ubl-settings-diskquota.cc:150 +#: source/ubl-settings-diskquota.cc:139 source/ubl-settings-diskquota.cc:140 +#: source/ubl-settings-diskquota.cc:160 source/ubl-settings-diskquota.cc:161 +#: source/ubl-settings-diskquota.cc:157 source/ubl-settings-diskquota.cc:158 +msgid "files" +msgstr "" + +#: source/ubl-settings-diskquota.cc:167 source/ubl-settings-diskquota.cc:168 +#: source/ubl-settings-diskquota.cc:169 source/ubl-settings-diskquota.cc:170 +#: source/ubl-settings-diskquota.cc:97 source/ubl-settings-diskquota.cc:98 +#: source/ubl-settings-diskquota.cc:99 source/ubl-settings-diskquota.cc:100 +#: source/ubl-settings-diskquota.cc:87 source/ubl-settings-diskquota.cc:88 +#: source/ubl-settings-diskquota.cc:89 source/ubl-settings-diskquota.cc:90 +#: source/ubl-settings-diskquota.cc:108 source/ubl-settings-diskquota.cc:109 +#: source/ubl-settings-diskquota.cc:110 source/ubl-settings-diskquota.cc:111 +#: source/ubl-settings-diskquota.cc:105 source/ubl-settings-diskquota.cc:106 +#: source/ubl-settings-diskquota.cc:107 source/ubl-settings-diskquota.cc:102 +#: source/ubl-settings-diskquota.cc:103 source/ubl-settings-diskquota.cc:104 +#: source/ubl-settings-diskquota.cc:101 +msgid "hours" +msgstr "" + +#: source/ubl-settings-diskquota.cc:141 source/ubl-settings-diskquota.cc:71 +#: source/ubl-settings-diskquota.cc:63 source/ubl-settings-diskquota.cc:84 +#: source/ubl-settings-diskquota.cc:81 source/ubl-settings-diskquota.cc:78 +#: source/ubl-settings-diskquota.cc:77 +msgid "https://wiki.ublinux.com" +msgstr "" + +#: source/ubl-settings-diskquota.cc:548 source/ubl-settings-diskquota.cc:461 +msgid "" +"https://wiki.ublinux.com/ru/Программное_обеспечение/Программы_и_утилиты/Все/" +msgstr "" + +#: source/ubl-settings-diskquota.cc:171 source/ubl-settings-diskquota.cc:172 +#: source/ubl-settings-diskquota.cc:173 source/ubl-settings-diskquota.cc:174 +#: source/ubl-settings-diskquota.cc:101 source/ubl-settings-diskquota.cc:102 +#: source/ubl-settings-diskquota.cc:103 source/ubl-settings-diskquota.cc:104 +#: source/ubl-settings-diskquota.cc:91 source/ubl-settings-diskquota.cc:92 +#: source/ubl-settings-diskquota.cc:93 source/ubl-settings-diskquota.cc:94 +#: source/ubl-settings-diskquota.cc:112 source/ubl-settings-diskquota.cc:113 +#: source/ubl-settings-diskquota.cc:114 source/ubl-settings-diskquota.cc:115 +#: source/ubl-settings-diskquota.cc:109 source/ubl-settings-diskquota.cc:110 +#: source/ubl-settings-diskquota.cc:111 source/ubl-settings-diskquota.cc:106 +#: source/ubl-settings-diskquota.cc:107 source/ubl-settings-diskquota.cc:108 +#: source/ubl-settings-diskquota.cc:105 +msgid "minutes" +msgstr "" + +#: source/ubl-settings-diskquota.cc:257 +msgid "name" +msgstr "" + +#: source/ubl-settings-diskquota.cc:92 source/ubl-settings-diskquota.cc:89 +#: source/ubl-settings-diskquota.cc:86 source/ubl-settings-diskquota.cc:85 +msgid "quotas for groups" +msgstr "" + +#: source/ubl-settings-diskquota.cc:95 source/ubl-settings-diskquota.cc:92 +#: source/ubl-settings-diskquota.cc:89 source/ubl-settings-diskquota.cc:88 +msgid "quotas for users" +msgstr "" + +#: source/ubl-settings-diskquota.cc:629 source/ubl-settings-diskquota.cc:542 +#: source/ubl-settings-diskquota.cc:476 source/ubl-settings-diskquota.cc:350 +#: source/ubl-settings-diskquota.cc:371 source/ubl-settings-diskquota.cc:318 +#: source/ubl-settings-diskquota.cc:267 source/ubl-settings-diskquota.cc:213 +msgid "ubl-settings-diskquota version: " +msgstr "" + +#: source/ubl-settings-diskquota.cc:159 source/ubl-settings-diskquota.cc:160 +#: source/ubl-settings-diskquota.cc:161 source/ubl-settings-diskquota.cc:162 +#: source/ubl-settings-diskquota.cc:89 source/ubl-settings-diskquota.cc:90 +#: source/ubl-settings-diskquota.cc:91 source/ubl-settings-diskquota.cc:92 +#: source/ubl-settings-diskquota.cc:79 source/ubl-settings-diskquota.cc:80 +#: source/ubl-settings-diskquota.cc:81 source/ubl-settings-diskquota.cc:82 +#: source/ubl-settings-diskquota.cc:100 source/ubl-settings-diskquota.cc:101 +#: source/ubl-settings-diskquota.cc:102 source/ubl-settings-diskquota.cc:103 +#: source/ubl-settings-diskquota.cc:97 source/ubl-settings-diskquota.cc:98 +#: source/ubl-settings-diskquota.cc:99 source/ubl-settings-diskquota.cc:94 +#: source/ubl-settings-diskquota.cc:95 source/ubl-settings-diskquota.cc:96 +#: source/ubl-settings-diskquota.cc:93 +msgid "weeks" +msgstr "" diff --git a/ubl-settings-quotas_ru.po b/ubl-settings-diskquota_ru.po similarity index 99% rename from ubl-settings-quotas_ru.po rename to ubl-settings-diskquota_ru.po index 0d2240c..1a12057 100644 --- a/ubl-settings-quotas_ru.po +++ b/ubl-settings-diskquota_ru.po @@ -1,6 +1,6 @@ -# Russian translations for ublexec package. +# Russian translations for ubl-settings-diskquota package. # Copyright (C) 2022, UBTech LLC -# This file is distributed under the same license as the ublexec package. +# This file is distributed under the same license as the ubl-settings-diskquota package. # UBLinux Team , 2022 # #, fuzzy diff --git a/ubl-settings-quotas.pot b/ubl-settings-quotas.pot deleted file mode 100644 index d0cf1c0..0000000 --- a/ubl-settings-quotas.pot +++ /dev/null @@ -1,656 +0,0 @@ -# SOME DESCRIPTIVE TITLE. -# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER -# This file is distributed under the same license as the PACKAGE package. -# FIRST AUTHOR , YEAR. -# -#, fuzzy -msgid "" -msgstr "" -"Project-Id-Version: PACKAGE VERSION\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-04-10 16:09+0000\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: FULL NAME \n" -"Language-Team: LANGUAGE \n" -"Language: \n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" - -#: source/ubl-settings-quotas.cc:224 source/ubl-settings-quotas.cc:154 -#: source/ubl-settings-quotas.cc:144 -msgid "About" -msgstr "" - -#: source/ubl-settings-quotas.cc:183 source/ubl-settings-quotas.cc:113 -#: source/ubl-settings-quotas.cc:103 source/ubl-settings-quotas.cc:124 -#: source/ubl-settings-quotas.cc:121 source/ubl-settings-quotas.cc:118 -msgid "Configuration of disk quotas parameters for system groups and users" -msgstr "" - -#: source/ubl-settings-quotas.cc:138 source/ubl-settings-quotas.cc:68 -#: source/ubl-settings-quotas.cc:60 source/ubl-settings-quotas.cc:81 -#: source/ubl-settings-quotas.cc:78 source/ubl-settings-quotas.cc:75 -#: source/ubl-settings-quotas.cc:74 -msgid "Copyright © UBSoft LLC, 2022 - " -msgstr "" - -#: source/ubl-settings-quotas.cc:201 source/ubl-settings-quotas.cc:206 -#: source/ubl-settings-quotas.cc:211 source/ubl-settings-quotas.cc:131 -#: source/ubl-settings-quotas.cc:136 source/ubl-settings-quotas.cc:141 -#: source/ubl-settings-quotas.cc:121 source/ubl-settings-quotas.cc:126 -#: source/ubl-settings-quotas.cc:142 source/ubl-settings-quotas.cc:147 -#: source/ubl-settings-quotas.cc:152 source/ubl-settings-quotas.cc:139 -#: source/ubl-settings-quotas.cc:144 source/ubl-settings-quotas.cc:149 -msgid "Currently using:" -msgstr "" - -#: source/ubl-settings-quotas.cc:216 source/ubl-settings-quotas.cc:146 -#: source/ubl-settings-quotas.cc:136 source/ubl-settings-quotas.cc:157 -#: source/ubl-settings-quotas.cc:154 -msgid "Currently using: " -msgstr "" - -#: source/ubl-settings-quotas.cc:62 source/ubl-settings-quotas.cc:83 -#: source/ubl-settings-quotas.cc:80 source/ubl-settings-quotas.cc:77 -#: source/ubl-settings-quotas.cc:76 -msgid "Date and Time" -msgstr "" - -#: source/ubl-settings-quotas.cc:246 source/ubl-settings-quotas.cc:381 -msgid "" -"Deferring\n" -"a hard\n" -"limit\n" -"(files)" -msgstr "" - -#: source/ubl-settings-quotas.cc:239 source/ubl-settings-quotas.cc:374 -msgid "" -"Deferring\n" -"a hard\n" -"limit\n" -"(size)" -msgstr "" - -#: source/ubl-settings-quotas.cc:194 -msgid "Deferring a hard limit (files)" -msgstr "" - -#: source/ubl-settings-quotas.cc:189 -msgid "Deferring a hard limit (size)" -msgstr "" - -#: source/ubl-settings-quotas.cc:149 source/ubl-settings-quotas.cc:181 -#: source/ubl-settings-quotas.cc:182 source/ubl-settings-quotas.cc:196 -#: source/ubl-settings-quotas.cc:208 source/ubl-settings-quotas.cc:79 -#: source/ubl-settings-quotas.cc:111 source/ubl-settings-quotas.cc:112 -#: source/ubl-settings-quotas.cc:126 source/ubl-settings-quotas.cc:138 -#: source/ubl-settings-quotas.cc:69 source/ubl-settings-quotas.cc:101 -#: source/ubl-settings-quotas.cc:102 source/ubl-settings-quotas.cc:116 -#: source/ubl-settings-quotas.cc:128 source/ubl-settings-quotas.cc:90 -#: source/ubl-settings-quotas.cc:122 source/ubl-settings-quotas.cc:123 -#: source/ubl-settings-quotas.cc:137 source/ubl-settings-quotas.cc:87 -#: source/ubl-settings-quotas.cc:119 source/ubl-settings-quotas.cc:120 -#: source/ubl-settings-quotas.cc:134 source/ubl-settings-quotas.cc:146 -#: source/ubl-settings-quotas.cc:84 source/ubl-settings-quotas.cc:117 -#: source/ubl-settings-quotas.cc:83 -msgid "Device:" -msgstr "" - -#: source/ubl-settings-quotas.cc:197 source/ubl-settings-quotas.cc:207 -#: source/ubl-settings-quotas.cc:127 source/ubl-settings-quotas.cc:137 -#: source/ubl-settings-quotas.cc:117 source/ubl-settings-quotas.cc:138 -#: source/ubl-settings-quotas.cc:148 source/ubl-settings-quotas.cc:135 -#: source/ubl-settings-quotas.cc:145 -msgid "Disk quotas for this device:" -msgstr "" - -#: source/ubl-settings-quotas.cc:152 source/ubl-settings-quotas.cc:153 -#: source/ubl-settings-quotas.cc:82 source/ubl-settings-quotas.cc:83 -#: source/ubl-settings-quotas.cc:72 source/ubl-settings-quotas.cc:73 -#: source/ubl-settings-quotas.cc:93 source/ubl-settings-quotas.cc:94 -#: source/ubl-settings-quotas.cc:90 source/ubl-settings-quotas.cc:91 -#: source/ubl-settings-quotas.cc:87 source/ubl-settings-quotas.cc:88 -#: source/ubl-settings-quotas.cc:86 -msgid "Enable" -msgstr "" - -#: source/ubl-settings-quotas.cc:597 source/ubl-settings-quotas.cc:510 -#: source/ubl-settings-quotas.cc:444 -msgid "Error saved local and global configuration" -msgstr "" - -#: source/ubl-settings-quotas.cc:156 source/ubl-settings-quotas.cc:158 -#: source/ubl-settings-quotas.cc:86 source/ubl-settings-quotas.cc:88 -#: source/ubl-settings-quotas.cc:76 source/ubl-settings-quotas.cc:78 -#: source/ubl-settings-quotas.cc:97 source/ubl-settings-quotas.cc:99 -#: source/ubl-settings-quotas.cc:94 source/ubl-settings-quotas.cc:96 -#: source/ubl-settings-quotas.cc:91 source/ubl-settings-quotas.cc:93 -#: source/ubl-settings-quotas.cc:90 source/ubl-settings-quotas.cc:92 -msgid "Excess files delay period" -msgstr "" - -#: source/ubl-settings-quotas.cc:155 source/ubl-settings-quotas.cc:157 -#: source/ubl-settings-quotas.cc:85 source/ubl-settings-quotas.cc:87 -#: source/ubl-settings-quotas.cc:75 source/ubl-settings-quotas.cc:77 -#: source/ubl-settings-quotas.cc:96 source/ubl-settings-quotas.cc:98 -#: source/ubl-settings-quotas.cc:93 source/ubl-settings-quotas.cc:95 -#: source/ubl-settings-quotas.cc:90 source/ubl-settings-quotas.cc:92 -#: source/ubl-settings-quotas.cc:89 source/ubl-settings-quotas.cc:91 -msgid "Excess size delay period" -msgstr "" - -#: source/ubl-settings-quotas.cc:150 source/ubl-settings-quotas.cc:175 -#: source/ubl-settings-quotas.cc:176 source/ubl-settings-quotas.cc:214 -#: source/ubl-settings-quotas.cc:221 source/ubl-settings-quotas.cc:80 -#: source/ubl-settings-quotas.cc:105 source/ubl-settings-quotas.cc:106 -#: source/ubl-settings-quotas.cc:144 source/ubl-settings-quotas.cc:151 -#: source/ubl-settings-quotas.cc:70 source/ubl-settings-quotas.cc:95 -#: source/ubl-settings-quotas.cc:96 source/ubl-settings-quotas.cc:134 -#: source/ubl-settings-quotas.cc:141 source/ubl-settings-quotas.cc:91 -#: source/ubl-settings-quotas.cc:116 source/ubl-settings-quotas.cc:117 -#: source/ubl-settings-quotas.cc:155 source/ubl-settings-quotas.cc:162 -#: source/ubl-settings-quotas.cc:88 source/ubl-settings-quotas.cc:113 -#: source/ubl-settings-quotas.cc:114 source/ubl-settings-quotas.cc:152 -#: source/ubl-settings-quotas.cc:85 source/ubl-settings-quotas.cc:110 -#: source/ubl-settings-quotas.cc:111 source/ubl-settings-quotas.cc:84 -msgid "File system:" -msgstr "" - -#: source/ubl-settings-quotas.cc:191 source/ubl-settings-quotas.cc:200 -#: source/ubl-settings-quotas.cc:215 source/ubl-settings-quotas.cc:243 -#: source/ubl-settings-quotas.cc:121 source/ubl-settings-quotas.cc:130 -#: source/ubl-settings-quotas.cc:145 source/ubl-settings-quotas.cc:378 -#: source/ubl-settings-quotas.cc:111 source/ubl-settings-quotas.cc:120 -#: source/ubl-settings-quotas.cc:135 source/ubl-settings-quotas.cc:321 -#: source/ubl-settings-quotas.cc:132 source/ubl-settings-quotas.cc:141 -#: source/ubl-settings-quotas.cc:156 source/ubl-settings-quotas.cc:325 -#: source/ubl-settings-quotas.cc:129 source/ubl-settings-quotas.cc:138 -#: source/ubl-settings-quotas.cc:153 source/ubl-settings-quotas.cc:317 -#: source/ubl-settings-quotas.cc:264 source/ubl-settings-quotas.cc:126 -msgid "Files" -msgstr "" - -#: source/ubl-settings-quotas.cc:177 source/ubl-settings-quotas.cc:178 -#: source/ubl-settings-quotas.cc:107 source/ubl-settings-quotas.cc:108 -#: source/ubl-settings-quotas.cc:97 source/ubl-settings-quotas.cc:98 -#: source/ubl-settings-quotas.cc:118 source/ubl-settings-quotas.cc:119 -#: source/ubl-settings-quotas.cc:115 source/ubl-settings-quotas.cc:116 -#: source/ubl-settings-quotas.cc:112 source/ubl-settings-quotas.cc:113 -msgid "Filters" -msgstr "" - -msgid "" -"GTK settings quotas. for UBLinux\n" -"\n" -"Usage: ubl-settings-quotas [OPTIONS...]\n" -"Options:\n" -" -h, --help\t Show this help\n" -" -V, --version\t Show package version\n" -msgstr "" - -#: source/ubl-settings-quotas.cc:144 source/ubl-settings-quotas.cc:74 -#: source/ubl-settings-quotas.cc:66 source/ubl-settings-quotas.cc:87 -#: source/ubl-settings-quotas.cc:84 source/ubl-settings-quotas.cc:81 -#: source/ubl-settings-quotas.cc:80 -msgid "General settings" -msgstr "" - -#: source/ubl-settings-quotas.cc:611 source/ubl-settings-quotas.cc:524 -#: source/ubl-settings-quotas.cc:458 -msgid "Global configuration downloaded successfully" -msgstr "" - -#: source/ubl-settings-quotas.cc:585 source/ubl-settings-quotas.cc:498 -#: source/ubl-settings-quotas.cc:432 -msgid "Global configuration read error" -msgstr "" - -#: source/ubl-settings-quotas.cc:617 source/ubl-settings-quotas.cc:530 -#: source/ubl-settings-quotas.cc:464 -msgid "Global configuration successfully written" -msgstr "" - -#: source/ubl-settings-quotas.cc:593 source/ubl-settings-quotas.cc:506 -#: source/ubl-settings-quotas.cc:440 -msgid "Global configuration write error" -msgstr "" - -#: source/ubl-settings-quotas.cc:198 source/ubl-settings-quotas.cc:128 -#: source/ubl-settings-quotas.cc:118 source/ubl-settings-quotas.cc:139 -#: source/ubl-settings-quotas.cc:136 -msgid "Group quotas for this device:" -msgstr "" - -#: source/ubl-settings-quotas.cc:145 source/ubl-settings-quotas.cc:75 -#: source/ubl-settings-quotas.cc:67 source/ubl-settings-quotas.cc:88 -#: source/ubl-settings-quotas.cc:85 source/ubl-settings-quotas.cc:82 -#: source/ubl-settings-quotas.cc:81 -msgid "Groups" -msgstr "" - -#: source/ubl-settings-quotas.cc:203 source/ubl-settings-quotas.cc:204 -#: source/ubl-settings-quotas.cc:213 source/ubl-settings-quotas.cc:218 -#: source/ubl-settings-quotas.cc:133 source/ubl-settings-quotas.cc:134 -#: source/ubl-settings-quotas.cc:143 source/ubl-settings-quotas.cc:148 -#: source/ubl-settings-quotas.cc:123 source/ubl-settings-quotas.cc:124 -#: source/ubl-settings-quotas.cc:138 source/ubl-settings-quotas.cc:144 -#: source/ubl-settings-quotas.cc:145 source/ubl-settings-quotas.cc:154 -#: source/ubl-settings-quotas.cc:159 source/ubl-settings-quotas.cc:141 -#: source/ubl-settings-quotas.cc:142 source/ubl-settings-quotas.cc:151 -#: source/ubl-settings-quotas.cc:156 -msgid "Hard limit" -msgstr "" - -#: source/ubl-settings-quotas.cc:320 source/ubl-settings-quotas.cc:324 -#: source/ubl-settings-quotas.cc:316 source/ubl-settings-quotas.cc:263 -msgid "" -"Hard limit\n" -"(Size) activation\n" -"time" -msgstr "" - -#: source/ubl-settings-quotas.cc:323 source/ubl-settings-quotas.cc:327 -#: source/ubl-settings-quotas.cc:319 source/ubl-settings-quotas.cc:266 -msgid "" -"Hard limit\n" -"(files)" -msgstr "" - -#: source/ubl-settings-quotas.cc:325 source/ubl-settings-quotas.cc:329 -#: source/ubl-settings-quotas.cc:321 source/ubl-settings-quotas.cc:268 -msgid "" -"Hard limit\n" -"(files) activation\n" -"time" -msgstr "" - -#: source/ubl-settings-quotas.cc:324 source/ubl-settings-quotas.cc:328 -#: source/ubl-settings-quotas.cc:320 source/ubl-settings-quotas.cc:267 -msgid "" -"Hard limit\n" -"(files) delay" -msgstr "" - -#: source/ubl-settings-quotas.cc:318 source/ubl-settings-quotas.cc:322 -#: source/ubl-settings-quotas.cc:314 source/ubl-settings-quotas.cc:261 -msgid "" -"Hard limit\n" -"(size)" -msgstr "" - -#: source/ubl-settings-quotas.cc:319 source/ubl-settings-quotas.cc:323 -#: source/ubl-settings-quotas.cc:315 source/ubl-settings-quotas.cc:262 -msgid "" -"Hard limit\n" -"(size) delay" -msgstr "" - -#: source/ubl-settings-quotas.cc:247 source/ubl-settings-quotas.cc:382 -msgid "" -"Hard limit\n" -"activation\n" -"time (files)" -msgstr "" - -#: source/ubl-settings-quotas.cc:240 source/ubl-settings-quotas.cc:375 -msgid "" -"Hard limit\n" -"activation\n" -"time (size)" -msgstr "" - -#: source/ubl-settings-quotas.cc:195 source/ubl-settings-quotas.cc:125 -#: source/ubl-settings-quotas.cc:115 source/ubl-settings-quotas.cc:136 -#: source/ubl-settings-quotas.cc:133 source/ubl-settings-quotas.cc:130 -msgid "Hard limit (file) activation time" -msgstr "" - -#: source/ubl-settings-quotas.cc:123 source/ubl-settings-quotas.cc:113 -#: source/ubl-settings-quotas.cc:134 source/ubl-settings-quotas.cc:131 -#: source/ubl-settings-quotas.cc:128 -msgid "Hard limit (files)" -msgstr "" - -#: source/ubl-settings-quotas.cc:124 source/ubl-settings-quotas.cc:114 -#: source/ubl-settings-quotas.cc:135 source/ubl-settings-quotas.cc:132 -#: source/ubl-settings-quotas.cc:129 -msgid "Hard limit (files) delay" -msgstr "" - -#: source/ubl-settings-quotas.cc:188 source/ubl-settings-quotas.cc:118 -#: source/ubl-settings-quotas.cc:108 source/ubl-settings-quotas.cc:129 -#: source/ubl-settings-quotas.cc:126 source/ubl-settings-quotas.cc:123 -msgid "Hard limit (size)" -msgstr "" - -#: source/ubl-settings-quotas.cc:120 source/ubl-settings-quotas.cc:110 -#: source/ubl-settings-quotas.cc:131 source/ubl-settings-quotas.cc:128 -#: source/ubl-settings-quotas.cc:125 -msgid "Hard limit (size) activation time" -msgstr "" - -#: source/ubl-settings-quotas.cc:119 source/ubl-settings-quotas.cc:109 -#: source/ubl-settings-quotas.cc:130 source/ubl-settings-quotas.cc:127 -#: source/ubl-settings-quotas.cc:124 -msgid "Hard limit (size) delay" -msgstr "" - -#: source/ubl-settings-quotas.cc:190 -msgid "Hard limit activation time (size)" -msgstr "" - -#: source/ubl-settings-quotas.cc:225 source/ubl-settings-quotas.cc:155 -#: source/ubl-settings-quotas.cc:145 -msgid "Help" -msgstr "" - -#: source/ubl-settings-quotas.cc:179 source/ubl-settings-quotas.cc:109 -#: source/ubl-settings-quotas.cc:99 source/ubl-settings-quotas.cc:120 -#: source/ubl-settings-quotas.cc:117 source/ubl-settings-quotas.cc:114 -msgid "Load" -msgstr "" - -#: source/ubl-settings-quotas.cc:222 source/ubl-settings-quotas.cc:152 -#: source/ubl-settings-quotas.cc:142 -msgid "Load from global configuration" -msgstr "" - -#: source/ubl-settings-quotas.cc:223 source/ubl-settings-quotas.cc:153 -#: source/ubl-settings-quotas.cc:143 -msgid "Load from local configuration" -msgstr "" - -#: source/ubl-settings-quotas.cc:608 source/ubl-settings-quotas.cc:521 -#: source/ubl-settings-quotas.cc:455 -msgid "Local configuration downloaded successfully" -msgstr "" - -#: source/ubl-settings-quotas.cc:581 source/ubl-settings-quotas.cc:494 -#: source/ubl-settings-quotas.cc:428 -msgid "Local configuration reading error" -msgstr "" - -#: source/ubl-settings-quotas.cc:614 source/ubl-settings-quotas.cc:527 -#: source/ubl-settings-quotas.cc:461 -msgid "Local configuration successfully written" -msgstr "" - -#: source/ubl-settings-quotas.cc:589 source/ubl-settings-quotas.cc:502 -#: source/ubl-settings-quotas.cc:436 -msgid "Local configuration write error" -msgstr "" - -#: source/ubl-settings-quotas.cc:184 source/ubl-settings-quotas.cc:234 -#: source/ubl-settings-quotas.cc:114 source/ubl-settings-quotas.cc:369 -#: source/ubl-settings-quotas.cc:104 source/ubl-settings-quotas.cc:314 -#: source/ubl-settings-quotas.cc:125 source/ubl-settings-quotas.cc:318 -#: source/ubl-settings-quotas.cc:122 source/ubl-settings-quotas.cc:310 -#: source/ubl-settings-quotas.cc:119 -msgid "Name" -msgstr "" - -#: source/ubl-settings-quotas.cc:623 source/ubl-settings-quotas.cc:536 -#: source/ubl-settings-quotas.cc:470 -msgid "Nothing to save!" -msgstr "" - -#: source/ubl-settings-quotas.cc:143 source/ubl-settings-quotas.cc:73 -#: source/ubl-settings-quotas.cc:65 source/ubl-settings-quotas.cc:86 -#: source/ubl-settings-quotas.cc:83 source/ubl-settings-quotas.cc:80 -#: source/ubl-settings-quotas.cc:79 -msgid "Project Home Page" -msgstr "" - -#: source/ubl-settings-quotas.cc:185 source/ubl-settings-quotas.cc:235 -#: source/ubl-settings-quotas.cc:115 source/ubl-settings-quotas.cc:370 -#: source/ubl-settings-quotas.cc:105 source/ubl-settings-quotas.cc:315 -#: source/ubl-settings-quotas.cc:126 source/ubl-settings-quotas.cc:319 -#: source/ubl-settings-quotas.cc:123 source/ubl-settings-quotas.cc:311 -#: source/ubl-settings-quotas.cc:258 source/ubl-settings-quotas.cc:120 -msgid "Quotas" -msgstr "" - -#: source/ubl-settings-quotas.cc:151 source/ubl-settings-quotas.cc:81 -#: source/ubl-settings-quotas.cc:71 -msgid "Quotas for groups" -msgstr "" - -#: source/ubl-settings-quotas.cc:154 source/ubl-settings-quotas.cc:84 -#: source/ubl-settings-quotas.cc:74 -msgid "Quotas for users" -msgstr "" - -#: source/ubl-settings-quotas.cc:180 source/ubl-settings-quotas.cc:110 -#: source/ubl-settings-quotas.cc:100 source/ubl-settings-quotas.cc:121 -#: source/ubl-settings-quotas.cc:118 source/ubl-settings-quotas.cc:115 -msgid "Save" -msgstr "" - -#: source/ubl-settings-quotas.cc:226 source/ubl-settings-quotas.cc:156 -#: source/ubl-settings-quotas.cc:146 -msgid "Save to global and local configuration" -msgstr "" - -#: source/ubl-settings-quotas.cc:227 source/ubl-settings-quotas.cc:157 -#: source/ubl-settings-quotas.cc:147 -msgid "Save to global configuration" -msgstr "" - -#: source/ubl-settings-quotas.cc:228 source/ubl-settings-quotas.cc:158 -#: source/ubl-settings-quotas.cc:148 -msgid "Save to local configuration" -msgstr "" - -#: source/ubl-settings-quotas.cc:140 source/ubl-settings-quotas.cc:70 -msgid "Setting user quotas" -msgstr "" - -#: source/ubl-settings-quotas.cc:245 source/ubl-settings-quotas.cc:380 -msgid "" -"Severe\n" -"limitation\n" -"(files)" -msgstr "" - -#: source/ubl-settings-quotas.cc:238 source/ubl-settings-quotas.cc:373 -msgid "" -"Severe\n" -"limitation\n" -"(size)" -msgstr "" - -#: source/ubl-settings-quotas.cc:193 -msgid "Severe limitation (files)" -msgstr "" - -#: source/ubl-settings-quotas.cc:186 source/ubl-settings-quotas.cc:199 -#: source/ubl-settings-quotas.cc:210 source/ubl-settings-quotas.cc:236 -#: source/ubl-settings-quotas.cc:116 source/ubl-settings-quotas.cc:129 -#: source/ubl-settings-quotas.cc:140 source/ubl-settings-quotas.cc:371 -#: source/ubl-settings-quotas.cc:106 source/ubl-settings-quotas.cc:119 -#: source/ubl-settings-quotas.cc:130 source/ubl-settings-quotas.cc:316 -#: source/ubl-settings-quotas.cc:127 source/ubl-settings-quotas.cc:151 -#: source/ubl-settings-quotas.cc:320 source/ubl-settings-quotas.cc:124 -#: source/ubl-settings-quotas.cc:137 source/ubl-settings-quotas.cc:148 -#: source/ubl-settings-quotas.cc:312 source/ubl-settings-quotas.cc:259 -#: source/ubl-settings-quotas.cc:121 -msgid "Size" -msgstr "" - -#: source/ubl-settings-quotas.cc:244 source/ubl-settings-quotas.cc:379 -msgid "" -"Soft\n" -"Restriction\n" -"(files)" -msgstr "" - -#: source/ubl-settings-quotas.cc:192 -msgid "Soft Restriction (files)" -msgstr "" - -#: source/ubl-settings-quotas.cc:202 source/ubl-settings-quotas.cc:205 -#: source/ubl-settings-quotas.cc:212 source/ubl-settings-quotas.cc:217 -#: source/ubl-settings-quotas.cc:132 source/ubl-settings-quotas.cc:135 -#: source/ubl-settings-quotas.cc:142 source/ubl-settings-quotas.cc:147 -#: source/ubl-settings-quotas.cc:122 source/ubl-settings-quotas.cc:125 -#: source/ubl-settings-quotas.cc:137 source/ubl-settings-quotas.cc:143 -#: source/ubl-settings-quotas.cc:146 source/ubl-settings-quotas.cc:153 -#: source/ubl-settings-quotas.cc:158 source/ubl-settings-quotas.cc:140 -#: source/ubl-settings-quotas.cc:150 source/ubl-settings-quotas.cc:155 -msgid "Soft limit" -msgstr "" - -#: source/ubl-settings-quotas.cc:322 source/ubl-settings-quotas.cc:326 -#: source/ubl-settings-quotas.cc:318 source/ubl-settings-quotas.cc:265 -msgid "" -"Soft limit\n" -"(files)" -msgstr "" - -#: source/ubl-settings-quotas.cc:237 source/ubl-settings-quotas.cc:372 -#: source/ubl-settings-quotas.cc:317 source/ubl-settings-quotas.cc:321 -#: source/ubl-settings-quotas.cc:313 source/ubl-settings-quotas.cc:260 -msgid "" -"Soft limit\n" -"(size)" -msgstr "" - -#: source/ubl-settings-quotas.cc:122 source/ubl-settings-quotas.cc:112 -#: source/ubl-settings-quotas.cc:133 source/ubl-settings-quotas.cc:130 -#: source/ubl-settings-quotas.cc:127 -msgid "Soft limit (files)" -msgstr "" - -#: source/ubl-settings-quotas.cc:187 source/ubl-settings-quotas.cc:117 -#: source/ubl-settings-quotas.cc:107 source/ubl-settings-quotas.cc:128 -#: source/ubl-settings-quotas.cc:125 source/ubl-settings-quotas.cc:122 -msgid "Soft limit (size)" -msgstr "" - -#: source/ubl-settings-quotas.cc:620 source/ubl-settings-quotas.cc:533 -#: source/ubl-settings-quotas.cc:467 -msgid "Successfully saved local and global configuration" -msgstr "" - -#: source/ubl-settings-quotas.cc:59 source/ubl-settings-quotas.cc:55 -#: source/ubl-settings-quotas.cc:47 source/ubl-settings-quotas.cc:68 -#: source/ubl-settings-quotas.cc:70 source/ubl-settings-quotas.cc:67 -#: source/ubl-settings-quotas.cc:66 -msgid "The program must be run as root" -msgstr "" - -#: source/ubl-settings-quotas.cc:209 source/ubl-settings-quotas.cc:139 -#: source/ubl-settings-quotas.cc:129 source/ubl-settings-quotas.cc:150 -#: source/ubl-settings-quotas.cc:147 -msgid "User quotas for this device: " -msgstr "" - -#: source/ubl-settings-quotas.cc:148 source/ubl-settings-quotas.cc:78 -#: source/ubl-settings-quotas.cc:68 source/ubl-settings-quotas.cc:89 -#: source/ubl-settings-quotas.cc:86 source/ubl-settings-quotas.cc:83 -#: source/ubl-settings-quotas.cc:82 -msgid "Users" -msgstr "" - -#: source/ubl-settings-quotas.cc:163 source/ubl-settings-quotas.cc:164 -#: source/ubl-settings-quotas.cc:165 source/ubl-settings-quotas.cc:166 -#: source/ubl-settings-quotas.cc:93 source/ubl-settings-quotas.cc:94 -#: source/ubl-settings-quotas.cc:95 source/ubl-settings-quotas.cc:96 -#: source/ubl-settings-quotas.cc:83 source/ubl-settings-quotas.cc:84 -#: source/ubl-settings-quotas.cc:85 source/ubl-settings-quotas.cc:86 -#: source/ubl-settings-quotas.cc:104 source/ubl-settings-quotas.cc:105 -#: source/ubl-settings-quotas.cc:106 source/ubl-settings-quotas.cc:107 -#: source/ubl-settings-quotas.cc:101 source/ubl-settings-quotas.cc:102 -#: source/ubl-settings-quotas.cc:103 source/ubl-settings-quotas.cc:98 -#: source/ubl-settings-quotas.cc:99 source/ubl-settings-quotas.cc:100 -#: source/ubl-settings-quotas.cc:97 -msgid "days" -msgstr "" - -#: source/ubl-settings-quotas.cc:219 source/ubl-settings-quotas.cc:220 -#: source/ubl-settings-quotas.cc:149 source/ubl-settings-quotas.cc:150 -#: source/ubl-settings-quotas.cc:139 source/ubl-settings-quotas.cc:140 -#: source/ubl-settings-quotas.cc:160 source/ubl-settings-quotas.cc:161 -#: source/ubl-settings-quotas.cc:157 source/ubl-settings-quotas.cc:158 -msgid "files" -msgstr "" - -#: source/ubl-settings-quotas.cc:167 source/ubl-settings-quotas.cc:168 -#: source/ubl-settings-quotas.cc:169 source/ubl-settings-quotas.cc:170 -#: source/ubl-settings-quotas.cc:97 source/ubl-settings-quotas.cc:98 -#: source/ubl-settings-quotas.cc:99 source/ubl-settings-quotas.cc:100 -#: source/ubl-settings-quotas.cc:87 source/ubl-settings-quotas.cc:88 -#: source/ubl-settings-quotas.cc:89 source/ubl-settings-quotas.cc:90 -#: source/ubl-settings-quotas.cc:108 source/ubl-settings-quotas.cc:109 -#: source/ubl-settings-quotas.cc:110 source/ubl-settings-quotas.cc:111 -#: source/ubl-settings-quotas.cc:105 source/ubl-settings-quotas.cc:106 -#: source/ubl-settings-quotas.cc:107 source/ubl-settings-quotas.cc:102 -#: source/ubl-settings-quotas.cc:103 source/ubl-settings-quotas.cc:104 -#: source/ubl-settings-quotas.cc:101 -msgid "hours" -msgstr "" - -#: source/ubl-settings-quotas.cc:141 source/ubl-settings-quotas.cc:71 -#: source/ubl-settings-quotas.cc:63 source/ubl-settings-quotas.cc:84 -#: source/ubl-settings-quotas.cc:81 source/ubl-settings-quotas.cc:78 -#: source/ubl-settings-quotas.cc:77 -msgid "https://wiki.ublinux.com" -msgstr "" - -#: source/ubl-settings-quotas.cc:548 source/ubl-settings-quotas.cc:461 -msgid "" -"https://wiki.ublinux.com/ru/Программное_обеспечение/Программы_и_утилиты/Все/" -msgstr "" - -#: source/ubl-settings-quotas.cc:171 source/ubl-settings-quotas.cc:172 -#: source/ubl-settings-quotas.cc:173 source/ubl-settings-quotas.cc:174 -#: source/ubl-settings-quotas.cc:101 source/ubl-settings-quotas.cc:102 -#: source/ubl-settings-quotas.cc:103 source/ubl-settings-quotas.cc:104 -#: source/ubl-settings-quotas.cc:91 source/ubl-settings-quotas.cc:92 -#: source/ubl-settings-quotas.cc:93 source/ubl-settings-quotas.cc:94 -#: source/ubl-settings-quotas.cc:112 source/ubl-settings-quotas.cc:113 -#: source/ubl-settings-quotas.cc:114 source/ubl-settings-quotas.cc:115 -#: source/ubl-settings-quotas.cc:109 source/ubl-settings-quotas.cc:110 -#: source/ubl-settings-quotas.cc:111 source/ubl-settings-quotas.cc:106 -#: source/ubl-settings-quotas.cc:107 source/ubl-settings-quotas.cc:108 -#: source/ubl-settings-quotas.cc:105 -msgid "minutes" -msgstr "" - -#: source/ubl-settings-quotas.cc:257 -msgid "name" -msgstr "" - -#: source/ubl-settings-quotas.cc:92 source/ubl-settings-quotas.cc:89 -#: source/ubl-settings-quotas.cc:86 source/ubl-settings-quotas.cc:85 -msgid "quotas for groups" -msgstr "" - -#: source/ubl-settings-quotas.cc:95 source/ubl-settings-quotas.cc:92 -#: source/ubl-settings-quotas.cc:89 source/ubl-settings-quotas.cc:88 -msgid "quotas for users" -msgstr "" - -#: source/ubl-settings-quotas.cc:629 source/ubl-settings-quotas.cc:542 -#: source/ubl-settings-quotas.cc:476 source/ubl-settings-quotas.cc:350 -#: source/ubl-settings-quotas.cc:371 source/ubl-settings-quotas.cc:318 -#: source/ubl-settings-quotas.cc:267 source/ubl-settings-quotas.cc:213 -msgid "ubl-settings-quotas version: " -msgstr "" - -#: source/ubl-settings-quotas.cc:159 source/ubl-settings-quotas.cc:160 -#: source/ubl-settings-quotas.cc:161 source/ubl-settings-quotas.cc:162 -#: source/ubl-settings-quotas.cc:89 source/ubl-settings-quotas.cc:90 -#: source/ubl-settings-quotas.cc:91 source/ubl-settings-quotas.cc:92 -#: source/ubl-settings-quotas.cc:79 source/ubl-settings-quotas.cc:80 -#: source/ubl-settings-quotas.cc:81 source/ubl-settings-quotas.cc:82 -#: source/ubl-settings-quotas.cc:100 source/ubl-settings-quotas.cc:101 -#: source/ubl-settings-quotas.cc:102 source/ubl-settings-quotas.cc:103 -#: source/ubl-settings-quotas.cc:97 source/ubl-settings-quotas.cc:98 -#: source/ubl-settings-quotas.cc:99 source/ubl-settings-quotas.cc:94 -#: source/ubl-settings-quotas.cc:95 source/ubl-settings-quotas.cc:96 -#: source/ubl-settings-quotas.cc:93 -msgid "weeks" -msgstr "" From 313c3871458c04f8005d1d352a4a1ee795912b0c Mon Sep 17 00:00:00 2001 From: Igor Belitskiy Date: Fri, 14 Apr 2023 12:36:02 +0000 Subject: [PATCH 25/51] =?UTF-8?q?=D0=98=D1=81=D0=BF=D1=80=D0=B0=D0=B2?= =?UTF-8?q?=D0=BB=D0=B5=D0=BD=20gitignore?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 4 +- source/ubl-settings-diskquota.cc | 1 - ubl-settings-diskquota.glade~ | 3527 ------------------------------ 3 files changed, 2 insertions(+), 3530 deletions(-) delete mode 100644 ubl-settings-diskquota.glade~ diff --git a/.gitignore b/.gitignore index 9af9bbd..d77f196 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,3 @@ .vscode/ -ubl-settings-quotas.glade~ -ubl-settings-quotas_ru.po~ +ubl-settings-diskquota.glade~ +ubl-settings-diskquota_ru.po~ diff --git a/source/ubl-settings-diskquota.cc b/source/ubl-settings-diskquota.cc index ec2b482..956c210 100755 --- a/source/ubl-settings-diskquota.cc +++ b/source/ubl-settings-diskquota.cc @@ -1,4 +1,3 @@ - #include "ubl-settings-diskquota.h" using namespace std; diff --git a/ubl-settings-diskquota.glade~ b/ubl-settings-diskquota.glade~ deleted file mode 100644 index a908617..0000000 --- a/ubl-settings-diskquota.glade~ +++ /dev/null @@ -1,3527 +0,0 @@ - - - - - - - - - - - - False - start - False - - - True - False - 5 - 5 - 5 - 5 - 5 - 5 - vertical - - - Name - True - True - False - start - 6 - True - - - False - True - 0 - - - - - Quotas - True - True - False - start - True - - - False - True - 1 - - - - - Size - True - True - False - start - True - - - False - True - 2 - - - - - Soft limit (size) - True - True - False - start - True - - - False - True - 3 - - - - - Hard limit (size) - True - True - False - start - True - - - False - True - 4 - - - - - Hard limit (size) delay - True - True - False - start - True - - - False - True - 5 - - - - - Hard limit (size) activation time - True - True - False - start - True - - - False - True - 6 - - - - - Files - True - True - False - start - True - - - False - True - 7 - - - - - Soft limit (files) - True - True - False - start - True - - - False - True - 8 - - - - - Hard limit (files) - True - True - False - start - True - - - False - True - 9 - - - - - Hard limit (files) delay - True - True - False - start - True - - - False - True - 10 - - - - - Hard limit (file) activation time - True - True - False - start - True - - - False - True - 11 - - - - - True - False - end - 5 - 5 - True - - - gtk-cancel - True - True - True - center - True - - - False - True - 0 - - - - - gtk-save - True - True - True - center - True - - - False - True - 1 - - - - - False - True - 12 - - - - - - - True - False - True - - - True - False - System quotas - - - - - - - - True - False - 32 - com.ublinux.ubl-settings-quotas - 5 - - - - - - - - - - - - - Byte - - - Kb - - - Mb - - - Gb - - - Tb - - - - - False - False - True - center - com.ublinux.ubl-settings-quotas - dialog - True - ubl-settings-quotas - 1.0 - Copyright © 2022 - 2023, UBSoft LLC - Setting user quotas - https://ublinux.ru/ - Project Home Page - Это приложение распространяется без каких-либо гарантий. -Подробнее в <a href="https://www.gnu.org/licenses/old-licenses/gpl-2.0.html">GNU General Public License, версии 2 или позднее</a>. - UBGroup - UBGroup - com.ublinux.ubl-settings-quotas - True - gpl-2-0 - - - True - False - vertical - 2 - - - False - end - - - False - False - 1 - - - - - - - True - False - True - - - True - False - 5 - 5 - 5 - 5 - 2 - System quotas - - - - - - - - - - True - False - - - 90 - True - False - 5 - 5 - 5 - 5 - 6 - 6 - 69 - com.ublinux.ubl-settings-quotas - - - False - True - 0 - - - - - True - False - - - True - False - - - True - False - vertical - - - 255 - True - False - Configuration of disk quotas parameters for system groups and users - - - - - - - - True - True - 0 - - - - - False - True - 0 - - - - - True - True - 0 - - - - - True - True - 1 - - - - - 6 - 1 - 10 - - - 23 - 1 - 10 - - - 59 - 1 - 10 - - - 100 - 1 - 10 - - - 6 - 1 - 10 - - - 23 - 1 - 10 - - - 59 - 1 - 10 - - - 100 - 1 - 10 - - - 6 - 1 - 10 - - - 23 - 1 - 10 - - - 59 - 1 - 10 - - - 100 - 1 - 10 - - - 6 - 1 - 10 - - - 23 - 1 - 10 - - - 59 - 1 - 10 - - - 100 - 1 - 10 - - - - True - False - False - False - - - True - False - Help - - - - - - True - False - About - True - - - - - - True - False - - - True - False - Load from global configuration - True - - - - - - True - False - Load from local configuration - True - - - - - - True - False - - - True - False - Save to global and local configuration - True - - - - - - True - False - Save to global configuration - True - - - - - - True - False - Save to local configuration - True - - - - - - False - com.ublinux.ubl-settings-quotas - - - True - False - vertical - - - True - False - vertical - - - True - False - - - True - False - 5 - 5 - 5 - 5 - 6 - 6 - 25 - 1 - - - False - True - 0 - - - - - True - False - start - 5 - 5 - 5 - 5 - 6 - 6 - - - - - - - True - True - 1 - - - - - False - True - 0 - - - - - True - False - vertical - - - 81 - True - False - - - True - False - start - - - -1 - - - - - False - True - 0 - - - - - False - True - 1 - - - - - True - False - 5 - 5 - 5 - 5 - True - True - vertical - - - True - True - - - True - False - vertical - - - True - False - 5 - 5 - 5 - 5 - - - 135 - True - False - 5 - 5 - Device: - 0 - - - False - True - 0 - - - - - True - False - - - True - True - 1 - - - - - 0 - True - False - 5 - 5 - File system: - 0 - - - False - True - 2 - - - - - True - False - 5 - 5 - 5 - 5 - 6 - 6 - - - False - True - 3 - - - - - False - True - 0 - - - - - True - False - 5 - 5 - 0.019999999552965164 - in - - - True - False - 5 - 5 - 12 - 5 - - - True - False - vertical - - - Enable - True - True - False - start - True - - - False - True - 0 - - - - - True - False - 20 - - - True - False - vertical - - - True - False - Excess size delay period - 0 - - - False - True - 0 - - - - - True - False - Excess files delay period - 0 - - - False - True - 1 - - - - - False - True - 0 - - - - - True - False - vertical - 5 - - - True - False - 5 - - - True - True - 0 - generalGroupsSizeWeeksSpin - - - False - True - 0 - - - - - True - False - weeks - - - False - True - 1 - - - - - False - True - 0 - - - - - True - False - 5 - - - True - True - 0 - generalGroupsFilesWeeksSpin - - - False - True - 0 - - - - - True - False - weeks - - - False - True - 1 - - - - - False - True - 1 - - - - - False - True - 1 - - - - - True - False - vertical - 5 - - - True - False - 5 - - - True - True - 0 - generalGroupsSizeDaysSpin - - - False - True - 0 - - - - - True - False - days - - - False - True - 1 - - - - - False - True - 0 - - - - - True - False - 5 - - - True - True - 0 - generalGroupsFilesDaysSpin - - - False - True - 0 - - - - - True - False - days - - - False - True - 1 - - - - - False - True - 1 - - - - - False - True - 2 - - - - - True - False - vertical - 5 - - - True - False - 5 - - - True - True - 0 - generalGroupsSizeHoursSpin - - - False - True - 0 - - - - - True - False - hours - - - False - True - 1 - - - - - False - True - 0 - - - - - True - False - 5 - - - True - True - 0 - generalGroupsFilesHoursSpin - - - False - True - 0 - - - - - True - False - hours - - - False - True - 1 - - - - - False - True - 1 - - - - - False - True - 3 - - - - - True - False - vertical - 5 - - - True - False - 5 - - - True - True - 0 - generalGroupsSizeMinutesSpin - - - False - True - 0 - - - - - True - False - minutes - - - False - True - 1 - - - - - False - True - 0 - - - - - True - False - 5 - - - True - True - 0 - generalGroupsFilesMinutesSpin - - - False - True - 0 - - - - - True - False - minutes - - - False - True - 1 - - - - - False - True - 1 - - - - - False - True - 4 - - - - - False - True - 1 - - - - - - - - - True - False - Quotas for groups - 0 - - - - - False - True - 1 - - - - - True - False - 5 - 5 - 5 - 0.019999999552965164 - in - - - True - False - 5 - 5 - 12 - 5 - - - True - False - vertical - - - Enable - True - True - False - start - True - - - False - True - 0 - - - - - True - False - 20 - - - True - False - vertical - - - True - False - Excess size delay period - 0 - - - False - True - 0 - - - - - True - False - Excess files delay period - 0 - - - False - True - 1 - - - - - False - True - 0 - - - - - True - False - vertical - 5 - - - True - False - 5 - - - True - True - 0 - generalUsersSizeWeeksSpin - - - False - True - 0 - - - - - True - False - weeks - - - False - True - 1 - - - - - False - True - 0 - - - - - True - False - 5 - - - True - True - 0 - generalUsersFilesWeeksSpin - - - False - True - 0 - - - - - True - False - weeks - - - False - True - 1 - - - - - False - True - 1 - - - - - False - True - 1 - - - - - True - False - vertical - 5 - - - True - False - 5 - - - True - True - 0 - generalUsersSizeDaysSpin - - - False - True - 0 - - - - - True - False - days - - - False - True - 1 - - - - - False - True - 0 - - - - - True - False - 5 - - - True - True - 0 - generalUsersFilesDaysSpin - - - False - True - 0 - - - - - True - False - days - - - False - True - 1 - - - - - False - True - 1 - - - - - False - True - 2 - - - - - True - False - vertical - 5 - - - True - False - 5 - - - True - True - 0 - generalUsersSizeHoursSpin - - - False - True - 0 - - - - - True - False - hours - - - False - True - 1 - - - - - False - True - 0 - - - - - True - False - 5 - - - True - True - 0 - generalUsersFilesHourSpin - - - False - True - 0 - - - - - True - False - hours - - - False - True - 1 - - - - - False - True - 1 - - - - - False - True - 3 - - - - - True - False - vertical - 5 - - - True - False - 5 - - - True - True - 0 - generalUsersSizeMinutesSpin - - - False - True - 0 - - - - - True - False - minutes - - - False - True - 1 - - - - - False - True - 0 - - - - - True - False - 5 - - - True - True - 0 - generalUsersFilesMinuteSpin - - - False - True - 0 - - - - - True - False - minutes - - - False - True - 1 - - - - - False - True - 1 - - - - - False - True - 4 - - - - - False - True - 1 - - - - - - - - - True - False - Quotas for users - 0 - - - - - False - True - 2 - - - - - - - True - False - General settings - - - False - - - - - True - False - vertical - - - True - False - 5 - 5 - 5 - 5 - - - True - False - Device: - - - False - True - 0 - - - - - True - False - - - True - True - 1 - - - - - True - False - 5 - 5 - File system: - - - False - True - 2 - - - - - True - False - 5 - 5 - 5 - 5 - 6 - 6 - - - False - True - 3 - - - - - Filters - True - True - True - - - False - True - end - 4 - - - - - gtk-remove - True - True - True - 5 - 5 - 5 - 5 - True - - - False - True - 5 - - - - - False - True - 0 - - - - - True - True - liststore1 - - - - - - False - True - 1 - - - - - 1 - - - - - True - False - Groups - - - 1 - False - - - - - True - False - vertical - - - True - False - 5 - 5 - 5 - 5 - - - True - False - Device: - - - False - True - 0 - - - - - True - False - - - True - True - 1 - - - - - True - False - 5 - 5 - File system: - - - False - True - 2 - - - - - True - False - 5 - 5 - 5 - 5 - 6 - 6 - - - False - True - 3 - - - - - Filters - True - True - True - - - False - True - end - 4 - - - - - gtk-remove - True - True - True - 5 - 5 - 5 - 5 - True - - - False - True - 5 - - - - - False - True - 0 - - - - - True - True - liststore1 - - - - - - False - True - 1 - - - - - 2 - - - - - True - False - Users - - - 2 - False - - - - - True - True - 0 - - - - - False - True - 2 - - - - - True - True - 0 - - - - - - - True - False - True - - - True - False - 5 - 5 - 5 - 5 - 2 - UBConfig - Quotas - - - - - - - - True - False - 5 - 5 - 5 - 5 - 6 - 6 - 32 - com.ublinux.ubl-settings-quotas - - - - - True - False - - - True - True - False - True - menuLoad - - - True - False - - - True - False - Load - - - False - True - 0 - - - - - True - False - pan-down-symbolic - - - False - True - 1 - - - - - - - False - True - 0 - - - - - - 2 - - - - - True - False - - - True - True - False - True - menuSave - - - True - False - - - True - False - Save - - - False - True - 0 - - - - - True - False - pan-down-symbolic - - - False - True - 1 - - - - - - - False - True - 0 - - - - - True - True - True - False - True - True - menuAbout - none - - - True - False - open-menu-symbolic - - - - - False - True - 1 - - - - - - end - 3 - - - - - - - - - - - - - vertical - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 1000000 - 1 - 10 - - - 1000000 - 1 - 10 - - - 1024 - 1 - 10 - - - 1024 - 1 - 10 - - - False - start - False - - - True - False - 5 - 5 - 5 - 5 - vertical - - - True - False - vertical - 5 - - - True - False - 5 - - - True - False - 5 - 5 - 5 - 5 - 6 - 6 - Device: - - - False - True - 0 - - - - - True - False - 6 - 5 - 5 - 5 - 6 - 6 - - - True - True - 1 - - - - - True - False - start - 6 - 5 - 5 - 5 - 6 - 6 - File system: - 0 - - - False - True - 2 - - - - - True - False - 5 - 5 - 5 - 5 - 6 - 6 - - - False - True - 3 - - - - - False - True - 0 - - - - - True - False - 6 - 5 - 5 - 5 - 6 - 6 - Disk quotas for this device: - 0 - - - False - True - 1 - - - - - True - False - 6 - 5 - 5 - 5 - 6 - 6 - Group quotas for this device: - 0 - - - False - True - 2 - - - - - False - True - 0 - - - - - True - False - True - - - True - False - 5 - 5 - 5 - 5 - 5 - 0.019999999552965164 - in - - - True - False - 5 - 5 - 12 - 5 - - - True - False - vertical - - - True - False - 5 - 5 - 5 - 5 - 6 - 6 - Currently using: - - - False - True - 0 - - - - - True - False - 6 - 5 - 5 - 5 - 6 - 6 - Soft limit - 0 - - - False - True - 1 - - - - - True - False - 5 - - - True - True - False - right - True - - - False - True - 0 - - - - - True - True - quotegroupSizeSoftLimitAdjustment - - - True - True - 1 - - - - - True - False - - Kb - Mb - Gb - Tb - - - - False - True - 2 - - - - - True - True - 2 - - - - - True - False - 6 - 5 - 5 - 5 - 6 - 6 - Hard limit - 0 - - - False - True - 3 - - - - - True - False - False - 5 - - - True - True - False - right - True - - - False - True - 0 - - - - - True - True - quotegroupSizeHardLimitAdjustment - - - True - True - 1 - - - - - True - False - - Kb - Mb - Gb - Tb - - - - False - True - 2 - - - - - True - True - 4 - - - - - - - - - True - False - 6 - 5 - 5 - 5 - 6 - 6 - Size - - - - - True - True - 0 - - - - - True - False - 5 - 5 - 5 - 5 - 5 - 0.019999999552965164 - in - - - True - False - 5 - 5 - 12 - 5 - - - True - False - vertical - - - True - False - 5 - 5 - 6 - 5 - 6 - 6 - Currently using: - - - False - True - 0 - - - - - True - False - 5 - 5 - 5 - 5 - 6 - 6 - Soft limit - 0 - - - False - True - 1 - - - - - True - False - 5 - - - True - True - False - right - True - - - False - True - 0 - - - - - True - True - quotegroupFilesSoftLimitAdjustment - - - True - True - 1 - - - - - True - False - files - - - False - True - 2 - - - - - True - True - 2 - - - - - True - False - 5 - 5 - 5 - 5 - 6 - 6 - Hard limit - 0 - - - False - True - 3 - - - - - True - False - 5 - - - True - True - False - right - True - - - False - True - 0 - - - - - True - True - quotegroupFilesHardLimitAdjustment - - - True - True - 1 - - - - - True - False - files - - - False - True - 2 - - - - - True - True - 4 - - - - - - - - - True - False - 5 - 5 - 5 - 5 - 6 - 6 - Files - - - - - True - True - 1 - - - - - False - True - 1 - - - - - True - False - 5 - vertical - True - - - True - False - end - 5 - True - - - gtk-cancel - True - True - True - True - - - False - True - 0 - - - - - gtk-save - True - True - True - True - - - False - True - 1 - - - - - False - True - 0 - - - - - False - True - 2 - - - - - - - True - False - - - True - False - UBConfig - Quotas - - - - - True - False - 32 - com.ublinux.ubl-settings-quotas - 5 - - - - - - - 1000000 - 1 - 10 - - - 1000000 - 1 - 10 - - - 1024 - 1 - 10 - - - 1024 - 1 - 10 - - - False - start - False - - - True - False - 5 - 5 - 5 - 5 - 5 - 5 - vertical - - - True - False - vertical - 5 - - - True - False - 5 - - - True - False - Device: - - - False - True - 0 - - - - - True - False - DeviceStore - - - True - True - 1 - - - - - True - False - start - File system: - 0 - - - False - True - 2 - - - - - False - True - 0 - - - - - True - False - Disk quotas for this device: - 0 - - - False - True - 1 - - - - - True - False - User quotas for this device: - 0 - - - False - True - 2 - - - - - False - True - 0 - - - - - True - False - True - - - True - False - 5 - 5 - 5 - 5 - 5 - 0.019999999552965164 - in - - - True - False - 5 - 5 - 12 - 5 - - - True - False - vertical - - - True - False - Currently using: - - - False - True - 0 - - - - - True - False - Soft limit - 0 - - - False - True - 1 - - - - - True - False - 5 - - - True - True - False - right - True - - - False - True - 0 - - - - - True - True - quoteuserSizeSoftLimitAdjustment - - - True - True - 1 - - - - - True - False - - Kb - Mb - Gb - Tb - - - - False - True - 2 - - - - - True - True - 2 - - - - - True - False - Hard limit - 0 - - - False - True - 3 - - - - - True - False - False - 5 - - - True - True - False - right - True - - - False - True - 0 - - - - - True - True - quoteuserSizeHardLimitAdjustment - - - True - True - 1 - - - - - True - False - - Kb - Mb - Gb - Tb - - - - False - True - 2 - - - - - True - True - 4 - - - - - - - - - True - False - Size - - - - - True - True - 0 - - - - - True - False - 5 - 5 - 5 - 5 - 5 - 0.019999999552965164 - in - - - True - False - 5 - 5 - 12 - 5 - - - True - False - vertical - - - True - False - Currently using: - - - False - True - 0 - - - - - True - False - Soft limit - 0 - - - False - True - 1 - - - - - True - False - 5 - - - True - True - False - right - True - - - False - True - 0 - - - - - True - True - quoteuserFilesSoftLimitAdjustment - - - True - True - 1 - - - - - True - False - files - - - False - True - 2 - - - - - True - True - 2 - - - - - True - False - Hard limit - 0 - - - False - True - 3 - - - - - True - False - 5 - - - True - True - False - right - True - - - False - True - 0 - - - - - True - True - quoteuserFilesHardLimitAdjustment - - - True - True - 1 - - - - - True - False - files - - - False - True - 2 - - - - - True - True - 4 - - - - - - - - - True - False - Files - - - - - True - True - 1 - - - - - False - True - 1 - - - - - True - False - 5 - vertical - True - - - True - False - end - 5 - True - - - gtk-cancel - True - True - True - 5 - 5 - True - - - False - True - 0 - - - - - gtk-save - True - True - True - 5 - 5 - True - - - False - True - 1 - - - - - False - True - 0 - - - - - False - True - 2 - - - - - - - True - False - - - True - False - UBConfig - Quotas - - - - - - - - True - False - 32 - com.ublinux.ubl-settings-quotas - 5 - - - - - - From 79f8a683f29e7bd78e767190c22f2857a85aa483 Mon Sep 17 00:00:00 2001 From: Igor Belitskiy Date: Fri, 14 Apr 2023 12:58:20 +0000 Subject: [PATCH 26/51] fix --- source/controler.cc | 0 source/controler.h | 0 source/ubl-settings-diskquota.cc | 28 +++------------------------- source/ubl-settings-diskquota.h | 1 - source/util.cc | 18 ++++++++++++++++++ source/util.h | 1 + 6 files changed, 22 insertions(+), 26 deletions(-) create mode 100644 source/controler.cc create mode 100644 source/controler.h diff --git a/source/controler.cc b/source/controler.cc new file mode 100644 index 0000000..e69de29 diff --git a/source/controler.h b/source/controler.h new file mode 100644 index 0000000..e69de29 diff --git a/source/ubl-settings-diskquota.cc b/source/ubl-settings-diskquota.cc index 956c210..af9fcc1 100755 --- a/source/ubl-settings-diskquota.cc +++ b/source/ubl-settings-diskquota.cc @@ -519,25 +519,6 @@ void MainWindow::event() { QuotasEditWindow->show(); } -string MainWindow::format_str_size(Gtk::SpinButton* spb, Gtk::ComboBoxText* combo_box) { - string value = ""; - int num = spb->get_value(); - int index = combo_box->get_active_row_number(); - value = to_string(num); - if (num == 0) { - return value; - } - if (index == 1) { - value += "M"; - } - else if (index == 2) { - value += "G"; - } - else if (index == 3) { - value += "T"; - } - return value; -} void MainWindow::wrapper_settings_quotas_temp(string save_user_or_group) { struct partition_cmd _struct_partition_cmd = this->wrapper_settings_quotas(); string device = _struct_partition_cmd.device; @@ -552,6 +533,7 @@ void MainWindow::wrapper_settings_quotas_temp(string save_user_or_group) { obj_quotas_sys.format_cmd_quotas_ubconfig(_struct_quota); } + void MainWindow::save_quotegroupSaveButton() { if (sys_or_ubconfig == "ubconfig") { if (save_user_or_group == "usrquota") { @@ -571,22 +553,18 @@ void MainWindow::save_quotegroupSaveButton() { } } - - - - struct partition_cmd MainWindow::wrapper_settings_quotas() { string str_parted = quotegroupDeviceCombo->get_active_text(); string value = ""; if (quotegroupSizeSoftLimitCheck->get_active()) { - value = format_str_size(quotegroupSizeSoftLimitSpin, quotegroupSizeSoftLimitCombo); + value = Utils::format_str_size(quotegroupSizeSoftLimitSpin->get_value(), quotegroupSizeSoftLimitCombo->get_active_row_number()); value += ":"; } else { value += "0:"; } if (quotegroupSizeHardLimitCheck->get_active()) { - value += format_str_size(quotegroupSizeHardLimitSpin, quotegroupSizeHardLimitCombo); + value += Utils::format_str_size(quotegroupSizeHardLimitSpin->get_value(), quotegroupSizeHardLimitCombo->get_active_row_number()); value += ":"; } else { diff --git a/source/ubl-settings-diskquota.h b/source/ubl-settings-diskquota.h index 978da6b..e9b4e89 100644 --- a/source/ubl-settings-diskquota.h +++ b/source/ubl-settings-diskquota.h @@ -237,7 +237,6 @@ class MainWindow : public Gtk::ApplicationWindow { void off_quota_system(Gtk::ComboBoxText* combo_box, string quota_type); void wrapper_save_system_cfg(); void wrapper_save_global_cfg(); - string format_str_size(Gtk::SpinButton* spb, Gtk::ComboBoxText* combo_box); void wrapper_save_all_cfg(); void init_dict(string flag_load); void set_data_cfg(); diff --git a/source/util.cc b/source/util.cc index 8d8c496..09ed1f5 100644 --- a/source/util.cc +++ b/source/util.cc @@ -1,6 +1,24 @@ #include "util.h" namespace Utils { + +string format_str_size(int num, int index) { + string value = ""; + value = to_string(num); + if (num == 0) { + return value; + } + if (index == 1) { + value += "M"; + } + else if (index == 2) { + value += "G"; + } + else if (index == 3) { + value += "T"; + } + return value; +} array, 5> read_csv(const string& filename) { array, 5> array_vectors; diff --git a/source/util.h b/source/util.h index 603e9a3..2415ba8 100644 --- a/source/util.h +++ b/source/util.h @@ -16,6 +16,7 @@ struct Passwd { int uid; }; +string format_str_size(int num, int index); std::array, 5> read_csv(const std::string& filename); std::string call(std::string cmd); vector find_all(string &str_ntp, string substr); From 8c4d8bbf7b82845f15d446bc592221d28bf9f76d Mon Sep 17 00:00:00 2001 From: Igor Belitskiy Date: Fri, 14 Apr 2023 15:12:27 +0000 Subject: [PATCH 27/51] =?UTF-8?q?=D0=9D=D0=B0=D1=87=D0=B0=D0=BB=20=D0=BF?= =?UTF-8?q?=D0=B8=D1=81=D0=B0=D1=82=D1=8C=20=D0=BE=D0=B1=D0=B2=D0=B5=D1=80?= =?UTF-8?q?=D1=82=D0=BA=D1=83=20=D0=B4=D0=BB=D1=8F=20=D0=B1=D1=8D=D0=BA?= =?UTF-8?q?=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- source/CMakeLists.txt | 3 +++ source/controler.cc | 2 ++ source/controler.h | 6 ++++++ source/global_var.h | 2 +- source/main.cc | 1 - source/my_plug.cc | 2 +- source/my_plug.h | 3 ++- source/system_cmd_quotas.cc | 36 +++++++++++++++++--------------- source/system_cmd_quotas.h | 4 ++-- source/ubl-settings-diskquota.cc | 7 ++++--- source/ubl-settings-diskquota.h | 9 ++++---- ubl-settings-diskquota.glade | 2 ++ 12 files changed, 46 insertions(+), 31 deletions(-) diff --git a/source/CMakeLists.txt b/source/CMakeLists.txt index 86480bb..47b4319 100644 --- a/source/CMakeLists.txt +++ b/source/CMakeLists.txt @@ -20,6 +20,9 @@ set(SOURCE_FILES ubl-settings-diskquota.cc system_cmd_quotas.cc system_cmd_quotas.h + controler.h + global_var.h + controler.cc my_device.h my_device.cc project_lib.h diff --git a/source/controler.cc b/source/controler.cc index e69de29..3923ec1 100644 --- a/source/controler.cc +++ b/source/controler.cc @@ -0,0 +1,2 @@ +#include "controler.h" +Back_Back::Back_Back() {} \ No newline at end of file diff --git a/source/controler.h b/source/controler.h index e69de29..eeacf19 100644 --- a/source/controler.h +++ b/source/controler.h @@ -0,0 +1,6 @@ +#include "system_cmd_quotas.h" + +class Back_Back{ + public: + Back_Back(); +}; \ No newline at end of file diff --git a/source/global_var.h b/source/global_var.h index e88d924..22f6316 100644 --- a/source/global_var.h +++ b/source/global_var.h @@ -1,3 +1,3 @@ #include "project_lib.h" -#include "my_tupe.h" \ No newline at end of file +#include "my_type.h" diff --git a/source/main.cc b/source/main.cc index fc79f20..1d97603 100644 --- a/source/main.cc +++ b/source/main.cc @@ -1,4 +1,3 @@ -#include "ubl-settings-diskquota.h" #include "my_plug.h" void pars_flag(int index_start, int argc, char* argv[]); diff --git a/source/my_plug.cc b/source/my_plug.cc index ba95ed8..6294ab4 100644 --- a/source/my_plug.cc +++ b/source/my_plug.cc @@ -2,7 +2,7 @@ #define MY_PLUG_H #include "my_plug.h" -#include "ubl-settings-diskquota.h" + CmdArgParser::CmdArgParser(const std::string& p_name, const std::string& p_description, const std::string& p_help) : Glib::OptionGroup{p_name, p_description, p_help} { diff --git a/source/my_plug.h b/source/my_plug.h index 7b98857..20a0916 100644 --- a/source/my_plug.h +++ b/source/my_plug.h @@ -1,5 +1,6 @@ #include "project_lib.h" - +#include "ubl-settings-diskquota.h" +#include "global_var.h" class CmdArgParser : public Glib::OptionGroup { public: diff --git a/source/system_cmd_quotas.cc b/source/system_cmd_quotas.cc index 1b2ad1e..c4da725 100644 --- a/source/system_cmd_quotas.cc +++ b/source/system_cmd_quotas.cc @@ -21,8 +21,7 @@ void Quotas_sys::format_cmd_quotas_system(struct struct_quotas& _struct_quota) { (*map_gui_cfg)[key] = value; } -void Quotas_sys::off_quota_ubconfig(Gtk::ComboBoxText* combo_box, string quota_type) { - string partition = combo_box->get_active_text(); +void Quotas_sys::off_quota_ubconfig(string partition, string quota_type) { string key = "DISK_QUOTA[" + quota_type + ":" + partition + "]"; string value = "disable"; (*map_gui_cfg)[key] = value; @@ -87,6 +86,7 @@ struct status_quotas Quotas_sys::check_on_quotas_system_2_hw(string params) { return status; } + bool Quotas_sys::on_quota_hw(string partition, string cmd_hw, string cmd_sw) { if (map_hw_or_sw.find(partition) != map_hw_or_sw.end()) { if (map_hw_or_sw[partition] == "hw") { @@ -103,57 +103,59 @@ bool Quotas_sys::on_quota_hw(string partition, string cmd_hw, string cmd_sw) { return false; } } - return false; } + bool Quotas_sys::on_quota_sw(string partition, int mode) { if (map_hw_or_sw.find(partition) != map_hw_or_sw.end()) { string cmd = ""; if (mode == 0) { cmd += "mount -vo remount,usrquota " + partition; - cmd += "quotacheck -ucm " + partition; - cmd += "quotaon -uv " + partition; + cmd += "; quotacheck -ucm " + partition; + cmd += "; quotaon -uv " + partition; } else if (mode == 1) { - cmd += "mount -vo remount,grpquota " + partition; - cmd += "quotacheck -gcm " + partition; - cmd += "quotaon -gv " + partition; + cmd += "; mount -vo remount,grpquota " + partition; + cmd += "; quotacheck -gcm " + partition; + cmd += "; quotaon -gv " + partition; } else if (mode == 2) { - cmd += "quotaon -ugPv " + partition; + cmd += "; quotaon -ugPv " + partition; } else if (mode == 3) { - cmd += "quotaon -augPv"; + cmd += "; quotaon -augPv"; } else { return false; } - cmd += "ubconfig set config SERVICESSTART+=,quotaon.service"; + cmd += "; ubconfig set config SERVICESSTART+=,quotaon.service"; obj_process_system.call(cmd, ""); return true; } return false; - } -void Quotas_sys::off_quota_system(Gtk::ComboBoxText* combo_box, string quota_type) { - string partition = combo_box->get_active_text(); +bool Quotas_sys::off_quota_system(string partition, string quota_hw, string quota_sw) { string cmd = ""; if (map_hw_or_sw.find(partition) != map_hw_or_sw.end()) { if (map_hw_or_sw[partition] == "hw") { - cmd = "tune2fs -Q ^" + quota_type + " " + partition; + cmd = quota_hw + " " + partition; + return true; } else if (map_hw_or_sw[partition] == "sw") { - cmd = "quotaoff -u " + quota_type.substr(0,1) + " " + partition; - + cmd = quota_sw + " " + partition; + return true; } else { // TODO: // Убрать после тестирования throw "Опа цэ!"; + return false; } obj_process_system.call(cmd, ""); } + return false; } + } \ No newline at end of file diff --git a/source/system_cmd_quotas.h b/source/system_cmd_quotas.h index 71d8f08..a75b458 100644 --- a/source/system_cmd_quotas.h +++ b/source/system_cmd_quotas.h @@ -18,8 +18,8 @@ class Quotas_sys { void set_map_gui(map_str_str &map_gui); void format_cmd_quotas_ubconfig(struct struct_quotas& _struct_quota); void format_cmd_quotas_system(struct struct_quotas& _struct_quota); - void off_quota_ubconfig(Gtk::ComboBoxText* combo_box, string quota_type); - void off_quota_system(Gtk::ComboBoxText* combo_box, string quota_type); + void off_quota_ubconfig(string partition, string quota_type); + bool off_quota_system(string partition, string quota_hw, string quota_sw); bool check_on_quotas_system(string cmd); struct status_quotas check_on_quotas_system_2_hw(string params); bool on_quota_hw(string partition, string cmd_hw, string cmd_sw); diff --git a/source/ubl-settings-diskquota.cc b/source/ubl-settings-diskquota.cc index af9fcc1..ded33a9 100755 --- a/source/ubl-settings-diskquota.cc +++ b/source/ubl-settings-diskquota.cc @@ -301,6 +301,7 @@ void MainWindow::add_CSS() { } headLabel_css->add_class("textHead"); } + /* void init_treeview_user() { @@ -478,8 +479,8 @@ void MainWindow::get_builder() { void MainWindow::event() { quotegroupSaveButton->signal_clicked().connect([&]() {}); - btnDeleteGroupQuota->signal_clicked().connect([&]() {obj_quotas_sys.off_quota_ubconfig(groupsDeviceCombo, "grpquota");}); - btnDeleteUserQuota->signal_clicked().connect([&]() {obj_quotas_sys.off_quota_ubconfig(usersDeviceCombo, "usrquota");}); + btnDeleteGroupQuota->signal_clicked().connect([&]() {obj_quotas_sys.off_quota_ubconfig(groupsDeviceCombo->get_active_text(), "grpquota");}); + btnDeleteUserQuota->signal_clicked().connect([&]() {obj_quotas_sys.off_quota_ubconfig(usersDeviceCombo->get_active_text(), "usrquota");}); btnLoadGlob->signal_activate().connect([&]() {this->load_global_cfg();}); btnLoadLocal->signal_activate().connect([&]() {this->load_system_cfg();}); btnSynopsis->signal_activate().connect([&]() {this->synopsis_show();}); @@ -516,7 +517,7 @@ void MainWindow::event() { ,quotegroupFilesHarLimitLabel); }); quotegroupCancelButton->signal_clicked().connect([&]() {QuotasEditWindow->hide();}); - QuotasEditWindow->show(); + // QuotasEditWindow->show(); } void MainWindow::wrapper_settings_quotas_temp(string save_user_or_group) { diff --git a/source/ubl-settings-diskquota.h b/source/ubl-settings-diskquota.h index e9b4e89..d28e77e 100644 --- a/source/ubl-settings-diskquota.h +++ b/source/ubl-settings-diskquota.h @@ -7,11 +7,8 @@ #include "my_process.h" #include "my_type.h" #include "my_device.h" -#include "system_cmd_quotas.h" - - -extern int socket_ext_id_I; -extern int socket_trd_id_I; +#include "controler.h" +#include "global_var.h" using namespace std; @@ -23,6 +20,8 @@ extern const string path_css; extern const string path_img_head_background; extern string version_application; +extern int socket_ext_id_I; +extern int socket_trd_id_I; class MainWindow : public Gtk::ApplicationWindow { public: class ModelColumns : public Gtk::TreeModel::ColumnRecord { diff --git a/ubl-settings-diskquota.glade b/ubl-settings-diskquota.glade index 5cb60aa..21a4d56 100644 --- a/ubl-settings-diskquota.glade +++ b/ubl-settings-diskquota.glade @@ -615,7 +615,9 @@ False + center com.ublinux.ubl-settings-diskquota + center True From 61a401c9e99b2c39fc34af5cafdad7eb7104c483 Mon Sep 17 00:00:00 2001 From: Igor Belitskiy Date: Fri, 14 Apr 2023 17:58:44 +0600 Subject: [PATCH 28/51] fix --- source/CMakeLists.txt | 1 - source/global_var.h | 3 --- source/load.cc | 2 +- source/my_plug.h | 1 - source/my_type.h | 2 ++ source/system_cmd_quotas.cc | 27 +++++++++++++++++++++++++++ source/system_cmd_quotas.h | 3 +++ source/ubl-settings-diskquota.cc | 1 + source/ubl-settings-diskquota.h | 1 - 9 files changed, 34 insertions(+), 7 deletions(-) delete mode 100644 source/global_var.h diff --git a/source/CMakeLists.txt b/source/CMakeLists.txt index 47b4319..6f07a84 100644 --- a/source/CMakeLists.txt +++ b/source/CMakeLists.txt @@ -21,7 +21,6 @@ set(SOURCE_FILES system_cmd_quotas.cc system_cmd_quotas.h controler.h - global_var.h controler.cc my_device.h my_device.cc diff --git a/source/global_var.h b/source/global_var.h deleted file mode 100644 index 22f6316..0000000 --- a/source/global_var.h +++ /dev/null @@ -1,3 +0,0 @@ - -#include "project_lib.h" -#include "my_type.h" diff --git a/source/load.cc b/source/load.cc index e8a361b..200c4b3 100644 --- a/source/load.cc +++ b/source/load.cc @@ -36,4 +36,4 @@ namespace Lib_Load{ return process.get_count_error(); } -} \ No newline at end of file +} diff --git a/source/my_plug.h b/source/my_plug.h index 20a0916..5d9a3d1 100644 --- a/source/my_plug.h +++ b/source/my_plug.h @@ -1,6 +1,5 @@ #include "project_lib.h" #include "ubl-settings-diskquota.h" -#include "global_var.h" class CmdArgParser : public Glib::OptionGroup { public: diff --git a/source/my_type.h b/source/my_type.h index cbf21fa..e4b0b7b 100644 --- a/source/my_type.h +++ b/source/my_type.h @@ -45,6 +45,8 @@ struct status_quotas { bool project; bool status; }; + + typedef struct users_grups USER_GRUPS; typedef map map_str_str; typedef map * map_s_s_ptr; diff --git a/source/system_cmd_quotas.cc b/source/system_cmd_quotas.cc index c4da725..e7cf0c3 100644 --- a/source/system_cmd_quotas.cc +++ b/source/system_cmd_quotas.cc @@ -158,4 +158,31 @@ bool Quotas_sys::off_quota_system(string partition, string quota_hw, string quot } +void Quotas_sys::pars_data(string cmd) { + string start_pars = "------\n"; + string response = obj_process_call.call_all_sections(cmd); + size_t index_start = response.find(start_pars); + string line_pars = ""; + int index = 0; + int old_index = index; + if (index_start!=string::npos) { + response = response.substr(index_start+start_pars.length(), response.length()); + vector vec_index_sep = Utils::find_all(response, "\n"); + cout << response.substr(0, vec_index_sep[0]) << endl; + for (size_t i = 0; i < vec_index_sep.size(); i++) { + old_index = index; + index = vec_index_sep[i]; + if (index-1 == old_index) { + break; + } + line_pars = line_pars.substr(old_index, index); + part_quotas_line(line_pars); + } + } +} +struct status_quotas part_quotas_line(string line) { + vector vec_index_sep = Utils::find_all(response, "\t"); + cout << vec_index_sep.size() << endl; +} + } \ No newline at end of file diff --git a/source/system_cmd_quotas.h b/source/system_cmd_quotas.h index a75b458..f0df3aa 100644 --- a/source/system_cmd_quotas.h +++ b/source/system_cmd_quotas.h @@ -24,6 +24,9 @@ class Quotas_sys { struct status_quotas check_on_quotas_system_2_hw(string params); bool on_quota_hw(string partition, string cmd_hw, string cmd_sw); bool on_quota_sw(string partition, int mode); + void pars_data(string cmd); + protected: + struct status_quotas part_quotas_line(string line); }; } #endif \ No newline at end of file diff --git a/source/ubl-settings-diskquota.cc b/source/ubl-settings-diskquota.cc index ded33a9..2dcdcaa 100755 --- a/source/ubl-settings-diskquota.cc +++ b/source/ubl-settings-diskquota.cc @@ -59,6 +59,7 @@ void MainWindow::settings() { this->load_system_cfg(); this->load_global_cfg(); this->event(); + obj_quotas_sys.pars_data("repquota -pu /mnt/ext4"); } else { boxFuncs->set_sensitive(false); diff --git a/source/ubl-settings-diskquota.h b/source/ubl-settings-diskquota.h index d28e77e..9a2307d 100644 --- a/source/ubl-settings-diskquota.h +++ b/source/ubl-settings-diskquota.h @@ -8,7 +8,6 @@ #include "my_type.h" #include "my_device.h" #include "controler.h" -#include "global_var.h" using namespace std; From 68426f9c7ee0071f0bd981ce848c20323ba23cf5 Mon Sep 17 00:00:00 2001 From: Igor Belitskiy Date: Mon, 17 Apr 2023 11:06:22 +0600 Subject: [PATCH 29/51] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=20=D0=BF=D0=B0=D1=80=D1=81=D0=B5=D1=80=20=D0=BA?= =?UTF-8?q?=D0=B2=D0=BE=D1=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- source/my_type.h | 14 ++++++++- source/system_cmd_quotas.cc | 61 ++++++++++++++++++++++++++++++++----- source/system_cmd_quotas.h | 4 +-- 3 files changed, 68 insertions(+), 11 deletions(-) diff --git a/source/my_type.h b/source/my_type.h index e4b0b7b..0b55a2e 100644 --- a/source/my_type.h +++ b/source/my_type.h @@ -2,6 +2,7 @@ #define MY_TYPE_H #include "project_lib.h" +#include using namespace std; @@ -45,7 +46,18 @@ struct status_quotas { bool project; bool status; }; - +struct data_all_quotas { + string username; + string status; + string block_used; + string block_soft; + string block_hard; + string block_grace; + string file_used; + string file_soft; + string file_hard; + string file_grace; +}; typedef struct users_grups USER_GRUPS; typedef map map_str_str; diff --git a/source/system_cmd_quotas.cc b/source/system_cmd_quotas.cc index e7cf0c3..e7de561 100644 --- a/source/system_cmd_quotas.cc +++ b/source/system_cmd_quotas.cc @@ -1,4 +1,5 @@ #include "system_cmd_quotas.h" +#include "my_type.h" namespace Quotas_sys { Quotas_sys::Quotas_sys() { @@ -158,31 +159,75 @@ bool Quotas_sys::off_quota_system(string partition, string quota_hw, string quot } -void Quotas_sys::pars_data(string cmd) { +vector Quotas_sys::pars_data(string cmd) { string start_pars = "------\n"; string response = obj_process_call.call_all_sections(cmd); size_t index_start = response.find(start_pars); string line_pars = ""; + struct data_all_quotas struct_data; + vector vec_struct_data; int index = 0; int old_index = index; - if (index_start!=string::npos) { + if (index_start != string::npos) { response = response.substr(index_start+start_pars.length(), response.length()); vector vec_index_sep = Utils::find_all(response, "\n"); - cout << response.substr(0, vec_index_sep[0]) << endl; for (size_t i = 0; i < vec_index_sep.size(); i++) { old_index = index; index = vec_index_sep[i]; if (index-1 == old_index) { break; } - line_pars = line_pars.substr(old_index, index); - part_quotas_line(line_pars); + line_pars = response.substr(old_index, index); + struct_data = part_quotas_line(line_pars); + vec_struct_data.push_back(struct_data); } } } -struct status_quotas part_quotas_line(string line) { - vector vec_index_sep = Utils::find_all(response, "\t"); - cout << vec_index_sep.size() << endl; + +struct data_all_quotas Quotas_sys::part_quotas_line(string line) { + struct data_all_quotas struct_data; + vector vec_index_sep = Utils::find_all(line, " "); + int old_index = 0; + string buff = ""; + int index_data = 0; + for (int& index: vec_index_sep) { + if ((index - old_index) >= 2) { + buff = line.substr(old_index, index - old_index); + if (index_data == 0) { + struct_data.username = buff; + } + else if (index_data == 1) { + struct_data.status = buff; + } + else if (index_data == 2) { + struct_data.block_used = buff; + } + else if (index_data == 3) { + struct_data.block_soft = buff; + } + else if (index_data == 4) { + struct_data.block_hard = buff; + } + else if (index_data == 5) { + struct_data.block_grace = buff; + } + else if (index_data == 6) { + struct_data.file_used = buff; + } + else if (index_data == 7) { + struct_data.file_soft = buff; + } + else if (index_data == 8) { + struct_data.file_hard = buff; + } + else if (index == 9) { + struct_data.file_grace = buff; + } + index_data += 1; + } + old_index = index; + } + return struct_data; } } \ No newline at end of file diff --git a/source/system_cmd_quotas.h b/source/system_cmd_quotas.h index f0df3aa..7ff0809 100644 --- a/source/system_cmd_quotas.h +++ b/source/system_cmd_quotas.h @@ -24,9 +24,9 @@ class Quotas_sys { struct status_quotas check_on_quotas_system_2_hw(string params); bool on_quota_hw(string partition, string cmd_hw, string cmd_sw); bool on_quota_sw(string partition, int mode); - void pars_data(string cmd); + vector pars_data(string cmd); protected: - struct status_quotas part_quotas_line(string line); + struct data_all_quotas part_quotas_line(string line); }; } #endif \ No newline at end of file From fd1001e359c440319fe8cd4402cfe1b5ba3e3bed Mon Sep 17 00:00:00 2001 From: Igor Belitskiy Date: Mon, 17 Apr 2023 11:50:43 +0600 Subject: [PATCH 30/51] =?UTF-8?q?=D0=A4=D1=83=D0=BD=D0=BA=D1=86=D0=B8?= =?UTF-8?q?=D0=BE=D0=BD=D0=B0=D0=BB=20=D0=B4=D0=BB=D1=8F=20=D1=80=D0=B0?= =?UTF-8?q?=D0=B1=D0=BE=D1=82=D1=8B=20=D1=81=20=D0=BA=D0=B2=D0=BE=D1=82?= =?UTF-8?q?=D0=B0=D0=BC=D0=B8=20=D0=B2=D1=8B=D0=BD=D0=B5=D1=81=D0=B5=D0=BD?= =?UTF-8?q?=20=D0=BE=D1=82=D0=B4=D0=B5=D0=BB=D1=8C=D0=BD=D1=8B=D0=B9=20?= =?UTF-8?q?=D1=84=D0=B0=D0=B9=D0=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- source/CMakeLists.txt | 6 +++-- source/controler.h | 3 ++- ...{system_cmd_quotas.cc => system_quotas.cc} | 23 +++------------- .../{system_cmd_quotas.h => system_quotas.h} | 2 -- source/ubconfig_quotas.cc | 26 +++++++++++++++++++ source/ubconfig_quotas.h | 25 ++++++++++++++++++ source/ubl-settings-diskquota.cc | 8 +++--- source/ubl-settings-diskquota.h | 5 +++- 8 files changed, 68 insertions(+), 30 deletions(-) rename source/{system_cmd_quotas.cc => system_quotas.cc} (90%) rename source/{system_cmd_quotas.h => system_quotas.h} (87%) create mode 100644 source/ubconfig_quotas.cc create mode 100644 source/ubconfig_quotas.h diff --git a/source/CMakeLists.txt b/source/CMakeLists.txt index 6f07a84..9a7a9cb 100644 --- a/source/CMakeLists.txt +++ b/source/CMakeLists.txt @@ -18,8 +18,10 @@ set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -pedantic -Wall -Wextra -Werror -Wmissin set(SOURCE_FILES ubl-settings-diskquota.h ubl-settings-diskquota.cc - system_cmd_quotas.cc - system_cmd_quotas.h + ubconfig_quotas.h + ubconfig_quotas.cc + system_quotas.h + system_quotas.cc controler.h controler.cc my_device.h diff --git a/source/controler.h b/source/controler.h index eeacf19..aac6bb1 100644 --- a/source/controler.h +++ b/source/controler.h @@ -1,4 +1,5 @@ -#include "system_cmd_quotas.h" +#include "system_quotas.h" +#include "ubconfig_quotas.h" class Back_Back{ public: diff --git a/source/system_cmd_quotas.cc b/source/system_quotas.cc similarity index 90% rename from source/system_cmd_quotas.cc rename to source/system_quotas.cc index e7de561..13b5c81 100644 --- a/source/system_cmd_quotas.cc +++ b/source/system_quotas.cc @@ -1,32 +1,14 @@ -#include "system_cmd_quotas.h" +#include "system_quotas.h" #include "my_type.h" namespace Quotas_sys { + Quotas_sys::Quotas_sys() { map_hw_or_sw["ext2"] = "hw"; map_hw_or_sw["ext3"] = "hw"; map_hw_or_sw["nfs"] = "sw"; map_hw_or_sw["NFS"] = "sw"; } -void Quotas_sys::format_cmd_quotas_ubconfig(struct struct_quotas& _struct_quota) { - string key = "DISK_QUOTA["; - key += ":" + _struct_quota.device + "]"; - string value = _struct_quota.name + ":" + _struct_quota.cmd; - (*map_gui_cfg)[key] = value; -} - -void Quotas_sys::format_cmd_quotas_system(struct struct_quotas& _struct_quota) { - string key = "DISK_QUOTA["; - key += ":" + _struct_quota.device + "]"; - string value = _struct_quota.name + ":" + _struct_quota.cmd; - (*map_gui_cfg)[key] = value; -} - -void Quotas_sys::off_quota_ubconfig(string partition, string quota_type) { - string key = "DISK_QUOTA[" + quota_type + ":" + partition + "]"; - string value = "disable"; - (*map_gui_cfg)[key] = value; -} void Quotas_sys::set_map_gui(map_str_str &map_gui) { map_gui_cfg = &map_gui; @@ -182,6 +164,7 @@ vector Quotas_sys::pars_data(string cmd) { vec_struct_data.push_back(struct_data); } } + return vec_struct_data; } struct data_all_quotas Quotas_sys::part_quotas_line(string line) { diff --git a/source/system_cmd_quotas.h b/source/system_quotas.h similarity index 87% rename from source/system_cmd_quotas.h rename to source/system_quotas.h index 7ff0809..5362407 100644 --- a/source/system_cmd_quotas.h +++ b/source/system_quotas.h @@ -16,9 +16,7 @@ class Quotas_sys { public: Quotas_sys(); void set_map_gui(map_str_str &map_gui); - void format_cmd_quotas_ubconfig(struct struct_quotas& _struct_quota); void format_cmd_quotas_system(struct struct_quotas& _struct_quota); - void off_quota_ubconfig(string partition, string quota_type); bool off_quota_system(string partition, string quota_hw, string quota_sw); bool check_on_quotas_system(string cmd); struct status_quotas check_on_quotas_system_2_hw(string params); diff --git a/source/ubconfig_quotas.cc b/source/ubconfig_quotas.cc new file mode 100644 index 0000000..2471cdd --- /dev/null +++ b/source/ubconfig_quotas.cc @@ -0,0 +1,26 @@ +#include "ubconfig_quotas.h" + +namespace Quotas_ubconfig { + +void Quotas_ubconfig::format_cmd_quotas_ubconfig(struct struct_quotas& _struct_quota) { + string key = "DISK_QUOTA["; + key += ":" + _struct_quota.device + "]"; + string value = _struct_quota.name + ":" + _struct_quota.cmd; + (*map_gui_cfg)[key] = value; +} + +void Quotas_ubconfig::off_quota_ubconfig(string partition, string quota_type) { + string key = "DISK_QUOTA[" + quota_type + ":" + partition + "]"; + string value = "disable"; + (*map_gui_cfg)[key] = value; +} +void Quotas_ubconfig::set_map_gui(map_str_str &map_gui) { + map_gui_cfg = &map_gui; +} +Quotas_ubconfig::Quotas_ubconfig() { + map_hw_or_sw["ext2"] = "hw"; + map_hw_or_sw["ext3"] = "hw"; + map_hw_or_sw["nfs"] = "sw"; + map_hw_or_sw["NFS"] = "sw"; +} +} \ No newline at end of file diff --git a/source/ubconfig_quotas.h b/source/ubconfig_quotas.h new file mode 100644 index 0000000..b108ff1 --- /dev/null +++ b/source/ubconfig_quotas.h @@ -0,0 +1,25 @@ +#ifndef UBCONFIG_QUOTAS +#define UBCONFIG_QUOTAS + +#include "project_lib.h" +#include "my_type.h" +#include "my_process.h" +#include "util.h" + +namespace Quotas_ubconfig { + + +class Quotas_ubconfig{ + public: + map_str_str map_hw_or_sw; + + map_str_str* map_gui_cfg; + My_Process::My_Process_system obj_process_system = My_Process::My_Process_system(); + My_Process::My_Process_call obj_process_call = My_Process::My_Process_call(); + Quotas_ubconfig(); + void off_quota_ubconfig(string partition, string quota_type); + void format_cmd_quotas_ubconfig(struct struct_quotas& _struct_quota); + void set_map_gui(map_str_str &map_gui); +}; +} +#endif diff --git a/source/ubl-settings-diskquota.cc b/source/ubl-settings-diskquota.cc index 2dcdcaa..a65586b 100755 --- a/source/ubl-settings-diskquota.cc +++ b/source/ubl-settings-diskquota.cc @@ -55,11 +55,11 @@ void MainWindow::settings() { ,quotegroupFilesHardLimitSpin ,quotegroupFilesHarLimitLabel); obj_quotas_sys.set_map_gui(map_gui_cfg); + obj_quotas_ubconfig.set_map_gui(map_gui_cfg); if (geteuid() == 0) { this->load_system_cfg(); this->load_global_cfg(); this->event(); - obj_quotas_sys.pars_data("repquota -pu /mnt/ext4"); } else { boxFuncs->set_sensitive(false); @@ -480,8 +480,8 @@ void MainWindow::get_builder() { void MainWindow::event() { quotegroupSaveButton->signal_clicked().connect([&]() {}); - btnDeleteGroupQuota->signal_clicked().connect([&]() {obj_quotas_sys.off_quota_ubconfig(groupsDeviceCombo->get_active_text(), "grpquota");}); - btnDeleteUserQuota->signal_clicked().connect([&]() {obj_quotas_sys.off_quota_ubconfig(usersDeviceCombo->get_active_text(), "usrquota");}); + btnDeleteGroupQuota->signal_clicked().connect([&]() {obj_quotas_ubconfig.off_quota_ubconfig(groupsDeviceCombo->get_active_text(), "grpquota");}); + btnDeleteUserQuota->signal_clicked().connect([&]() {obj_quotas_ubconfig.off_quota_ubconfig(usersDeviceCombo->get_active_text(), "usrquota");}); btnLoadGlob->signal_activate().connect([&]() {this->load_global_cfg();}); btnLoadLocal->signal_activate().connect([&]() {this->load_system_cfg();}); btnSynopsis->signal_activate().connect([&]() {this->synopsis_show();}); @@ -532,7 +532,7 @@ void MainWindow::wrapper_settings_quotas_temp(string save_user_or_group) { _struct_quota.cmd = cmd; _struct_quota.type_quotas = type_quotas; _struct_quota.name = user; - obj_quotas_sys.format_cmd_quotas_ubconfig(_struct_quota); + obj_quotas_ubconfig.format_cmd_quotas_ubconfig(_struct_quota); } diff --git a/source/ubl-settings-diskquota.h b/source/ubl-settings-diskquota.h index 9a2307d..24dea4a 100644 --- a/source/ubl-settings-diskquota.h +++ b/source/ubl-settings-diskquota.h @@ -7,7 +7,9 @@ #include "my_process.h" #include "my_type.h" #include "my_device.h" -#include "controler.h" +#include "system_quotas.h" +#include "ubconfig_quotas.h" + using namespace std; @@ -204,6 +206,7 @@ class MainWindow : public Gtk::ApplicationWindow { Lib_Load::Load obj_load = Lib_Load::Load(); Devices::Parted obj_device = Devices::Parted(); Quotas_sys::Quotas_sys obj_quotas_sys = Quotas_sys::Quotas_sys(); + Quotas_ubconfig::Quotas_ubconfig obj_quotas_ubconfig = Quotas_ubconfig::Quotas_ubconfig(); My_Process::My_Process_system obj_process_system = My_Process::My_Process_system(); My_Process::My_Process_call obj_process_call = My_Process::My_Process_call(); map_str_str map_gui_cfg; From 66c3eb5a416c5fa78a1d7a9f2cc5b9f8cca21c50 Mon Sep 17 00:00:00 2001 From: Igor Belitskiy Date: Mon, 17 Apr 2023 15:13:21 +0600 Subject: [PATCH 31/51] =?UTF-8?q?=D0=9D=D0=B0=D1=87=D0=B0=D0=BB=20=D1=80?= =?UTF-8?q?=D0=B0=D0=B1=D0=BE=D1=82=D1=83=20=D0=BD=D0=B0=D0=B4=20=D0=BE?= =?UTF-8?q?=D0=B1=D0=B2=D1=91=D1=80=D1=82=D0=BA=D0=BE=D0=B9=20=D0=BA=D0=BB?= =?UTF-8?q?=D0=B0=D1=81=D1=81=D0=BE=D0=B2=20=D1=80=D0=B0=D0=B1=D0=BE=D1=82?= =?UTF-8?q?=D0=B0=D1=8E=D1=89=D0=B8=D1=85=20=D1=81=20=D0=B1=D1=8D=D0=BA?= =?UTF-8?q?=D0=B5=D0=BD=D0=B4=D0=BE=D0=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- source/CMakeLists.txt | 2 - source/controler.cc | 45 ++++++++++++++++- source/controler.h | 14 +++++- source/my_type.h | 1 + source/system_quotas.cc | 84 ++++++++++++++++++++++++++------ source/system_quotas.h | 9 +++- source/ubconfig_quotas.cc | 5 +- source/ubconfig_quotas.h | 4 +- source/ubl-settings-diskquota.cc | 6 +-- 9 files changed, 142 insertions(+), 28 deletions(-) diff --git a/source/CMakeLists.txt b/source/CMakeLists.txt index 9a7a9cb..f90aabc 100644 --- a/source/CMakeLists.txt +++ b/source/CMakeLists.txt @@ -22,8 +22,6 @@ set(SOURCE_FILES ubconfig_quotas.cc system_quotas.h system_quotas.cc - controler.h - controler.cc my_device.h my_device.cc project_lib.h diff --git a/source/controler.cc b/source/controler.cc index 3923ec1..822fb5d 100644 --- a/source/controler.cc +++ b/source/controler.cc @@ -1,2 +1,45 @@ #include "controler.h" -Back_Back::Back_Back() {} \ No newline at end of file +Back_Back::Back_Back() {} +void Back_Back::set_mode(string flag_mode) { + this->flag_mode = flag_mode; +} + +void Back_Back::set_partition(string partition) { + this->partition = partition; +} + +void Back_Back::set_sys_flag(string sys_flag) { + this->sys_flag = sys_flag; +} + +bool Back_Back::wrapper_off_quotas(string quotas_type) { + bool flag_status = false; + quotas_type = this->handler_quotas_type(quotas_type); + if (flag_mode == "system") { + string cmd_hw = ""; + string cmd_sw = ""; + flag_status = obj_quotas_sys.off_quota(partition, cmd_hw, cmd_sw); + } + else if (flag_mode == "ubconfig") { + flag_status = obj_quotas_ubconfig.off_quota(partition, quotas_type); + } + return flag_status; +} +bool Back_Back::wrapper_on_quotas(string quotas_type) { + bool flag_status = false; + quotas_type = this->handler_quotas_type(quotas_type); + if (flag_mode == "system") { + string cmd_hw = ""; + string cmd_sw = ""; + flag_status = obj_quotas_sys.on_quota_hw(partition, cmd_hw, cmd_sw); + flag_status = obj_quotas_sys.wrapper_on_quotas(partition, quotas_type); + } + else if (flag_mode == "ubconfig") { + flag_status = obj_quotas_ubconfig.format_cmd_quotas(); + } + return flag_status; +} + +string Back_Back::handler_quotas_type(string quotas_type) { + return quotas_type; +} \ No newline at end of file diff --git a/source/controler.h b/source/controler.h index aac6bb1..263493c 100644 --- a/source/controler.h +++ b/source/controler.h @@ -3,5 +3,17 @@ class Back_Back{ public: - Back_Back(); + string flag_mode; + string partition; + string sys_flag; + Quotas_sys::Quotas_sys obj_quotas_sys = Quotas_sys::Quotas_sys(); + Quotas_ubconfig::Quotas_ubconfig obj_quotas_ubconfig = Quotas_ubconfig::Quotas_ubconfig(); + public: + Back_Back(); + void set_mode(string flag_mode); + void set_partition(string partition); + void set_sys_flag(string sys_flag); + bool wrapper_off_quotas(string quotas_type); + string handler_quotas_type(string quotas_type); + bool wrapper_on_quotas(string quotas_type); }; \ No newline at end of file diff --git a/source/my_type.h b/source/my_type.h index 0b55a2e..9439f14 100644 --- a/source/my_type.h +++ b/source/my_type.h @@ -57,6 +57,7 @@ struct data_all_quotas { string file_soft; string file_hard; string file_grace; + bool is_validate; }; typedef struct users_grups USER_GRUPS; diff --git a/source/system_quotas.cc b/source/system_quotas.cc index 13b5c81..f5f5dcb 100644 --- a/source/system_quotas.cc +++ b/source/system_quotas.cc @@ -10,10 +10,40 @@ Quotas_sys::Quotas_sys() { map_hw_or_sw["NFS"] = "sw"; } +void Quotas_sys::set_map_device(map_str_str &map_device) { + this->map_device = &map_device; + this->check_partition_mount(); +} + void Quotas_sys::set_map_gui(map_str_str &map_gui) { map_gui_cfg = &map_gui; } +void Quotas_sys::check_partition_mount() { + string key = ""; + // Todo: + // Заменить на чтение файла средствами с++ + string response = obj_process_call.call_all_sections("cat /proc/mounts"); + for (const auto& iter: (*map_device)) { + key = iter.first; + if (response.find(key) != string::npos) { + disk_mount[key] = true; + } + } +} + +string Quotas_sys::wrapper_hw_sw(string partition) { + + if ((*map_device).find(partition) != (*map_device).end()) { + string fsystem = (*map_device)[partition]; + if ((*map_device).find(fsystem) != (*map_device).end()) { + return map_hw_or_sw[fsystem]; + } + } + return ""; + +} + bool Quotas_sys::check_on_quotas_system(string cmd) { string response = obj_process_call.call_all_sections(cmd); if (response.length() > 0) { @@ -70,26 +100,47 @@ struct status_quotas Quotas_sys::check_on_quotas_system_2_hw(string params) { } +bool Quotas_sys::wrapper_on_quotas(string partition, string flag_mode) { + // Todo + // Добавить выключение квот в зависимости от диска + cout << partition << "" << flag_mode << endl; + if (disk_mount.find(partition) == disk_mount.end()) { + + } + else { + + } + return true; + } + bool Quotas_sys::on_quota_hw(string partition, string cmd_hw, string cmd_sw) { - if (map_hw_or_sw.find(partition) != map_hw_or_sw.end()) { - if (map_hw_or_sw[partition] == "hw") { - obj_process_system.call(cmd_hw, ""); - obj_process_system.call("ubconfig set config SERVICESSTART+=,quotaon.service", ""); - return true; - } - else if (map_hw_or_sw[partition] == "sw") { - obj_process_system.call(cmd_sw, ""); - obj_process_system.call("ubconfig set config SERVICESSTART+=,quotaon.service", ""); - return true; - } - else{ - return false; - } + /* + Включить квоты, только для HW ext2,3,4: + Если ФС, уже существует и без HW атрибут квот ext2,3,4 + Раздел должен быть отмонтирован + */ + if (this->wrapper_hw_sw(partition) == "hw") { + obj_process_system.call(cmd_hw, ""); + obj_process_system.call("ubconfig set config SERVICESSTART+=,quotaon.service", ""); + return true; + } + else if (this->wrapper_hw_sw(partition) == "sw") { + obj_process_system.call(cmd_sw, ""); + obj_process_system.call("ubconfig set config SERVICESSTART+=,quotaon.service", ""); + return true; + } + else{ + return false; } return false; } bool Quotas_sys::on_quota_sw(string partition, int mode) { + /* + Включить квоты, только для SW, другие ФС и сетевые NFS: + У этого исполнения квот отсутствуют проектные квоты prjquota + Раздел должен быть примонтирован + */ if (map_hw_or_sw.find(partition) != map_hw_or_sw.end()) { string cmd = ""; if (mode == 0) { @@ -118,7 +169,7 @@ bool Quotas_sys::on_quota_sw(string partition, int mode) { return false; } -bool Quotas_sys::off_quota_system(string partition, string quota_hw, string quota_sw) { +bool Quotas_sys::off_quota(string partition, string quota_hw, string quota_sw) { string cmd = ""; if (map_hw_or_sw.find(partition) != map_hw_or_sw.end()) { if (map_hw_or_sw[partition] == "hw") { @@ -176,6 +227,7 @@ struct data_all_quotas Quotas_sys::part_quotas_line(string line) { for (int& index: vec_index_sep) { if ((index - old_index) >= 2) { buff = line.substr(old_index, index - old_index); + cout << buff << endl; if (index_data == 0) { struct_data.username = buff; } @@ -210,6 +262,8 @@ struct data_all_quotas Quotas_sys::part_quotas_line(string line) { } old_index = index; } + if (index_data != 0) {struct_data.is_validate = true; } + else {struct_data.is_validate = false; } return struct_data; } diff --git a/source/system_quotas.h b/source/system_quotas.h index 5362407..fd25abc 100644 --- a/source/system_quotas.h +++ b/source/system_quotas.h @@ -9,20 +9,25 @@ namespace Quotas_sys { class Quotas_sys { public: map_str_str map_hw_or_sw; - + map_str_str* map_device; map_str_str* map_gui_cfg; + map disk_mount; My_Process::My_Process_system obj_process_system = My_Process::My_Process_system(); My_Process::My_Process_call obj_process_call = My_Process::My_Process_call(); public: Quotas_sys(); void set_map_gui(map_str_str &map_gui); + void check_partition_mount(); void format_cmd_quotas_system(struct struct_quotas& _struct_quota); - bool off_quota_system(string partition, string quota_hw, string quota_sw); + bool off_quota(string partition, string quota_hw, string quota_sw); bool check_on_quotas_system(string cmd); struct status_quotas check_on_quotas_system_2_hw(string params); bool on_quota_hw(string partition, string cmd_hw, string cmd_sw); bool on_quota_sw(string partition, int mode); vector pars_data(string cmd); + void set_map_device(map_str_str &map_device); + string wrapper_hw_sw(string partition); + bool wrapper_on_quotas(string partition, string flag_mode); protected: struct data_all_quotas part_quotas_line(string line); }; diff --git a/source/ubconfig_quotas.cc b/source/ubconfig_quotas.cc index 2471cdd..e420db6 100644 --- a/source/ubconfig_quotas.cc +++ b/source/ubconfig_quotas.cc @@ -2,17 +2,18 @@ namespace Quotas_ubconfig { -void Quotas_ubconfig::format_cmd_quotas_ubconfig(struct struct_quotas& _struct_quota) { +void Quotas_ubconfig::format_cmd_quotas(struct struct_quotas& _struct_quota) { string key = "DISK_QUOTA["; key += ":" + _struct_quota.device + "]"; string value = _struct_quota.name + ":" + _struct_quota.cmd; (*map_gui_cfg)[key] = value; } -void Quotas_ubconfig::off_quota_ubconfig(string partition, string quota_type) { +bool Quotas_ubconfig::off_quota(string partition, string quota_type) { string key = "DISK_QUOTA[" + quota_type + ":" + partition + "]"; string value = "disable"; (*map_gui_cfg)[key] = value; + return true; } void Quotas_ubconfig::set_map_gui(map_str_str &map_gui) { map_gui_cfg = &map_gui; diff --git a/source/ubconfig_quotas.h b/source/ubconfig_quotas.h index b108ff1..3df6291 100644 --- a/source/ubconfig_quotas.h +++ b/source/ubconfig_quotas.h @@ -17,8 +17,8 @@ class Quotas_ubconfig{ My_Process::My_Process_system obj_process_system = My_Process::My_Process_system(); My_Process::My_Process_call obj_process_call = My_Process::My_Process_call(); Quotas_ubconfig(); - void off_quota_ubconfig(string partition, string quota_type); - void format_cmd_quotas_ubconfig(struct struct_quotas& _struct_quota); + bool off_quota(string partition, string quota_type); + void format_cmd_quotas(struct struct_quotas& _struct_quota); void set_map_gui(map_str_str &map_gui); }; } diff --git a/source/ubl-settings-diskquota.cc b/source/ubl-settings-diskquota.cc index a65586b..da3ef3e 100755 --- a/source/ubl-settings-diskquota.cc +++ b/source/ubl-settings-diskquota.cc @@ -480,8 +480,8 @@ void MainWindow::get_builder() { void MainWindow::event() { quotegroupSaveButton->signal_clicked().connect([&]() {}); - btnDeleteGroupQuota->signal_clicked().connect([&]() {obj_quotas_ubconfig.off_quota_ubconfig(groupsDeviceCombo->get_active_text(), "grpquota");}); - btnDeleteUserQuota->signal_clicked().connect([&]() {obj_quotas_ubconfig.off_quota_ubconfig(usersDeviceCombo->get_active_text(), "usrquota");}); + btnDeleteGroupQuota->signal_clicked().connect([&]() {}); + btnDeleteUserQuota->signal_clicked().connect([&]() {}); btnLoadGlob->signal_activate().connect([&]() {this->load_global_cfg();}); btnLoadLocal->signal_activate().connect([&]() {this->load_system_cfg();}); btnSynopsis->signal_activate().connect([&]() {this->synopsis_show();}); @@ -532,7 +532,7 @@ void MainWindow::wrapper_settings_quotas_temp(string save_user_or_group) { _struct_quota.cmd = cmd; _struct_quota.type_quotas = type_quotas; _struct_quota.name = user; - obj_quotas_ubconfig.format_cmd_quotas_ubconfig(_struct_quota); + obj_quotas_ubconfig.format_cmd_quotas(_struct_quota); } From 4e543a45d5e6093d693abd9313fcd51feb733b08 Mon Sep 17 00:00:00 2001 From: Igor Belitskiy Date: Mon, 17 Apr 2023 15:25:02 +0600 Subject: [PATCH 32/51] =?UTF-8?q?=D0=A3=D0=B1=D1=80=D0=B0=D0=BB=20=D0=B2?= =?UTF-8?q?=D1=80=D0=B5=D0=BC=D0=B5=D0=BD=D0=BD=D1=8B=D0=B9=20=D0=BA=D0=BE?= =?UTF-8?q?=D0=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- source/system_quotas.cc | 17 +++++------------ source/util.cc | 14 ++++++++++++++ source/util.h | 1 + 3 files changed, 20 insertions(+), 12 deletions(-) diff --git a/source/system_quotas.cc b/source/system_quotas.cc index f5f5dcb..c92f609 100644 --- a/source/system_quotas.cc +++ b/source/system_quotas.cc @@ -21,9 +21,7 @@ void Quotas_sys::set_map_gui(map_str_str &map_gui) { void Quotas_sys::check_partition_mount() { string key = ""; - // Todo: - // Заменить на чтение файла средствами с++ - string response = obj_process_call.call_all_sections("cat /proc/mounts"); + string response = Utils::file_read("/proc/mounts"); for (const auto& iter: (*map_device)) { key = iter.first; if (response.find(key) != string::npos) { @@ -172,21 +170,16 @@ bool Quotas_sys::on_quota_sw(string partition, int mode) { bool Quotas_sys::off_quota(string partition, string quota_hw, string quota_sw) { string cmd = ""; if (map_hw_or_sw.find(partition) != map_hw_or_sw.end()) { - if (map_hw_or_sw[partition] == "hw") { + if (this->wrapper_hw_sw(partition) == "hw") { cmd = quota_hw + " " + partition; + obj_process_system.call(cmd, ""); return true; } - else if (map_hw_or_sw[partition] == "sw") { + else if (this->wrapper_hw_sw(partition) == "sw") { cmd = quota_sw + " " + partition; + obj_process_system.call(cmd, ""); return true; } - else { - // TODO: - // Убрать после тестирования - throw "Опа цэ!"; - return false; - } - obj_process_system.call(cmd, ""); } return false; diff --git a/source/util.cc b/source/util.cc index 09ed1f5..cb05f5b 100644 --- a/source/util.cc +++ b/source/util.cc @@ -213,4 +213,18 @@ int synopsis_show(string str_link) { } return system(cmd.c_str()); } + +string file_read(string filename) { + string line; + string buffer; + std::ifstream in(filename); // окрываем файл для чтения + if (in.is_open()) + { + while (getline(in, line)) + { + buffer += line; + } + } + return buffer; +} } \ No newline at end of file diff --git a/source/util.h b/source/util.h index 2415ba8..d857b72 100644 --- a/source/util.h +++ b/source/util.h @@ -27,5 +27,6 @@ unsigned short read_uid_min_max(string filename, string search); vector pars_users(); string read_passwd(string username); int synopsis_show(string str_link); +string file_read(string filename); } #endif \ No newline at end of file From 5e07055fd6620a1cacd90b72dc09778c2eb82bf0 Mon Sep 17 00:00:00 2001 From: Igor Belitskiy Date: Mon, 17 Apr 2023 17:55:01 +0600 Subject: [PATCH 33/51] fix --- source/controler.cc | 3 ++- source/ubconfig_quotas.cc | 4 ++-- source/ubconfig_quotas.h | 2 +- 3 files changed, 5 insertions(+), 4 deletions(-) diff --git a/source/controler.cc b/source/controler.cc index 822fb5d..38f889a 100644 --- a/source/controler.cc +++ b/source/controler.cc @@ -21,7 +21,7 @@ bool Back_Back::wrapper_off_quotas(string quotas_type) { flag_status = obj_quotas_sys.off_quota(partition, cmd_hw, cmd_sw); } else if (flag_mode == "ubconfig") { - flag_status = obj_quotas_ubconfig.off_quota(partition, quotas_type); + flag_status = obj_quotas_ubconfig.off_quota(partition, quotas_type, "disable"); } return flag_status; } @@ -35,6 +35,7 @@ bool Back_Back::wrapper_on_quotas(string quotas_type) { flag_status = obj_quotas_sys.wrapper_on_quotas(partition, quotas_type); } else if (flag_mode == "ubconfig") { + flag_status = obj_quotas_sys.wrapper_on_quotas(partition, quotas_type, "enable"); flag_status = obj_quotas_ubconfig.format_cmd_quotas(); } return flag_status; diff --git a/source/ubconfig_quotas.cc b/source/ubconfig_quotas.cc index e420db6..88bcb30 100644 --- a/source/ubconfig_quotas.cc +++ b/source/ubconfig_quotas.cc @@ -9,10 +9,10 @@ void Quotas_ubconfig::format_cmd_quotas(struct struct_quotas& _struct_quota) { (*map_gui_cfg)[key] = value; } -bool Quotas_ubconfig::off_quota(string partition, string quota_type) { +bool Quotas_ubconfig::off_quota(string partition, string quota_type, string state) { string key = "DISK_QUOTA[" + quota_type + ":" + partition + "]"; string value = "disable"; - (*map_gui_cfg)[key] = value; + (*map_gui_cfg)[key] = state; return true; } void Quotas_ubconfig::set_map_gui(map_str_str &map_gui) { diff --git a/source/ubconfig_quotas.h b/source/ubconfig_quotas.h index 3df6291..f9a0d4d 100644 --- a/source/ubconfig_quotas.h +++ b/source/ubconfig_quotas.h @@ -17,7 +17,7 @@ class Quotas_ubconfig{ My_Process::My_Process_system obj_process_system = My_Process::My_Process_system(); My_Process::My_Process_call obj_process_call = My_Process::My_Process_call(); Quotas_ubconfig(); - bool off_quota(string partition, string quota_type); + bool off_quota(string partition, string quota_type, string state); void format_cmd_quotas(struct struct_quotas& _struct_quota); void set_map_gui(map_str_str &map_gui); }; From b77d49c1f98434e97cf2ce2b9ce265827e582a0d Mon Sep 17 00:00:00 2001 From: Igor Belitskiy Date: Thu, 20 Apr 2023 11:18:27 +0600 Subject: [PATCH 34/51] =?UTF-8?q?=D0=9E=D0=B1=D0=BD=D0=BE=D0=B2=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=20=D0=B4=D0=B8=D0=B7=D0=B0=D0=B9=D0=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ubl-settings-diskquota.glade | 2926 +++++++++++++++++++++------------- 1 file changed, 1819 insertions(+), 1107 deletions(-) diff --git a/ubl-settings-diskquota.glade b/ubl-settings-diskquota.glade index 21a4d56..450e211 100644 --- a/ubl-settings-diskquota.glade +++ b/ubl-settings-diskquota.glade @@ -1,5 +1,5 @@ - + @@ -278,6 +278,11 @@ + + + + + @@ -301,6 +306,50 @@ + + vertical + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + False False @@ -729,6 +778,37 @@ True True + + + True + False + vertical + + + True + True + + + + + + False + True + 0 + + + + + + + True + False + General settings + + + False + + True @@ -743,14 +823,10 @@ 5 5 - - 135 + True False - 5 - 5 Device: - 0 False @@ -759,7 +835,7 @@ - + True False @@ -770,36 +846,18 @@ - - 0 - True - False - 5 - 5 - File system: - 0 - - - False - True - 2 - - - - + True False 5 5 5 5 - 6 - 6 False True - 3 + 2 @@ -810,34 +868,66 @@ - + True False - 5 - 5 - 0.019999999552965164 - in + 20 - + True False - 5 - 5 - 12 - 5 + vertical + True - + True False - vertical + Excess size delay period + 0 + + + False + True + 0 + + + + + True + False + Excess files delay period + 0 + + + False + True + 1 + + + + + False + True + 0 + + + + + True + False + vertical + 5 + + + True + False + 5 - - Enable + True True - False - start - True + 0 + generalGroupsSizeWeeksSpin False @@ -846,396 +936,10 @@ - + True False - 20 - - - True - False - vertical - - - True - False - Excess size delay period - 0 - - - False - True - 0 - - - - - True - False - Excess files delay period - 0 - - - False - True - 1 - - - - - False - True - 0 - - - - - True - False - vertical - 5 - - - True - False - 5 - - - True - True - 0 - generalGroupsSizeWeeksSpin - - - False - True - 0 - - - - - True - False - weeks - - - False - True - 1 - - - - - False - True - 0 - - - - - True - False - 5 - - - True - True - 0 - generalGroupsFilesWeeksSpin - - - False - True - 0 - - - - - True - False - weeks - - - False - True - 1 - - - - - False - True - 1 - - - - - False - True - 1 - - - - - True - False - vertical - 5 - - - True - False - 5 - - - True - True - 0 - generalGroupsSizeDaysSpin - - - False - True - 0 - - - - - True - False - days - - - False - True - 1 - - - - - False - True - 0 - - - - - True - False - 5 - - - True - True - 0 - generalGroupsFilesDaysSpin - - - False - True - 0 - - - - - True - False - days - - - False - True - 1 - - - - - False - True - 1 - - - - - False - True - 2 - - - - - True - False - vertical - 5 - - - True - False - 5 - - - True - True - 0 - generalGroupsSizeHoursSpin - - - False - True - 0 - - - - - True - False - hours - - - False - True - 1 - - - - - False - True - 0 - - - - - True - False - 5 - - - True - True - 0 - generalGroupsFilesHoursSpin - - - False - True - 0 - - - - - True - False - hours - - - False - True - 1 - - - - - False - True - 1 - - - - - False - True - 3 - - - - - True - False - vertical - 5 - - - True - False - 5 - - - True - True - 0 - generalGroupsSizeMinutesSpin - - - False - True - 0 - - - - - True - False - minutes - - - False - True - 1 - - - - - False - True - 0 - - - - - True - False - 5 - - - True - True - 0 - generalGroupsFilesMinutesSpin - - - False - True - 0 - - - - - True - False - minutes - - - False - True - 1 - - - - - False - True - 1 - - - - - False - True - 4 - - + weeks False @@ -1244,54 +948,23 @@ + + False + True + 0 + - - - - - True - False - Quotas for groups - 0 - - - - - False - True - 1 - - - - - True - False - 5 - 5 - 5 - 0.019999999552965164 - in - - - True - False - 5 - 5 - 12 - 5 - + True False - vertical + 5 - - Enable + True True - False - start - True + 0 + generalGroupsFilesWeeksSpin False @@ -1300,396 +973,10 @@ - + True False - 20 - - - True - False - vertical - - - True - False - Excess size delay period - 0 - - - False - True - 0 - - - - - True - False - Excess files delay period - 0 - - - False - True - 1 - - - - - False - True - 0 - - - - - True - False - vertical - 5 - - - True - False - 5 - - - True - True - 0 - generalUsersSizeWeeksSpin - - - False - True - 0 - - - - - True - False - weeks - - - False - True - 1 - - - - - False - True - 0 - - - - - True - False - 5 - - - True - True - 0 - generalUsersFilesWeeksSpin - - - False - True - 0 - - - - - True - False - weeks - - - False - True - 1 - - - - - False - True - 1 - - - - - False - True - 1 - - - - - True - False - vertical - 5 - - - True - False - 5 - - - True - True - 0 - generalUsersSizeDaysSpin - - - False - True - 0 - - - - - True - False - days - - - False - True - 1 - - - - - False - True - 0 - - - - - True - False - 5 - - - True - True - 0 - generalUsersFilesDaysSpin - - - False - True - 0 - - - - - True - False - days - - - False - True - 1 - - - - - False - True - 1 - - - - - False - True - 2 - - - - - True - False - vertical - 5 - - - True - False - 5 - - - True - True - 0 - generalUsersSizeHoursSpin - - - False - True - 0 - - - - - True - False - hours - - - False - True - 1 - - - - - False - True - 0 - - - - - True - False - 5 - - - True - True - 0 - generalUsersFilesHourSpin - - - False - True - 0 - - - - - True - False - hours - - - False - True - 1 - - - - - False - True - 1 - - - - - False - True - 3 - - - - - True - False - vertical - 5 - - - True - False - 5 - - - True - True - 0 - generalUsersSizeMinutesSpin - - - False - True - 0 - - - - - True - False - minutes - - - False - True - 1 - - - - - False - True - 0 - - - - - True - False - 5 - - - True - True - 0 - generalUsersFilesMinuteSpin - - - False - True - 0 - - - - - True - False - minutes - - - False - True - 1 - - - - - False - True - 1 - - - - - False - True - 4 - - + weeks False @@ -1698,133 +985,1599 @@ + + False + True + 1 + + + False + True + 1 + - - + + True False - Quotas for users - 0 - - - - - False - True - 2 - - - - - - - True - False - General settings - - - False - - - - - True - False - vertical - - - True - False - 5 - 5 - 5 - 5 - - - True - False - Device: + vertical + 5 + + + True + False + 5 + + + True + True + 0 + generalGroupsSizeDaysSpin + + + False + True + 0 + + + + + True + False + days + + + False + True + 1 + + + + + False + True + 0 + + + + + True + False + 5 + + + True + True + 0 + generalGroupsFilesDaysSpin + + + False + True + 0 + + + + + True + False + days + + + False + True + 1 + + + + + False + True + 1 + + False True - 0 + 2 - + True False + vertical + 5 + + + True + False + 5 + + + True + True + 0 + generalGroupsSizeHoursSpin + + + False + True + 0 + + + + + True + False + hours + + + False + True + 1 + + + + + False + True + 0 + + + + + True + False + 5 + + + True + True + 0 + generalGroupsFilesHoursSpin + + + False + True + 0 + + + + + True + False + hours + + + False + True + 1 + + + + + False + True + 1 + + - True + False True - 1 + 3 - + True False - 5 - 5 - File system: + vertical + 5 + + + True + False + 5 + + + True + True + 0 + generalGroupsSizeMinutesSpin + + + False + True + 0 + + + + + True + False + minutes + + + False + True + 1 + + + + + False + True + 0 + + + + + True + False + 5 + + + True + True + 0 + generalGroupsFilesMinutesSpin + + + False + True + 0 + + + + + True + False + minutes + + + False + True + 1 + + + + + False + True + 1 + + False True - 2 + 4 + + + False + True + 1 + + + + + True + True + liststore1 + + + True + True + 2 + + + + + True + False - + True - False + True + True 5 5 5 5 - 6 - 6 + + + True + False + + + True + False + 5 + 5 + gtk-missing-image + + + False + True + 0 + + + + + True + False + 5 + 5 + Filters + + + False + True + 1 + + + + False True - 3 + 0 - - Filters + True - True - True + False + + + gtk-delete + True + True + True + 5 + 5 + 5 + 5 + True + + + False + True + 0 + + + + + True + True + True + 5 + 5 + 5 + 5 + + + True + False + + + True + False + 5 + 5 + gtk-missing-image + + + False + True + 0 + + + + + True + False + 5 + 5 + 5 + 5 + Edit + + + False + True + 1 + + + + + + + False + True + 1 + + + + + gtk-add + True + True + True + 5 + 5 + 5 + 5 + True + + + False + True + 2 + + + + + False + True + end + 1 + + + + + False + True + 3 + + + + + 1 + + + + + True + False + Groups + + + 1 + False + + + + + True + False + vertical + + + True + False + 5 + 5 + 5 + 5 + + + True + False + Device: + + + False + True + 0 + + + + + True + False + + + True + True + 1 + + + + + True + False + 5 + 5 + 5 + 5 + + + False + True + 2 + + + + + False + True + 0 + + + + + True + False + 20 + + + True + False + vertical + True + + + True + False + Excess size delay period + 0 + + + False + True + 0 + + + + + True + False + Excess files delay period + 0 + + + False + True + 1 + + + + + False + True + 0 + + + + + True + False + vertical + 5 + + + True + False + 5 + + + True + True + 0 + generalUsersSizeWeeksSpin + + + False + True + 0 + + + + + True + False + weeks + + + False + True + 1 + + + + + False + True + 0 + + + + + True + False + 5 + + + True + True + 0 + generalUsersFilesWeeksSpin + + + False + True + 0 + + + + + True + False + weeks + + + False + True + 1 + + + + + False + True + 1 + + + + + False + True + 1 + + + + + True + False + vertical + 5 + + + True + False + 5 + + + True + True + 0 + generalUsersSizeDaysSpin + + + False + True + 0 + + + + + True + False + days + + + False + True + 1 + + + + + False + True + 0 + + + + + True + False + 5 + + + True + True + 0 + generalUsersFilesDaysSpin + + + False + True + 0 + + + + + True + False + days + + + False + True + 1 + + + + + False + True + 1 + + + + + False + True + 2 + + + + + True + False + vertical + 5 + + + True + False + 5 + + + True + True + 0 + generalUsersSizeHoursSpin + + + False + True + 0 + + + + + True + False + hours + + + False + True + 1 + + + + + False + True + 0 + + + + + True + False + 5 + + + True + True + 0 + generalUsersFilesHourSpin + + + False + True + 0 + + + + + True + False + hours + + + False + True + 1 + + + + + False + True + 1 + + + + + False + True + 3 + + + + + True + False + vertical + 5 + + + True + False + 5 + + + True + True + 0 + generalUsersSizeMinutesSpin + + + False + True + 0 + + + + + True + False + minutes + + + False + True + 1 + + + + + False + True + 0 + + + + + True + False + 5 + + + True + True + 0 + generalUsersFilesMinuteSpin + + + False + True + 0 + + + + + True + False + minutes + + + False + True + 1 + + + + + False + True + 1 + + + + + False + True + 4 + + + + + False + True + 1 + + + + + True + True + liststore1 + + + True + True + 2 + + + + + True + False + + + True + True + True + 5 + 5 + 5 + 5 + + + True + False + + + True + False + 5 + 5 + gtk-missing-image + + + False + True + 0 + + + + + True + False + 5 + 5 + Filters + + + False + True + 1 + + + + + + + False + True + 0 + + + + + True + False + + + gtk-delete + True + True + True + 5 + 5 + 5 + 5 + True + + + False + True + 0 + + + + + True + True + True + 5 + 5 + 5 + 5 + + + True + False + + + True + False + 5 + 5 + gtk-edit + + + False + True + 0 + + + + + True + False + 5 + 5 + 5 + 5 + Edit + + + False + True + 1 + + + + + + + False + True + 1 + + + + + gtk-add + True + True + True + 5 + 5 + 5 + 5 + True + + + False + True + 2 + + + + + False + True + end + 1 + + + + + False + True + 3 + + + + + 2 + + + + + True + False + Users + + + 2 + False + + + + + True + False + vertical + + + True + False + vertical + + + True + False + 5 + 5 + 5 + 5 + 5 + 5 + + + True + False + Device: + + + False + True + 0 + + + + + True + False + + + True + True + 1 + + + + + True + False + 5 + 5 + 5 + 5 + + + False + True + 2 + + + + + False + True + 0 + + + + + True + False + 20 + + + True + False + vertical + True + + + True + False + Excess size delay period + 0 + + + False + True + 0 + + + + + True + False + Excess files delay period + 0 + + + False + True + 1 + + + + + False + True + 0 + + + + + True + False + vertical + 5 + + + True + False + 5 + + + True + True + 0 + generalUsersSizeWeeksSpin + + + False + True + 0 + + + + + True + False + weeks + + + False + True + 1 + + + + + False + True + 0 + + + + + True + False + 5 + + + True + True + 0 + generalUsersFilesWeeksSpin + + + False + True + 0 + + + + + True + False + weeks + + + False + True + 1 + + + + + False + True + 1 + + + + + False + True + 1 + + + + + True + False + vertical + 5 + + + True + False + 5 + + + True + True + 0 + generalUsersSizeDaysSpin + + + False + True + 0 + + + + + True + False + days + + + False + True + 1 + + + + + False + True + 0 + + + + + True + False + 5 + + + True + True + 0 + generalUsersFilesDaysSpin + + + False + True + 0 + + + + + True + False + days + + + False + True + 1 + + + + + False + True + 1 + + + + + False + True + 2 + + + + + True + False + vertical + 5 + + + True + False + 5 + + + True + True + 0 + generalUsersSizeHoursSpin + + + False + True + 0 + + + + + True + False + hours + + + False + True + 1 + + + + + False + True + 0 + + + + + True + False + 5 + + + True + True + 0 + generalUsersFilesHourSpin + + + False + True + 0 + + + + + True + False + hours + + + False + True + 1 + + + + + False + True + 1 + + + + + False + True + 3 + + + + + True + False + vertical + 5 + + + True + False + 5 + + + True + True + 0 + generalUsersSizeMinutesSpin + + + False + True + 0 + + + + + True + False + minutes + + + False + True + 1 + + + + + False + True + 0 + + + + + True + False + 5 + + + True + True + 0 + generalUsersFilesMinuteSpin + + + False + True + 0 + + + + + True + False + minutes + + + False + True + 1 + + + + + False + True + 1 + + + + + False + True + 4 + + False True - end - 4 + 1 - - gtk-remove + True True - True - 5 - 5 - 5 - 5 - True + liststore1 + + + - False + True True - 5 + 2 @@ -1834,152 +2587,160 @@ 0 - - - True - True - liststore1 - - - - - - False - True - 1 - - - - - 1 - - - - - True - False - Groups - - - 1 - False - - - - - True - False - vertical True False - 5 - 5 - 5 - 5 - - - True - False - Device: - - - False - True - 0 - - - - - True - False - - - True - True - 1 - - - - - True - False - 5 - 5 - File system: - - - False - True - 2 - - - + True - False + True + True 5 5 5 5 - 6 - 6 + + + True + False + + + True + False + 5 + 5 + gtk-missing-image + + + False + True + 0 + + + + + True + False + 5 + 5 + Filters + + + False + True + 1 + + + + False True - 3 + 0 - - Filters + True - True - True + False + + + gtk-delete + True + True + True + 5 + 5 + 5 + True + + + False + True + 0 + + + + + True + True + True + 5 + 5 + 5 + 5 + + + True + False + + + True + False + 5 + 5 + gtk-missing-image + + + False + True + 0 + + + + + True + False + 5 + 5 + 5 + 5 + Edit + + + False + True + 1 + + + + + + + False + True + 1 + + + + + gtk-add + True + True + True + 5 + 5 + 5 + 5 + True + + + False + True + 2 + + False True end - 4 - - - - - gtk-remove - True - True - True - 5 - 5 - 5 - 5 - True - - - False - True - 5 + 1 - - False - True - 0 - - - - - True - True - liststore1 - - - - False True @@ -1988,17 +2749,17 @@ - 2 + 3 - + True False - Users + Project - 2 + 3 False @@ -2202,55 +2963,6 @@ - - - - - - - vertical - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 1000000 1 From 82b14636d83d45ffaa8f5b70e3f783f26ab35436 Mon Sep 17 00:00:00 2001 From: Igor Belitskiy Date: Thu, 20 Apr 2023 11:19:01 +0600 Subject: [PATCH 35/51] =?UTF-8?q?=D0=A3=D0=B1=D1=80=D0=B0=D0=BB=20=D1=87?= =?UTF-8?q?=D0=B0=D1=81=D1=82=D1=8C=20=D0=BA=D0=BE=D0=B4=D0=B0=20=D0=B2=20?= =?UTF-8?q?=D1=81=D0=B2=D1=8F=D0=B7=D0=B8=20=D0=B8=D0=B7=D0=BC=D0=B5=D0=BD?= =?UTF-8?q?=D0=B5=D0=BD=D0=B8=D0=B5=D0=BC=20=D0=B4=D0=B8=D0=B7=D0=B0=D0=B9?= =?UTF-8?q?=D0=BD=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- source/ubl-settings-diskquota.cc | 54 +------------------------------- source/ubl-settings-diskquota.h | 19 +---------- 2 files changed, 2 insertions(+), 71 deletions(-) diff --git a/source/ubl-settings-diskquota.cc b/source/ubl-settings-diskquota.cc index da3ef3e..b21ac17 100755 --- a/source/ubl-settings-diskquota.cc +++ b/source/ubl-settings-diskquota.cc @@ -29,17 +29,10 @@ void MainWindow::settings() { this->lacalization(); this->add_CSS(); btnBoxAboutDialog->set_visible(false); - this->entry_generalGroupsEnableCheck(); - this->entry_generalUsersEnableCheck(); map_device = obj_device.get_parted(); - this->filling_device_combo_box_template(generalDeviceCombo, map_device); this->filling_device_combo_box_template(groupsDeviceCombo, map_device); this->filling_device_combo_box_template(usersDeviceCombo, map_device); this->filling_device_combo_box_template(quotegroupDeviceCombo, map_device); - this->entry_combo_box_temp(generalDeviceCombo,lblFstypeGeneralSettings); - this->entry_combo_box_temp(groupsDeviceCombo, lblFstypeGroups); - this->entry_combo_box_temp(usersDeviceCombo, lblFstypeUsers); - this->entry_combo_box_temp(quotegroupDeviceCombo, lblEditWndFsys); this->init_tree_view(); this->init_spin_all(); check_limit(quotegroupSizeSoftLimitCheck @@ -161,12 +154,6 @@ void MainWindow::lacalization() { headerAboutTopic->set_label(_(app_name.c_str())); headerTopic->set_label(_("ubl-settings-diskquota")); UsersTabLabel->set_text(_("Users")); - generalDeviceLabel->set_text(_("Device:")); - generalFileSystemLabel->set_text(_("File system:")); - generalGroupsFrameLabel->set_text(_("Quotas for groups")); - generalGroupsEnableCheck->set_label(_("Enable")); - generalUsersEnableCheck->set_label(_("Enable")); - generalUsersFrameLabel->set_label(_("Quotas for users")); generalGroupsSizeLabel->set_text(_("Excess size delay period")); generalGroupsFilesLabel->set_text(_("Excess files delay period")); generalUsersSizeLabel->set_text(_("Excess size delay period")); @@ -187,10 +174,6 @@ void MainWindow::lacalization() { generalGroupsFilesMinutesLabel->set_text(_("minutes")); generalUsersSizeMinutesLabel->set_text(_("minutes")); generalUsersFilesMinutesLabel->set_text(_("minutes")); - groupsFileSystemLabel->set_text(_("File system:")); - usersFileSystemLabel->set_text(_("File system:")); - usersFiltersButton->set_label(_("Filters")); - groupsFiltersButton->set_label(_("Filters")); lblLoad->set_text(_("Load")); lblSave->set_text(_("Save")); groupsDeviceLabel->set_label(_("Device:")); @@ -277,14 +260,6 @@ void MainWindow::entry_combo_box_temp(Gtk::ComboBoxText *combo_box, Gtk::Label * } } -void MainWindow::entry_generalGroupsEnableCheck() { - boxGeneralGroupsEnableCheck->set_sensitive(generalGroupsEnableCheck->get_active()); -} - -void MainWindow::entry_generalUsersEnableCheck() { - boxGeneralUsersEnableCheck->set_sensitive(generalUsersEnableCheck->get_active()); -} - void MainWindow::add_CSS() { Glib::RefPtr cssProvider = Gtk::CssProvider::create(); cssProvider->load_from_path(path_css); @@ -338,11 +313,8 @@ void MainWindow::get_builder() { 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); @@ -361,17 +333,10 @@ void MainWindow::get_builder() { 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); - builder->get_widget("groupsFileSystemLabel", groupsFileSystemLabel); - builder->get_widget("groupsFiltersButton", groupsFiltersButton); builder->get_widget("btnSettings", btnSettings); - builder->get_widget("usersFiltersButton", usersFiltersButton); - builder->get_widget("usersFileSystemLabel", usersFileSystemLabel); builder->get_widget("groupsDeviceLabel", groupsDeviceLabel); builder->get_widget("usersDeviceLabel", usersDeviceLabel); builder->get_widget("headLabel", headLabel); @@ -432,17 +397,10 @@ void MainWindow::get_builder() { builder->get_widget("lblHeadQuotasUserEditWindow", lblHeadQuotasUserEditWindow); builder->get_widget("lblHeadQuotasEditWindow", lblHeadQuotasEditWindow); builder->get_widget("lblHeadFiltersWindow", lblHeadFiltersWindow); - builder->get_widget("boxGeneralGroupsEnableCheck", boxGeneralGroupsEnableCheck); - builder->get_widget("generalGroupsEnableCheck", generalGroupsEnableCheck); - builder->get_widget("boxGeneralUsersEnableCheck", boxGeneralUsersEnableCheck); builder->get_widget("usersDeviceCombo", usersDeviceCombo); builder->get_widget("GroupsTabLabel", GroupsTabLabel); builder->get_widget("generalTabLabel", generalTabLabel); - builder->get_widget("generalDeviceCombo", generalDeviceCombo); builder->get_widget("groupsDeviceCombo", groupsDeviceCombo); - builder->get_widget("lblFstypeUsers", lblFstypeUsers); - builder->get_widget("lblFstypeGroups", lblFstypeGroups); - builder->get_widget("lblFstypeGeneralSettings", lblFstypeGeneralSettings); builder->get_widget("generalGroupsSizeWeeksSpi", generalGroupsSizeWeeksSpi); builder->get_widget("generalGroupsFileWeeksSpin", generalGroupsFileWeeksSpin); builder->get_widget("generalGroupsSizeDaySpin", generalGroupsSizeDaySpin); @@ -474,14 +432,11 @@ void MainWindow::get_builder() { builder->get_widget("quotegroupSaveButton", quotegroupSaveButton); builder->get_widget("quotegroupCancelButton", quotegroupCancelButton); builder->get_widget("quotegroupDeviceCombo", quotegroupDeviceCombo); - builder->get_widget("btnDeleteUserQuota", btnDeleteUserQuota); - builder->get_widget("btnDeleteGroupQuota", btnDeleteGroupQuota); + builder->get_widget("treeVGeneralSett", treeVGeneralSett); } void MainWindow::event() { quotegroupSaveButton->signal_clicked().connect([&]() {}); - btnDeleteGroupQuota->signal_clicked().connect([&]() {}); - btnDeleteUserQuota->signal_clicked().connect([&]() {}); btnLoadGlob->signal_activate().connect([&]() {this->load_global_cfg();}); btnLoadLocal->signal_activate().connect([&]() {this->load_system_cfg();}); btnSynopsis->signal_activate().connect([&]() {this->synopsis_show();}); @@ -489,13 +444,6 @@ void MainWindow::event() { btnSaveLocalGlob->signal_activate().connect([&]() {this->wrapper_save_all_cfg();}); btnSaveGlob->signal_activate().connect([&]() {this->wrapper_save_global_cfg();}); btnSaveLocal->signal_activate().connect([&]() {this->wrapper_save_system_cfg();}); - groupsFiltersButton->signal_clicked().connect(sigc::mem_fun(*this, &MainWindow::groupsFilters_show)); - usersFiltersButton->signal_clicked().connect(sigc::mem_fun(*this, &MainWindow::groupsFilters_show)); - generalGroupsEnableCheck->signal_toggled().connect(sigc::mem_fun(*this, &MainWindow::entry_generalGroupsEnableCheck)); - generalUsersEnableCheck->signal_toggled().connect(sigc::mem_fun(*this, &MainWindow::entry_generalUsersEnableCheck)); - generalDeviceCombo->signal_changed().connect([&]() {entry_combo_box_temp(generalDeviceCombo,lblFstypeGeneralSettings);}); - groupsDeviceCombo->signal_changed().connect([&]() {entry_combo_box_temp(groupsDeviceCombo, lblFstypeGroups);}); - usersDeviceCombo->signal_changed().connect([&]() {entry_combo_box_temp(usersDeviceCombo, lblFstypeUsers);}); quotegroupDeviceCombo->signal_changed().connect([&]() {entry_combo_box_temp(quotegroupDeviceCombo, lblEditWndFsys);}); quotegroupSizeSoftLimitCheck->signal_toggled().connect([&]() { check_limit(quotegroupSizeSoftLimitCheck diff --git a/source/ubl-settings-diskquota.h b/source/ubl-settings-diskquota.h index 24dea4a..9b80308 100644 --- a/source/ubl-settings-diskquota.h +++ b/source/ubl-settings-diskquota.h @@ -69,11 +69,8 @@ class MainWindow : public Gtk::ApplicationWindow { 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; @@ -92,10 +89,8 @@ class MainWindow : public Gtk::ApplicationWindow { Gtk::Label *generalGroupsFilesMinutesLabel; Gtk::Label *generalUsersSizeMinutesLabel; Gtk::Label *generalUsersFilesMinutesLabel; - Gtk::Label *generalFileSystemLabel; Gtk::Label *lblLoad; Gtk::Label *lblSave; - Gtk::CheckButton *generalUsersEnableCheck; Gtk::MenuItem *btnLoadGlob; Gtk::MenuItem *btnLoadLocal; Gtk::MenuItem *btnSynopsis; @@ -103,10 +98,6 @@ class MainWindow : public Gtk::ApplicationWindow { Gtk::MenuItem *btnSaveLocalGlob; Gtk::MenuItem *btnSaveGlob; Gtk::MenuItem *btnSaveLocal; - Gtk::Label *groupsFileSystemLabel; - Gtk::Label *usersFileSystemLabel; - Gtk::Button *groupsFiltersButton; - Gtk::Button *usersFiltersButton; Gtk::Label *groupsDeviceLabel; Gtk::Label *usersDeviceLabel; Gtk::Label *headLabel; @@ -125,6 +116,7 @@ class MainWindow : public Gtk::ApplicationWindow { Gtk::CheckButton *filtersHardFilesActivationFilterCheckbox; Gtk::TreeView *groupsQuotasTree; Gtk::TreeView *usersQuotasTree; + Gtk::TreeView *treeVGeneralSett; Gtk::Label *quotegroupDeviceLabel; Gtk::Label *quotegroupFileSystemLabel; Gtk::Label *quotegroupDiskQuotasLabel; @@ -158,15 +150,10 @@ class MainWindow : public Gtk::ApplicationWindow { Gtk::Label *lblHeadQuotasUserEditWindow; Gtk::Label *lblHeadQuotasEditWindow; Gtk::Label *lblHeadFiltersWindow; - Gtk::Box *boxGeneralGroupsEnableCheck; - Gtk::CheckButton *generalGroupsEnableCheck; - Gtk::Box *boxGeneralUsersEnableCheck; Gtk::ComboBoxText *usersDeviceCombo; Gtk::ComboBoxText *groupsDeviceCombo; Gtk::ComboBoxText *generalDeviceCombo; - Gtk::Label *lblFstypeUsers; Gtk::Label *lblFstypeGroups; - Gtk::Label *lblFstypeGeneralSettings; Gtk::SpinButton *generalGroupsSizeWeeksSpi; Gtk::SpinButton *generalGroupsFileWeeksSpin; Gtk::SpinButton *generalGroupsSizeDaySpin; @@ -198,8 +185,6 @@ class MainWindow : public Gtk::ApplicationWindow { Gtk::Button *quotegroupCancelButton; Gtk::Button *quotegroupSaveButton; Gtk::ComboBoxText *quotegroupDeviceCombo; - Gtk::Button *btnDeleteUserQuota; - Gtk::Button *btnDeleteGroupQuota; public: Lib_save::Save obj_save = Lib_save::Save(); @@ -227,10 +212,8 @@ class MainWindow : public Gtk::ApplicationWindow { void get_builder(); void event(); void entry_combo_box_temp(Gtk::ComboBoxText *combo_box, Gtk::Label *label); - void entry_generalGroupsEnableCheck(); void synopsis_show(); void info_status_app(string stule); - void entry_generalUsersEnableCheck(); void groupsFilters_show(); void init_tree_view(); void load_template(map_str_str* map_temp, string str_load); From 101dd80dff74bba77cb2c36fcfd52bd2e664a3c1 Mon Sep 17 00:00:00 2001 From: Igor Belitskiy Date: Thu, 20 Apr 2023 11:47:31 +0600 Subject: [PATCH 36/51] =?UTF-8?q?=D0=98=D1=81=D0=BF=D1=80=D0=B0=D0=B2?= =?UTF-8?q?=D0=BB=D0=B5=D0=BD=D0=B8=D0=B5=20=D0=B1=D0=B0=D0=B3=D0=BE=D0=B2?= =?UTF-8?q?=20=D0=B8=20=D0=BD=D0=B5=D0=B4=D0=BE=D1=87=D0=B5=D1=82=D0=BE?= =?UTF-8?q?=D0=B2=20=D0=BF=D1=80=D0=B8=20=D0=B8=D0=B7=D0=BC=D0=B5=D0=BD?= =?UTF-8?q?=D0=B5=D0=BD=D0=B8=D0=B5=20=D0=B4=D0=B8=D0=B7=D0=B0=D0=B9=D0=BD?= =?UTF-8?q?=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- source/ubl-settings-diskquota.cc | 5 +- source/ubl-settings-diskquota.h | 3 +- ubl-settings-diskquota.glade | 117 +++++++++++++++++-------------- 3 files changed, 69 insertions(+), 56 deletions(-) diff --git a/source/ubl-settings-diskquota.cc b/source/ubl-settings-diskquota.cc index b21ac17..21c26ad 100755 --- a/source/ubl-settings-diskquota.cc +++ b/source/ubl-settings-diskquota.cc @@ -137,6 +137,8 @@ void MainWindow::init_spin_all() { void MainWindow::init_tree_view() { this->view_add_columns(*usersQuotasTree); this->view_add_columns(*groupsQuotasTree); + this->view_add_columns(*ProjectQuotasTree); + this->view_add_columns(*GeneralQuotasTree); } void MainWindow::lacalization() { @@ -432,7 +434,8 @@ void MainWindow::get_builder() { builder->get_widget("quotegroupSaveButton", quotegroupSaveButton); builder->get_widget("quotegroupCancelButton", quotegroupCancelButton); builder->get_widget("quotegroupDeviceCombo", quotegroupDeviceCombo); - builder->get_widget("treeVGeneralSett", treeVGeneralSett); + builder->get_widget("GeneralQuotasTree", GeneralQuotasTree); + builder->get_widget("ProjectQuotasTree", ProjectQuotasTree); } void MainWindow::event() { diff --git a/source/ubl-settings-diskquota.h b/source/ubl-settings-diskquota.h index 9b80308..86d8bab 100644 --- a/source/ubl-settings-diskquota.h +++ b/source/ubl-settings-diskquota.h @@ -116,7 +116,8 @@ class MainWindow : public Gtk::ApplicationWindow { Gtk::CheckButton *filtersHardFilesActivationFilterCheckbox; Gtk::TreeView *groupsQuotasTree; Gtk::TreeView *usersQuotasTree; - Gtk::TreeView *treeVGeneralSett; + Gtk::TreeView *ProjectQuotasTree; + Gtk::TreeView *GeneralQuotasTree; Gtk::Label *quotegroupDeviceLabel; Gtk::Label *quotegroupFileSystemLabel; Gtk::Label *quotegroupDiskQuotasLabel; diff --git a/ubl-settings-diskquota.glade b/ubl-settings-diskquota.glade index 450e211..1e82d5b 100644 --- a/ubl-settings-diskquota.glade +++ b/ubl-settings-diskquota.glade @@ -278,11 +278,6 @@ - - - - - @@ -306,50 +301,6 @@ - - vertical - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - False False @@ -784,15 +735,16 @@ False vertical - + True True + liststore1 - False + True True 0 @@ -871,6 +823,7 @@ True False + False 20 @@ -1271,6 +1224,9 @@ True True liststore1 + + + True @@ -1373,7 +1329,7 @@ False 5 5 - gtk-missing-image + gtk-edit False @@ -1917,6 +1873,9 @@ True True liststore1 + + + True @@ -2566,7 +2525,7 @@ - + True True liststore1 @@ -2681,7 +2640,7 @@ False 5 5 - gtk-missing-image + gtk-edit False @@ -2744,6 +2703,7 @@ False True + end 1 @@ -2963,6 +2923,55 @@ + + + + + + + vertical + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 1000000 1 From 6703683be312777af91f0d17306d48641c7527db Mon Sep 17 00:00:00 2001 From: Igor Belitskiy Date: Thu, 20 Apr 2023 12:58:31 +0600 Subject: [PATCH 37/51] =?UTF-8?q?=D0=98=D1=81=D0=BF=D1=80=D0=B0=D0=B2?= =?UTF-8?q?=D0=BB=D0=B5=D0=BD=D0=BE=20=D0=B7=D0=B0=D0=BF=D0=BE=D0=BB=D0=BD?= =?UTF-8?q?=D0=B5=D0=BD=D0=B8=D0=B5=20treeView.=20=D0=98=D1=81=D0=BF=D1=80?= =?UTF-8?q?=D0=B0=D0=B2=D0=BB=D0=B5=D0=BD=D1=8B=20=D1=81=D0=BE=D0=B1=D1=8B?= =?UTF-8?q?=D1=82=D0=B8=D1=8F=20=D0=BA=D0=BD=D0=BE=D0=BF=D0=BE=D0=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- source/ubl-settings-diskquota.cc | 36 +++++++++++++++++++++++++------- source/ubl-settings-diskquota.h | 31 +++++++++++++++++++++++---- ubl-settings-diskquota.glade | 4 ++-- ubl-settings-diskquota_ru.po | 18 ++++++++++++++++ 4 files changed, 76 insertions(+), 13 deletions(-) diff --git a/source/ubl-settings-diskquota.cc b/source/ubl-settings-diskquota.cc index 21c26ad..17c5d2d 100755 --- a/source/ubl-settings-diskquota.cc +++ b/source/ubl-settings-diskquota.cc @@ -138,9 +138,21 @@ void MainWindow::init_tree_view() { this->view_add_columns(*usersQuotasTree); this->view_add_columns(*groupsQuotasTree); this->view_add_columns(*ProjectQuotasTree); - this->view_add_columns(*GeneralQuotasTree); + this->init_tree_view_general(); +} +void MainWindow::init_tree_view_general() { + GeneralQuotasTree->append_column_editable(_("Status"), m_columnsGeneral.status); + GeneralQuotasTree->append_column(_("Quota type"), m_columnsGeneral.type_quotas); + GeneralQuotasTree->append_column(_("Device\nProject"), m_columnsGeneral.device); + GeneralQuotasTree->append_column(_("User"), m_columnsGeneral.user); + GeneralQuotasTree->append_column(_("Group"), m_columnsGeneral.group); + GeneralQuotasTree->append_column(_("Soft limit\n(size)"), m_columnsGeneral.soft_limit_size); + GeneralQuotasTree->append_column(_("Severe\nlimitation\n(size)"), m_columnsGeneral.hard_limit_size); + GeneralQuotasTree->append_column(_("Deferring\na hard\nlimit\n(size)"), m_columnsGeneral.hard_limit_size_delay); + GeneralQuotasTree->append_column(_("Soft limit\n(files)"), m_columnsGeneral.soft_limit_files); + GeneralQuotasTree->append_column(_("Severe\nlimitation\n(files)"), m_columnsGeneral.hard_limit_files); + GeneralQuotasTree->append_column(_("Deferring\na hard\nlimit\n(files)"), m_columnsGeneral.hard_limit_delay); } - void MainWindow::lacalization() { time_t now = time(0); tm *ltm = localtime(&now); @@ -227,6 +239,9 @@ void MainWindow::lacalization() { btnSaveGlob->set_label(_("Save to global configuration")); btnSaveLocal->set_label(_("Save to local configuration")); lblHeadFiltersWindow->set_label(_("Filters")); + ProjectTabLabel->set_label(_("Projects")); + usersProjectLabel->set_text(_("Device:")); + } void MainWindow::view_add_columns(Gtk::TreeView &treeView) { @@ -236,14 +251,10 @@ void MainWindow::view_add_columns(Gtk::TreeView &treeView) { treeView.append_column(_("Soft limit\n(size)"), m_columns.soft_limit_size); treeView.append_column(_("Severe\nlimitation\n(size)"), m_columns.hard_limit_size); treeView.append_column(_("Deferring\na hard\nlimit\n(size)"), m_columns.hard_limit_size_delay); - treeView.append_column(_("Hard limit\n" - "activation\n" - "time (size)"), m_columns.hard_limit_activ_time); treeView.append_column(_("Files"), m_columns.files); - treeView.append_column(_("Soft\nRestriction\n(files)"), m_columns.soft_limit_files); + treeView.append_column(_("Soft limit\n(files)"), m_columns.soft_limit_files); treeView.append_column(_("Severe\nlimitation\n(files)"), m_columns.hard_limit_files); treeView.append_column(_("Deferring\na hard\nlimit\n(files)"), m_columns.hard_limit_delay); - treeView.append_column(_("Hard limit\nactivation\ntime (files)"), m_columns.hard_limit_files_activ_time); } void MainWindow::filling_device_combo_box_template(Gtk::ComboBoxText *combo_box, map_str_str &map_device) { @@ -436,9 +447,20 @@ void MainWindow::get_builder() { builder->get_widget("quotegroupDeviceCombo", quotegroupDeviceCombo); builder->get_widget("GeneralQuotasTree", GeneralQuotasTree); builder->get_widget("ProjectQuotasTree", ProjectQuotasTree); + builder->get_widget("ProjectTabLabel", ProjectTabLabel); + builder->get_widget("usersProjectLabel", usersProjectLabel); + builder->get_widget("btnFilterProject", btnFilterProject); + builder->get_widget("btnFilterUsers", btnFilterUsers); + builder->get_widget("btnFilterGroups", btnFilterGroups); + + + } void MainWindow::event() { + btnFilterGroups->signal_clicked().connect([&]() {this->groupsFilters_show();}); + btnFilterUsers->signal_clicked().connect([&]() {this->groupsFilters_show();}); + btnFilterProject->signal_clicked().connect([&]() {this->groupsFilters_show();}); quotegroupSaveButton->signal_clicked().connect([&]() {}); btnLoadGlob->signal_activate().connect([&]() {this->load_global_cfg();}); btnLoadLocal->signal_activate().connect([&]() {this->load_system_cfg();}); diff --git a/source/ubl-settings-diskquota.h b/source/ubl-settings-diskquota.h index 86d8bab..40c9666 100644 --- a/source/ubl-settings-diskquota.h +++ b/source/ubl-settings-diskquota.h @@ -29,22 +29,39 @@ class MainWindow : public Gtk::ApplicationWindow { public: ModelColumns() {add(name), add(quotas); add(size), add(soft_limit_size), add(hard_limit_size); add(hard_limit_size_delay), - add(hard_limit_activ_time), add(files); add(soft_limit_files), - add(hard_limit_files), add(hard_limit_delay); add(hard_limit_files_activ_time); } + add(files); add(soft_limit_files), + add(hard_limit_files), add(hard_limit_delay); } Gtk::TreeModelColumn name; Gtk::TreeModelColumn quotas; Gtk::TreeModelColumn size; Gtk::TreeModelColumn soft_limit_size; Gtk::TreeModelColumn hard_limit_size; Gtk::TreeModelColumn hard_limit_size_delay; - Gtk::TreeModelColumn hard_limit_activ_time; Gtk::TreeModelColumn files; Gtk::TreeModelColumn soft_limit_files; Gtk::TreeModelColumn hard_limit_files; Gtk::TreeModelColumn hard_limit_delay; - Gtk::TreeModelColumn hard_limit_files_activ_time; + }; + class ModelColumnsGeneral : public Gtk::TreeModel::ColumnRecord { + public: + ModelColumnsGeneral() {add(status), add(type_quotas); add(device), + add(user), add(group); add(soft_limit_size), + add(hard_limit_size); add(hard_limit_size_delay); + add(soft_limit_files), add(hard_limit_files), add(hard_limit_delay); } + Gtk::TreeModelColumn status; + Gtk::TreeModelColumn type_quotas; + Gtk::TreeModelColumn device; + Gtk::TreeModelColumn user; + Gtk::TreeModelColumn group; + Gtk::TreeModelColumn soft_limit_size; + Gtk::TreeModelColumn hard_limit_size; + Gtk::TreeModelColumn hard_limit_size_delay; + Gtk::TreeModelColumn soft_limit_files; + Gtk::TreeModelColumn hard_limit_files; + Gtk::TreeModelColumn hard_limit_delay; }; ModelColumns m_columns; + ModelColumnsGeneral m_columnsGeneral; Glib::RefPtr builder; template struct Result{ @@ -89,6 +106,8 @@ class MainWindow : public Gtk::ApplicationWindow { Gtk::Label *generalGroupsFilesMinutesLabel; Gtk::Label *generalUsersSizeMinutesLabel; Gtk::Label *generalUsersFilesMinutesLabel; + Gtk::Label *ProjectTabLabel; + Gtk::Label *usersProjectLabel; Gtk::Label *lblLoad; Gtk::Label *lblSave; Gtk::MenuItem *btnLoadGlob; @@ -185,6 +204,9 @@ class MainWindow : public Gtk::ApplicationWindow { Gtk::ComboBoxText *quotegroupSizeHardLimitCombo; Gtk::Button *quotegroupCancelButton; Gtk::Button *quotegroupSaveButton; + Gtk::Button *btnFilterGroups; + Gtk::Button *btnFilterUsers; + Gtk::Button *btnFilterProject; Gtk::ComboBoxText *quotegroupDeviceCombo; public: @@ -212,6 +234,7 @@ class MainWindow : public Gtk::ApplicationWindow { void add_CSS(); void get_builder(); void event(); + void init_tree_view_general(); void entry_combo_box_temp(Gtk::ComboBoxText *combo_box, Gtk::Label *label); void synopsis_show(); void info_status_app(string stule); diff --git a/ubl-settings-diskquota.glade b/ubl-settings-diskquota.glade index 1e82d5b..5c188a9 100644 --- a/ubl-settings-diskquota.glade +++ b/ubl-settings-diskquota.glade @@ -1239,7 +1239,7 @@ True False - + True True True @@ -2713,7 +2713,7 @@ - + True False Project diff --git a/ubl-settings-diskquota_ru.po b/ubl-settings-diskquota_ru.po index 1a12057..6538b83 100644 --- a/ubl-settings-diskquota_ru.po +++ b/ubl-settings-diskquota_ru.po @@ -22,6 +22,9 @@ msgstr "" msgid "About" msgstr "О программе" +msgid "Projects" +msgstr "Проекты" + #: source/ubl-settings-quotas.cc:183 source/ubl-settings-quotas.cc:113 #: source/ubl-settings-quotas.cc:103 source/ubl-settings-quotas.cc:124 #: source/ubl-settings-quotas.cc:121 source/ubl-settings-quotas.cc:118 @@ -106,6 +109,21 @@ msgstr "Отсрочка жесткого ограничения (объём)" msgid "Device:" msgstr "Устройство:" +msgid "User" +msgstr "Пользователь" + +msgid "Group" +msgstr "Группа" + +msgid "Quota type" +msgstr "Тип квот" + +msgid "Status" +msgstr "Статус" + +msgid "Device\nProject" +msgstr "Устройство\nПроект" + #: source/ubl-settings-quotas.cc:197 source/ubl-settings-quotas.cc:207 #: source/ubl-settings-quotas.cc:127 source/ubl-settings-quotas.cc:137 #: source/ubl-settings-quotas.cc:117 source/ubl-settings-quotas.cc:138 From 9dee33eacaf595307a16307317c5b00c37ad3335 Mon Sep 17 00:00:00 2001 From: Igor Belitskiy Date: Tue, 25 Apr 2023 12:57:10 +0600 Subject: [PATCH 38/51] =?UTF-8?q?=D0=9B=D0=BE=D0=BA=D0=B0=D0=BB=D0=B8?= =?UTF-8?q?=D0=B7=D0=B0=D1=86=D0=B8=D1=8F=20=D0=B2=D1=8B=D0=BD=D0=B5=D1=81?= =?UTF-8?q?=D0=B5=D0=BD=D0=B0=20=D0=B2=20define,=20=D0=B8=D1=81=D0=BF?= =?UTF-8?q?=D1=80=D0=B0=D0=B2=D0=BB=D0=B5=D0=BD=20CMakeLists?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- source/CMakeLists.txt | 14 +- source/main.cc | 6 +- source/ubl-settings-diskquota.cc | 330 +++++++++++++++++-------------- source/ubl-settings-diskquota.h | 122 +++++++++++- 4 files changed, 318 insertions(+), 154 deletions(-) diff --git a/source/CMakeLists.txt b/source/CMakeLists.txt index f90aabc..eb46b27 100644 --- a/source/CMakeLists.txt +++ b/source/CMakeLists.txt @@ -8,6 +8,14 @@ include_directories(${GTK_INCLUDE_DIRS}) link_directories(${GTK_LIBRARY_DIRS}) add_definitions(${GTK_CFLAGS_OTHER}) +option(WEBKIT_FOUND "" ON) + +if(WEBKIT_FOUND) + PKG_CHECK_MODULES(WEBKIT REQUIRED webkit2gtk-4.0 webkit2gtk-web-extension-4.0) + include_directories(${WEBKIT_INCLUDE_DIRS}) + link_directories(${WEBKIT_LIBRARY_DIRS}) + add_definitions(${WEBKIT_CFLAGS_OTHER}) +endif() #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 \ @@ -45,5 +53,9 @@ set(LIBRARIES pthread) add_executable(ubl-settings-diskquota ${SOURCE_FILES}) -target_link_libraries(ubl-settings-diskquota ${LIBRARIES} ${ICU_LIBRARIES}) +target_link_libraries(ubl-settings-diskquota PUBLIC ${WEBKIT_LIBRARIES} ${LIBRARIES}) +target_include_directories(ubl-settings-diskquota PUBLIC + "${PROJECT_BINARY_DIR}" + ${WEBKIT_INCLUDE_DIRS} + ) install(TARGETS ubl-settings-diskquota DESTINATION bin) \ No newline at end of file diff --git a/source/main.cc b/source/main.cc index 1d97603..319c259 100644 --- a/source/main.cc +++ b/source/main.cc @@ -11,9 +11,9 @@ int main(int argc, char** argv) { if (argc > 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()); + bindtextdomain(app_name, "/usr/share/locale/"); + bind_textdomain_codeset(app_name, "UTF-8"); + textdomain(app_name); 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); diff --git a/source/ubl-settings-diskquota.cc b/source/ubl-settings-diskquota.cc index 17c5d2d..e8d8179 100755 --- a/source/ubl-settings-diskquota.cc +++ b/source/ubl-settings-diskquota.cc @@ -1,13 +1,6 @@ #include "ubl-settings-diskquota.h" using namespace std; -const string path_app = "/usr/bin/"; -const string path_glade = "/usr/share/ubl-settings-diskquota/ui/ubl-settings-diskquota.glade"; -const string app_name = "ubl-settings-diskquota"; -const string path_locale = "/usr/share/locale/"; -const string path_css = "/usr/share/ubl-settings-diskquota/css/ubl-settings-diskquota.css"; -const string path_img_head_background = "/usr/share/ubl-settings-diskquota/images/logo-background.png"; - int socket_ext_id_I = 0; int socket_trd_id_I = 0; @@ -58,14 +51,23 @@ void MainWindow::settings() { boxFuncs->set_sensitive(false); btnSave->set_sensitive(false); btnLoad->set_sensitive(false); - imgInfo->set_from_icon_name("com.ublinux.ubl-settings-diskquota.warning", Gtk::ICON_SIZE_MENU); - info_status_app("boxInfoMessError"); - lblWarning->set_text(_("The program must be run as root")); + imgInfo->set_from_icon_name(icon_warning, Gtk::ICON_SIZE_MENU); + info_status_app(info_box_error_css); + lblWarning->set_text(program_as_root); } 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); + #ifdef WEBKIT_FOUND + void *handle=NULL; + handle = dlopen("libwebkit2gtk-4.0.so", RTLD_LAZY); + if (handle) { + one = WEBKIT_WEB_VIEW( webkit_web_view_new() ); + three = Glib::wrap(GTK_WIDGET(one)); + wndWeb->add(*three); + } + #endif } void MainWindow::init_spin_all() { @@ -141,120 +143,120 @@ void MainWindow::init_tree_view() { this->init_tree_view_general(); } void MainWindow::init_tree_view_general() { - GeneralQuotasTree->append_column_editable(_("Status"), m_columnsGeneral.status); - GeneralQuotasTree->append_column(_("Quota type"), m_columnsGeneral.type_quotas); - GeneralQuotasTree->append_column(_("Device\nProject"), m_columnsGeneral.device); - GeneralQuotasTree->append_column(_("User"), m_columnsGeneral.user); - GeneralQuotasTree->append_column(_("Group"), m_columnsGeneral.group); - GeneralQuotasTree->append_column(_("Soft limit\n(size)"), m_columnsGeneral.soft_limit_size); - GeneralQuotasTree->append_column(_("Severe\nlimitation\n(size)"), m_columnsGeneral.hard_limit_size); - GeneralQuotasTree->append_column(_("Deferring\na hard\nlimit\n(size)"), m_columnsGeneral.hard_limit_size_delay); - GeneralQuotasTree->append_column(_("Soft limit\n(files)"), m_columnsGeneral.soft_limit_files); - GeneralQuotasTree->append_column(_("Severe\nlimitation\n(files)"), m_columnsGeneral.hard_limit_files); - GeneralQuotasTree->append_column(_("Deferring\na hard\nlimit\n(files)"), m_columnsGeneral.hard_limit_delay); + GeneralQuotasTree->append_column_editable(str_status, m_columnsGeneral.status); + GeneralQuotasTree->append_column(str_quota, m_columnsGeneral.type_quotas); + GeneralQuotasTree->append_column(str_device_project, m_columnsGeneral.device); + GeneralQuotasTree->append_column(str_user, m_columnsGeneral.user); + GeneralQuotasTree->append_column(str_group, m_columnsGeneral.group); + GeneralQuotasTree->append_column(str_tw_soft_limit, m_columnsGeneral.soft_limit_size); + GeneralQuotasTree->append_column(str_tw_severe_limitation, m_columnsGeneral.hard_limit_size); + GeneralQuotasTree->append_column(str_tw_deferring_size, m_columnsGeneral.hard_limit_size_delay); + GeneralQuotasTree->append_column(str_tw_soft_limit_files, m_columnsGeneral.soft_limit_files); + GeneralQuotasTree->append_column(str_tw_severe_limitation_files, m_columnsGeneral.hard_limit_files); + GeneralQuotasTree->append_column(str_tw_severe_limitation_files, m_columnsGeneral.hard_limit_delay); } void MainWindow::lacalization() { time_t now = time(0); tm *ltm = localtime(&now); unsigned int year = 1900 + ltm->tm_year; - string str_authors = string(_("Copyright © UBSoft LLC, 2022 - ")) + to_string(year); + string str_authors = string(copyright) + to_string(year); aboutWindows->set_copyright(str_authors); - aboutWindows->set_comments(_("Setting user quotas")); - aboutWindows->set_website(_("https://wiki.ublinux.com")); - aboutWindows->set_version(gettext(version_application.c_str())); - aboutWindows->set_website_label(_("Project Home Page")); - generalTabLabel->set_text(_("General settings")); - GroupsTabLabel->set_text(_("Groups")); - headerAboutTopic->set_label(_(app_name.c_str())); - headerTopic->set_label(_("ubl-settings-diskquota")); - UsersTabLabel->set_text(_("Users")); - generalGroupsSizeLabel->set_text(_("Excess size delay period")); - generalGroupsFilesLabel->set_text(_("Excess files delay period")); - generalUsersSizeLabel->set_text(_("Excess size delay period")); - generalUsersFilesLabel->set_text(_("Excess files delay period")); - generalGroupsSizeWeeksLabel->set_text(_("weeks")); - generalGroupsFilesWeeksLabel->set_text(_("weeks")); - generalUsersSizeWeeksLabel->set_text(_("weeks")); - generalUsersFilesWeeksLabel->set_text(_("weeks")); - generalGroupsSizeDaysLabel->set_text(_("days")); - generalGroupsFilesDaysLabel->set_text(_("days")); - generalUsersSizeDaysLabel->set_text(_("days")); - generalUsersFilesDaysLabel->set_text(_("days")); - generalGroupsSizeHoursLabel->set_text(_("hours")); - generalGroupsFilesHoursLabel->set_text(_("hours")); - generalUsersSizeHoursLabel->set_text(_("hours")); - generalUsersFilesHoursLabel->set_text(_("hours")); - generalGroupsSizeMinutesLabel->set_text(_("minutes")); - generalGroupsFilesMinutesLabel->set_text(_("minutes")); - generalUsersSizeMinutesLabel->set_text(_("minutes")); - generalUsersFilesMinutesLabel->set_text(_("minutes")); - lblLoad->set_text(_("Load")); - lblSave->set_text(_("Save")); - groupsDeviceLabel->set_label(_("Device:")); - usersDeviceLabel->set_label(_("Device:")); - headLabel->set_label(_("Configuration of disk quotas parameters for system groups and users")); - filtersNameFilterCheckbox->set_label(_("Name")); - filtersQuotasFilterCheckbox->set_label(_("Quotas")); - filtersSizeFilterCheckbox->set_label(_("Size")); - filtersSoftSizeFilterCheckbox->set_label(_("Soft limit (size)")); - filtersHardSizeFilterCheckbox->set_label(_("Hard limit (size)")); - filtersHardSizeDelayFilterCheckbox->set_label(_("Deferring a hard limit (size)")); - filtersHardSizeActivationFilterCheckbox->set_label(_("Hard limit activation time (size)")); - filtersFilesFilterCheckbox->set_label(_("Files")); - filtersSoftFilesFilterCheckbox->set_label(_("Soft Restriction (files)")); - filtersHardFilesFilterCheckbox->set_label(_("Severe limitation (files)")); - filtersHardFilesDelayFilterCheckbox->set_label(_("Deferring a hard limit (files)")); - filtersHardFilesActivationFilterCheckbox->set_label(_("Hard limit (file) activation time")); - quotegroupDeviceLabel->set_text(_("Device:")); - quotegroupDiskQuotasLabel->set_text(_("Disk quotas for this device:")); - quotegroupGroupQuotasLabel->set_text(_("Group quotas for this device:")); - quotegroupSizeFrameLabel->set_text(_("Size")); - quotegroupFilesFrameLabel->set_text(_("Files")); - quotegroupSizeCurrentlyLabel->set_text(_("Currently using:")); - quotegroupSizeSoftLimitLabel->set_text(_("Soft limit")); - quoteSizeHardLimitLabel->set_text(_("Hard limit")); - quoteFilesHardLimitLabel->set_text(_("Hard limit")); - quotegroupFilesSoftLimitLabel->set_text(_("Soft limit")); - quotegroupFilesCurrentlyLabel->set_text(_("Currently using:")); - quoteuserDiskQuotasLabel->set_text(_("Disk quotas for this device:")); - quoteuserDeviceLabel->set_text(_("Device:")); - quoteuserGroupQuotasLabel->set_text(_("User quotas for this device: ")); - quoteuserSizeFrameLabel->set_text(_("Size")); - quoteuserSizeCurrentlyLabel->set_text(_("Currently using:")); - quoteuserSizeSoftLimitLabel->set_text(_("Soft limit")); - quoteuserSizeHardLimitLabel1->set_text(_("Hard limit")); - quoteuserFileSystemLabel->set_text(_("File system:")); - quoteuserFilesFrameLabel->set_text(_("Files")); - quoteuserFilesCurrentlyLabel->set_text(_("Currently using: ")); - quoteuserFilesSoftLimitLabel->set_text(_("Soft limit")); - quoteFilesHardLimitLabel1->set_text(_("Hard limit")); - quoteuserFilesHarLimitLabel->set_text(_("files")); - quoteuserFilesSoftLimitlabel->set_text(_("files")); - quotegroupFileSystemLabel->set_text(_("File system:")); - btnLoadGlob->set_label(_("Load from global configuration")); - btnLoadLocal->set_label(_("Load from local configuration")); - btnAbout->set_label(_("About")); - btnSynopsis->set_label(_("Help")); - btnSaveLocalGlob->set_label(_("Save to global and local configuration")); - btnSaveGlob->set_label(_("Save to global configuration")); - btnSaveLocal->set_label(_("Save to local configuration")); - lblHeadFiltersWindow->set_label(_("Filters")); - ProjectTabLabel->set_label(_("Projects")); - usersProjectLabel->set_text(_("Device:")); + aboutWindows->set_comments(str_setting_user); + aboutWindows->set_website(website); + aboutWindows->set_version(_(version_application.c_str())); + aboutWindows->set_website_label(project_Home_page); + generalTabLabel->set_text(str_general_settings); + GroupsTabLabel->set_text(str_groups); + headerAboutTopic->set_label(_(app_name)); + headerTopic->set_label(name_app); + UsersTabLabel->set_text(str_users); + generalGroupsSizeLabel->set_text(str_excess_size_delay); + generalGroupsFilesLabel->set_text(str_excess_files_delay); + generalUsersSizeLabel->set_text(str_excess_size_delay); + generalUsersFilesLabel->set_text(str_excess_files_delay); + generalGroupsSizeWeeksLabel->set_text(str_weeks); + generalGroupsFilesWeeksLabel->set_text(str_weeks); + generalUsersSizeWeeksLabel->set_text(str_weeks); + generalUsersFilesWeeksLabel->set_text(str_weeks); + generalGroupsSizeDaysLabel->set_text(str_days); + generalGroupsFilesDaysLabel->set_text(str_days); + generalUsersSizeDaysLabel->set_text(str_days); + generalUsersFilesDaysLabel->set_text(str_days); + generalGroupsSizeHoursLabel->set_text(str_hours); + generalGroupsFilesHoursLabel->set_text(str_hours); + generalUsersSizeHoursLabel->set_text(str_hours); + generalUsersFilesHoursLabel->set_text(str_hours); + generalGroupsSizeMinutesLabel->set_text(str_minutes); + generalGroupsFilesMinutesLabel->set_text(str_minutes); + generalUsersSizeMinutesLabel->set_text(str_minutes); + generalUsersFilesMinutesLabel->set_text(str_minutes); + lblLoad->set_text(str_load_local); + lblSave->set_text(str_save_local); + groupsDeviceLabel->set_label(str_device); + usersDeviceLabel->set_label(str_device); + headLabel->set_label(str_lb_head); + filtersNameFilterCheckbox->set_label(str_name); + filtersQuotasFilterCheckbox->set_label(str_quotas); + filtersSizeFilterCheckbox->set_label(str_size); + filtersSoftSizeFilterCheckbox->set_label(str_soft_limit_size); + filtersHardSizeFilterCheckbox->set_label(str_hard_limit_size); + filtersHardSizeDelayFilterCheckbox->set_label(str_deferring_hard_limit_size); + filtersHardSizeActivationFilterCheckbox->set_label(str_hard_activation_size); + filtersFilesFilterCheckbox->set_label(str_files); + filtersSoftFilesFilterCheckbox->set_label(str_soft_restriction_files); + filtersHardFilesFilterCheckbox->set_label(str_severe_limitation_files); + filtersHardFilesDelayFilterCheckbox->set_label(str_deferring_limit_files); + filtersHardFilesActivationFilterCheckbox->set_label(str_hard_limit_time); + quotegroupDeviceLabel->set_text(str_device); + quotegroupDiskQuotasLabel->set_text(str_disk_quotas_device); + quotegroupGroupQuotasLabel->set_text(str_group_quotas_device); + quotegroupSizeFrameLabel->set_text(str_size); + quotegroupFilesFrameLabel->set_text(str_files); + quotegroupSizeCurrentlyLabel->set_text(str_currently_using); + quotegroupSizeSoftLimitLabel->set_text(str_soft_limit); + quoteSizeHardLimitLabel->set_text(str_hard_limit); + quoteFilesHardLimitLabel->set_text(str_hard_limit); + quotegroupFilesSoftLimitLabel->set_text(str_soft_limit); + quotegroupFilesCurrentlyLabel->set_text(str_currently_using); + quoteuserDiskQuotasLabel->set_text(str_disk_quotas_device); + quoteuserDeviceLabel->set_text(str_device); + quoteuserGroupQuotasLabel->set_text(str_user_quotas_device); + quoteuserSizeFrameLabel->set_text(str_size); + quoteuserSizeCurrentlyLabel->set_text(str_currently_using); + quoteuserSizeSoftLimitLabel->set_text(str_soft_limit); + quoteuserSizeHardLimitLabel1->set_text(str_hard_limit); + quoteuserFileSystemLabel->set_text(str_file_system); + quoteuserFilesFrameLabel->set_text(str_files); + quoteuserFilesCurrentlyLabel->set_text(str_currently_using_space); + quoteuserFilesSoftLimitLabel->set_text(str_soft_limit); + quoteFilesHardLimitLabel1->set_text(str_hard_limit); + quoteuserFilesHarLimitLabel->set_text(str_files); + quoteuserFilesSoftLimitlabel->set_text(str_files); + quotegroupFileSystemLabel->set_text(str_file_system); + btnLoadGlob->set_label(load_global); + btnLoadLocal->set_label(load_local); + btnAbout->set_label(str_about_1); + btnSynopsis->set_label(str_help); + btnSaveLocalGlob->set_label(save_all); + btnSaveGlob->set_label(save_global); + btnSaveLocal->set_label(save_local); + lblHeadFiltersWindow->set_label(str_filters); + ProjectTabLabel->set_label(str_projects); + usersProjectLabel->set_text(str_device); } void MainWindow::view_add_columns(Gtk::TreeView &treeView) { - treeView.append_column(_("Name"), m_columns.name); - treeView.append_column_editable(_("Quotas"), m_columns.quotas); - treeView.append_column(_("Size"), m_columns.size); - treeView.append_column(_("Soft limit\n(size)"), m_columns.soft_limit_size); - treeView.append_column(_("Severe\nlimitation\n(size)"), m_columns.hard_limit_size); - treeView.append_column(_("Deferring\na hard\nlimit\n(size)"), m_columns.hard_limit_size_delay); - treeView.append_column(_("Files"), m_columns.files); - treeView.append_column(_("Soft limit\n(files)"), m_columns.soft_limit_files); - treeView.append_column(_("Severe\nlimitation\n(files)"), m_columns.hard_limit_files); - treeView.append_column(_("Deferring\na hard\nlimit\n(files)"), m_columns.hard_limit_delay); + treeView.append_column(str_name, m_columns.name); + treeView.append_column_editable(str_quotas, m_columns.quotas); + treeView.append_column(str_size, m_columns.size); + treeView.append_column(str_tw_soft_limit, m_columns.soft_limit_size); + treeView.append_column(str_tw_severe_limitation, m_columns.hard_limit_size); + treeView.append_column(str_tw_deferring_size, m_columns.hard_limit_size_delay); + treeView.append_column(str_files, m_columns.files); + treeView.append_column(str_tw_soft_limit_files, m_columns.soft_limit_files); + treeView.append_column(str_tw_severe_limitation_files, m_columns.hard_limit_files); + treeView.append_column(str_tw_severe_limitation_files, m_columns.hard_limit_delay); } void MainWindow::filling_device_combo_box_template(Gtk::ComboBoxText *combo_box, map_str_str &map_device) { @@ -452,8 +454,13 @@ void MainWindow::get_builder() { builder->get_widget("btnFilterProject", btnFilterProject); builder->get_widget("btnFilterUsers", btnFilterUsers); builder->get_widget("btnFilterGroups", btnFilterGroups); - - + #ifdef WEBKIT_FOUND + void *handle=NULL; + handle = dlopen("libwebkit2gtk-4.0.so", RTLD_LAZY); + if (handle) { + builder->get_widget("wndWeb", wndWeb); + } + #endif } @@ -580,8 +587,8 @@ void MainWindow::check_limit(Gtk::CheckButton *check_button, Gtk::SpinButton *sp void MainWindow::info_status_app(string stule) { Glib::RefPtr boxInfo = boxInfoError->get_style_context(); - boxInfo->remove_class("boxInfoMessOK"); - boxInfo->remove_class("boxInfoMessError"); + boxInfo->remove_class(info_box_ok_css); + boxInfo->remove_class(info_box_error_css); boxInfo->add_class(stule); } @@ -654,12 +661,43 @@ void MainWindow::wrapper_save_global_cfg() { } void MainWindow::synopsis_show() { - string cmd = "xdg-open " + string(_("https://wiki.ublinux.com/ru/Программное_обеспечение/Программы_и_утилиты/Все/")) + app_name; + if (flag_open_browser == true) { + this->open_browser(); + } + else { + wndShowWeb->show_all(); + } + +} + +void MainWindow::open_browser() { + #ifdef WEBKIT_FOUND + void *handle=NULL; + handle = dlopen("libwebkit2gtk-4.0.so", RTLD_LAZY); + if (handle) { + webkit_web_view_load_uri(one, link_doc); + wndWeb->show_all(); + } + else { + this->template_open_browser(); + } + #else + this->template_open_browser(); + #endif +} + +void MainWindow::template_open_browser() { + string cmd = cmd_xdg + string(_(link_doc)) + " &"; + string buf = ""; if (geteuid() == 0) { string response_user = getlogin(); - cmd = "su -l " + response_user + " -c \" DISPLAY=$DISPLAY " + cmd + " \""; + int size_s = std::snprintf(nullptr, 0, cmd_execute, response_user.c_str(), cmd.c_str()) + 1; + auto size = static_cast(size_s); + std::unique_ptr buf(new char[ size ]); + std::snprintf( buf.get(), size, cmd_execute, response_user.c_str(), cmd.c_str() ); + cmd = std::string( buf.get(), buf.get() + size - 1 ); } - obj_process_system.call(cmd, "&"); + obj_process_system.call(cmd, ""); } void MainWindow::wrapper_save_system_cfg() { @@ -683,27 +721,27 @@ void MainWindow::load_template(map_str_str* map_temp, string str_load) { void MainWindow::info_warning_error(int mess) { if (obj_load.get_count_error() > 0 || obj_save.get_count_error() > 0) { - info_status_app("boxInfoMessError"); - imgInfo->set_from_icon_name("com.ublinux.ubl-settings-diskquota.warning", Gtk::ICON_SIZE_MENU); + info_status_app(info_box_error_css); + imgInfo->set_from_icon_name(icon_warning, Gtk::ICON_SIZE_MENU); string mess_error = ""; if (mess == 0) { - mess_error = string(_("Local configuration reading error")) + str_cmd_error; + mess_error = string(local_read_error) + str_cmd_error; lblWarning->set_text(mess_error); } else if (mess == 1) { - mess_error = string(_("Global configuration read error")) + str_cmd_error; + mess_error = string(global_read_error) + str_cmd_error; lblWarning->set_text(mess_error); } else if (mess == 2) { - mess_error = string(_("Local configuration write error")) + str_cmd_error; + mess_error = string(local_write_error) + str_cmd_error; lblWarning->set_text(mess_error); } else if (mess == 3) { - mess_error = string(_("Global configuration write error")) + str_cmd_error; + mess_error = string(global_write_error) + str_cmd_error; lblWarning->set_text(mess_error); } else if (mess == 4) { - mess_error = string(_("Error saved local and global configuration")) + str_cmd_error; + mess_error = string(error_save_all) + str_cmd_error; lblWarning->set_text(mess_error); } str_cmd_error = ""; @@ -711,39 +749,43 @@ void MainWindow::info_warning_error(int mess) { obj_save.set_count_error(0); } else { - info_status_app("boxInfoMessOK"); - imgInfo->set_from_icon_name("com.ublinux.ubl-settings-diskquota.checked", Gtk::ICON_SIZE_MENU); + info_status_app(info_box_ok_css); + imgInfo->set_from_icon_name(icon_checked, Gtk::ICON_SIZE_MENU); if (mess == 0) { - lblWarning->set_text(_("Local configuration downloaded successfully")); + lblWarning->set_text(local_load_ok); } else if (mess == 1) { - lblWarning->set_text(_("Global configuration downloaded successfully")); + lblWarning->set_text(global_load_ok); } else if (mess == 2) { - lblWarning->set_text(_("Local configuration successfully written")); + lblWarning->set_text(local_ok_written); } else if (mess == 3) { - lblWarning->set_text(_("Global configuration successfully written")); + lblWarning->set_text(global_ok_written); } else if (mess == 4) { - lblWarning->set_text(_("Successfully saved local and global configuration")); + lblWarning->set_text(successfully_save_all); } else if (mess == 5) { - lblWarning->set_text(_("Nothing to save!")); + lblWarning->set_text(nothing_save); } } } +MainWindow::~MainWindow() { + #ifdef WEBKIT_FOUND + void *handle=NULL; + handle = dlopen("libwebkit2gtk-4.0.so", RTLD_LAZY); + if (handle) { + free(one); + } + #endif +} + void help() { - string version = string(_("ubl-settings-diskquota version: ")) + version_application + "\n"; + string version = string(str_version) + version_application + "\n"; cout << version.c_str(); - string help; - help = "GTK settings quotas. for UBLinux\n\n" - "Usage: ubl-settings-diskquota [OPTIONS...]\n" - "Options:\n" - " -h, --help Show this help\n" - " -V, --version Show package version\n"; - cout << gettext(help.c_str()); + cout << str_help_h; } diff --git a/source/ubl-settings-diskquota.h b/source/ubl-settings-diskquota.h index 40c9666..c253f1a 100644 --- a/source/ubl-settings-diskquota.h +++ b/source/ubl-settings-diskquota.h @@ -9,16 +9,116 @@ #include "my_device.h" #include "system_quotas.h" #include "ubconfig_quotas.h" +#include +#ifdef WEBKIT_FOUND +#include +#endif + +#define copyright _("Copyright © UBSoft LLC, 2022 - ") +#define name_app _("ubl-settings-diskquota") +#define website _("https://wiki.ublinux.com") +#define project_Home_page _("Project Home Page") +#define configuring_system_boot _("Configuring system boot parameters") +#define system_boot _("System boot") +#define str_about _("About ubl-settings-diskquota") +#define command_line_parameters _("Command line parameters:") +#define load_default _("Load default:") +#define seconds _("seconds") +#define download_menu _("Download menu") +#define terminal_for_input _("Terminal for input") +#define terminal_for_output _("Terminal for output") +#define boot_selection_menu_timer _("Boot selection menu timer") +#define str_help _("Help") +#define str_about_1 _("About") +#define str_save_local _("Save") +#define str_load_local _("Load") +#define save_all _("Save to global and local configuration") +#define save_local _("Save local configuration") +#define save_global _("Save global configuration") +#define load_global _("Load global configuration") +#define load_local _("Load local configuration") +#define read_online _("Read online") +#define cancel _("Cancel") +#define local_read_error _("Local configuration reading error") +#define global_read_error _("Global configuration read error") +#define local_write_error _("Local configuration write error") +#define global_write_error _("Global configuration write error") +#define error_save_all _("Error saved local and global configuration") +#define local_load_ok _("Local configuration downloaded successfully") +#define global_load_ok _("Global configuration downloaded successfully") +#define local_ok_written _("Local configuration successfully written") +#define global_ok_written _("Global configuration successfully written") +#define successfully_save_all _("Successfully saved local and global configuration") +#define nothing_save _("Nothing to save!") +#define program_as_root _("The program must be run as root") + +#define str_weeks _("weeks") +#define str_days _("days") +#define str_hours _("hours") +#define str_minutes _("minutes") +#define str_device _("Device:") +#define str_setting_user _("Setting user quotas") +#define str_users _("Users") +#define str_groups _("Groups") +#define str_files _("files") +#define str_hard_limit _("Hard limit") +#define str_file_system _("File system:") +#define str_name _("Name") +#define str_size _("Size") +#define str_lb_head _("Configuration of disk quotas parameters for system groups and users") +#define str_soft_limit _("Soft limit") +#define str_currently_using _("Currently using:") +#define str_currently_using_space _("Currently using: ") +#define str_filters _("Filters") +#define str_projects _("Projects") +#define str_quotas _("Quotas") +#define str_help_h _("GTK settings quotas. for UBLinux\n\n""Usage: ubl-settings-diskquota [OPTIONS...]\n""Options:\n"" -h, --help Show this help\n"" -V, --version Show package version\n") +#define str_version _("ubl-settings-diskquota version: ") +#define str_user _("User") +#define str_group _("Group") +#define str_device_project _("Device\nProject") +#define str_quota _("Quota type") +#define str_status _("Status") +#define str_excess_size_delay _("Excess size delay period") +#define str_excess_files_delay _("Excess files delay period") +#define str_disk_quotas_device _("Disk quotas for this device:") +#define str_user_quotas_device _("User quotas for this device: ") + +#define str_soft_limit_size _("Soft limit (size)") +#define str_hard_limit_size _("Hard limit (size)") +#define str_deferring_hard_limit_size _("Deferring a hard limit (size)") +#define str_hard_activation_size _("Hard limit activation time (size)") +#define str_soft_restriction_files _("Soft Restriction (files)") +#define str_severe_limitation_files _("Severe limitation (files)") +#define str_deferring_limit_files _("Deferring a hard limit (files)") +#define str_hard_limit_time _("Hard limit (file) activation time") +#define str_group_quotas_device _("Group quotas for this device:") +#define str_general_settings _("General settings") + +#define str_tw_soft_limit _("Soft limit\n(size)") +#define str_tw_severe_limitation _("Severe\nlimitation\n(size)") +#define str_tw_deferring_size _("Deferring\na hard\nlimit\n(size)") +#define str_tw_soft_limit_files _("Soft limit\n(files)") +#define str_tw_severe_limitation_files _("Severe\nlimitation\n(files)") +#define str_tw_deferring_limit_files _("Deferring\na hard\nlimit\n(files)") +#define info_box_ok_css "boxInfoMessOK" +#define info_box_error_css "boxInfoMessError" +#define icon_checked "com.ublinux.ubl-settings-diskquota.checked" +#define icon_warning "com.ublinux.ubl-settings-diskquota.warning" + +#define link_doc "https://wiki.ublinux.com/ru/Программное_обеспечение/Программы_и_утилиты/Все/ubl-settings-diskquota" +#define cmd_xdg "xdg-open " +#define cmd_execute "su -l %s -c \" DISPLAY=$DISPLAY %s \"" +#define path_app "/usr/bin/" +#define path_glade "/usr/share/ubl-settings-diskquota/ui/ubl-settings-diskquota.glade" +#define path_css "/usr/share/ubl-settings-diskquota/css/ubl-settings-diskquota.css" +#define app_name "ubl-settings-diskquota" +#define path_resources "/usr/share/ubl-settings-diskquota" +#define path_img_head_background "/usr/share/ubl-settings-diskquota/images/logo-background.png" 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 string version_application; extern int socket_ext_id_I; @@ -208,6 +308,12 @@ class MainWindow : public Gtk::ApplicationWindow { Gtk::Button *btnFilterUsers; Gtk::Button *btnFilterProject; Gtk::ComboBoxText *quotegroupDeviceCombo; + Gtk::Window *wndShowWeb; + #ifdef WEBKIT_FOUND + Gtk::Window *wndWeb; + Gtk::Widget *three; + WebKitWebView *one; + #endif public: Lib_save::Save obj_save = Lib_save::Save(); @@ -226,9 +332,11 @@ class MainWindow : public Gtk::ApplicationWindow { string save_user_or_group; string sys_or_ubconfig; string hw_or_sw = ""; + bool flag_open_browser = false; public: MainWindow(BaseObjectType* obj, Glib::RefPtr const& builder); MainWindow(Glib::RefPtr const& builder); + ~MainWindow(); void settings(); void lacalization(); void add_CSS(); @@ -240,6 +348,8 @@ class MainWindow : public Gtk::ApplicationWindow { void info_status_app(string stule); void groupsFilters_show(); void init_tree_view(); + void template_open_browser(); + void open_browser(); void load_template(map_str_str* map_temp, string str_load); void info_warning_error(int mess); void off_quota_system(Gtk::ComboBoxText* combo_box, string quota_type); From 696928b92465ddf4d54c3814b663480a57068b7c Mon Sep 17 00:00:00 2001 From: Igor Belitskiy Date: Tue, 25 Apr 2023 14:35:31 +0600 Subject: [PATCH 39/51] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=20webkit?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- source/ubl-settings-diskquota.cc | 36 +++-- source/ubl-settings-diskquota.h | 16 +++ ubl-settings-diskquota.glade | 236 ++++++++++++++++++++++++++++++- ubl-settings-diskquota_ru.po | 19 +++ 4 files changed, 297 insertions(+), 10 deletions(-) diff --git a/source/ubl-settings-diskquota.cc b/source/ubl-settings-diskquota.cc index e8d8179..2ca853b 100755 --- a/source/ubl-settings-diskquota.cc +++ b/source/ubl-settings-diskquota.cc @@ -42,6 +42,15 @@ void MainWindow::settings() { ,quotegroupFilesHarLimitLabel); obj_quotas_sys.set_map_gui(map_gui_cfg); obj_quotas_ubconfig.set_map_gui(map_gui_cfg); + #ifdef WEBKIT_FOUND + void *handle=NULL; + handle = dlopen("libwebkit2gtk-4.0.so", RTLD_LAZY); + if (handle) { + one = WEBKIT_WEB_VIEW( webkit_web_view_new() ); + three = Glib::wrap(GTK_WIDGET(one)); + wndWeb->add(*three); + } + #endif if (geteuid() == 0) { this->load_system_cfg(); this->load_global_cfg(); @@ -59,15 +68,7 @@ void MainWindow::settings() { builder->get_widget("boxColor", boxWidget); HeadOverlay->add_overlay(*boxWidget); ubl_make_plugs(boxSave, boxButton, socket_ext_id_I, socket_trd_id_I); - #ifdef WEBKIT_FOUND - void *handle=NULL; - handle = dlopen("libwebkit2gtk-4.0.so", RTLD_LAZY); - if (handle) { - one = WEBKIT_WEB_VIEW( webkit_web_view_new() ); - three = Glib::wrap(GTK_WIDGET(one)); - wndWeb->add(*three); - } - #endif + } void MainWindow::init_spin_all() { @@ -243,6 +244,12 @@ void MainWindow::lacalization() { lblHeadFiltersWindow->set_label(str_filters); ProjectTabLabel->set_label(str_projects); usersProjectLabel->set_text(str_device); + lblhelpHeader->set_text(read_documentation_web); + lblhelpText->set_text(redirected_documentation); + btnReadHelp->set_label(read_online); + btnCancelHelp->set_label(cancel); + chkAlwaysOpenHelp->set_label(always_redirect); + lblwebHeaderName->set_label(name_app); } @@ -461,10 +468,21 @@ void MainWindow::get_builder() { builder->get_widget("wndWeb", wndWeb); } #endif + builder->get_widget("lblHeadeWndWeb", lblHeadeWndWeb); + builder->get_widget("lblwebHeaderName", lblwebHeaderName); + builder->get_widget("lblhelpText", lblhelpText); + builder->get_widget("lblhelpHeader", lblhelpHeader); + builder->get_widget("chkAlwaysOpenHelp", chkAlwaysOpenHelp); + builder->get_widget("btnReadHelp", btnReadHelp); + builder->get_widget("btnCancelHelp", btnCancelHelp); + builder->get_widget("wndShowWeb", wndShowWeb); } void MainWindow::event() { + btnCancelHelp->signal_clicked().connect([&]() {wndShowWeb->hide();}); + chkAlwaysOpenHelp->signal_toggled().connect([&]() {flag_open_browser = true;}); + btnReadHelp->signal_clicked().connect(sigc::mem_fun(*this, &MainWindow::open_browser)); btnFilterGroups->signal_clicked().connect([&]() {this->groupsFilters_show();}); btnFilterUsers->signal_clicked().connect([&]() {this->groupsFilters_show();}); btnFilterProject->signal_clicked().connect([&]() {this->groupsFilters_show();}); diff --git a/source/ubl-settings-diskquota.h b/source/ubl-settings-diskquota.h index c253f1a..27943c3 100644 --- a/source/ubl-settings-diskquota.h +++ b/source/ubl-settings-diskquota.h @@ -39,6 +39,14 @@ #define load_local _("Load local configuration") #define read_online _("Read online") #define cancel _("Cancel") +#define always_redirect _("Always redirect") +#define boot_screen_display_mode _("Boot screen display mode:") +#define no_loading_animation _("No loading animation, full log") +#define boot_menu_user_name _("Boot menu user name:") +#define boot_menu_user_password _("Boot menu user password:") +#define last_successful_upload _("Last successful upload") +#define read_documentation_web _("Would you like to read documentation in the Web?") +#define redirected_documentation _("You will be redirected to documentation site, where user help pages are ""translated and supported by community.") #define local_read_error _("Local configuration reading error") #define global_read_error _("Global configuration read error") #define local_write_error _("Local configuration write error") @@ -308,6 +316,14 @@ class MainWindow : public Gtk::ApplicationWindow { Gtk::Button *btnFilterUsers; Gtk::Button *btnFilterProject; Gtk::ComboBoxText *quotegroupDeviceCombo; + Gtk::Label *lblHeadeWndWeb; + + Gtk::Label *lblwebHeaderName; + Gtk::Label *lblhelpText; + Gtk::Label *lblhelpHeader; + Gtk::CheckButton *chkAlwaysOpenHelp; + Gtk::Button *btnReadHelp; + Gtk::Button *btnCancelHelp; Gtk::Window *wndShowWeb; #ifdef WEBKIT_FOUND Gtk::Window *wndWeb; diff --git a/ubl-settings-diskquota.glade b/ubl-settings-diskquota.glade index 5c188a9..ebd182e 100644 --- a/ubl-settings-diskquota.glade +++ b/ubl-settings-diskquota.glade @@ -1,5 +1,5 @@ - + @@ -4247,4 +4247,238 @@ + + False + start + start + False + 450 + 250 + dialog-question-symbolic + + + True + False + vertical + + + True + False + + + True + False + start + 20 + 20 + dialog-question-symbolic + 6 + + + False + True + 0 + + + + + True + False + vertical + + + True + False + start + 10 + 5 + Would you like to read documentation in the Web? + True + 0 + + + + + + + False + True + 0 + + + + + True + False + start + start + 10 + 10 + You will be redirected to documentation website where documentation is translated and supported by community. + True + 0 + + + + True + True + 1 + + + + + Always redirect to online documentation + True + True + False + end + 10 + True + + + + False + True + 2 + + + + + + True + True + 1 + + + + + + True + True + 0 + + + + + True + False + 5 + 5 + 5 + 5 + 5 + 5 + 30 + True + + + Cancel + True + True + True + + + + True + True + 0 + + + + + Read Online + True + True + True + + + + True + True + 1 + + + + + False + True + 1 + + + + + + + True + False + True + + + True + False + ubl-settings-datetime + + + + + + + + True + False + 32 + dialog-question-symbolic + + + + + + + 800 + 600 + False + True + True + com.ublinux.ubl-settings-datetime + + + + + + True + False + True + + + True + False + ubl-settings-datetime + + + + + True + False + 32 + com.ublinux.ubl-settings-datetime + 5 + + + + + diff --git a/ubl-settings-diskquota_ru.po b/ubl-settings-diskquota_ru.po index 6538b83..ca810bb 100644 --- a/ubl-settings-diskquota_ru.po +++ b/ubl-settings-diskquota_ru.po @@ -17,6 +17,25 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" +msgid "Would you like to read documentation in the Web?" +msgstr "Вы хотите прочитать справку в Сети?" + +msgid "" +"You will be redirected to documentation site, where user help pages are " +"translated and supported by community." +msgstr "" +"Вы будете перенаправлены на сайт с документацией где страницы помощи " +"переводятся и поддерживаются сообществом." + +msgid "Cancel" +msgstr "Отменить" + +msgid "Always redirect" +msgstr "Всегда перенаправлять" + +msgid "Read online" +msgstr "Прочитать онлайн" + #: source/ubl-settings-quotas.cc:224 source/ubl-settings-quotas.cc:154 #: source/ubl-settings-quotas.cc:144 msgid "About" From 98e6024390bcec110ed0770d2fdc6d217abbeed4 Mon Sep 17 00:00:00 2001 From: Igor Belitskiy Date: Tue, 25 Apr 2023 16:12:01 +0600 Subject: [PATCH 40/51] =?UTF-8?q?=D0=98=D1=81=D0=BF=D1=80=D0=B0=D0=B2?= =?UTF-8?q?=D0=BB=D0=B5=D0=BD=20webkit?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- source/CMakeLists.txt | 15 ++++++++++---- source/ubl-settings-diskquota.cc | 32 +++++------------------------- source/ubl-settings-diskquota.h | 1 + source/ubl-settings-diskquota.h.in | 1 + 4 files changed, 18 insertions(+), 31 deletions(-) create mode 100644 source/ubl-settings-diskquota.h.in diff --git a/source/CMakeLists.txt b/source/CMakeLists.txt index eb46b27..0caeeb7 100644 --- a/source/CMakeLists.txt +++ b/source/CMakeLists.txt @@ -8,22 +8,28 @@ include_directories(${GTK_INCLUDE_DIRS}) link_directories(${GTK_LIBRARY_DIRS}) add_definitions(${GTK_CFLAGS_OTHER}) -option(WEBKIT_FOUND "" ON) +find_library(WEBKIT_LIBRARIES_FOUND webkit2gtk-4.0 webkit2gtk-web-extension-4.0) -if(WEBKIT_FOUND) +option(WEBKIT_FOUND "No" OFF) + +find_library(WEBKIT_LIBRARIES_FOUND webkit2gtk-4.0 webkit2gtk-web-extension-4.0) +if(WEBKIT_LIBRARIES_FOUND) + option(WEBKIT_FOUND "Yes" ON) PKG_CHECK_MODULES(WEBKIT REQUIRED webkit2gtk-4.0 webkit2gtk-web-extension-4.0) include_directories(${WEBKIT_INCLUDE_DIRS}) link_directories(${WEBKIT_LIBRARY_DIRS}) add_definitions(${WEBKIT_CFLAGS_OTHER}) endif() +configure_file(ubl-settings-diskquota.h.in ubl-settings-diskquota-cm.h) -#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 -std=c++2a -g") 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 + ubl-settings-diskquota-cm.h ubl-settings-diskquota.h ubl-settings-diskquota.cc ubconfig_quotas.h @@ -46,13 +52,14 @@ set(SOURCE_FILES my_plug.cc ubl-util-standard.h ubl-util-standard.c - main.cc) + main.cc) set(LIBRARIES ${GTK_LIBRARIES} pthread) add_executable(ubl-settings-diskquota ${SOURCE_FILES}) + target_link_libraries(ubl-settings-diskquota PUBLIC ${WEBKIT_LIBRARIES} ${LIBRARIES}) target_include_directories(ubl-settings-diskquota PUBLIC "${PROJECT_BINARY_DIR}" diff --git a/source/ubl-settings-diskquota.cc b/source/ubl-settings-diskquota.cc index 2ca853b..702e498 100755 --- a/source/ubl-settings-diskquota.cc +++ b/source/ubl-settings-diskquota.cc @@ -43,13 +43,9 @@ void MainWindow::settings() { obj_quotas_sys.set_map_gui(map_gui_cfg); obj_quotas_ubconfig.set_map_gui(map_gui_cfg); #ifdef WEBKIT_FOUND - void *handle=NULL; - handle = dlopen("libwebkit2gtk-4.0.so", RTLD_LAZY); - if (handle) { - one = WEBKIT_WEB_VIEW( webkit_web_view_new() ); - three = Glib::wrap(GTK_WIDGET(one)); - wndWeb->add(*three); - } + one = WEBKIT_WEB_VIEW( webkit_web_view_new() ); + three = Glib::wrap(GTK_WIDGET(one)); + wndWeb->add(*three); #endif if (geteuid() == 0) { this->load_system_cfg(); @@ -462,11 +458,7 @@ void MainWindow::get_builder() { builder->get_widget("btnFilterUsers", btnFilterUsers); builder->get_widget("btnFilterGroups", btnFilterGroups); #ifdef WEBKIT_FOUND - void *handle=NULL; - handle = dlopen("libwebkit2gtk-4.0.so", RTLD_LAZY); - if (handle) { builder->get_widget("wndWeb", wndWeb); - } #endif builder->get_widget("lblHeadeWndWeb", lblHeadeWndWeb); builder->get_widget("lblwebHeaderName", lblwebHeaderName); @@ -690,15 +682,8 @@ void MainWindow::synopsis_show() { void MainWindow::open_browser() { #ifdef WEBKIT_FOUND - void *handle=NULL; - handle = dlopen("libwebkit2gtk-4.0.so", RTLD_LAZY); - if (handle) { - webkit_web_view_load_uri(one, link_doc); - wndWeb->show_all(); - } - else { - this->template_open_browser(); - } + webkit_web_view_load_uri(one, link_doc); + wndWeb->show_all(); #else this->template_open_browser(); #endif @@ -791,13 +776,6 @@ void MainWindow::info_warning_error(int mess) { } MainWindow::~MainWindow() { - #ifdef WEBKIT_FOUND - void *handle=NULL; - handle = dlopen("libwebkit2gtk-4.0.so", RTLD_LAZY); - if (handle) { - free(one); - } - #endif } void help() { diff --git a/source/ubl-settings-diskquota.h b/source/ubl-settings-diskquota.h index 27943c3..62d17d3 100644 --- a/source/ubl-settings-diskquota.h +++ b/source/ubl-settings-diskquota.h @@ -10,6 +10,7 @@ #include "system_quotas.h" #include "ubconfig_quotas.h" #include +#include "ubl-settings-diskquota-cm.h" #ifdef WEBKIT_FOUND #include #endif diff --git a/source/ubl-settings-diskquota.h.in b/source/ubl-settings-diskquota.h.in new file mode 100644 index 0000000..17ba454 --- /dev/null +++ b/source/ubl-settings-diskquota.h.in @@ -0,0 +1 @@ +#cmakedefine WEBKIT_FOUND \ No newline at end of file From 3ad2d49f5b1c7a616cbee5624d0be84386fc1ae9 Mon Sep 17 00:00:00 2001 From: Igor Belitskiy Date: Wed, 26 Apr 2023 10:11:38 +0600 Subject: [PATCH 41/51] =?UTF-8?q?=D0=98=D1=81=D0=BF=D1=80=D0=B0=D0=B2?= =?UTF-8?q?=D0=BB=D0=B5=D0=BD=D0=B0=20=D0=BB=D0=BE=D0=BA=D0=B0=D0=BB=D0=B8?= =?UTF-8?q?=D0=B7=D0=B0=D1=86=D0=B8=D1=8F=20=D0=BA=D0=BD=D0=BE=D0=BF=D0=BE?= =?UTF-8?q?=D0=BA=20"=D0=A1=D0=BE=D1=85=D1=80=D0=B0=D0=BD=D0=B8=D1=82?= =?UTF-8?q?=D1=8C"=20=D0=B8=20"=D0=97=D0=B0=D0=B3=D1=80=D1=83=D0=B7=D0=B8?= =?UTF-8?q?=D1=82=D1=8C"?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- source/ubl-settings-diskquota.cc | 3 +-- source/ubl-settings-diskquota.h | 6 +++--- ubl-settings-diskquota.pot | 10 +++++----- ubl-settings-diskquota_ru.po | 16 ++++++++-------- 4 files changed, 17 insertions(+), 18 deletions(-) diff --git a/source/ubl-settings-diskquota.cc b/source/ubl-settings-diskquota.cc index 702e498..247e3e3 100755 --- a/source/ubl-settings-diskquota.cc +++ b/source/ubl-settings-diskquota.cc @@ -775,8 +775,7 @@ void MainWindow::info_warning_error(int mess) { } } -MainWindow::~MainWindow() { -} +MainWindow::~MainWindow() {} void help() { string version = string(str_version) + version_application + "\n"; diff --git a/source/ubl-settings-diskquota.h b/source/ubl-settings-diskquota.h index 62d17d3..cdf0af6 100644 --- a/source/ubl-settings-diskquota.h +++ b/source/ubl-settings-diskquota.h @@ -33,9 +33,9 @@ #define str_about_1 _("About") #define str_save_local _("Save") #define str_load_local _("Load") -#define save_all _("Save to global and local configuration") -#define save_local _("Save local configuration") -#define save_global _("Save global configuration") +#define save_all _("Save in global and local configuration") +#define save_local _("Save in local configuration") +#define save_global _("Save in global configuration") #define load_global _("Load global configuration") #define load_local _("Load local configuration") #define read_online _("Read online") diff --git a/ubl-settings-diskquota.pot b/ubl-settings-diskquota.pot index 667fa56..6aa929a 100644 --- a/ubl-settings-diskquota.pot +++ b/ubl-settings-diskquota.pot @@ -354,12 +354,12 @@ msgstr "" #: source/ubl-settings-diskquota.cc:222 source/ubl-settings-diskquota.cc:152 #: source/ubl-settings-diskquota.cc:142 -msgid "Load from global configuration" +msgid "Load global configuration" msgstr "" #: source/ubl-settings-diskquota.cc:223 source/ubl-settings-diskquota.cc:153 #: source/ubl-settings-diskquota.cc:143 -msgid "Load from local configuration" +msgid "Load local configuration" msgstr "" #: source/ubl-settings-diskquota.cc:608 source/ubl-settings-diskquota.cc:521 @@ -430,17 +430,17 @@ msgstr "" #: source/ubl-settings-diskquota.cc:226 source/ubl-settings-diskquota.cc:156 #: source/ubl-settings-diskquota.cc:146 -msgid "Save to global and local configuration" +msgid "Save in global and local configuration" msgstr "" #: source/ubl-settings-diskquota.cc:227 source/ubl-settings-diskquota.cc:157 #: source/ubl-settings-diskquota.cc:147 -msgid "Save to global configuration" +msgid "Save in global configuration" msgstr "" #: source/ubl-settings-diskquota.cc:228 source/ubl-settings-diskquota.cc:158 #: source/ubl-settings-diskquota.cc:148 -msgid "Save to local configuration" +msgid "Save in local configuration" msgstr "" #: source/ubl-settings-diskquota.cc:140 source/ubl-settings-diskquota.cc:70 diff --git a/ubl-settings-diskquota_ru.po b/ubl-settings-diskquota_ru.po index ca810bb..1c974ee 100644 --- a/ubl-settings-diskquota_ru.po +++ b/ubl-settings-diskquota_ru.po @@ -434,12 +434,12 @@ msgstr "Загрузить" #: source/ubl-settings-quotas.cc:222 source/ubl-settings-quotas.cc:152 #: source/ubl-settings-quotas.cc:142 -msgid "Load from global configuration" +msgid "Load global configuration" msgstr "Загрузить глобальную конфигурацию" #: source/ubl-settings-quotas.cc:223 source/ubl-settings-quotas.cc:153 #: source/ubl-settings-quotas.cc:143 -msgid "Load from local configuration" +msgid "Load local configuration" msgstr "Загрузить локальную конфигурацию" #: source/ubl-settings-quotas.cc:608 source/ubl-settings-quotas.cc:521 @@ -512,18 +512,18 @@ msgstr "Сохранить" #: source/ubl-settings-quotas.cc:226 source/ubl-settings-quotas.cc:156 #: source/ubl-settings-quotas.cc:146 -msgid "Save to global and local configuration" -msgstr "Сохранить глобальную и локальную конфигурацию" +msgid "Save in global and local configuration" +msgstr "Сохранить в глобальную и локальную конфигурацию" #: source/ubl-settings-quotas.cc:227 source/ubl-settings-quotas.cc:157 #: source/ubl-settings-quotas.cc:147 -msgid "Save to global configuration" -msgstr "Сохранить глобальную конфигурацию" +msgid "Save in global configuration" +msgstr "Сохранить в глобальную конфигурацию" #: source/ubl-settings-quotas.cc:228 source/ubl-settings-quotas.cc:158 #: source/ubl-settings-quotas.cc:148 -msgid "Save to local configuration" -msgstr "Сохранить локальную конфигурацию" +msgid "Save in local configuration" +msgstr "Сохранить в локальную конфигурацию" #: source/ubl-settings-quotas.cc:140 source/ubl-settings-quotas.cc:70 msgid "Setting user quotas" From 7391ba0f896c7485fa6db10c82124287aac2fd86 Mon Sep 17 00:00:00 2001 From: Igor Belitskiy Date: Wed, 26 Apr 2023 15:17:03 +0600 Subject: [PATCH 42/51] =?UTF-8?q?=D0=98=D1=81=D0=BF=D1=80=D0=B0=D0=B2?= =?UTF-8?q?=D0=BB=D0=B5=D0=BD=20README?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/README.md b/README.md index ef1382a..0599d7b 100644 --- a/README.md +++ b/README.md @@ -1,13 +1,13 @@ -# ubl-settings-quotas +# ubl-settings-diskquota # Настройки квот -[RU] Утилита для настройки квот +[RU] Утилита для настройки дисковых квот -Utility for setting the date and time +Utility for setting the disk quotas ![alt text](screenshot/screenshot.png) # Build -In order to build ubl-settings-quotas you will need: +In order to build ubl-settings-diskquota you will need: - CMake - C compiler @@ -31,14 +31,14 @@ $ sudo make uninstall ``` # Usage ```sh -$ ubl-settings-quotas --help +$ ubl-settings-diskquota --help GTK settings quotas for UBLinux -Usage: ubl-settings-quotas [OPTIONS...] +Usage: ubl-settings-diskquota [OPTIONS...] Options: -h, --help Show this help -V, --version Show package version -$ ubl-settings-quotas --version -ubl-settings-quotas version: x.xx +$ ubl-settings-diskquota --version +ubl-settings-diskquota version: x.xx ``` From e316e23369a5894cd180311c2fc5ff2bf7915a2c Mon Sep 17 00:00:00 2001 From: Igor Belitskiy Date: Fri, 5 May 2023 09:52:19 +0600 Subject: [PATCH 43/51] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=D1=8B=20=D0=B1=D0=BB=D0=BE=D0=BA=D0=B8=D1=80=D0=BE?= =?UTF-8?q?=D0=B2=D0=BA=D0=B8,=20=D0=B8=D1=81=D0=BF=D1=80=D0=B0=D0=B2?= =?UTF-8?q?=D0=BB=D0=B5=D0=BD=20Help=20=D0=B1=D0=BB=D0=BE=D0=BA=D0=B8?= =?UTF-8?q?=D1=80=D0=BE=D0=B2=D0=BE=D0=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- source/main.cc | 22 +++++++++++++++++++-- source/ubl-settings-diskquota.cc | 30 ++++++++++++++++++++++++++++- source/ubl-settings-diskquota.h | 20 +++++++++++++++++-- ubl-settings-diskquota.glade | 7 +++++++ ubl-settings-diskquota_ru.po | 33 ++++++++++++++++++++++++-------- 5 files changed, 99 insertions(+), 13 deletions(-) diff --git a/source/main.cc b/source/main.cc index 319c259..85d79f4 100644 --- a/source/main.cc +++ b/source/main.cc @@ -61,15 +61,33 @@ void pars_flag(int index_start, int argc, char* argv[]) { exit(1); } else if (str_argv == "--version" || str_argv == "-v"){ - string version = string(_("ubl-settings-diskquota version: ")) + version_application + "\n"; + string version = string(str_version) + version_application + "\n"; cout << version.c_str(); exit(1); } + else if (str_argv == "--lock-help") { + flag_lock_help = true; + } + else if (str_argv == "--lock-save") { + flag_save = true; + flag_save_local = true; + flag_save_global = true; + } + else if (str_argv == "--lock-save-local"){ + flag_save_local = true; + } + else if (str_argv == "--lock-save-global"){ + flag_save_global = true; + } + else if (str_argv == "--lock-load-global"){ + flag_load_global = true; + } else{ if (index_start == 1){ - cout << (_("Argument not recognized\n")) << endl; + g_print(no_recognized); } } + } } \ No newline at end of file diff --git a/source/ubl-settings-diskquota.cc b/source/ubl-settings-diskquota.cc index 247e3e3..5611faf 100755 --- a/source/ubl-settings-diskquota.cc +++ b/source/ubl-settings-diskquota.cc @@ -3,7 +3,11 @@ using namespace std; int socket_ext_id_I = 0; int socket_trd_id_I = 0; - +bool flag_save = false; +bool flag_save_local = false; +bool flag_save_global = false; +bool flag_load_global = false; +bool flag_lock_help = false; string version_application = "1.0"; MainWindow::MainWindow(BaseObjectType* obj, Glib::RefPtr const& builder) @@ -21,6 +25,7 @@ void MainWindow::settings() { this->get_builder(); this->lacalization(); this->add_CSS(); + this->flag_block_gui(); btnBoxAboutDialog->set_visible(false); map_device = obj_device.get_parted(); this->filling_device_combo_box_template(groupsDeviceCombo, map_device); @@ -271,6 +276,29 @@ void MainWindow::filling_device_combo_box_template(Gtk::ComboBoxText *combo_box, } } +void MainWindow::flag_block_gui() { + if (flag_load_global == true) { + btnLoadGlob->set_sensitive(false); + } + if (flag_save_local == true && flag_save_global == true) { + btnSave->set_sensitive(false); + } + if (flag_save == true) { + btnSave->set_sensitive(false); + } + if (flag_save_local == true) { + btnSaveLocal->set_sensitive(false); + btnSaveLocalGlob->set_sensitive(false); + } + if (flag_save_global == true) { + btnSaveGlob->set_sensitive(false); + btnSaveLocalGlob->set_sensitive(false); + } + if (flag_lock_help == true) { + btnSynopsis->set_sensitive(false); + } +} + void MainWindow::entry_combo_box_temp(Gtk::ComboBoxText *combo_box, Gtk::Label *label) { string text = combo_box->get_active_text(); if (map_device.find(text) != map_device.end()){ diff --git a/source/ubl-settings-diskquota.h b/source/ubl-settings-diskquota.h index cdf0af6..56075e0 100644 --- a/source/ubl-settings-diskquota.h +++ b/source/ubl-settings-diskquota.h @@ -81,7 +81,17 @@ #define str_filters _("Filters") #define str_projects _("Projects") #define str_quotas _("Quotas") -#define str_help_h _("GTK settings quotas. for UBLinux\n\n""Usage: ubl-settings-diskquota [OPTIONS...]\n""Options:\n"" -h, --help Show this help\n"" -V, --version Show package version\n") +#define str_help_h _("GTK settings diskquota for UBLinux\n" \ + "\n" \ + "Usage: ubl-settings-diskquota [OPTIONS...]\n" \ + "Options:\n" \ + " -h, --help\t Show this help\n" \ + " -V, --version\t Show package version\n" \ + " --lock-help Lock utility help\n" \ + " --lock-save Lock saving local and global configuration\n" \ + " --lock-save-local Lock save global configuration\n" \ + " --lock-save-global Lock load global configuration\n" \ + " --lock-load-global Lock load global configuration\n") #define str_version _("ubl-settings-diskquota version: ") #define str_user _("User") #define str_group _("Group") @@ -125,11 +135,16 @@ #define app_name "ubl-settings-diskquota" #define path_resources "/usr/share/ubl-settings-diskquota" #define path_img_head_background "/usr/share/ubl-settings-diskquota/images/logo-background.png" +#define no_recognized _("Argument not recognized\n") using namespace std; extern string version_application; - +extern bool flag_save; +extern bool flag_save_local; +extern bool flag_save_global; +extern bool flag_load_global; +extern bool flag_lock_help; extern int socket_ext_id_I; extern int socket_trd_id_I; class MainWindow : public Gtk::ApplicationWindow { @@ -355,6 +370,7 @@ class MainWindow : public Gtk::ApplicationWindow { MainWindow(Glib::RefPtr const& builder); ~MainWindow(); void settings(); + void flag_block_gui(); void lacalization(); void add_CSS(); void get_builder(); diff --git a/ubl-settings-diskquota.glade b/ubl-settings-diskquota.glade index ebd182e..c5aa5b7 100644 --- a/ubl-settings-diskquota.glade +++ b/ubl-settings-diskquota.glade @@ -549,6 +549,13 @@ + + + True + False + True + + True diff --git a/ubl-settings-diskquota_ru.po b/ubl-settings-diskquota_ru.po index 1c974ee..4c97fb2 100644 --- a/ubl-settings-diskquota_ru.po +++ b/ubl-settings-diskquota_ru.po @@ -228,19 +228,30 @@ msgid "Filters" msgstr "Фильтры" msgid "" -"GTK settings quotas. for UBLinux\n" -"\n" -"Usage: ubl-settings-quotas [OPTIONS...]\n" -"Options:\n" -" -h, --help\t Show this help\n" -" -V, --version\t Show package version\n" +"GTK settings diskquota for UBLinux\n" +"\n" +"Usage: ubl-settings-diskquota [OPTIONS...]\n" +"Options:\n" +" -h, --help\t Show this help\n" +" -V, --version\t Show package version\n" +" --lock-help Lock utility help\n" +" --lock-save Lock saving local and global configuration\n" +" --lock-save-local Lock save global configuration\n" +" --lock-save-global Lock load global configuration\n" +" --lock-load-global Lock load global configuration\n" msgstr "" -"GTK-утилита настройки квот для UBLinux\n" +"GTK утилита настройки дисковых для UBLinux\n" "\n" -"Использование: ubl-settings-quotas [Параметры приложения...]\n" +"Использование: ubl-settings-diskquota [Параметры приложения...]\n" "Параметры приложения:\n" " -h, --help\t Показать параметры справки\n" " -V, --version\t Показать версию пакета\n" +" --lock-help Блокировка вызова справки\n" +" --lock-save Блокировка сохранения локальной и глобальной " +"конфигурации\n" +" --lock-save-local Блокировка сохранения локальной конфигурации\n" +" --lock-save-global Блокировка сохранения глобальной конфигурации\n" +" --lock-load-global Блокировка загрузки глобальной конфигурации\n" #: source/ubl-settings-quotas.cc:144 source/ubl-settings-quotas.cc:74 #: source/ubl-settings-quotas.cc:66 source/ubl-settings-quotas.cc:87 @@ -762,6 +773,12 @@ msgstr "ubl-settings-quotas версия: " msgid "weeks" msgstr "недели" +msgid "Argument not recognized\n" +msgstr "Аргумент не распознан\n" + +msgid "ubl-settings-diskquota version: " +msgstr "ubl-settings-diskquota версия: " + msgid "ubl-settings-quotas" msgstr "Квоты" From 54fd25c9c941fa9a4e0a3c354268f2066ff185be Mon Sep 17 00:00:00 2001 From: Igor Belitskiy Date: Fri, 5 May 2023 09:55:47 +0600 Subject: [PATCH 44/51] =?UTF-8?q?=D0=98=D1=81=D0=BF=D1=80=D0=B0=D0=B2?= =?UTF-8?q?=D0=BB=D0=B5=D0=BD=20README.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 17 +++++++++++------ source/ubl-settings-diskquota.h | 2 +- ubl-settings-diskquota_ru.po | 2 +- 3 files changed, 13 insertions(+), 8 deletions(-) diff --git a/README.md b/README.md index 0599d7b..56811b5 100644 --- a/README.md +++ b/README.md @@ -32,12 +32,17 @@ $ sudo make uninstall # Usage ```sh $ ubl-settings-diskquota --help -GTK settings quotas for UBLinux - -Usage: ubl-settings-diskquota [OPTIONS...] -Options: - -h, --help Show this help - -V, --version Show package version +GTK settings disk quota for UBLinux + +Usage: ubl-settings-diskquota [OPTIONS...] +Options: + -h, --help Show this help + -V, --version Show package version + --lock-help Lock utility help + --lock-save Lock saving local and global configuration + --lock-save-local Lock save global configuration + --lock-save-global Lock load global configuration + --lock-load-global Lock load global configuration $ ubl-settings-diskquota --version ubl-settings-diskquota version: x.xx diff --git a/source/ubl-settings-diskquota.h b/source/ubl-settings-diskquota.h index 56075e0..1631dfc 100644 --- a/source/ubl-settings-diskquota.h +++ b/source/ubl-settings-diskquota.h @@ -81,7 +81,7 @@ #define str_filters _("Filters") #define str_projects _("Projects") #define str_quotas _("Quotas") -#define str_help_h _("GTK settings diskquota for UBLinux\n" \ +#define str_help_h _("GTK settings disk quota for UBLinux\n" \ "\n" \ "Usage: ubl-settings-diskquota [OPTIONS...]\n" \ "Options:\n" \ diff --git a/ubl-settings-diskquota_ru.po b/ubl-settings-diskquota_ru.po index 4c97fb2..e9ae19c 100644 --- a/ubl-settings-diskquota_ru.po +++ b/ubl-settings-diskquota_ru.po @@ -228,7 +228,7 @@ msgid "Filters" msgstr "Фильтры" msgid "" -"GTK settings diskquota for UBLinux\n" +"GTK settings disk quota for UBLinux\n" "\n" "Usage: ubl-settings-diskquota [OPTIONS...]\n" "Options:\n" From 825d9244c984de3af7c9f3078b483513f6b93167 Mon Sep 17 00:00:00 2001 From: Igor Belitskiy Date: Fri, 5 May 2023 10:09:49 +0600 Subject: [PATCH 45/51] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=D0=B0=20=D0=BB=D0=BE=D0=BA=D0=B0=D0=BB=D0=B8=D0=B7?= =?UTF-8?q?=D0=B0=D1=86=D0=B8=D1=8F=20=D0=B4=D0=BB=D1=8F=20=D0=BA=D0=BD?= =?UTF-8?q?=D0=BE=D0=BF=D0=BA=D0=B8=20=D1=80=D0=B5=D0=B6=D0=B8=D0=BC=D0=B0?= =?UTF-8?q?=20=D0=BA=D0=B2=D0=BE=D1=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- source/ubl-settings-diskquota.cc | 4 ++++ source/ubl-settings-diskquota.h | 2 ++ ubl-settings-diskquota.glade | 15 ++++++++------- ubl-settings-diskquota.pot | 3 +++ ubl-settings-diskquota_ru.po | 3 +++ 5 files changed, 20 insertions(+), 7 deletions(-) diff --git a/source/ubl-settings-diskquota.cc b/source/ubl-settings-diskquota.cc index 5611faf..68e3d4a 100755 --- a/source/ubl-settings-diskquota.cc +++ b/source/ubl-settings-diskquota.cc @@ -251,6 +251,7 @@ void MainWindow::lacalization() { btnCancelHelp->set_label(cancel); chkAlwaysOpenHelp->set_label(always_redirect); lblwebHeaderName->set_label(name_app); + chbMangSystemFile->set_label(str_quotas_mode); } @@ -496,6 +497,9 @@ void MainWindow::get_builder() { builder->get_widget("btnReadHelp", btnReadHelp); builder->get_widget("btnCancelHelp", btnCancelHelp); builder->get_widget("wndShowWeb", wndShowWeb); + builder->get_widget("chbMangSystemFile", chbMangSystemFile); + + } diff --git a/source/ubl-settings-diskquota.h b/source/ubl-settings-diskquota.h index 1631dfc..e6550f8 100644 --- a/source/ubl-settings-diskquota.h +++ b/source/ubl-settings-diskquota.h @@ -74,6 +74,7 @@ #define str_file_system _("File system:") #define str_name _("Name") #define str_size _("Size") +#define str_quotas_mode _("Direct control of the file system") #define str_lb_head _("Configuration of disk quotas parameters for system groups and users") #define str_soft_limit _("Soft limit") #define str_currently_using _("Currently using:") @@ -341,6 +342,7 @@ class MainWindow : public Gtk::ApplicationWindow { Gtk::Button *btnReadHelp; Gtk::Button *btnCancelHelp; Gtk::Window *wndShowWeb; + Gtk::CheckMenuItem *chbMangSystemFile; #ifdef WEBKIT_FOUND Gtk::Window *wndWeb; Gtk::Widget *three; diff --git a/ubl-settings-diskquota.glade b/ubl-settings-diskquota.glade index c5aa5b7..be2d973 100644 --- a/ubl-settings-diskquota.glade +++ b/ubl-settings-diskquota.glade @@ -528,6 +528,14 @@ False False False + + + True + False + Direct control of the file system + True + + True @@ -549,13 +557,6 @@ - - - True - False - True - - True diff --git a/ubl-settings-diskquota.pot b/ubl-settings-diskquota.pot index 6aa929a..54d8ef3 100644 --- a/ubl-settings-diskquota.pot +++ b/ubl-settings-diskquota.pot @@ -357,6 +357,9 @@ msgstr "" msgid "Load global configuration" msgstr "" +msgid "Direct control of the file system" +msgstr "" + #: source/ubl-settings-diskquota.cc:223 source/ubl-settings-diskquota.cc:153 #: source/ubl-settings-diskquota.cc:143 msgid "Load local configuration" diff --git a/ubl-settings-diskquota_ru.po b/ubl-settings-diskquota_ru.po index e9ae19c..bc44df0 100644 --- a/ubl-settings-diskquota_ru.po +++ b/ubl-settings-diskquota_ru.po @@ -227,6 +227,9 @@ msgstr "Файлы" msgid "Filters" msgstr "Фильтры" +msgid "Direct control of the file system" +msgstr "Прямое управление файловой системой" + msgid "" "GTK settings disk quota for UBLinux\n" "\n" From a224a93766e0207a16ab0466f23ca57a8f73276a Mon Sep 17 00:00:00 2001 From: Igor Belitskiy Date: Fri, 5 May 2023 11:13:03 +0600 Subject: [PATCH 46/51] =?UTF-8?q?=D0=98=D1=81=D0=BF=D1=80=D0=B0=D0=B2?= =?UTF-8?q?=D0=BB=D0=B5=D0=BD=20treeView?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- source/ubl-settings-diskquota.cc | 6 ++-- source/ubl-settings-diskquota.h | 27 +++++++++--------- ubl-settings-diskquota_ru.po | 47 +++++++++++++++++++++++--------- 3 files changed, 52 insertions(+), 28 deletions(-) diff --git a/source/ubl-settings-diskquota.cc b/source/ubl-settings-diskquota.cc index 68e3d4a..35c46b2 100755 --- a/source/ubl-settings-diskquota.cc +++ b/source/ubl-settings-diskquota.cc @@ -150,12 +150,14 @@ void MainWindow::init_tree_view_general() { GeneralQuotasTree->append_column(str_device_project, m_columnsGeneral.device); GeneralQuotasTree->append_column(str_user, m_columnsGeneral.user); GeneralQuotasTree->append_column(str_group, m_columnsGeneral.group); + GeneralQuotasTree->append_column(str_projects, m_columnsGeneral.projects); GeneralQuotasTree->append_column(str_tw_soft_limit, m_columnsGeneral.soft_limit_size); GeneralQuotasTree->append_column(str_tw_severe_limitation, m_columnsGeneral.hard_limit_size); - GeneralQuotasTree->append_column(str_tw_deferring_size, m_columnsGeneral.hard_limit_size_delay); GeneralQuotasTree->append_column(str_tw_soft_limit_files, m_columnsGeneral.soft_limit_files); GeneralQuotasTree->append_column(str_tw_severe_limitation_files, m_columnsGeneral.hard_limit_files); - GeneralQuotasTree->append_column(str_tw_severe_limitation_files, m_columnsGeneral.hard_limit_delay); + GeneralQuotasTree->append_column(str_tw_deferring_size, m_columnsGeneral.deferring_size); + GeneralQuotasTree->append_column(str_tw_deferring_files, m_columnsGeneral.deferring_files); + } void MainWindow::lacalization() { time_t now = time(0); diff --git a/source/ubl-settings-diskquota.h b/source/ubl-settings-diskquota.h index e6550f8..283a25b 100644 --- a/source/ubl-settings-diskquota.h +++ b/source/ubl-settings-diskquota.h @@ -105,22 +105,22 @@ #define str_user_quotas_device _("User quotas for this device: ") #define str_soft_limit_size _("Soft limit (size)") +#define str_tw_soft_limit _("Soft limit\n(size)") #define str_hard_limit_size _("Hard limit (size)") #define str_deferring_hard_limit_size _("Deferring a hard limit (size)") #define str_hard_activation_size _("Hard limit activation time (size)") -#define str_soft_restriction_files _("Soft Restriction (files)") -#define str_severe_limitation_files _("Severe limitation (files)") -#define str_deferring_limit_files _("Deferring a hard limit (files)") #define str_hard_limit_time _("Hard limit (file) activation time") #define str_group_quotas_device _("Group quotas for this device:") #define str_general_settings _("General settings") -#define str_tw_soft_limit _("Soft limit\n(size)") #define str_tw_severe_limitation _("Severe\nlimitation\n(size)") -#define str_tw_deferring_size _("Deferring\na hard\nlimit\n(size)") +#define str_tw_deferring_size _("Deferring\n(size)") +#define str_tw_deferring_files _("Deferring\n(files)") #define str_tw_soft_limit_files _("Soft limit\n(files)") #define str_tw_severe_limitation_files _("Severe\nlimitation\n(files)") -#define str_tw_deferring_limit_files _("Deferring\na hard\nlimit\n(files)") +#define str_soft_restriction_files _("Soft Restriction (files)") +#define str_severe_limitation_files _("Severe limitation (files)") +#define str_deferring_limit_files _("Deferring a hard limit (files)") #define info_box_ok_css "boxInfoMessOK" #define info_box_error_css "boxInfoMessError" #define icon_checked "com.ublinux.ubl-settings-diskquota.checked" @@ -155,7 +155,7 @@ class MainWindow : public Gtk::ApplicationWindow { ModelColumns() {add(name), add(quotas); add(size), add(soft_limit_size), add(hard_limit_size); add(hard_limit_size_delay), add(files); add(soft_limit_files), - add(hard_limit_files), add(hard_limit_delay); } + add(hard_limit_delay), add(hard_limit_files); } Gtk::TreeModelColumn name; Gtk::TreeModelColumn quotas; Gtk::TreeModelColumn size; @@ -164,26 +164,27 @@ class MainWindow : public Gtk::ApplicationWindow { Gtk::TreeModelColumn hard_limit_size_delay; Gtk::TreeModelColumn files; Gtk::TreeModelColumn soft_limit_files; - Gtk::TreeModelColumn hard_limit_files; Gtk::TreeModelColumn hard_limit_delay; + Gtk::TreeModelColumn hard_limit_files; }; class ModelColumnsGeneral : public Gtk::TreeModel::ColumnRecord { public: ModelColumnsGeneral() {add(status), add(type_quotas); add(device), - add(user), add(group); add(soft_limit_size), - add(hard_limit_size); add(hard_limit_size_delay); - add(soft_limit_files), add(hard_limit_files), add(hard_limit_delay); } + add(user), add(group), add(projects); add(soft_limit_size), + add(hard_limit_size); add(soft_limit_files), add(hard_limit_files), add(deferring_size), + add(deferring_files); } Gtk::TreeModelColumn status; Gtk::TreeModelColumn type_quotas; Gtk::TreeModelColumn device; Gtk::TreeModelColumn user; Gtk::TreeModelColumn group; + Gtk::TreeModelColumn projects; Gtk::TreeModelColumn soft_limit_size; Gtk::TreeModelColumn hard_limit_size; - Gtk::TreeModelColumn hard_limit_size_delay; Gtk::TreeModelColumn soft_limit_files; Gtk::TreeModelColumn hard_limit_files; - Gtk::TreeModelColumn hard_limit_delay; + Gtk::TreeModelColumn deferring_size; + Gtk::TreeModelColumn deferring_files; }; ModelColumns m_columns; ModelColumnsGeneral m_columnsGeneral; diff --git a/ubl-settings-diskquota_ru.po b/ubl-settings-diskquota_ru.po index bc44df0..8b9b0ac 100644 --- a/ubl-settings-diskquota_ru.po +++ b/ubl-settings-diskquota_ru.po @@ -91,6 +91,20 @@ msgstr "" "ограничения\n" "(файлы)" +msgid "" +"Deferring\n" +"(files)" +msgstr "" +"Отсрочка\n" +"(файлы)" + +msgid "" +"Deferring\n" +"(size)" +msgstr "" +"Отсрочка\n" +"(объём)" + #: source/ubl-settings-quotas.cc:239 source/ubl-settings-quotas.cc:374 msgid "" "Deferring\n" @@ -417,7 +431,7 @@ msgstr "Жесткий лимит (файлы)" #: source/ubl-settings-quotas.cc:108 source/ubl-settings-quotas.cc:129 #: source/ubl-settings-quotas.cc:126 source/ubl-settings-quotas.cc:123 msgid "Hard limit (size)" -msgstr "Жесткий ограничение (объём)" +msgstr "Жесткий лимит (объём)" #: source/ubl-settings-quotas.cc:120 source/ubl-settings-quotas.cc:110 #: source/ubl-settings-quotas.cc:131 source/ubl-settings-quotas.cc:128 @@ -550,7 +564,7 @@ msgid "" "(files)" msgstr "" "Жесткое\n" -"ограничение\n" +"лимит\n" "(файлы)" #: source/ubl-settings-quotas.cc:238 source/ubl-settings-quotas.cc:373 @@ -560,12 +574,12 @@ msgid "" "(size)" msgstr "" "Жесткое\n" -"ограничение\n" +"лимит\n" "(объём)" #: source/ubl-settings-quotas.cc:193 msgid "Severe limitation (files)" -msgstr "Жесткое ограничение (файлы)" +msgstr "Жесткое лимит (файлы)" #: source/ubl-settings-quotas.cc:186 source/ubl-settings-quotas.cc:199 #: source/ubl-settings-quotas.cc:210 source/ubl-settings-quotas.cc:236 @@ -588,12 +602,12 @@ msgid "" "(files)" msgstr "" "Мягкое\n" -"ограничение\n" +"лимит\n" "(файлы)" #: source/ubl-settings-quotas.cc:192 msgid "Soft Restriction (files)" -msgstr "Мягкое ограничение (файлы)" +msgstr "Мягкое лимит (файлы)" #: source/ubl-settings-quotas.cc:202 source/ubl-settings-quotas.cc:205 #: source/ubl-settings-quotas.cc:212 source/ubl-settings-quotas.cc:217 @@ -607,7 +621,7 @@ msgstr "Мягкое ограничение (файлы)" #, fuzzy msgid "Soft limit" msgstr "" -"Мягкий ограничение\n" +"Мягкий лимит\n" "(объём)" #: source/ubl-settings-quotas.cc:322 source/ubl-settings-quotas.cc:326 @@ -618,8 +632,8 @@ msgid "" "(files)" msgstr "" "Мягкий\n" -"ограничение\n" -"(объём)" +"лимит\n" +"(файлы)" #: source/ubl-settings-quotas.cc:237 source/ubl-settings-quotas.cc:372 #: source/ubl-settings-quotas.cc:317 source/ubl-settings-quotas.cc:321 @@ -629,22 +643,29 @@ msgid "" "Soft limit\n" "(size)" msgstr "" -"Мягкий ограничение\n" +"Мягкий лимит\n" "(объём)" +msgid "" +"Soft limit\n" +"(file)" +msgstr "" +"Мягкий лимит\n" +"(файлы)" + #: source/ubl-settings-quotas.cc:122 source/ubl-settings-quotas.cc:112 #: source/ubl-settings-quotas.cc:133 source/ubl-settings-quotas.cc:130 #: source/ubl-settings-quotas.cc:127 msgid "Soft limit (files)" msgstr "" -"Мягкий ограничение\n" +"Мягкий лимит\n" "(файлы)" #: source/ubl-settings-quotas.cc:187 source/ubl-settings-quotas.cc:117 #: source/ubl-settings-quotas.cc:107 source/ubl-settings-quotas.cc:128 #: source/ubl-settings-quotas.cc:125 source/ubl-settings-quotas.cc:122 msgid "Soft limit (size)" -msgstr "Мягкий ограничение (объём)" +msgstr "Мягкий лимит (объём)" #: source/ubl-settings-quotas.cc:620 source/ubl-settings-quotas.cc:533 #: source/ubl-settings-quotas.cc:467 @@ -786,7 +807,7 @@ msgid "ubl-settings-quotas" msgstr "Квоты" #~ msgid "Severe limitation (size)" -#~ msgstr "Жесткое ограничение (объём)" +#~ msgstr "Жесткое лимит (объём)" #, fuzzy #~ msgid "Hard limit activation time (files)" From 5719eaa35b3a2d828263246ea62af45aa2def800 Mon Sep 17 00:00:00 2001 From: Igor Belitskiy Date: Fri, 5 May 2023 11:58:29 +0600 Subject: [PATCH 47/51] =?UTF-8?q?=D0=98=D1=81=D0=BF=D1=80=D0=B0=D0=B2?= =?UTF-8?q?=D0=B8=D0=BB=20=D0=BB=D0=BE=D0=BA=D0=B0=D0=BB=D0=B8=D0=B7=D0=B0?= =?UTF-8?q?=D1=86=D0=B8=D1=8E?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- source/ubl-settings-diskquota.cc | 32 ++--- source/ubl-settings-diskquota.h | 14 ++- ubl-settings-diskquota.glade | 210 +++++++++++++++---------------- 3 files changed, 129 insertions(+), 127 deletions(-) diff --git a/source/ubl-settings-diskquota.cc b/source/ubl-settings-diskquota.cc index 35c46b2..83caa56 100755 --- a/source/ubl-settings-diskquota.cc +++ b/source/ubl-settings-diskquota.cc @@ -155,10 +155,23 @@ void MainWindow::init_tree_view_general() { GeneralQuotasTree->append_column(str_tw_severe_limitation, m_columnsGeneral.hard_limit_size); GeneralQuotasTree->append_column(str_tw_soft_limit_files, m_columnsGeneral.soft_limit_files); GeneralQuotasTree->append_column(str_tw_severe_limitation_files, m_columnsGeneral.hard_limit_files); - GeneralQuotasTree->append_column(str_tw_deferring_size, m_columnsGeneral.deferring_size); - GeneralQuotasTree->append_column(str_tw_deferring_files, m_columnsGeneral.deferring_files); - + GeneralQuotasTree->append_column(str_tw_general_deferring_size, m_columnsGeneral.deferring_size); + GeneralQuotasTree->append_column(str_tw_general_deferring_files, m_columnsGeneral.deferring_files); +} + +void MainWindow::view_add_columns(Gtk::TreeView &treeView) { + treeView.append_column(str_name, m_columns.name); + treeView.append_column_editable(str_quotas, m_columns.quotas); + treeView.append_column(str_size, m_columns.size); + treeView.append_column(str_tw_soft_limit, m_columns.soft_limit_size); + treeView.append_column(str_tw_severe_limitation, m_columns.hard_limit_size); + treeView.append_column(str_tw_deferring_size, m_columns.deferring_size); + treeView.append_column(str_files, m_columns.files); + treeView.append_column(str_tw_soft_limit_files, m_columns.soft_limit_files); + treeView.append_column(str_tw_severe_limitation_files, m_columns.hard_limit_delay); + treeView.append_column(str_tw_deferring_files, m_columns.deferring_files); } + void MainWindow::lacalization() { time_t now = time(0); tm *ltm = localtime(&now); @@ -257,19 +270,6 @@ void MainWindow::lacalization() { } -void MainWindow::view_add_columns(Gtk::TreeView &treeView) { - treeView.append_column(str_name, m_columns.name); - treeView.append_column_editable(str_quotas, m_columns.quotas); - treeView.append_column(str_size, m_columns.size); - treeView.append_column(str_tw_soft_limit, m_columns.soft_limit_size); - treeView.append_column(str_tw_severe_limitation, m_columns.hard_limit_size); - treeView.append_column(str_tw_deferring_size, m_columns.hard_limit_size_delay); - treeView.append_column(str_files, m_columns.files); - treeView.append_column(str_tw_soft_limit_files, m_columns.soft_limit_files); - treeView.append_column(str_tw_severe_limitation_files, m_columns.hard_limit_files); - treeView.append_column(str_tw_severe_limitation_files, m_columns.hard_limit_delay); -} - void MainWindow::filling_device_combo_box_template(Gtk::ComboBoxText *combo_box, map_str_str &map_device) { if (map_device.size() != 0) { for (const auto &device : map_device) { diff --git a/source/ubl-settings-diskquota.h b/source/ubl-settings-diskquota.h index 283a25b..14d0382 100644 --- a/source/ubl-settings-diskquota.h +++ b/source/ubl-settings-diskquota.h @@ -114,8 +114,10 @@ #define str_general_settings _("General settings") #define str_tw_severe_limitation _("Severe\nlimitation\n(size)") -#define str_tw_deferring_size _("Deferring\n(size)") -#define str_tw_deferring_files _("Deferring\n(files)") +#define str_tw_general_deferring_size _("Deferring\n(size)") +#define str_tw_general_deferring_files _("Deferring\n(files)") +#define str_tw_deferring_size _("Deferring\na hard\nlimit\n(files)") +#define str_tw_deferring_files _("Deferring\na hard\nlimit\n(files)") #define str_tw_soft_limit_files _("Soft limit\n(files)") #define str_tw_severe_limitation_files _("Severe\nlimitation\n(files)") #define str_soft_restriction_files _("Soft Restriction (files)") @@ -153,19 +155,19 @@ class MainWindow : public Gtk::ApplicationWindow { class ModelColumns : public Gtk::TreeModel::ColumnRecord { public: ModelColumns() {add(name), add(quotas); add(size), - add(soft_limit_size), add(hard_limit_size); add(hard_limit_size_delay), + add(soft_limit_size), add(hard_limit_size); add(deferring_size), add(files); add(soft_limit_files), - add(hard_limit_delay), add(hard_limit_files); } + add(hard_limit_delay), add(deferring_files); } Gtk::TreeModelColumn name; Gtk::TreeModelColumn quotas; Gtk::TreeModelColumn size; Gtk::TreeModelColumn soft_limit_size; Gtk::TreeModelColumn hard_limit_size; - Gtk::TreeModelColumn hard_limit_size_delay; + Gtk::TreeModelColumn deferring_size; Gtk::TreeModelColumn files; Gtk::TreeModelColumn soft_limit_files; Gtk::TreeModelColumn hard_limit_delay; - Gtk::TreeModelColumn hard_limit_files; + Gtk::TreeModelColumn deferring_files; }; class ModelColumnsGeneral : public Gtk::TreeModel::ColumnRecord { public: diff --git a/ubl-settings-diskquota.glade b/ubl-settings-diskquota.glade index be2d973..ea7b17c 100644 --- a/ubl-settings-diskquota.glade +++ b/ubl-settings-diskquota.glade @@ -30,7 +30,7 @@ True False start - 6 + 5 True @@ -100,8 +100,53 @@ - - Hard limit (size) delay + + True + False + end + 5 + 5 + True + + + gtk-cancel + True + True + True + center + True + + + False + True + 0 + + + + + gtk-save + True + True + True + center + True + + + False + True + 1 + + + + + False + True + 5 + + + + + Hard limit (size) activation time True True False @@ -115,8 +160,8 @@ - - Hard limit (size) activation time + + Hard limit (size) delay True True False @@ -126,7 +171,7 @@ False True - 6 + 5 @@ -204,51 +249,6 @@ 11 - - - True - False - end - 5 - 5 - True - - - gtk-cancel - True - True - True - center - True - - - False - True - 0 - - - - - gtk-save - True - True - True - center - True - - - False - True - 1 - - - - - False - True - 12 - - @@ -376,8 +376,8 @@ 5 5 5 - 6 - 6 + 5 + 5 69 com.ublinux.ubl-settings-diskquota @@ -443,7 +443,7 @@ - 6 + 5 1 10 @@ -463,7 +463,7 @@ 10 - 6 + 5 1 10 @@ -483,7 +483,7 @@ 10 - 6 + 5 1 10 @@ -503,7 +503,7 @@ 10 - 6 + 5 1 10 @@ -648,8 +648,8 @@ 5 5 5 - 6 - 6 + 5 + 5 25 1 @@ -668,8 +668,8 @@ 5 5 5 - 6 - 6 + 5 + 5 @@ -1265,7 +1265,7 @@ False 5 5 - gtk-missing-image + gtk-goto-first False @@ -2782,8 +2782,8 @@ 5 5 5 - 6 - 6 + 5 + 5 32 com.ublinux.ubl-settings-diskquota @@ -3032,8 +3032,8 @@ 5 5 5 - 6 - 6 + 5 + 5 Device: @@ -3046,12 +3046,12 @@ True False - 6 + 5 5 5 5 - 6 - 6 + 5 + 5 True @@ -3064,12 +3064,12 @@ True False start - 6 + 5 5 5 5 - 6 - 6 + 5 + 5 File system: 0 @@ -3087,8 +3087,8 @@ 5 5 5 - 6 - 6 + 5 + 5 False @@ -3107,12 +3107,12 @@ True False - 6 + 5 5 5 5 - 6 - 6 + 5 + 5 Disk quotas for this device: 0 @@ -3126,12 +3126,12 @@ True False - 6 + 5 5 5 5 - 6 - 6 + 5 + 5 Group quotas for this device: 0 @@ -3170,7 +3170,7 @@ False 5 5 - 12 + 5 5 @@ -3185,8 +3185,8 @@ 5 5 5 - 6 - 6 + 5 + 5 Currently using: @@ -3199,12 +3199,12 @@ True False - 6 + 5 5 5 5 - 6 - 6 + 5 + 5 Soft limit 0 @@ -3273,12 +3273,12 @@ True False - 6 + 5 5 5 5 - 6 - 6 + 5 + 5 Hard limit 0 @@ -3352,12 +3352,12 @@ True False - 6 + 5 5 5 5 - 6 - 6 + 5 + 5 Size @@ -3385,7 +3385,7 @@ False 5 5 - 12 + 5 5 @@ -3398,10 +3398,10 @@ False 5 5 - 6 + 5 5 - 6 - 6 + 5 + 5 Currently using: @@ -3418,8 +3418,8 @@ 5 5 5 - 6 - 6 + 5 + 5 Soft limit 0 @@ -3487,8 +3487,8 @@ 5 5 5 - 6 - 6 + 5 + 5 Hard limit 0 @@ -3560,8 +3560,8 @@ 5 5 5 - 6 - 6 + 5 + 5 Files @@ -3806,7 +3806,7 @@ False 5 5 - 12 + 5 5 @@ -3997,7 +3997,7 @@ False 5 5 - 12 + 5 5 @@ -4280,7 +4280,7 @@ 20 20 dialog-question-symbolic - 6 + 5 False From e12879ccd9ea6e2165bf55bb5fa2c36af1f46af9 Mon Sep 17 00:00:00 2001 From: Igor Belitskiy Date: Fri, 5 May 2023 15:40:28 +0600 Subject: [PATCH 48/51] =?UTF-8?q?=D0=A1=D0=B4=D0=B5=D0=BB=D0=B0=D0=BB=20?= =?UTF-8?q?=D1=83=D0=B4=D0=B0=D0=BB=D0=B5=D0=BD=D0=B8=D0=B5=20=D0=B8=20?= =?UTF-8?q?=D0=B4=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5=D0=BD=D0=B8=D0=B5=20?= =?UTF-8?q?=D1=81=D1=82=D1=80=D0=BE=D0=BA=20=D0=B2=20treeView?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- source/my_type.h | 12 ++++ source/ubl-settings-diskquota.cc | 101 ++++++++++++++++++++++++++++++- source/ubl-settings-diskquota.h | 24 +++++++- ubl-settings-diskquota.glade | 2 + 4 files changed, 135 insertions(+), 4 deletions(-) diff --git a/source/my_type.h b/source/my_type.h index 9439f14..6355b2f 100644 --- a/source/my_type.h +++ b/source/my_type.h @@ -59,6 +59,18 @@ struct data_all_quotas { string file_grace; bool is_validate; }; +struct tv_g_u_p { + string name; + string quotas; + string size; + string soft_limit_size; + string hard_limit_size; + string deferring_size; + string files; + string soft_limit_files; + string hard_limit_delay; + string deferring_files; +}; typedef struct users_grups USER_GRUPS; typedef map map_str_str; diff --git a/source/ubl-settings-diskquota.cc b/source/ubl-settings-diskquota.cc index 83caa56..69bde54 100755 --- a/source/ubl-settings-diskquota.cc +++ b/source/ubl-settings-diskquota.cc @@ -500,8 +500,12 @@ void MainWindow::get_builder() { builder->get_widget("btnCancelHelp", btnCancelHelp); builder->get_widget("wndShowWeb", wndShowWeb); builder->get_widget("chbMangSystemFile", chbMangSystemFile); - - + builder->get_widget("btnDelGroups", btnDelGroups); + builder->get_widget("btnDelProject", btnDelProject); + builder->get_widget("btnDelUsers", btnDelUsers); + builder->get_widget("btnAddGroups", btnAddGroups); + builder->get_widget("btnAddUsers", btnAddUsers); + builder->get_widget("btnAddProject", btnAddProject); } @@ -520,6 +524,7 @@ void MainWindow::event() { btnSaveLocalGlob->signal_activate().connect([&]() {this->wrapper_save_all_cfg();}); btnSaveGlob->signal_activate().connect([&]() {this->wrapper_save_global_cfg();}); btnSaveLocal->signal_activate().connect([&]() {this->wrapper_save_system_cfg();}); + chbMangSystemFile->signal_toggled().connect([&]() {this->mode_switch_quota();}); quotegroupDeviceCombo->signal_changed().connect([&]() {entry_combo_box_temp(quotegroupDeviceCombo, lblEditWndFsys);}); quotegroupSizeSoftLimitCheck->signal_toggled().connect([&]() { check_limit(quotegroupSizeSoftLimitCheck @@ -543,6 +548,67 @@ void MainWindow::event() { }); quotegroupCancelButton->signal_clicked().connect([&]() {QuotasEditWindow->hide();}); // QuotasEditWindow->show(); + btnDelGroups->signal_clicked().connect( + sigc::bind*, const Gtk::TreeModel::iterator*, bool&> (sigc::mem_fun( *this, + &MainWindow::remove_template), &list_store_groups, &iter_groups, flag_validate_del_groups)); + btnDelUsers->signal_clicked().connect( + sigc::bind*, const Gtk::TreeModel::iterator*, bool&> (sigc::mem_fun( *this, + &MainWindow::remove_template), &list_store_users, &iter_users, flag_validate_del_users)); + btnDelProject->signal_clicked().connect( + sigc::bind*, const Gtk::TreeModel::iterator*, bool&> (sigc::mem_fun( *this, + &MainWindow::remove_template), &list_store_project, &iter_project, flag_validate_del_project)); + btnAddProject->signal_clicked().connect( + sigc::bind, struct tv_g_u_p> (sigc::mem_fun( *this, + &MainWindow::set_add_tv_g_u_p), row, list_store_project, obj_tv_g_u_p)); + btnAddUsers->signal_clicked().connect( + sigc::bind, struct tv_g_u_p> (sigc::mem_fun( *this, + &MainWindow::set_add_tv_g_u_p), row, list_store_users, obj_tv_g_u_p)); + btnAddGroups->signal_clicked().connect( + sigc::bind, struct tv_g_u_p> (sigc::mem_fun( *this, + &MainWindow::set_add_tv_g_u_p), row, list_store_groups, obj_tv_g_u_p)); + + +} + +void MainWindow::remove_template(Glib::RefPtr* list_store, const Gtk::TreeModel::iterator* iter, bool& flag_validate_del) { + if (flag_validate_del && (*list_store)->iter_is_valid(*(iter))) { + Gtk::TreeModel::Row row = *(*iter); + if(row) { + string name = row[m_columns.name] + ""; + // TODO: + string key = "GRUB_PASSWORD[" + name + "]"; + map_gui_cfg[key] = ""; + } + (*list_store)->erase((*iter)); + flag_validate_del = false; + info_status_app(info_box_ok_css); + imgInfo->set_from_icon_name(icon_checked, Gtk::ICON_SIZE_MENU); + lblWarning->set_text(""); + } + flag_validate_del = false; +} + +void MainWindow::set_add_tv_g_u_p(Gtk::TreeModel::Row &row, Glib::RefPtr list_store, struct tv_g_u_p obj_tv_g_u_p) { + row = *(list_store->append()); + row[m_columns.name] = obj_tv_g_u_p.name; + row[m_columns.quotas] = obj_tv_g_u_p.quotas; + row[m_columns.size] = obj_tv_g_u_p.size; + row[m_columns.soft_limit_size] = obj_tv_g_u_p.soft_limit_size; + row[m_columns.hard_limit_size] = obj_tv_g_u_p.hard_limit_size; + row[m_columns.deferring_size] = obj_tv_g_u_p.deferring_size; + row[m_columns.files] = obj_tv_g_u_p.files; + row[m_columns.soft_limit_files] = obj_tv_g_u_p.soft_limit_files; + row[m_columns.hard_limit_delay] = obj_tv_g_u_p.hard_limit_delay; + row[m_columns.deferring_files] = obj_tv_g_u_p.deferring_files; +} + +void MainWindow::mode_switch_quota() { + if (chbMangSystemFile->get_active()) { + mode_quota = "filesystem"; + } + else { + mode_quota = "ubconfig"; + } } void MainWindow::wrapper_settings_quotas_temp(string save_user_or_group) { @@ -557,7 +623,6 @@ void MainWindow::wrapper_settings_quotas_temp(string save_user_or_group) { _struct_quota.type_quotas = type_quotas; _struct_quota.name = user; obj_quotas_ubconfig.format_cmd_quotas(_struct_quota); - } void MainWindow::save_quotegroupSaveButton() { @@ -749,6 +814,31 @@ void MainWindow::wrapper_save_system_cfg() { } void MainWindow::load_template(map_str_str* map_temp, string str_load) { + groupsQuotasTree->remove_all_columns(); + list_store_groups = Gtk::ListStore::create(m_columns); + groupsQuotasTree->set_model(list_store_groups); + + ProjectQuotasTree->remove_all_columns(); + list_store_project = Gtk::ListStore::create(m_columns); + ProjectQuotasTree->set_model(list_store_project); + + usersQuotasTree->remove_all_columns(); + list_store_users = Gtk::ListStore::create(m_columns); + usersQuotasTree->set_model(list_store_users); + this->view_add_columns(*groupsQuotasTree); + this->view_add_columns(*ProjectQuotasTree); + this->view_add_columns(*usersQuotasTree); + + Glib::RefPtr groupsQuotasTreeModel = groupsQuotasTree->get_model(); + groupsQuotasTreeModel->signal_row_changed().connect(sigc::bind + (sigc::mem_fun(*this, &MainWindow::remove_line_template), iter_groups, flag_validate_del_groups)); + Glib::RefPtr ProjectQuotasTreeModel = ProjectQuotasTree->get_model(); + ProjectQuotasTreeModel->signal_row_changed().connect(sigc::bind + (sigc::mem_fun(*this, &MainWindow::remove_line_template), iter_project, flag_validate_del_project)); + Glib::RefPtr usersQuotasTreeModel = usersQuotasTree->get_model(); + usersQuotasTreeModel->signal_row_changed().connect(sigc::bind + (sigc::mem_fun(*this, &MainWindow::remove_line_template),iter_users, flag_validate_del_users)); + this->init_dict(str_load); string sections; sections = "security"; @@ -756,6 +846,11 @@ void MainWindow::load_template(map_str_str* map_temp, string str_load) { *map_temp = obj_load.get_load_data(*map_temp, str_load); } +void MainWindow::remove_line_template(const Gtk::TreeModel::Path&, const Gtk::TreeModel::iterator& iter, Gtk::TreeModel::iterator& iter_del, bool& flag_del) { + iter_del = iter; + flag_del = true; +} + void MainWindow::info_warning_error(int mess) { if (obj_load.get_count_error() > 0 || obj_save.get_count_error() > 0) { info_status_app(info_box_error_css); diff --git a/source/ubl-settings-diskquota.h b/source/ubl-settings-diskquota.h index 14d0382..dd4aacb 100644 --- a/source/ubl-settings-diskquota.h +++ b/source/ubl-settings-diskquota.h @@ -159,7 +159,7 @@ class MainWindow : public Gtk::ApplicationWindow { add(files); add(soft_limit_files), add(hard_limit_delay), add(deferring_files); } Gtk::TreeModelColumn name; - Gtk::TreeModelColumn quotas; + Gtk::TreeModelColumn quotas; Gtk::TreeModelColumn size; Gtk::TreeModelColumn soft_limit_size; Gtk::TreeModelColumn hard_limit_size; @@ -346,6 +346,12 @@ class MainWindow : public Gtk::ApplicationWindow { Gtk::Button *btnCancelHelp; Gtk::Window *wndShowWeb; Gtk::CheckMenuItem *chbMangSystemFile; + Gtk::Button* btnDelGroups; + Gtk::Button* btnDelProject; + Gtk::Button* btnDelUsers; + Gtk::Button* btnAddGroups; + Gtk::Button* btnAddUsers; + Gtk::Button* btnAddProject; #ifdef WEBKIT_FOUND Gtk::Window *wndWeb; Gtk::Widget *three; @@ -370,6 +376,18 @@ class MainWindow : public Gtk::ApplicationWindow { string sys_or_ubconfig; string hw_or_sw = ""; bool flag_open_browser = false; + string mode_quota = "ubconfig"; + Glib::RefPtr list_store_groups; + Glib::RefPtr list_store_users; + Glib::RefPtr list_store_project; + Gtk::TreeModel::iterator iter_groups; + Gtk::TreeModel::iterator iter_users; + Gtk::TreeModel::iterator iter_project; + bool flag_validate_del_groups = false; + bool flag_validate_del_users = false; + bool flag_validate_del_project = false; + Gtk::TreeModel::Row row; + const struct tv_g_u_p obj_tv_g_u_p {"", "", "", "", "", "", "", "", "",""}; public: MainWindow(BaseObjectType* obj, Glib::RefPtr const& builder); MainWindow(Glib::RefPtr const& builder); @@ -380,6 +398,8 @@ class MainWindow : public Gtk::ApplicationWindow { void add_CSS(); void get_builder(); void event(); + void remove_line_template(const Gtk::TreeModel::Path&, const Gtk::TreeModel::iterator& iter, Gtk::TreeModel::iterator& iter_del, bool& flag_del); + void remove_template(Glib::RefPtr* list_store, const Gtk::TreeModel::iterator* iter, bool& flag_validate_del); void init_tree_view_general(); void entry_combo_box_temp(Gtk::ComboBoxText *combo_box, Gtk::Label *label); void synopsis_show(); @@ -388,6 +408,7 @@ class MainWindow : public Gtk::ApplicationWindow { void init_tree_view(); void template_open_browser(); void open_browser(); + void set_add_tv_g_u_p(Gtk::TreeModel::Row &row, Glib::RefPtr list_store, struct tv_g_u_p obj_tv_g_u_p); void load_template(map_str_str* map_temp, string str_load); void info_warning_error(int mess); void off_quota_system(Gtk::ComboBoxText* combo_box, string quota_type); @@ -396,6 +417,7 @@ class MainWindow : public Gtk::ApplicationWindow { void wrapper_save_all_cfg(); void init_dict(string flag_load); void set_data_cfg(); + void mode_switch_quota(); void save_quotegroupSaveButton(); void wrapper_settings_quotas_temp(string save_user_or_group); void off_quota_ubconfig(Gtk::ComboBoxText* combo_box, string quota_type); diff --git a/ubl-settings-diskquota.glade b/ubl-settings-diskquota.glade index ea7b17c..c1e0c5e 100644 --- a/ubl-settings-diskquota.glade +++ b/ubl-settings-diskquota.glade @@ -532,6 +532,8 @@ True False + 7 + 7 Direct control of the file system True From ec6ba5899e17092e38f393f7b95945a9451b2958 Mon Sep 17 00:00:00 2001 From: Igor Belitskiy Date: Fri, 5 May 2023 15:56:39 +0600 Subject: [PATCH 49/51] =?UTF-8?q?=D0=9A=D0=BE=D0=B4=20=D0=BF=D0=BE=20?= =?UTF-8?q?=D1=80=D0=BE=D0=B1=D0=BE=D1=82=D1=83=20=D1=81=20treeView=20?= =?UTF-8?q?=D0=B2=D1=8B=D0=BD=D0=B5=D1=81=D0=B5=D0=BD=20=D0=B2=20=D0=BE?= =?UTF-8?q?=D1=82=D0=B4=D0=B5=D0=BB=D1=8C=D0=BD=D1=83=D1=8E=20=D1=84=D1=83?= =?UTF-8?q?=D0=BD=D0=BA=D1=86=D0=B8=D1=8E?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- source/ubl-settings-diskquota.cc | 22 +++++++++++----------- source/ubl-settings-diskquota.h | 1 + 2 files changed, 12 insertions(+), 11 deletions(-) diff --git a/source/ubl-settings-diskquota.cc b/source/ubl-settings-diskquota.cc index 69bde54..934db65 100755 --- a/source/ubl-settings-diskquota.cc +++ b/source/ubl-settings-diskquota.cc @@ -813,22 +813,16 @@ void MainWindow::wrapper_save_system_cfg() { map_system_cfg = map_gui_cfg; } -void MainWindow::load_template(map_str_str* map_temp, string str_load) { +void MainWindow::init_work_tv_g_u_p() { groupsQuotasTree->remove_all_columns(); - list_store_groups = Gtk::ListStore::create(m_columns); - groupsQuotasTree->set_model(list_store_groups); - ProjectQuotasTree->remove_all_columns(); - list_store_project = Gtk::ListStore::create(m_columns); - ProjectQuotasTree->set_model(list_store_project); - usersQuotasTree->remove_all_columns(); + list_store_groups = Gtk::ListStore::create(m_columns); + list_store_project = Gtk::ListStore::create(m_columns); list_store_users = Gtk::ListStore::create(m_columns); + groupsQuotasTree->set_model(list_store_groups); + ProjectQuotasTree->set_model(list_store_project); usersQuotasTree->set_model(list_store_users); - this->view_add_columns(*groupsQuotasTree); - this->view_add_columns(*ProjectQuotasTree); - this->view_add_columns(*usersQuotasTree); - Glib::RefPtr groupsQuotasTreeModel = groupsQuotasTree->get_model(); groupsQuotasTreeModel->signal_row_changed().connect(sigc::bind (sigc::mem_fun(*this, &MainWindow::remove_line_template), iter_groups, flag_validate_del_groups)); @@ -838,7 +832,13 @@ void MainWindow::load_template(map_str_str* map_temp, string str_load) { Glib::RefPtr usersQuotasTreeModel = usersQuotasTree->get_model(); usersQuotasTreeModel->signal_row_changed().connect(sigc::bind (sigc::mem_fun(*this, &MainWindow::remove_line_template),iter_users, flag_validate_del_users)); + this->view_add_columns(*groupsQuotasTree); + this->view_add_columns(*ProjectQuotasTree); + this->view_add_columns(*usersQuotasTree); +} +void MainWindow::load_template(map_str_str* map_temp, string str_load) { + this->init_work_tv_g_u_p(); this->init_dict(str_load); string sections; sections = "security"; diff --git a/source/ubl-settings-diskquota.h b/source/ubl-settings-diskquota.h index dd4aacb..29bff7b 100644 --- a/source/ubl-settings-diskquota.h +++ b/source/ubl-settings-diskquota.h @@ -398,6 +398,7 @@ class MainWindow : public Gtk::ApplicationWindow { void add_CSS(); void get_builder(); void event(); + void init_work_tv_g_u_p(); void remove_line_template(const Gtk::TreeModel::Path&, const Gtk::TreeModel::iterator& iter, Gtk::TreeModel::iterator& iter_del, bool& flag_del); void remove_template(Glib::RefPtr* list_store, const Gtk::TreeModel::iterator* iter, bool& flag_validate_del); void init_tree_view_general(); From fc74f8b414d8d500461df0cd6709a5324a5b238f Mon Sep 17 00:00:00 2001 From: Igor Belitskiy Date: Fri, 5 May 2023 16:03:13 +0600 Subject: [PATCH 50/51] =?UTF-8?q?=D0=98=D1=81=D0=BF=D1=80=D0=B0=D0=B2?= =?UTF-8?q?=D0=BB=D0=B5=D0=BD=20.desktop?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ubl-settings-diskquota.desktop | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/ubl-settings-diskquota.desktop b/ubl-settings-diskquota.desktop index 942002a..5a8de7f 100644 --- a/ubl-settings-diskquota.desktop +++ b/ubl-settings-diskquota.desktop @@ -1,11 +1,11 @@ [Desktop Entry] Encoding=UTF-8 Name=ubl-settings-diskquota -Name[ru]=Настройки квот +Name[ru]=Настройка дисковых квот GenericName=ubl-settings-diskquota -GenericName[ru]=Настройки квот -Comment=Disk quota management and configuration application -Comment[ru]=Приложение управление и настройка дисковых квот +GenericName[ru]=Настройка дисковых квот +Comment=Application for managing and configuring disk quotas +Comment[ru]=Приложение по управлению и настройке дисковых квот Type=Application Exec=pkexec ubl-settings-diskquota Icon=com.ublinux.ubl-settings-diskquota From 13452fef96a3c684fe8f08019b79021b88100281 Mon Sep 17 00:00:00 2001 From: Igor Belitskiy Date: Fri, 5 May 2023 16:08:09 +0600 Subject: [PATCH 51/51] =?UTF-8?q?=D0=A3=D0=B1=D1=80=D0=B0=D0=BB=20=D0=BA?= =?UTF-8?q?=D0=BE=D0=B4=20=D0=B8=D0=B7=20util.cc?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- source/util.cc | 81 -------------------------------------------------- source/util.h | 2 -- 2 files changed, 83 deletions(-) diff --git a/source/util.cc b/source/util.cc index cb05f5b..dcbdc95 100644 --- a/source/util.cc +++ b/source/util.cc @@ -122,87 +122,6 @@ std::vector split(std::string text, char delim) { } 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/Программное_обеспечение/Программы_и_утилиты/Все/") diff --git a/source/util.h b/source/util.h index d857b72..90aebad 100644 --- a/source/util.h +++ b/source/util.h @@ -23,9 +23,7 @@ vector find_all(string &str_ntp, string substr); void str_remove(std::string& source, std::string to_remove); void str_replace_all(string &str_base, string str_find, string str_replace); std::vector split(std::string text, char delim); -unsigned short read_uid_min_max(string filename, string search); vector pars_users(); -string read_passwd(string username); int synopsis_show(string str_link); string file_read(string filename); }