Programming Gems::Tcl/Tk
Материал из NNLUG Wiki.
Содержание |
[править]
Tcl/Tk
[править]
Процедурка сбора данных о хосте...
./lib/lib.tcl
namespace eval gen_imh {
proc get_ip_mac_hw_type {ahost var} {
upvar $var data
if { [ catch {set res_rsh [exec rsh $ahost uname -i]} error_rsh ] } {
set error_rsh [lindex [split $error_rsh \n] 0]
set data(error) 1
set data(error_msg) [lindex [split $error_rsh \n] 0]
return 2
}
#example res_rsh="SUNW,Ultra-5_10"
if { [ catch {set res_arp [exec arp $ahost ]} error_arp ] } {
set data(error) 1
set data(error_msg) $error_arp
return 2
}
#example, res_arp=suncm (192.168.10.16) at 8:0:20:c0:e8:ab permanent published
#all OK
set data(error) 0
set res_arp [split $res_arp " "]
set data(HOSTNAME) $ahost
set data(IP_ADDRESS) [string trim [lindex $res_arp 1] "()"]; #92.168.10.16
set data(MAC_ADDRESS) [lindex $res_arp 3]; #8:0:20:c0:e8:ab
set data(HW_TYPE) $res_rsh; #SUNW,Ultra-5_10
return 0
}
proc gen_file {ahost template} {
if [get_ip_mac_hw_type $ahost data] {
puts "Error during geting data about $ahost. Error message \"$data(error_msg)\""
return 2
}
if [catch {set filef [open ./$ahost w]}] {
puts "Error creating file ./$ahost"
return 2
}
foreach el $template {
set value $data([string range $el 0 [expr [string first " " $el]-1]])
puts $value
puts $filef [string range $el 0 [expr [string first "<value>" $el]-1]]$value
}
close $filef
}
}
...и пример использования, генериует конфиги для спика хостов
{template.cfg}
HOSTNAME <value>
IP_ADDRESS <value>
MAC_ADDRESS <value>
HW_TYPE <value>
{hostList.cfg}
lol
abg
sad3df
#!/bin/tclsh
source ./lib/lib.tcl
if {$argc == 1} {
set hostsf [lindex $argv 0]
} else {
set hostsf ./hostList.cfg
}
if [catch {set hosts [open $hostsf]}] {
puts "Error opening file \"$hostsf\""
exit 1
}
if [catch {set tempf [open ./template.cfg]}] {
puts "Error opening file \"./template.cfg\""
exit 1
}
while {!([eof $tempf])} {
lappend template [gets $tempf]
}
close $tempf
while {!([eof $hosts])} {
set host [string trim [gets $hosts] " "]
if {$host==""} {
continue
}
if ![::gen::gen_file $host $template] {
puts "Generated conf file for $host"
}
}
close $hosts
[править]
Перевод из десятичной системы исчисления в любую другую
#!/bin/tclsh
set first [lindex $argv 0]
set isminus ""
if { $first<0 } {
set isminus "-"
set first [expr abs($first)]
}
set ressys [lindex $argv 1]
if { $ressys <= 1 } {
puts "Arguments wrong or missing"
exit
}
set result ""
set symbols {0 1 2 3 4 5 6 7 8 9 A B C D E F alpha beta gamma}
while { $first >= $ressys } {
set ost [expr $first%$ressys]
set first [expr ($first-$ost)/$ressys]
set result [lindex $symbols $ost]$result
}
set result [lindex $symbols $first]$result
puts $isminus$result
[править]
Складываем цифры введённого числа
#!/bin/tclsh
set arg [split [lindex $argv 0] "" ]
set result 0
foreach el $arg {
set result [expr $result+$el]
}
puts $result

