Ide GUI maka 1C RAC, ma ọ bụ ọzọ gbasara Tcl/Tk

Ka anyị tụlere n'isiokwu nke ka ngwaahịa 1C si arụ ọrụ na gburugburu Linux, achọpụtara otu ihe ndọghachi azụ - enweghị ngwa eserese multi-platform dị mma maka ijikwa ụyọkọ nke sava 1C. E kpebiri imezi ihe ndọghachi azụ a site n'ide GUI maka akụrụngwa njikwa rac. A họọrọ Tcl/tk dị ka asụsụ mmepe dịka, n'echiche nke m, nke kachasị mma maka ọrụ a. Ya mere, ọ ga-amasị m ịnye ụfọdụ akụkụ na-adọrọ mmasị nke ngwọta na ihe a.

Iji rụọ ọrụ ị ga-achọ nkesa tcl/tk na 1C. Ma ebe ọ bụ na m kpebiri iji ọtụtụ ikike nke isi tcl / tk nnyefe na-enweghị iji ngwugwu ndị ọzọ, m ga-achọ ụdị 8.6.7, nke gụnyere ttk - ngwugwu nwere ihe ndị ọzọ eserese, nke anyị chọrọ ttk. ::TreeView, ọ na-enye ohere ngosi data ma n'ụdị osisi na n'ụdị tebụl (ndepụta). Ọzọkwa, na ụdị ọhụrụ ahụ, arụgharịrị ọrụ na-enweghị ihe ọzọ (iwu ịnwale, nke a na-eji na ọrụ ahụ mgbe ọ na-agba ọsọ iwu mpụga).

Ọrụ a nwere ọtụtụ faịlụ (ọ bụ ezie na ọ nweghị ihe na-egbochi gị ime ihe niile n'otu):

rac_gui.cfg - nhazi ndabere
rac_gui.tcl - edemede mmalite
Akwụkwọ ndekọ aha lib nwere faịlụ ndị a na-ebunye na-akpaghị aka na mmalite:
function.tcl - faịlụ nwere usoro
gui.tcl - isi interface eserese
images.tcl - base64 image ọba akwụkwọ

Faịlụ rac_gui.tcl, n'ezie, na-amalite onye ntụgharị okwu, malite mgbanwe mgbanwe, ibu modul, nhazi, na ihe ndị ọzọ. Ọdịnaya nke faịlụ nwere nkọwa:

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

Mgbe nbudata ihe niile achọrọ na ịlele maka ọnụnọ nke rac utility, a ga-ewepụta windo eserese. Ihe interface mmemme nwere ihe atọ:

Ogwe ngwaọrụ, osisi na ndepụta

Emere m ihe dị n'ime "osisi" ahụ dịka o kwere mee na ngwa Windows ọkọlọtọ sitere na 1C.

Ide GUI maka 1C RAC, ma ọ bụ ọzọ gbasara Tcl/Tk

Koodu bụ isi nke mebere mpio a dị na faịlụ ahụ
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

Algọridim maka ịrụ ọrụ na mmemme bụ ndị a:

1. Nke mbụ, ịkwesịrị ịgbakwunye ihe nkesa ụyọkọ nke isi (ya bụ, ihe nkesa nchịkwa ụyọkọ (na Linux, a na-eji njikwa ọrụ malite na iwu "/opt/1C/v8.3/x86_64/ ras cluster —daemon")).

Iji mee nke a, pịa bọtịnụ "+" na mpio mepere emepe, tinye adreesị na ọdụ ụgbọ mmiri:

Ide GUI maka 1C RAC, ma ọ bụ ọzọ gbasara Tcl/Tk

Mgbe nke ahụ gasịrị, ihe nkesa anyị ga-apụta na osisi ahụ site na ịpị ya, ndepụta ụyọkọ ga-emeghe ma ọ bụ gosipụta njehie njikọ.

2. Ịpị aha ụyọkọ ahụ ga-emepe ndepụta ọrụ dị maka ya.

3. …

Na ihe ndị ọzọ, i.e. ka ịgbakwunye ụyọkọ ọhụrụ, họrọ nke ọ bụla dị na listi ahụ wee pịa bọtịnụ "+" na toolbar na tinye ọhụrụ dialog ga-egosipụta:

Ide GUI maka 1C RAC, ma ọ bụ ọzọ gbasara Tcl/Tk

Bọtịnụ ndị dị na ogwe ngwaọrụ na-arụ ọrụ dabere na ọnọdụ ya, ya bụ. Dabere na akụkụ nke osisi ma ọ bụ ndepụta ahọpụtara, a ga-eme otu ma ọ bụ usoro ọzọ.

Ka anyị lee ihe atụ nke bọtịnụ mgbakwunye (“+”):

Koodu mmepụta bọtịnụ:

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

N'ebe a, anyị na-ahụ na mgbe ịpịrị bọtịnụ, a ga-eme usoro "Tinye", koodu ya:

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
}

