#!/usr/bin/perl
# 
# This is an easier to read list of IPs and optional other details about the local network.
# When called without '--detailed', it shows interfaces with IPs and their MAC addresses. When called with
# '--detailed', it shows all interfaces, including their MTU and TX/RX data.
# 

use strict;
use warnings;
use Anvil::Tools;
use Data::Dumper;

$| = 1;

my $THIS_FILE           =  ($0 =~ /^.*\/(.*)$/)[0];
my $running_directory   =  ($0 =~ /^(.*?)\/$THIS_FILE$/)[0];
if (($running_directory =~ /^\./) && ($ENV{PWD}))
{
	$running_directory =~ s/^\./$ENV{PWD}/;
}

my $anvil = Anvil::Tools->new();

# Get switches
$anvil->Get->switches({list => ["detailed"], man => $THIS_FILE});
$anvil->Log->entry({source => $THIS_FILE, line => __LINE__, level => 2, key => "log_0115", variables => { program => $THIS_FILE }});

$anvil->Database->connect();
$anvil->Log->entry({source => $THIS_FILE, line => __LINE__, level => 1, key => "log_0132"});
if (not $anvil->data->{sys}{database}{connections})
{
	# No databases, exit.
	$anvil->Log->entry({source => $THIS_FILE, line => __LINE__, level => 0, 'print' => 1, priority => "err", key => "error_0359"});
	$anvil->nice_exit({exit_code => 1});
}

$anvil->data->{display}{lines} = [];
collect_data($anvil);
show_data($anvil);

# Show the results	
foreach my $line (@{$anvil->data->{display}{lines}})
{
	print $line."\n";
}

$anvil->nice_exit({exit_code => 0});


#############################################################################################################
# Functions                                                                                                 #
#############################################################################################################

