#!/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

}