Nke a bụ otu n'ime uru nke tickle: ị nwere ike ịgafe uru nke mgbanwe dị ka aha usoro:

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

Nke ahụ bụ, dịka ọmụmaatụ, ọ bụrụ na anyị na-atụ aka na isi ihe nkesa wee pịa "+", mgbe ahụ, a ga-amalite usoro ihe nkesa Add :: na ọ bụrụ na ụyọkọ - Tinye :: ụyọkọ na ihe ndị ọzọ (M ga-ede banyere ebe ndị a. “igodo” dị mkpa na-abịa na ntakịrị n'okpuru), usoro ndị edepụtara na-adọta ihe eserese dabara adaba n'okwu a.

Dị ka ị nwere ike ịhụla, ụdị ndị ahụ yiri nke a n'ụdị - nke a abụghị ihe ijuanya, n'ihi na a na-egosipụta ha site na otu usoro, karịa kpọmkwem isi etiti nke ụdị (window, bọtịnụ, oyiyi, labelụ), aha usoro ahụ. TinyeTopLevel

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
}

Akụkụ oku: aha, aha onyonyo maka akara ngosi si n'ọbá akwụkwọ (lib/images.tcl) yana oke aha mpio nhọrọ (ndabere .gbakwunye). Ya mere, ọ bụrụ na anyị ewere ihe atụ ndị a dị n'elu maka ịgbakwụnye isi ihe nkesa na ụyọkọ, oku ga-adị otu a:

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

ma ọ bụ

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

Ọfọn, na-aga n'ihu na ihe atụ ndị a, m ga-egosi usoro ndị na-egosipụta gbakwunye dialog maka ihe nkesa ma ọ bụ ụyọkọ.

Tinye:: ihe nkesa

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
}

Tinye:: ụyọkọ

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
}

Mgbe ị na-atụnyere koodu nke usoro ndị a, a na-ahụ ihe dị iche na anya gba ọtọ; Na Tk, njirimara nke ihe eserese nwere ike ịkagbu n'oge mmemme mmemme site na iji nhọrọ hazie. Dịka ọmụmaatụ, iwu mbụ iji gosipụta bọtịnụ:

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

Mana n'ụdị anyị, iwu ahụ dabere na ọrụ achọrọ:

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

N'ihe atụ dị n'elu, bọtịnụ "mechiri emechi" na-amalite usoro maka ịgbakwunye ụyọkọ.

N'ebe a, ọ bara uru ịme ntule iji rụọ ọrụ na ihe eserese na Tk - maka ihe ntinye data dị iche iche (ntinye, combobox, checkbutton, wdg) ewebatala paramita dị ka mgbanwe ederede:

entry  $frm.ent_lifetime_limit -textvariable lifetime_limit

A kọwapụtara mgbanwe a na oghere aha zuru ụwa ọnụ ma nwee uru abanyela ugbu a. Ndị ahụ. iji nweta ederede abanye n'ọhịa, naanị ị ga-agụta uru kwekọrọ na mgbanwe (n'ezie, ọ bụrụhaala na akọwapụtara ya mgbe ị na-emepụta ihe).

Ụzọ nke abụọ maka iweghachite ederede etinyere (maka ụdị ụdị ntinye) bụ iji nweta iwu:

.add.frm.ent_name get

Enwere ike ịhụ ụzọ abụọ a na koodu dị n'elu.

Na ịpị bọtịnụ a, na nke a, na-ebupụta usoro RunCommand na ahịrị iwu emepụtara maka ịgbakwunye ụyọkọ na usoro 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

Ugbu a, anyị na-abịa na isi iwu, nke na-achịkwa mmalite nke rac na paramita anyị chọrọ, na-atụgharịkwa mmepụta nke iwu n'ime ndepụta na nloghachi, ma ọ bụrụ na achọrọ:

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

