Kulemba GUI ya 1C RAC, kapenanso za Tcl/Tk

Pamene tidasanthula mutu wa momwe zinthu za 1C zimagwirira ntchito m'malo a Linux, cholepheretsa chimodzi chidapezeka - kusowa kwa chida chothandizira chamitundu ingapo chowongolera gulu la maseva a 1C. Ndipo zidaganiziridwa kuti zithetse vutoli polemba GUI ya rac console utility. Tcl/tk inasankhidwa ngati chinenero chachitukuko monga, mwa lingaliro langa, choyenera kwambiri pa ntchitoyi. Chifukwa chake, ndikufuna kuwonetsa mbali zina zosangalatsa za yankho munkhaniyi.

Kuti mugwire ntchito mudzafunika magawo a tcl/tk ndi 1C. Ndipo popeza ndinaganiza zogwiritsa ntchito mphamvu zoyambira tcl / tk popanda kugwiritsa ntchito phukusi lachitatu, ndifunika mtundu wa 8.6.7, womwe umaphatikizapo ttk - phukusi lokhala ndi zowonjezera zowonjezera, zomwe timafunikira kwambiri ttk. ::TreeView, imalola deta yowonetsera zonse mu mawonekedwe a mtengo komanso mawonekedwe a tebulo (mndandanda). Komanso, mu mtundu watsopano, ntchito yopatulapo idasinthidwanso (yoyesa lamulo, yomwe imagwiritsidwa ntchito pulojekiti poyendetsa malamulo akunja).

Pulojekitiyi ili ndi mafayilo angapo (ngakhale palibe chomwe chimakulepheretsani kuchita chilichonse chimodzi):

rac_gui.cfg - config config
rac_gui.tcl - main launch script
Lib directory ili ndi mafayilo omwe amangoyikidwa poyambira:
function.tcl - fayilo yokhala ndi njira
gui.tcl - mawonekedwe apamwamba kwambiri
images.tcl - base64 image library

Fayilo ya rac_gui.tcl, kwenikweni, imayamba wotanthauzira, imayambitsa zosinthika, zonyamula ma modules, configs, ndi zina zotero. Zomwe zili mufayilo ndi ndemanga:

rac_gui.tcl

#!/bin/sh
exec wish "$0" -- "$@"

# Устанавливаем текущий каталог
set dir(root) [pwd]
# Устанавливаем рабочий каталог, если его нет то создаём
set dir(work) [file join $env(HOME) .rac_gui]
if {[file exists $dir(work)] == 0 } {
    file mkdir $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]
} 
source [file join $dir(work) rac_gui.cfg]
# Код проверки наличия rac и правильности указания пути в конфиге
# если программа не найдена то будет выведен диалог для указания корректного пути
# и этот путь будет записан в пользовательский конфиг
if {[file exists $rac_cmd] == 0} {
    set rac_cmd [tk_getOpenFile -initialdir $env(HOME) -parent . -title "Укажите путь до rac" -initialfile rac]
    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
        }
    }
    close $file
    close $orig_file
    #return "$host:$port"
    file delete [file join $dir(work) 1c_srv.cfg.bak] 
} else {
    puts "Found $rac_cmd"
}

set cluster_user ""
set cluster_pwd ""
set agent_user ""
set agent_pwd ""
## LOAD FILE ##
# Загружаем модули кроме gui.tcl так как его надо загрузить последним
foreach modFile [lsort [glob -nocomplain [file join $dir(lib) *.tcl]]] {
    if {[file tail $modFile] ne "gui.tcl"} {
        source $modFile
        puts "Loaded module $modFile"
    }
}
source [file join $dir(lib) gui.tcl]
source [file join $dir(work) rac_gui.cfg]

# Читаем файл со списком серверов 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} {
        .frm_tree.tree insert {} end -id "server::$line" -text "$line" -values "$line"
    }    
}

Mukatsitsa zonse zomwe zikufunika ndikuwunika kupezeka kwa rac utility, zenera lojambula lidzatsegulidwa. Mawonekedwe a pulogalamuyi ali ndi zinthu zitatu:

Toolbar, mtengo ndi mndandanda

Ndinapanga zomwe zili mu "mtengo" zofanana momwe ndingathere ndi zida zokhazikika za Windows kuchokera ku 1C.

Kulemba GUI ya 1C RAC, kapenanso za Tcl/Tk

Khodi yayikulu yomwe imapanga zenera ili ili mufayilo
lib/gui.tcl

# установка размера и положения основного окна
# можно установить в переменную topLevelGeometry в конфиг программы
if {[info exists topLevelGeometry]} {
    wm geometry . $topLevelGeometry
} else {
    wm geometry . 1024x768
}
# Заголовок окна
wm title . "1C Rac GUI"
wm iconname . "1C Rac Gui"
# иконка окна (берется из файла lib/imges.tcl)
wm iconphoto . tcl
wm protocol . WM_DELETE_WINDOW Quit
wm overrideredirect . 0
wm positionfrom . user

ttk::style theme use clam

