Manoratra GUI ho an'ny 1C RAC, na indray momba ny Tcl/Tk

Rehefa nandinika ny lohahevitry ny fomba fiasan'ny vokatra 1C ao amin'ny tontolo Linux izahay, dia hita ny tsy fahampiana iray - ny tsy fisian'ny fitaovana misy sehatra maro amin'ny sary ho an'ny fitantanana vondron'ny mpizara 1C. Ary nanapa-kevitra ny hanitsy izany tsy fahampiana izany amin'ny fanoratana GUI ho an'ny utility rac console. Tcl/tk no nofidina ho fiteny fampandrosoana, araka ny hevitro, no mety indrindra amin'ity asa ity. Ary noho izany, tiako ny hanolotra lafiny mahaliana amin'ny vahaolana amin'ity fitaovana ity.

Mba hiasa dia mila fizarana tcl/tk sy 1C ianao. Ary satria nanapa-kevitra ny hanararaotra ny fahafahan'ny fandefasana tcl/tk fototra aho nefa tsy mampiasa fonosana antoko fahatelo, dia mila version 8.6.7 aho, izay ahitana ttk - fonosana misy singa sary fanampiny, izay tena ilaintsika ttk ::TreeView, mamela ny angon-drakitra aseho amin'ny endrika firafitry ny hazo sy amin'ny endrika latabatra (lisitra). Ary koa, amin'ny dikan-teny vaovao, ny asa miaraka amin'ny maningana dia novolavolaina (ny baiko andrana, izay ampiasaina amin'ny tetikasa rehefa manao baiko ivelany).

Ny tetikasa dia misy rakitra maromaro (na dia tsy misy manakana anao tsy hanao ny zava-drehetra ao anaty iray aza):

rac_gui.cfg - config default
rac_gui.tcl - script fanombohana lehibe
Ny lahatahiry lib dia misy rakitra izay alefa ho azy amin'ny fanombohana:
function.tcl - rakitra misy fomba fiasa
gui.tcl - interface an-tsary lehibe
images.tcl - tranomboky sary base64

Ny rakitra rac_gui.tcl, raha ny marina, dia manomboka ny mpandika teny, manomboka ny fari-piainana, mameno ny modules, ny configs, sns. Ny votoatin'ny rakitra misy fanehoan-kevitra:

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

Rehefa avy misintona izay rehetra ilaina sy manamarina ny fisian'ny rac utility dia hatomboka ny varavarankely sary. Ny interface interface dia misy singa telo:

Toolbar, hazo ary lisitra

Nataoko mitovy araka izay azo atao ny votoatin'ny "hazo" amin'ny fitaovana Windows mahazatra avy amin'ny 1C.

Manoratra GUI ho an'ny 1C RAC, na indray momba ny Tcl/Tk

Ny kaody fototra mamorona ity varavarankely ity dia voarakitra ao amin'ny rakitra
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

Ny algorithm amin'ny fiasana amin'ny programa dia toy izao manaraka izao:

1. Voalohany, mila manampy ny mpizara cluster lehibe ianao (izany hoe, ny mpizara fitantanana cluster (amin'ny Linux, ny fitantanana dia natomboka tamin'ny baiko "/opt/1C/v8.3/x86_64/ras cluster β€”daemon”)).

Mba hanaovana izany, tsindrio ny bokotra "+" ary ao amin'ny varavarankely misokatra, ampidiro ny adiresy sy ny seranan-tsambo:

Manoratra GUI ho an'ny 1C RAC, na indray momba ny Tcl/Tk

Aorian'izay dia hiseho eo amin'ny hazo ny mpizara anay amin'ny alΓ lan'ny fipihana azy, hisokatra ny lisitry ny kluster na hisy hadisoana amin'ny fifandraisana.

2. Ny fipihana ny anaran'ny cluster dia hanokatra lisitr'ireo fiasa azo ampiasaina amin'izany.

3.…

Ary ny sisa, i.e. raha te hampiditra cluster vaovao, mifidiana izay misy ao amin'ny lisitra ary tsindrio ny bokotra "+" ao amin'ny fitaovana ary hiseho ny fifanakalozan-kevitra manampy vaovao:

Manoratra GUI ho an'ny 1C RAC, na indray momba ny Tcl/Tk

Ny bokotra ao amin'ny bara-fitaovana dia manao asa miankina amin'ny contexte, i.e. Miankina amin'ny singa iray amin'ny hazo na lisitra nofantenana, fomba iray na hafa no hatao.

Andeha hojerentsika ny ohatry ny bokotra add (β€œ+”):

Kaody famoronana bokotra:

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

Eto isika dia mahita fa rehefa voatsindry ny bokotra dia hotanterahina ny fomba "Add", ny code:

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
}

Ity ny iray amin'ireo tombony amin'ny tickle: azonao atao ny mampita ny sandan'ny fari-piainana ho anarana fomba fiasa:

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

Izany hoe, ohatra, raha manondro ny lohamilina lehibe isika ary manindry ny "+", dia hatomboka ny fomba fiasa Add::server, raha ao amin'ny cluster - Add::cluster sy ny sisa (hosoratako hoe aiza ny "Ny fanalahidy" ilaina dia avy amin'ny ambany kely), ireo fomba fiasa voatanisa dia manintona singa sary mifanaraka amin'ny teny manodidina.