sub collect_data
{
	my ($anvil) = @_;
	
	# Call ip
	$anvil->Network->get_ips({debug => 2});
	
	my $short_host_name = $anvil->Get->short_host_name();
	$anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => 2, list => { short_host_name => $short_host_name }});
	
	$anvil->data->{longest}{interface}      = 0;
	$anvil->data->{longest}{ip_address}     = 0;
	$anvil->data->{longest}{subnet_mask}    = 0;
	$anvil->data->{longest}{mac_address}    = 0;
	$anvil->data->{longest}{gateway_string} = 0;
	$anvil->data->{longest}{gateway_string} = 0;
	$anvil->data->{longest}{tx_string}      = 0;
	$anvil->data->{longest}{rx_string}      = 0;
	$anvil->data->{longest}{dns_string}     = 0;
	foreach my $interface (sort {$a cmp $b} keys %{$anvil->data->{network}{$short_host_name}{interface}})
	{
		my $ip_address      = $anvil->data->{network}{$short_host_name}{interface}{$interface}{ip};
		my $subnet_mask     = $anvil->data->{network}{$short_host_name}{interface}{$interface}{subnet_mask};
		my $mac_address     = $anvil->data->{network}{$short_host_name}{interface}{$interface}{mac_address};
		my $mtu             = $anvil->data->{network}{$short_host_name}{interface}{$interface}{mtu};
		my $default_gateway = $anvil->data->{network}{$short_host_name}{interface}{$interface}{default_gateway};
		my $gateway         = $anvil->data->{network}{$short_host_name}{interface}{$interface}{gateway};
		my $dns             = $anvil->data->{network}{$short_host_name}{interface}{$interface}{dns};
		my $tx_bytes        = $anvil->data->{network}{$short_host_name}{interface}{$interface}{tx_bytes};
		my $rx_bytes        = $anvil->data->{network}{$short_host_name}{interface}{$interface}{rx_bytes};
		$anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => 2, list => { 
			"s01:interface"       => $interface, 
			"s02:ip_address"      => $ip_address, 
			"s03:subnet_mask"     => $subnet_mask, 
			"s04:mac_address"     => $mac_address, 
			"s05:mtu"             => $mtu, 
			"s06:default_gateway" => $default_gateway, 
			"s07:gateway"         => $gateway, 
			"s08:dns"             => $dns, 
			"s09:tx_bytes"        => $tx_bytes, 
			"s10:rx_bytes"        => $rx_bytes, 
		}});
		
		if ((not $ip_address) && not ($anvil->data->{switches}{detailed}))
		{
			next;
		}
		
		my $say_is_dg   = $default_gateway ? "*"                 : " ";
		my $say_gateway = $gateway         ? $gateway.$say_is_dg : " ".$say_is_dg;
		my $say_tx      = $anvil->Convert->bytes_to_human_readable({'bytes' => $tx_bytes});
		my $say_rx      = $anvil->Convert->bytes_to_human_readable({'bytes' => $rx_bytes});
		$anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => 2, list => { 
			"s1:say_gateway" => $say_gateway, 
			"s2:say_is_dg"   => $say_is_dg, 
			"s3:tx_bytes"    => $say_tx, 
			"s4:rx_bytes"    => $say_rx, 
		}});
		
		$anvil->data->{interface_data}{$interface}{ip_address}     = $ip_address;
		$anvil->data->{interface_data}{$interface}{subnet_mask}    = $subnet_mask;
		$anvil->data->{interface_data}{$interface}{mac_address}    = $mac_address;
		$anvil->data->{interface_data}{$interface}{gateway_string} = $say_gateway;
		$anvil->data->{interface_data}{$interface}{tx_string}      = $say_tx;
		$anvil->data->{interface_data}{$interface}{rx_string}      = $say_rx;
		$anvil->data->{interface_data}{$interface}{dns_string}     = $dns;
		
		if (length($interface) > $anvil->data->{longest}{interface})
		{
			$anvil->data->{longest}{interface} = length($interface);
			$anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => 2, list => { 
				"longest::interface" => $anvil->data->{longest}{interface}, 
			}});
		}
		
		if (length($anvil->data->{interface_data}{$interface}{ip_address}) > $anvil->data->{longest}{ip_address})
		{
			$anvil->data->{longest}{ip_address} = length($anvil->data->{interface_data}{$interface}{ip_address});
			$anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => 2, list => { 
				"longest::ip_address" => $anvil->data->{longest}{ip_address}, 
			}});
		}
		
		if (length($anvil->data->{interface_data}{$interface}{subnet_mask}) > $anvil->data->{longest}{subnet_mask})
		{
			$anvil->data->{longest}{subnet_mask} = length($anvil->data->{interface_data}{$interface}{subnet_mask});
			$anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => 2, list => { 
				"longest::subnet_mask" => $anvil->data->{longest}{subnet_mask}, 
			}});
		}
		
		if (length($anvil->data->{interface_data}{$interface}{mac_address}) > $anvil->data->{longest}{mac_address})
		{
			$anvil->data->{longest}{mac_address} = length($anvil->data->{interface_data}{$interface}{mac_address});
			$anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => 2, list => { 
				"longest::mac_address" => $anvil->data->{longest}{mac_address}, 
			}});
		}
		
		if (length($anvil->data->{interface_data}{$interface}{gateway_string}) > $anvil->data->{longest}{gateway_string})
		{
			$anvil->data->{longest}{gateway_string} = length($anvil->data->{interface_data}{$interface}{gateway_string});
			$anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => 2, list => { 
				"longest::gateway_string" => $anvil->data->{longest}{gateway_string}, 
			}});
		}
		
		if (length($anvil->data->{interface_data}{$interface}{tx_string}) > $anvil->data->{longest}{tx_string})
		{
			$anvil->data->{longest}{tx_string} = length($anvil->data->{interface_data}{$interface}{tx_string});
			$anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => 2, list => { 
				"longest::tx_string" => $anvil->data->{longest}{tx_string}, 
			}});
		}
		
		if (length($anvil->data->{interface_data}{$interface}{rx_string}) > $anvil->data->{longest}{rx_string})
		{
			$anvil->data->{longest}{rx_string} = length($anvil->data->{interface_data}{$interface}{rx_string});
			$anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => 2, list => { 
				"longest::rx_string" => $anvil->data->{longest}{rx_string}, 
			}});
		}
		
		if (length($anvil->data->{interface_data}{$interface}{dns_string}) > $anvil->data->{longest}{dns_string})
		{
			$anvil->data->{longest}{dns_string} = length($anvil->data->{interface_data}{$interface}{dns_string});
			$anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => 2, list => { 
				"longest::dns_string" => $anvil->data->{longest}{dns_string}, 
			}});
		}
	}
	
	return(0);
}