# Панель инсрументов
set frm_tool [frame .frm_tool]
pack $frm_tool -side left -fill y 
ttk::panedwindow .panel -orient horizontal -style TPanedwindow
pack .panel -expand true -fill both
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_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_quit  -side bottom -padx 5 -pady 5

# Дерево с полосами прокрутки
set frm_tree [frame .frm_tree]

ttk::scrollbar $frm_tree.hsb1 -orient horizontal -command [list $frm_tree.tree xview]
ttk::scrollbar $frm_tree.vsb1 -orient vertical -command [list $frm_tree.tree yview]
set tree [ttk::treeview $frm_tree.tree -show tree 
-xscrollcommand [list $frm_tree.hsb1 set] -yscrollcommand [list $frm_tree.vsb1 set]]

grid $tree -row 0 -column 0 -sticky nsew
grid $frm_tree.vsb1 -row 0 -column 1 -sticky nsew
grid $frm_tree.hsb1 -row 1 -column 0 -sticky nsew
grid columnconfigure $frm_tree 0 -weight 1
grid rowconfigure $frm_tree 0 -weight 1

# назначение обработчика нажатия кнопкой мыши
bind $frm_tree.tree <ButtonRelease> "TreePress $frm_tree.tree"

# Список для данных (таблица)
set frm_work [frame .frm_work]
ttk::scrollbar $frm_work.hsb -orient horizontal -command [list $frm_work.tree_work xview]
ttk::scrollbar $frm_work.vsb -orient vertical -command [list $frm_work.tree_work yview]
set tree_work [
    ttk::treeview $frm_work.tree_work 
    -show headings  -columns "par val" -displaycolumns "par val"
    -xscrollcommand [list $frm_work.hsb set] 
    -yscrollcommand [list $frm_work.vsb set]
]
# Установка цветов для чередования в таблице
$tree_work tag configure dark -background $color(dark_table_bg)
$tree_work tag configure light -background $color(light_table_bg)

# Размещение элементов на форме
grid $tree_work -row 0 -column 0 -sticky nsew
grid $frm_work.vsb -row 0 -column 1 -sticky nsew
grid $frm_work.hsb -row 1 -column 0 -sticky nsew
grid columnconfigure $frm_work 0 -weight 1
grid rowconfigure $frm_work 0 -weight 1
pack $frm_tree $frm_work -side left -expand true -fill both

#.panel add $frm_tool -weight 1
.panel add $frm_tree -weight 1 
.panel add $frm_work -weight 1

Algorithm yogwira ntchito ndi pulogalamuyi ndi motere:

1. Choyamba, muyenera kuwonjezera seva yaikulu yamagulu (ie, seva yoyang'anira masango (mu Linux, kasamalidwe kameneka kamakhazikitsidwa ndi lamulo "/opt/1C/v8.3/x86_64/ras cluster -daemon").

Kuti muchite izi, dinani batani "+" ndipo pazenera lomwe limatsegulidwa, lowetsani adilesi ya seva ndi doko:

Kulemba GUI ya 1C RAC, kapenanso za Tcl/Tk

Pambuyo pake, seva yathu idzawonekera mumtengo podina, mndandanda wamagulu udzatsegulidwa kapena cholakwika cholumikizira chidzawonetsedwa.

2. Kudina pa dzina la tsango kudzatsegula mndandanda wazinthu zomwe zilipo.

3.…

Ndi zina zotero, i.e. kuti muwonjezere tsango latsopano, sankhani iliyonse yomwe ikupezeka pamndandanda ndikusindikiza batani la "+" pazida ndipo mawu owonjezera atsopano adzawonetsedwa:

Kulemba GUI ya 1C RAC, kapenanso za Tcl/Tk

Mabatani omwe ali mumndandanda wazida amagwira ntchito kutengera nkhani, i.e. Kutengera ndi gawo la mtengo kapena mndandanda womwe wasankhidwa, njira imodzi kapena ina idzachitidwa.

Tiyeni tiwone chitsanzo cha batani lowonjezera ("+"):

batani kupanga kodi:

ttk::button $frm_tool.btn_add  -command Add  -image add_grey_32

Apa tikuwona kuti batani likakanikiza, ndondomeko ya "Add" idzachitidwa, code yake:

proc Add {} {
    global active_cluster host
    # Определяем идентификатор выделенного элемента
    set id  [.frm_tree.tree selection] 
    # Определяем значение этого элемента
    set values [.frm_tree.tree item [.frm_tree.tree selection] -values]
    set key [lindex [split $id "::"] 0]
    # в зависимости от того что выделили будет запущена нужная процедура
    if {$key eq "" || $key eq "server"} {
        set host [ Add::server ]
        return
    }
    Add::$key .frm_tree.tree $host $values
}

Uwu ndi umodzi mwamaubwino a tickle: mutha kupatsa mtengo wosinthika ngati dzina la ndondomeko:

Add::$key .frm_tree.tree $host $values

Ndiko kuti, mwachitsanzo, ngati tiloza pa seva yayikulu ndikusindikiza "+", ndiye kuti Onjezani::njira ya seva idzayambika, ngati pagulu - Onjezani::gulu ndi zina zotero (ndilemba za komwe "makiyi" ofunikira amachokera pansi pang'ono), ndondomeko zomwe zatchulidwazi zimajambula zithunzi zogwirizana ndi nkhaniyo.

Monga momwe mwawonera kale, mafomuwa ali ofanana ndi kalembedwe - izi sizosadabwitsa, chifukwa amawonetsedwa ndi njira imodzi, makamaka mawonekedwe akuluakulu a mawonekedwe (zenera, mabatani, chithunzi, chizindikiro), dzina la ndondomekoyi. AddTopLevel

proc AddToplevel {lbl img {win_name .add}} {
    set cmd "destroy $win_name"
    if [winfo exists $win_name] {destroy $win_name}
    toplevel $win_name
    wm title $win_name $lbl
    wm iconphoto $win_name tcl
    # метка с иконкой
    ttk::label $win_name.lbl -image $img
    # фрейм с полями ввода
    set frm [ttk::labelframe $win_name.frm -text $lbl -labelanchor nw]
    
    grid columnconfigure $frm 0 -weight 1
    grid rowconfigure $frm 0 -weight 1
    # фрейм и кнопки
    set frm_btn [frame $win_name.frm_btn -border 0]
    ttk::button $frm_btn.btn_ok -image ok_grey_24 -command { }
    ttk::button $frm_btn.btn_cancel -command $cmd -image quit_grey_24 
    grid $win_name.lbl -row 0 -column 0 -sticky nw -padx 5 -pady 10
    grid $frm -row 0 -column 1 -sticky nw -padx 5 -pady 5
    grid $frm_btn -row 1 -column 1 -sticky se -padx 5 -pady 5
    pack  $frm_btn.btn_cancel  -side right
    pack  $frm_btn.btn_ok  -side right -padx 10
    return $frm
}

Zikhazikiko zoyimbira: mutu, dzina lachifaniziro lachifaniziro cha laibulale (lib/images.tcl) ndi dzina lazenera losasankha (losasinthika .add). Chifukwa chake, ngati titenga zitsanzo pamwambapa powonjezera seva yayikulu ndi gulu, kuyimba kudzakhala moyenerera:

AddToplevel "Добавление основного сервера" server_grey_64

kapena

AddToplevel "Добавление кластера" cluster_grey_64

Chabwino, kupitiliza ndi zitsanzo izi, ndikuwonetsa njira zomwe zikuwonetsa ma dialog a seva kapena gulu.

Onjezani:: seva

proc Add::server {} {
    global default
    # выводим основную форму
    set frm [AddToplevel "Добавление основного сервера" server_grey_64]
    # добавляем етки и поля ввода на эту форму
    label $frm.lbl_host -text "Адрес сервера"
    entry  $frm.ent_host
    label $frm.lbl_port -text "Порт"
    entry $frm.ent_port 
    $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 nsew -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 nsew -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]
    # переопределяем обработчик нажатия кнопки
    .add.frm_btn.btn_ok configure -command {
        set host [SaveMainServer [.add.frm.ent_host get] [.add.frm.ent_port get]]
        .frm_tree.tree insert {} end -id "server::$host" -text "$host" -values "$host"
        destroy .add
        return $host
    }
    return $frm
}

Onjezani::gulu

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 
    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"
    } else {
        set auth_agent ""
    }
    # устанавливаем глобальные переменные ()
    set lifetime_limit $default(lifetime_limit)
    set expiration_timeout $default(expiration_timeout)
    set session_fault_tolerance_level $default(session_fault_tolerance_level)
    set max_memory_size $default(max_memory_size)
    set max_memory_time_limit $default(max_memory_time_limit)
    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 frm [AddToplevel "Добавление кластера" cluster_grey_64]
    
    label $frm.lbl_host -text "Адрес основного сервера"
    entry  $frm.ent_host
    label $frm.lbl_port -text "Порт"
    entry $frm.ent_port 
    $frm.ent_port  insert end $default(port)
    label $frm.lbl_name -text "Название кластера"
    entry  $frm.ent_name
    label $frm.lbl_secure_connect -text "Защищённое соединение"
    ttk::combobox $frm.cb_security_level -textvariable security_level -values $default(security_level)
    label $frm.lbl_expiration_timeout -text "Останавливать выключенные процессы через:"
    entry  $frm.ent_expiration_timeout -textvariable expiration_timeout
    label $frm.lbl_session_fault_tolerance_level -text "Уровень отказоустойчивости"
    entry  $frm.ent_session_fault_tolerance_level -textvariable session_fault_tolerance_level
    label $frm.lbl_load_balancing_mode -text "Режим распределения нагрузки"
    ttk::combobox $frm.cb_load_balancing_mode -textvariable load_balancing_mode 
    -values $default(load_balancing_mode)
    label $frm.lbl_errors_count_threshold -text "Допустимое отклонение количества ошибок сервера, %"
    entry  $frm.ent_errors_count_threshold -textvariable errors_count_threshold
    label $frm.lbl_processes -text "Рабочие процессы:"
    label $frm.lbl_lifetime_limit -text "Период перезапуска, сек."
    entry  $frm.ent_lifetime_limit -textvariable lifetime_limit
    label $frm.lbl_max_memory_size -text "Допустимый объём памяти, КБ"
    entry  $frm.ent_max_memory_size -textvariable max_memory_size
    label $frm.lbl_max_memory_time_limit -text "Интервал превышения допустимого объёма памяти, сек."
    entry  $frm.ent_max_memory_time_limit -textvariable max_memory_time_limit
    label $frm.lbl_kill_problem_processes -justify left -anchor nw -text "Принудительно завершать проблемные процессы"
    checkbutton $frm.check_kill_problem_processes -variable kill_problem_processes -onvalue yes -offvalue no    
    
    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
    grid $frm.lbl_port -row 1 -column 0 -sticky nw -padx 5 -pady 5
    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.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
    grid $frm.lbl_session_fault_tolerance_level -row 5 -column 0 -sticky nw -padx 5 -pady 5
    grid $frm.ent_session_fault_tolerance_level -row 5 -column 1 -sticky nsew -padx 5 -pady 5
    grid $frm.lbl_load_balancing_mode -row 6 -column 0 -sticky nw -padx 5 -pady 5
    grid $frm.cb_load_balancing_mode -row 6 -column 1 -sticky nsew -padx 5 -pady 5
    grid $frm.lbl_errors_count_threshold -row 7 -column 0 -sticky nw -padx 5 -pady 5
    grid $frm.ent_errors_count_threshold -row 7 -column 1 -sticky nsew -padx 5 -pady 5
    grid $frm.lbl_processes -row 8 -column 0 -sticky nw -padx 5 -pady 5
    grid $frm.lbl_lifetime_limit -row 9 -column 0 -sticky nw -padx 5 -pady 5
    grid $frm.ent_lifetime_limit -row 9 -column 1 -sticky nsew -padx 5 -pady 5
    grid $frm.lbl_max_memory_size -row 10 -column 0 -sticky nw -padx 5 -pady 5
    grid $frm.ent_max_memory_size -row 10 -column 1 -sticky nsew -padx 5 -pady 5
    grid $frm.lbl_max_memory_time_limit -row 11 -column 0 -sticky nw -padx 5 -pady 5
    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
    # переопределяем обработчик
    .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] 
        --expiration-timeout=$expiration_timeout 
        --lifetime-limit=$lifetime_limit 
        --max-memory-size=$max_memory_size 
        --max-memory-time-limit=$max_memory_time_limit 
        --security-level=$security_level 
        --session-fault-tolerance-level=$session_fault_tolerance_level 
        --load-balancing-mode=$load_balancing_mode 
        --errors-count-threshold=$errors_count_threshold 
        --kill-problem-processes=$kill_problem_processes 
        $auth_agent $host"
        Run::server $tree $host ""
        destroy .add
    }
    return $frm
}