Araka ny efa tsikaritrareo, ny endrika dia mitovy amin'ny fomba - tsy mahagaga izany, satria aseho amin'ny fomba iray izy ireo, ny marimarina kokoa ny endriky ny endrika (varavarankely, bokotra, sary, marika), ny anaran'ny fomba fiasa. 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
}

Masontsivana fiantsoana: lohateny, anaran-tsary ho an'ny kisary avy amin'ny tranomboky (lib/images.tcl) ary mari-pamantarana anarana fikandrana azo atao (default .add). Noho izany, raha maka ireto ohatra etsy ambony ireto isika amin'ny fampidirana ny lohamilina sy ny cluster, dia ho toy izany ny antso:

AddToplevel "Π”ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ основного сСрвСра" server_grey_64

na

AddToplevel "Π”ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ кластСра" cluster_grey_64

Eny ary, amin'ny fanohizana ireo ohatra ireo, dia hasehoko ny fomba fiasa izay mampiseho fifanakalozan-kevitra fanampiny ho an'ny mpizara na cluster.

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

Add :: cluster

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
}

Raha ampitahaina ny kaody amin'ireo fomba fiasa ireo dia hita amin'ny maso mitanjaka ny fahasamihafana; hifantoka amin'ny mpitantana bokotra "Ok" aho. Ao amin'ny Tk, ny fananan'ny singa sary dia azo ovaina mandritra ny fanatanterahana ny programa amin'ny fampiasana ny safidy configures. Ohatra, ny baiko voalohany hanehoana ny bokotra:

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

Saingy amin'ny endrikay, ny baiko dia miankina amin'ny fampiasa ilaina:

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

Ao amin'ny ohatra etsy ambony, ny bokotra "clogged" dia manomboka ny fomba fampidirana cluster.

Eto dia ilaina ny manao digression amin'ny fiasana amin'ny singa sary ao amin'ny Tk - ho an'ny singa fampidirana data isan-karazany (fidirana, combobox, checkbutton, sns) dia nampidirina ho toy ny fari-pitsipika lahatsoratra:

entry  $frm.ent_lifetime_limit -textvariable lifetime_limit

Io fari-piainana io dia voafaritra ao amin'ny espace anarana manerantany ary misy ny sanda ampidirina amin'izao fotoana izao. Ireo. Mba hahazoana ny lahatsoratra niditra avy amin'ny saha, dia mila mamaky fotsiny ny sanda mifanaraka amin'ny fari-piainana (mazava ho azy, raha toa ka voafaritra rehefa mamorona ny singa).

Ny fomba faharoa hamerenana ny lahatsoratra nampidirina (ho an'ny singa amin'ny karazana fidirana) dia ny fampiasana ny baiko get:

.add.frm.ent_name get

Ireo fomba roa ireo dia azo jerena ao amin'ny code etsy ambony.

Ny fanindriana an'ity bokotra ity, amin'ity tranga ity, dia manomboka ny fomba RunCommand miaraka amin'ny andalana baiko novolavolaina hanampiana cluster amin'ny resaka 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

Ankehitriny dia tonga amin'ny baiko lehibe isika, izay mifehy ny fandefasana ny rac miaraka amin'ireo masontsivana ilaintsika, dia mamaha ny famoahana ny baiko ao anaty lisitra sy miverina, raha ilaina:

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