sub show_data
{
	my ($anvil) = @_;
	
	my $interface_header       = $anvil->Words->string({key => "header_0082"});
	my $longest_interface      = length($interface_header)   > $anvil->data->{longest}{interface}   ? length($interface_header)   : $anvil->data->{longest}{interface};
	my $ip_address_header      = $anvil->Words->string({key => "header_0025"});
	my $longest_ip_address     = length($ip_address_header) > $anvil->data->{longest}{ip_address}   ? length($ip_address_header)  : $anvil->data->{longest}{ip_address};
	my $subnet_mask_header     = $anvil->Words->string({key => "striker_0025"});
	my $longest_subnet_mask    = length($subnet_mask_header) > $anvil->data->{longest}{subnet_mask} ? length($subnet_mask_header) : $anvil->data->{longest}{subnet_mask};
	my $mac_address_header     = $anvil->Words->string({key => "header_0002"});
	my $longest_mac_address    = length($mac_address_header) > $anvil->data->{longest}{mac_address} ? length($mac_address_header) : $anvil->data->{longest}{mac_address};
	my $gateway_header         = $anvil->Words->string({key => "header_0083"});
	my $longest_gateway_string = length($gateway_header) > $anvil->data->{longest}{gateway_string}  ? length($gateway_header)     : $anvil->data->{longest}{gateway_string};
	my $tx_header              = $anvil->Words->string({key => "header_0084"});
	my $longest_tx_string      = length($tx_header) > $anvil->data->{longest}{tx_string}            ? length($tx_header)          : $anvil->data->{longest}{tx_string};
	my $rx_header              = $anvil->Words->string({key => "header_0085"});
	my $longest_rx_string      = length($rx_header) > $anvil->data->{longest}{rx_string}            ? length($rx_header)          : $anvil->data->{longest}{rx_string};
	my $dns_header             = $anvil->Words->string({key => "striker_0037"});
	my $longest_dns_string     = length($dns_header) > $anvil->data->{longest}{dns_string}          ? length($dns_header)         : $anvil->data->{longest}{dns_string};
	$anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => 2, list => { 
		"s1:longest_interface"       => $longest_interface, 
		"s2:longest_ip_address"      => $longest_ip_address, 
		"s3:longest_subnet_mask"     => $longest_subnet_mask, 
		"s4:longest_mac_address"     => $longest_mac_address, 
		"s5:longest_gateway_string"  => $longest_gateway_string, 
	}});
	
	# Interface
	my $break_line  = "+-".sprintf("%0${longest_interface}d", 0);
	my $header_line = "| ".sprintf("%-${longest_interface}s", $interface_header);
	
	# IP Address
	$break_line  .= "-+-".sprintf("%0${longest_ip_address}d", 0);
	$header_line .= " | ".sprintf("%-${longest_ip_address}s", $ip_address_header);
	
	# Subnet Mask
	$break_line  .= "-+-".sprintf("%0${longest_subnet_mask}d", 0);
	$header_line .= " | ".sprintf("%-${longest_subnet_mask}s", $subnet_mask_header);
	
	# MAC Address
	$break_line  .= "-+-".sprintf("%0${longest_mac_address}d", 0);
	$header_line .= " | ".sprintf("%-${longest_mac_address}s", $mac_address_header);
	
	if ($anvil->data->{switches}{detailed})
	{
		# (DG) Gateway
		$break_line  .= "-+-".sprintf("%0${longest_gateway_string}d", 0);
		$header_line .= " | ".sprintf("%-${longest_gateway_string}s", $gateway_header);
		
		# Transmitted
		$break_line  .= "-+-".sprintf("%0${longest_tx_string}d", 0);
		$header_line .= " | ".sprintf("%-${longest_tx_string}s", $tx_header);
		
		# Received
		$break_line  .= "-+-".sprintf("%0${longest_rx_string}d", 0);
		$header_line .= " | ".sprintf("%-${longest_rx_string}s", $rx_header);
		
		# DNS
		$break_line  .= "-+-".sprintf("%0${longest_dns_string}d", 0);
		$header_line .= " | ".sprintf("%-${longest_dns_string}s", $dns_header);
	}
	$break_line  .= "-+";
	$header_line .= " |";
	
	$break_line =~ s/0/-/g;
	push @{$anvil->data->{display}{lines}}, $break_line;
	push @{$anvil->data->{display}{lines}}, $header_line;
	push @{$anvil->data->{display}{lines}}, $break_line;
	
	foreach my $interface (sort {$a cmp $b} keys %{$anvil->data->{interface_data}})
	{
		my $ip_address     = $anvil->data->{interface_data}{$interface}{ip_address};
		my $subnet_mask    = $anvil->data->{interface_data}{$interface}{subnet_mask};
		my $mac_address    = $anvil->data->{interface_data}{$interface}{mac_address};
		my $gateway_string = $anvil->data->{interface_data}{$interface}{gateway_string};
		my $tx_string      = $anvil->data->{interface_data}{$interface}{tx_string};
		my $rx_string      = $anvil->data->{interface_data}{$interface}{rx_string};
		my $dns_string     = $anvil->data->{interface_data}{$interface}{dns_string};
		
		my $interface_line =  "| ".sprintf("%-${longest_interface}s", $interface);
		   $interface_line .= " | ".sprintf("%-${longest_ip_address}s", $ip_address);
		   $interface_line .= " | ".sprintf("%-${longest_subnet_mask}s", $subnet_mask);
		   $interface_line .= " | ".sprintf("%-${longest_mac_address}s", $mac_address);
		if ($anvil->data->{switches}{detailed})
		{
			$interface_line .= " | ".sprintf("%-${longest_gateway_string}s", $gateway_string);
			$interface_line .= " | ".sprintf("%-${longest_tx_string}s", $tx_string);
			$interface_line .= " | ".sprintf("%-${longest_rx_string}s", $rx_string);
			$interface_line .= " | ".sprintf("%-${longest_dns_string}s", $dns_string);
		}
		$interface_line .= " |";
		   
		push @{$anvil->data->{display}{lines}}, $interface_line;
	}

	push @{$anvil->data->{display}{lines}}, $break_line;
	
	return(0);
}