Poyerekeza ndondomeko ya njirazi, kusiyana kumawoneka ndi maso; Ndimayang'ana pa batani la "Ok". Mu Tk, mawonekedwe azithunzi amatha kuchotsedwa pakupanga pulogalamu pogwiritsa ntchito njirayo sungani. Mwachitsanzo, lamulo loyamba losonyeza batani:

ttk::button $frm_btn.btn_ok -image ok_grey_24 -command { }

Koma m'mawonekedwe athu, lamulo limadalira magwiridwe antchito:

  .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] 
        --expiration-timeout=$expiration_timeout 
        --lifetime-limit=$lifetime_limit 
        --max-memory-size=$max_memory_size 
        --max-memory-time-limit=$max_memory_time_limit 
        --security-level=$security_level 
        --session-fault-tolerance-level=$session_fault_tolerance_level 
        --load-balancing-mode=$load_balancing_mode 
        --errors-count-threshold=$errors_count_threshold 
        --kill-problem-processes=$kill_problem_processes 
        $auth_agent $host"
        Run::server $tree $host ""
        destroy .add
    }

Mu chitsanzo pamwambapa, batani "lotsekedwa" limayamba njira yowonjezera gulu.

Apa ndikofunikira kuti tisiye kugwira ntchito ndi zithunzi mu Tk - pazinthu zosiyanasiyana zolowetsa deta (zolowera, bokosi la combobox, batani loyang'ana, ndi zina zambiri) parameter idayambitsidwa ngati kusintha kwamawu:

entry  $frm.ent_lifetime_limit -textvariable lifetime_limit

Kusintha kumeneku kumatanthauzidwa mu malo a mayina padziko lonse lapansi ndipo kuli ndi mtengo womwe walowetsedwa panopa. Iwo. kuti mupeze zolemba zomwe zalowetsedwa kuchokera kumunda, muyenera kungowerenga mtengo womwe umagwirizana ndi zosinthika (zowona, pokhapokha zitafotokozedwa popanga chinthucho).

Njira yachiwiri yopezeranso zolemba zomwe zalowetsedwa (zazinthu zamtundu wolowera) ndikugwiritsa ntchito get command:

.add.frm.ent_name get

Njira zonsezi zitha kuwoneka mu code pamwambapa.

Kudina batani ili, pamenepa, imayambitsa njira ya RunCommand ndi mzere wolamula wopangidwa kuti muwonjezere gulu malinga ndi rac:

/opt/1C/v8.3/x86_64/rac cluster insert  --host=localhost  --port=1540  --name=dsdsds  --expiration-timeout=0  --lifetime-limit=0  --max-memory-size=0  --max-memory-time-limit=0  --security-level=0  --session-fault-tolerance-level=0  --load-balancing-mode=performance  --errors-count-threshold=0  --kill-problem-processes=no   localhost:1545

Tsopano tabwera ku lamulo lalikulu, lomwe limayendetsa kukhazikitsidwa kwa rac ndi magawo omwe timafunikira, komanso kugawa zotuluka za malamulo kukhala mndandanda ndi zobwerera, ngati pakufunika:

RunCommand

proc RunCommand {root par} {
    global dir rac_cmd cluster work_list_row_count agent_user agent_pwd cluster_user cluster_pwd
    puts "$rac_cmd $par"
    set work_list_row_count 0
    # открываем канал в неблокирующем режиме
    # $rac - команда с полным путём
    # $par - сформированные ключи запуска и опции    
    set pipe [open "|$rac_cmd $par" "r"]
    try {
        set lst ""
        set l ""
        # вывод команды добавляем в список списков
        while {[gets $pipe line]>=0} {
            #puts $line
            if {$line eq ""} {
                lappend l $lst
                set lst ""
            } else {
                lappend lst [string trim $line]
            }
        }
        close $pipe
        return $l
    } on error {result options} {
        # Запуск обработчика ошибок
        ErrorParcing $result $options
        return ""
    }
}

Pambuyo polowetsa deta yaikulu ya seva, idzawonjezedwa pamtengo, chifukwa cha izi, mu Onjezani: ndondomeko ya seva, ndondomeko yotsatirayi ili ndi udindo:

.frm_tree.tree insert {} end -id "server::$host" -text "$host" -values "$host"

Tsopano, mwa kuwonekera pa dzina la seva mumtengo, timapeza mndandanda wamagulu omwe amayendetsedwa ndi sevayo, ndipo mwa kuwonekera pamagulu, timapeza mndandanda wazinthu zamagulu (maseva, infobases, etc.). Izi zimakhazikitsidwa munjira ya TreePress (fayilo lib/function.tcl):

proc TreePress {tree} {
   global host server active_cluster infobase
   # определяем выделенный элемент
    set id  [$tree selection]
   # устанавливаем нужные глобальные переменные
    SetGlobalVarFromTreeItems $tree $id
   # Определяем ключ и значение, т.е. именно тип выбранного элемента
    set values [$tree item $id -values]
    set key [lindex [split $id "::"] 0]
   # и в зависимости от того что выбрали будет запущена соответствующая процедура 
   # в пространстве имён Run
    Run::$key $tree $host $values
}

Chifukwa chake, Thamanga :: seva idzakhazikitsidwa pa seva yayikulu (kwa gulu - Thamanga :: gulu, pa seva yogwira ntchito - Run ::work_server, etc.). Iwo. mtengo wa $ key variable ndi gawo la dzina la mtengo womwe umatchulidwa ndi chisankho -id.

Tiyeni titchere khutu ku ndondomekoyi

Kuthamanga:: seva

proc Run::server {tree host values} {
    # получаем список кластеров требуемого сервера
    set lst [RunCommand server::$host "cluster list $host"]
    if {$lst eq ""} {return}
    set l [lindex $lst 0]
    #puts $lst
    # удаляем лишнее из списка
    .frm_work.tree_work delete  [ .frm_work.tree_work children {}]
    # читаем список
    foreach cluster_list $lst {
        # Заполняем список полученными значениями
        InsertItemsWorkList $cluster_list
        # обрабатываем вывод (список) для добавления данных в дерево
        foreach i $cluster_list {
            #puts $i
            set cluster_list [split $i ":"]
            if  {[string trim [lindex $cluster_list 0]] eq "cluster"} {
                set cluster_id [string trim [lindex $cluster_list 1]]
                lappend cluster($cluster_id) $cluster_id
            }
            if  {[string trim [lindex $cluster_list 0]] eq "name"} {
                lappend  cluster($cluster_id) [string trim [lindex $cluster_list 1]]
            }
        }
    }
    # добавляем кластеры в дерево
    foreach x [array names cluster] {
        set id [lindex $cluster($x) 0]
        if { [$tree exists "cluster::$id"] == 0 } {
            $tree insert "server::$host" end -id "cluster::$id" -text "[lindex $cluster($x) 1]" -values "$id"
            # добавляем элементы в кластер
            InsertClusterItems $tree $id
        }
    }
    if { [$tree exists "agent_admins::$id"] == 0 } {
        $tree insert "server::$host" end -id "agent_admins::$id" -text "Администраторы" -values "$id"
        #InsertClusterItems $tree $id
    }
}

Njirayi imagwira ntchito zomwe zidalandiridwa kuchokera ku seva kudzera mu lamulo la RunCommand ndikuwonjezera zinthu zamtundu uliwonse pamtengo - masango, mizu yosiyanasiyana (zoyambira, maseva ogwira ntchito, magawo, ndi zina zotero). Mukayang'anitsitsa, muwona kuyimba kwa InsertItemsWorkList mkati. Amagwiritsidwa ntchito powonjezera zinthu pamndandanda wazithunzi pokonza zotuluka za rac console utility, yomwe idabwezedwa m'mbuyomu ngati mndandanda kumitundu ya $lst. Uwu ndi mndandanda wa mndandanda womwe uli ndi magawo awiriawiri olekanitsidwa ndi colon.

Mwachitsanzo, mndandanda wamalumikizidwe amagulu:

svk@svk ~]$ /opt/1C/v8.3/x86_64/rac connection list --cluster=783d2170-56c3-11e8-c586-fc75165efbb2 localhost:1545
connection     : dcf5991c-7d24-11e8-1690-fc75165efbb2
conn-id        : 0
host           : svk.home
process        : 79de2e16-56c3-11e8-c586-fc75165efbb2
infobase       : 00000000-0000-0000-0000-000000000000
application    : "JobScheduler"
connected-at   : 2018-07-01T14:49:51
session-number : 0
blocked-by-ls  : 0

