sub web_Email_Device_to_IP_CSV {
use List::Util qw(all min);

# Set this to an email address as default
my $mail_to= ''; # e.g. myEmail@example.com

# this email address is used if you set one in the HTTP call:
my $input_emailmail_address = cgi_param ('email_address')   || "";

# Body of the emailed report
my @body = "Device to IP Mapping Export .csv format";

# Subject line of the emailed report
my $subject = "Device to IP Mapping Export";

my %report_cfg = (
      table => [
         { header => "Device",     format => "header", class => "block-top" },
         { header => "IP Address", format => "text" },
      ],
   );
my $ip2name_ref;
my %dev2ip;
my @table;
my @table_display;
my $CSV_LOCK = "${HOME_RUN}/csv.lock";

# Checks if email address was added to http call.  If added then it will print out what was added and set the mail_to variable.
if ($input_emailmail_address eq ""){
print "using default email address\n";
}
else{
$mail_to = $input_emailmail_address;
print "user added email address\n";
}

print "$mail_to\n";

# Checks the mail_to variable to make sure it is set to something.
if ($mail_to ne ""){

$ip2name_ref = config_load_ip2name ();

   for my $ip (keys %{ $ip2name_ref }) {
      my $dev = $ip2name_ref->{$ip};
      push @{ $dev2ip{$dev} }, $ip;
   }

   for my $device (nat_sort keys %dev2ip) {
      my $url = html_link (2, $device, sprintf ("/device-editor?mode=display;device_list=%s", $device), "");
      
         # Seperate the ips with semicolon for csv download
         push @table, [ $url, join (";", nat_sort @{ $dev2ip{$device} }) ];
         
         #this is for the displayed table
         push @table_display, [ $url, join ("<br/>", nat_sort @{ $dev2ip{$device} }) ];
      
   }

# if you run the script under site scripting this will Print out the table on the right hand side.
# Uncomment the 2 lines if you want to see this.
# use Akips::GUI::HTMLTable;
# html_table (\%report_cfg, \@table_display);

# Start to create the csv file and send it to an email address
my $filename = "report";
my $csv_file;
my $time_str = strftime ("%Y%m%d.%H%M", localtime);
my $lock_hdl;
my @columns;
my @row;


# Naming the filename with a timestamp
$csv_file = sprintf ("%s/%s.%s.csv", $HOME_CSV, $filename, $time_str);

$lock_hdl = process_lock ($CSV_LOCK, LOCK_EX);

# Assigning the values that were gathered to variables
my ($cfg_ref, $data_ref) = @_;

     $cfg_ref = \%report_cfg;
     $data_ref = \@table;

my $limit = min (($cfg_ref->{limit} || scalar @{ $data_ref}), scalar @{ $data_ref});

# Opening the CSV file
   open (my $CSV, ">", $csv_file ) || EXIT_FATAL ("Can't open $csv_file: $!");

# build the csv column
   for my $col_ref (@{ $cfg_ref->{table} }) {
      $col_ref->{header} =~ s/\<(.*?)\>//mg;
      push (@columns, $col_ref->{header});
   }

print $CSV join (",", @columns), "\n";

# build the csv row
   for (my $row_i = 0; $row_i < $limit; $row_i++) {
      my $row_ref = $data_ref->[$row_i];
      @row = ();
      for (my $i = 0; $i < scalar @{ $cfg_ref->{table} }; $i++) {
         my $table_col = $cfg_ref->{table}->[$i];
  
         # Strip HTML tags from CSV output
         $row_ref->[$i] =~ s/\<(.*?)\>//mg;

         # Quote any data containing comma
         $row_ref->[$i] =~ s/(.*,.*)/"$1"/m;

         push (@row, $row_ref->[$i]);
      }

# Excludes empty lines from CSV output
      next if all { not defined } @row;

print $CSV join (",", @row), "\n";

   }
   
close $CSV;

      process_unlock ($lock_hdl);

# Email to mail_to address
mail ({ subject => $subject, to => $mail_to, body => \@body, attach => [$csv_file] });
print "Email with Device to IP csv $csv_file sent to $mail_to\n"
}

# End of if statement that makes sure there is an email address either added or set at the beginning of the script.

else{
print "No email address provided.  Please either add email address into http or set the mail_to variable in the script.
http://10.x.xx.2/api-script?password=password;function=web_Email_Device_to_IP_CSV;email_address={email address}" 
}# End of else for checking for email address

}