| #!/usr/bin/wish | 
 |  | 
 | # This file provides valuable host and IP manipulation procedures such as get_host_name_ip, etc. | 
 |  | 
 | my_source [list cmd.tcl data_proc.tcl] | 
 |  | 
 |  | 
 | proc get_host_name_ip {host {quiet 1}} { | 
 |  | 
 |   # Get the host name, short host name and the IP address and return them as a list. | 
 |   # If this procedure is unable to get the requested information, it will print an error message to stderr | 
 |   # and return blank values. | 
 |  | 
 |   # Example call: | 
 |   # lassign [get_host_name_ip $host] host_name short_host_name ip_address | 
 |  | 
 |   # Description of argument(s): | 
 |   # host                            The host name or IP address to be obtained. | 
 |   # quiet                           Indicates whether status information should be printed. | 
 |  | 
 |   set print_output [expr !$quiet] | 
 |   lassign [cmd_fnc "host $host" "${quiet}" "" "${print_output}"] rc out_buf | 
 |   if { $rc != 0 } { return [list "" "" ""]} | 
 |  | 
 |   if { [regexp "has address" $out_buf] } { | 
 |     # Host is host name. | 
 |     # Format of output: | 
 |     # hostname.bla.com has address n.n.n.n. | 
 |     lassign [split $out_buf " "] host_name fill1 fill2 ip_address | 
 |   } elseif { [regexp "domain name pointer" $out_buf] } { | 
 |     # Host is IP address. | 
 |     # Format of output: | 
 |     # n.n.n.n.in-addr.arpa domain name pointer hostname.bla.com. | 
 |     set ip_address ${host} | 
 |     lassign [split $out_buf " "] fill0 fill1 fill2 fill3 host_name | 
 |     set host_name [string trimright $host_name {.}] | 
 |   } | 
 |   # Create the short name from the host name. | 
 |   lassign [split $host_name "."] short_host_name | 
 |  | 
 |   return [list ${host_name} ${short_host_name} ${ip_address}] | 
 |  | 
 | } | 
 |  | 
 |  | 
 | proc get_host_domain {host username password {quiet 1}} { | 
 |  | 
 |   # Return the domain name of the host. | 
 |  | 
 |   # If this procedure is unable to get the requested information, it will | 
 |   # print an error message to stderr and return a blank value. | 
 |  | 
 |   # Description of argument(s): | 
 |   # host                            The host name or IP address of the system | 
 |   #                                 from which the information is to be | 
 |   #                                 obtained. | 
 |   # username                        The host username. | 
 |   # password                        The host password. | 
 |   # quiet                           Indicates whether status information | 
 |   #                                 should be printed. | 
 |  | 
 |   set print_output [expr !$quiet] | 
 |   lassign [cmd_fnc \ | 
 |     "sshpass -p $password ssh -o StrictHostKeyChecking=no -k $username@$host\ | 
 |     'dnsdomainname'" ${quiet} "" ${print_output}] rc domain | 
 |   return $domain | 
 |  | 
 | } | 
 |  | 
 |  | 
 | proc get_host_name_servers {host username password {quiet 1}} { | 
 |  | 
 |   # Return a list of hostname or IP addresses. | 
 |  | 
 |   # If this procedure is unable to get the requested information, it will | 
 |   # print an error message to stderr and return a blank value. | 
 |  | 
 |   # Description of argument(s): | 
 |   # host                            The host name or IP address of the system | 
 |   #                                 from which the information is to be | 
 |   #                                 obtained. | 
 |   # username                        The host username. | 
 |   # password                        The host password. | 
 |   # quiet                           Indicates whether status information | 
 |   #                                 should be printed. | 
 |  | 
 |   set print_output [expr !$quiet] | 
 |   lassign [cmd_fnc "sshpass -p $password ssh -o StrictHostKeyChecking=no -k\ | 
 |     $username@$host\ | 
 |     grep -E '^[ ]*nameserver[ ]+' /etc/resolv.conf | awk '{print \$2}'"\ | 
 |     ${quiet} "" ${print_output}] rc name_servers | 
 |   return [split $name_servers "\n"] | 
 |  | 
 | } | 
 |  | 
 |  | 
 | proc get_host_mac_address {host username password {interface {}} {quiet 1}} { | 
 |  | 
 |   # Return the mac address of the host given a specific interface. | 
 |  | 
 |   # If "interface" is left blank, it is set to the default interface. | 
 |  | 
 |   # If this procedure is unable to get the requested information, it will | 
 |   # print an error message to stderr and return a blank value. | 
 |  | 
 |   # Description of argument(s): | 
 |   # host                            The host name or IP address of the system | 
 |   #                                 from which the information is to be | 
 |   #                                 obtained. | 
 |   # username                        The host username. | 
 |   # password                        The host password. | 
 |   # interface                       The target interface. Defaults to default | 
 |   #                                 interface if not set. | 
 |   # quiet                           Indicates whether status information | 
 |   #                                 should be printed. | 
 |  | 
 |   set print_output [expr !$quiet] | 
 |   set_var_default interface [get_host_default_interface $host $username\ | 
 |     $password $quiet] | 
 |   lassign [cmd_fnc "sshpass -p $password ssh -o StrictHostKeyChecking=no -k\ | 
 |     $username@$host 'cat /sys/class/net/$interface/address'" \ | 
 |     ${quiet} "" ${print_output}] rc mac_address | 
 |   return $mac_address | 
 |  | 
 | } | 
 |  | 
 |  | 
 | proc get_host_gateway {host username password {quiet 1}} { | 
 |  | 
 |   # Return the gateway of the host. | 
 |  | 
 |   # If this procedure is unable to get the requested information, it will | 
 |   # print an error message to stderr and return a blank value. | 
 |  | 
 |   # Description of argument(s): | 
 |   # host                            The host name or IP address of the system | 
 |   #                                 from which the information is to be | 
 |   #                                 obtained. | 
 |   # username                        The host username. | 
 |   # password                        The host password. | 
 |   # quiet                           Indicates whether status information | 
 |   #                                 should be printed. | 
 |  | 
 |   set print_output [expr !$quiet] | 
 |   lassign [cmd_fnc "sshpass -p $password ssh -o StrictHostKeyChecking=no -k\ | 
 |     $username@$host ip route | grep -i '^default' | awk '{print \$3}'" \ | 
 |     ${quiet} "" ${print_output}] rc gateway | 
 |   return $gateway | 
 |  | 
 | } | 
 |  | 
 |  | 
 | proc get_host_default_interface {host username password {quiet 1} } { | 
 |  | 
 |   # Return the default interface of the host interface. | 
 |  | 
 |   # If this procedure is unable to get the requested information, it will | 
 |   # print an error message to stderr and return a blank value. | 
 |  | 
 |   # Description of argument(s): | 
 |   # host                            The host name or IP address of the system | 
 |   #                                 from which the information is to be | 
 |   #                                 obtained. | 
 |   # username                        The host username. | 
 |   # password                        The host password. | 
 |   # quiet                           Indicates whether status information | 
 |   #                                 should be printed. | 
 |  | 
 |   set print_output [expr !$quiet] | 
 |   lassign [cmd_fnc "sshpass -p $password ssh -o StrictHostKeyChecking=no -k\ | 
 |     $username@$host ip route | grep -i '^default' | awk '{print \$5}'" \ | 
 |     ${quiet} "" ${print_output}] rc interface | 
 |   return $interface | 
 |  | 
 | } | 
 |  | 
 |  | 
 | proc get_host_netmask {host username password {interface {}} {quiet 1}} { | 
 |  | 
 |   # Return the subnet mask for the host. | 
 |  | 
 |   # If this procedure is unable to get the requested information, it will | 
 |   # print an error message to stderr and return a blank value. | 
 |  | 
 |   # Description of argument(s): | 
 |   # host                            The host name or IP address of the system | 
 |   #                                 from which the information is to be | 
 |   #                                 obtained. | 
 |   # username                        The host username. | 
 |   # password                        The host password. | 
 |   # interface                       The target interface. Defaults to default | 
 |   #                                 interface if not set. | 
 |   # quiet                           Indicates whether status information | 
 |   #                                 should be printed. | 
 |  | 
 |   set print_output [expr !$quiet] | 
 |   set sshpass_cmd \ | 
 |     "sshpass -p $password ssh -o StrictHostKeyChecking=no -k $username@$host" | 
 |   set_var_default interface [get_host_default_interface $host $username\ | 
 |     $password $quiet] | 
 |   lassign [cmd_fnc \ | 
 |     "$sshpass_cmd ifconfig $interface | grep -i mask"\ | 
 |     ${quiet} "" ${print_output}] rc out_buf | 
 |   if {[string match *broadcast* $out_buf]} { | 
 |     set mask_cmd "ifconfig $interface | grep ask | awk '{print \$4}'" | 
 |   } else { | 
 |     set mask_cmd "ifconfig $interface | grep ask | cut -d ':' -f 4" | 
 |   } | 
 |   lassign [cmd_fnc "$sshpass_cmd $mask_cmd" $quiet] rc netmask | 
 |   return $netmask | 
 |  | 
 | } |