connection     : b993293a-7d24-11e8-1690-fc75165efbb2
conn-id        : 0
host           : svk.home
process        : 79de2e16-56c3-11e8-c586-fc75165efbb2
infobase       : 00000000-0000-0000-0000-000000000000
application    : "JobScheduler"
connected-at   : 2018-07-01T14:48:52
session-number : 0
blocked-by-ls  : 0

Mu mawonekedwe azithunzi zidzawoneka motere:

Kulemba GUI ya 1C RAC, kapenanso za Tcl/Tk

Njira yomwe ili pamwambapa imasankha mayina azinthu zamutu ndi deta kuti mudzaze tebulo:

InsertItemsWorkList

proc InsertItemsWorkList {lst} {
    global work_list_row_count
    # установка чередования цвета для строки
    if [expr $work_list_row_count % 2] {
        set tag dark
    } else {
        set tag light
    }
    # разбор строк на пары ключ - значение
    foreach i $lst {
        if [regexp -nocase -all -- {(D+)(s*?|)(:)(s*?|)(.*)} $i match param v2 v3 v4 value] {
            lappend column_list [string trim $param]
            lappend value_list [string trim $value]
        }
    }
     # заполнение таблицы
    .frm_work.tree_work configure -columns $column_list -displaycolumns $column_list
    .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
    }
    incr work_list_row_count
}

