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
Личные инструменты