Kunyora GUI ye1C RAC, kana zvakare nezve Tcl/Tk

Sezvatakapinda mumusoro wekuti zvigadzirwa zve1C zvinoshanda sei munzvimbo yeLinux, imwe dhizaini yakawanikwa - kushomeka kweiyo iri nyore graphical multi-platform chishandiso chekutonga sumbu remaseva e1C. Uye zvakasarudzwa kugadzirisa iyi drawback nekunyora GUI yeiyo rac console utility. Tcl/tk yakasarudzwa semutauro wekusimudzira sezvo, mumaonero angu, ndiyo yakanyatsokodzera basa iri. Uye saka, ndinoda kuunza zvimwe zvinonakidza zvemhinduro mune ino chinyorwa.

Kuti ushande iwe uchada tcl/tk uye 1C kugovera. Uye sezvo ndakafunga kushandisa zvakanyanya kugona kweiyo yekutanga tcl/tk kuendesa pasina kushandisa wechitatu-bato mapakeji, ini ndichada vhezheni 8.6.7, iyo inosanganisira ttk - pasuru ine mamwe magraphic elements, ayo atinonyanya kuda ttk. ::TreeView, inobvumira kuratidza data zviri zviviri muchimiro chemuti chimiro uye muchimiro chetafura (rondedzero). Zvakare, mushanduro itsva, basa risingaite rakagadziridzwa zvakare (iyo yekuyedza kuraira, iyo inoshandiswa mupurojekiti kana uchimhanyisa mirairo yekunze).

Iyo purojekiti ine akati wandei mafaera (kunyangwe pasina chinokutadzisa kuita zvese mune imwe):

rac_gui.cfg - default config
rac_gui.tcl - main launch script
Iyo lib dhairekitori ine mafaera anoiswa otomatiki pakutanga:
function.tcl - faira ine maitiro
gui.tcl - main graphical interface
images.tcl - base64 image library

Iro rac_gui.tcl faira, chaizvoizvo, inotanga muturikiri, inotanga zvakasiyana-siyana, inotakura modules, configs, nezvimwe zvakadaro. Zviri mukati mefaira rine makomendi:

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"
    }    
}

Mushure mekudhawunirodha zvese zvinodiwa uye kutarisa kuvepo kweiyo rac utility, hwindo remifananidzo richavhurwa. Iyo purogiramu interface ine zvinhu zvitatu:

Toolbar, muti uye rondedzero

Ndakagadzira zviri mu "muti" zvakafanana sezvinobvira kune yakajairwa Windows michina kubva ku1C.

Kunyora GUI ye1C RAC, kana zvakare nezve Tcl/Tk

Kodhi huru inoumba hwindo iri iri mufaira
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

Iyo algorithm yekushanda nechirongwa ndeiyi inotevera:

1. Kutanga, iwe unoda kuwedzera iyo huru cluster server (kureva, iyo cluster management server (muLinux, hutungamiri hunotangwa nemurairo "/opt/1C/v8.3/x86_64/ras cluster -daemon").

Kuti uite izvi, tinya bhatani "+" uye pahwindo rinovhurwa, isa kero yeseva uye chiteshi:

Kunyora GUI ye1C RAC, kana zvakare nezve Tcl/Tk

Mushure mezvo, sevha yedu ichaonekwa mumuti nekudzvanya pairi, rondedzero yemasumbu ichavhurwa kana kukanganisa kwekubatanidza kucharatidzwa.

2. Kudzvanya pazita rechikwata kuchavhura runyoro rwemabasa anowanikwa kwairi.

3.…

Uye zvichingodaro, i.e. kuti uwedzere sumbu idzva, sarudza chero iripo mune iyo rondedzero uye dzvanya bhatani "+" mubhara rekushandisa uye iyo yekuwedzera nhaurirano icharatidzwa:

Kunyora GUI ye1C RAC, kana zvakare nezve Tcl/Tk

Mabhatani ari mubhokisi rekushandisa anoita mabasa zvichienderana nemamiriro ezvinhu, i.e. Zvichienderana nechinhu chipi chemuti kana chinyorwa chinosarudzwa, imwe kana imwe nzira ichaitwa.

Ngatitarisei muenzaniso webhatani rekuwedzera (“+”):

Bhatani rekugadzira kodhi:

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

Pano tinoona kuti kana bhatani radzvanywa, iyo "Wedzera" maitiro achaitwa, kodhi yayo:

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
}