Apa, m'malo mwa lamulo losavuta [split $str ":"], lomwe limagawa chingwecho kukhala zinthu zolekanitsidwa ndi ":" ndikubweza mndandanda, mawu okhazikika amagwiritsidwa ntchito, popeza zinthu zina zimakhalanso ndi colon.

Njira ya InsertClusterItems (imodzi mwazofanana zingapo) imangowonjezera mndandanda wazinthu zamwana zomwe zili ndi zozindikiritsa zofananira pamtengo wamagulu ofunikira.
InsertClusterItems

proc InsertClusterItems {tree id} {
    set parent "cluster::$id"
    $tree insert $parent end -id "infobases::$id" -text "Информационные базы" -values "$id"
    $tree insert $parent end -id "servers::$id" -text "Рабочие серверы" -values "$id"
    $tree insert $parent end -id "admins::$id" -text "Администраторы" -values "$id"
    $tree insert $parent end -id "managers::$id" -text "Менеджеры кластера" -values $id
    $tree insert $parent end -id "processes::$id" -text "Рабочие процессы" -values "workprocess-all"
    $tree insert $parent end -id "sessions::$id" -text "Сеансы" -values "sessions-all"
    $tree insert $parent end -id "locks::$id" -text "Блокировки" -values "blocks-all"
    $tree insert $parent end -id "connections::$id" -text "Соединения" -values "connections-all"
    $tree insert $parent end -id "profiles::$id" -text "Профили безопасности" -values $id
}

Mutha kuganiziranso zosankha zina ziwiri zogwiritsira ntchito njira yofananira, pomwe zidzawonekera bwino momwe mungakulitsire ndikuchotsa malamulo obwerezabwereza:

Mwanjira iyi, kuwonjezera ndi kuyang'ana kumathetsedwa molunjika:

InsertBaseItems

proc InsertBaseItems {tree id} {
    set parent "infobase::$id"
    if { [$tree exists "sessions::$id"] == 0 } {
        $tree insert $parent end -id "sessions::$id" -text "Сеансы" -values "$id"
    }
    if { [$tree exists "locks::$id"] == 0 } {
        $tree insert $parent end -id "locks::$id" -text "Блокировки" -values "$id"
    }
    if { [$tree exists "connections::$id"] == 0 } {
        $tree insert $parent end -id "connections::$id" -text "Соединения" -values "$id"
    }
}

Nayi njira yolondola kwambiri:

InsertProfileItems

