diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..d77f196 --- /dev/null +++ b/.gitignore @@ -0,0 +1,3 @@ +.vscode/ +ubl-settings-diskquota.glade~ +ubl-settings-diskquota_ru.po~ diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..abf1568 --- /dev/null +++ b/Makefile @@ -0,0 +1,159 @@ +#!/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-diskquota + +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-diskquota.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/${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 \ + [ -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 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}${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}/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; \ + [ -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" diff --git a/README.md b/README.md index eaa8e8c..56811b5 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,49 @@ -# ubl-settings-quotas +# ubl-settings-diskquota +# Настройки квот +[RU] Утилита для настройки дисковых квот +Utility for setting the disk quotas + +![alt text](screenshot/screenshot.png) + +# Build +In order to build ubl-settings-diskquota 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-diskquota --help +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/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.pkexec.ubl-settings-diskquota.exec.policy b/com.ublinux.pkexec.ubl-settings-diskquota.exec.policy new file mode 100644 index 0000000..f7a538c --- /dev/null +++ b/com.ublinux.pkexec.ubl-settings-diskquota.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 + + + diff --git a/com.ublinux.ubl-settings-diskquota.checked.svg b/com.ublinux.ubl-settings-diskquota.checked.svg new file mode 100644 index 0000000..e3cab42 --- /dev/null +++ b/com.ublinux.ubl-settings-diskquota.checked.svg @@ -0,0 +1,327 @@ + + + + + + + + + + + + + + + + diff --git a/com.ublinux.ubl-settings-diskquota.svg b/com.ublinux.ubl-settings-diskquota.svg new file mode 100644 index 0000000..708bd05 --- /dev/null +++ b/com.ublinux.ubl-settings-diskquota.svg @@ -0,0 +1,5903 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/com.ublinux.ubl-settings-diskquota.warning.svg b/com.ublinux.ubl-settings-diskquota.warning.svg new file mode 100644 index 0000000..9a90dba --- /dev/null +++ b/com.ublinux.ubl-settings-diskquota.warning.svg @@ -0,0 +1,55 @@ + + + + + + image/svg+xml + + + + + + + + diff --git a/logo-background.png b/logo-background.png new file mode 100644 index 0000000..8eb67cb Binary files /dev/null and b/logo-background.png differ diff --git a/screenshot/screenshot.png b/screenshot/screenshot.png new file mode 100644 index 0000000..51bf4ab Binary files /dev/null and b/screenshot/screenshot.png differ diff --git a/source/CMakeLists.txt b/source/CMakeLists.txt new file mode 100644 index 0000000..0caeeb7 --- /dev/null +++ b/source/CMakeLists.txt @@ -0,0 +1,68 @@ +cmake_minimum_required(VERSION 3.7) +project(ubl-settings-diskquota) + +find_package(PkgConfig REQUIRED) + +pkg_check_modules(GTK REQUIRED gtkmm-3.0) +include_directories(${GTK_INCLUDE_DIRS}) +link_directories(${GTK_LIBRARY_DIRS}) +add_definitions(${GTK_CFLAGS_OTHER}) + +find_library(WEBKIT_LIBRARIES_FOUND webkit2gtk-4.0 webkit2gtk-web-extension-4.0) + +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 -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 + ubconfig_quotas.cc + system_quotas.h + system_quotas.cc + my_device.h + my_device.cc + project_lib.h + my_type.h + save.h + save.cc + load.h + load.cc + my_process.h + my_process.cc + util.h + util.cc + my_plug.h + my_plug.cc + ubl-util-standard.h + ubl-util-standard.c + 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}" + ${WEBKIT_INCLUDE_DIRS} + ) +install(TARGETS ubl-settings-diskquota DESTINATION bin) \ No newline at end of file diff --git a/source/controler.cc b/source/controler.cc new file mode 100644 index 0000000..38f889a --- /dev/null +++ b/source/controler.cc @@ -0,0 +1,46 @@ +#include "controler.h" +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, "disable"); + } + 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_sys.wrapper_on_quotas(partition, quotas_type, "enable"); + 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 new file mode 100644 index 0000000..263493c --- /dev/null +++ b/source/controler.h @@ -0,0 +1,19 @@ +#include "system_quotas.h" +#include "ubconfig_quotas.h" + +class Back_Back{ + public: + 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/load.cc b/source/load.cc new file mode 100644 index 0000000..200c4b3 --- /dev/null +++ b/source/load.cc @@ -0,0 +1,39 @@ +#include "load.h" + +namespace Lib_Load{ + void Load::set_sections(string sections){ + this->sections = sections; + } + 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 = ""; + 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_temp; + } + int Load::get_count_error() { + return process.get_count_error(); + } + +} diff --git a/source/load.h b/source/load.h new file mode 100644 index 0000000..26aaf96 --- /dev/null +++ b/source/load.h @@ -0,0 +1,21 @@ +#ifndef LOAD_H +#define LOAD_H + +#include "my_process.h" +namespace Lib_Load{ + class Load { + + private: + string sections; + My_Process::My_Process_call process = My_Process::My_Process_call(); + public: + 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); + }; + + +} +#endif \ No newline at end of file diff --git a/source/main.cc b/source/main.cc new file mode 100644 index 0000000..85d79f4 --- /dev/null +++ b/source/main.cc @@ -0,0 +1,93 @@ +#include "my_plug.h" + +void pars_flag(int index_start, int argc, char* argv[]); + +int main(int argc, char** argv) { + string str_argv= ""; + string str_cmd_argv = ""; + for (int i=1; i 1){ + str_argv = argv[1]; + } + bindtextdomain(app_name, "/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); + 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 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) { + value = str_parted.substr(str_parted.find(" ") + 1, str_parted.length()); + if (value.length()>0) { + dict_parted[key] = value; + } + } + } + + return dict_parted; + } + +} \ No newline at end of file diff --git a/source/my_device.h b/source/my_device.h new file mode 100644 index 0000000..1db5317 --- /dev/null +++ b/source/my_device.h @@ -0,0 +1,20 @@ +#ifndef MY_DEVICE_H +#define MY_DEVICE_H + +#include "project_lib.h" +#include "my_process.h" +#include "util.h" +#include "my_type.h" + + +namespace Devices { + 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/my_plug.cc b/source/my_plug.cc new file mode 100644 index 0000000..6294ab4 --- /dev/null +++ b/source/my_plug.cc @@ -0,0 +1,38 @@ +#ifndef MY_PLUG_H +#define MY_PLUG_H + +#include "my_plug.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..5d9a3d1 --- /dev/null +++ b/source/my_plug.h @@ -0,0 +1,20 @@ +#include "project_lib.h" +#include "ubl-settings-diskquota.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_process.cc b/source/my_process.cc new file mode 100644 index 0000000..658afd5 --- /dev/null +++ b/source/my_process.cc @@ -0,0 +1,84 @@ +#include "my_process.h" +#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; + 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) { +} + +string My_Process::get_cmd_error() { + return this->str_cmd_error; +} +string My_Process_call::call_all_sections(string cmd) { + 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 new file mode 100644 index 0000000..3cc6f81 --- /dev/null +++ b/source/my_process.h @@ -0,0 +1,32 @@ +#ifndef MY_PROCESS_H +#define MY_PROCESS_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); + string get_cmd_error(); +}; + + +class My_Process_call: public My_Process { + public: + struct Utils::Result call(string cmd); + string call_all_sections(string cmd); + +}; + +class My_Process_system: public My_Process { + public: + void call(string cmd, string thread_str); + +}; +} +#endif \ No newline at end of file diff --git a/source/my_type.h b/source/my_type.h new file mode 100644 index 0000000..6355b2f --- /dev/null +++ b/source/my_type.h @@ -0,0 +1,79 @@ +#ifndef MY_TYPE_H +#define MY_TYPE_H + +#include "project_lib.h" +#include + +using namespace std; + +typedef unsigned long max_num_T; + +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; + }; +struct Mount { + std::string device; + std::string destination; + std::string fstype; + std::string options; + 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; +}; +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; + 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; +typedef map * map_s_s_ptr; +typedef std::map map_str_device; +#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..bc0b1d2 --- /dev/null +++ b/source/project_lib.h @@ -0,0 +1,26 @@ +#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 "ubl-util-standard.c" +#endif \ No newline at end of file diff --git a/source/save.cc b/source/save.cc new file mode 100644 index 0000000..7134507 --- /dev/null +++ b/source/save.cc @@ -0,0 +1,199 @@ +#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_global(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_gui(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 ((*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; + } + 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; +} + +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 = 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 = ""; + } + } + } + } + + } +} +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 = ""; + } + } +} +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 new file mode 100644 index 0000000..b5ed023 --- /dev/null +++ b/source/save.h @@ -0,0 +1,33 @@ +#ifndef SAVE_H +#define SAVE_H + +#include "my_process.h" +#include "project_lib.h" +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 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_quotas.cc b/source/system_quotas.cc new file mode 100644 index 0000000..c92f609 --- /dev/null +++ b/source/system_quotas.cc @@ -0,0 +1,263 @@ +#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::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 = ""; + string response = Utils::file_read("/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) { + 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::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) { + /* + Включить квоты, только для 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) { + 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; +} + +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 (this->wrapper_hw_sw(partition) == "hw") { + cmd = quota_hw + " " + partition; + obj_process_system.call(cmd, ""); + return true; + } + else if (this->wrapper_hw_sw(partition) == "sw") { + cmd = quota_sw + " " + partition; + obj_process_system.call(cmd, ""); + return true; + } + } + return false; + +} + +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) { + response = response.substr(index_start+start_pars.length(), response.length()); + vector vec_index_sep = Utils::find_all(response, "\n"); + 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 = response.substr(old_index, index); + struct_data = part_quotas_line(line_pars); + vec_struct_data.push_back(struct_data); + } + } + return vec_struct_data; +} + +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); + cout << buff << endl; + 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; + } + if (index_data != 0) {struct_data.is_validate = true; } + else {struct_data.is_validate = false; } + return struct_data; +} + +} \ No newline at end of file diff --git a/source/system_quotas.h b/source/system_quotas.h new file mode 100644 index 0000000..fd25abc --- /dev/null +++ b/source/system_quotas.h @@ -0,0 +1,35 @@ +#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_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(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); +}; +} +#endif \ No newline at end of file diff --git a/source/ubconfig_quotas.cc b/source/ubconfig_quotas.cc new file mode 100644 index 0000000..88bcb30 --- /dev/null +++ b/source/ubconfig_quotas.cc @@ -0,0 +1,27 @@ +#include "ubconfig_quotas.h" + +namespace Quotas_ubconfig { + +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; +} + +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] = state; + return true; +} +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..f9a0d4d --- /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(); + 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); +}; +} +#endif diff --git a/source/ubl-settings-diskquota.cc b/source/ubl-settings-diskquota.cc new file mode 100755 index 0000000..934db65 --- /dev/null +++ b/source/ubl-settings-diskquota.cc @@ -0,0 +1,915 @@ +#include "ubl-settings-diskquota.h" +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) + : 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(); + this->flag_block_gui(); + btnBoxAboutDialog->set_visible(false); + map_device = obj_device.get_parted(); + 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->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); + obj_quotas_ubconfig.set_map_gui(map_gui_cfg); + #ifdef WEBKIT_FOUND + 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(); + this->event(); + } + else { + boxFuncs->set_sensitive(false); + btnSave->set_sensitive(false); + btnLoad->set_sensitive(false); + 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); + +} + +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); + this->view_add_columns(*ProjectQuotasTree); + this->init_tree_view_general(); +} +void MainWindow::init_tree_view_general() { + 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_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_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_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); + unsigned int year = 1900 + ltm->tm_year; + string str_authors = string(copyright) + to_string(year); + aboutWindows->set_copyright(str_authors); + 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); + 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); + chbMangSystemFile->set_label(str_quotas_mode); + +} + +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()); + } + combo_box->set_active(0); + } +} + +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()){ + label->set_text(map_device[text]); + } +} + +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 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(); + 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"); + } + 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); + 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("generalGroupsSizeLabel", generalGroupsSizeLabel); + builder->get_widget("generalGroupsFilesLabel", generalGroupsFilesLabel); + 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("lblLoad", lblLoad); + builder->get_widget("lblSave", lblSave); + builder->get_widget("btnSettings", btnSettings); + builder->get_widget("btnSettings", btnSettings); + 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); + 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); + builder->get_widget("headerAboutTopic", headerAboutTopic); + builder->get_widget("lblHeadQuotasUserEditWindow", lblHeadQuotasUserEditWindow); + builder->get_widget("lblHeadQuotasEditWindow", lblHeadQuotasEditWindow); + builder->get_widget("lblHeadFiltersWindow", lblHeadFiltersWindow); + builder->get_widget("usersDeviceCombo", usersDeviceCombo); + builder->get_widget("GroupsTabLabel", GroupsTabLabel); + builder->get_widget("generalTabLabel", generalTabLabel); + builder->get_widget("groupsDeviceCombo", groupsDeviceCombo); + 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); + 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("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); + #ifdef WEBKIT_FOUND + 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); + 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); + +} + +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();}); + quotegroupSaveButton->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();}); + btnAbout->signal_activate().connect([&]() {aboutWindows->show();}); + 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 + ,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(); + 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) { + 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_ubconfig.format_cmd_quotas(_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 = Utils::format_str_size(quotegroupSizeSoftLimitSpin->get_value(), quotegroupSizeSoftLimitCombo->get_active_row_number()); + value += ":"; + } + else { + value += "0:"; + } + if (quotegroupSizeHardLimitCheck->get_active()) { + value += Utils::format_str_size(quotegroupSizeHardLimitSpin->get_value(), quotegroupSizeHardLimitCombo->get_active_row_number()); + 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(info_box_ok_css); + boxInfo->remove_class(info_box_error_css); + boxInfo->add_class(stule); +} + +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::synopsis_show() { + if (flag_open_browser == true) { + this->open_browser(); + } + else { + wndShowWeb->show_all(); + } + +} + +void MainWindow::open_browser() { + #ifdef WEBKIT_FOUND + webkit_web_view_load_uri(one, link_doc); + wndWeb->show_all(); + #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(); + 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, ""); +} + +void MainWindow::wrapper_save_system_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::init_work_tv_g_u_p() { + groupsQuotasTree->remove_all_columns(); + ProjectQuotasTree->remove_all_columns(); + 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); + 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->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"; + obj_load.set_sections(sections); + *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); + imgInfo->set_from_icon_name(icon_warning, Gtk::ICON_SIZE_MENU); + string mess_error = ""; + if (mess == 0) { + mess_error = string(local_read_error) + str_cmd_error; + lblWarning->set_text(mess_error); + } + else if (mess == 1) { + mess_error = string(global_read_error) + str_cmd_error; + lblWarning->set_text(mess_error); + } + else if (mess == 2) { + mess_error = string(local_write_error) + str_cmd_error; + lblWarning->set_text(mess_error); + } + else if (mess == 3) { + mess_error = string(global_write_error) + str_cmd_error; + lblWarning->set_text(mess_error); + } + else if (mess == 4) { + mess_error = string(error_save_all) + 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(info_box_ok_css); + imgInfo->set_from_icon_name(icon_checked, Gtk::ICON_SIZE_MENU); + if (mess == 0) { + lblWarning->set_text(local_load_ok); + } + else if (mess == 1) { + lblWarning->set_text(global_load_ok); + } + else if (mess == 2) { + lblWarning->set_text(local_ok_written); + } + else if (mess == 3) { + lblWarning->set_text(global_ok_written); + } + else if (mess == 4) { + lblWarning->set_text(successfully_save_all); + } + else if (mess == 5) { + lblWarning->set_text(nothing_save); + } + } +} + +MainWindow::~MainWindow() {} + +void help() { + string version = string(str_version) + version_application + "\n"; + cout << version.c_str(); + cout << str_help_h; + +} + diff --git a/source/ubl-settings-diskquota.h b/source/ubl-settings-diskquota.h new file mode 100644 index 0000000..29bff7b --- /dev/null +++ b/source/ubl-settings-diskquota.h @@ -0,0 +1,441 @@ +#ifndef UBL_SETTINGS_QUOTAS_H +#define UBL_SETTINGS_QUOTAS_H + +#include "util.h" +#include "load.h" +#include "save.h" +#include "my_process.h" +#include "my_type.h" +#include "my_device.h" +#include "system_quotas.h" +#include "ubconfig_quotas.h" +#include +#include "ubl-settings-diskquota-cm.h" +#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 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") +#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") +#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_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:") +#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 disk quota 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") +#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_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_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_severe_limitation _("Severe\nlimitation\n(size)") +#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)") +#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" +#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" +#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 { + public: + class ModelColumns : public Gtk::TreeModel::ColumnRecord { + public: + ModelColumns() {add(name), add(quotas); add(size), + add(soft_limit_size), add(hard_limit_size); add(deferring_size), + add(files); add(soft_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 deferring_size; + Gtk::TreeModelColumn files; + Gtk::TreeModelColumn soft_limit_files; + Gtk::TreeModelColumn hard_limit_delay; + Gtk::TreeModelColumn deferring_files; + }; + class ModelColumnsGeneral : public Gtk::TreeModel::ColumnRecord { + public: + ModelColumnsGeneral() {add(status), add(type_quotas); add(device), + 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 soft_limit_files; + Gtk::TreeModelColumn hard_limit_files; + Gtk::TreeModelColumn deferring_size; + Gtk::TreeModelColumn deferring_files; + }; + ModelColumns m_columns; + ModelColumnsGeneral m_columnsGeneral; + 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 *generalGroupsSizeLabel; + Gtk::Label *generalGroupsFilesLabel; + 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 *ProjectTabLabel; + Gtk::Label *usersProjectLabel; + Gtk::Label *lblLoad; + Gtk::Label *lblSave; + Gtk::MenuItem *btnLoadGlob; + Gtk::MenuItem *btnLoadLocal; + Gtk::MenuItem *btnSynopsis; + Gtk::MenuItem *btnAbout; + Gtk::MenuItem *btnSaveLocalGlob; + Gtk::MenuItem *btnSaveGlob; + Gtk::MenuItem *btnSaveLocal; + 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; + Gtk::TreeView *ProjectQuotasTree; + Gtk::TreeView *GeneralQuotasTree; + 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; + Gtk::Label *headerAboutTopic; + Gtk::Label *lblHeadQuotasUserEditWindow; + Gtk::Label *lblHeadQuotasEditWindow; + Gtk::Label *lblHeadFiltersWindow; + Gtk::ComboBoxText *usersDeviceCombo; + Gtk::ComboBoxText *groupsDeviceCombo; + Gtk::ComboBoxText *generalDeviceCombo; + Gtk::Label *lblFstypeGroups; + 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; + 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::Button *btnFilterGroups; + 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; + 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; + WebKitWebView *one; + #endif + + 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(); + 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; + map_str_str map_global_cfg; + map_str_str map_system_cfg; + 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 = ""; + 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); + ~MainWindow(); + void settings(); + void flag_block_gui(); + void lacalization(); + 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(); + void entry_combo_box_temp(Gtk::ComboBoxText *combo_box, Gtk::Label *label); + void synopsis_show(); + void info_status_app(string stule); + void groupsFilters_show(); + 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); + 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 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); + 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); + + +}; + +void help(); +#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 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..dcbdc95 --- /dev/null +++ b/source/util.cc @@ -0,0 +1,149 @@ +#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; + 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; +} + +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()); +} + +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 new file mode 100644 index 0000000..90aebad --- /dev/null +++ b/source/util.h @@ -0,0 +1,30 @@ +#ifndef UTIL_H +#define UTIL_H +#include "project_lib.h" + +using namespace std; + +namespace Utils { +template +struct Result{ + Type response; + int error; +}; + +struct Passwd { + string user; + 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); +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); +vector pars_users(); +int synopsis_show(string str_link); +string file_read(string filename); +} +#endif \ No newline at end of file diff --git a/ubl-settings-diskquota.css b/ubl-settings-diskquota.css new file mode 100644 index 0000000..ee3ba98 --- /dev/null +++ b/ubl-settings-diskquota.css @@ -0,0 +1,149 @@ +.textHead{ + text-shadow: 2px 2px @theme_bg_color; + color: @theme_text_color; +} +.boxInfoMessError{ + background-color: #ea9999; +} +.boxInfoMessOK{ + background-color: #f3f0ac; +} +.bannerbackground { + background-color: #404040; +} +.textHead{ + text-shadow: 1px 1px #ffffff; +} +.view_app { + background-color: @theme_bg_color; +} +.view_app.view.cell:selected { + background-color:@theme_selected_bg_color; + color:@theme_selected_text_color; + transition: 10ms ease-out; + border-radius: 3px; +} +#GnomeIcon{ + border-style:solid; + border-bottom-width: 1px; + border-image: linear-gradient(90deg, alpha(@theme_text_color,0.4) 55%, alpha(@theme_bg_color, 0) 100%); + border-image-slice: 1; +} + +#SepIcon{ + background-color: alpha(@theme_text_color, 0.6); +} + +#iconlabel { + font-size:14px; + font-weight: bold; + +} +.roundborder * { + border-width:0px; + border-radius:5px; +} +.noborder { + border: none; +} +.menu:hover { + border-color:alpha(@theme_text_color, 0.01); +} +.menu { + border-color:alpha(@theme_text_color, 0.01); +} +.menu:hover >* { + 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-diskquota.desktop b/ubl-settings-diskquota.desktop new file mode 100644 index 0000000..5a8de7f --- /dev/null +++ b/ubl-settings-diskquota.desktop @@ -0,0 +1,15 @@ +[Desktop Entry] +Encoding=UTF-8 +Name=ubl-settings-diskquota +Name[ru]=Настройка дисковых квот +GenericName=ubl-settings-diskquota +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 +Terminal=false +X-XfcePluggable=true +X-UBLPluggable=true +Categories=XFCE;GTK;Settings;DesktopSettings;X-XFCE-SettingsDialog;X-XFCE-SystemSettings;X-UBL-SettingsManager;X-UBL-SystemSettings; diff --git a/ubl-settings-diskquota.glade b/ubl-settings-diskquota.glade new file mode 100644 index 0000000..c1e0c5e --- /dev/null +++ b/ubl-settings-diskquota.glade @@ -0,0 +1,4494 @@ + + + + + + + + + + + + False + start + False + + + True + False + 5 + 5 + 5 + 5 + 5 + 5 + vertical + + + Name + True + True + False + start + 5 + 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 + + + + + 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 + start + True + + + False + True + 5 + + + + + Hard limit (size) delay + True + True + False + start + True + + + False + True + 5 + + + + + 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 + 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 + 5 + 5 + 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 + + + + + 5 + 1 + 10 + + + 23 + 1 + 10 + + + 59 + 1 + 10 + + + 100 + 1 + 10 + + + 5 + 1 + 10 + + + 23 + 1 + 10 + + + 59 + 1 + 10 + + + 100 + 1 + 10 + + + 5 + 1 + 10 + + + 23 + 1 + 10 + + + 59 + 1 + 10 + + + 100 + 1 + 10 + + + 5 + 1 + 10 + + + 23 + 1 + 10 + + + 59 + 1 + 10 + + + 100 + 1 + 10 + + + + True + False + False + False + + + True + False + 7 + 7 + Direct control of the file system + True + + + + + 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 + center + com.ublinux.ubl-settings-diskquota + center + + + True + False + vertical + + + True + False + vertical + + + True + False + + + True + False + 5 + 5 + 5 + 5 + 5 + 5 + 25 + 1 + + + False + True + 0 + + + + + True + False + start + 5 + 5 + 5 + 5 + 5 + 5 + + + + + + + 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 + True + liststore1 + + + + + + True + True + 0 + + + + + + + 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 + 5 + 5 + + + False + True + 2 + + + + + False + True + 0 + + + + + True + False + 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 + 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 + True + liststore1 + + + + + + True + True + 2 + + + + + True + False + + + True + True + True + 5 + 5 + 5 + 5 + + + True + False + + + True + False + 5 + 5 + gtk-goto-first + + + 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 + + + + + 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 + 1 + + + + + True + True + liststore1 + + + + + + True + True + 2 + + + + + False + True + 0 + + + + + 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 + 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 + end + 1 + + + + + 3 + + + + + True + False + Project + + + 3 + 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 + 5 + 5 + 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 + 5 + 5 + Device: + + + False + True + 0 + + + + + True + False + 5 + 5 + 5 + 5 + 5 + 5 + + + True + True + 1 + + + + + True + False + start + 5 + 5 + 5 + 5 + 5 + 5 + File system: + 0 + + + False + True + 2 + + + + + True + False + 5 + 5 + 5 + 5 + 5 + 5 + + + False + True + 3 + + + + + False + True + 0 + + + + + True + False + 5 + 5 + 5 + 5 + 5 + 5 + Disk quotas for this device: + 0 + + + False + True + 1 + + + + + True + False + 5 + 5 + 5 + 5 + 5 + 5 + 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 + 5 + 5 + + + True + False + vertical + + + True + False + 5 + 5 + 5 + 5 + 5 + 5 + Currently using: + + + False + True + 0 + + + + + True + False + 5 + 5 + 5 + 5 + 5 + 5 + 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 + 5 + 5 + 5 + 5 + 5 + 5 + 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 + 5 + 5 + 5 + 5 + 5 + 5 + Size + + + + + True + True + 0 + + + + + True + False + 5 + 5 + 5 + 5 + 5 + 0.019999999552965164 + in + + + True + False + 5 + 5 + 5 + 5 + + + True + False + vertical + + + True + False + 5 + 5 + 5 + 5 + 5 + 5 + Currently using: + + + False + True + 0 + + + + + True + False + 5 + 5 + 5 + 5 + 5 + 5 + 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 + 5 + 5 + 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 + 5 + 5 + 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 + 5 + 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 + 5 + 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 + + + + + + + False + start + start + False + 450 + 250 + dialog-question-symbolic + + + True + False + vertical + + + True + False + + + True + False + start + 20 + 20 + dialog-question-symbolic + 5 + + + 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.pot b/ubl-settings-diskquota.pot new file mode 100644 index 0000000..54d8ef3 --- /dev/null +++ b/ubl-settings-diskquota.pot @@ -0,0 +1,659 @@ +# 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 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" +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 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 in global configuration" +msgstr "" + +#: source/ubl-settings-diskquota.cc:228 source/ubl-settings-diskquota.cc:158 +#: source/ubl-settings-diskquota.cc:148 +msgid "Save in 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-diskquota_ru.po b/ubl-settings-diskquota_ru.po new file mode 100644 index 0000000..8b9b0ac --- /dev/null +++ b/ubl-settings-diskquota_ru.po @@ -0,0 +1,814 @@ +# Russian 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: ublexec 1.0\n" +"Report-Msgid-Bugs-To: \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" +"Language: Russian\n" +"MIME-Version: 1.0\n" +"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" +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 +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 "" +"Отсрочка\n" +"жесткого\n" +"ограничения\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" +"a hard\n" +"limit\n" +"(size)" +msgstr "" +"Отсрочка\n" +"жесткого\n" +"ограничения\n" +"(объём)" + +#: 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 "Устройство:" + +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 +#: 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 +#, 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 +#: 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 "Direct control of the file system" +msgstr "Прямое управление файловой системой" + +msgid "" +"GTK settings disk quota 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" +"\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 +#: 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 +#, fuzzy +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 +#, fuzzy +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 +#, fuzzy +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 +#, fuzzy +msgid "" +"Hard limit\n" +"(Size) activation\n" +"time" +msgstr "" +"Жесткий предел\n" +"(размер)" + +#: 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" +"(files)" +msgstr "" +"Жесткий лимит\n" +"(файлы)" + +#: 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" +"(files) activation\n" +"time" +msgstr "" +"Жесткий предел\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 +#, fuzzy +msgid "" +"Hard limit\n" +"(files) delay" +msgstr "" +"Жесткий лимит\n" +"(файлы)" + +#: 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" +"(size)" +msgstr "" +"Жесткий предел\n" +"(размер) задержки" + +#: 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" +"(size) delay" +msgstr "" +"Жесткий предел\n" +"(размер) задержки" + +#: source/ubl-settings-quotas.cc:247 source/ubl-settings-quotas.cc:382 +#, fuzzy +msgid "" +"Hard limit\n" +"activation\n" +"time (files)" +msgstr "" +"Время активации\n" +"жесткого лимита\n" +"(файла)" + +#: source/ubl-settings-quotas.cc:240 source/ubl-settings-quotas.cc:375 +msgid "" +"Hard limit\n" +"activation\n" +"time (size)" +msgstr "" +"Время активации\n" +"жесткого лимита\n" +"(объём)" + +#: 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 global configuration" +msgstr "Загрузить глобальную конфигурацию" + +#: source/ubl-settings-quotas.cc:223 source/ubl-settings-quotas.cc:153 +#: source/ubl-settings-quotas.cc:143 +msgid "Load 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 +#, fuzzy +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 +#, 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 +#: 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 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 in global configuration" +msgstr "Сохранить в глобальную конфигурацию" + +#: source/ubl-settings-quotas.cc:228 source/ubl-settings-quotas.cc:158 +#: source/ubl-settings-quotas.cc:148 +msgid "Save in 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 "" +"Жесткое\n" +"лимит\n" +"(файлы)" + +#: source/ubl-settings-quotas.cc:238 source/ubl-settings-quotas.cc:373 +msgid "" +"Severe\n" +"limitation\n" +"(size)" +msgstr "" +"Жесткое\n" +"лимит\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 +#: 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 "" +"Мягкое\n" +"лимит\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 +#: 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" +"(объём)" + +#: 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" +"(files)" +msgstr "" +"Мягкий\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 +#: source/ubl-settings-quotas.cc:313 source/ubl-settings-quotas.cc:260 +#, fuzzy +msgid "" +"Soft limit\n" +"(size)" +msgstr "" +"Мягкий лимит\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" +"(файлы)" + +#: 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 +#, fuzzy +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 "Программа должна быть запущена от имени root" + +#: 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 +#, fuzzy +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 "https://wiki.ublinux.ru" + +#: 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 +#, 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 +#, fuzzy +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 "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 +#: 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 "недели" + +msgid "Argument not recognized\n" +msgstr "Аргумент не распознан\n" + +msgid "ubl-settings-diskquota version: " +msgstr "ubl-settings-diskquota версия: " + +msgid "ubl-settings-quotas" +msgstr "Квоты" + +#~ msgid "Severe limitation (size)" +#~ msgstr "Жесткое лимит (объём)" + +#, fuzzy +#~ msgid "Hard limit activation time (files)" +#~ msgstr "Время активации жесткого граничения (файла)"