Mgbe ịbanye na data ihe nkesa bụ isi, a ga-agbakwunye ya na osisi ahụ, maka nke a, n'elu Tinye: usoro ihe nkesa, koodu na-esonụ bụ ọrụ:

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

Ugbu a, site na ịpị aha ihe nkesa dị na osisi ahụ, anyị na-enweta ndepụta nke ụyọkọ nke ihe nkesa ahụ na-achịkwa, na site na ịpị otu ụyọkọ, anyị na-enweta ndepụta nke ihe nchịkọta (sava, infobases, wdg). A na-emejuputa nke a na usoro TreePress (faịlụ 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
}

N'ihi ya, a ga-ewepụta Run :: ihe nkesa maka isi ihe nkesa (maka ụyọkọ - Run :: ụyọkọ, maka ihe nkesa na-arụ ọrụ - Run :: work_server, wdg). Ndị ahụ. uru nke mgbanwe igodo $ bụ akụkụ nke aha akụkụ osisi akọwapụtara site na nhọrọ -idị.

Ka anyị ṅaa ntị na usoro

Gbaa:: ihe nkesa

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

Usoro a na-eme ihe natara site na ihe nkesa site na RunCommand iwu ma na-agbakwụnye ụdị ihe niile na osisi - ụyọkọ, ihe dị iche iche mgbọrọgwụ (bases, sava na-arụ ọrụ, sessions, na na). Ọ bụrụ na ilele anya nke ọma, ị ga-ahụ oku na usoro InsertItemsWorkList n'ime. A na-eji ya gbakwunye ihe na ndepụta eserese site na ịhazi mmepụta nke akụrụngwa njikwa rac, nke eweghachiri na mbụ dị ka ndepụta na mgbanwe $lst. Nke a bụ ndepụta ndepụta nwere ụzọ abụọ ọcha nke eriri eriri kewapụrụ.

Dịka ọmụmaatụ, ndepụta njikọ ụyọkọ:

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

N'ụdị eserese ọ ga-adị ka nke a:

Ide GUI maka 1C RAC, ma ọ bụ ọzọ gbasara Tcl/Tk

Usoro dị n'elu na-ahọrọ aha nke ihe maka nkụnye eji isi mee na data iji mejupụta tebụl:

Tinye iheListWork

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
}

N'ebe a, kama iwu dị mfe [kewaa $str ":"], nke na-ekewa eriri ahụ ka ọ bụrụ ihe nkewapụrụ site na ":" wee weghachi ndepụta, a na-eji okwu mgbe niile, ebe ọ bụ na ụfọdụ ihe nwekwara eriri.

Usoro InsertClusterItems (otu n'ime ọtụtụ ndị yiri ya) na-agbakwụnye naanị ndepụta nke ihe ụmụaka nwere ihe nchọpụta kwekọrọ na osisi nke ihe ụyọkọ achọrọ.
FanyeCluster ihe

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
}

Ị nwere ike ịtụle nhọrọ abụọ ọzọ maka mmejuputa usoro yiri nke ahụ, ebe a ga-ahụ ya nke ọma ka ị ga-esi ebuli ma wepụ iwu ugboro ugboro:

Na usoro a, a na-edozi ịgbakwụnye na ịlele n'isi-n'ihu:

FanyeBase Item

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

Nke a bụ ụzọ ziri ezi karị:

Fanye Profaịlụ ihe

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

Ihe dị iche n'etiti ha bụ iji loop, nke a na-eme iwu (s) ugboro ugboro. Kedu usoro a ga-eji mee ihe bụ ikike nke onye nrụpụta.

Anyị ekpuchila ịgbakwunye ihe na iweghachite data, ugbu a oge eruola itinye uche na ndezi. Ebe ọ bụ na, n'ụzọ bụ isi, a na-eji otu paramita ahụ maka edezi na ịgbakwunye (ma e wezụga isi ihe ọmụma), a na-eji otu ụdị mkparịta ụka. Algọridim maka usoro ịkpọ oku maka ịgbakwunye dị ka nke a:

Tinye::$ igodo->TinyeToplevel

Na maka idezi dị ka nke a:

Dezie::$key->Tinye::$key->TinyeTopLevel

Dịka ọmụmaatụ, ka anyị were dezie ụyọkọ, ya bụ. Mgbe ịpịrịchara aha ụyọkọ dị na osisi ahụ, pịa bọtịnụ dezie na toolbar (pensụl) na ụdị kwekọrọ ga-egosipụta na ihuenyo:

Ide GUI maka 1C RAC, ma ọ bụ ọzọ gbasara Tcl/Tk
Dezie:: ụyọkọ

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

Dabere na nkwupụta ndị dị na koodu ahụ, n'ụkpụrụ, ihe niile doro anya, belụsọ na koodu njikwa bọtịnụ emebiela yana enwere usoro FormFieldsDataInsert nke na-ejupụta data na data wee malite mgbanwe ndị ahụ:

Fanye FormFieldsData

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

N'ime usoro a, uru ọzọ nke tcl pụtara - a na-edochi ụkpụrụ nke mgbanwe ndị ọzọ dị ka aha agbanwe agbanwe. Ndị ahụ. ka akpaghị aka na ndochi nke ụdị na initialization nke variables, aha nke ubi na variables kwekọrọ na iwu akara switches nke rac utility na aha nke iwu mmepụta parameters na ụfọdụ wepụrụ - dash na-anọchi anya akara. Dịka ọmụmaatụ ndokwa-ọrụ-agọnarị dakọtara na ubi ent_scheduled_ọrụ_gọnarị na mgbanwe ndokwa_ọrụ_agọnahụ.

Ụdị maka ịgbakwunye na ndezi nwere ike ịdị iche na nhazi nke ubi, dịka ọmụmaatụ, ịrụ ọrụ na ntọala ozi:

Na-agbakwunye nchekwa ozi

Ide GUI maka 1C RAC, ma ọ bụ ọzọ gbasara Tcl/Tk

Nchekwa ozi na-edezi

Ide GUI maka 1C RAC, ma ọ bụ ọzọ gbasara Tcl/Tk

Na usoro ndezi Dezie :: infobase, a na-agbakwunye mpaghara achọrọ na ụdị ahụ;

Site na ntụnyere, a na-emejuputa usoro maka ịgbakwunye, dezie, ihichapụ maka ihe ndị ọzọ.

Ebe ọ bụ na ọrụ nke ịba uru na-egosi ọnụọgụ sava na-akparaghị ókè, ụyọkọ, ntọala ozi, wdg, iji chọpụta ụyọkọ nke ihe nkesa ma ọ bụ usoro nchekwa ozi, ewebatala ọtụtụ mgbanwe ụwa, ụkpụrụ nke edobere nke ọ bụla. oge ị pịa ihe ndị dị na osisi ahụ. Ndị ahụ. Usoro a na-aga n'ihu na-aga n'ihu na ihe niile nne na nna na-edozi mgbanwe ndị a:

TọọGlobalVarFromTreeItems

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

Ụyọkọ 1C na-enye gị ohere iji ma ọ bụ na-enweghị ikike ịrụ ọrụ. Enwere ụdị nchịkwa abụọ - onye nchịkwa ụyọkọ na onye nchịkwa ụyọkọ. N'ihi ya, maka ịrụ ọrụ ziri ezi, ewebata mgbanwe 4 ọzọ zuru ụwa ọnụ nwere nbanye na paswọọdụ onye nchịkwa. Ndị ahụ. ọ bụrụ na enwere akaụntụ nchịkwa na ụyọkọ ahụ, a ga-egosipụta dialog iji tinye nbanye na paswọọdụ gị, a ga-echekwa data na ebe nchekwa ma tinye ya n'iwu ọ bụla maka ụyọkọ kwekọrọ.

Nke a bụ ọrụ nke usoro njikwa njehie.

Nkwụsị mperi

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

Ndị ahụ. dabere n'ihe iwu ahụ ga-alọghachi, mmeghachi omume ga-adị otu a.

N'oge a, ihe dị ka pasent 95 nke arụmọrụ arụ ọrụ, ihe niile fọdụrụ bụ iji mejuputa ọrụ na profaịlụ nchekwa ma nwalee ya =). Ọ gwụla. A na m arịọ mgbaghara maka akụkọ ọjọọ ahụ.

Koodu dị na omenala ebe a.

Mmelite: Emechara m ọrụ na profaịlụ nchekwa. Ugbu a arụrụ ọrụ 100%.

Mmelite 2: agbakwunyere mpaghara n'ime Bekee na Russian, nwalere ọrụ na win7
Ide GUI maka 1C RAC, ma ọ bụ ọzọ gbasara Tcl/Tk

isi: www.habr.com

Tinye a comment