proc InsertProfileItems {tree id} {
    set parent "profile::$id"
    set lst {
        {dir "Виртуальные каталоги"}
        {com "Разрешённые COM-классы"}
        {addin "Внешние компоненты"}
        {module "Внешние отчёты и обработки"}
        {app "Разрешённые приложения"}
        {inet "Ресурсы интернет"}
    }
    foreach i $lst {
        append item [lindex $i 0] "::$id"
        if { [$tree exists $item] == 0 } {
            $tree insert $parent end -id $item -text [lindex $i 1] -values "$id"
        }
        unset item 
    }
}

Kusiyana pakati pawo ndiko kugwiritsa ntchito lupu, momwe malamulo obwerezabwereza amachitidwa. Njira yoti mugwiritse ntchito ndiyomwe woyambitsa.

Takambirana za kuwonjezera zinthu ndi kubweza deta, tsopano ndi nthawi yoti tiganizire zakusintha. Popeza, makamaka, magawo omwewo amagwiritsidwa ntchito pokonza ndi kuwonjezera (kupatulapo maziko a chidziwitso), mafomu a dialog omwewo amagwiritsidwa ntchito. Algorithm yakuyitanitsa njira zowonjezera zikuwoneka motere:

Onjezani::$key->AddToplevel

Ndipo kusintha monga chonchi:

Sinthani::$kiyi->Onjezani::$kiyi->AddTopLevel

Mwachitsanzo, tiyeni titenge kusintha gulu, i.e. Mukadina pa dzina la gulu lomwe lili mumtengo, dinani batani losintha mu bar yazida (pensulo) ndipo mawonekedwe ofananira nawo awonetsedwa pazenera:

Kulemba GUI ya 1C RAC, kapenanso za Tcl/Tk
Sinthani::gulu

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 load_balancing_mode kill_problem_processes active_cluster 
    agent_user agent_pwd cluster_user cluster_pwd auth
    if {$cluster_user ne "" && $cluster_pwd ne ""} {
        set auth "--cluster-user=$cluster_user --cluster-pwd=$cluster_pwd"
    } else {
        set auth ""
    }
    # рисуем форму для кластера
    set frm [Add::cluster $tree $host $values]
    # меняем текст на метке
    $frm configure -text "Редактирование кластера"
    
    set active_cluster $values
    # получаем данные по выделенному кластеру
    set lst [RunCommand cluster::$values "cluster info --cluster=$active_cluster $host"]
    # заполняем поля
    FormFieldsDataInsert $frm $lst
    # выключаем поля, редактирование которых запрещено
    $frm.ent_host configure -state disable
    $frm.ent_port configure -state disable
    # переназначаем обработчик
    .add.frm_btn.btn_ok configure -command {
        RunCommand "" "cluster update 
        --cluster=$active_cluster $auth 
        --name=[.add.frm.ent_name get] 
        --expiration-timeout=$expiration_timeout 
        --lifetime-limit=$lifetime_limit 
        --max-memory-size=$max_memory_size 
        --max-memory-time-limit=$max_memory_time_limit 
        --security-level=$security_level 
        --session-fault-tolerance-level=$session_fault_tolerance_level 
        --load-balancing-mode=$load_balancing_mode 
        --errors-count-threshold=$errors_count_threshold 
        --kill-problem-processes=$kill_problem_processes 
        $auth $host"
        $tree delete "cluster::$active_cluster"
        Run::server $tree $host ""
        destroy .add
    }
}

Kutengera ndemanga zomwe zili mu code, kwenikweni, zonse zimveka bwino, kupatula kuti kachidindo kabatani kamene kamakhala kopitilira muyeso ndipo pali njira ya FormFieldsDataInsert yomwe imadzaza minda ndi data ndikuyambitsa zosinthazo:

FormFieldsDataInsert

proc FormFieldsDataInsert {frm lst} {
    foreach i [lindex $lst 0] {
        # получаем список параметров и значений
        if [regexp -nocase -all -- {(D+)(s*?|)(:)(s*?|)(.*)} $i match param v2 v3 v4 value] {
            # меняем символы
            regsub -all -- "-" [string trim $param] "_" entry_name
            # заполняем данными
            if [winfo exists $frm.ent_$entry_name] {
                $frm.ent_$entry_name delete 0 end
                $frm.ent_$entry_name insert end [string trim $value """]
            }
            if [winfo exists $frm.cb_$entry_name] {
                global $entry_name
                set $entry_name [string trim $value """]
            }
            # для чекбоксов меняем значения
            if [winfo exists $frm.check_$entry_name] {
                global $entry_name
                if {$value eq "0"} {
                    set $entry_name no
                } elseif {$value eq "1"} {
                    set $entry_name yes
                } else {
                    set $entry_name $value
                }
            }
        }
    }
}

Mwanjira iyi, mwayi wina wa tcl udawonekera - zikhalidwe zamitundu ina zimasinthidwa kukhala mayina osinthika. Iwo. kuti muzitha kudzaza mafomu ndikuyambitsa zosinthika, mayina a minda ndi zosintha zimafanana ndi masinthidwe a mzere wamalamulo a rac utility ndi mayina a magawo otulutsa malamulo kupatulapo - mukadatsika umasinthidwa ndi underscore. Mwachitsanzo ndandanda-ntchito-kukana zimagwirizana ndi munda ent_scheduled_jobs_deny ndi kusintha ndandanda_ntchito_kukana.

