#!/usr/bin/perl
#
###############################################################################
#                                                                             #
# IPFire.org - A linux based firewall                                         #
# Copyright (C) 2017-2020 Stephan Feddersen <sfeddersen@ipfire.org>           #
# All Rights Reserved.                                                        #
#                                                                             #
# This program is free software: you can redistribute it and/or modify        #
# it under the terms of the GNU General Public License as published by        #
# the Free Software Foundation, either version 3 of the License, or           #
# (at your option) any later version.                                         #
#                                                                             #
# This program is distributed in the hope that it will be useful,             #
# but WITHOUT ANY WARRANTY; without even the implied warranty of              #
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the               #
# GNU General Public License for more details.                                #
#                                                                             #
# You should have received a copy of the GNU General Public License           #
# along with this program.  If not, see <http://www.gnu.org/licenses/>.       #
#                                                                             #
###############################################################################
#
# Version: 2020/05/25 19:39:23
#
# This wio-lib.pl is based on the code from the IPCop WIO Addon
# and is extremly adapted to work with IPFire.
#
# Autor: Stephan Feddersen
# Co-Autor: Alexander Marx
# Co-Autor: Frank Mainz (for some code for the IPCop WIO Addon)
#

package WIO;

# enable only the following on debugging purpose
#use warnings;

use strict;
use Socket;
use Time::Local;
use MIME::Lite;

require '/var/ipfire/general-functions.pl';
require '/var/ipfire/header.pl';
require '/var/ipfire/lang.pl';

my %mailsettings = ();

&General::readhash('/var/ipfire/dma/mail.conf', \%mailsettings);

############################################################################################################################

sub getdyndnsip {
	my $ipadr = $_[0];
	my $host = $_[1];
	my @fetchip = ();

	if ( -e "/var/ipfire/red/active" ) {
		@fetchip = gethostbyname($host);

		if ( defined($fetchip[0]) ) {
			@fetchip = map ( &Socket::inet_ntoa($_), @fetchip[4..$#fetchip]);
			return ($fetchip[0], $Lang::tr{'wio_dyndns_success'});
		}
	}
	else {
		return ($ipadr, $Lang::tr{'wio_dyndns_info'});
	}
}

############################################################################################################################

sub contime {
	chomp(my $str = $_[0]);
	chomp(my $vpn = $_[1]);

	my %m = ();
	@m{qw/Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec/} = (0 .. 11);

	my $totalsecs = '';

	if ( $vpn eq 'ipsec' ) {
		my @temp = split (/ /, $str);

		if ( $temp[1] eq 'seconds' ) {
			$totalsecs = $temp[0];
		}

		if ( $temp[1] eq 'minutes' ) {
			$totalsecs = $temp[0] * 60;
		}

		if ( $temp[1] eq 'hours' ) {
			$totalsecs = $temp[0] * 3600;
		}

		if ( $temp[1] eq 'days' ) {
			$totalsecs = $temp[0] * 86400;
		}
	}

	if ( $vpn eq 'ovpn' ) {
		if ( $str =~ /^\w{3}\ ([a-zA-Z]+)\ (\d{1,2})\ (\d{2})\:(\d{2})\:(\d{2}) (\d{4})$/ ||
			 $str =~ /^\w{3}\ ([a-zA-Z]+)\  (\d{1})\ (\d{2})\:(\d{2})\:(\d{2}) (\d{4})$/ )
		{
			my $past = timelocal($5, $4, $3, $2, $m{$1}, $6);
			my $now  = time;
			$totalsecs = $now - $past;
		}
	}

	if ( $totalsecs ne '' )  {
		my $days = int($totalsecs / 86400);
		my $totalhours = int($totalsecs / 3600);
		my $hours = $totalhours % 24;
		my $totalmins = int($totalsecs / 60);
		my $mins = $totalmins % 60;
		my $secs = $totalsecs % 60;

		return "${days}d ${hours}h ${mins}m ${secs}s";
	}
	else {
		return;
	}
}

############################################################################################################################

sub statustime {
	my $str = $_[0];
	my ( $day, $mon ) = '';

	my %m = qw ( Jan 01 Feb 02 Mar 03 Apr 04 May 05 Jun 06 Jul 07 Aug 08 Sep 09 Oct 10 Nov 11 Dec 12 );

	if ( $str =~ /^\w{3}\ ([a-zA-Z]+)\ (\d{1,2})\ (\d{2})\:(\d{2})\:(\d{2}) (\d{4})$/ ||
		 $str =~ /^\w{3}\ ([a-zA-Z]+)\  (\d{1})\ (\d{2})\:(\d{2})\:(\d{2}) (\d{4})$/ )
	{
		$mon = $m{$1};

		if (length $2 < 2) { $day = "0$2"; }
		else { $day = $2; }

		return "$day.$mon.$6 - $3:$4:$5";
	}
	else {
		return;
	}
}

############################################################################################################################

sub mailsender {
	my $msg = '';

	$msg = MIME::Lite->new(
		From	=> $mailsettings{'SENDER'},
		To		=> $mailsettings{'RECIPIENT'},
		Subject	=> $_[0],
		Type	=> 'multipart/alternative'
	);

	$msg->attach(
		Type	=> 'TEXT',
		Data	=> $_[1]
	);

	$msg->send_by_sendmail;
}

############################################################################################################################

sub checkinto {
	my ($checkip, $checkhost, @checkfile) = @_;

	if ( $checkip ne '' ) {
		foreach (@checkfile) {
			chomp;
			if ( (split (/\,/, $_))[2] eq $checkip ) { return $Lang::tr{'wio_ip_exists'}; last; }
		}
	}

	if ( $checkhost ne '' ) {
		foreach (@checkfile) {
			chomp;
			if ( (split (/\,/, $_))[3] eq $checkhost ) {
				if ( $checkip ne '' ) {
					my $fileip = (split (/\,/, $_))[2];

					$fileip =~ /^(\d+)\.(\d+)\.(\d+)\.(\d+)$/;

					my $fileip1 = $1;
					my $fileip2 = $2;
					my $fileip3 = $3;
					my $fileip4 = $4;
					
					$checkip =~ /^(\d+)\.(\d+)\.(\d+)\.(\d+)$/;

					if ( $fileip1 == $1 && $fileip2 == $2 && $fileip3 == $3 ) {
						return $Lang::tr{'wio_host_exists'}; last; }
				}
				else { return $Lang::tr{'wio_host_exists'}; last; }
			}
		}
	}

	return;
}

############################################################################################################################

sub clearfile {
	my $file = $_[0];

	open(FILE, "> $file");
	close(FILE);
}

############################################################################################################################

sub color_devices() {
	my $output = shift;

	if ( uc($output) eq "GREEN0" ) { $output = "<b><font color ='$Header::colourgreen'>$output</b>";}
	elsif ( uc($output) eq "BLUE0" ) { $output = "<b><font color ='$Header::colourblue'>$output</b>"; }
	elsif ( uc($output) eq "ORANGE0" ) { $output = "<b><font color ='$Header::colourorange'>$output</b>"; }
	elsif ( uc($output) eq "RED0" ) { $output = "<b><font color ='$Header::colourred'>$output</b>"; }
	else { return $output = "<b><font color ='#696565'>$output</b>"; }

	return $output;
}

return 1;
