From 7929538f8d4161b95d952ef57426bbe77ca0bbbf Mon Sep 17 00:00:00 2001 From: Sergey Kalinin Date: Mon, 30 Sep 2019 11:02:57 +0300 Subject: [PATCH] =?UTF-8?q?=D0=A1=D0=BB=D0=B8=D1=8F=D0=BD=D0=B8=D0=B5=20?= =?UTF-8?q?=D0=B2=D0=B5=D1=82=D0=BE=D0=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 1c_srv_new.cfg | 40 ++++ README.md | 3 + debian/changelog | 18 +- debian/control | 2 +- debian/docs | 1 + doc/rac-manual.txt | 1 + doc/racgui_manual.txt | 91 +++++++++ lib/config.tcl | 214 +++++++++++++++++++++ lib/function.tcl | 410 ++++++++++++++++++++++++++++------------- lib/gui.tcl | 27 ++- lib/images.tcl | 91 +++++++++ lib/msg/ru.msg | 72 ++++++-- lib/theme.tcl | 40 ++++ lib/ttk_theme_dark.tcl | 11 +- rac_gui.cfg | 23 +-- rac_gui.spec | 7 + rac_gui.tcl | 148 ++++++++------- 17 files changed, 965 insertions(+), 234 deletions(-) create mode 100644 1c_srv_new.cfg create mode 100644 doc/racgui_manual.txt create mode 100644 lib/config.tcl create mode 100644 lib/theme.tcl diff --git a/1c_srv_new.cfg b/1c_srv_new.cfg new file mode 100644 index 0000000..dbca3c2 --- /dev/null +++ b/1c_srv_new.cfg @@ -0,0 +1,40 @@ +localhost:1545 { + name "Локальный сервер" + rac_cmd "/opt/1C/v8.3/x86_64/rac" + agent_user "" + agent_pwd "" + clusters { + 3ed9081a-c5b0-11e9-cf8a-1c1b0d94027e { + cluster_name "eeee" + cluster_user "" + cluster_pwd "" + } + 4581a966-a6bf-11e9-3c95-1c1b0d94027e { + cluster_name "Локальный кластер" + cluster_user "" + cluster_pwd "" + infobases { + 1e1d1cea-b856-11e9-748a-1c1b0d94027e { + infobase_name "wewe" + infobase_user "ibuser" + infobase_pwd "ibpwd" + } + 0129b2b2-b8d6-11e9-748a-1c1b0d94027e { + infobase_name "testdb" + infobase_user "testdb2-user" + infobase_pwd "testdb2-pwd" + } + cac80302-b855-11e9-748a-1c1b0d94027e { + infobase_name "testdb" + } + } + } +} +} + 192.168.5.145:1545 { + name "1C test" + rac_cmd "/opt/1C/v8.3/x86_64/rac" + clusters { + +} +} diff --git a/README.md b/README.md index b6f341b..9de252d 100644 --- a/README.md +++ b/README.md @@ -13,3 +13,6 @@ http://nuk-svk.ru/soft/rac-gui/ Иконки взяты с сайта https://www.iconsdb.com/royal-blue-icons/ + + + diff --git a/debian/changelog b/debian/changelog index 38db2dc..7367b9a 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,9 +1,20 @@ +rac-gui (1.1.0-1) stable; urgency=medium + +* Added new rac command options +* Added HELP dialog +* Moved configuration files according to XDG standard +* Change 1c-srv.cfg format +* Fixed some errors +* Added translated method for table headers + +-- Sergey Kalinin Wed, 25 Sep 2019 09:00:31 +0300 + rac-gui (1.0.3-1) stable; urgency=medium - * CI/CD integration - * New server config added +* CI/CD integration +* New server config added - -- Sergey Kalinin Thu, 15 Jul 2019 09:20:31 +0300 +-- Sergey Kalinin Thu, 15 Jul 2019 09:20:31 +0300 rac-gui (1.0.2-2) stable; urgency=medium @@ -17,3 +28,4 @@ rac-gui (1.0.1-1) stable; urgency=medium -- Sergey Kalinin Mon, 22 Jul 2019 14:56:31 +0300 + diff --git a/debian/control b/debian/control index f9ab902..af82d23 100644 --- a/debian/control +++ b/debian/control @@ -9,7 +9,7 @@ Vcs-Git: https://bitbucket.org/svk28/rac-gui.git Package: rac-gui Architecture: any -Depends: tcl(>=8.6), tk(>=8.6), ${misc:Depends} +Depends: tcl(>=8.6), tk(>=8.6), tcllib, ${misc:Depends} Description: This program is a GUI for 1C RAC util. Rac-GUI is a graphical user interface for 1C rac (remote access controll) programm. 1C RAC is a software for 1C-servers cluster management. diff --git a/debian/docs b/debian/docs index eb55b93..176bd30 100644 --- a/debian/docs +++ b/debian/docs @@ -2,3 +2,4 @@ README.md doc/CHANGELOG doc/TODO doc/rac-manual.txt +doc/racgui_manual.txt \ No newline at end of file diff --git a/doc/rac-manual.txt b/doc/rac-manual.txt index b3792ac..c5a4a57 100644 --- a/doc/rac-manual.txt +++ b/doc/rac-manual.txt @@ -1435,3 +1435,4 @@ rac rule [command] [options] [arguments] + diff --git a/doc/racgui_manual.txt b/doc/racgui_manual.txt new file mode 100644 index 0000000..44c9fab --- /dev/null +++ b/doc/racgui_manual.txt @@ -0,0 +1,91 @@ +####################################################### +# RAC GUI +# Distributed under GNU Public License +# Author: Sergey Kalinin svk@nuk-svk.ru +# Copyright (c) "SVK", 2019, http://nuk-svk.ru +###################################################### + +Программа Rac-GUI представляет собой мультиплатформенный графический интерфейс к консольной утилите 1С rac. +Основной интерфейс программы состоит из: +1. Панели инструментов +2. Дерева для отображения структуры +3. Табличного поля + +Для добавления, редактирования, удаления сущностей (сервера, информационные базы, сеансы) предназначены соответствующие кнопки, расположенные в панели инструментов слева. Кнопки контекстно-зависимые, т.е. в зависимости от того какой раздел активен для работы (сервер, информационные базы, кластер, сеансы и так далее), функции кнопок меняются. + +После первого запуска программы следует добавить основной сервер кластера 1С (где запущен ras). Для этого надо нажать кнопку "+" в панели инструментов, или сочетание клавиш Control-Insert. И в открывшейся форме заполнить соответствующие поля. Так как каждый сервер управления и клиент могут работать только на одинаковой платформе 1С, то в RAC-GUI для каждого сервера указывается команда (файл rac) для соответствующей платформы. + += "Горячие" клавиши = + +Insert - добавление нового +Delete - удаление текущего раздела (сущности) +Control-Enter - редактирование текущего раздела (сущности) +Control-Q - выход из программы +F1 - вызов дилога помощи + += Формат файла конфигурации = +Формат файла настроект серверов похож на JSON, но представляет собой несколько TCL-словарей вложенных друг в друга. +Обязательными значениями являются адрес хоста, номер порта и путь к RAC. Остальные настройки опциональны. +Опции сервера: +name - наименование сервера +rac_cmd - полный путь к утилите rac +agent_user - имя администратора агента кластера +agent_pwd - пароль администратора агента кластера + +Опции кластера: +cluster_name - наименование кластера +cluster_user - имя администратора кластера +cluster_pwd - пароль администратора кластера + +Опции инф. базы: +infobase_name - наименование ИБ +infobase_user - имя пользователя ИБ +infobase_pwd - пароль пользователя ИБ + +Адреса хостов, номера портов, идентификаторы кластеров и ИБ должны соответствовать реальным. + +Пример настроек: + +localhost:1545 { + name "Локальный сервер" + rac_cmd "/opt/1C/v8.3/x86_64/rac" + agent_user "" + agent_pwd "" + clusters { + 3ed9081a-c5b0-11e9-cf8a-1c1b0d94027e { + cluster_name "eeee" + } + 4581a966-a6bf-11e9-3c95-1c1b0d94027e { + cluster_name "Локальный кластер" + cluster_user "" + cluster_pwd "" + infobases { + 1e1d1cea-b856-11e9-748a-1c1b0d94027e { + infobase_name "wewe" + infobase_user "ibuser" + infobase_pwd "ibpwd" + } + 0129b2b2-b8d6-11e9-748a-1c1b0d94027e { + infobase_name "testdb" + infobase_user "testdb2-user" + infobase_pwd "testdb2-pwd" + } + cac80302-b855-11e9-748a-1c1b0d94027e { + infobase_name "testdb" + } + } + } + } +} +192.168.125.145:1545 { + name "Test" + rac_cmd /opt/1C/v8.3/x86_64/rac" + clusters { + } +} +1c-srv:1545 { + name "Cервер для бухгалтерии" + rac_cmd "/opt/1C/v8.3.13_1644/x86_64/rac" + clusters { + } +} diff --git a/lib/config.tcl b/lib/config.tcl new file mode 100644 index 0000000..7b48e78 --- /dev/null +++ b/lib/config.tcl @@ -0,0 +1,214 @@ +############################################# +# Rac GUI +# Distributed under GNU Public License +# Author: Sergey Kalinin svk@nuk-svk.ru +# Copyright (c) "http://nuk-svk.ru", 2018 +# https://bitbucket.org/svk28/rac-gui +############################################# +# Config file and dictionary working functions +# global dict - $servers_list +############################################## + +# Получаем юзера и пароль из конфига +proc GetInfobaseUser {host cluster infobase} { + global servers_list + if [dict exists $servers_list servers $host clusters $cluster infobases $infobase infobase_user] { + return [dict get $servers_list servers $host clusters $cluster infobases $infobase infobase_user] + } +} +proc GetInfobasePassword {host cluster infobase} { + global servers_list + if [dict exists $servers_list servers $host clusters $cluster infobases $infobase infobase_pwd] { + return [dict get $servers_list servers $host clusters $cluster infobases $infobase infobase_pwd] + } +} +proc GetClusterAdmin {host cluster} { + global servers_list + if [dict exists $servers_list servers $host clusters $cluster cluster_user] { + return [dict get $servers_list servers $host clusters $cluster cluster_user] + } +} +proc GetClusterPassword {host cluster} { + global servers_list + if [dict exists $servers_list servers $host clusters $cluster cluster_pwd] { + return [dict get $servers_list servers $host clusters $cluster cluster_pwd] + } +} + +proc GetAgentAdmin {host} { + global servers_list + if [dict exists $servers_list servers $host agent_user] { + return [dict get $servers_list servers $host agent_user] + } +} +proc GetAgentPassword {host} { + global servers_list + if [dict exists $servers_list servers $host agent_pwd] { + return [dict get $servers_list servers $host agent_pwd] + } +} + + + +# Конвертация словаря в удобочитаемый формат + +proc DictFormatter {dict {indent}} { + set str "" + set i 0 + foreach {k v} $dict { + #if {$v eq ""} {set v "NULL"} + #puts "\nkey - $k value - [string trim $v]" + + if [regexp {\{} $v] { + append indent "-" + DictFormatter $v $indent + } elseif [regexp {\}} $v] { + set indent [string trimright $indent "-"] + DictFormatter $v $indent + } else { + set str "$k $v" + } + } + puts "$indent$str" +} +proc dict2json {dictionary} { + dict for {key value} $dictionary { + puts "$key $value" + if {[string match {\{*\}} $value]} { + lappend Result "\"$key\":$value" + } elseif {![catch {dict size $value}]} { + lappend Result "\"$key\":\"[dict2json $value]\"" + } else { + lappend Result "\"$key\":\"$value\"" + } + puts $Result + } + return "\{[join $Result ",\n"]\}" +} + + +proc SetServersConfigDict {} { + global servers_list + +} + +# Сохраянем конфиг +proc SaveConfig {} { + global dir servers_list + #puts ">>>>>>>>>>> $servers_list <<<<<<<<<<<<" + set file [open [file join $dir(work) 1c_srv_new.cfg] "w"] + set f [open [file join $dir(work) 1c_srv_new_.cfg] "w"] + if {![dict exists $servers_list servers]} { + return + } + set dict [dict get $servers_list servers] + set dict [string map {"\{" "\{\n" "\}" "\n\}"} $dict] + regsub -- {(\})} $dict "\}\n" dict + puts $file $dict + close $file + set file [open [file join $dir(work) 1c_srv_new.cfg] "r"] + + set str "" + seek $file 0 + set close_brace 0 + set open_brace 0 + set indent "" + while {[gets $file line] >=0} { + if [regexp -- {\{} $line] { + if {$open_brace == 0} { + append indent "" + } else { + append indent " " + } + incr open_brace + } + if [regexp -- {\}} $line] { + #incr open_brace -1 + set indent [string range $indent 0 end-4] + incr close_brace + } + if [regexp -nocase -all -- {(\})(.+?\{)} $line match brace phrase] { + set line "$brace\n$indent$phrase" + } + if {$open_brace > $close_brace} { + #set line "$indent$line" + } + if [regexp -nocase -indices -all -- {((.*?)\s(".*?"))} $line match v1 v2 v3] { + set index [lindex [split $v3 " "] 1] + #puts $index + set last_pair [string trim [string range $line $index+1 end]] + set line [GetDictFromString $line $indent] + if {$last_pair ne ""} { + append line "$indent[string trim $last_pair]" + } + } + append str $indent [string trim $line] "\n" + } + puts $f $str + close $f + set file [open [file join $dir(work) 1c_srv_new.cfg] "w"] + set f [open [file join $dir(work) 1c_srv_new_.cfg] "r"] + while {[gets $f line] >=0} { + if {$line ne ""} { + puts $file $line + } + } + #puts $file $servers_list + #file delete -force [file join $dir(work) 1c_srv_new_.cfg] + #file copy -force [file join $dir(work) 1c_srv_new_.cfg] [file join $dir(work) 1c_srv_new.cfg] +} + +proc GetDictFromString {str indent} { + puts $str + if [regexp -nocase -indices -- {((.*?)\s(".*?"))} $str match v1 v2 v3] { + set index [lindex [split $v3 " "] 1] + set first_pair [string range $str 0 $index] + append res $indent $first_pair "\n" + append res [GetDictFromString [string range $str $index+1 end] $indent] "\n" + #append res [string range $str $index+1 end] "\n" + return $res + } +} + + +# Проверка установки переменных в конфиге +proc CheckVariablesSet {} { + global default dir + set lst_vars { + rac_dir + critical_total_memory + temporary_allowed_total_memory + temporary_allowed_total_memory_time_limit + } + set result [::msgcat::mc "The default variables is undefinied:"] + set var "" + foreach item $lst_vars { + if {![info exists default($item)]} { + append var "\ndefault($item)" + } + } + puts $var + append result $var "\n" [::msgcat::mc "New config file will be copying from RAC GUI distributive."] + if {$var ne ""} { + set answer [tk_messageBox -message $result \ + -icon warning -type yesno ] + switch -- $answer { + no return + yes { + CopyNewConfig + source [file join $dir(work) rac_gui.cfg] + } + } + } +} + + +proc CopyNewConfig {} { + global dir + if {[file exists [file join $dir(work) rac_gui.cfg]] ==1} { + file rename -force [file join $dir(work) rac_gui.cfg] [file join $dir(work) rac_gui.cfg.old] + file copy [file join $dir(root) rac_gui.cfg] [file join $dir(work) rac_gui.cfg] + } + +} + diff --git a/lib/function.tcl b/lib/function.tcl index 4525890..85ec640 100644 --- a/lib/function.tcl +++ b/lib/function.tcl @@ -7,6 +7,8 @@ ########################################### proc Quit {} { + # Сохраняем конфиг + SaveConfig exit } @@ -30,37 +32,45 @@ proc TreePress {tree} { } proc SetGlobalVarFromTreeItems {tree id} { - global host server active_cluster infobase profile_name dir rac_cmd_for_host rac_cmd + global host server active_cluster infobase profile_name dir rac_cmd_for_host rac_cmd servers_list \ + cluster_user cluster_pwd agent_user agent_pwd set parent [$tree parent $id] set values [$tree item $id -values] set key [lindex [split $id "::"] 0] + puts "$parent $values $key" switch -- $key { server { set host $values - set orig_file [open [file join $dir(work) 1c_srv.cfg] "r"] - while {[gets $orig_file line] >=0 } { - if [string match "$host*" $line] { - set path_to_rac [string trim [lindex [split $line ","] 1]] - if {$path_to_rac eq ""} { - set rac_cmd_for_host($host) "$rac_cmd" - } else { - set rac_cmd_for_host($host) $path_to_rac - set rac_cmd $path_to_rac - } - } - } - close $orig_file + set rac_cmd_for_host($host) [dict get $servers_list servers $host rac_cmd] + } + work_server { + set server $values + } + cluster { + set active_cluster $values + #dict set servers_list servers $host clusters "$values {}" + set cluster_user [GetClusterAdmin $host $active_cluster] + set cluster_pwd [GetClusterPassword $host $active_cluster] + } + infobase { + set infobase $values + #puts [dict set servers_list servers $host clusters $active_cluster infobases $values] + } + profile { + set profile_name $values + } + agent_admins { + set agent_user [GetAgentAdmin $host] + set agent_pwd [GetAgentPassword $host] } - work_server {set server $values} - cluster {set active_cluster $values} - infobase {set infobase $values} - profile {set profile_name $values} } + if {$parent eq ""} { return } else { SetGlobalVarFromTreeItems $tree $parent } + } proc InsertItemsWorkList {lst} { @@ -80,11 +90,29 @@ proc InsertItemsWorkList {lst} { .frm_work.tree_work insert {} end -values $value_list -tags $tag .frm_work.tree_work column #0 -stretch foreach j $column_list { - .frm_work.tree_work heading $j -text $j + .frm_work.tree_work heading $j -text [::msgcat::mc [HumanReadableTextConvert $j]] } incr work_list_row_count } + +# Преобразование выражений (названий параметров) полученных из консоли +# для отображания в графических элементах. +# Т.е. выражение "session-fault-tolerance-level" +# будет преобразовано в "Session fault tolerance level" +proc HumanReadableTextConvert {txt} { + set lst [split $txt "-"] + if {[llength $lst] >0} { + foreach item $lst { + append str " " $item + } + } + set str [string trim $str] + set first_letter [string range $str 0 0] + set str "[string toupper $first_letter][string range $str 1 end]" + return $str +} + proc RunCommand {par} { global dir rac_cmd cluster work_list_row_count \ agent_user agent_pwd cluster_user cluster_pwd server_platform @@ -118,7 +146,7 @@ proc RunCommand {par} { } proc ErrorParcing {err opt} { - global cluster_user cluster_pwd agent_user agent_pwd + global cluster_user cluster_pwd agent_user agent_pwd servers_list switch -regexp -- $err { "Cluster administrator is not authenticated" { @@ -161,7 +189,7 @@ proc ErrorParcing {err opt} { } } proc AuthorisationDialog {txt} { - global active_cluster agent_user agent_pwd cluster_user cluster_pwd + global active_cluster agent_user agent_pwd cluster_user cluster_pwd servers_list .frm_work.tree_work delete [ .frm_work.tree_work children {}] set frm [AddToplevel "$txt" administrator_grey_64 .auth_win] @@ -340,11 +368,77 @@ proc GetWorkTreeRow {} { return $lst } +# Диалог указания пути до RAC +proc SetRacCommand {} { + global env tcl_platform default + + if {$tcl_platform(os) eq "Windows NT"} { + set init_dir $env(COMMONPROGRAMFILES) + } elseif {$tcl_platform(os) eq "Linux"} { + set init_dir $default(rac_dir) + } else { + set init_dir $env(HOME) + } + set rac_cmd "[tk_getOpenFile -initialdir $init_dir -parent .add \ + -title [::msgcat::mc "Show where is a RAC command"] -initialfile rac]" + if {$rac_cmd eq ""} { + return + } else { + #puts $rac_cmd + if {[file tail $rac_cmd] ne "rac" && [file tail $rac_cmd] ne "rac.exe"} { + set rac [file tail $rac_cmd] + set path_to_rac [file rootname $rac_cmd] + append msg [::msgcat::mc "Command must be"] " 'rac' " \ + [::msgcat::mc "or"] " 'rac.exe'\n" \ + [::msgcat::mc "You entered"] " '$rac' - " \ + [::msgcat::mc "it's correct?"] + set answer [tk_messageBox -message [::msgcat::mc $msg] -icon question -type yesno] + switch -- $answer { + yes { + return $rac_cmd + } + no SetRacCommand + } + } else { + return $rac_cmd + } + + } +} + +proc ShowHelpDialog {} { + global default dir racgui_version racgui_release + set frm [AddToplevel [::msgcat::mc "About"] help_grey_64] + wm title .add [::msgcat::mc "About"] + ttk::label $frm.lbl_version -text "[::msgcat::mc "Version"]: $racgui_version" + ttk::label $frm.lbl_release -text "[::msgcat::mc "Release"]: $racgui_release" + + text $frm.txt -wrap word + ttk::scrollbar $frm.hsb -orient horizontal -command [list $frm.t xview] + ttk::scrollbar $frm.vsb -orient vertical -command [list $frm.t yview] + text $frm.t -xscrollcommand [list $frm.hsb set] -yscrollcommand [list $frm.vsb set] + grid $frm.lbl_version -row 0 -column 0 -sticky nsew -padx 5 -pady 2 + grid $frm.lbl_release -row 1 -column 0 -sticky nsew -padx 5 -pady 2 + grid $frm.t -row 2 -column 0 -sticky nsew + grid $frm.vsb -row 2 -column 1 -sticky nsew + grid $frm.hsb -row 3 -column 0 -sticky nsew + grid columnconfigure $frm 0 -weight 1 + grid rowconfigure $frm 0 -weight 1 + + set file_help [open [file join $dir(doc) racgui_manual.txt] "RDONLY"] + while {[gets $file_help line] >=0} { + $frm.t insert end "$line\n" + } + close $file_help + destroy .add.frm_btn.btn_ok + return $frm +} + namespace eval Run {} {} # Получение данных по кластерам proc Run::server {tree host values} { - global rac_cmd_for_host rac_cmd + global rac_cmd_for_host rac_cmd servers_list if {[info exists rac_cmd_for_host($host)] == 1 && $rac_cmd_for_host($host) ne "" } { set rac_cmd $rac_cmd_for_host($host) } @@ -369,10 +463,15 @@ proc Run::server {tree host values} { } foreach x [array names cluster] { set id [lindex $cluster($x) 0] + set cluster_name [lindex $cluster($x) 1] if { [$tree exists "cluster::$id"] == 0 } { - $tree insert "server::$host" end -id "cluster::$id" -text "[lindex $cluster($x) 1]" -values "$id" + $tree insert "server::$host" end -id "cluster::$id" -text "$cluster_name" -values "$id" InsertClusterItems $tree $id } + #dict replace servers_list [dict get servers_list servers $host clusters] + #dict set servers_list servers $host clusters $id name $cluster_name + #puts $cluster_name + #puts $servers_list } if { [$tree exists "agent_admins::$id"] == 0 } { $tree insert "server::$host" end -id "agent_admins::$id" -text [::msgcat::mc "Administrators"] -values "$id" @@ -396,7 +495,7 @@ proc Run::services {tree host values} { } proc Run::infobases {tree host values} { - global active_cluster cluster_user cluster_pwd + global active_cluster cluster_user cluster_pwd servers_list .frm_work.tree_work delete [ .frm_work.tree_work children {}] if {$cluster_user ne "" && $cluster_pwd ne ""} { set auth "--cluster-user=$cluster_user --cluster-pwd=$cluster_pwd" @@ -423,21 +522,31 @@ proc Run::infobases {tree host values} { set id [lindex $base($x) 0] if { [$tree exists "infobase::$id"] == 0 } { $tree insert "infobases::$values" end -id "infobase::$id" -text "[lindex $base($x) 1]" -values "$id" + if {![dict exists $servers_list servers $host clusters $active_cluster infobases $id]} { + dict set servers_list servers $host clusters $active_cluster \ + infobases $id "name \"[lindex $base($x) 1]\"" + } } InsertBaseItems $tree $id } + #dict update dictionaryVariable key varName ?key varName ...? body + } proc Run::infobase {tree host values} { - global active_cluster cluster_user cluster_pwd default + global active_cluster cluster_user cluster_pwd default servers_list + if {$cluster_user ne "" && $cluster_pwd ne ""} { set auth "--cluster-user=$cluster_user --cluster-pwd=$cluster_pwd" } else { set auth "" } - #### Временный костыль #### - if {[info exists default(infobase_user)] == 1 && [info exists default(infobase_pwd)] == 1} { - set ib_auth "--infobase-user=$default(infobase_user) --infobase-pwd=$default(infobase_pwd)" + #### Проверяем наличие юзера и пароля в конфиге и если есть то используем #### + set infobase_user [GetInfobaseUser $host $active_cluster $values] + set infobase_pwd [GetInfobasePassword $host $active_cluster $values] + + if {$infobase_user ne "" && $infobase_pwd ne ""} { + set ib_auth "--infobase-user=$infobase_user --infobase-pwd=$infobase_pwd" } else { set ib_auth "" } @@ -457,7 +566,6 @@ proc Run::List:Base {tree host values par} { } else { set auth "" } - .frm_work.tree_work delete [ .frm_work.tree_work children {}] set lst [RunCommand "$par list --cluster=$active_cluster $auth --infobase=$values $host"] @@ -803,7 +911,7 @@ proc AddToplevel {lbl img {win_name .add}} { grid $frm_btn -row 1 -column 1 -sticky sew -padx 0 -pady 0 pack $frm_btn.btn_cancel $frm_btn.btn_ok -side right -padx 5 -pady 5 #pack $frm_btn.btn_ok -side right -padx 2 - + bind .add $cmd return $frm } @@ -887,36 +995,63 @@ proc Add::admin {tree host value} { } proc Add::server {} { - global default rac_cmd_for_host + global default rac_cmd_for_host servers_list set frm [AddToplevel [::msgcat::mc "Main server"] server_grey_64] + ttk::label $frm.lbl_server_name -text [::msgcat::mc "Name"] + ttk::entry $frm.ent_server_name ttk::label $frm.lbl_host -text [::msgcat::mc "Address"] ttk::entry $frm.ent_host ttk::label $frm.lbl_port -text [::msgcat::mc "Port"] ttk::entry $frm.ent_port ttk::label $frm.lbl_path_to_rac -text [::msgcat::mc "Path to RAC"] ttk::entry $frm.ent_path_to_rac + ttk::button $frm.btn_path_to_rac -text "..." -width 3 $frm.ent_port insert end $default(port) - grid $frm.lbl_host -row 0 -column 0 -sticky nw -padx 5 -pady 5 - grid $frm.ent_host -row 0 -column 1 -sticky new -padx 5 -pady 5 - grid $frm.lbl_port -row 1 -column 0 -sticky nw -padx 5 -pady 5 - grid $frm.ent_port -row 1 -column 1 -sticky new -padx 5 -pady 5 - grid $frm.lbl_path_to_rac -row 2 -column 0 -sticky nw -padx 5 -pady 5 - grid $frm.ent_path_to_rac -row 2 -column 1 -sticky new -padx 5 -pady 5 + grid $frm.lbl_server_name -row 0 -column 0 -sticky nsw -padx 5 -pady 5 + grid $frm.ent_server_name -row 0 -column 1 -columnspan 2 -sticky nsew -padx 5 -pady 5 + grid $frm.lbl_host -row 1 -column 0 -sticky nsw -padx 5 -pady 5 + grid $frm.ent_host -row 1 -column 1 -columnspan 2 -sticky nsew -padx 5 -pady 5 + grid $frm.lbl_port -row 2 -column 0 -sticky nsw -padx 5 -pady 5 + grid $frm.ent_port -row 2 -column 1 -columnspan 2 -sticky nesw -padx 5 -pady 5 + grid $frm.lbl_path_to_rac -row 3 -column 0 -sticky nsw -padx 5 -pady 5 + grid $frm.ent_path_to_rac -row 3 -column 1 -sticky nsew -padx 5 -pady 5 + grid $frm.btn_path_to_rac -row 3 -column 2 -sticky new -padx 5 -pady 5 grid columnconfigure $frm 0 -weight 1 grid rowconfigure $frm 0 -weight 1 - #set frm_btn [frame .add.frm_btn -border 0] + + $frm.btn_path_to_rac configure -command { + .add.frm.ent_path_to_rac delete 0 end + .add.frm.ent_path_to_rac insert end [SetRacCommand] + } + .add.frm_btn.btn_ok configure -command { - set host [SaveMainServer [.add.frm.ent_host get] [.add.frm.ent_port get] [.add.frm.ent_path_to_rac get]] - set rac_cmd_for_host($host) [.add.frm.ent_path_to_rac get] - .frm_tree.tree insert {} end -id "server::$host" -text "$host" -values "$host" + set msg "" + set server_name "[.add.frm.ent_server_name get]" + set host "[.add.frm.ent_host get]:[.add.frm.ent_port get]" + set rac_cmd_for_host($host) "[.add.frm.ent_path_to_rac get]" + if {$rac_cmd_for_host($host) eq ""} { + append msg [::msgcat::mc "Command must be"] " 'rac' " \ + [::msgcat::mc "or"] " 'rac.exe'\n" + tk_messageBox -message [::msgcat::mc $msg] -icon question -type ok + return + } + dict set servers_list servers $host "name \"$server_name\" rac_cmd \"$rac_cmd_for_host($host)\" clusters {}" + + #set host [SaveMainServer [.add.frm.ent_host get] [.add.frm.ent_port get] [.add.frm.ent_path_to_rac get]] + #set rac_cmd_for_host($host) [.add.frm.ent_path_to_rac get] + #puts $servers_list + .frm_tree.tree insert {} end -id "server::$host" -text "$server_name" -values "$host" destroy .add + unset msg + #SaveConfig return $host } return $frm } proc Add::servers {tree host values} { - global default dedicate_managers using active_cluster cluster_user cluster_pwd auth + global default dedicate_managers using active_cluster cluster_user cluster_pwd auth \ + servers_list if {$cluster_user ne "" && $cluster_pwd ne ""} { set auth "--cluster-user=$cluster_user --cluster-pwd=$cluster_pwd" } else { @@ -935,32 +1070,47 @@ proc Add::servers {tree host values} { ttk::label $frm.lbl_agent_port -text [::msgcat::mc "Port"] ttk::entry $frm.ent_agent_port $frm.ent_agent_port insert end $default(port) - ttk::label $frm.lbl_port_range -text [::msgcat::mc "Ports range"] + ttk::label $frm.lbl_port_range -text [::msgcat::mc "Port range"] ttk::entry $frm.ent_port_range $frm.ent_port_range insert end $default(port_range) - ttk::label $frm.lbl_safe_working_processes_memory_limit -text [::msgcat::mc "Maximum memory in working processes"] + ttk::label $frm.lbl_safe_working_processes_memory_limit \ + -text [::msgcat::mc "Safe working processes memory limit"] ttk::entry $frm.ent_safe_working_processes_memory_limit $frm.ent_safe_working_processes_memory_limit insert end $default(safe_working_processes_memory_limit) - ttk::label $frm.lbl_safe_call_memory_limit -text [::msgcat::mc "Safe memory consuption per call"] + ttk::label $frm.lbl_safe_call_memory_limit -text [::msgcat::mc "Safe call memory limit"] ttk::entry $frm.ent_safe_call_memory_limit $frm.ent_safe_call_memory_limit insert end $default(safe_call_memory_limit) - ttk::label $frm.lbl_memory_limit -text [::msgcat::mc "Memory use limit per working process"] + ttk::label $frm.lbl_memory_limit -text [::msgcat::mc "Memory limit"] ttk::entry $frm.ent_memory_limit $frm.ent_memory_limit insert end $default(ram_work) - ttk::label $frm.lbl_infobases_limit -text [::msgcat::mc "Maximum number of infobases per working process"] + ttk::label $frm.lbl_infobases_limit -text [::msgcat::mc "Infobases limit"] ttk::entry $frm.ent_infobases_limit $frm.ent_infobases_limit insert end $default(infobases_limit) - ttk::label $frm.lbl_connections_limit -text [::msgcat::mc "Maximum nuber of connections per working process"] + ttk::label $frm.lbl_connections_limit -text [::msgcat::mc "Connections limit"] ttk::entry $frm.ent_connections_limit $frm.ent_connections_limit insert end $default(connections_limit) - ttk::label $frm.lbl_cluster_port -text [::msgcat::mc "Main cluster manager port number"] + ttk::label $frm.lbl_cluster_port -text [::msgcat::mc "Сluster port"] ttk::entry $frm.ent_cluster_port $frm.ent_cluster_port insert end $default(port) - ttk::label $frm.lbl_dedicate_managers -text [::msgcat::mc "Service manager allocation"] + ttk::label $frm.lbl_dedicate_managers -text [::msgcat::mc "Dedicate managers"] ttk::checkbutton $frm.check_dedicate_managers -variable dedicate_managers -onvalue all -offvalue none ttk::label $frm.lbl_using -text [::msgcat::mc "Working server use variant"] ttk::checkbutton $frm.check_using -variable using -onvalue main -offvalue normal + ttk::label $frm.lbl_critical_total_memory -text [::msgcat::mc "Critical total memory"] + ttk::entry $frm.ent_critical_total_memory + $frm.ent_critical_total_memory insert end $default(critical_total_memory) + + ttk::label $frm.lbl_temporary_allowed_total_memory \ + -text [::msgcat::mc "Temporary allowed total memory"] + ttk::entry $frm.ent_temporary_allowed_total_memory + $frm.ent_temporary_allowed_total_memory insert end $default(temporary_allowed_total_memory) + + ttk::label $frm.lbl_temporary_allowed_total_memory_time_limit \ + -text [::msgcat::mc "Temporary allowed total memory time limit"] + ttk::entry $frm.ent_temporary_allowed_total_memory_time_limit + $frm.ent_temporary_allowed_total_memory_time_limit insert end $default(temporary_allowed_total_memory_time_limit) + grid $frm.lbl_name -row 0 -column 0 -sticky nw -padx 5 -pady 5 grid $frm.ent_name -row 0 -column 1 -sticky nsew -padx 5 -pady 5 grid $frm.lbl_agent_host -row 1 -column 0 -sticky nw -padx 5 -pady 5 @@ -969,8 +1119,12 @@ proc Add::servers {tree host values} { grid $frm.ent_agent_port -row 2 -column 1 -sticky new -padx 5 -pady 5 grid $frm.lbl_port_range -row 3 -column 0 -sticky nw -padx 5 -pady 5 grid $frm.ent_port_range -row 3 -column 1 -sticky nsew -padx 5 -pady 5 - grid $frm.lbl_safe_working_processes_memory_limit -row 4 -column 0 -sticky nw -padx 5 -pady 5 - grid $frm.ent_safe_working_processes_memory_limit -row 4 -column 1 -sticky nsew -padx 5 -pady 5 + grid $frm.lbl_cluster_port -row 12 -column 0 -sticky nw -padx 5 -pady 5 + grid $frm.ent_cluster_port -row 12 -column 1 -sticky nsew -padx 5 -pady 5 + grid $frm.lbl_safe_working_processes_memory_limit \ + -row 4 -column 0 -sticky nw -padx 5 -pady 5 + grid $frm.ent_safe_working_processes_memory_limit \ + -row 4 -column 1 -sticky nsew -padx 5 -pady 5 grid $frm.lbl_safe_call_memory_limit -row 5 -column 0 -sticky nw -padx 5 -pady 5 grid $frm.ent_safe_call_memory_limit -row 5 -column 1 -sticky nsew -padx 5 -pady 5 grid $frm.lbl_memory_limit -row 6 -column 0 -sticky nw -padx 5 -pady 5 @@ -979,12 +1133,20 @@ proc Add::servers {tree host values} { grid $frm.ent_infobases_limit -row 7 -column 1 -sticky nsew -padx 5 -pady 5 grid $frm.lbl_connections_limit -row 8 -column 0 -sticky nw -padx 5 -pady 5 grid $frm.ent_connections_limit -row 8 -column 1 -sticky nsew -padx 5 -pady 5 - grid $frm.lbl_cluster_port -row 9 -column 0 -sticky nw -padx 5 -pady 5 - grid $frm.ent_cluster_port -row 9 -column 1 -sticky nsew -padx 5 -pady 5 - grid $frm.lbl_dedicate_managers -row 10 -column 0 -sticky nw -padx 5 -pady 5 - grid $frm.check_dedicate_managers -row 10 -column 1 -sticky nw -padx 5 -pady 5 - grid $frm.lbl_using -row 11 -column 0 -sticky nw -padx 5 -pady 5 - grid $frm.check_using -row 11 -column 1 -sticky nw -padx 5 -pady 5 + + grid $frm.lbl_critical_total_memory -row 9 -column 0 -sticky nw -padx 5 -pady 5 + grid $frm.ent_critical_total_memory -row 9 -column 1 -sticky nsew -padx 5 -pady 5 + grid $frm.lbl_temporary_allowed_total_memory -row 10 -column 0 -sticky nw -padx 5 -pady 5 + grid $frm.ent_temporary_allowed_total_memory -row 10 -column 1 -sticky nsew -padx 5 -pady 5 + grid $frm.lbl_temporary_allowed_total_memory_time_limit \ + -row 11 -column 0 -sticky nw -padx 5 -pady 5 + grid $frm.ent_temporary_allowed_total_memory_time_limit \ + -row 11 -column 1 -sticky nsew -padx 5 -pady 5 + + grid $frm.lbl_dedicate_managers -row 13 -column 0 -sticky nw -padx 5 -pady 5 + grid $frm.check_dedicate_managers -row 13 -column 1 -sticky nw -padx 5 -pady 5 + grid $frm.lbl_using -row 14 -column 0 -sticky nw -padx 5 -pady 5 + grid $frm.check_using -row 14 -column 1 -sticky nw -padx 5 -pady 5 .add.frm_btn.btn_ok configure -command { RunCommand "server insert \ @@ -1000,6 +1162,9 @@ proc Add::servers {tree host values} { --dedicate-managers=$dedicate_managers \ --safe-working-processes-memory-limit=[.add.frm.ent_safe_working_processes_memory_limit get] \ --safe-call-memory-limit=[.add.frm.ent_safe_call_memory_limit get] \ + --critical-total-memory=[.add.frm.ent_critical_total_memory get] \ + --temporary-allowed-total-memory=[.add.frm.ent_temporary_allowed_total_memory get] \ + --temporary-allowed-total-memory-time-limit=[.add.frm.ent_temporary_allowed_total_memory_time_limit get] \ --cluster=$active_cluster $auth $host" Run::servers $tree $host $active_cluster destroy .add @@ -1127,7 +1292,7 @@ proc Add::infobases {tree host values} { proc Add::cluster {tree host values} { global default lifetime_limit expiration_timeout session_fault_tolerance_level global max_memory_size max_memory_time_limit errors_count_threshold security_level - global load_balancing_mode kill_problem_processes \ + global load_balancing_mode kill_problem_processes kill_by_memory_with_dump \ agent_user agent_pwd cluster_user cluster_pwd auth_agent if {$agent_user ne "" && $agent_pwd ne ""} { set auth_agent "--agent-user=$agent_user --agent-pwd=$agent_pwd" @@ -1143,10 +1308,12 @@ proc Add::cluster {tree host values} { set errors_count_threshold $default(errors_count_threshold) set security_level [lindex $default(security_level) 0] set load_balancing_mode [lindex $default(load_balancing_mode) 0] - + set kill_problem_processes no + set kill_by_memory_with_dump no + set frm [AddToplevel [::msgcat::mc "Cluster"] cluster_grey_64] - ttk::label $frm.lbl_host -text [::msgcat::mc "Main server address"] + ttk::label $frm.lbl_host -text [::msgcat::mc "Host"] ttk::entry $frm.ent_host ttk::label $frm.lbl_port -text [::msgcat::mc "Port"] ttk::entry $frm.ent_port @@ -1154,27 +1321,34 @@ proc Add::cluster {tree host values} { ttk::label $frm.lbl_name -text [::msgcat::mc "Name"] ttk::entry $frm.ent_name - ttk::label $frm.lbl_secure_connect -text [::msgcat::mc "Secure level"] + ttk::label $frm.lbl_security_level -text [::msgcat::mc "Security level"] ttk::combobox $frm.cb_security_level -textvariable security_level -values $default(security_level) - ttk::label $frm.lbl_expiration_timeout -text [::msgcat::mc "Forced termination time"] + ttk::label $frm.lbl_expiration_timeout -text [::msgcat::mc "Expiration timeout"] ttk::entry $frm.ent_expiration_timeout -textvariable expiration_timeout - ttk::label $frm.lbl_session_fault_tolerance_level -text [::msgcat::mc "Fault-tolerance level"] - ttk::entry $frm.ent_session_fault_tolerance_level -textvariable session_fault_tolerance_level + ttk::label $frm.lbl_session_fault_tolerance_level \ + -text [::msgcat::mc "Session fault tolerance level"] + ttk::entry $frm.ent_session_fault_tolerance_level \ + -textvariable session_fault_tolerance_level ttk::label $frm.lbl_load_balancing_mode -text [::msgcat::mc "Load balancing mode"] ttk::combobox $frm.cb_load_balancing_mode -textvariable load_balancing_mode \ -values $default(load_balancing_mode) - ttk::label $frm.lbl_errors_count_threshold -text [::msgcat::mc "Server errors threshold"] + ttk::label $frm.lbl_errors_count_threshold -text [::msgcat::mc "Errors count threshold"] ttk::entry $frm.ent_errors_count_threshold -textvariable errors_count_threshold - ttk::label $frm.lbl_processes -text [::msgcat::mc "Working process"] - ttk::label $frm.lbl_lifetime_limit -text [::msgcat::mc "Restart time"] + ttk::label $frm.lbl_processes -text [::msgcat::mc "Processes"] + ttk::label $frm.lbl_lifetime_limit -text [::msgcat::mc "Lifetime limit"] ttk::entry $frm.ent_lifetime_limit -textvariable lifetime_limit - ttk::label $frm.lbl_max_memory_size -text [::msgcat::mc "Maximum virtual address space"] + ttk::label $frm.lbl_max_memory_size -text [::msgcat::mc "Max memory size"] ttk::entry $frm.ent_max_memory_size -textvariable max_memory_size - ttk::label $frm.lbl_max_memory_time_limit -text [::msgcat::mc "Maximum period of memori size exeeding"] + ttk::label $frm.lbl_max_memory_time_limit -text [::msgcat::mc "Max memory time limit"] ttk::entry $frm.ent_max_memory_time_limit -textvariable max_memory_time_limit - ttk::label $frm.lbl_kill_problem_processes -justify left -anchor nw -text [::msgcat::mc "Terminate corrupted processes"] - ttk::checkbutton $frm.check_kill_problem_processes -variable kill_problem_processes -onvalue yes -offvalue no - + ttk::label $frm.lbl_kill_problem_processes -justify left -anchor nw \ + -text [::msgcat::mc "Kill problem processes"] + ttk::checkbutton $frm.check_kill_problem_processes \ + -variable kill_problem_processes -onvalue yes -offvalue no + ttk::checkbutton $frm.check_kill_by_memory_with_dump \ + -variable kill_by_memory_with_dump -onvalue yes -offvalue no + ttk::label $frm.lbl_kill_by_memory_with_dump -justify left -anchor nw \ + -text [::msgcat::mc "Kill by memory with dump"] grid $frm.lbl_host -row 0 -column 0 -sticky nw -padx 5 -pady 5 grid $frm.ent_host -row 0 -column 1 -sticky nsew -padx 5 -pady 5 @@ -1182,7 +1356,7 @@ proc Add::cluster {tree host values} { grid $frm.ent_port -row 1 -column 1 -sticky nsew -padx 5 -pady 5 grid $frm.lbl_name -row 2 -column 0 -sticky nw -padx 5 -pady 5 grid $frm.ent_name -row 2 -column 1 -sticky nsew -padx 5 -pady 5 - grid $frm.lbl_secure_connect -row 3 -column 0 -sticky nw -padx 5 -pady 5 + grid $frm.lbl_security_level -row 3 -column 0 -sticky nw -padx 5 -pady 5 grid $frm.cb_security_level -row 3 -column 1 -sticky nsew -padx 5 -pady 5 grid $frm.lbl_expiration_timeout -row 4 -column 0 -sticky nw -padx 5 -pady 5 grid $frm.ent_expiration_timeout -row 4 -column 1 -sticky nsew -padx 5 -pady 5 @@ -1201,12 +1375,14 @@ proc Add::cluster {tree host values} { grid $frm.ent_max_memory_time_limit -row 11 -column 1 -sticky nsew -padx 5 -pady 5 grid $frm.lbl_kill_problem_processes -row 12 -column 0 -sticky nw -padx 5 -pady 5 grid $frm.check_kill_problem_processes -row 12 -column 1 -sticky nw -padx 5 -pady 5 + grid $frm.lbl_kill_by_memory_with_dump -row 13 -column 0 -sticky nw -padx 5 -pady 5 + grid $frm.check_kill_by_memory_with_dump -row 13 -column 1 -sticky nw -padx 5 -pady 5 .add.frm_btn.btn_ok configure -command { RunCommand "cluster insert \ --host=[.add.frm.ent_host get] \ --port=[.add.frm.ent_port get] \ - --name=[.add.frm.ent_name get] \ + --name=[regsub -all -- " " [.add.frm.ent_name get] "\\ "] \ --expiration-timeout=$expiration_timeout \ --lifetime-limit=$lifetime_limit \ --max-memory-size=$max_memory_size \ @@ -1216,6 +1392,7 @@ proc Add::cluster {tree host values} { --load-balancing-mode=$load_balancing_mode \ --errors-count-threshold=$errors_count_threshold \ --kill-problem-processes=$kill_problem_processes \ + --kill-by-memory-with-dump=$kill_by_memory_with_dump \ $auth_agent $host" Run::server $tree $host "" destroy .add @@ -1700,60 +1877,45 @@ proc Edit::managers {tree host values} { } proc Edit::server {tree host value} { - global dir prev_address rac_cmd rac_cmd_for_host + global dir prev_address rac_cmd rac_cmd_for_host servers_list set frm [Add::server] wm title .add [::msgcat::mc "Edit record"] set lst [split $value ":"] set prev_address $value - set orig_file [open [file join $dir(work) 1c_srv.cfg] "r"] - while {[gets $orig_file line] >=0 } { - if [string match "$prev_address*" $line] { - set path_to_rac [string trim [lindex [split $line ","] 1]] - if {$path_to_rac eq ""} { - set path_to_rac "$rac_cmd" - } - } - } - close $orig_file + .add.frm.ent_server_name delete 0 end .add.frm.ent_host delete 0 end .add.frm.ent_port delete 0 end .add.frm.ent_path_to_rac delete 0 end + + .add.frm.ent_server_name insert end [dict get $servers_list servers $prev_address name] + .add.frm.ent_host insert end [lindex $lst 0] .add.frm.ent_port insert end [lindex $lst 1] - .add.frm.ent_path_to_rac insert end $path_to_rac + .add.frm.ent_path_to_rac insert end [dict get $servers_list servers $prev_address rac_cmd] .add.frm_btn.btn_ok configure -command { set host "[.add.frm.ent_host get]:[.add.frm.ent_port get]" - #set rac_cmd [.add.frm.ent_path_to_rac get] + set server_name [.add.frm.ent_server_name get] set rac_cmd_for_host($host) [.add.frm.ent_path_to_rac get] .frm_tree.tree delete "server::$prev_address" .frm_work.tree_work delete [ .frm_work.tree_work children {}] - .frm_tree.tree insert {} end -id "server::$host" -text "$host" -values "$host" - if [file exists [file join $dir(work) 1c_srv.cfg.bak]] { - file delete [file join $dir(work) 1c_srv.cfg.bak] - } - file copy [file join $dir(work) 1c_srv.cfg] [file join $dir(work) 1c_srv.cfg.bak] - set orig_file [open [file join $dir(work) 1c_srv.cfg.bak] "r"] - set file [open [file join $dir(work) 1c_srv.cfg] "w"] - while {[gets $orig_file line] >=0 } { - if [string match "$prev_address*" $line] { - puts $file "$host,$rac_cmd_for_host($host)" - } else { - puts $file $line - } - } - close $file - close $orig_file - #return "$host:$port" - file delete [file join $dir(work) 1c_srv.cfg.bak] + .frm_tree.tree insert {} end -id "server::$host" -text "$server_name" -values "$host" + + set clusters [dict get $servers_list servers $prev_address clusters] + dict unset servers_list servers $prev_address + dict set servers_list servers $host "name \"$server_name\" rac_cmd $rac_cmd_for_host($host) clusters \{$clusters\}" + unset clusters server_name + #puts $servers_list destroy .add + SaveConfig return $host } } proc Edit::cluster {tree host values} { global default lifetime_limit expiration_timeout session_fault_tolerance_level - global max_memory_size max_memory_time_limit errors_count_threshold security_level + global max_memory_size max_memory_time_limit errors_count_threshold security_level \ + kill_by_memmory_with_dump global load_balancing_mode kill_problem_processes active_cluster \ agent_user agent_pwd cluster_user cluster_pwd auth if {$cluster_user ne "" && $cluster_pwd ne ""} { @@ -1787,6 +1949,7 @@ proc Edit::cluster {tree host values} { --load-balancing-mode=$load_balancing_mode \ --errors-count-threshold=$errors_count_threshold \ --kill-problem-processes=$kill_problem_processes \ + --kill-by-memory-with-dump=$kill_by_memory_with_dump \ $auth $host" $tree delete "cluster::$active_cluster" Run::server $tree $host "" @@ -1956,6 +2119,9 @@ proc Edit::work_server {tree host values} { --dedicate-managers=$dedicate_managers \ --safe-working-processes-memory-limit=[.add.frm.ent_safe_working_processes_memory_limit get] \ --safe-call-memory-limit=[.add.frm.ent_safe_call_memory_limit get] \ + --critical-total-memory=[.add.frm.ent_critical_total_memory get] \ + --temporary-allowed-total-memory=[.add.frm.ent_temporary_allowed_total_memory get] \ + --temporary-allowed-total-memory-time-limit=[.add.frm.ent_temporary_allowed_total_memory_time_limit get] \ --cluster=$active_cluster $auth $host" Run::servers $tree $host $active_cluster destroy .add @@ -2293,6 +2459,7 @@ proc Del::sessions {tree host values} { } + proc Del::rule {tree host values} { global active_cluster server agent_user agent_pwd cluster_user cluster_pwd auth if {$cluster_user ne "" && $cluster_pwd ne ""} { @@ -2317,14 +2484,20 @@ proc Del::rule {tree host values} { no {return} } } - +# Удаление основного сервера кластера proc Del::server {tree host values} { - global dir + global dir servers_list set answer [tk_messageBox -message "[::msgcat::mc "Delete server"] $values?" \ -icon question -type yesno ] switch -- $answer { yes { - file copy [file join $dir(work) 1c_srv.cfg] [file join $dir(work) 1c_srv.cfg.bak] + dict unset servers_list servers $values + SaveConfig + $tree delete "server::$values" + .frm_work.tree_work delete [ .frm_work.tree_work children {}] + return + # данный код не используется. УДАЛИТЬ! + file copy [file join $dir(work) 1c_srv_new.cfg] [file join $dir(work) 1c_srv.cfg.bak] set orig_file [open [file join $dir(work) 1c_srv.cfg.bak] "r"] set file [open [file join $dir(work) 1c_srv.cfg] "w"] while {[gets $orig_file line] >=0 } { @@ -2334,10 +2507,9 @@ proc Del::server {tree host values} { } close $file close $orig_file - #return "$host:$port" - $tree delete "server::$values" - .frm_work.tree_work delete [ .frm_work.tree_work children {}] file delete [file join $dir(work) 1c_srv.cfg.bak] + #return "$host:$port" + ########## Конец Удаления ############# } no {return} } @@ -2424,15 +2596,3 @@ proc Del::app {tree host profile_name} { proc Del::inet {tree host profile_name} { Del::acl $host inet [GetWorkTreeItems "name"] $profile_name } - - - - - - - - - - - - diff --git a/lib/gui.tcl b/lib/gui.tcl index 059c776..a1a1200 100644 --- a/lib/gui.tcl +++ b/lib/gui.tcl @@ -22,13 +22,24 @@ wm protocol . WM_DELETE_WINDOW Quit wm overrideredirect . 0 wm positionfrom . user +bind . Quit +bind . Quit +bind . Quit +bind . Add +bind . Del +bind . Edit +bind . ShowHelpDialog + #ttk::style configure TPanedwindow -background blue #ttk::style configure Sash -sashthickness 5 #ttk::style configure TButton -padding 60 -relief flat -bg black #ttk::style configure Custom.Treeview -foreground red #ttk::style configure Custom.Treeview -rowheight 20 -ttk::style theme use dark + +if [info exists default(theme)] { + ttk::style theme use $default(theme) +} # Панель инсрументов set frm_tool [ttk::frame .frm_tool] @@ -40,11 +51,12 @@ pack propagate .panel false ttk::button $frm_tool.btn_add -command Add -image add_grey_32 ttk::button $frm_tool.btn_del -command Del -image del_grey_32 ttk::button $frm_tool.btn_edit -command Edit -image edit_grey_32 +ttk::button $frm_tool.btn_help -command ShowHelpDialog -image question_grey_32 ttk::button $frm_tool.btn_quit -command Quit -image quit_grey_32 -pack $frm_tool.btn_add $frm_tool.btn_del $frm_tool.btn_edit -side top -padx 5 -pady 5 +pack $frm_tool.btn_add $frm_tool.btn_del $frm_tool.btn_edit $frm_tool.btn_help -side top -padx 5 -pady 5 #label $frm_tool.lbl_logo -image tcl -pack $frm_tool.btn_quit -side bottom -padx 5 -pady 5 +pack $frm_tool.btn_quit -side bottom -padx 5 -pady 5 #pack $frm_tool.lbl_logo -side bottom -padx 5 -pady 5 # Дерево с полосами прокрутки @@ -76,8 +88,11 @@ set tree_work [ -yscrollcommand [list $frm_work.vsb set] ] # table rows background colors -$tree_work tag configure dark -background $color(dark_table_bg) -$tree_work tag configure light -background $color(light_table_bg) + +if {[info exists default(theme)] == 1} { + $tree_work tag configure dark -background $color(dark_table_bg) + $tree_work tag configure light -background $color(light_table_bg) +} bind $tree_work Edit $tree tag configure selected -background white -foreground black @@ -88,6 +103,7 @@ bind $tree_work { $tree_work item [.frm_work.tree_work selection] -tags selected } + #$tree_work heading par -text "Параметр" -anchor center #$tree_work heading val -text "Значение" -anchor center #set tree_work [ttk::treeview $frm_work.tree_work \ @@ -107,4 +123,3 @@ pack $frm_tree $frm_work -side left -expand true -fill both .panel add $frm_tree -weight 1 .panel add $frm_work -weight 1 - diff --git a/lib/images.tcl b/lib/images.tcl index 3da3f07..3d74f98 100644 --- a/lib/images.tcl +++ b/lib/images.tcl @@ -621,3 +621,94 @@ image create photo app_grey_64 -data { ZhhOnihW5Ql725851hOPesCgxn4/bfEYVJ5mwlTT7EDyT2bwR4yyTf3d6bFcLIPtYoR++ujBwUmV mhdPl2vMUeYmt/VyyQtF7jBPKF0n5wAAAABJRU5ErkJggg== } +image create photo help_grey_64 -data { + iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAQAAAAAYLlVAAAAAmJLR0QA/4ePzL8AAAAJcEhZcwAA + DsQAAA7EAZUrDhsAAAAHdElNRQfjCQ0JDhex/+rmAAAEzklEQVRo3sWZf0iVVxjHP727CxGJCAmJ + IZeIajfnD/IO56BshX+ELhF1wsI/Jv1x2lgbrTURN4bbmtiajW2HYlmMrcCYCFMzg5KcjeLiRGRJ + hAvxDxmXFhdxcnF3++Ne7/ve9/465/5Y37/uOfd9nud73nOe5zzP865DE8JgO8XsopAC8tnAKj68 + LPIHs0wzJwN6+tZpmN7EQWqpYnOCh7yMMcSg9GaYgNiDoI4cRa1+RpCMqrwNBQKihg5eRB8zfEpf + MhJJCIhSzrKH1DHJMflLigREDp28g4P0EOA8J+SSNgHh4grFZAYPeE1Oxf7LiGO+jl8zZh62MyGa + Y//1TEzzb3FR+cSr4Vnq3cueO0oExAd8oRMflB2+2m14xpISEG9zmmxhr/tvz0RCAqKeC1lYvYn9 + 7jnPdFwvEMVMkEd2scJeeS8mAZHHXVyKala5yRCTLLBMDvkU8jI17FSSfUSZfBKLwDccVTTfR7t8 + GOOerKSTKgX5XtkaRUBUMh4vKtgi20l5OsFl/REfKujYL8ciCAiDu5Qrrb5DfhKS2UInFeQwR7cc + tZDo5r2kWn6nRK5aI2GTovkZPg//vsobuNjKAX4WFZZn2plKqsdFiyUUC4MOxd3vD/IGUUhleHY9 + beYj0s/HCprahMN8AweVT/9f4V+5EfOlEaMRlpJq2sarJgGh7MW5llXHngfkCvMKut4MERCbqVYm + 0CjWDFcmfO6Jgq4q4QQHUKeRdJTyo+jCTw3ttvhmd7TkMKjnjAOo1QqlDTTEmP3TNt6kpOsQZwzh + SCvnM/3aGo5y2aokVSFyDVxsyACBGxGjA4rpzHrKDZsDpQYfAxHjY8qSxQbPZ4DAV9Jn2YBmXlGW + 3GHgTNv8It0W8zuRGrJOgy1pEzhurl8Uco2NGrL5hqLDxMewvBw27+SW5hvdaNhCqi6WzDAuihhX + dD+LHxhKSUh8dMlQ1BdVjPOctrxh4E/D/DJfh8w3cF1r78Mh3KF0bcTDzWByKeq4kmIR6zOiorgO + ZkPZ9IWUa2ivoXRzJ05PXGl40ryD+2kQeEEcBnaloeG+QyGBjI9mmtOMItMGU1HJxP+HVSYNucKd + p0ZgUvoMYOipERgJZsX9BFISD3CbHr5lJmUCP4VKM3FLqaS017iN0hMqa1qQKbR0pmXJWl1wTlvY + T23QPMiAvKSRA5k4ZxYm/SxoCvfLyBf/HY80NTzm+zAB6eeUpvh45FAGtOPJl8Hm5dpl3MucpgeT + QiliTeN6LNUxyBWOayl4Kaox4dKSP7nWvA2nI3LAllonRpPYFjE+rNgfCmKUH8z6zLIMFjWq5Gui + KCzYpJUJP6bVbOJHtumqGdK42f0M8BAHFVrFXYBDctAc2pqS4n26shx+2+Vn1qGtU+qZcBcodotS + w3naPP8mIADu6zgpyZL5yxyR/0RORRHwBNyDFLA7C+Z7aZVR8SNGu94TcA/jZ19Gm9YBTvGuffUx + DqHlONZwkfwMmfdxRPbF69PEgRykjOGMmL9NWTzzJCrM5AK1vK59T9pjfiv7ZIJ7Juk+izyOciKl + zfBylh6ZpGWpdNBEHi0IirSaVpJLMnm/VOvjdTmN1CS99WYZ5Kr1m0jGCIRoFFBBMTtwkh/uLfjx + Ms8DfsMjNc/Mf4o2PgHmKkMjAAAAAElFTkSuQmCC +} + +image create photo question_grey_64 -data { + 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 + QmCC +} +image create photo question_grey_32 -data { + iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAQAAADZc7J/AAAAAmJLR0QA/4ePzL8AAAAJcEhZcwAA + CxMAAAsTAQCanBgAAAAHdElNRQfjCRAKKwvtOFdVAAADe0lEQVRIx4XVbWiVZRwG8N/z7CST6TA3 + Sc1sGS56Q7KtUiRi1BIjP2QhWCyVoXsUJEKkwiTCbBVoFHmf5CD7YAjRp0SlkBW+fKiOYZhoZiai + lrpy1nIqbk8fznFubkfvT/fLdf3/98t1X//IkC2ZoEGdScpddsGf9mkPR4dCRoOow8yzyCPKBmH3 + ymkLF28YIHne++5Sup20MrSVCJCMkPVi3/CgnQ7rQLVa0z3Yt7JFU+gcFCCptk09uGSj9eHn6/ZW + a4lmFeCAmeHEgABJpW89BHZZGI4kscc1mWaM2Bl7tNkTepMaWU+DX80IZyAuJthUpH+sIRxJKrSm + WxxP51rsvHsstMOapCIcM8s7YLLPkwwKd520eBWsC6/ke6lf6u3ooGXZo/mD9bs1ySjzmI78d/k0 + 317fowE1LuV3EZOMtgZstxySSWan0inpoy0xYW+6O5VKM+mzSQ2E1TaDN5IJhSMscyvOaQ69kFYb + G4l4znBayhyORCLRnen44oGX+AMVVhAnGYvA2nCquHwmLfSuSEFvKpVKr0Q9BUDotBrMT0bEnjAO + 3dZffbDsMe/ZnG6KsvFFUkYXd/B7erLvVdv8hZFmZjwJvg5/X3vz3h1l+6Kewkx8S1Edl23NnriK + CBeSLy1AY0YdaO8vmg2ps32DxnQyen0SDZCwdgtQl1EDDpdU/5uRtCt6N10XugfMFxgTMyrBhRLf + epa69Kjm8M2gpcKvjDNu3FbYlc7+tLM0IKPLGJQPmX+Uez1Qgj6scN+xgs/UDgmqSr8PZ0ukLjCO + x/KgYUjQxeiLknsvMPJR0ugrdJvQXwk3a0m5E6owN9buNIYXBT0QNjGZmowaMkKTKvxrWxyuyIHl + SfVATMtcORvlFt83KHClVQUXCV0xPnQeVbL9QYvHRa95yhRz4rcG5f/I7ejWSkzosBLMSdZcw8R3 + G1vsTmkZYPHJci+D1nD8qqWttx28nqxNiiYX7U/PFRk/ZXv60Vf6AOwp2FAZ5NP6rZ5xG6aZUb8z + 38kPl+r2RfertMXSfFHoyfj6z7SA38wM/wy09bG2FY31Pxtkw3XfK6nRYomR4Bczw7HBhaVSzgt9 + w/12O6RDr9FqTTe1r9ht99I1zVxf2uZpdccNFHTaKrmCd5YqruXma/bwEOQDcnKh6ybVuRhmkkZ1 + xivHZaf8aEc4NBTyf7MOJUH/zPUoAAAAAElFTkSuQmCC +} diff --git a/lib/msg/ru.msg b/lib/msg/ru.msg index d9285f4..d9567d8 100644 --- a/lib/msg/ru.msg +++ b/lib/msg/ru.msg @@ -27,21 +27,25 @@ ::msgcat::mcset ru "OS user name" "Пользователь ОС" ::msgcat::mcset ru "Authentication method" "Способ аутентификации" ::msgcat::mcset ru "Add record" "Добавить запись" -::msgcat::mcset ru "Main server" "Основной сервер" -::msgcat::mcset ru "Main server address" "Адрес основного сервера" +::msgcat::mcset ru "Host" "Основной сервер" +::msgcat::mcset ru "Host address" "Адрес основного сервера" ::msgcat::mcset ru "Address" "Адрес сервера" ::msgcat::mcset ru "Port" "Порт" -::msgcat::mcset ru "Ports range" "Диапазон портов" +::msgcat::mcset ru "Cluster port" "Порт кластера" +::msgcat::mcset ru "Port range" "Диапазон портов" +::msgcat::mcset ru "Agent host" "Адрес сервера" +::msgcat::mcset ru "Agent port" "Порт сервера" ::msgcat::mcset ru "Protocol" "Протокол" ::msgcat::mcset ru "Working processes" "Рабочие процессы" +::msgcat::mcset ru "Processes" "Рабочие процессы" ::msgcat::mcset ru "Cluster managers" "Менеджеры кластера" -::msgcat::mcset ru "Maximum memory in working processes" "Максимальный объём памяти раб. процессов" -::msgcat::mcset ru "Safe memory consuption per call" "Безопасный расход памяти за вызов" -::msgcat::mcset ru "Memory use limit per working process" "Предел использования памяти рабочим процессом" -::msgcat::mcset ru "Maximum number of infobases per working process" "Количество ИБ на процесс" -::msgcat::mcset ru "Maximum nuber of connections per working process" "Количество соединений на процесс" -::msgcat::mcset ru "Main cluster manager port number" "Порт главного менеджера кластера" -::msgcat::mcset ru "Service manager allocation" "Менеджер под каждый сервис" +::msgcat::mcset ru "Safe working processes memory limit" "Максимальный объём памяти раб. процессов" +::msgcat::mcset ru "Safe call memory limit" "Безопасный расход памяти за вызов" +::msgcat::mcset ru "Memory limit" "Предел использования памяти рабочим процессом" +::msgcat::mcset ru "Infobases limit" "Количество ИБ на процесс" +::msgcat::mcset ru "Connections limit" "Количество соединений на процесс" +::msgcat::mcset ru "Сluster port" "Порт главного менеджера кластера" +::msgcat::mcset ru "Dedicate managers" "Менеджер под каждый сервис" ::msgcat::mcset ru "Working server use variant" "Вариант использования рабочего сервера" ::msgcat::mcset ru "Work servers" "Рабочие серверы" ::msgcat::mcset ru "Work server" "Рабочий сервер" @@ -54,15 +58,16 @@ ::msgcat::mcset ru "Create database" "Создать БД в случае её отсутствия" ::msgcat::mcset ru "Sheduled jobs deny" "Блокировка регламентных заданий" ::msgcat::mcset ru "Date offset" "Смещение дат" -::msgcat::mcset ru "Secure level" "Безопасное соединение" -::msgcat::mcset ru "Forced termination time" "Останавливать выключенные процессы через:" -::msgcat::mcset ru "Fault-tolerance level" "Уровень отказоустойчивости" +::msgcat::mcset ru "Security level" "Безопасное соединение" +::msgcat::mcset ru "Expiration timeout" "Останавливать выключенные процессы через:" +::msgcat::mcset ru "Session fault tolerance level" "Уровень отказоустойчивости" ::msgcat::mcset ru "Load balancing mode" "Режим распределения нагрузки" -::msgcat::mcset ru "Server errors threshold" "Допустимое отклонение количества ошибок сервера, %" -::msgcat::mcset ru "Restart time" "Период перезапуска, сек." -::msgcat::mcset ru "Maximum virtual address space" "Допустимый объём памяти, КБ" -::msgcat::mcset ru "Maximum period of memori size exeeding" "Интервал превышения допустимого объёма памяти, сек." -::msgcat::mcset ru "Terminate corrupted processes" "Принудительно завершать проблемные процессы" +::msgcat::mcset ru "Errors count threshold" "Допустимое отклонение количества ошибок сервера, %" +::msgcat::mcset ru "Lifetime limit" "Период перезапуска, сек." +::msgcat::mcset ru "Max memory size" "Допустимый объём памяти, КБ" +::msgcat::mcset ru "Max memory time limit" "Интервал превышения допустимого объёма памяти, сек." +::msgcat::mcset ru "Kill problem processes" "Принудительно завершать проблемные процессы" +::msgcat::mcset ru "Kill by memory with dump" "Формировать дамп процесса при превышении объема памяти" ::msgcat::mcset ru "Object type" "Объект требования" ::msgcat::mcset ru "Rule type" "Тип требования" ::msgcat::mcset ru "Application with an ajustment" "Значение доп. параметра" @@ -112,3 +117,34 @@ ::msgcat::mcset ru "Session lock mode management" "Режим блокировки сеансов" ::msgcat::mcset ru "External session management required" "Внешнее управление сеансами" ::msgcat::mcset ru "Path to RAC" "Путь до RAC" +::msgcat::mcset ru "Using" "Использование" +::msgcat::mcset ru "Critical total memory" "Макс. объём памяти процессов рабочего сервера" +::msgcat::mcset ru "Temporary allowed total memory" "Предел превышения допустимого объёма памяти процессов (сек.)" +::msgcat::mcset ru "Temporary allowed total memory time limit" "Допустимый объем памяти процессов рабочего сервера" +::msgcat::mcset ru "Server" "Сервер" +::msgcat::mcset ru "Main server" "Основной сервер" +::msgcat::mcset ru "The default variables is undefinied:" "Не установлены значения по умолчанию для следующих перменных:" +::msgcat::mcset ru "New config file will be copying from RAC GUI distributive." "Скопирoвать новый файл настроек из дистрибутива программы?" +::msgcat::mcset ru "All files from old working dir will be moved into new location:" "Все файлы из текущего рабочего каталога перенсены в:" +::msgcat::mcset ru "Command must be" "Команда должна быть" +::msgcat::mcset ru "or" "или" +::msgcat::mcset ru "You entered" "Вы ввели" +::msgcat::mcset ru "it's correct?" "это правильно?" +::msgcat::mcset ru "Manager" "Менеджер" +::msgcat::mcset ru "Descr" "Описание" +::msgcat::mcset ru "Process" "Процесс" +::msgcat::mcset ru "Is enable" "Включен" +::msgcat::mcset ru "Running" "Запущен" +::msgcat::mcset ru "Started at" "Время запуска" +::msgcat::mcset ru "Use" "Использование" +::msgcat::mcset ru "Started at" "Время запуска" +::msgcat::mcset ru "Memory size" "Размер памяти" +::msgcat::mcset ru "Connection" "Соединение" +::msgcat::mcset ru "Session" "Сессия" +::msgcat::mcset ru "Object" "Объект" +::msgcat::mcset ru "Locked" "Заблокировано" +::msgcat::mcset ru "Connected at" "Подключено в" +::msgcat::mcset ru "Session number" "Номер сессии" +::msgcat::mcset ru "About" "О программе" +::msgcat::mcset ru "Version" "Версия" +::msgcat::mcset ru "Release" "Выпуск" diff --git a/lib/theme.tcl b/lib/theme.tcl new file mode 100644 index 0000000..5671a3f --- /dev/null +++ b/lib/theme.tcl @@ -0,0 +1,40 @@ +###################################################### +# Rac GUI +# Graphical theme settings +# +# Distributed under GNU Public License +# Author: Sergey Kalinin svk@nuk-svk.ru +# Home page: https://nuk-svk.ru +# Git repos: https://bitbucket.org/svk28/rac-gui + + +###################################################### + +# set editor(fg) grey +# set editor(bg) black +# option add *Entry.Foreground $editor(fg) interactive +# option add *Entry.Background $editor(bg) interactive +# option add *Label.Foreground $editor(fg) interactive +# option add *Label.Background $editor(bg) interactive +# option add *Checkbox.Foreground $editor(fg) interactive +# option add *Checkbox.Background $editor(bg) interactive +# option add *Checkbutton.Foreground $editor(fg) interactive +# option add *Checkbutton.Background $editor(bg) interactive +# option add *Combobox.Foreground $editor(fg) interactive +# option add *Combobox.Background $editor(bg) interactive +# option add *Listbox.Foreground $editor(fg) interactive +# option add *Listbox.Background $editor(bg) interactive +# option add *TreeView.Background $editor(bg) interactive +#option add *Treeview.Foreground red interactive +# #option add *Frame.Background $editor(bg) interactive +# option add *ScrollableFrame.Background $editor(bg) interactive +# option add *ScrolledWindow.Background $editor(bg) interactive + + +if {[info exists default(theme)] == 1 && $default(theme) eq "dark"} { + set color(dark_table_bg) "#6f6f6f" + set color(light_table_bg) "#424242" +} else { + set color(dark_table_bg) "#e2e2e2" + set color(light_table_bg) "#ffffff" +} diff --git a/lib/ttk_theme_dark.tcl b/lib/ttk_theme_dark.tcl index e4c06c3..5c7d13e 100644 --- a/lib/ttk_theme_dark.tcl +++ b/lib/ttk_theme_dark.tcl @@ -91,11 +91,18 @@ namespace eval ttk::theme::dark { -background $colors(-lightframe) -itembackground {gray60 gray50} \ -itemfill #ffffff -itemaccentfill yellow \ -fieldbackground $colors(-lightframe) + + ttk::style configure Text \ + -background [list active $colors(-lighter)] \ + -foreground [list disabled $colors(-disabledfg)] + # ttk::style configure TreeCtrl \ # -background gray30 -itembackground {gray60 gray50} \ # -itemfill #ffffff -itemaccentfill yellow + option add *Toplevel.Background $colors(-dark) interactive + option add *Text.Foreground $colors(-foreground) interactive + option add *Text.Background $colors(-frame) interactive } - option add *Toplevel.Background $colors(-dark) interactive #option add *Treeview.Background red interactive # option add *Frame.Background $colors(-frame) interactive # option add *Label.Background $colors(-frame) interactive @@ -139,3 +146,5 @@ namespace eval ::tablelist:: { + + diff --git a/rac_gui.cfg b/rac_gui.cfg index d7b8982..3747832 100644 --- a/rac_gui.cfg +++ b/rac_gui.cfg @@ -10,7 +10,7 @@ # ###################################################### -set rac_cmd "/opt/1C/v8.3/x86_64/rac" +set default(rac_dir) "/opt/1C/v8.3/x86_64" set default(locale) "ru" # Порт RAS @@ -108,24 +108,25 @@ set default(load_balancing_mode) { memory } - set default(auth) { pwd os } +# максимальный объем памяти процессов рабочего сервера +set default(critical_total_memory) 0 + +# допустимый объем памяти процессов рабочего сервера +set default(temporary_allowed_total_memory) 0 + +# предел превышения (секунд) допустимого объема памяти процессов +set default(temporary_allowed_total_memory_time_limit) 300 ## Раскоментировать строки и прописать свои значения если ## для Информационных Баз используются эти параметры #set default(infobase_user) "ib_user" #set default(infobase_pwd) "ib_password" -# цвета строк в таблице -#set color(dark_table_bg) "#e2e2e2" -#set color(light_table_bg) "#ffffff" -set color(dark_table_bg) "#6f6f6f" -set color(light_table_bg) "#424242" - - - - +# Используемая тема +# доступны: dark, clam, classic, default, alt +set default(theme) dark diff --git a/rac_gui.spec b/rac_gui.spec index e9fe8de..30fde35 100644 --- a/rac_gui.spec +++ b/rac_gui.spec @@ -59,6 +59,13 @@ install -p -m644 lib/msg/*.* $RPM_BUILD_ROOT%_datadir/%name/lib/msg/ %changelog +* Wed Sep 25 2019 Sergey Kalinin 1.1.0 +- Added new rac command options +- Added HELP dialog +- Moved configuration files according to XDG standard +- Change 1c-srv.cfg format +- Fixed some errors +- Added translated method for table headers * Thu Aug 15 2019 Sergey Kalinin 1.0.3 - New server config diff --git a/rac_gui.tcl b/rac_gui.tcl index ff9b599..0a1e552 100755 --- a/rac_gui.tcl +++ b/rac_gui.tcl @@ -2,69 +2,83 @@ # Tcl ignores the next line -*- tcl -*- \ exec wish "$0" -- "$@" -package require msgcat - - ###################################################### # Rac GUI +# 1C RAC (tm) grafical user interface # Distributed under GNU Public License # Author: Sergey Kalinin svk@nuk-svk.ru -# Home page: https://bitbucket.org/svk28/rac-gui +# Home page: https://nuk-svk.ru +# Git repos: https://bitbucket.org/svk28/rac-gui # -# version: 1.0.3 +# version: 1.1.0 # release: 1 # ###################################################### + + +# определим текущую версию и релиз +set f [open $argv0 "RDONLY"] +while {[gets $f line] >=0} { + if [regexp -nocase -all -- {version: ([0-9]+?.[0-9]+?.[0-9]+?)} $line match v1] { + set racgui_version $v1 + } + if [regexp -nocase -all -- {release: ([0-9]+?)} $line match v1] { + set racgui_release $v1 + } +} +close $f + +package require msgcat + # Устанавливаем текущий каталог set dir(root) [pwd] -# Устанавливаем рабочий каталог, если его нет то создаём -set dir(work) [file join $env(HOME) .rac_gui] -if {[file exists $dir(work)] == 0 } { +set dir(doc) [file join $dir(root) doc] + +# Устанавливаем рабочий каталог, если его нет то создаём. +# Согласно спецификации XDG проверяем наличие переменных и каталогов +if [info exists env(XDG_CONFIG_HOME)] { + set dir(work) [file join $env(XDG_CONFIG_HOME) rac_gui] +} elseif [file exists [file join $env(HOME) .config]] { + set dir(work) [file join $env(HOME) .config rac_gui] +} else { + set dir(work) [file join $env(HOME) .rac_gui] +} + +if {[file exists $dir(work)] == 0} { file mkdir $dir(work) } +# Проверяем старые конфиги и при наличии переносим +if {[file exists [file join $env(HOME) .rac_gui]] ==1 && $dir(work) ne [file join $env(HOME) .rac_gui]} { + cd [file join $env(HOME) .rac_gui] + foreach f [glob -type f *] { + if {![file exists [file join $dir(work) $f]]} { + puts "File copy - [file copy $f $dir(work)]" + file rename $f [list $f old] + } + } + cd $env(HOME) + #file rename -force [file join $env(HOME) .rac_gui] [file join $env(HOME) .rac_gui.old] + file delete -force [file join $env(HOME) .rac_gui] + tk_messageBox -message "[::msgcat::mc "All files from old working dir will be moved into new location:"]\n$dir(work)" -icon info -type ok +} + + + +puts "Work dir is $dir(work)" + # каталог с модулями set dir(lib) "[file join $dir(root) lib]" # загружаем пользовательский конфиг, если он отсутствует, то копируем дефолтный if {[file exists [file join $dir(work) rac_gui.cfg]] ==0} { - file copy [file join [pwd] rac_gui.cfg] [file join $dir(work) rac_gui.cfg] + file copy [file join $dir(root) rac_gui.cfg] [file join $dir(work) rac_gui.cfg] } source [file join $dir(work) rac_gui.cfg] ::msgcat::mclocale $default(locale) ::msgcat::mcload [file join $dir(lib) msg] -# Код проверки наличия rac и правильности указания пути в конфиге -# если программа не найдена то будет выведен диалог для указанием корректного пути -# и этот путь будет записан в пользовательский конфиг -if {[file exists $rac_cmd] == 0} { - set rac_cmd "[tk_getOpenFile -initialdir $env(HOME) -parent . \ - -title [::msgcat::mc "Show where is a RAC command"] -initialfile rac]" - if {$rac_cmd eq ""} {exit} - file copy [file join $dir(work) rac_gui.cfg] [file join $dir(work) rac_gui.cfg.bak] - set orig_file [open [file join $dir(work) rac_gui.cfg.bak] "r"] - set file [open [file join $dir(work) rac_gui.cfg] "w"] - while {[gets $orig_file line] >=0 } { - if {[string match "set rac_cmd*" $line]} { - puts $file "set rac_cmd \"$rac_cmd\"" - } else { - puts $file $line - } - } - #puts $rac_cmd - close $file - close $orig_file - #return "$host:$port" - file delete [file join $dir(work) rac_gui.cfg.bak] - if {$tcl_platform(platform) == "windows"} { - tk_messageBox -message "[::msgcat::mc "Reexecute the programm"]!" \ - -icon info -type ok - exit - } -} else { - puts "Found $rac_cmd" -} set cluster_user "" set cluster_pwd "" @@ -81,36 +95,32 @@ foreach modFile [lsort [glob -nocomplain [file join $dir(lib) *.tcl]]] { source [file join $dir(lib) gui.tcl] source [file join $dir(work) rac_gui.cfg] +CheckVariablesSet + # Читаем файл со списком серверов 1С -if [file exists [file join $dir(work) 1c_srv.cfg]] { - set f [open [file join $dir(work) 1c_srv.cfg] "RDONLY"] - while {[gets $f line] >=0} { - set l [split $line ","] - set host [lindex $l 0] - if {[lindex $l 1] ne ""} { - set rac_cmd_for_host($host) [lindex $l 1] +#set serversList [dict create servers] +if [file exists [file join $dir(work) 1c_srv_new.cfg]] { + set f_new [open [file join $dir(work) 1c_srv_new.cfg] "RDONLY"] + set str "" + while {[gets $f_new line] >=0} { + append str " [string trim $line]" + } + if {$str ne ""} { + set str [string map {"\{ " "\{" " \}" "\}"} $str] + dict set servers_list servers $str + close $f_new + puts $servers_list + puts [dict get $servers_list servers] + dict for {host host_data} [dict get $servers_list servers] { + .frm_tree.tree insert {} end -id "server::$host" \ + -text [dict get $host_data name] -values "$host" + puts "$host > $host_data" + puts [dict get $host_data name] + set rac_cmd_for_host($host) [dict get $host_data rac_cmd] } - .frm_tree.tree insert {} end -id "server::$host" -text "$host" -values "$host" - } + } else { + set servers_list "" + } +} else { + set servers_list "" } - -# set editor(fg) grey -# set editor(bg) black -# option add *Entry.Foreground $editor(fg) interactive -# option add *Entry.Background $editor(bg) interactive -# option add *Label.Foreground $editor(fg) interactive -# option add *Label.Background $editor(bg) interactive -# option add *Checkbox.Foreground $editor(fg) interactive -# option add *Checkbox.Background $editor(bg) interactive -# option add *Checkbutton.Foreground $editor(fg) interactive -# option add *Checkbutton.Background $editor(bg) interactive -# option add *Combobox.Foreground $editor(fg) interactive -# option add *Combobox.Background $editor(bg) interactive -# option add *Listbox.Foreground $editor(fg) interactive -# option add *Listbox.Background $editor(bg) interactive -# option add *TreeView.Background $editor(bg) interactive -#option add *Treeview.Foreground red interactive -# #option add *Frame.Background $editor(bg) interactive -# option add *ScrollableFrame.Background $editor(bg) interactive -# option add *ScrolledWindow.Background $editor(bg) interactive -