Mafomu owonjezera ndi kusintha angasiyane mu kapangidwe ka minda, mwachitsanzo, kugwira ntchito ndi chidziwitso:

Kuwonjezera chitetezo chidziwitso

Kulemba GUI ya 1C RAC, kapenanso za Tcl/Tk

Kusintha chitetezo chidziwitso

Kulemba GUI ya 1C RAC, kapenanso za Tcl/Tk

M'njira yosinthira Sinthani ::infobase, magawo ofunikira amawonjezedwa ku fomu; nambalayi ndi yayikulu, chifukwa chake sindikuwonetsa pano.

Mwa fanizo, njira zowonjezera, kusintha, kuchotsa zimayendetsedwa pazinthu zina.

Popeza ntchito yogwiritsira ntchito imatanthawuza kuchuluka kwa ma seva, masango, maziko azidziwitso, ndi zina zotero, kuti mudziwe kuti ndi gulu liti lomwe ndi seva kapena chitetezo chazidziwitso, mitundu ingapo yapadziko lonse lapansi idayambitsidwa, zomwe zikhalidwe zake zimayikidwa. nthawi inu alemba pa zinthu za mtengo. Iwo. ndondomekoyi imayenda mobwerezabwereza muzinthu zonse za makolo ndikuyika zosinthika:

SetGlobalVarFromTreeItems

proc SetGlobalVarFromTreeItems {tree id} {
    global host server active_cluster infobase
    set parent [$tree parent $id]
    set values [$tree item $id -values]
    set key [lindex [split $id "::"] 0]
    switch -- $key {
        server {set host $values}
        work_server {set server $values}
        cluster {set active_cluster $values}
        infobase {set infobase $values}
    }
    if {$parent eq ""} {
        return
    } else {
        SetGlobalVarFromTreeItems $tree $parent
    }
}

Gulu la 1C limakupatsani mwayi wogwira ntchito kapena popanda chilolezo. Pali mitundu iwiri ya oyang'anira - cluster agent administrator ndi cluster administrator. Chifukwa chake, kuti agwire bwino ntchito, zosintha zina 4 zapadziko lonse lapansi zidayambitsidwa zomwe zili ndi dzina lolowera ndi mawu achinsinsi. Iwo. ngati pali akaunti ya woyang'anira m'gululi, kukambirana kudzawonetsedwa kuti mulowetse malowedwe anu ndi mawu achinsinsi, deta idzasungidwa kukumbukira ndikuyika mu lamulo lirilonse la gulu logwirizana.

Uwu ndi udindo wa njira yoyendetsera zolakwika.

ErrorParcing

proc ErrorParcing {err opt} {
    global cluster_user cluster_pwd agent_user agent_pwd
        switch -regexp -- $err {
        "Cluster administrator is not authenticated" {
            AuthorisationDialog "Администратор кластера"
            .auth_win.frm_btn.btn_ok configure -command {
                set cluster_user [.auth_win.frm.ent_name get]
                set cluster_pwd [.auth_win.frm.ent_pwd get]
                destroy .auth_win
            }
            #RunCommand $root $par
        }
        "Central server administrator is not authenticated" {
            AuthorisationDialog "Администратор агента кластера"
            .auth_win.frm_btn.btn_ok configure -command {
                set agent_user [.auth_win.frm.ent_name get]
                set agent_pwd [.auth_win.frm.ent_pwd get]
                destroy .auth_win
            }
        }
        "Администратор кластера не аутентифицирован" {
            AuthorisationDialog "Администратор кластера"
            .auth_win.frm_btn.btn_ok configure -command {
                set cluster_user [.auth_win.frm.ent_name get]
                set cluster_pwd [.auth_win.frm.ent_pwd get]
                destroy .auth_win
            }
            #RunCommand $root $par
        }
        "Администратор центрального сервера не аутентифицирован" {
            AuthorisationDialog "Администратор агента кластера"
            .auth_win.frm_btn.btn_ok configure -command {
                set agent_user [.auth_win.frm.ent_name get]
                set agent_pwd [.auth_win.frm.ent_pwd get]
                destroy .auth_win
            }
        }
        (.+) {
            tk_messageBox -type ok -icon error -message "$err"
        }
    }
}

Iwo. malingana ndi zomwe lamulolo libwerera, zomwe zidzachitike.

Pakadali pano, pafupifupi 95 peresenti ya magwiridwe antchito akhazikitsidwa, chomwe chatsala ndikukhazikitsa ntchito ndi mbiri yachitetezo ndikuyesa =). Ndizomwezo. Pepani pa nkhani yofota.

Khodi imapezeka mwachikhalidwe apa.

Kusintha: Ndamaliza kugwira ntchito ndi mbiri yachitetezo. Tsopano magwiridwe antchito akwaniritsidwa 100%.

Kusintha 2: kumasulira kwa Chingerezi ndi Chirasha kwawonjezeredwa, ntchito mu win7 yayesedwa
Kulemba GUI ya 1C RAC, kapenanso za Tcl/Tk

Source: www.habr.com

Kuwonjezera ndemanga