Aorian'ny fampidirana ny angon-drakitra lehibe amin'ny mpizara, dia ampidirina amin'ny hazo izany, noho izany, ao amin'ny Add:server procedure etsy ambony, ity code manaraka ity dia tompon'andraikitra:

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

Ankehitriny, amin'ny alΓ lan'ny fipihana ny anaran'ny mpizara ao amin'ny hazo, dia mahazo lisitry ny clusters tantanan'io server io isika, ary amin'ny fipihana ny cluster dia mahazo lisitry ny singa cluster (servers, infobases, sns.). Izany dia ampiharina amin'ny fomba TreePress (file 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
}

Noho izany, Run::server dia hatomboka ho an'ny lohamilina lehibe (ho an'ny cluster - Run::cluster, ho an'ny mpizara miasa - Run::work_server, sns.). Ireo. ny sandan'ny variable key $ dia ampahany amin'ny anaran'ny singa hazo voafaritry ny safidy -id.

Andeha hojerentsika ny fomba fiasa

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

Ity fomba fiasa ity dia manodina izay azo avy amin'ny mpizara amin'ny alΓ lan'ny baiko RunCommand ary manampy ny karazan-javatra rehetra amin'ny hazo - cluster, singa fototra isan-karazany (fototra, mpizara miasa, fivoriana, sns). Raha mijery akaiky ianao dia ho hitanao fa misy antso mankany amin'ny dingana InsertItemsWorkList ao anatiny. Izy io dia ampiasaina hanampiana singa amin'ny lisitra an-tsary amin'ny alΓ lan'ny fanodinana ny vokatra avy amin'ny fampitaovana rac console, izay naverina teo aloha ho lisitra ho an'ny variable $lst. Ity dia lisitr'ireo lisitra misy singa tsiroaroa sarahin'ny tsinay.

Ohatra, lisitry ny fifandraisana cluster:

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

Amin'ny endrika grafika dia ho toy izao izany:

Manoratra GUI ho an'ny 1C RAC, na indray momba ny Tcl/Tk

Ny dingana etsy ambony dia mifidy ny anaran'ny singa ho an'ny lohapejy sy angona hamenoana ny latabatra:

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
}

Eto, ho solon'ny baiko tsotra [split $str ":"], izay manasaraka ny tady ho singa misaraka amin'ny ":" ary mamerina lisitra, dia ampiasaina ny fitenenana mahazatra, satria misy singa sasany koa misy tsangambato.

Ny fomba fiasa InsertClusterItems (iray amin'ireo mitovitovy amin'izany) dia manampy fotsiny lisitry ny singa ankizy miaraka amin'ny famantarana mifanaraka amin'ny hazo misy ny singa cluster ilaina.
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
}

Azonao atao ny mandinika safidy roa hafa amin'ny fampiharana fomba mitovy, izay ho hita mazava tsara ny fomba ahafahanao manatsara sy manala ny baiko miverimberina:

Amin'ity dingana ity, ny fanampiana sy ny fanamarinana dia voavaha mivantana:

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

Ity misy fomba fiasa marina kokoa:

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

Ny fahasamihafana misy eo amin'izy ireo dia ny fampiasana loop iray, izay anaovana ny baiko miverimberina. Ny fomba fampiasana dia araka ny fahaizan'ny mpamorona.

Niresaka momba ny fampidirana singa sy ny fakana angona izahay, izao no fotoana hifantohana amin'ny fanitsiana. Satria, amin'ny ankapobeny, ireo mari-pamantarana mitovy dia ampiasaina amin'ny fanitsiana sy fanampim-panampiana (afa-tsy ny fototry ny fampahalalana), ireo endrika fifanakalozan-kevitra mitovy no ampiasaina. Ny algorithm amin'ny fiantsoana ny fomba fampidirana dia toy izao:

Add::$key->AddToplevel

Ary ho an'ny fanovana toy izao:

Ahitsio::$key->Add::$key->AddTopLevel

Ohatra, andeha horaisintsika ny fanitsiana cluster, i.e. Rehefa avy nanindry ny anaran'ny cluster ao amin'ny hazo, tsindrio ny bokotra fanitsiana ao amin'ny bara fitaovana (pensilihazo) ary hiseho eo amin'ny efijery ny endrika mifanaraka amin'izany:

Manoratra GUI ho an'ny 1C RAC, na indray momba ny Tcl/Tk
Ahitsio :: 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
    }
}

Miorina amin'ny fanehoan-kevitra ao amin'ny kaody, amin'ny ankapobeny, mazava tsara ny zava-drehetra, afa-tsy ny fanerena ny kaody mpandrindra bokotra ary misy fomba fiasa FormFieldsDataInsert izay mameno ny saha miaraka amin'ny angon-drakitra ary manomboka ny variables:

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

Amin'ity fomba fiasa ity, ny tombony hafa amin'ny tcl dia nipoitra - ny sandan'ny variable hafa dia nosoloina anarana miovaova. Ireo. ho an'ny automatique ny famenoana endrika sy ny fanombohana ny variables, ny anaran'ny saha sy ny variables dia mifanandrify amin'ny baikon'ny baikon'ny utility rac sy ny anaran'ny mari-pamantarana famoahana baiko miaraka amin'ny singa manokana - ny dash dia nosoloina tsipika. ohatra voalahatra-asa-mandΓ  mifanaraka amin'ny saha ent_scheduled_jobs_deny ary miovaova scheduled_jobs_deny.

Mety tsy hitovy amin'ny firafitry ny saha ny endrika fampidirana sy fanitsiana, ohatra, miasa miaraka amin'ny toby fampahalalana:

Manampy fiarovana vaovao

Manoratra GUI ho an'ny 1C RAC, na indray momba ny Tcl/Tk

Fanitsiana fiarovana ny vaovao

Manoratra GUI ho an'ny 1C RAC, na indray momba ny Tcl/Tk

Ao amin'ny fomba fanovana Edit::infobase, ampidirina amin'ny endrika ny saha ilaina; be dia be ny kaody, noho izany dia tsy asehoko eto.

Amin'ny alΓ lan'ny analogy, ny fomba fampidirana, fanitsiana, famafana dia ampiharina amin'ny singa hafa.

Satria ny fampandehanana ny utility dia midika hoe mpizara tsy voafetra, cluster, toby fampahalalana, sns., Mba hamaritana hoe iza no cluster an'ny mpizara na rafitra fiarovana amin'ny fampahalalam-baovao, dia nampidirina ny fari-piadidiana eran-tany maro, ny sandany dia napetraka tsirairay. fotoana tsindrio eo amin'ny singa ny hazo. Ireo. Ny fomba fiasa dia mandeha amin'ny alΓ lan'ny singa rehetra amin'ny ray aman-dreny ary mametraka ny variables:

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

Ny kluster 1C dia ahafahanao miasa na tsy nahazo alalana. Misy karazany roa ny administrateraβ€”administrateur agent de cluster sy administrateur cluster. Arak'izany, ho an'ny fampandehanana marina, 4 hafa maneran-tany no nampidirina ahitana ny fidirana sy ny tenimiafina administratera. Ireo. raha misy kaonty administratera ao amin'ny cluster, dia hiseho ny fifanakalozan-kevitra hampidirana ny fidiranao sy ny tenimiafinao, ny angona dia ho voatahiry ao anaty fitadidiana ary ampidirina ao anatin'ny baiko tsirairay ho an'ny cluster mifanaraka amin'izany.

Izany no andraikitry ny fomba fitantanana ny fahadisoana.

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

Ireo. miankina amin'izay averin'ny baiko dia ho araka izany ny fanehoan-kevitra.

Amin'izao fotoana izao, manodidina ny 95 isan-jaton'ny fampiasa no efa nampiharina, ny hany sisa tavela dia ny fampiharana ny asa miaraka amin'ny mombamomba ny fiarovana ary ny fitsapana azy =). Izay ihany. Miala tsiny aho amin'ny tantara mikorontana.

Ny kaody dia azo ampiasaina amin'ny fomba mahazatra eto.

Fanavaozana: nahavita niasa tamin'ny mombamomba ny fiarovana aho. Ankehitriny dia 100% no ampiharina ny fampiasa.

Fanavaozana 2: nampiana ny localization amin'ny teny anglisy sy rosiana, nosedraina ny asa amin'ny win7
Manoratra GUI ho an'ny 1C RAC, na indray momba ny Tcl/Tk

Source: www.habr.com

Add a comment