Heino imwe yemabhenefiti etickle: unogona kupfuudza kukosha kwekusiyana sezita rekuita:

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

Kureva, semuenzaniso, kana tikanongedza pane main server todzvanya “+”, ipapo iyo Wedzera :: server maitiro anozotangwa, kana pachikwata - Wedzera :: cluster zvichingodaro (ini ndichanyora nezve kupi "makiyi" anodiwa anobva mune zvishoma pazasi), maitiro akanyorwa anodhirowa zvinhu zvine graphic zvinoenderana nemamiriro ezvinhu.

Sezvaungave watoona, mafomu akafanana muchimiro - izvi hazvishamise, nekuti anoratidzwa neimwe nzira, kunyanya iyo huru fomu yefomu (hwindo, mabhatani, mufananidzo, label), zita rekuita. 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
}

Dana paramita: musoro, zita remufananidzo wechiratidzo kubva kuraibhurari (lib/images.tcl) uye ine sarudzo yezita rewindo reparameter (default .add). Saka, kana tikatora mienzaniso iri pamusoro yekuwedzera iyo huru server uye cluster, kufona kuchave saizvozvo:

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

kana

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

Zvakanaka, ndichienderera mberi nemienzaniso iyi, ini ndicharatidza maitiro anoratidza wedzera dialogs ye server kana cluster.

Wedzera::server

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
}

Wedzera::chikwata

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
}

Kana tichienzanisa kodhi yemaitirwo aya, mutsauko unoonekwa neziso rakashama; Ini ndichatarisa pane "Ok" bhatani rinobata. MuTk, zvimiro zvegraphic elements zvinogona kudarikwa panguva yekuitwa kwechirongwa uchishandisa sarudzo configure. Semuenzaniso, yekutanga kuraira kuratidza bhatani:

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

Asi mumafomu edu, murairo unoenderana nekushanda kunodiwa:

  .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
    }

Mumuenzaniso uri pamusoro, bhatani "rakavharika" rinotanga maitiro ekuwedzera sumbu.

Pano zvakakodzera kuita digression yekushanda ne graphic elements muTk - kune akasiyana siyana ekuisa data zvinhu (yekupinda, combobox, checkbutton, nezvimwewo) parameter yakaunzwa sechinyorwa chinosiyana:

entry  $frm.ent_lifetime_limit -textvariable lifetime_limit

Iyi shanduko inotsanangurwa munzvimbo yemazita yepasi rose uye ine kukosha kwakapinda parizvino. Avo. kuitira kuti uwane zvinyorwa zvakapinda kubva kumunda, iwe unongoda kuverenga kukosha kunoenderana nekusiyana (zvechokwadi, kunze kwekuti inotsanangurwa pakugadzira chinhu).

Yechipiri nzira yekudzoreredza iyo yakapinda zvinyorwa (zvezvinhu zvemhando yekupinda) ndeye kushandisa iyo get command:

.add.frm.ent_name get

Nzira mbiri idzi dzinogona kuonekwa mukodhi yepamusoro.

Kudzvanya bhatani iri, mune iyi kesi, inotangisa iyo RunCommand maitiro neyakagadzirwa yekuraira mutsara wekuwedzera cluster maererano nerac:

/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

Iye zvino tauya kumurairo mukuru, uyo unodzora kutangwa kwerac nemiganhu yatinoda, zvakare inoparadzanisa kubudiswa kwemirairo muzvinyorwa uye kudzoka, kana zvichidiwa:

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 ""
    }
}

