| Michael Walsh | a4d9210 | 2018-03-26 16:59:05 -0500 | [diff] [blame] | 1 | #!/usr/bin/wish | 
|  | 2 |  | 
| Michael Walsh | 410b178 | 2019-10-22 15:56:18 -0500 | [diff] [blame] | 3 | # This file provides valuable host and IP manipulation procedures such as get_host_name_ip, etc. | 
| Michael Walsh | a4d9210 | 2018-03-26 16:59:05 -0500 | [diff] [blame] | 4 |  | 
| Joy Onyerikwu | fcb8aea | 2018-03-21 14:57:44 -0500 | [diff] [blame] | 5 | my_source [list cmd.tcl data_proc.tcl] | 
| Michael Walsh | a4d9210 | 2018-03-26 16:59:05 -0500 | [diff] [blame] | 6 |  | 
|  | 7 |  | 
|  | 8 | proc get_host_name_ip {host {quiet 1}} { | 
|  | 9 |  | 
| Michael Walsh | 410b178 | 2019-10-22 15:56:18 -0500 | [diff] [blame] | 10 | # Get the host name, short host name and the IP address and return them as a list. | 
|  | 11 | # If this procedure is unable to get the requested information, it will print an error message to stderr | 
|  | 12 | # and return blank values. | 
| Michael Walsh | a4d9210 | 2018-03-26 16:59:05 -0500 | [diff] [blame] | 13 |  | 
|  | 14 | # Example call: | 
|  | 15 | # lassign [get_host_name_ip $host] host_name short_host_name ip_address | 
|  | 16 |  | 
|  | 17 | # Description of argument(s): | 
|  | 18 | # host                            The host name or IP address to be obtained. | 
| Michael Walsh | 410b178 | 2019-10-22 15:56:18 -0500 | [diff] [blame] | 19 | # quiet                           Indicates whether status information should be printed. | 
| Michael Walsh | a4d9210 | 2018-03-26 16:59:05 -0500 | [diff] [blame] | 20 |  | 
| Joy Onyerikwu | fcb8aea | 2018-03-21 14:57:44 -0500 | [diff] [blame] | 21 | set print_output [expr !$quiet] | 
| Michael Walsh | a4d9210 | 2018-03-26 16:59:05 -0500 | [diff] [blame] | 22 | lassign [cmd_fnc "host $host" "${quiet}" "" "${print_output}"] rc out_buf | 
|  | 23 | if { $rc != 0 } { return [list "" "" ""]} | 
|  | 24 |  | 
|  | 25 | if { [regexp "has address" $out_buf] } { | 
|  | 26 | # Host is host name. | 
|  | 27 | # Format of output: | 
|  | 28 | # hostname.bla.com has address n.n.n.n. | 
|  | 29 | lassign [split $out_buf " "] host_name fill1 fill2 ip_address | 
|  | 30 | } elseif { [regexp "domain name pointer" $out_buf] } { | 
|  | 31 | # Host is IP address. | 
|  | 32 | # Format of output: | 
|  | 33 | # n.n.n.n.in-addr.arpa domain name pointer hostname.bla.com. | 
|  | 34 | set ip_address ${host} | 
|  | 35 | lassign [split $out_buf " "] fill0 fill1 fill2 fill3 host_name | 
|  | 36 | set host_name [string trimright $host_name {.}] | 
|  | 37 | } | 
|  | 38 | # Create the short name from the host name. | 
|  | 39 | lassign [split $host_name "."] short_host_name | 
|  | 40 |  | 
|  | 41 | return [list ${host_name} ${short_host_name} ${ip_address}] | 
|  | 42 |  | 
|  | 43 | } | 
|  | 44 |  | 
| Joy Onyerikwu | fcb8aea | 2018-03-21 14:57:44 -0500 | [diff] [blame] | 45 |  | 
|  | 46 | proc get_host_domain {host username password {quiet 1}} { | 
|  | 47 |  | 
|  | 48 | # Return the domain name of the host. | 
|  | 49 |  | 
|  | 50 | # If this procedure is unable to get the requested information, it will | 
|  | 51 | # print an error message to stderr and return a blank value. | 
|  | 52 |  | 
|  | 53 | # Description of argument(s): | 
|  | 54 | # host                            The host name or IP address of the system | 
|  | 55 | #                                 from which the information is to be | 
|  | 56 | #                                 obtained. | 
|  | 57 | # username                        The host username. | 
|  | 58 | # password                        The host password. | 
|  | 59 | # quiet                           Indicates whether status information | 
|  | 60 | #                                 should be printed. | 
|  | 61 |  | 
|  | 62 | set print_output [expr !$quiet] | 
|  | 63 | lassign [cmd_fnc \ | 
|  | 64 | "sshpass -p $password ssh -o StrictHostKeyChecking=no -k $username@$host\ | 
|  | 65 | 'dnsdomainname'" ${quiet} "" ${print_output}] rc domain | 
|  | 66 | return $domain | 
|  | 67 |  | 
|  | 68 | } | 
|  | 69 |  | 
|  | 70 |  | 
|  | 71 | proc get_host_name_servers {host username password {quiet 1}} { | 
|  | 72 |  | 
|  | 73 | # Return a list of hostname or IP addresses. | 
|  | 74 |  | 
|  | 75 | # If this procedure is unable to get the requested information, it will | 
|  | 76 | # print an error message to stderr and return a blank value. | 
|  | 77 |  | 
|  | 78 | # Description of argument(s): | 
|  | 79 | # host                            The host name or IP address of the system | 
|  | 80 | #                                 from which the information is to be | 
|  | 81 | #                                 obtained. | 
|  | 82 | # username                        The host username. | 
|  | 83 | # password                        The host password. | 
|  | 84 | # quiet                           Indicates whether status information | 
|  | 85 | #                                 should be printed. | 
|  | 86 |  | 
|  | 87 | set print_output [expr !$quiet] | 
|  | 88 | lassign [cmd_fnc "sshpass -p $password ssh -o StrictHostKeyChecking=no -k\ | 
|  | 89 | $username@$host\ | 
|  | 90 | grep -E '^[ ]*nameserver[ ]+' /etc/resolv.conf | awk '{print \$2}'"\ | 
|  | 91 | ${quiet} "" ${print_output}] rc name_servers | 
|  | 92 | return [split $name_servers "\n"] | 
|  | 93 |  | 
|  | 94 | } | 
|  | 95 |  | 
|  | 96 |  | 
|  | 97 | proc get_host_mac_address {host username password {interface {}} {quiet 1}} { | 
|  | 98 |  | 
|  | 99 | # Return the mac address of the host given a specific interface. | 
|  | 100 |  | 
|  | 101 | # If "interface" is left blank, it is set to the default interface. | 
|  | 102 |  | 
|  | 103 | # If this procedure is unable to get the requested information, it will | 
|  | 104 | # print an error message to stderr and return a blank value. | 
|  | 105 |  | 
|  | 106 | # Description of argument(s): | 
|  | 107 | # host                            The host name or IP address of the system | 
|  | 108 | #                                 from which the information is to be | 
|  | 109 | #                                 obtained. | 
|  | 110 | # username                        The host username. | 
|  | 111 | # password                        The host password. | 
|  | 112 | # interface                       The target interface. Defaults to default | 
|  | 113 | #                                 interface if not set. | 
|  | 114 | # quiet                           Indicates whether status information | 
|  | 115 | #                                 should be printed. | 
|  | 116 |  | 
|  | 117 | set print_output [expr !$quiet] | 
|  | 118 | set_var_default interface [get_host_default_interface $host $username\ | 
|  | 119 | $password $quiet] | 
|  | 120 | lassign [cmd_fnc "sshpass -p $password ssh -o StrictHostKeyChecking=no -k\ | 
|  | 121 | $username@$host 'cat /sys/class/net/$interface/address'" \ | 
|  | 122 | ${quiet} "" ${print_output}] rc mac_address | 
|  | 123 | return $mac_address | 
|  | 124 |  | 
|  | 125 | } | 
|  | 126 |  | 
|  | 127 |  | 
|  | 128 | proc get_host_gateway {host username password {quiet 1}} { | 
|  | 129 |  | 
|  | 130 | # Return the gateway of the host. | 
|  | 131 |  | 
|  | 132 | # If this procedure is unable to get the requested information, it will | 
|  | 133 | # print an error message to stderr and return a blank value. | 
|  | 134 |  | 
|  | 135 | # Description of argument(s): | 
|  | 136 | # host                            The host name or IP address of the system | 
|  | 137 | #                                 from which the information is to be | 
|  | 138 | #                                 obtained. | 
|  | 139 | # username                        The host username. | 
|  | 140 | # password                        The host password. | 
|  | 141 | # quiet                           Indicates whether status information | 
|  | 142 | #                                 should be printed. | 
|  | 143 |  | 
|  | 144 | set print_output [expr !$quiet] | 
|  | 145 | lassign [cmd_fnc "sshpass -p $password ssh -o StrictHostKeyChecking=no -k\ | 
|  | 146 | $username@$host ip route | grep -i '^default' | awk '{print \$3}'" \ | 
|  | 147 | ${quiet} "" ${print_output}] rc gateway | 
|  | 148 | return $gateway | 
|  | 149 |  | 
|  | 150 | } | 
|  | 151 |  | 
|  | 152 |  | 
|  | 153 | proc get_host_default_interface {host username password {quiet 1} } { | 
|  | 154 |  | 
|  | 155 | # Return the default interface of the host interface. | 
|  | 156 |  | 
|  | 157 | # If this procedure is unable to get the requested information, it will | 
|  | 158 | # print an error message to stderr and return a blank value. | 
|  | 159 |  | 
|  | 160 | # Description of argument(s): | 
|  | 161 | # host                            The host name or IP address of the system | 
|  | 162 | #                                 from which the information is to be | 
|  | 163 | #                                 obtained. | 
|  | 164 | # username                        The host username. | 
|  | 165 | # password                        The host password. | 
|  | 166 | # quiet                           Indicates whether status information | 
|  | 167 | #                                 should be printed. | 
|  | 168 |  | 
|  | 169 | set print_output [expr !$quiet] | 
|  | 170 | lassign [cmd_fnc "sshpass -p $password ssh -o StrictHostKeyChecking=no -k\ | 
|  | 171 | $username@$host ip route | grep -i '^default' | awk '{print \$5}'" \ | 
|  | 172 | ${quiet} "" ${print_output}] rc interface | 
|  | 173 | return $interface | 
|  | 174 |  | 
|  | 175 | } | 
|  | 176 |  | 
|  | 177 |  | 
|  | 178 | proc get_host_netmask {host username password {interface {}} {quiet 1}} { | 
|  | 179 |  | 
|  | 180 | # Return the subnet mask for the host. | 
|  | 181 |  | 
|  | 182 | # If this procedure is unable to get the requested information, it will | 
|  | 183 | # print an error message to stderr and return a blank value. | 
|  | 184 |  | 
|  | 185 | # Description of argument(s): | 
|  | 186 | # host                            The host name or IP address of the system | 
|  | 187 | #                                 from which the information is to be | 
|  | 188 | #                                 obtained. | 
|  | 189 | # username                        The host username. | 
|  | 190 | # password                        The host password. | 
|  | 191 | # interface                       The target interface. Defaults to default | 
|  | 192 | #                                 interface if not set. | 
|  | 193 | # quiet                           Indicates whether status information | 
|  | 194 | #                                 should be printed. | 
|  | 195 |  | 
|  | 196 | set print_output [expr !$quiet] | 
|  | 197 | set sshpass_cmd \ | 
|  | 198 | "sshpass -p $password ssh -o StrictHostKeyChecking=no -k $username@$host" | 
|  | 199 | set_var_default interface [get_host_default_interface $host $username\ | 
|  | 200 | $password $quiet] | 
|  | 201 | lassign [cmd_fnc \ | 
|  | 202 | "$sshpass_cmd ifconfig $interface | grep -i mask"\ | 
|  | 203 | ${quiet} "" ${print_output}] rc out_buf | 
|  | 204 | if {[string match *broadcast* $out_buf]} { | 
|  | 205 | set mask_cmd "ifconfig $interface | grep ask | awk '{print \$4}'" | 
|  | 206 | } else { | 
|  | 207 | set mask_cmd "ifconfig $interface | grep ask | cut -d ':' -f 4" | 
|  | 208 | } | 
|  | 209 | lassign [cmd_fnc "$sshpass_cmd $mask_cmd" $quiet] rc netmask | 
|  | 210 | return $netmask | 
|  | 211 |  | 
|  | 212 | } |