Mushure mekupinda iyo main server data, ichawedzerwa pamuti, nekuda kweizvi, mune iri pamusoro Wedzera: server maitiro, iyo inotevera kodhi ine basa:

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

Iye zvino, nekudzvanya pazita reseva mumuti, tinowana runyoro rwemasumbu anotungamirwa neiyo sevha, uye nekudzvanya pane sumbu, tinowana runyorwa rwezvimedu zvemasumbu (maseva, infobases, nezvimwewo). Izvi zvinoitwa muTreePress maitiro (faira 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
}

Saizvozvo, Mhanya :: server ichaendeswa kune iyo huru server (yeboka - Run :: cluster, yekushanda server - Run ::work_server, nezvimwewo). Avo. kukosha kweiyo $ key variable chikamu chezita remuti chinhu chinotsanangurwa nechisarudzo -id.

Ngatiteererei maitiro

Mhanya::server

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
    }
}

Iyi nzira inobata izvo zvakagamuchirwa kubva kune server kuburikidza neRunCommand command uye inowedzera marudzi ese ezvinhu pamuti - masumbu, akasiyana midzi zvinhu (mabhesi, anoshanda maseva, maseji, zvichingodaro). Kana iwe ukanyatsotarisisa, iwe uchaona kufona kune iyo InsertItemsWorkList maitiro mukati. Inoshandiswa kuwedzera zvinhu kune graphical rondedzero nekugadzirisa zvakabuda zveiyo rac console utility, iyo yakambodzoserwa serunyorwa kune iyo $lst chinja. Urwu runyoro rwezvirongwa zvine peya yezvinhu zvakapatsanurwa nekoroni.

Semuenzaniso, runyorwa rwemasumbu ekubatanidza:

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

Mune graphical fomu inotaridzika seizvi:

Kunyora GUI ye1C RAC, kana zvakare nezve Tcl/Tk

Maitiro ari pamusoro anosarudza mazita ezvinyorwa zvemusoro uye data yekuzadza tafura:

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
}

Pano, panzvimbo yekuraira kwakapfava [kupatsanura $str ":"], kunotsemura tambo kuita zvinhu zvakapatsanurwa ne ":" uye inodzosera runyoro, kutaura kwenguva dzose kunoshandiswa, sezvo zvimwe zvinhu zvine colon.

Iyo InsertClusterItems maitiro (imwe yeakati wandei akafanana) inongowedzera runyoro rwezvinhu zvevana zvine zviziviso zvinoenderana kumuti weiyo inodiwa cluster element.
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
}

Iwe unogona kufunga dzimwe nzira mbiri dzekuita maitiro akafanana, apo zvichanyatso onekwa kuti iwe unogona sei kugadzirisa uye kubvisa inodzokororwa mirairo:

Mukuita uku, kuwedzera uye kutarisa kunogadziriswa musoro-pamusoro:

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"
    }
}

Heino imwe nzira yakarurama:

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 
    }
}

Musiyano uripo pakati pawo kushandisa loop, umo inodzokororwa mirairo (s) inotevedzwa. Ndeipi nzira yekushandisa iri pakufunga kwemugadziri.

Isu takafukidza kuwedzera zvinhu uye kudzoreredza data, ikozvino yave nguva yekuisa pfungwa pakugadzirisa. Sezvo, zvakanyanya, iwo maparamita akafanana anoshandiswa pakugadzirisa nekuwedzera (kunze kweiyo base yeruzivo), iwo madialog mafomu anoshandiswa. Iyo algorithm yekufona maitiro ekuwedzera inotaridzika seizvi:

Wedzera::$kiyi->AddToplevel

Uye kugadzirisa seizvi:

Rongedza::$kiyi-> Wedzera ::$kiyi->AddTopLevel

Semuenzaniso, ngatitore kugadzirisa sumbu, i.e. Wadzvanya pazita resumbu riri mumuti, tinya bhatani rekugadzirisa mubhara rekushandisa (penzura) uye fomu rinoenderana richaratidzwa pachiratidziri:

Kunyora GUI ye1C RAC, kana zvakare nezve Tcl/Tk
Rongedza::cluster

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
    }
}

Zvichienderana nezvakataurwa mukodhi, mumusimboti, zvese zviri pachena, kunze kwekunge iyo bhatani bhatani kodhi yakadhindwa uye kune FormFieldsDataInsert maitiro anozadza minda nedata uye kutanga zvinosiyana:

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
                }
            }
        }
    }
}

Mukuita uku, imwe mukana we tcl yakapfuura - hunhu hwemamwe mabhii anotsiviwa semazita akasiyana. Avo. kuitisa otomatiki kuzadza mafomu uye kutanga kwezvinosiyana, mazita eminda uye akasiyana anoenderana neanoraira mutsara switch weiyo rac utility uye mazita emirairo yekubuda ma parameter neimwe kunze - iyo dash inotsiviwa ne underscore. Eg zvakarongwa-mabasa-ramba zvinoenderana nemunda ent_scheduled_jobs_deny uye chinja zvakarongwa_mabasa_ramba.

Mafomu ekuwedzera nekugadzirisa anogona kusiyana mukuumbwa kweminda, semuenzaniso, kushanda nenheyo yeruzivo:

Kuwedzera ruzivo rwekuchengetedza

Kunyora GUI ye1C RAC, kana zvakare nezve Tcl/Tk

Kugadzirisa kuchengetedzwa kwemashoko

Kunyora GUI ye1C RAC, kana zvakare nezve Tcl/Tk

Mukugadzirisa maitiro Rongedza :: infobase, minda inodiwa inowedzerwa kune fomu; iyo kodhi ine simba, saka ini handiiratidze pano.

Nekufananidza, maitiro ekuwedzera, kugadzirisa, kudzima anoitwa kune zvimwe zvinhu.

Sezvo kushanda kwechishandiso kuchireva huwandu husina muganho hwemaseva, masumbu, zvigadziko zveruzivo, nezvimwe, kuona kuti isumbu ripi ndere server kana ruzivo rwekuchengetedza system, akati wandei epasi rose akaunzwa, hunhu hwayo hwakaiswa imwe neimwe. nguva yaunodzvanya pazvinhu zvemuti. Avo. iyo nzira inodzokororwa inomhanya mukati mezvinhu zvese zvevabereki uye inoseta zvinosiyana:

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
    }
}

Iyo 1C cluster inokutendera kuti ushande kana pasina mvumo. Kune marudzi maviri evatungamiri - cluster agent administrator uye cluster administrator. Nekuda kweizvozvo, kuitira kushanda chaiko, mamwe mana epasirese akasiyana akaunzwa aine iyo administrator login uye password. Avo. kana paine administrator account musumbu, dialog icharatidzwa kuti uise yako login uye password, iyo data ichachengetwa mundangariro uye inopinzwa mumirairo yega yega yeboka rinoenderana.

Iri ndiro basa rekugadzirisa kukanganisa.

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"
        }
    }
}

Avo. zvichienderana nekuti murairo unodzokei, maitikiro acho achaita saizvozvo.

Parizvino, ingangoita makumi mapfumbamwe neshanu muzana ekushanda kwaitwa, chasara kuita basa nemaprofile ekuchengetedza uye kuyedza =). Ndizvo zvose. Ndinokumbira ruregerero nenyaya yapwanya.

Iyo kodhi inowanikwa pachinyakare pano.

Update: Ndapedza kushanda nemaprofile ekuchengetedza. Iye zvino kushanda kuri 100% kushandiswa.

Kwidziridzo 2: kuiswa muChirungu neRussia kwakawedzerwa, basa mu win7 rakaedzwa
Kunyora GUI ye1C RAC, kana zvakare nezve Tcl/Tk

Source: www.habr.com

Voeg