Compare commits
	
		
			87 Commits
		
	
	
		
			11_0_0-25_
			...
			11_0_0-77_
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| accf96df0d | |||
| 1c601f0ace | |||
| cffbe53fb4 | |||
| aad1a458f4 | |||
| 252bf20410 | |||
| ebbe7af9a7 | |||
| 36de44fcef | |||
| 750ab7dd11 | |||
| 77ca17c851 | |||
| 535d78eacb | |||
| 88ee369253 | |||
| 5be2152e89 | |||
| 63973f2bb4 | |||
| 82ff48e641 | |||
| c5d863b3a0 | |||
| 4f00dfbdb1 | |||
| f9bf8cf064 | |||
| 4f0617f6c3 | |||
| 4c94d768e2 | |||
| 1731f75cba | |||
| 5fe285f9f2 | |||
| 1c93be6e8a | |||
| ce96f72726 | |||
| 0fd7137edd | |||
| d179b06f69 | |||
| c2427189d5 | |||
| 887af04bfe | |||
| 34b85b1cde | |||
| a5758b4431 | |||
| 58aa423089 | |||
| c0b4d1f90e | |||
| a979d472e8 | |||
| d776f20736 | |||
| a4668da720 | |||
| 7ad224998c | |||
| 3070e0656c | |||
| 642d013437 | |||
| a62968d2d9 | |||
| 0e777fd51a | |||
| eee68afa2b | |||
| c2d677594b | |||
| f6fe2216a0 | |||
| 6d3f8f48c2 | |||
| f8d9ec34e3 | |||
| 835d439e42 | |||
| 4797a1b189 | |||
| 1e4ec809b5 | |||
| d1197f55cf | |||
| b5d6de3bcf | |||
| ec4f515012 | |||
| 9b03d377e2 | |||
| 957d2ada21 | |||
| be49419eba | |||
| c1915a722b | |||
| 7ff51625c0 | |||
| 18c95a9021 | |||
| 5ef3a00a05 | |||
| 174e140a04 | |||
| d77b9bd341 | |||
| 746609ced0 | |||
| 9380ac0264 | |||
| a07bdf4aa5 | |||
| 4270814afc | |||
| 58c3f2348a | |||
| b58f82a332 | |||
| 8db1279a3e | |||
| 1d3d59b5c1 | |||
| ff9a84dd29 | |||
| 34e7331845 | |||
| dfda47882d | |||
| 55269fd685 | |||
| 1b1b99955b | |||
| c6eb08a727 | |||
| 8e70adc797 | |||
| 2424684d35 | |||
| 78bb7743c1 | |||
| 87f6a46502 | |||
| a08767919c | |||
| 2b83be6d70 | |||
| 6c1b6ed1f4 | |||
| 3fa8ab5eda | |||
| 55465e3081 | |||
| e5b9a012d9 | |||
| fbdf3170ec | |||
| 87d1d072c0 | |||
| d49db26f26 | |||
| c4f9d67abc | 
							
								
								
									
										1
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										1
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							@@ -2,3 +2,4 @@
 | 
			
		||||
*.log
 | 
			
		||||
*spec-20*
 | 
			
		||||
*.tar.xz
 | 
			
		||||
*.bak
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										11
									
								
								README.md
									
									
									
									
									
								
							
							
						
						
									
										11
									
								
								README.md
									
									
									
									
									
								
							@@ -13,7 +13,14 @@ SMEServer Koozali developed git repo for smeserver-manager smeserver
 | 
			
		||||
<br />https://wiki.koozali.org/Server_Manager_2_Howto_incorporate_a_legacy_contrib
 | 
			
		||||
 | 
			
		||||
## Bugzilla
 | 
			
		||||
Show list of outstanding bugs: [here](https://bugs.koozali.org/buglist.cgi?component=smeserver-manager&product=SME%20Server%2010.X&query_format=advanced&limit=0&bug_status=UNCONFIRMED&bug_status=NEW&bug_status=ASSIGNED&bug_status=REOPENED&bug_status=CONFIRMED)
 | 
			
		||||
Show list of outstanding bugs:
 | 
			
		||||
[All](https://bugs.koozali.org/buglist.cgi?action=wrap&bug_status=UNCONFIRMED&bug_status=CONFIRMED&bug_status=NEEDINFO&bug_status=IN_PROGRESS&bug_status=RESOLVED&bug_status=VERIFIED&cf_package=smeserver-manager&classification=SME+Server&list_id=105756&order=changeddate+DESC%2Ccomponent%2Cpriority%2Cbug_severity&query_format=advanced)  
 | 
			
		||||
[Confirmed](https://bugs.koozali.org/buglist.cgi?action=wrap&bug_status=CONFIRMED&cf_package=smeserver-manager&classification=SME+Server&order=changeddate+DESC%2Ccomponent%2Cpriority%2Cbug_severity&query_format=advanced)  
 | 
			
		||||
[Unconfirmed](https://bugs.koozali.org/buglist.cgi?action=wrap&bug_status=UNCONFIRMED&cf_package=smeserver-manager&classification=SME+Server&order=changeddate+DESC%2Ccomponent%2Cpriority%2Cbug_severity&query_format=advanced)  
 | 
			
		||||
[Need info](https://bugs.koozali.org/buglist.cgi?action=wrap&bug_status=NEEDINFO&cf_package=smeserver-manager&classification=SME+Server&order=changeddate+DESC%2Ccomponent%2Cpriority%2Cbug_severity&query_format=advanced)  
 | 
			
		||||
[In progress](https://bugs.koozali.org/buglist.cgi?action=wrap&bug_status=IN_PROGRESS&cf_package=smeserver-manager&classification=SME+Server&order=changeddate+DESC%2Ccomponent%2Cpriority%2Cbug_severity&query_format=advanced)  
 | 
			
		||||
[Resolved](https://bugs.koozali.org/buglist.cgi?action=wrap&bug_status=RESOLVED&cf_package=smeserver-manager&classification=SME+Server&order=changeddate+DESC%2Ccomponent%2Cpriority%2Cbug_severity&query_format=advanced)  
 | 
			
		||||
[Verified](https://bugs.koozali.org/buglist.cgi?action=wrap&bug_status=VERIFIED&cf_package=smeserver-manager&classification=SME+Server&order=changeddate+DESC%2Ccomponent%2Cpriority%2Cbug_severity&query_format=advanced)
 | 
			
		||||
 | 
			
		||||
## Description
 | 
			
		||||
 | 
			
		||||
@@ -72,4 +79,4 @@ Dependencies: Relies on specific packages and configurations of SME Server, and
 | 
			
		||||
 | 
			
		||||
### Summary
 | 
			
		||||
 | 
			
		||||
SMEserver-manager is a powerful tool that brings simplicity and efficiency to server management for small to medium-sized enterprises. By providing a centralized, web-based interface, it allows administrators to manage users, network settings, file sharing, email services, web hosting, and more, all from a single location.
 | 
			
		||||
SMEserver-manager is a powerful tool that brings simplicity and efficiency to server management for small to medium-sized enterprises. By providing a centralized, web-based interface, it allows administrators to manage users, network settings, file sharing, email services, web hosting, and more, all from a single location.
 | 
			
		||||
 
 | 
			
		||||
@@ -45,6 +45,7 @@ for my $event ( qw( smeserver-manager-update smanager-refresh bootstrap-console-
 | 
			
		||||
    event_link('locales2-conf', "$event", '80');
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
event_link('post-upgrade-and-reboot','post-upgrade-and-reboot',80);
 | 
			
		||||
event_link('systemd-default', "smeserver-manager-update", '88');
 | 
			
		||||
event_link('systemd-reload', "smeserver-manager-update", '89');
 | 
			
		||||
templates2events("/etc/rsyslog.conf", "smeserver-manager-update");
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										1
									
								
								root/etc/e-smith/events/actions/.perltidyrc
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								root/etc/e-smith/events/actions/.perltidyrc
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1 @@
 | 
			
		||||
-pbp -nst -nse -l=120 -ce -csc -pt=2 -kbl=0 -mbl=1 -lbl=1
 | 
			
		||||
@@ -1,218 +1,207 @@
 | 
			
		||||
#!/usr/bin/perl -w
 | 
			
		||||
 | 
			
		||||
#----------------------------------------------------------------------
 | 
			
		||||
# copyright (C) 1999-2006 Mitel Networks Corporation
 | 
			
		||||
# 
 | 
			
		||||
#
 | 
			
		||||
# 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 2 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, write to the Free Software
 | 
			
		||||
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307  USA
 | 
			
		||||
# 
 | 
			
		||||
#
 | 
			
		||||
#----------------------------------------------------------------------
 | 
			
		||||
package esmith;
 | 
			
		||||
use strict;
 | 
			
		||||
 | 
			
		||||
use constant SMNGR_LIB => '/usr/share/smanager/lib';
 | 
			
		||||
use constant I18NMODULES => 'SrvMngr/I18N/Modules';
 | 
			
		||||
use constant WEBFUNCTIONS => 'SrvMngr/Controller';
 | 
			
		||||
use constant NAVDIR => '/home/e-smith/db';
 | 
			
		||||
use constant SMNGR_LIB     => '/usr/share/smanager/lib';
 | 
			
		||||
use constant I18NMODULES   => 'SrvMngr/I18N/Modules';
 | 
			
		||||
use constant WEBFUNCTIONS  => 'SrvMngr/Controller';
 | 
			
		||||
use constant NAVDIR        => '/home/e-smith/db';
 | 
			
		||||
use constant NAVIGATIONDIR => 'navigation2';
 | 
			
		||||
use constant DEBUG => 0;
 | 
			
		||||
 | 
			
		||||
use constant DEBUG         => 0;
 | 
			
		||||
use esmith::NavigationDB;
 | 
			
		||||
use esmith::I18N;
 | 
			
		||||
 | 
			
		||||
use Data::Dumper;	# activate if DEBUG
 | 
			
		||||
 | 
			
		||||
use Data::Dumper;    # activate if DEBUG
 | 
			
		||||
binmode(STDOUT, ":encoding(UTF-8)");
 | 
			
		||||
 | 
			
		||||
my $navigation_ignore = 
 | 
			
		||||
	"(\.\.?|Swttheme\.pm|Login\.pm|Request\.pm|Modules\.pm(-.*)?)";
 | 
			
		||||
 | 
			
		||||
my $i18n = new esmith::I18N;
 | 
			
		||||
 | 
			
		||||
my $navigation_ignore = "(\.\.?|Swttheme\.pm|Login\.pm|Request\.pm|Modules\.pm(-.*)?)";
 | 
			
		||||
my $i18n              = new esmith::I18N;
 | 
			
		||||
my %navdbs;
 | 
			
		||||
 | 
			
		||||
opendir FUNCTIONS, SMNGR_LIB.'/'.WEBFUNCTIONS or 
 | 
			
		||||
    die "Couldn't open ", SMNGR_LIB.'/'.WEBFUNCTIONS, "\n";
 | 
			
		||||
my @files = grep (!/^${navigation_ignore}$/, readdir (FUNCTIONS));
 | 
			
		||||
opendir FUNCTIONS, SMNGR_LIB . '/' . WEBFUNCTIONS
 | 
			
		||||
    or die "Couldn't open ", SMNGR_LIB . '/' . WEBFUNCTIONS, "\n";
 | 
			
		||||
my @files = grep (!/^${navigation_ignore}$/, readdir(FUNCTIONS));
 | 
			
		||||
closedir FUNCTIONS;
 | 
			
		||||
my @langs = $i18n->availableLanguages();
 | 
			
		||||
 | 
			
		||||
my @langs = $i18n->availableLanguages(); 
 | 
			
		||||
#my @langs = ('tr');  #Temp override
 | 
			
		||||
foreach my $lang (@langs) {
 | 
			
		||||
    my $long_lex = SMNGR_LIB . '/' . I18NMODULES . "/General/general_$lang.lex";
 | 
			
		||||
    next unless (-e $long_lex);
 | 
			
		||||
    open(LEX, '<:encoding(UTF-8)', $long_lex)
 | 
			
		||||
        or die "Couldn't open ", $long_lex, " for reading.\n";
 | 
			
		||||
    my @gen_lex = <LEX>;
 | 
			
		||||
    close LEX;
 | 
			
		||||
 | 
			
		||||
    #my @files = ('Portforwarding.pm');  #Temp override
 | 
			
		||||
    foreach my $file (@files) {
 | 
			
		||||
        next if (-d SMNGR_LIB . '/' . WEBFUNCTIONS . "/$file");
 | 
			
		||||
 | 
			
		||||
foreach my $lang (@langs)
 | 
			
		||||
{
 | 
			
		||||
	my $long_lex = SMNGR_LIB.'/'.I18NMODULES."/General/general_$lang.lex";
 | 
			
		||||
	next unless ( -e $long_lex );
 | 
			
		||||
        #        next unless ( $file =~ m/D.*\.pm$/ );
 | 
			
		||||
        next unless ($file =~ m/[A-Z].*\.pm$/);
 | 
			
		||||
        my $file2 = lc($file);
 | 
			
		||||
        $file2 =~ s/\.pm$//;
 | 
			
		||||
 | 
			
		||||
	open(LEX, '<:encoding(UTF-8)', $long_lex)
 | 
			
		||||
		 or die "Couldn't open ", $long_lex, " for reading.\n";
 | 
			
		||||
	my @gen_lex = <LEX>;
 | 
			
		||||
	close LEX;
 | 
			
		||||
        #--------------------------------------------------
 | 
			
		||||
        # extract heading, description and weight information
 | 
			
		||||
        # from Mojo controller
 | 
			
		||||
        #--------------------------------------------------
 | 
			
		||||
        open(SCRIPT, SMNGR_LIB . '/' . WEBFUNCTIONS . "/$file");
 | 
			
		||||
        my $heading            = undef;
 | 
			
		||||
        my $description        = undef;
 | 
			
		||||
        my $heading_weight     = undef;
 | 
			
		||||
        my $description_weight = undef;
 | 
			
		||||
        my $menucat            = undef;
 | 
			
		||||
        my $routes             = undef;
 | 
			
		||||
 | 
			
		||||
	#my @files = ('Portforwarding.pm');  #Temp override
 | 
			
		||||
	foreach my $file (@files)
 | 
			
		||||
	{
 | 
			
		||||
		next if (-d SMNGR_LIB.'/'.WEBFUNCTIONS . "/$file");
 | 
			
		||||
		#        next unless ( $file =~ m/D.*\.pm$/ );
 | 
			
		||||
			next unless ( $file =~ m/[A-Z].*\.pm$/ );
 | 
			
		||||
        while (<SCRIPT>) {
 | 
			
		||||
            $heading     = $1 if (/^\s*#\s*heading\s*:\s*(.+?)\s*$/);
 | 
			
		||||
            $description = $1
 | 
			
		||||
                if (/^\s*#\s*description\s*:\s*(.+?)\s*$/);
 | 
			
		||||
            ($heading_weight, $description_weight) = ($1, $2)
 | 
			
		||||
                if (/^\s*#\s*navigation\s*:\s*(\d+?)\s+(\d+?)\s*$/);
 | 
			
		||||
            $menucat = $1
 | 
			
		||||
                if (/^\s*#\s*menu\s*:\s*(.+?)\s*$/);
 | 
			
		||||
            last
 | 
			
		||||
                if (defined $heading
 | 
			
		||||
                and defined $description
 | 
			
		||||
                and defined $heading_weight
 | 
			
		||||
                and defined $description_weight
 | 
			
		||||
                and defined $menucat);
 | 
			
		||||
 | 
			
		||||
		my $file2 = lc($file);
 | 
			
		||||
		$file2 =~ s/\.pm$//;
 | 
			
		||||
		#-------------------------------------------------- 
 | 
			
		||||
		# extract heading, description and weight information
 | 
			
		||||
		# from Mojo controller
 | 
			
		||||
		#-------------------------------------------------- 
 | 
			
		||||
		open(SCRIPT, SMNGR_LIB.'/'.WEBFUNCTIONS . "/$file");
 | 
			
		||||
		my $heading            	= undef;
 | 
			
		||||
		my $description        	= undef;
 | 
			
		||||
		my $heading_weight     	= undef;
 | 
			
		||||
		my $description_weight 	= undef;
 | 
			
		||||
		my $menucat		= undef;
 | 
			
		||||
		my $routes		= undef;
 | 
			
		||||
            # routes : end  (stop before eof if 'menu' is not here before 'routes'!!!
 | 
			
		||||
            $routes = $1 if (/^\s*#\s*routes\s*:\s*(.+?)\s*$/);
 | 
			
		||||
            last         if (defined $routes and $routes eq 'end');
 | 
			
		||||
        } ## end while (<SCRIPT>)
 | 
			
		||||
        close SCRIPT;
 | 
			
		||||
        print "updating script $file for lang $lang\n" if DEBUG;
 | 
			
		||||
        my $navdb   = $navdbs{$lang};
 | 
			
		||||
        my $navinfo = NAVDIR . '/' . NAVIGATIONDIR . "/navigation.$lang";
 | 
			
		||||
        $navdb ||= esmith::NavigationDB->open($navinfo);
 | 
			
		||||
        $navdb ||= esmith::NavigationDB->create($navinfo)
 | 
			
		||||
            or die "Couldn't create $navinfo\n";
 | 
			
		||||
        $navdbs{$lang} ||= $navdb;
 | 
			
		||||
        my $rec = $navdb->get($file2)
 | 
			
		||||
            || $navdb->new_record($file2, { type => 'panel' });
 | 
			
		||||
        my @panel_lex = ();
 | 
			
		||||
        $long_lex = SMNGR_LIB . '/' . I18NMODULES . '/' . ucfirst($file2) . "/${file2}_$lang.lex";
 | 
			
		||||
 | 
			
		||||
		while ( <SCRIPT> )
 | 
			
		||||
		{
 | 
			
		||||
			$heading = $1 if (/^\s*#\s*heading\s*:\s*(.+?)\s*$/);
 | 
			
		||||
			$description = $1 
 | 
			
		||||
			if (/^\s*#\s*description\s*:\s*(.+?)\s*$/);
 | 
			
		||||
			($heading_weight, $description_weight) = ($1, $2) 
 | 
			
		||||
			if (/^\s*#\s*navigation\s*:\s*(\d+?)\s+(\d+?)\s*$/);
 | 
			
		||||
			$menucat = $1 
 | 
			
		||||
			if (/^\s*#\s*menu\s*:\s*(.+?)\s*$/);
 | 
			
		||||
        if (-e $long_lex) {
 | 
			
		||||
            open(LEX, '<:encoding(UTF-8)', $long_lex)
 | 
			
		||||
                or die "Couldn't open ", $long_lex, " for reading.\n";
 | 
			
		||||
            @panel_lex = <LEX>;
 | 
			
		||||
            close LEX;
 | 
			
		||||
        } ## end if (-e $long_lex)
 | 
			
		||||
 | 
			
		||||
			last if (defined $heading and 
 | 
			
		||||
			defined $description and
 | 
			
		||||
			defined $heading_weight and
 | 
			
		||||
			defined $description_weight and
 | 
			
		||||
			defined $menucat);
 | 
			
		||||
        #Extract the prefix for this module
 | 
			
		||||
        my @keys   = values @panel_lex;    # Get all values from the array
 | 
			
		||||
        my $i      = 0;                    # Initialize the index
 | 
			
		||||
        my $found  = 0;                    # Flag to check if the prefix was found
 | 
			
		||||
        my $prefix = "xx_";                # Probably never match!!
 | 
			
		||||
 | 
			
		||||
			# routes : end  (stop before eof if 'menu' is not here before 'routes'!!!
 | 
			
		||||
			$routes = $1 if (/^\s*#\s*routes\s*:\s*(.+?)\s*$/);
 | 
			
		||||
			last if (defined $routes and $routes eq 'end');
 | 
			
		||||
		}
 | 
			
		||||
		close SCRIPT;
 | 
			
		||||
        while ($i < @keys) {               # Loop until we run out of entries
 | 
			
		||||
            my $extracted_value = $keys[$i] || "";    # The current entry
 | 
			
		||||
                                                      #print("Extracted val: ".$extracted_value."\n");
 | 
			
		||||
 | 
			
		||||
		print "updating script $file for lang $lang\n"if DEBUG;
 | 
			
		||||
		my $navdb = $navdbs{$lang};
 | 
			
		||||
		my $navinfo = NAVDIR.'/'.NAVIGATIONDIR . "/navigation.$lang";
 | 
			
		||||
		$navdb ||= esmith::NavigationDB->open($navinfo);
 | 
			
		||||
		$navdb ||= esmith::NavigationDB->create($navinfo) or
 | 
			
		||||
			die "Couldn't create $navinfo\n";
 | 
			
		||||
			$navdbs{$lang} ||= $navdb;
 | 
			
		||||
		my $rec = $navdb->get($file2) || 
 | 
			
		||||
			$navdb->new_record($file2, { type => 'panel' } );
 | 
			
		||||
		
 | 
			
		||||
		my @panel_lex = ();
 | 
			
		||||
		$long_lex = SMNGR_LIB.'/'.I18NMODULES.'/'.ucfirst($file2)."/${file2}_$lang.lex";
 | 
			
		||||
		if ( -e $long_lex ) {
 | 
			
		||||
			open(LEX, '<:encoding(UTF-8)', $long_lex)
 | 
			
		||||
				 or die "Couldn't open ", $long_lex, " for reading.\n";
 | 
			
		||||
			@panel_lex = <LEX>;
 | 
			
		||||
			close LEX;
 | 
			
		||||
		}
 | 
			
		||||
		#Extract the prefix for this module
 | 
			
		||||
		my @keys = values @panel_lex;  # Get all values from the array
 | 
			
		||||
		
 | 
			
		||||
		my $i = 0;                    # Initialize the index
 | 
			
		||||
		my $found = 0;                # Flag to check if the prefix was found
 | 
			
		||||
		my $prefix = "xx_";			  # Probably never match!!
 | 
			
		||||
            # Extract prefix from the second value (up to and including the first underscore)
 | 
			
		||||
            #my ($prefix) = $second_value =~ /^'(.*?_)/;  # Match everything up to and including the first underscore
 | 
			
		||||
            ($prefix) = $extracted_value =~ /^'(.*?_)/;    # Match everything up to and including the first underscore
 | 
			
		||||
 | 
			
		||||
		while ($i < @keys) {          # Loop until we run out of entries
 | 
			
		||||
			my $extracted_value = $keys[$i] || "";  # The current entry
 | 
			
		||||
			#print("Extracted val: ".$extracted_value."\n");
 | 
			
		||||
            if (defined $prefix) {
 | 
			
		||||
                $found = 1;                                # Set found flag to true
 | 
			
		||||
                last;                                      # Exit the loop if prefix is found
 | 
			
		||||
            } else {
 | 
			
		||||
 | 
			
		||||
			# Extract prefix from the second value (up to and including the first underscore)
 | 
			
		||||
			#my ($prefix) = $second_value =~ /^'(.*?_)/;  # Match everything up to and including the first underscore
 | 
			
		||||
			($prefix) = $extracted_value =~ /^'(.*?_)/;  # Match everything up to and including the first underscore
 | 
			
		||||
			
 | 
			
		||||
			if (defined $prefix) {
 | 
			
		||||
				$found = 1;           # Set found flag to true
 | 
			
		||||
				last;                 # Exit the loop if prefix is found
 | 
			
		||||
			} else {
 | 
			
		||||
				#print("Extracted Val: " . $extracted_value . "\n");
 | 
			
		||||
			}
 | 
			
		||||
                #print("Extracted Val: " . $extracted_value . "\n");
 | 
			
		||||
            }
 | 
			
		||||
            $i++;                                          # Increment the index to check the next entry
 | 
			
		||||
        } ## end while ($i < @keys)
 | 
			
		||||
 | 
			
		||||
			$i++;                     # Increment the index to check the next entry
 | 
			
		||||
		}
 | 
			
		||||
        if (!$found) {
 | 
			
		||||
            #print(STDERR "No valid prefix found in any entries: " . $file2 . " (" . $lang . ")\n");    # if DEBUG;
 | 
			
		||||
            $prefix = "xx_";    # Probably never match!!
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
		if (!$found) {
 | 
			
		||||
			print(STDERR "No valid prefix found in any entries: ".$file2." (".$lang.")\n"); # if DEBUG;
 | 
			
		||||
			$prefix = "xx_";			  # Probably never match!!
 | 
			
		||||
			
 | 
			
		||||
		}
 | 
			
		||||
		#print("Prefix: ".$prefix." ".$file2." (".$lang.")\n");
 | 
			
		||||
		
 | 
			
		||||
		my %Lexicon = ();
 | 
			
		||||
		push(@panel_lex, @gen_lex);
 | 
			
		||||
		my $top_error = 0;
 | 
			
		||||
        #print("Prefix: ".$prefix." ".$file2." (".$lang.")\n");
 | 
			
		||||
        my %Lexicon = ();
 | 
			
		||||
        push(@panel_lex, @gen_lex);
 | 
			
		||||
        my $top_error = 0;
 | 
			
		||||
        chomp @panel_lex;
 | 
			
		||||
 | 
			
		||||
		chomp @panel_lex;
 | 
			
		||||
		for (@panel_lex) {
 | 
			
		||||
			next unless $_;	# first one empty
 | 
			
		||||
			my ($k, $v) = split / => /, $_;
 | 
			
		||||
		#	errors on split to $v (use DEBUG to see)
 | 
			
		||||
			if ( $k and $v ) {
 | 
			
		||||
				$k =~ s/\'//g;
 | 
			
		||||
				$v =~ s/\'//g;
 | 
			
		||||
				$v =~ s/,$//g;
 | 
			
		||||
				$Lexicon{ lc($k) } = $v;
 | 
			
		||||
			} else {
 | 
			
		||||
				$k = "?" unless ($k);
 | 
			
		||||
				print STDERR "Error for $lang $file2 on $k \n" if DEBUG;
 | 
			
		||||
				$top_error++;
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
		if ( $top_error > 0) {
 | 
			
		||||
			if ( DEBUG ) {
 | 
			
		||||
				print STDERR "$top_error errors for $lang $file2\n";
 | 
			
		||||
				#		print Dumper(\@panel_lex);
 | 
			
		||||
				#		print Dumper(\%Lexicon);
 | 
			
		||||
				#		exit 1;
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
		$heading = "" unless defined $heading;
 | 
			
		||||
		$description = "" unless defined $description;
 | 
			
		||||
		# Get the base language code from $lang
 | 
			
		||||
		my $base_lang = (split('-', $lang))[0];
 | 
			
		||||
		my $loc_heading =  process_localization( \%Lexicon, $heading, $lang, $prefix );
 | 
			
		||||
		my $loc_description =  process_localization( \%Lexicon, $description, $lang, $prefix );
 | 
			
		||||
		$loc_heading =~ s/^\s*(\w.*?)\s*$/$1/;
 | 
			
		||||
		$loc_description =~ s/^\s*(\w.*?)\s*$/$1/;
 | 
			
		||||
        for (@panel_lex) {
 | 
			
		||||
            next unless $_;     # first one empty
 | 
			
		||||
            my ($k, $v) = split / => /, $_;
 | 
			
		||||
 | 
			
		||||
		$rec->merge_props(
 | 
			
		||||
			Heading => $loc_heading,
 | 
			
		||||
			Description => $loc_description,
 | 
			
		||||
			HeadingWeight => localise( \%Lexicon, $heading_weight ),
 | 
			
		||||
			DescriptionWeight => localise( \%Lexicon, $description_weight ),
 | 
			
		||||
			MenuCat => (defined $menucat ? $menucat : 'A'));
 | 
			
		||||
	}
 | 
			
		||||
	#warn "trying to close for lang $lang\n";
 | 
			
		||||
	my $navdb = $navdbs{$lang};
 | 
			
		||||
	$navdb->close();
 | 
			
		||||
}
 | 
			
		||||
            #	errors on split to $v (use DEBUG to see)
 | 
			
		||||
            if ($k and $v) {
 | 
			
		||||
                $k =~ s/\'//g;
 | 
			
		||||
                $v =~ s/\'//g;
 | 
			
		||||
                $v =~ s/,$//g;
 | 
			
		||||
                $Lexicon{ lc($k) } = $v;
 | 
			
		||||
            } else {
 | 
			
		||||
                $k = "?" unless ($k);
 | 
			
		||||
                print STDERR "Error for $lang $file2 on $k \n" if DEBUG;
 | 
			
		||||
                $top_error++;
 | 
			
		||||
            }
 | 
			
		||||
        } ## end for (@panel_lex)
 | 
			
		||||
 | 
			
		||||
        if ($top_error > 0) {
 | 
			
		||||
            if (DEBUG) {
 | 
			
		||||
                print STDERR "$top_error errors for $lang $file2\n";
 | 
			
		||||
 | 
			
		||||
                #		print Dumper(\@panel_lex);
 | 
			
		||||
                #		print Dumper(\%Lexicon);
 | 
			
		||||
                #		exit 1;
 | 
			
		||||
            } ## end if (DEBUG)
 | 
			
		||||
        } ## end if ($top_error > 0)
 | 
			
		||||
        $heading     = "" unless defined $heading;
 | 
			
		||||
        $description = "" unless defined $description;
 | 
			
		||||
 | 
			
		||||
        # Get the base language code from $lang
 | 
			
		||||
        my $base_lang       = (split('-', $lang))[0];
 | 
			
		||||
        my $loc_heading     = process_localization(\%Lexicon, $heading,     $lang, $prefix);
 | 
			
		||||
        my $loc_description = process_localization(\%Lexicon, $description, $lang, $prefix);
 | 
			
		||||
        $loc_heading     =~ s/^\s*(\w.*?)\s*$/$1/;
 | 
			
		||||
        $loc_description =~ s/^\s*(\w.*?)\s*$/$1/;
 | 
			
		||||
        $rec->merge_props(
 | 
			
		||||
            Heading           => $loc_heading,
 | 
			
		||||
            Description       => $loc_description,
 | 
			
		||||
            HeadingWeight     => localise(\%Lexicon, $heading_weight),
 | 
			
		||||
            DescriptionWeight => localise(\%Lexicon, $description_weight),
 | 
			
		||||
            MenuCat           => (defined $menucat ? $menucat : 'A')
 | 
			
		||||
        );
 | 
			
		||||
    } ## end foreach my $file (@files)
 | 
			
		||||
 | 
			
		||||
    #warn "trying to close for lang $lang\n";
 | 
			
		||||
    my $navdb = $navdbs{$lang};
 | 
			
		||||
    $navdb->close();
 | 
			
		||||
} ## end foreach my $lang (@langs)
 | 
			
		||||
 | 
			
		||||
sub localise {
 | 
			
		||||
    my ($lexicon, $string) = @_;
 | 
			
		||||
 | 
			
		||||
    #print("Looking up:".$string."\n");
 | 
			
		||||
    $string  = "" unless defined $string;
 | 
			
		||||
    $string = "" unless defined $string;
 | 
			
		||||
    my $lc_string = lc($string);
 | 
			
		||||
    my $res = $lexicon->{$lc_string} || $string;
 | 
			
		||||
    my $res       = $lexicon->{$lc_string} || $string;
 | 
			
		||||
 | 
			
		||||
    #print("Returning:".$res."\n");
 | 
			
		||||
    return $res;
 | 
			
		||||
}
 | 
			
		||||
} ## end sub localise
 | 
			
		||||
 | 
			
		||||
# Subroutine to process localization
 | 
			
		||||
sub process_localization {
 | 
			
		||||
@@ -226,15 +215,17 @@ sub process_localization {
 | 
			
		||||
 | 
			
		||||
    # Check the condition
 | 
			
		||||
    if ($loc_heading eq $heading && $base_lang ne 'en') {
 | 
			
		||||
 | 
			
		||||
        # Construct the new key by combining the prefix and the original heading
 | 
			
		||||
        my $key = $prefix . $heading;
 | 
			
		||||
 | 
			
		||||
        # Localize using the constructed key
 | 
			
		||||
        $loc_heading = localise($lexicon_ref, $key);
 | 
			
		||||
 | 
			
		||||
        # See if it got a hit
 | 
			
		||||
        if ($loc_heading eq $key){
 | 
			
		||||
			$loc_heading = $heading;
 | 
			
		||||
		}
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    return $loc_heading; # Optionally return the localized heading
 | 
			
		||||
}
 | 
			
		||||
        if ($loc_heading eq $key) {
 | 
			
		||||
            $loc_heading = $heading;
 | 
			
		||||
        }
 | 
			
		||||
    } ## end if ($loc_heading eq $heading...)
 | 
			
		||||
    return $loc_heading;    # Optionally return the localized heading
 | 
			
		||||
} ## end sub process_localization
 | 
			
		||||
							
								
								
									
										3
									
								
								root/etc/e-smith/events/actions/post-upgrade-and-reboot
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										3
									
								
								root/etc/e-smith/events/actions/post-upgrade-and-reboot
									
									
									
									
									
										Executable file
									
								
							@@ -0,0 +1,3 @@
 | 
			
		||||
#!/bin/bash
 | 
			
		||||
/usr/sbin/e-smith/signal-event post-upgrade
 | 
			
		||||
/usr/sbin/e-smith/signal-event reboot
 | 
			
		||||
@@ -39,7 +39,18 @@
 | 
			
		||||
            $OUT .= "#       private access by default\n";
 | 
			
		||||
            $OUT .= "        Require ip $localAccess $externalSSLAccess\n";
 | 
			
		||||
        }
 | 
			
		||||
        $OUT .= "    </Location>\n";
 | 
			
		||||
        # any smanager script or style added in line should be hashed and added here to run in a modern browser
 | 
			
		||||
        $OUT .= "                   Header set Content-Security-Policy  \"script-src 'self' 'unsafe-eval' 'unsafe-hashes' "
 | 
			
		||||
        ." 'sha256-X8Qwlk0M9iDTQZqFVpbVcThRjBqQXpwTOZCLX8I+Frk=' 'sha256-inQ04nmqTZI75Z5g/tAzjahedNugPFfrhxHyoFezFkM=' 'sha256-5IsIX+Vbow7wwy2RjR3+5X06R/0CQZPkw3OHj/228cM=' 'sha256-tfVskwioRaNsV75h89itf7FujMgIrodfs1Ea4UAJNpE=' 'sha256-P51OyslUh5bGkoWk9qY+o4Su4HuwNFoQcFCeNxF7Ms8=' ; "
 | 
			
		||||
        ." style-src 'self'  'unsafe-hashes' "
 | 
			
		||||
        #'sha256-EhT63KK1JBrsUM27H+5RMNifDFpVB+GXcTtavKXwCK8=' #h2l1
 | 
			
		||||
        #'sha256-msdEhWmYTu7vqzGaQHDfvy6lzlDsbKkouwvN2R6Co9E=' #busy-indicator
 | 
			
		||||
        #'sha256-iYwYhiMcsGmXCUzLEpEzZNz5dINrlkqf1sLbLhEcqGM=' _footer.html.ep style="position:relative;"
 | 
			
		||||
        #'sha256-bOTFT8zacR4Rfja/WIKXgAQQXVaPyG3oBlvAhU4ga8g=' _usr_list style="min-width:35em"
 | 
			
		||||
        #'sha256-CP93jJ1Y8nMwUoDzFbo1srdgsbADPasAc0Wjig1ahpY=' groups style="min-width:15em"
 | 
			
		||||
        ." 'sha256-msdEhWmYTu7vqzGaQHDfvy6lzlDsbKkouwvN2R6Co9E=' 'sha256-iYwYhiMcsGmXCUzLEpEzZNz5dINrlkqf1sLbLhEcqGM='  'sha256-bOTFT8zacR4Rfja/WIKXgAQQXVaPyG3oBlvAhU4ga8g=' 'sha256-CP93jJ1Y8nMwUoDzFbo1srdgsbADPasAc0Wjig1ahpY=' 'sha256-EhT63KK1JBrsUM27H+5RMNifDFpVB+GXcTtavKXwCK8=' ;"
 | 
			
		||||
	." \"\n"; 
 | 
			
		||||
	$OUT .= "    </Location>\n";
 | 
			
		||||
        # prevent caching of manager files in browser
 | 
			
		||||
        $OUT .= "   <LocationMatch \"/$place/.+\.(html|cgi)\$\">\n";
 | 
			
		||||
        $OUT .= "                   Header set Cache-Control no-store\n";
 | 
			
		||||
 
 | 
			
		||||
@@ -1,250 +0,0 @@
 | 
			
		||||
{
 | 
			
		||||
    $OUT = <<'EOF';
 | 
			
		||||
 | 
			
		||||
/*	from e-smith-manager to smanager (smeserver_manager2)  */
 | 
			
		||||
 | 
			
		||||
/*----------------------------------------------------------------------
 | 
			
		||||
 * copyright (C) 1999-2003 Mitel Networks Corporation
 | 
			
		||||
 *
 | 
			
		||||
 * 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 2 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, write to the Free Software
 | 
			
		||||
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307  USA
 | 
			
		||||
 *
 | 
			
		||||
 * Technical support for this program is available from Mitel Networks
 | 
			
		||||
 * Please visit our web site www.mitel.com for details.
 | 
			
		||||
 *----------------------------------------------------------------------
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
/* This is the stylesheet used as the basis for older broswers.
 | 
			
		||||
 | 
			
		||||
Note that you CANNOT simly add styles here and hope they work.  ONLY CSS
 | 
			
		||||
level 1 styles should be in this file.  Everyting else goes into the other 3
 | 
			
		||||
files.
 | 
			
		||||
 | 
			
		||||
These basic styles ensire that browsers that don't understand the @import
 | 
			
		||||
method will still be usable.  All modern browsers will use the styles in
 | 
			
		||||
sme_main.css, sme_menu.css or sme_header.css depending on the frame in which
 | 
			
		||||
the page is found.   
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
/* Default HTML styles */
 | 
			
		||||
body {
 | 
			
		||||
    background: #ffffff;
 | 
			
		||||
    color: #000000;
 | 
			
		||||
    font-family: Verdana, Arial, Helvetica, sans-serif;
 | 
			
		||||
    font-size: 11px; 
 | 
			
		||||
    border-width: 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
table, tr, td, div, p, form {
 | 
			
		||||
    color: #000000;
 | 
			
		||||
    font-family: Verdana, Arial, Helvetica, sans-serif;
 | 
			
		||||
    font-size: 11px; 
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
p {
 | 
			
		||||
    margin-top: 8px;
 | 
			
		||||
    margin-bottom: 2px;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
form {
 | 
			
		||||
    margin-top: 2px;
 | 
			
		||||
    margin-bottom: 2px;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
span {
 | 
			
		||||
    font-family: Verdana, Arial, Helvetica, sans-serif;
 | 
			
		||||
    font-size: 11px; 
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.notsmall {
 | 
			
		||||
    font-family: Verdana, Arial, Helvetica, sans-serif;
 | 
			
		||||
    font-size: 11px; 
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
h1, .h1 {
 | 
			
		||||
    font-family: Verdana, Arial, Helvetica, sans-serif;
 | 
			
		||||
    color: #333333;
 | 
			
		||||
    font-size: 18px;
 | 
			
		||||
    margin-bottom: 4px;
 | 
			
		||||
    margin-top: 12px;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
h2, .h2 {
 | 
			
		||||
    font-family: Verdana, Arial, Helvetica, sans-serif;
 | 
			
		||||
    color: #333333;
 | 
			
		||||
    font-size: 14px;
 | 
			
		||||
    margin-bottom: 3px;
 | 
			
		||||
    margin-top: 12px;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
h3, .h3 {
 | 
			
		||||
    font-family: Verdana, Arial, Helvetica, sans-serif;
 | 
			
		||||
    color: #333333;
 | 
			
		||||
    font-size: 12px;
 | 
			
		||||
    margin-bottom: 2px;
 | 
			
		||||
    margin-top: 12px;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
h4, .h4 {
 | 
			
		||||
    font-family: Verdana, Arial, Helvetica, sans-serif;
 | 
			
		||||
    font-style: italic;
 | 
			
		||||
    color: #333333;
 | 
			
		||||
    font-size: 12px;
 | 
			
		||||
    margin-bottom: 2px;
 | 
			
		||||
    margin-top: 10px;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
ol, ul, li {
 | 
			
		||||
    font-family: Verdana, Arial, Helvetica, sans-serif;
 | 
			
		||||
    font-size: 10px;
 | 
			
		||||
    font-weight: normal;
 | 
			
		||||
    color: black;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
ul {
 | 
			
		||||
    list-style-type: circle;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* Core styles for use with sme_header.css*/
 | 
			
		||||
body.header { 
 | 
			
		||||
    font-family: Verdana, Arial, Helvetica, sans-serif;
 | 
			
		||||
    font-size: 11px; 
 | 
			
		||||
    background: #cccccc; 
 | 
			
		||||
    margin-top: 0px; 
 | 
			
		||||
    margin-right: 0px; 
 | 
			
		||||
    margin-bottom: 0px; 
 | 
			
		||||
    margin-left: 0px; 
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.hilightbar {
 | 
			
		||||
    background-color: #ffc50a;
 | 
			
		||||
    font-size: 4px;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.infobar {
 | 
			
		||||
    font-family: Verdana, Arial, Helvetica, sans-serif;
 | 
			
		||||
    font-size: 11px; 
 | 
			
		||||
    background-color: #cccccc;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.darkergrey {
 | 
			
		||||
    color: #666666;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
td.darkgrey {
 | 
			
		||||
    background-color: #888888;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
a.update {
 | 
			
		||||
    color: red;
 | 
			
		||||
    font-family: Verdana, Arial, Helvetica, sans-serif;
 | 
			
		||||
    font-size: 11px; 
 | 
			
		||||
    background: #cccccc; 
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* Core styles for use with sme_menu.css */
 | 
			
		||||
 | 
			
		||||
body.menu { 
 | 
			
		||||
    font-family: Verdana, Arial, Helvetica, sans-serif;
 | 
			
		||||
    font-size: 11px;
 | 
			
		||||
    background-color: #e8f3e1;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
td.section {
 | 
			
		||||
    padding-bottom: 2px; 
 | 
			
		||||
    padding-top: 8px; 
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.section {
 | 
			
		||||
    font-family: Verdana, Arial, Helvetica, sans-serif;
 | 
			
		||||
    font-size: 11px;
 | 
			
		||||
    font-weight: bold;
 | 
			
		||||
    background-color: #e8f3e1;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
a.item { 
 | 
			
		||||
    color: #00008b;
 | 
			
		||||
    font-family: Verdana, Arial, Helvetica, sans-serif;
 | 
			
		||||
    font-size: 11px; 
 | 
			
		||||
    background: #e8f3e1; 
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
a.sl { 
 | 
			
		||||
    color: green;
 | 
			
		||||
    font-family: Verdana, Arial, Helvetica, sans-serif;
 | 
			
		||||
    font-size: 11px; 
 | 
			
		||||
    background: #e8f3e1; 
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
a.alert { 
 | 
			
		||||
    color: red;
 | 
			
		||||
    font-family: Verdana, Arial, Helvetica, sans-serif;
 | 
			
		||||
    font-size: 11px; 
 | 
			
		||||
    background: #e8f3e1; 
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* Core styles for use with sme_main.css */
 | 
			
		||||
body.main { 
 | 
			
		||||
    font-family: Verdana, Arial, Helvetica, sans-serif;
 | 
			
		||||
    font-size: 11px; 
 | 
			
		||||
    background-color: #ffffff;
 | 
			
		||||
    color: #000000;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
td.sme-noborders-label {
 | 
			
		||||
    font-weight: bold;
 | 
			
		||||
    width: 33%;
 | 
			
		||||
    text-align: right;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
hr.sectionbar {
 | 
			
		||||
    color: #666666;
 | 
			
		||||
    background-color: #666666;
 | 
			
		||||
    height: 1px;
 | 
			
		||||
    width: 80%;
 | 
			
		||||
    border: 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
hr.sme-copyrightbar {
 | 
			
		||||
    color: #dddddd;
 | 
			
		||||
    background-color: #dddddd;
 | 
			
		||||
    height: 1px;
 | 
			
		||||
    width: 100%;
 | 
			
		||||
    border: 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.sme-copyright {
 | 
			
		||||
    color: #777777;
 | 
			
		||||
    font-family: Verdana, Arial, Helvetica, sans-serif;
 | 
			
		||||
    font-size: 10px; 
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/*These style definitions were found int he old css file (manager.css)
 | 
			
		||||
but don't seem to ever be referenced in the code.  They're here
 | 
			
		||||
for reference.
 | 
			
		||||
 | 
			
		||||
.centerit {
 | 
			
		||||
    text-align: center;
 | 
			
		||||
}
 | 
			
		||||
.highlight {
 | 
			
		||||
    background: #ffc61e;
 | 
			
		||||
}
 | 
			
		||||
.subheading {
 | 
			
		||||
    background: #ffffff;
 | 
			
		||||
    color: #1e385b;
 | 
			
		||||
}
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
EOF
 | 
			
		||||
}
 | 
			
		||||
@@ -1,87 +0,0 @@
 | 
			
		||||
{
 | 
			
		||||
    $OUT =<<'HERE';
 | 
			
		||||
 | 
			
		||||
/*	from e-smith-manager to smanager (smeserver_manager2)  */
 | 
			
		||||
 | 
			
		||||
/*----------------------------------------------------------------------
 | 
			
		||||
 * copyright (C) 1999-2003 Mitel Networks Corporation
 | 
			
		||||
 *
 | 
			
		||||
 * 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 2 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, write to the Free Software
 | 
			
		||||
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307  USA
 | 
			
		||||
 *
 | 
			
		||||
 * Technical support for this program is available from Mitel Networks
 | 
			
		||||
 * Please visit our web site www.mitel.com for details.
 | 
			
		||||
 *----------------------------------------------------------------------
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
/*contribs.org styling 
 | 
			
		||||
*/
 | 
			
		||||
body.header {
 | 
			
		||||
background: #bee6a2;
 | 
			
		||||
    }
 | 
			
		||||
.hilightbar {
 | 
			
		||||
background-color: #ffffff;
 | 
			
		||||
    }
 | 
			
		||||
.infobar {
 | 
			
		||||
background-color: #98d36e;
 | 
			
		||||
    }
 | 
			
		||||
a.update {
 | 
			
		||||
font-size: 11px;
 | 
			
		||||
background: #98d36e;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
/* Core styles for use with sme_menu.css */
 | 
			
		||||
body.menu {
 | 
			
		||||
background-color: #e8f3e1;
 | 
			
		||||
    }
 | 
			
		||||
td.section {
 | 
			
		||||
background-color: #e8f3e1;
 | 
			
		||||
    }
 | 
			
		||||
a.item {
 | 
			
		||||
background: #e8f3e1;
 | 
			
		||||
    }
 | 
			
		||||
a.sl {
 | 
			
		||||
background: #e8f3e1;
 | 
			
		||||
    }
 | 
			
		||||
a.alert {
 | 
			
		||||
background: #e8f3e1;
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
/* Core Styles for use with sme_main.css */
 | 
			
		||||
hr.sectionbar {
 | 
			
		||||
color: #8ebe43;
 | 
			
		||||
background-color: #8ebe43;
 | 
			
		||||
    }
 | 
			
		||||
hr.sme-copyrightbar {
 | 
			
		||||
color: #8ebe43;
 | 
			
		||||
background-color: #8ebe43;
 | 
			
		||||
    }
 | 
			
		||||
      
 | 
			
		||||
/* flag container no flag */
 | 
			
		||||
#flag-container span {
 | 
			
		||||
  font-size: 24px;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.fallback-box {
 | 
			
		||||
  display: inline-block; /* Make it inline-block to fit around the content */
 | 
			
		||||
  border: 2px solid gray; /* Change the border color as desired */
 | 
			
		||||
  padding: 10px; /* Add some padding */
 | 
			
		||||
  border-radius: 10px; /* Round the corners of the box */
 | 
			
		||||
  font-size: 60px; /* Adjust size if needed */
 | 
			
		||||
  margin-top: 10px; /* Add some margin */
 | 
			
		||||
  text-align: center; /* Center text inside the box */
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
HERE
 | 
			
		||||
}
 | 
			
		||||
@@ -1 +0,0 @@
 | 
			
		||||
/* DO NOT MODIFY THIS FILE! It is updated automatically */
 | 
			
		||||
@@ -1,440 +0,0 @@
 | 
			
		||||
{
 | 
			
		||||
    $OUT = <<'EOF';
 | 
			
		||||
 | 
			
		||||
/*	from e-smith-manager to smanager (smeserver_manager2)  */
 | 
			
		||||
 | 
			
		||||
/*----------------------------------------------------------------------
 | 
			
		||||
 * copyright (C) 1999-2003 Mitel Networks Corporation
 | 
			
		||||
 *
 | 
			
		||||
 * 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 2 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, write to the Free Software
 | 
			
		||||
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307  USA
 | 
			
		||||
 *
 | 
			
		||||
 * Technical support for this program is available from Mitel Networks
 | 
			
		||||
 * Please visit our web site www.mitel.com for details.
 | 
			
		||||
 *----------------------------------------------------------------------
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
/*	This is the stylesheet used in the main panels only.  
 | 
			
		||||
 | 
			
		||||
   This file inherits the styles use in sme_core in the "header" section, and
 | 
			
		||||
   as noted in the code below. Note that some of the styles here are empty.  
 | 
			
		||||
	This is because the style definition has moved safely to sme_core.css
 | 
			
		||||
	and the placeholder is left here for reference or future use.
 | 
			
		||||
 | 
			
		||||
   There are a lot of styles in here, so read carefully.  Each one is documented.
 | 
			
		||||
 | 
			
		||||
	Styles that were in the old stylesheets, but are not used in the UI are at the
 | 
			
		||||
	bottom, commented out.  These can be removed at the end of the 6.0 cycle */
 | 
			
		||||
 | 
			
		||||
/* general page properties */
 | 
			
		||||
body, body.main { 
 | 
			
		||||
    margin-top: 5px; 
 | 
			
		||||
    margin-right: 20px; 
 | 
			
		||||
    margin-bottom: 5px; 
 | 
			
		||||
    margin-left: 5px; 
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/* Table properties ****************************************/
 | 
			
		||||
/* There are THREE  types of tables
 | 
			
		||||
   1. *.sme-layout*     is used for layout purposes.  It is the "master
 | 
			
		||||
	                      container" on a page.  It controls the top-level table
 | 
			
		||||
                         inside of which everything else is put.
 | 
			
		||||
	2. *.sme-noborders*  is used for layout, and defines a borderless table and 
 | 
			
		||||
	                      cells used within it.
 | 
			
		||||
	2. *.sme-border*     is used for tabular data, and defines a header row and borders
 | 
			
		||||
	                      for tables that need borders
 | 
			
		||||
 | 
			
		||||
	*/
 | 
			
		||||
 | 
			
		||||
/*First, some defaults */
 | 
			
		||||
td {
 | 
			
		||||
    text-align: left;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/* 
 | 
			
		||||
sme-layout* : Used for top-level layout
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
table.sme-layout {
 | 
			
		||||
    border-collapse: collapse;
 | 
			
		||||
	 margin-bottom: 2px;
 | 
			
		||||
	 margin-top: 2px;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
tr.sme-layout {
 | 
			
		||||
    border: 1px solid #dddddd; 
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
td.sme-layout {
 | 
			
		||||
    border: 1px solid #dddddd; 
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/*This special style is actually used only for the button row along the bottom of each page*/
 | 
			
		||||
th.sme-layout {
 | 
			
		||||
    border: 1px solid #dddddd; 
 | 
			
		||||
    background-color: #e8f3e1;
 | 
			
		||||
    font-family: Verdana, Arial, Helvetica, sans-serif;
 | 
			
		||||
    font-size: 9pt;
 | 
			
		||||
    font-weight: bold;
 | 
			
		||||
    color: #000000;
 | 
			
		||||
    text-align: right; 
 | 
			
		||||
    padding: 4px;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* 
 | 
			
		||||
sme-noborders* : Used for mid-level layout
 | 
			
		||||
*/
 | 
			
		||||
table.sme-noborders {
 | 
			
		||||
    padding: 0px;
 | 
			
		||||
    margin-top: 0px;
 | 
			
		||||
    margin-bottom: 20px;
 | 
			
		||||
    margin-left: 0px;
 | 
			
		||||
    margin-right: 0px;
 | 
			
		||||
    font-family: Verdana, Arial, Helvetica, sans-serif;
 | 
			
		||||
    font-size: 11px;
 | 
			
		||||
}
 | 
			
		||||
td.sme-noborders-label {
 | 
			
		||||
    font-weight: bold;
 | 
			
		||||
    /*width: 250px;*/
 | 
			
		||||
    text-align: right;
 | 
			
		||||
    /*vertical-align: top;*/
 | 
			
		||||
    background-color: #e8f3e1;
 | 
			
		||||
    font-family: Verdana, Arial, Helvetica, sans-serif;
 | 
			
		||||
    font-size: 11px;
 | 
			
		||||
}
 | 
			
		||||
td.sme-noborders-content {
 | 
			
		||||
    text-align: left;
 | 
			
		||||
    vertical-align: top;	
 | 
			
		||||
    font-family: Verdana, Arial, Helvetica, sans-serif;
 | 
			
		||||
    font-size: 11px;
 | 
			
		||||
}
 | 
			
		||||
td.sme-noborders-info, div.sme-noborders-info {
 | 
			
		||||
    text-align: left;
 | 
			
		||||
    vertical-align: top;	
 | 
			
		||||
}
 | 
			
		||||
/* Used for a left-most column of radio buttons (see date/time panel) */
 | 
			
		||||
td.sme-radiobutton {
 | 
			
		||||
    width: 30px;
 | 
			
		||||
}
 | 
			
		||||
/* 
 | 
			
		||||
sme-border* : Used for tabular data
 | 
			
		||||
*/
 | 
			
		||||
table.sme-border {
 | 
			
		||||
    border-collapse: collapse;
 | 
			
		||||
    border: 2px solid #cccccc;
 | 
			
		||||
    empty-cells: show;
 | 
			
		||||
    margin: 5px 5px 5px 2px;	 
 | 
			
		||||
}
 | 
			
		||||
td.sme-border,
 | 
			
		||||
td.sme-border-warning,
 | 
			
		||||
td.sme-border-right,
 | 
			
		||||
td.sme-border-center {
 | 
			
		||||
    border: 1px solid #cccccc;
 | 
			
		||||
    font-family: Verdana, Arial, Helvetica, sans-serif;
 | 
			
		||||
    font-size: 10px;
 | 
			
		||||
    font-weight: normal;
 | 
			
		||||
    color: #000000;
 | 
			
		||||
    text-align: left;
 | 
			
		||||
    padding-left: 2px;
 | 
			
		||||
    padding-right: 2px;
 | 
			
		||||
    padding-top: 3px;
 | 
			
		||||
    padding-bottom: 3px;
 | 
			
		||||
}
 | 
			
		||||
td.sme-border-warning {
 | 
			
		||||
    color: red;
 | 
			
		||||
	 }
 | 
			
		||||
td.sme-border-right {text-align: right;}
 | 
			
		||||
td.sme-border-center {text-align: center;}
 | 
			
		||||
th.sme-border {
 | 
			
		||||
    border: 1px solid #cccccc; 
 | 
			
		||||
    background-color: #bee6a2;
 | 
			
		||||
    font-family: Verdana, Arial, Helvetica, sans-serif;
 | 
			
		||||
    font-size: 10px;
 | 
			
		||||
    font-weight: bold;
 | 
			
		||||
    color: #000000;
 | 
			
		||||
    text-align: center;
 | 
			
		||||
	 vertical-align: bottom;
 | 
			
		||||
    padding-left: 2px;
 | 
			
		||||
    padding-right: 2px;
 | 
			
		||||
    padding-left: 3px;
 | 
			
		||||
    padding-right: 3px;
 | 
			
		||||
    padding-top: 3px;
 | 
			
		||||
    padding-bottom: 3px;
 | 
			
		||||
	 /*border-width: 1px;
 | 
			
		||||
	 border-style: solid;
 | 
			
		||||
    border-color: #F2F0EE #75736E #75736E #F2F0EE ;*/ 
 | 
			
		||||
}
 | 
			
		||||
td.sme-border a, td.sme-border-right a, td.sme-border-center a {
 | 
			
		||||
    font-size: 10px;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* misc layout stuff*/
 | 
			
		||||
/* these two are for any error messages that pop up*/
 | 
			
		||||
div.error, div.sme-error, span.error, span.sme-error {
 | 
			
		||||
    color: red;
 | 
			
		||||
    background-color: #ffffff;
 | 
			
		||||
    border-width: 1px;
 | 
			
		||||
    border-style: solid;
 | 
			
		||||
    border-color: red ; 
 | 
			
		||||
    padding: 2px;
 | 
			
		||||
    margin-left: 20px;
 | 
			
		||||
    margin-right: 20px;
 | 
			
		||||
    margin-top:0px;
 | 
			
		||||
    margin-bottom:0px;
 | 
			
		||||
	 
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
div.error-noborders, div.sme-error-noborders,
 | 
			
		||||
span.error-noborders, span.sme-error-noborders
 | 
			
		||||
{
 | 
			
		||||
    color: red;
 | 
			
		||||
    background-color: #ffffff;
 | 
			
		||||
    border-width: 0px;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
div.error h2, span.error h2,
 | 
			
		||||
div.error p, span.error p
 | 
			
		||||
{
 | 
			
		||||
    color: red;
 | 
			
		||||
}
 | 
			
		||||
/* These are for the special case of a link being inside an error message */
 | 
			
		||||
div.sme-error a, div.error a, span.error a, span.sme-error a,
 | 
			
		||||
div.error-noborders a, div.sme-error-noborders a,
 | 
			
		||||
span.error-noborders a, span.sme-error-noborders a
 | 
			
		||||
{
 | 
			
		||||
    color: #ff0000;
 | 
			
		||||
    font-weight: bold;
 | 
			
		||||
    text-decoration: underline;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* For when a link is the error message */
 | 
			
		||||
a.error:link, a.error:visited, a.error:hover, a.error:active {
 | 
			
		||||
    color: #ff0000;
 | 
			
		||||
    font-weight: normal;
 | 
			
		||||
    text-decoration: underline;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* these two are for any success messages that pop up*/
 | 
			
		||||
div.success, span.success {
 | 
			
		||||
    color: #006400;
 | 
			
		||||
    background-color: #ffffff;
 | 
			
		||||
    border-width: 1px;
 | 
			
		||||
    border-style: solid;
 | 
			
		||||
    border-color: #006400 ; 
 | 
			
		||||
    padding: 2px;
 | 
			
		||||
    margin-left: 20px;
 | 
			
		||||
    margin-right: 20px;
 | 
			
		||||
    margin-top:0px;
 | 
			
		||||
    margin-bottom:0px;
 | 
			
		||||
	 
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* These two are for the special case of a link being inside a success message */
 | 
			
		||||
div.success a, span.success a 
 | 
			
		||||
{
 | 
			
		||||
    color: #006400;
 | 
			
		||||
    font-weight: bold;
 | 
			
		||||
    text-decoration: underline;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
div.success h2, span.success h2,
 | 
			
		||||
div.success p, span.success p
 | 
			
		||||
{
 | 
			
		||||
    color: green;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/*These two define the copyright footer styles, one for the line and one for the text*/
 | 
			
		||||
hr.sme-copyrightbar {
 | 
			
		||||
}
 | 
			
		||||
.sme-copyright {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* These ones define styles for the links that are made to look like
 | 
			
		||||
   standard form submit buttons */
 | 
			
		||||
a.button-like:link, 
 | 
			
		||||
a.button-like:visited,
 | 
			
		||||
a.button-like:hover,
 | 
			
		||||
a.button-like:active,
 | 
			
		||||
a.button-like-small:link, 
 | 
			
		||||
a.button-like-small:visited,
 | 
			
		||||
a.button-like-small:hover,
 | 
			
		||||
a.button-like-small:active { 
 | 
			
		||||
    font-family: sans-serif;
 | 
			
		||||
    font-size: 13px; 
 | 
			
		||||
    color: black; 
 | 
			
		||||
    background: #D4D0C8; 
 | 
			
		||||
    text-decoration: none;
 | 
			
		||||
    text-align: left; 
 | 
			
		||||
    border-color: #F2F0EE #75736E #75736E #F2F0EE ; 
 | 
			
		||||
    margin-top: 10px; 
 | 
			
		||||
    margin-right: 2px; 
 | 
			
		||||
    margin-bottom: 10px; 
 | 
			
		||||
    margin-left: 2px; 
 | 
			
		||||
    border-style: solid; 
 | 
			
		||||
    border-top-width: 2px; 
 | 
			
		||||
    border-right-width: 2px; 
 | 
			
		||||
    border-bottom-width: 2px; 
 | 
			
		||||
    border-left-width: 2px;
 | 
			
		||||
    padding-top: 2px; 
 | 
			
		||||
    padding-bottom: 2px; 
 | 
			
		||||
    padding-left: 6px; 
 | 
			
		||||
    padding-right: 6px; 
 | 
			
		||||
 }
 | 
			
		||||
a.button-like-small:link, 
 | 
			
		||||
a.button-like-small:visited,
 | 
			
		||||
a.button-like-small:hover,
 | 
			
		||||
a.button-like-small:active { 
 | 
			
		||||
    border-top-width: 1px; 
 | 
			
		||||
    border-right-width: 1px; 
 | 
			
		||||
    border-bottom-width: 1px; 
 | 
			
		||||
    border-left-width: 1px;
 | 
			
		||||
    font-size: 10px; 
 | 
			
		||||
    padding-top: 0px; 
 | 
			
		||||
    padding-bottom: 0px; 
 | 
			
		||||
    padding-left: 1px; 
 | 
			
		||||
    padding-right: 1px; 
 | 
			
		||||
}
 | 
			
		||||
a.button-like:active,
 | 
			
		||||
a.button-like-small:active { 
 | 
			
		||||
    border-color: #75736E #F2F0EE #F2F0EE #75736E  ; 
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* EXPERIMENTAL SECTION */
 | 
			
		||||
/* These are styles used to experiment with. */
 | 
			
		||||
 | 
			
		||||
/* class for links, similar to the class in sme_menu.css, but for a red button */
 | 
			
		||||
a.button-like-red:link, 
 | 
			
		||||
a.button-like-red:visited,
 | 
			
		||||
a.button-like-red:hover,
 | 
			
		||||
a.button-like-red:active { 
 | 
			
		||||
    border-left: #F1726C 2px solid;
 | 
			
		||||
    border-right: #B42025 2px solid;
 | 
			
		||||
    border-top: #F1726C 2px solid;
 | 
			
		||||
    border-bottom: #B42025 2px solid;
 | 
			
		||||
 }
 | 
			
		||||
a.button-like-red:active { 
 | 
			
		||||
    border-color: #75736E #F2F0EE #F2F0EE #75736E  ; 
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/*These are style definitions found in the UI but not defined in any file I 
 | 
			
		||||
  could locate.  They're listed here for historical purposes, but have been
 | 
			
		||||
  removed from the UI
 | 
			
		||||
 | 
			
		||||
pagedescription (used in the first paragraph of text on a page) [HTML.pm]
 | 
			
		||||
label (used in forms) [HTML.pm]
 | 
			
		||||
field (used in forms) [HTML.pm]
 | 
			
		||||
fielddescription (used ???)[HTML.pm]
 | 
			
		||||
buttons (used in forms) [HTML.pm]
 | 
			
		||||
*/  
 | 
			
		||||
/*td.sme-submitbutton {
 | 
			
		||||
	text-align: right;
 | 
			
		||||
}
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
/*These style definitions were found int he old css file (manager.css)
 | 
			
		||||
  but don't seem to ever be referenced in the code.  They're here
 | 
			
		||||
  for reference.
 | 
			
		||||
 | 
			
		||||
.banner {
 | 
			
		||||
    background: #000000;
 | 
			
		||||
    color: #ffffff;
 | 
			
		||||
}
 | 
			
		||||
.banner-right {
 | 
			
		||||
    font-family: Verdana, Arial, Helvetica, sans-serif;
 | 
			
		||||
    background: #e17200;
 | 
			
		||||
    color: #ffffff;
 | 
			
		||||
}
 | 
			
		||||
.border {
 | 
			
		||||
    background: #000000;
 | 
			
		||||
    color: #000000;
 | 
			
		||||
    border-color: #000000;
 | 
			
		||||
}
 | 
			
		||||
.sidebar {
 | 
			
		||||
    width: 200px;
 | 
			
		||||
    background: #ffffff;
 | 
			
		||||
    font-size: smaller;
 | 
			
		||||
    font-family: Verdana, Arial, Helvetica, sans-serif;
 | 
			
		||||
    font-weight: normal;
 | 
			
		||||
}
 | 
			
		||||
.sidebar-title {
 | 
			
		||||
    background: #1e385b;
 | 
			
		||||
    color: #ffffff;
 | 
			
		||||
    font-family: Verdana, Arial, Helvetica, sans-serif;
 | 
			
		||||
    font-weight: bold;
 | 
			
		||||
}
 | 
			
		||||
.newsitem {
 | 
			
		||||
    background: #ffffff;
 | 
			
		||||
    color: #000000;
 | 
			
		||||
    font-family: Verdana, Arial, Helvetica, sans-serif;
 | 
			
		||||
    margin-left: 5px;
 | 
			
		||||
    margin-right: 5px;
 | 
			
		||||
    margin-top: 5px;
 | 
			
		||||
    margin-bottom: 5px;
 | 
			
		||||
}
 | 
			
		||||
.newsitem-title {
 | 
			
		||||
    background: #cccccc;
 | 
			
		||||
    color: #ffffff;
 | 
			
		||||
    font-family: Verdana, Arial, Helvetica, sans-serif;
 | 
			
		||||
    font-weight: bold;
 | 
			
		||||
}
 | 
			
		||||
.newsitem-footer {
 | 
			
		||||
    background: #cccccc;
 | 
			
		||||
    color: #000000;
 | 
			
		||||
    font-family: Verdana, Arial, Helvetica, sans-serif;
 | 
			
		||||
    font-size: smaller;
 | 
			
		||||
    text-align: right;
 | 
			
		||||
}
 | 
			
		||||
.newsitem-detail {
 | 
			
		||||
    font-size: smaller;
 | 
			
		||||
    font-weight: normal;
 | 
			
		||||
} 
 | 
			
		||||
.formlabel {
 | 
			
		||||
    background: #c0c0c0;
 | 
			
		||||
    color: #000000;
 | 
			
		||||
    font-family: Verdana, Arial, Helvetica, sans-serif;
 | 
			
		||||
    font-size: small;
 | 
			
		||||
    font-weight: bold;
 | 
			
		||||
    text-align: right;
 | 
			
		||||
}
 | 
			
		||||
.welcome-link {
 | 
			
		||||
    background: #ffffff;
 | 
			
		||||
    color: #1e385b;
 | 
			
		||||
}
 | 
			
		||||
.littlelink {
 | 
			
		||||
    font-family: Verdana, Arial, Helvetica, sans-serif;
 | 
			
		||||
}
 | 
			
		||||
#textlayer {
 | 
			
		||||
    position: absolute;
 | 
			
		||||
    visibility: inherit;
 | 
			
		||||
    top: 160px;
 | 
			
		||||
    left: 50px;
 | 
			
		||||
    z-index: 2;
 | 
			
		||||
}
 | 
			
		||||
#para {
 | 
			
		||||
    font-family: Verdana, Arial, Helvetica, sans-serif;
 | 
			
		||||
    font-weight: bold;
 | 
			
		||||
    color: #000000;
 | 
			
		||||
}  
 | 
			
		||||
#title {
 | 
			
		||||
    font-family: Verdana, Arial, Helvetica, sans-serif;
 | 
			
		||||
    font-weight: bold;
 | 
			
		||||
    padding: 7px 7px 7px 7px;
 | 
			
		||||
    color: #ffffff;
 | 
			
		||||
} 
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
EOF
 | 
			
		||||
}
 | 
			
		||||
@@ -1,50 +0,0 @@
 | 
			
		||||
{
 | 
			
		||||
    $OUT =<<'HERE';
 | 
			
		||||
 | 
			
		||||
/*	from e-smith-manager to smanager (smeserver_manager2)  */
 | 
			
		||||
 | 
			
		||||
/*----------------------------------------------------------------------
 | 
			
		||||
 * copyright (C) 1999-2003 Mitel Networks Corporation
 | 
			
		||||
 *
 | 
			
		||||
 * 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 2 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, write to the Free Software
 | 
			
		||||
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307  USA
 | 
			
		||||
 *
 | 
			
		||||
 * Technical support for this program is available from Mitel Networks
 | 
			
		||||
 * Please visit our web site www.mitel.com for details.
 | 
			
		||||
 *----------------------------------------------------------------------
 | 
			
		||||
 */
 | 
			
		||||
/*contribs.org styling */
 | 
			
		||||
 | 
			
		||||
/* This special style is actually used only for the button row along the bottom of each page */
 | 
			
		||||
th.sme-layout {
 | 
			
		||||
border: 1px solid #8ebe43;
 | 
			
		||||
background-color: #bee6a2;
 | 
			
		||||
    }
 | 
			
		||||
table.sme-border {
 | 
			
		||||
border: 2px solid #dddddd;
 | 
			
		||||
    }
 | 
			
		||||
td.sme-border-warning,
 | 
			
		||||
td.sme-border-right,
 | 
			
		||||
td.sme-border-center {
 | 
			
		||||
border: 1px solid #dddddd;
 | 
			
		||||
    }
 | 
			
		||||
td.sme-border-right {text-align: right;}
 | 
			
		||||
td.sme-border-center {text-align: center;}
 | 
			
		||||
th.sme-border {
 | 
			
		||||
border: 1px solid #dddddd;
 | 
			
		||||
background-color: #e8f3e1;
 | 
			
		||||
    }
 | 
			
		||||
HERE
 | 
			
		||||
}
 | 
			
		||||
    
 | 
			
		||||
@@ -1 +0,0 @@
 | 
			
		||||
/* DO NOT MODIFY THIS FILE! It is updated automatically */
 | 
			
		||||
@@ -1,229 +0,0 @@
 | 
			
		||||
{
 | 
			
		||||
    $OUT = <<'EOF';
 | 
			
		||||
 | 
			
		||||
/*	from e-smith-manager to smanager (smeserver_manager2)  */
 | 
			
		||||
 | 
			
		||||
/*----------------------------------------------------------------------
 | 
			
		||||
 * copyright (C) 1999-2003 Mitel Networks Corporation
 | 
			
		||||
 *
 | 
			
		||||
 * 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 2 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, write to the Free Software
 | 
			
		||||
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307  USA
 | 
			
		||||
 *
 | 
			
		||||
 * Technical support for this program is available from Mitel Networks
 | 
			
		||||
 * Please visit our web site www.mitel.com for details.
 | 
			
		||||
 *----------------------------------------------------------------------
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
/* This is the stylesheet used in the navigation panel only
 | 
			
		||||
 | 
			
		||||
   This file inherits the styles use in sme_core in the "navigation" section,
 | 
			
		||||
   and as noted in the code below. Note that some of the styles here are empty.
 | 
			
		||||
   This is because the style definition has moved safely to sme_core.css and
 | 
			
		||||
   the placeholder is left here for reference or future use.
 | 
			
		||||
 | 
			
		||||
   There are a lot of styles in here, so read carefully.  Each one is
 | 
			
		||||
   documented.
 | 
			
		||||
 | 
			
		||||
   Styles that were in the old stylesheets, but are not used in the UI are at
 | 
			
		||||
   the bottom, commented out.  These can be removed at the end of the 6.0
 | 
			
		||||
   cycle */
 | 
			
		||||
 | 
			
		||||
/* Sets the general page properties */
 | 
			
		||||
body, body.menu { 
 | 
			
		||||
    margin-top: 0px; 
 | 
			
		||||
    margin-right: 0px; 
 | 
			
		||||
    margin-bottom: 0px; 
 | 
			
		||||
    margin-left: 2px; 
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* This is the section heading style */
 | 
			
		||||
.section {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
td.menu-cell {
 | 
			
		||||
    margin-top: 0px; 
 | 
			
		||||
    margin-right: 0px; 
 | 
			
		||||
    margin-bottom: 0px; 
 | 
			
		||||
    margin-left: 0px; 
 | 
			
		||||
    padding-left: 0px;
 | 
			
		||||
    padding-right: 0px;
 | 
			
		||||
    padding-top: 0px;
 | 
			
		||||
    padding-bottom: 0px;
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
All the a links use pseudoclasses to control the two visual link styles.
 | 
			
		||||
For example:
 | 
			
		||||
  a.item:link             the general link item
 | 
			
		||||
  a.item-current:link:    the active link item
 | 
			
		||||
 | 
			
		||||
The switch from item to item-current is done with a javascript script in the head of the
 | 
			
		||||
navigation page, using the onClick event.
 | 
			
		||||
 | 
			
		||||
We are making heavy use of the cascade with these.
 | 
			
		||||
*/    
 | 
			
		||||
 | 
			
		||||
/* a:link controls the look of a link when the mouse is nowhere near it */
 | 
			
		||||
a.item:link, a.item-current:link, 
 | 
			
		||||
a.warn:link, a.warn-current:link { 
 | 
			
		||||
    display: block;
 | 
			
		||||
    font-family: Verdana, Arial, Helvetica, sans-serif;
 | 
			
		||||
    font-size: 10px; 
 | 
			
		||||
    color: black; 
 | 
			
		||||
    background: #e8f3e1; 
 | 
			
		||||
    text-decoration: none;
 | 
			
		||||
    text-align: left; 
 | 
			
		||||
    border-color: #e8f3e1; 
 | 
			
		||||
    margin-top: 0px; 
 | 
			
		||||
    margin-right: 0px; 
 | 
			
		||||
    margin-bottom: 0px; 
 | 
			
		||||
    margin-left: 0px; 
 | 
			
		||||
    border-style: solid; 
 | 
			
		||||
    border-top-width: 1px; 
 | 
			
		||||
    border-right-width: 1px; 
 | 
			
		||||
    border-bottom-width: 1px; 
 | 
			
		||||
    border-left-width: 1px;
 | 
			
		||||
    padding-right: 10px; 
 | 
			
		||||
    padding-left: 10px; 
 | 
			
		||||
    padding-top: 0px; 
 | 
			
		||||
    padding-bottom: 2px; 
 | 
			
		||||
 }
 | 
			
		||||
 | 
			
		||||
/* a:visited controls the look of a visited link (one that has been clicked) */
 | 
			
		||||
a.item:visited, a.item-current:visited, 
 | 
			
		||||
a.warn:visited, a.warn-current:visited { 
 | 
			
		||||
    display: block;
 | 
			
		||||
    font-family: Verdana, Arial, Helvetica, sans-serif;
 | 
			
		||||
    font-size: 10px; 
 | 
			
		||||
    color: black; 
 | 
			
		||||
    background: #e8f3e1; 
 | 
			
		||||
    text-decoration: none; 
 | 
			
		||||
    border-color: #e8f3e1; 
 | 
			
		||||
    margin-top: 0px; 
 | 
			
		||||
    margin-right: 0px; 
 | 
			
		||||
    margin-bottom: 0px; 
 | 
			
		||||
    margin-left: 0px; 
 | 
			
		||||
    border-style: solid; 
 | 
			
		||||
    border-top-width: 1px; 
 | 
			
		||||
    border-right-width: 1px; 
 | 
			
		||||
    border-bottom-width: 1px; 
 | 
			
		||||
    border-left-width: 1px;
 | 
			
		||||
    padding-right: 10px; 
 | 
			
		||||
    padding-left: 10px; 
 | 
			
		||||
    padding-bottom: 2px; 
 | 
			
		||||
    text-align: left; 
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* a:hover controls the look of a link under the curser*/
 | 
			
		||||
a.item:hover, a.item-current:hover,
 | 
			
		||||
a.warn:hover, a.warn-current:hover { 
 | 
			
		||||
    display: block;
 | 
			
		||||
    font-family: Verdana, Arial, Helvetica, sans-serif;
 | 
			
		||||
    font-size: 10px; 
 | 
			
		||||
    color: black; 
 | 
			
		||||
    text-decoration: none; 
 | 
			
		||||
    background: #cccccc; 
 | 
			
		||||
    border-color: #888888; 
 | 
			
		||||
    margin-top: 0px; 
 | 
			
		||||
    margin-right: 0px;
 | 
			
		||||
    margin-bottom: 0px; 
 | 
			
		||||
    margin-left: 0px; 
 | 
			
		||||
    border-style: solid; 
 | 
			
		||||
    border-top-width: 1px; 
 | 
			
		||||
    border-right-width: 1px; 
 | 
			
		||||
    border-bottom-width: 1px; 
 | 
			
		||||
    border-left-width: 1px; 
 | 
			
		||||
    padding-right: 10px; 
 | 
			
		||||
    padding-left: 10px; 
 | 
			
		||||
    padding-bottom: 2px; 
 | 
			
		||||
    text-align: left; 
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* a:active controls the look of a link as it is selected*/
 | 
			
		||||
a.item:active, a.item-current:active, 
 | 
			
		||||
a.warn:active, a.warn-current:active { 
 | 
			
		||||
    display: block;
 | 
			
		||||
    font-family: Verdana, Arial, Helvetica, sans-serif;
 | 
			
		||||
    font-size: 10px; 
 | 
			
		||||
    color: white; 
 | 
			
		||||
    background: black; 
 | 
			
		||||
    text-decoration: none ; 
 | 
			
		||||
    border-color: #000000; 
 | 
			
		||||
    margin-top: 0px; 
 | 
			
		||||
    margin-right: 0px; 
 | 
			
		||||
    margin-bottom: 0px; 
 | 
			
		||||
    margin-left: 0px; 
 | 
			
		||||
    border-style: solid; 
 | 
			
		||||
    border-top-width: 1px; 
 | 
			
		||||
    border-right-width: 1px; 
 | 
			
		||||
    border-bottom-width: 1px; 
 | 
			
		||||
    border-left-width: 1px;
 | 
			
		||||
    padding-right: 10px; 
 | 
			
		||||
    padding-left: 10px; 
 | 
			
		||||
    padding-bottom: 2px; 
 | 
			
		||||
    text-align: left; 
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* 
 | 
			
		||||
These styles are to ensure that a selected link appears selected, even if the link
 | 
			
		||||
opens in another frame.  This uses a javascript chunk in the head of the navigation 
 | 
			
		||||
frame to change the style using the onClick event.
 | 
			
		||||
*/
 | 
			
		||||
a.item-current:link,    a.warn-current:link,
 | 
			
		||||
a.item-current:visited, a.warn-current:visited, 
 | 
			
		||||
a.item-current:active,  a.warn-current:active,
 | 
			
		||||
a.item-current:hover,   a.warn-current:hover { 
 | 
			
		||||
    display: block;
 | 
			
		||||
    font-family: Verdana, Arial, Helvetica, sans-serif;
 | 
			
		||||
    font-size: 10px; 
 | 
			
		||||
    color: black; 
 | 
			
		||||
    text-decoration: none; 
 | 
			
		||||
    background: #ffffff; 
 | 
			
		||||
    border-color: #888888; 
 | 
			
		||||
    margin-top: 0px; 
 | 
			
		||||
    margin-right: 0px;
 | 
			
		||||
    margin-bottom: 0px; 
 | 
			
		||||
    margin-left: 0px; 
 | 
			
		||||
    border-style: solid; 
 | 
			
		||||
    border-top-width: 1px; 
 | 
			
		||||
    border-right-width: 1px; 
 | 
			
		||||
    border-bottom-width: 1px; 
 | 
			
		||||
    border-left-width: 1px; 
 | 
			
		||||
    padding-right: 10px; 
 | 
			
		||||
    padding-left: 10px; 
 | 
			
		||||
    padding-bottom: 2px; 
 | 
			
		||||
    text-align: left; 
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* these two add a border on the styles defined directly above when
 | 
			
		||||
the mouse is hovering over them */
 | 
			
		||||
a.item-current:hover,   a.warn-current:hover { 
 | 
			
		||||
    border-color: #888888; 
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* These redefine a few elements to make room for the icon to the left of the warn class*/
 | 
			
		||||
a.warn:link,    a.warn-current:link, 
 | 
			
		||||
a.warn:visited, a.warn-current:visited, 
 | 
			
		||||
a.warn:active,  a.warn-current:active,
 | 
			
		||||
a.warn:hover,   a.warn-current:hover { 
 | 
			
		||||
    background-image: url(/server-common/warn.gif);
 | 
			
		||||
    background-repeat: no-repeat;
 | 
			
		||||
    background-position: 10px; 
 | 
			
		||||
    padding-left: 25px; 
 | 
			
		||||
}
 | 
			
		||||
/*end*/
 | 
			
		||||
 | 
			
		||||
EOF
 | 
			
		||||
}
 | 
			
		||||
@@ -1 +0,0 @@
 | 
			
		||||
/* DO NOT MODIFY THIS FILE! It is updated automatically */
 | 
			
		||||
@@ -1,279 +0,0 @@
 | 
			
		||||
{
 | 
			
		||||
    $OUT = <<'EOF';
 | 
			
		||||
 | 
			
		||||
/*	smeserver_manager2  */
 | 
			
		||||
 | 
			
		||||
/*----------------------------------------------------------------------
 | 
			
		||||
 * copyright (C) 1999-2003 Mitel Networks Corporation
 | 
			
		||||
 *
 | 
			
		||||
 * 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 2 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, write to the Free Software
 | 
			
		||||
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307  USA
 | 
			
		||||
 *
 | 
			
		||||
 * Technical support for this program is available from Mitel Networks
 | 
			
		||||
 * Please visit our web site www.mitel.com for details.
 | 
			
		||||
 *----------------------------------------------------------------------
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
/* This is the basic stylesheet originally used in the mojo version.
 | 
			
		||||
   */
 | 
			
		||||
 | 
			
		||||
body{
 | 
			
		||||
    background-color: #FFF;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#container{
 | 
			
		||||
    max-width: 100%;
 | 
			
		||||
    position: relative;
 | 
			
		||||
    margin: auto;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#navigation{
 | 
			
		||||
    width: 190px;
 | 
			
		||||
    position: absolute;
 | 
			
		||||
    margin-left: 0px;
 | 
			
		||||
    padding: 5px;
 | 
			
		||||
    background-color: #E8F3E1;
 | 
			
		||||
/*    height: 600px; */
 | 
			
		||||
    overflow: auto;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#main{
 | 
			
		||||
    margin-left: 195px;
 | 
			
		||||
    padding: 10px;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#central{
 | 
			
		||||
    margin-left: 0px;
 | 
			
		||||
    padding: 5px;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#footer{
 | 
			
		||||
    margin-left: 0px;
 | 
			
		||||
    padding: 5px;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#header {
 | 
			
		||||
    background: #bee6a2;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#header h1, a:link, a:visited {
 | 
			
		||||
    color: black;
 | 
			
		||||
    text-decoration: none;
 | 
			
		||||
/* contribs.org styling */
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
a:link { color: #006921; text-decoration: none; }
 | 
			
		||||
a:visited { color: #063; text-decoration: none; }
 | 
			
		||||
a:hover { color: #F00; text-decoration: none; }
 | 
			
		||||
a:active { color: #606060; text-decoration: none; }
 | 
			
		||||
 | 
			
		||||
.sme-error {
 | 
			
		||||
    color: red;
 | 
			
		||||
    background-color: #ffffff;
 | 
			
		||||
    border-width: 1px;
 | 
			
		||||
    border-style: solid;
 | 
			
		||||
    border-color: red ; 
 | 
			
		||||
    padding: 2px;
 | 
			
		||||
    margin-left: 10px;
 | 
			
		||||
    margin-right: 10px;
 | 
			
		||||
    margin-top:0px;
 | 
			
		||||
    margin-bottom:0px;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.sme-warning {
 | 
			
		||||
    color: orange;
 | 
			
		||||
    background-color: #ffffff;
 | 
			
		||||
    border-width: 1px;
 | 
			
		||||
    border-style: solid;
 | 
			
		||||
    border-color: orange ; 
 | 
			
		||||
    padding: 4px;
 | 
			
		||||
    margin-left: 20px;
 | 
			
		||||
    margin-right: 20px;
 | 
			
		||||
    margin-top:2px;
 | 
			
		||||
    margin-bottom:2px;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#footer img {
 | 
			
		||||
    float: right;
 | 
			
		||||
    position: fixed;
 | 
			
		||||
    margin-left: 40%;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
label.field-with-error {
 | 
			
		||||
	color: #dd7e5e
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
input.field-with-error { 
 | 
			
		||||
	background-color: #fd9e7e 
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
span.label {
 | 
			
		||||
    display: inline-block;
 | 
			
		||||
    font-weight: bold;
 | 
			
		||||
    background-color: #e8f3e1; /*lightgreen;*/
 | 
			
		||||
    width: 30%;
 | 
			
		||||
    text-align: right;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
td.label {
 | 
			
		||||
    font-weight: bold;
 | 
			
		||||
    background-color: #e8f3e1; /*lightgreen;*/
 | 
			
		||||
    width: 30%;
 | 
			
		||||
    text-align: right;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
span.label2 {
 | 
			
		||||
    display: inline-block;
 | 
			
		||||
    font-weight: bold;
 | 
			
		||||
    background-color: #e8f3e1; /*lightgreen;*/
 | 
			
		||||
    text-align: right;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
span.data {
 | 
			
		||||
    padding: 2px;
 | 
			
		||||
    font-weight: bold;
 | 
			
		||||
    margin-left: 0%;
 | 
			
		||||
/*    background-color: lightblue;*/
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
span.data2 {
 | 
			
		||||
    padding: 2px;
 | 
			
		||||
/*    background-color: lightblue; */
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
input.action {
 | 
			
		||||
    margin-left: 0px;
 | 
			
		||||
    background-color: #bee6a2; /*lightgreen;*/
 | 
			
		||||
    color: darkgreen;
 | 
			
		||||
    border-radius: 8px;
 | 
			
		||||
    border: 2px solid #4CAF50; /* Green */
 | 
			
		||||
    display: flex;
 | 
			
		||||
    justify-content: center;
 | 
			
		||||
    align-items: center;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
input.action:hover {background-color: #3e8e41; color:white;}
 | 
			
		||||
 | 
			
		||||
input.action:active {
 | 
			
		||||
  background-color: #3e8e41;
 | 
			
		||||
  transform: translate(-2px,2px);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.center {
 | 
			
		||||
    display: flex;
 | 
			
		||||
    justify-content: center;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
input.action2 {
 | 
			
		||||
    margin-left: 0px;
 | 
			
		||||
    color: black;
 | 
			
		||||
    background-color: #d4d0c8;
 | 
			
		||||
    display: flex;
 | 
			
		||||
    justify-content: center;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#modul.desc {
 | 
			
		||||
    padding: 3px;
 | 
			
		||||
    background-color: grey;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
[type = 'text'] {
 | 
			
		||||
    margin-left: 0px;
 | 
			
		||||
    /*background-color: lightblue;*/
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.a, .return {
 | 
			
		||||
    color: #661866;
 | 
			
		||||
    font-weight: bold;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
a.section {
 | 
			
		||||
}
 | 
			
		||||
.a, .item {
 | 
			
		||||
    line-height: 12px;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
a.section-title {
 | 
			
		||||
    display: inline-block;
 | 
			
		||||
    color: #6CA345;	/*#888;*/
 | 
			
		||||
    padding-left: 5px;
 | 
			
		||||
    padding-right: 5px;
 | 
			
		||||
    line-height: 18px;
 | 
			
		||||
    font-weight: bold;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
a.menu-title {
 | 
			
		||||
    display: inline-block;
 | 
			
		||||
    color: #1A6D1A;	/*#666;*/
 | 
			
		||||
    padding-left: 1px;
 | 
			
		||||
    padding-right: 1px;
 | 
			
		||||
    font-weight: bold;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#module {
 | 
			
		||||
/*    height: 600px; */
 | 
			
		||||
    overflow: auto;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#h2l1 {
 | 
			
		||||
    height: 40px;
 | 
			
		||||
    width: 100%;
 | 
			
		||||
}
 | 
			
		||||
#h2e11 {
 | 
			
		||||
    width: 50%;
 | 
			
		||||
    float: left;
 | 
			
		||||
}
 | 
			
		||||
#h2e12 {
 | 
			
		||||
    background-color: #C0E7A6;
 | 
			
		||||
    float: left;
 | 
			
		||||
    text-align: right;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#h2l2 {
 | 
			
		||||
/*    background-color: #A8F9E7;*/
 | 
			
		||||
    border-top: solid white 3px;
 | 
			
		||||
    border-bottom: solid white 2px;
 | 
			
		||||
    height: 14px;
 | 
			
		||||
    width: 100%;
 | 
			
		||||
    padding: 1px;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#h2e21 {
 | 
			
		||||
    float: left;
 | 
			
		||||
    width: 70%;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#h2e22,#h2e23,#h2e12 {
 | 
			
		||||
    float: left;
 | 
			
		||||
    width: 14em;
 | 
			
		||||
    text-align: center;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.toggle-password {
 | 
			
		||||
    margin-left: -30px;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.tg-icon {
 | 
			
		||||
    position: relative;
 | 
			
		||||
    top: 5px;
 | 
			
		||||
    left: 2px;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/*end*/
 | 
			
		||||
EOF
 | 
			
		||||
}
 | 
			
		||||
@@ -1 +0,0 @@
 | 
			
		||||
/* DO NOT MODIFY THIS FILE! It is updated automatically */
 | 
			
		||||
							
								
								
									
										9
									
								
								root/usr/lib/systemd/system/bootsequence.service
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										9
									
								
								root/usr/lib/systemd/system/bootsequence.service
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,9 @@
 | 
			
		||||
[Unit]
 | 
			
		||||
Description=Koozali SME Server boot diagnostic tool
 | 
			
		||||
After=sme-server.target
 | 
			
		||||
PartOf=sme-server.target
 | 
			
		||||
 | 
			
		||||
[Service]
 | 
			
		||||
Type=oneshot
 | 
			
		||||
ExecStart=/bin/sh -c "/usr/bin/systemd-analyze plot > /usr/share/smanager/themes/default/public/images/boot.svg"
 | 
			
		||||
RemainAfterExit=yes
 | 
			
		||||
@@ -1,7 +1,7 @@
 | 
			
		||||
[Unit]
 | 
			
		||||
Description=Server Manager 2 Mojo
 | 
			
		||||
Requires=network.target httpd-e-smith.service ldap.service
 | 
			
		||||
After=network.target 
 | 
			
		||||
Requires=network-online.target httpd-e-smith.service ldap.service
 | 
			
		||||
After=network-online.target 
 | 
			
		||||
 | 
			
		||||
[Service]
 | 
			
		||||
Type=simple
 | 
			
		||||
 
 | 
			
		||||
@@ -17,6 +17,7 @@ use Mojo::Home;
 | 
			
		||||
 | 
			
		||||
use DBM::Deep;
 | 
			
		||||
use Mojo::JWT;
 | 
			
		||||
use POSIX qw(strftime);
 | 
			
		||||
 | 
			
		||||
use Mojolicious::Plugin::Config;
 | 
			
		||||
#use Mojolicious::Plugin::I18N;
 | 
			
		||||
@@ -27,8 +28,10 @@ use SrvMngr::Model::Main;
 | 
			
		||||
 | 
			
		||||
use SrvMngr::Plugin::WithoutCache;
 | 
			
		||||
 | 
			
		||||
use esmith::I18N;
 | 
			
		||||
 | 
			
		||||
#this is overwrittrn with the "release" by the spec file - release can be "99.el8.sme"
 | 
			
		||||
our $VERSION = ''; 
 | 
			
		||||
our $VERSION = '70.el8.sme'; 
 | 
			
		||||
#Extract the release value
 | 
			
		||||
if ($VERSION =~ /^(\d+)/) {
 | 
			
		||||
    $VERSION = $1;  # $1 contains the matched numeric digits
 | 
			
		||||
@@ -40,9 +43,10 @@ $VERSION = eval $VERSION;
 | 
			
		||||
use Exporter 'import';
 | 
			
		||||
our @EXPORT_OK = qw( 
 | 
			
		||||
	init_session get_mod_url theme_list
 | 
			
		||||
	getNavigation ip_number is_normal_password email_simple
 | 
			
		||||
	getNavigation ip_number validate_password is_normal_password email_simple
 | 
			
		||||
	mac_address_or_blank mac_address ip_number_or_blank
 | 
			
		||||
	lang_space get_routes_list subnet_mask get_reg_mask
 | 
			
		||||
	gen_locale_date_string get_public_ip_address
 | 
			
		||||
	);
 | 
			
		||||
 | 
			
		||||
has home => sub {
 | 
			
		||||
@@ -208,6 +212,22 @@ sub setup_helpers {
 | 
			
		||||
	Mojo::JWT->new(secret => shift->app->secrets->[0] || die)
 | 
			
		||||
    });
 | 
			
		||||
 | 
			
		||||
    $self->helper( selected_field => sub {
 | 
			
		||||
                    my $self = shift;
 | 
			
		||||
                    my @options = shift;
 | 
			
		||||
                    my $selected = shift;
 | 
			
		||||
                    my $count = 0;
 | 
			
		||||
                    # search for occurence of value $selected in arrays; if found add selected => 'selected'
 | 
			
		||||
                    for  (my $i = 0; $i <= $#{$options[0]} ; $i++){
 | 
			
		||||
                      if (grep /^$selected$/,  @{$options[0][$i]}) {
 | 
			
		||||
                        push( @{$options[0][$i]} ,'selected', 'selected' );
 | 
			
		||||
                        $count++;last;
 | 
			
		||||
                      }
 | 
			
		||||
                    }
 | 
			
		||||
                    push ( @{$options[0]} ,[ ucfirst( $selected), $selected, 'selected', 'selected'] ) if ($count <1);
 | 
			
		||||
                    return @options;
 | 
			
		||||
    });
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@@ -224,12 +244,12 @@ sub setup_plugins {
 | 
			
		||||
    # CSRF protection if production mode
 | 
			
		||||
#    $self->plugin('Mojolicious::Plugin::CSRFDefender' => {
 | 
			
		||||
#   Adapted plugin for use with GET method
 | 
			
		||||
    $self->plugin('SrvMngr::Plugin::CSRFDefender' => {
 | 
			
		||||
	onetime => 1,
 | 
			
		||||
	error_status => 400,
 | 
			
		||||
	error_content => 'Error: CSRF token is invalid or outdated'
 | 
			
		||||
    #$self->plugin('SrvMngr::Plugin::CSRFDefender' => {
 | 
			
		||||
	#onetime => 1,
 | 
			
		||||
	#error_status => 400,
 | 
			
		||||
	#error_content => 'Error: CSRF token is invalid or outdated'
 | 
			
		||||
    	#error_template => 'csrf_400'
 | 
			
		||||
	}) if ( $self->mode eq 'production' );
 | 
			
		||||
	#}) if ( $self->mode eq 'production' );
 | 
			
		||||
 | 
			
		||||
    $self->plugin('SrvMngr::Plugin::I18N' => {namespace => 'SrvMngr::I18N', default => 'en'});
 | 
			
		||||
 | 
			
		||||
@@ -545,8 +565,8 @@ sub getNavigation {
 | 
			
		||||
    # Determine the directory where the functions are kept
 | 
			
		||||
    #----------------------------------------------------- 
 | 
			
		||||
	my $navigation_ctlr_ignore = 
 | 
			
		||||
	"(\.\.?|Swttheme\.pm|Login\.pm|Request\.pm|Modules\.pm|Legacypanel\.pm(-.*)?)";
 | 
			
		||||
#	"(\.\.?|Initial\.pm|Manual\.pm|Swttheme\.pm|Request\.pm|Modules\.pm(-.*)?)";
 | 
			
		||||
	"(\.\.?|.*\-Custom\.pm|Swttheme\.pm|Login\.pm|Request\.pm|Modules\.pm|Legacypanel\.pm(-.*)?)";
 | 
			
		||||
#	"(\.\.?|Initial\.pm|.*Manual\.pm|Swttheme\.pm|Request\.pm|Modules\.pm(-.*)?)";
 | 
			
		||||
	my $navigation_cgi_ignore = 
 | 
			
		||||
	"(\.\.?|navigation|noframes|online-manual|(internal|pleasewait)(-.*)?)";
 | 
			
		||||
 | 
			
		||||
@@ -768,7 +788,23 @@ sub ip_number {
 | 
			
		||||
    return 'OK';
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub validate_password {
 | 
			
		||||
    my ($c, $strength, $pass) = @_;
 | 
			
		||||
    use esmith::util;
 | 
			
		||||
    use POSIX qw(locale_h);
 | 
			
		||||
    use locale;
 | 
			
		||||
    my $old_locale = setlocale(LC_ALL);
 | 
			
		||||
    setlocale(LC_ALL, "en_US");
 | 
			
		||||
    my $reason = esmith::util::validatePassword($pass,$strength);
 | 
			
		||||
    return "OK" if ($reason eq "ok");
 | 
			
		||||
    setlocale(LC_ALL, $old_locale);
 | 
			
		||||
    return
 | 
			
		||||
          $c->l("Bad Password Choice") . ": "
 | 
			
		||||
        . $c->l("The password you have chosen is not a good choice, because") . " "
 | 
			
		||||
        . $c->l($reason). ".";
 | 
			
		||||
} ## end sub validate_password
 | 
			
		||||
 | 
			
		||||
# to deprecate : this is not anymore a way to validate our passwords
 | 
			
		||||
sub is_normal_password {
 | 
			
		||||
 | 
			
		||||
#  from CGI::FormMagick::Validator qw( password );
 | 
			
		||||
@@ -784,6 +820,29 @@ sub is_normal_password {
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub gen_locale_date_string
 | 
			
		||||
{
 | 
			
		||||
    my $self = shift;
 | 
			
		||||
    my $i18n = esmith::I18N->new();
 | 
			
		||||
    $i18n->setLocale('formmagick', $i18n->preferredLanguage());
 | 
			
		||||
    return strftime "%c", localtime;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub get_public_ip_address
 | 
			
		||||
{
 | 
			
		||||
    my $self = shift;
 | 
			
		||||
	my $cdb = esmith::ConfigDB->open() || die "Couldn't open config db";
 | 
			
		||||
    my $sysconfig = $cdb->get('sysconfig');
 | 
			
		||||
    if ($sysconfig)
 | 
			
		||||
    {
 | 
			
		||||
        my $publicIP = $sysconfig->prop('PublicIP');
 | 
			
		||||
        if ($publicIP)
 | 
			
		||||
        {
 | 
			
		||||
            return $publicIP;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    return undef;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub email_simple {
 | 
			
		||||
    my ($c, $data) = @_;
 | 
			
		||||
@@ -866,4 +925,4 @@ sub get_reg_mask {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
1;
 | 
			
		||||
1;
 | 
			
		||||
							
								
								
									
										1
									
								
								root/usr/share/smanager/lib/SrvMngr/Controller/.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								root/usr/share/smanager/lib/SrvMngr/Controller/.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1 @@
 | 
			
		||||
*.tdy
 | 
			
		||||
@@ -0,0 +1 @@
 | 
			
		||||
-pbp -nst -nse -l=120 -ce -csc -pt=2 -kbl=0 -mbl=1 -lbl=1
 | 
			
		||||
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							@@ -4,172 +4,173 @@ package SrvMngr::Controller::Bugreport;
 | 
			
		||||
# heading     : Investigation
 | 
			
		||||
# description : Report a bug
 | 
			
		||||
# navigation  : 7000 500
 | 
			
		||||
 | 
			
		||||
# routes : end
 | 
			
		||||
#------------------------------
 | 
			
		||||
use strict;
 | 
			
		||||
use warnings;
 | 
			
		||||
use Mojo::Base 'Mojolicious::Controller';
 | 
			
		||||
 | 
			
		||||
use Locale::gettext;
 | 
			
		||||
use SrvMngr::I18N;
 | 
			
		||||
use SrvMngr qw(theme_list init_session);
 | 
			
		||||
 | 
			
		||||
use Text::Template;
 | 
			
		||||
use File::Basename;
 | 
			
		||||
use esmith::FormMagick qw( gen_locale_date_string );
 | 
			
		||||
 | 
			
		||||
use SrvMngr qw( gen_locale_date_string );
 | 
			
		||||
our $cdb = esmith::ConfigDB->open or die "Couldn't open ConfigDB\n";
 | 
			
		||||
 | 
			
		||||
use constant FALSE => 0;
 | 
			
		||||
use constant TRUE  => 1;
 | 
			
		||||
 | 
			
		||||
# Get some basic info on the current SME install
 | 
			
		||||
our $sysconfig = $cdb->get('sysconfig');
 | 
			
		||||
our $systemmode = $cdb->get('SystemMode')->value;
 | 
			
		||||
our $sysconfig          = $cdb->get('sysconfig');
 | 
			
		||||
our $systemmode         = $cdb->get('SystemMode')->value;
 | 
			
		||||
our $previoussystemmode = $sysconfig->prop('PreviousSystemMode');
 | 
			
		||||
our $releaseversion = $sysconfig->prop('ReleaseVersion');
 | 
			
		||||
our $releaseversion     = $sysconfig->prop('ReleaseVersion');
 | 
			
		||||
 | 
			
		||||
# Prepare some filehandles for templates and reports
 | 
			
		||||
our $templatefile = '/tmp/bugreport_template.txt';
 | 
			
		||||
our $templatefile     = '/tmp/bugreport_template.txt';
 | 
			
		||||
our $configreportfile = '/tmp/configreport.txt';
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
sub main {
 | 
			
		||||
    my $c = shift;
 | 
			
		||||
    $c->app->log->info($c->log_req);
 | 
			
		||||
 | 
			
		||||
    my %bugr_datas = ();
 | 
			
		||||
 | 
			
		||||
    my $title = $c->l('bugr_FORM_TITLE');
 | 
			
		||||
    my $modul = $c->render_to_string( inline => $c->l('bugr_DESCRIPTION'));
 | 
			
		||||
 | 
			
		||||
    my $title      = $c->l('bugr_FORM_TITLE');
 | 
			
		||||
    my $modul      = $c->render_to_string(inline => $c->l('bugr_DESCRIPTION'));
 | 
			
		||||
    $bugr_datas{'trt'} = 'SHOW';
 | 
			
		||||
 | 
			
		||||
    $c->stash(title => $title, modul => $modul, bugr_datas => \%bugr_datas);
 | 
			
		||||
    $c->render(template => 'bugreport');
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
} ## end sub main
 | 
			
		||||
 | 
			
		||||
sub do_report {
 | 
			
		||||
    my $c = shift;
 | 
			
		||||
    $c->app->log->info($c->log_req);
 | 
			
		||||
 | 
			
		||||
    my $title = $c->l('bugr_FORM_TITLE');
 | 
			
		||||
 | 
			
		||||
    my $trt = $c->param('trt') || 'SHOW';
 | 
			
		||||
 | 
			
		||||
    my $title      = $c->l('bugr_FORM_TITLE');
 | 
			
		||||
    my $trt        = $c->param('trt') || 'SHOW';
 | 
			
		||||
    my %bugr_datas = ();
 | 
			
		||||
    $bugr_datas{'trt'} = $trt;
 | 
			
		||||
 | 
			
		||||
    if ( $trt eq 'SHOW' ) {
 | 
			
		||||
	create_configuration_report();
 | 
			
		||||
 | 
			
		||||
    if ($trt eq 'SHOW') {
 | 
			
		||||
        create_configuration_report();
 | 
			
		||||
        my $out = $c->render_to_string(inline => show_config_report());
 | 
			
		||||
        $bugr_datas{'trt'} = 'DOWN';
 | 
			
		||||
        $c->stash(title => $title, modul => $out, bugr_datas => \%bugr_datas);
 | 
			
		||||
        $c->render(template => 'bugreport2');
 | 
			
		||||
    } ## end if ($trt eq 'SHOW')
 | 
			
		||||
 | 
			
		||||
	$bugr_datas{'trt'} = 'DOWN';
 | 
			
		||||
 | 
			
		||||
	$c->stash(title => $title, modul => $out, bugr_datas => \%bugr_datas);
 | 
			
		||||
	$c->render(template => 'bugreport2');
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if ( $trt eq 'DOWN' ) {
 | 
			
		||||
 | 
			
		||||
	my $modul = 'Bug report download';
 | 
			
		||||
	
 | 
			
		||||
#	$c->render_file(
 | 
			
		||||
#	    'filepath' => "$configreportfile",
 | 
			
		||||
#	    'format' => 'x-download',
 | 
			
		||||
#	    'content_disposition' => 'attachment',
 | 
			
		||||
#	    'cleanup' => 1,
 | 
			
		||||
#	);
 | 
			
		||||
 | 
			
		||||
    # the following in this sub will not be used !!!
 | 
			
		||||
#	$bugr_datas{'trt'} = 'DOWN';
 | 
			
		||||
 | 
			
		||||
#	$c->stash(title => $title, modul => $modul, bugr_datas => \%bugr_datas);
 | 
			
		||||
#	$c->render(template => 'bugreport');
 | 
			
		||||
    }
 | 
			
		||||
};
 | 
			
		||||
    if ($trt eq 'DOWN') {
 | 
			
		||||
        my $modul = 'Bug report download';
 | 
			
		||||
 | 
			
		||||
        #	$c->render_file(
 | 
			
		||||
        #	    'filepath' => "$configreportfile",
 | 
			
		||||
        #	    'format' => 'x-download',
 | 
			
		||||
        #	    'content_disposition' => 'attachment',
 | 
			
		||||
        #	    'cleanup' => 1,
 | 
			
		||||
        #	);
 | 
			
		||||
        # the following in this sub will not be used !!!
 | 
			
		||||
        #	$bugr_datas{'trt'} = 'DOWN';
 | 
			
		||||
        #	$c->stash(title => $title, modul => $modul, bugr_datas => \%bugr_datas);
 | 
			
		||||
        #	$c->render(template => 'bugreport');
 | 
			
		||||
    } ## end if ($trt eq 'DOWN')
 | 
			
		||||
} ## end sub do_report
 | 
			
		||||
 | 
			
		||||
sub create_configuration_report {
 | 
			
		||||
 | 
			
		||||
    my $c = shift;
 | 
			
		||||
 | 
			
		||||
    # TBD: possibly check $q for a boolean value eg. from a checkbox
 | 
			
		||||
    # indicating the user has read privacy warning etc.
 | 
			
		||||
 | 
			
		||||
    # create the reporting template
 | 
			
		||||
    my $configreport_template = Text::Template->new(TYPE => 'FILE', SOURCE => '/etc/e-smith/web/common/configuration_report.tmpl', UNTAINT => 1);
 | 
			
		||||
    my $configreport_template = Text::Template->new(
 | 
			
		||||
        TYPE    => 'FILE',
 | 
			
		||||
        SOURCE  => '/usr/share/smanager/themes/default/public/configuration_report.tmpl',
 | 
			
		||||
        UNTAINT => 1
 | 
			
		||||
    );
 | 
			
		||||
    my $report_creation_time = gen_locale_date_string;
 | 
			
		||||
 | 
			
		||||
    # curent kernel
 | 
			
		||||
    my $curkernel = `uname -r`;
 | 
			
		||||
    
 | 
			
		||||
 | 
			
		||||
    # get additional RPMs
 | 
			
		||||
    my @newrpms = `/sbin/e-smith/audittools/newrpms`;
 | 
			
		||||
    
 | 
			
		||||
 | 
			
		||||
    # get additional Repositories
 | 
			
		||||
    my @repositories = `/sbin/e-smith/audittools/repositories`;
 | 
			
		||||
    #print @repositories; 
 | 
			
		||||
 | 
			
		||||
    #print @repositories;
 | 
			
		||||
    # get templates
 | 
			
		||||
    my @templates = `/sbin/e-smith/audittools/templates`;
 | 
			
		||||
 | 
			
		||||
    # get events
 | 
			
		||||
    my @events = `/sbin/e-smith/audittools/events`;
 | 
			
		||||
    
 | 
			
		||||
    
 | 
			
		||||
 | 
			
		||||
    # set template variables
 | 
			
		||||
    my %vars = (report_creation_time => \$report_creation_time,
 | 
			
		||||
               releaseversion => \$releaseversion,
 | 
			
		||||
               curkernel => \$curkernel,
 | 
			
		||||
               systemmode => \$systemmode,
 | 
			
		||||
               previoussystemmode => \$previoussystemmode,
 | 
			
		||||
               newrpms => \@newrpms,
 | 
			
		||||
	       templates => \@templates,
 | 
			
		||||
	       events => \@events,
 | 
			
		||||
               repositories => \@repositories,
 | 
			
		||||
               ); 
 | 
			
		||||
    my %vars = (
 | 
			
		||||
        report_creation_time => \$report_creation_time,
 | 
			
		||||
        releaseversion       => \$releaseversion,
 | 
			
		||||
        curkernel            => \$curkernel,
 | 
			
		||||
        systemmode           => \$systemmode,
 | 
			
		||||
        previoussystemmode   => \$previoussystemmode,
 | 
			
		||||
        newrpms              => \@newrpms,
 | 
			
		||||
        templates            => \@templates,
 | 
			
		||||
        events               => \@events,
 | 
			
		||||
        repositories         => \@repositories,
 | 
			
		||||
    );
 | 
			
		||||
 | 
			
		||||
    # prcess template
 | 
			
		||||
    my $result = $configreport_template->fill_in(HASH => \%vars);
 | 
			
		||||
    
 | 
			
		||||
    #take out any multiple blank lines
 | 
			
		||||
    #$result =~ s/\n{3,}/\n/g;
 | 
			
		||||
    
 | 
			
		||||
 | 
			
		||||
    # write processed template to file
 | 
			
		||||
    open (my $cfgrep, '>', $configreportfile) or die "Could not create temporary file for config report!"; 
 | 
			
		||||
    open(my $cfgrep, '>', $configreportfile) or die "Could not create temporary file for config report!";
 | 
			
		||||
    print $cfgrep $result;
 | 
			
		||||
    close $cfgrep;
 | 
			
		||||
}
 | 
			
		||||
    
 | 
			
		||||
    #check if boot phase has completed.
 | 
			
		||||
	if (wait_for_boot_completion()) {
 | 
			
		||||
		#And create boot analysis image - now run externally following boot.
 | 
			
		||||
		$result = `/usr/bin/systemctl start bootsequence.service`;
 | 
			
		||||
		if (!$? == 0) {
 | 
			
		||||
			warn "/usr/bin/systemd-analyze plot Command failed \n";
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
  
 | 
			
		||||
} ## end sub create_configuration_report
 | 
			
		||||
 | 
			
		||||
sub wait_for_boot_completion {
 | 
			
		||||
    my $timeout = 60;  # 1-minute timeout
 | 
			
		||||
    my $end_time = time() + $timeout;
 | 
			
		||||
    while (time() < $end_time) {
 | 
			
		||||
        if (`systemctl list-jobs 2>&1` =~ /No jobs running/) {
 | 
			
		||||
            return TRUE;  # Success
 | 
			
		||||
        }
 | 
			
		||||
        sleep 5;
 | 
			
		||||
    }
 | 
			
		||||
    warn "Boot did not complete within $timeout seconds.\n";
 | 
			
		||||
    return FALSE;  # Failure
 | 
			
		||||
} ## end wait_for_boot_completion
 | 
			
		||||
 | 
			
		||||
sub show_config_report {
 | 
			
		||||
    my $c = shift;
 | 
			
		||||
 | 
			
		||||
    my $c   = shift;
 | 
			
		||||
    my $out = '';
 | 
			
		||||
    $out .= sprintf "<PRE>";
 | 
			
		||||
 | 
			
		||||
    open (my $cfgrep, '<', $configreportfile) or die "Could not find temporary config report file!";
 | 
			
		||||
    open(my $cfgrep, '<', $configreportfile) or die "Could not find temporary config report file!";
 | 
			
		||||
 | 
			
		||||
    while (<$cfgrep>) {
 | 
			
		||||
	$out .= sprintf("%s", $_);
 | 
			
		||||
        $out .= sprintf("%s", $_);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    $out .= sprintf "</PRE>";
 | 
			
		||||
 | 
			
		||||
    return $out;
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
} ## end sub show_config_report
 | 
			
		||||
 | 
			
		||||
sub download_config_report {
 | 
			
		||||
    my $c = shift;
 | 
			
		||||
 | 
			
		||||
    $c->render_file(
 | 
			
		||||
	    'filepath' => "$configreportfile",
 | 
			
		||||
	    'format' => 'x-download',
 | 
			
		||||
	    'content_disposition' => 'attachment',
 | 
			
		||||
	    'cleanup' => 1,
 | 
			
		||||
        'filepath'            => "$configreportfile",
 | 
			
		||||
        'format'              => 'x-download',
 | 
			
		||||
        'content_disposition' => 'attachment',
 | 
			
		||||
        'cleanup'             => 1,
 | 
			
		||||
    );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
1;
 | 
			
		||||
 | 
			
		||||
} ## end sub download_config_report
 | 
			
		||||
1;
 | 
			
		||||
@@ -7,107 +7,84 @@ package SrvMngr::Controller::Clamav;
 | 
			
		||||
#
 | 
			
		||||
# routes : end
 | 
			
		||||
#------------------------------
 | 
			
		||||
 | 
			
		||||
use strict;
 | 
			
		||||
use warnings;
 | 
			
		||||
use Mojo::Base 'Mojolicious::Controller';
 | 
			
		||||
 | 
			
		||||
use Locale::gettext;
 | 
			
		||||
use SrvMngr::I18N;
 | 
			
		||||
use SrvMngr qw(theme_list init_session);
 | 
			
		||||
 | 
			
		||||
#package esmith::FormMagick::Panel::clamav;
 | 
			
		||||
 | 
			
		||||
our $db = esmith::ConfigDB->open() || die "Couldn't open config db";
 | 
			
		||||
 | 
			
		||||
sub main {
 | 
			
		||||
    my $c = shift;
 | 
			
		||||
    $c->app->log->info($c->log_req);
 | 
			
		||||
 | 
			
		||||
    my %clm_datas = ();
 | 
			
		||||
    my $title = $c->l('clm_FORM_TITLE');
 | 
			
		||||
    my $modul = $c->render_to_string(inline => $c->l('clm_DESC_FILESYSTEM_SCAN_PERIOD'));
 | 
			
		||||
 | 
			
		||||
    $clm_datas{'FilesystemScan'} = ($db->get_prop('clamav','FilesystemScan')) || 'disabled';
 | 
			
		||||
    $clm_datas{'Quarantine'} = ($db->get_prop('clamav','Quarantine')) || 'disabled';
 | 
			
		||||
 | 
			
		||||
    $clm_datas{'clam_versions'} = get_clam_versions();
 | 
			
		||||
 | 
			
		||||
    $c->stash( title => $title, modul => $modul, clm_datas => \%clm_datas );
 | 
			
		||||
    my $title     = $c->l('clm_FORM_TITLE');
 | 
			
		||||
    my $modul     = $c->render_to_string(inline => $c->l('clm_DESC_FILESYSTEM_SCAN_PERIOD'));
 | 
			
		||||
    $clm_datas{'FilesystemScan'} = ($db->get_prop('clamav', 'FilesystemScan')) || 'disabled';
 | 
			
		||||
    $clm_datas{'Quarantine'}     = ($db->get_prop('clamav', 'Quarantine'))     || 'disabled';
 | 
			
		||||
    $clm_datas{'clam_versions'}  = get_clam_versions();
 | 
			
		||||
    $c->stash(title => $title, modul => $modul, clm_datas => \%clm_datas);
 | 
			
		||||
    $c->render(template => 'clamav');
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
} ## end sub main
 | 
			
		||||
 | 
			
		||||
sub do_update {
 | 
			
		||||
    my $c = shift;
 | 
			
		||||
    $c->app->log->info($c->log_req);
 | 
			
		||||
 | 
			
		||||
    my $http_clamav_status = $c->param('http_clamav_status') || 'disabled';
 | 
			
		||||
    my $smtp_clamav_status = $c->param('smtp_clamav_status') || '';
 | 
			
		||||
 | 
			
		||||
    my $result = "";
 | 
			
		||||
 | 
			
		||||
    my $result             = "";
 | 
			
		||||
    $c->change_settings();
 | 
			
		||||
 | 
			
		||||
    # Update the system
 | 
			
		||||
    system("/sbin/e-smith/signal-event clamav-update") == 0
 | 
			
		||||
        or $result = $c->l('clm_ERROR_UPDATING_CONFIGURATION');
 | 
			
		||||
 | 
			
		||||
    if ( ! $result ) { 
 | 
			
		||||
	$result = $c->l('clm_SUCCESS') ;
 | 
			
		||||
	$c->flash( success => $result );
 | 
			
		||||
    if (!$result) {
 | 
			
		||||
        $result = $c->l('clm_SUCCESS');
 | 
			
		||||
        $c->flash(success => $result);
 | 
			
		||||
    } else {
 | 
			
		||||
	$c->flash( error => $result );
 | 
			
		||||
        $c->flash(error => $result);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    $c->redirect_to('/clamav');
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
} ## end sub do_update
 | 
			
		||||
 | 
			
		||||
sub change_settings {
 | 
			
		||||
    my $c = shift;
 | 
			
		||||
 | 
			
		||||
    my $status = $c->param('status');
 | 
			
		||||
 | 
			
		||||
    my $FilesystemScan = ( $c->param('FilesystemScan') || 'disabled' );
 | 
			
		||||
    my $Quarantine = ( $c->param('Quarantine') || 'disabled' );
 | 
			
		||||
 | 
			
		||||
    my $DatabaseMirror = ( $c->param('DatabaseMirror') || 'db.us.clamav.net' );
 | 
			
		||||
    my $UpdateOfficeHrs = ( $c->param('UpdateOfficeHrs') || 'disabled' );
 | 
			
		||||
    my $UpdateNonOfficeHrs = ( $c->param('UpdateNonOfficeHrs') || 'disabled' );
 | 
			
		||||
    my $UpdateWeekend = ( $c->param('UpdateWeekend') || 'disabled' );
 | 
			
		||||
 | 
			
		||||
    my $HTTPProxyServer = ( $c->param('HTTPProxyServer') || '' );
 | 
			
		||||
    my $HTTPProxyPort = ( $c->param('HTTPProxyPort') || '' );
 | 
			
		||||
    my $HTTPProxyUsername = ( $c->param('HTTPProxyUsername') || '' );
 | 
			
		||||
    my $HTTPProxyPassword = ( $c->param('HTTPProxyPassword') || '' );
 | 
			
		||||
 | 
			
		||||
    my $clamav = $db->get('clamav') || $db->new_record('clamav', {type=>'service'});
 | 
			
		||||
    my $c                  = shift;
 | 
			
		||||
    my $status             = $c->param('status');
 | 
			
		||||
    my $FilesystemScan     = ($c->param('FilesystemScan') || 'disabled');
 | 
			
		||||
    my $Quarantine         = ($c->param('Quarantine') || 'disabled');
 | 
			
		||||
    my $DatabaseMirror     = ($c->param('DatabaseMirror') || 'db.us.clamav.net');
 | 
			
		||||
    my $UpdateOfficeHrs    = ($c->param('UpdateOfficeHrs') || 'disabled');
 | 
			
		||||
    my $UpdateNonOfficeHrs = ($c->param('UpdateNonOfficeHrs') || 'disabled');
 | 
			
		||||
    my $UpdateWeekend      = ($c->param('UpdateWeekend') || 'disabled');
 | 
			
		||||
    my $HTTPProxyServer    = ($c->param('HTTPProxyServer') || '');
 | 
			
		||||
    my $HTTPProxyPort      = ($c->param('HTTPProxyPort') || '');
 | 
			
		||||
    my $HTTPProxyUsername  = ($c->param('HTTPProxyUsername') || '');
 | 
			
		||||
    my $HTTPProxyPassword  = ($c->param('HTTPProxyPassword') || '');
 | 
			
		||||
    my $clamav             = $db->get('clamav') || $db->new_record('clamav', { type => 'service' });
 | 
			
		||||
    $status ||= $clamav->prop('status');
 | 
			
		||||
 | 
			
		||||
    $clamav->merge_props(
 | 
			
		||||
	    status => $status,
 | 
			
		||||
	    FilesystemScan => $FilesystemScan,
 | 
			
		||||
	    Quarantine => $Quarantine,
 | 
			
		||||
	    DatabaseMirror => $DatabaseMirror,
 | 
			
		||||
	    UpdateOfficeHrs => $UpdateOfficeHrs,
 | 
			
		||||
	    UpdateNonOfficeHrs => $UpdateNonOfficeHrs,
 | 
			
		||||
	    UpdateWeekend => $UpdateWeekend,
 | 
			
		||||
	    HTTPProxyServer => $HTTPProxyServer,
 | 
			
		||||
	    HTTPProxyPort => $HTTPProxyPort,
 | 
			
		||||
	    HTTPProxyUsername => $HTTPProxyUsername,
 | 
			
		||||
	    HTTPProxyPassword => $HTTPProxyPassword,
 | 
			
		||||
	);
 | 
			
		||||
        status             => $status,
 | 
			
		||||
        FilesystemScan     => $FilesystemScan,
 | 
			
		||||
        Quarantine         => $Quarantine,
 | 
			
		||||
        DatabaseMirror     => $DatabaseMirror,
 | 
			
		||||
        UpdateOfficeHrs    => $UpdateOfficeHrs,
 | 
			
		||||
        UpdateNonOfficeHrs => $UpdateNonOfficeHrs,
 | 
			
		||||
        UpdateWeekend      => $UpdateWeekend,
 | 
			
		||||
        HTTPProxyServer    => $HTTPProxyServer,
 | 
			
		||||
        HTTPProxyPort      => $HTTPProxyPort,
 | 
			
		||||
        HTTPProxyUsername  => $HTTPProxyUsername,
 | 
			
		||||
        HTTPProxyPassword  => $HTTPProxyPassword,
 | 
			
		||||
    );
 | 
			
		||||
} ## end sub change_settings
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub get_clam_versions
 | 
			
		||||
{
 | 
			
		||||
sub get_clam_versions {
 | 
			
		||||
    my $version = `/usr/bin/freshclam -V`;
 | 
			
		||||
    chomp $version;
 | 
			
		||||
    $version =~ s/^ClamAV //;
 | 
			
		||||
 
 | 
			
		||||
    return $version;
 | 
			
		||||
}
 | 
			
		||||
} ## end sub get_clam_versions
 | 
			
		||||
1;
 | 
			
		||||
 
 | 
			
		||||
@@ -4,191 +4,162 @@ package SrvMngr::Controller::Datetime;
 | 
			
		||||
# heading     : System
 | 
			
		||||
# description : Date and time
 | 
			
		||||
# navigation  : 4000 400
 | 
			
		||||
 | 
			
		||||
# routes : end
 | 
			
		||||
#------------------------------
 | 
			
		||||
 | 
			
		||||
use strict;
 | 
			
		||||
use warnings;
 | 
			
		||||
use Mojo::Base 'Mojolicious::Controller';
 | 
			
		||||
 | 
			
		||||
use Locale::gettext;
 | 
			
		||||
use SrvMngr::I18N;
 | 
			
		||||
use SrvMngr qw(theme_list init_session);
 | 
			
		||||
 | 
			
		||||
use esmith::FormMagick;
 | 
			
		||||
use esmith::util;
 | 
			
		||||
 | 
			
		||||
use SrvMngr qw( gen_locale_date_string );
 | 
			
		||||
our $cdb = esmith::ConfigDB->open() || die "Couldn't open config db";
 | 
			
		||||
 | 
			
		||||
sub main {
 | 
			
		||||
    my $c = shift;
 | 
			
		||||
    $c->app->log->info($c->log_req);
 | 
			
		||||
 | 
			
		||||
    my %dat_datas = ();
 | 
			
		||||
    my $title = $c->l('dat_FORM_TITLE');
 | 
			
		||||
    my $modul = $c->l('dat_INITIAL_DESC');
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    my $title     = $c->l('dat_FORM_TITLE');
 | 
			
		||||
    my $modul     = $c->l('dat_INITIAL_DESC');
 | 
			
		||||
    $dat_datas{ntpstatus} = 'disabled';
 | 
			
		||||
 | 
			
		||||
    my $rec = $cdb->get('ntpd');
 | 
			
		||||
 | 
			
		||||
    if ($rec) {
 | 
			
		||||
        $dat_datas{'ntpserver'} = $rec->prop('NTPServer') || '';
 | 
			
		||||
        if ( $rec->prop('status') eq 'enabled' ) {
 | 
			
		||||
    	    $dat_datas{ntpstatus} = 'enabled'
 | 
			
		||||
    		unless ($rec->prop('SyncToHWClockSupported') || 'yes') eq 'yes' and $dat_datas{ntpserver} =~ m#^\s*$#;
 | 
			
		||||
	}
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    ($dat_datas{weekday}, $dat_datas{monthname}, 
 | 
			
		||||
	$dat_datas{month}, $dat_datas{day}, $dat_datas{year},
 | 
			
		||||
	$dat_datas{hour}, $dat_datas{minute}, $dat_datas{second},
 | 
			
		||||
	$dat_datas{ampm}) = split /\|/, 
 | 
			
		||||
                      `/bin/date '+%A|%B|%-m|%-d|%Y|%-I|%M|%S|%p'`;
 | 
			
		||||
        if ($rec->prop('status') eq 'enabled') {
 | 
			
		||||
            $dat_datas{ntpstatus} = 'enabled'
 | 
			
		||||
                unless ($rec->prop('SyncToHWClockSupported') || 'yes') eq 'yes' and $dat_datas{ntpserver} =~ m#^\s*$#;
 | 
			
		||||
        }
 | 
			
		||||
    } ## end if ($rec)
 | 
			
		||||
    (   $dat_datas{weekday}, $dat_datas{monthname}, $dat_datas{month},  $dat_datas{day}, $dat_datas{year},
 | 
			
		||||
        $dat_datas{hour},    $dat_datas{minute},    $dat_datas{second}, $dat_datas{ampm}
 | 
			
		||||
        )
 | 
			
		||||
        = split /\|/,
 | 
			
		||||
        `/bin/date '+%A|%B|%-m|%-d|%Y|%-I|%M|%S|%p'`;
 | 
			
		||||
 | 
			
		||||
    # get rid of trailing carriage return on last field
 | 
			
		||||
    chop ($dat_datas{ampm});
 | 
			
		||||
 | 
			
		||||
    $dat_datas{'now_string'} = esmith::FormMagick->gen_locale_date_string();
 | 
			
		||||
 | 
			
		||||
    $c->stash( title => $title, modul => $modul, dat_datas => \%dat_datas );
 | 
			
		||||
    chop($dat_datas{ampm});
 | 
			
		||||
    $dat_datas{'now_string'} = gen_locale_date_string;
 | 
			
		||||
    $c->stash(title => $title, modul => $modul, dat_datas => \%dat_datas);
 | 
			
		||||
    $c->render('datetime');
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
} ## end sub main
 | 
			
		||||
 | 
			
		||||
sub do_update {
 | 
			
		||||
 | 
			
		||||
    my $c = shift;
 | 
			
		||||
 | 
			
		||||
    my $c         = shift;
 | 
			
		||||
    my %dat_datas = ();
 | 
			
		||||
    my $title = $c->l('dat_FORM_TITLE');
 | 
			
		||||
    my $modul = $c->l('dat_INITIAL_DESC');
 | 
			
		||||
    my $title     = $c->l('dat_FORM_TITLE');
 | 
			
		||||
    my $modul     = $c->l('dat_INITIAL_DESC');
 | 
			
		||||
    my $result;
 | 
			
		||||
    my $success;
 | 
			
		||||
 | 
			
		||||
    my $old_ntpstatus = $c->param('Old_ntpstatus');
 | 
			
		||||
    $dat_datas{ntpstatus} = $c->param('Ntpstatus');
 | 
			
		||||
 | 
			
		||||
    if ($dat_datas{ntpstatus} ne $old_ntpstatus) {
 | 
			
		||||
        if ($dat_datas{ntpstatus} eq 'disabled') {
 | 
			
		||||
            (   $dat_datas{weekday}, $dat_datas{monthname}, $dat_datas{month},
 | 
			
		||||
                $dat_datas{day},     $dat_datas{year},      $dat_datas{hour},
 | 
			
		||||
                $dat_datas{minute},  $dat_datas{second},    $dat_datas{ampm}
 | 
			
		||||
                )
 | 
			
		||||
                = split /\|/,
 | 
			
		||||
                `/bin/date '+%A|%B|%-m|%-d|%Y|%-I|%M|%S|%p'`;
 | 
			
		||||
 | 
			
		||||
    if ( $dat_datas{ntpstatus} ne $old_ntpstatus) {
 | 
			
		||||
            # get rid of trailing carriage return on last field
 | 
			
		||||
            chop($dat_datas{ampm});
 | 
			
		||||
        } else {
 | 
			
		||||
            $dat_datas{ntpserver} = ($cdb->get_prop('ntpd', 'NTPServer')) || '';
 | 
			
		||||
        }
 | 
			
		||||
        $dat_datas{now_string} = esmith::FormMagick->gen_locale_date_string();
 | 
			
		||||
        $c->stash(title => $title, modul => $modul, dat_datas => \%dat_datas);
 | 
			
		||||
        return $c->render('datetime');
 | 
			
		||||
    } ## end if ($dat_datas{ntpstatus...})
 | 
			
		||||
 | 
			
		||||
        if ( $dat_datas{ntpstatus} eq 'disabled' ) {
 | 
			
		||||
    	    ($dat_datas{weekday},
 | 
			
		||||
    	    $dat_datas{monthname},
 | 
			
		||||
    	    $dat_datas{month},
 | 
			
		||||
	    $dat_datas{day},
 | 
			
		||||
    	    $dat_datas{year},
 | 
			
		||||
    	    $dat_datas{hour},
 | 
			
		||||
	    $dat_datas{minute},
 | 
			
		||||
    	    $dat_datas{second},
 | 
			
		||||
    	    $dat_datas{ampm}) = split /\|/, 
 | 
			
		||||
                      `/bin/date '+%A|%B|%-m|%-d|%Y|%-I|%M|%S|%p'`;
 | 
			
		||||
 | 
			
		||||
	    # get rid of trailing carriage return on last field
 | 
			
		||||
	    chop ($dat_datas{ampm});
 | 
			
		||||
 | 
			
		||||
	} else {
 | 
			
		||||
 | 
			
		||||
	    $dat_datas{ntpserver} = ($cdb->get_prop('ntpd','NTPServer')) || '';
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	$dat_datas{now_string} = esmith::FormMagick->gen_locale_date_string();
 | 
			
		||||
	
 | 
			
		||||
	$c->stash( title => $title, modul => $modul, dat_datas => \%dat_datas );
 | 
			
		||||
	return $c->render('datetime');
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if ( $dat_datas{ntpstatus} eq 'enabled' ) {
 | 
			
		||||
 | 
			
		||||
    # update ntpserver
 | 
			
		||||
    if ($dat_datas{ntpstatus} eq 'enabled') {
 | 
			
		||||
 | 
			
		||||
        # update ntpserver
 | 
			
		||||
        $dat_datas{ntpserver} = $c->param('Ntpserver') || '';
 | 
			
		||||
 | 
			
		||||
        if ( $dat_datas{ntpserver} eq "pool.ntp.org" ) {
 | 
			
		||||
        if ($dat_datas{ntpserver} eq "pool.ntp.org") {
 | 
			
		||||
            $result .= $c->l('dat_INVALID_NTP_ADDR');
 | 
			
		||||
        } elsif ( $dat_datas{ntpserver} =~ /^([a-zA-Z0-9\.\-]+)$/ ) {
 | 
			
		||||
        } elsif ($dat_datas{ntpserver} =~ /^([a-zA-Z0-9\.\-]+)$/) {
 | 
			
		||||
            $dat_datas{ntpserver} = $1;
 | 
			
		||||
#        } elsif ( $dat_datas{ntpserver} =~ /^\s*$/ ) {
 | 
			
		||||
#            $dat_datas{ntpserver} = "";
 | 
			
		||||
 | 
			
		||||
            #        } elsif ( $dat_datas{ntpserver} =~ /^\s*$/ ) {
 | 
			
		||||
            #            $dat_datas{ntpserver} = "";
 | 
			
		||||
        } else {
 | 
			
		||||
            $result .= $c->l('dat_INVALID_NTP_ADDR');
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
	if ( ! $result ) {
 | 
			
		||||
	    $success = update_ntpserver( $c, $dat_datas{ntpserver} );
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
        if (!$result) {
 | 
			
		||||
            $success = update_ntpserver($c, $dat_datas{ntpserver});
 | 
			
		||||
        }
 | 
			
		||||
    } else {
 | 
			
		||||
 | 
			
		||||
    # set Locale time & clean ntpserver
 | 
			
		||||
        # set Locale time & clean ntpserver
 | 
			
		||||
        #my $servername = ($c->param('ServerName') || 'WS');
 | 
			
		||||
        if (!$result) {
 | 
			
		||||
            $result = validate_change_datetime($c);
 | 
			
		||||
 | 
			
		||||
	    #my $servername = ($c->param('ServerName') || 'WS');
 | 
			
		||||
	if ( ! $result ) {
 | 
			
		||||
	    $result = validate_change_datetime( $c );
 | 
			
		||||
	    if ( $result eq 'OK' ) {
 | 
			
		||||
		$success = $c->l('dat_UPDATING_CLOCK');
 | 
			
		||||
		$result = '';
 | 
			
		||||
		disable_ntp();
 | 
			
		||||
		$success .= '<br>'. $c->l('dat_SERVER_DISABLED_DESC');
 | 
			
		||||
	    }
 | 
			
		||||
	}
 | 
			
		||||
    }
 | 
			
		||||
            if ($result eq 'OK') {
 | 
			
		||||
                $success = $c->l('dat_UPDATING_CLOCK');
 | 
			
		||||
                $result  = '';
 | 
			
		||||
                disable_ntp();
 | 
			
		||||
                $success .= '<br>' . $c->l('dat_SERVER_DISABLED_DESC');
 | 
			
		||||
            } ## end if ($result eq 'OK')
 | 
			
		||||
        } ## end if (!$result)
 | 
			
		||||
    } ## end else [ if ($dat_datas{ntpstatus...})]
 | 
			
		||||
 | 
			
		||||
    if ($result) {
 | 
			
		||||
        $c->stash(error => $result);
 | 
			
		||||
        $c->stash(title => $title, modul => $modul, dat_datas => \%dat_datas);
 | 
			
		||||
        return $c->render('datetime');
 | 
			
		||||
    } ## end if ($result)
 | 
			
		||||
 | 
			
		||||
    if ( $result ) {
 | 
			
		||||
	$c->stash( error => $result );
 | 
			
		||||
	$c->stash( title => $title, modul => $modul, dat_datas => \%dat_datas );
 | 
			
		||||
	return $c->render('datetime');
 | 
			
		||||
    }
 | 
			
		||||
    #$result = $c->l('dat_SUCCESS');
 | 
			
		||||
 | 
			
		||||
    my $message = "'Datetime' update DONE";
 | 
			
		||||
    $c->app->log->info($message);
 | 
			
		||||
    $c->flash( success => $success );
 | 
			
		||||
 | 
			
		||||
    $c->flash(success => $success);
 | 
			
		||||
    $c->redirect_to('/datetime');
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
} ## end sub do_update
 | 
			
		||||
 | 
			
		||||
sub validate_change_datetime {
 | 
			
		||||
 | 
			
		||||
    my $c = shift;
 | 
			
		||||
 | 
			
		||||
    #--------------------------------------------------
 | 
			
		||||
    # Untaint parameters and check for validity
 | 
			
		||||
    #--------------------------------------------------
 | 
			
		||||
    my $timezone = $c->param('Timezone');
 | 
			
		||||
 | 
			
		||||
    my $timezone = $c->param ('Timezone');
 | 
			
		||||
    if ($timezone =~ /^([\w\-]+\/?[\w\-+]*)$/) {
 | 
			
		||||
        $timezone = $1;
 | 
			
		||||
    } else {
 | 
			
		||||
        $timezone = "US/Eastern";
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    my $month = $c->param ('Month');
 | 
			
		||||
    my $month = $c->param('Month');
 | 
			
		||||
 | 
			
		||||
    if ($month =~ /^(\d{1,2})$/) {
 | 
			
		||||
        $month = $1;
 | 
			
		||||
    } else {
 | 
			
		||||
        $month = "1";
 | 
			
		||||
    }
 | 
			
		||||
    if (($month < 1) || ($month > 12)) {
 | 
			
		||||
        return $c->l('dat_INVALID_MONTH')." $month. ". $c->l('dat_MONTH_BETWEEN_1_AND_12');
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    my $day = $c->param ('Day');
 | 
			
		||||
    if (($month < 1) || ($month > 12)) {
 | 
			
		||||
        return $c->l('dat_INVALID_MONTH') . " $month. " . $c->l('dat_MONTH_BETWEEN_1_AND_12');
 | 
			
		||||
    }
 | 
			
		||||
    my $day = $c->param('Day');
 | 
			
		||||
 | 
			
		||||
    if ($day =~ /^(\d{1,2})$/) {
 | 
			
		||||
        $day = $1;
 | 
			
		||||
    } else {
 | 
			
		||||
        $day = "1";
 | 
			
		||||
    }
 | 
			
		||||
    if (($day < 1) || ($day > 31)) {
 | 
			
		||||
	return $c->l('dat_INVALID_DAY')." $day. ". $c->l('dat_BETWEEN_1_AND_31');
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    my $year = $c->param ('Year');
 | 
			
		||||
    if (($day < 1) || ($day > 31)) {
 | 
			
		||||
        return $c->l('dat_INVALID_DAY') . " $day. " . $c->l('dat_BETWEEN_1_AND_31');
 | 
			
		||||
    }
 | 
			
		||||
    my $year = $c->param('Year');
 | 
			
		||||
 | 
			
		||||
    if ($year =~ /^(\d{4})$/) {
 | 
			
		||||
        $year = $1;
 | 
			
		||||
    } else {
 | 
			
		||||
@@ -196,20 +167,21 @@ sub validate_change_datetime {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if (($year < 1900) || ($year > 2200)) {
 | 
			
		||||
	return $c->l('dat_INVALID_YEAR')." $year. ". $c->l('dat_FOUR_DIGIT_YEAR');
 | 
			
		||||
        return $c->l('dat_INVALID_YEAR') . " $year. " . $c->l('dat_FOUR_DIGIT_YEAR');
 | 
			
		||||
    }
 | 
			
		||||
    my $hour = $c->param('Hour');
 | 
			
		||||
 | 
			
		||||
    my $hour = $c->param ('Hour');
 | 
			
		||||
    if ($hour =~ /^(\d{1,2})$/) {
 | 
			
		||||
        $hour = $1;
 | 
			
		||||
    } else {
 | 
			
		||||
        $hour = "12";
 | 
			
		||||
    }
 | 
			
		||||
    if (($hour < 1) || ($hour > 12)) {
 | 
			
		||||
	return $c->l('dat_INVALID_HOUR')." $hour. ". $c->l('dat_BETWEEN_1_AND_12');
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    my $minute = $c->param ('Minute');
 | 
			
		||||
    if (($hour < 1) || ($hour > 12)) {
 | 
			
		||||
        return $c->l('dat_INVALID_HOUR') . " $hour. " . $c->l('dat_BETWEEN_1_AND_12');
 | 
			
		||||
    }
 | 
			
		||||
    my $minute = $c->param('Minute');
 | 
			
		||||
 | 
			
		||||
    if ($minute =~ /^(\d{1,2})$/) {
 | 
			
		||||
        $minute = $1;
 | 
			
		||||
    } else {
 | 
			
		||||
@@ -217,10 +189,10 @@ sub validate_change_datetime {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if (($minute < 0) || ($minute > 59)) {
 | 
			
		||||
        return $c->l('datINVALID_MINUTE')." $minute. ".$c->l('dat_BETWEEN_0_AND_59');
 | 
			
		||||
        return $c->l('datINVALID_MINUTE') . " $minute. " . $c->l('dat_BETWEEN_0_AND_59');
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    my $second = $c->param ('Second');
 | 
			
		||||
    my $second = $c->param('Second');
 | 
			
		||||
 | 
			
		||||
    if ($second =~ /^(\d{1,2})$/) {
 | 
			
		||||
        $second = $1;
 | 
			
		||||
    } else {
 | 
			
		||||
@@ -228,10 +200,10 @@ sub validate_change_datetime {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if (($second < 0) || ($second > 59)) {
 | 
			
		||||
	return $c->l('dat_INVALID_SECOND')." $second. ". $c->l('dat_BETWEEN_0_AND_59');
 | 
			
		||||
        return $c->l('dat_INVALID_SECOND') . " $second. " . $c->l('dat_BETWEEN_0_AND_59');
 | 
			
		||||
    }
 | 
			
		||||
    my $ampm = $c->param('Ampm');
 | 
			
		||||
 | 
			
		||||
    my $ampm = $c->param ('Ampm');
 | 
			
		||||
    if ($ampm =~ /^(AM|PM)$/) {
 | 
			
		||||
        $ampm = $1;
 | 
			
		||||
    } else {
 | 
			
		||||
@@ -239,8 +211,8 @@ sub validate_change_datetime {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    # convert to 24 hour time
 | 
			
		||||
 | 
			
		||||
    $hour = $hour % 12;
 | 
			
		||||
 | 
			
		||||
    if ($ampm eq "PM") {
 | 
			
		||||
        $hour = $hour + 12;
 | 
			
		||||
    }
 | 
			
		||||
@@ -248,12 +220,12 @@ sub validate_change_datetime {
 | 
			
		||||
    #--------------------------------------------------
 | 
			
		||||
    # Store time zone in configuration database
 | 
			
		||||
    #--------------------------------------------------
 | 
			
		||||
 | 
			
		||||
    my $conf = esmith::ConfigDB->open();
 | 
			
		||||
    my $old = $conf->get('UnsavedChanges')->value;
 | 
			
		||||
    my $rec = $conf->get('TimeZone');
 | 
			
		||||
    my $old  = $conf->get('UnsavedChanges')->value;
 | 
			
		||||
    my $rec  = $conf->get('TimeZone');
 | 
			
		||||
 | 
			
		||||
    unless ($rec) {
 | 
			
		||||
        $rec = $conf->new_record('TimeZone',undef);
 | 
			
		||||
        $rec = $conf->new_record('TimeZone', undef);
 | 
			
		||||
    }
 | 
			
		||||
    $rec->set_value($timezone);
 | 
			
		||||
    $conf->get('UnsavedChanges')->set_value($old);
 | 
			
		||||
@@ -262,71 +234,56 @@ sub validate_change_datetime {
 | 
			
		||||
    # Signal event to change time zone, system time
 | 
			
		||||
    # and hardware clock
 | 
			
		||||
    #--------------------------------------------------
 | 
			
		||||
 | 
			
		||||
    my $newdate = sprintf "%02d%02d%02d%02d%04d.%02d",
 | 
			
		||||
            $month, $day, $hour, $minute, $year, $second;
 | 
			
		||||
 | 
			
		||||
    esmith::util::backgroundCommand(2, 
 | 
			
		||||
        "/sbin/e-smith/signal-event","timezone-update",$newdate);
 | 
			
		||||
 | 
			
		||||
    my $newdate = sprintf "%02d%02d%02d%02d%04d.%02d", $month, $day, $hour, $minute, $year, $second;
 | 
			
		||||
    esmith::util::backgroundCommand(2, "/sbin/e-smith/signal-event", "timezone-update", $newdate);
 | 
			
		||||
    return 'OK';
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
} ## end sub validate_change_datetime
 | 
			
		||||
 | 
			
		||||
sub update_ntpserver {
 | 
			
		||||
 | 
			
		||||
    my $c = shift;
 | 
			
		||||
    my $c         = shift;
 | 
			
		||||
    my $ntpserver = shift;
 | 
			
		||||
    
 | 
			
		||||
    my $msg;
 | 
			
		||||
        #------------------------------------------------------------
 | 
			
		||||
        # Looks good; go ahead and change the parameters.
 | 
			
		||||
        #------------------------------------------------------------
 | 
			
		||||
 | 
			
		||||
    #------------------------------------------------------------
 | 
			
		||||
    # Looks good; go ahead and change the parameters.
 | 
			
		||||
    #------------------------------------------------------------
 | 
			
		||||
    my $old = $cdb->get('UnsavedChanges')->value;
 | 
			
		||||
    my $rec = $cdb->get('ntpd');
 | 
			
		||||
 | 
			
		||||
    if ($rec) {
 | 
			
		||||
        $rec->set_prop('status','enabled');
 | 
			
		||||
        $rec->set_prop('NTPServer',$ntpserver);
 | 
			
		||||
        $rec->set_prop('status',    'enabled');
 | 
			
		||||
        $rec->set_prop('NTPServer', $ntpserver);
 | 
			
		||||
    } else {
 | 
			
		||||
        $rec = $cdb->new_record( 'ntpd',
 | 
			
		||||
            { type=>'service', status=>'enabled', SyncToHWClockSupported => 'yes', NTPServer=>$ntpserver } );
 | 
			
		||||
        $rec = $cdb->new_record('ntpd',
 | 
			
		||||
            { type => 'service', status => 'enabled', SyncToHWClockSupported => 'yes', NTPServer => $ntpserver });
 | 
			
		||||
    }
 | 
			
		||||
    $cdb->get('UnsavedChanges')->set_value($old);
 | 
			
		||||
 | 
			
		||||
    $msg = $c->l('dat_SETTINGS_CHANGED');
 | 
			
		||||
 | 
			
		||||
    if ( $ntpserver =~ /^\s*$/ ) {
 | 
			
		||||
    if ($ntpserver =~ /^\s*$/) {
 | 
			
		||||
        $rec->set_prop('status', ($rec->prop('SyncToHWClockSupported') || 'yes') eq 'yes' ? 'enabled' : 'disabled');
 | 
			
		||||
        $rec->set_prop('NTPServer', '');
 | 
			
		||||
        $msg = $c->l('dat_INVALID_NTP_SERVER') if ($rec->prop('SyncToHWClockSupported') || 'yes') ne 'yes';
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    esmith::util::backgroundCommand( 2, "/sbin/e-smith/signal-event", "timeserver-update" );
 | 
			
		||||
 | 
			
		||||
    } ## end if ($ntpserver =~ /^\s*$/)
 | 
			
		||||
    esmith::util::backgroundCommand(2, "/sbin/e-smith/signal-event", "timeserver-update");
 | 
			
		||||
    return $msg;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
} ## end sub update_ntpserver
 | 
			
		||||
 | 
			
		||||
sub disable_ntp {
 | 
			
		||||
 | 
			
		||||
    # make sure that the parameters are set for disabled
 | 
			
		||||
 | 
			
		||||
    my $old = $cdb->get('UnsavedChanges')->value;
 | 
			
		||||
    my $rec = $cdb->get('ntpd');
 | 
			
		||||
 | 
			
		||||
    if ($rec) {
 | 
			
		||||
        $rec->set_prop('status', ($rec->prop('SyncToHWClockSupported') || 'yes') eq 'yes' ? 'enabled' : 'disabled');
 | 
			
		||||
        $rec->set_prop('NTPServer','');
 | 
			
		||||
        $rec->set_prop('NTPServer', '');
 | 
			
		||||
    } else {
 | 
			
		||||
        $rec = $cdb->new_record('ntpd', 
 | 
			
		||||
            {type=>'service', status=>'enabled', SyncToHWClockSupported => 'yes', NTPServer=>''});
 | 
			
		||||
        $rec = $cdb->new_record('ntpd',
 | 
			
		||||
            { type => 'service', status => 'enabled', SyncToHWClockSupported => 'yes', NTPServer => '' });
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    $cdb->get('UnsavedChanges')->set_value($old);
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
} ## end sub disable_ntp
 | 
			
		||||
 | 
			
		||||
sub getTimezone {
 | 
			
		||||
 | 
			
		||||
@@ -336,69 +293,64 @@ sub getTimezone {
 | 
			
		||||
    # If that is not defined, try and get it from /etc/localtime.
 | 
			
		||||
    # If that doesn't work, default to US/Eastern.
 | 
			
		||||
    #--------------------------------------------------
 | 
			
		||||
 | 
			
		||||
    my $localtime;
 | 
			
		||||
    my $timezonedefault = "US/Eastern";
 | 
			
		||||
 | 
			
		||||
    if (defined $cdb->get('TimeZone')) {
 | 
			
		||||
         $timezonedefault = $cdb->get('TimeZone')->value;
 | 
			
		||||
        $timezonedefault = $cdb->get('TimeZone')->value;
 | 
			
		||||
    } else {
 | 
			
		||||
        if (defined ($localtime = readlink '/etc/localtime')) {
 | 
			
		||||
            my $pos = index $localtime, 'zoneinfo/';
 | 
			
		||||
            if ( $pos > -1 ) {
 | 
			
		||||
                 $timezonedefault = substr $localtime, ($pos + 9);
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    return $timezonedefault;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
        if (defined($localtime = readlink '/etc/localtime')) {
 | 
			
		||||
            my $pos = index $localtime, 'zoneinfo/';
 | 
			
		||||
 | 
			
		||||
            if ($pos > -1) {
 | 
			
		||||
                $timezonedefault = substr $localtime, ($pos + 9);
 | 
			
		||||
            }
 | 
			
		||||
        } ## end if (defined($localtime...))
 | 
			
		||||
    } ## end else [ if (defined $cdb->get(...))]
 | 
			
		||||
    return $timezonedefault;
 | 
			
		||||
} ## end sub getTimezone
 | 
			
		||||
 | 
			
		||||
sub getZone_list {
 | 
			
		||||
 | 
			
		||||
    my $c = shift;
 | 
			
		||||
 | 
			
		||||
    #--------------------------------------------------
 | 
			
		||||
    # Get a sorted list of time zones
 | 
			
		||||
    #--------------------------------------------------
 | 
			
		||||
 | 
			
		||||
    $ENV{BASH_ENV} = '';
 | 
			
		||||
    if (! open (ZONES, "cd /usr/share/zoneinfo; /usr/bin/find . -type f -or -type l | /bin/grep '^./[A-Z]' |"))
 | 
			
		||||
    {
 | 
			
		||||
        warn ( $c->l('COULD_NOT_OPEN_TZ_FILE').$!.'.' );
 | 
			
		||||
 | 
			
		||||
    if (!open(ZONES, "cd /usr/share/zoneinfo; /usr/bin/find . -type f -or -type l | /bin/grep '^./[A-Z]' |")) {
 | 
			
		||||
        warn($c->l('COULD_NOT_OPEN_TZ_FILE') . $! . '.');
 | 
			
		||||
        return undef;
 | 
			
		||||
    }
 | 
			
		||||
    my $zone;    
 | 
			
		||||
    my $zone;
 | 
			
		||||
    my @zones = ();
 | 
			
		||||
 | 
			
		||||
    while (defined ($zone = <ZONES>))
 | 
			
		||||
    {
 | 
			
		||||
        chop ($zone);
 | 
			
		||||
    while (defined($zone = <ZONES>)) {
 | 
			
		||||
        chop($zone);
 | 
			
		||||
        $zone =~ s/^.\///;
 | 
			
		||||
        push @zones, $zone;
 | 
			
		||||
    }
 | 
			
		||||
    } ## end while (defined($zone = <ZONES>...))
 | 
			
		||||
    close ZONES;
 | 
			
		||||
    my @zt = sort @zones;
 | 
			
		||||
    return \@zt;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
} ## end sub getZone_list
 | 
			
		||||
 | 
			
		||||
sub getMonth_list {
 | 
			
		||||
 | 
			
		||||
    my $c = shift;
 | 
			
		||||
    return  [[ $c->l('dat_JANUARY') => '1'],
 | 
			
		||||
            [ $c->l('dat_FEBRUARY') => '2'],
 | 
			
		||||
            [ $c->l('dat_MARCH') => '3'],
 | 
			
		||||
            [ $c->l('dat_APRIL') => '4'],
 | 
			
		||||
            [ $c->l('dat_MAY') => '5'],
 | 
			
		||||
            [ $c->l('dat_JUNE') => '6'],
 | 
			
		||||
            [ $c->l('dat_JULY') => '7'],
 | 
			
		||||
            [ $c->l('dat_AUGUST') => '8'],
 | 
			
		||||
            [ $c->l('dat_SEPTEMBER') => '9'],
 | 
			
		||||
            [ $c->l('dat_OCTOBER') => '10'],
 | 
			
		||||
            [ $c->l('dat_NOVEMBER') => '11'],
 | 
			
		||||
            [ $c->l('dat_DECEMBER') => '12']];
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    return [
 | 
			
		||||
        [ $c->l('dat_JANUARY')   => '1' ],
 | 
			
		||||
        [ $c->l('dat_FEBRUARY')  => '2' ],
 | 
			
		||||
        [ $c->l('dat_MARCH')     => '3' ],
 | 
			
		||||
        [ $c->l('dat_APRIL')     => '4' ],
 | 
			
		||||
        [ $c->l('dat_MAY')       => '5' ],
 | 
			
		||||
        [ $c->l('dat_JUNE')      => '6' ],
 | 
			
		||||
        [ $c->l('dat_JULY')      => '7' ],
 | 
			
		||||
        [ $c->l('dat_AUGUST')    => '8' ],
 | 
			
		||||
        [ $c->l('dat_SEPTEMBER') => '9' ],
 | 
			
		||||
        [ $c->l('dat_OCTOBER')   => '10' ],
 | 
			
		||||
        [ $c->l('dat_NOVEMBER')  => '11' ],
 | 
			
		||||
        [ $c->l('dat_DECEMBER')  => '12' ]
 | 
			
		||||
    ];
 | 
			
		||||
} ## end sub getMonth_list
 | 
			
		||||
1;
 | 
			
		||||
 
 | 
			
		||||
@@ -7,91 +7,87 @@ package SrvMngr::Controller::Directory;
 | 
			
		||||
#
 | 
			
		||||
# routes : end
 | 
			
		||||
#----------------------------------------------------------------------
 | 
			
		||||
 | 
			
		||||
use strict;
 | 
			
		||||
use warnings;
 | 
			
		||||
use Mojo::Base 'Mojolicious::Controller';
 | 
			
		||||
 | 
			
		||||
use Locale::gettext;
 | 
			
		||||
use SrvMngr::I18N;
 | 
			
		||||
use SrvMngr qw(theme_list init_session);
 | 
			
		||||
 | 
			
		||||
#use esmith::util qw(ldapBase);
 | 
			
		||||
use esmith::FormMagick::Panel::directory;
 | 
			
		||||
 | 
			
		||||
our $db = esmith::ConfigDB->open() || die "Couldn't open config db";
 | 
			
		||||
 | 
			
		||||
sub main {
 | 
			
		||||
 | 
			
		||||
    my $c = shift;
 | 
			
		||||
    $c->app->log->info($c->log_req);
 | 
			
		||||
 | 
			
		||||
    my %dir_datas = ();
 | 
			
		||||
    my $title = $c->l('dir_FORM_TITLE');
 | 
			
		||||
    my $modul = $c->render_to_string(inline => $c->l('dir_DESCRIPTION'));
 | 
			
		||||
 | 
			
		||||
    $dir_datas{'root'} = get_ldap_base();
 | 
			
		||||
 | 
			
		||||
    $dir_datas{'access'} = ($db->get_prop('ldap','access')) || 'private';
 | 
			
		||||
    $dir_datas{'department'} = ($db->get_prop('ldap','defaultDepartment')) || '';
 | 
			
		||||
    $dir_datas{'company'} = ($db->get_prop('ldap','defaultCompany')) || '';
 | 
			
		||||
    $dir_datas{'street'} = ($db->get_prop('ldap','defaultStreet')) || '';
 | 
			
		||||
    $dir_datas{'city'} = ($db->get_prop('ldap','defaultCity')) || '';
 | 
			
		||||
    $dir_datas{'phonenumber'} = ($db->get_prop('ldap','defaultPhoneNumber')) || '';
 | 
			
		||||
 | 
			
		||||
    $c->stash( title => $title, modul => $modul, dir_datas => \%dir_datas );
 | 
			
		||||
    my $title     = $c->l('dir_FORM_TITLE');
 | 
			
		||||
    my $modul     = $c->render_to_string(inline => $c->l('dir_DESCRIPTION'));
 | 
			
		||||
    $dir_datas{'root'}        = get_ldap_base();
 | 
			
		||||
    $dir_datas{'access'}      = ($db->get_prop('ldap', 'access')) || 'private';
 | 
			
		||||
    $dir_datas{'department'}  = ($db->get_prop('ldap', 'defaultDepartment')) || '';
 | 
			
		||||
    $dir_datas{'company'}     = ($db->get_prop('ldap', 'defaultCompany')) || '';
 | 
			
		||||
    $dir_datas{'street'}      = ($db->get_prop('ldap', 'defaultStreet')) || '';
 | 
			
		||||
    $dir_datas{'city'}        = ($db->get_prop('ldap', 'defaultCity')) || '';
 | 
			
		||||
    $dir_datas{'phonenumber'} = ($db->get_prop('ldap', 'defaultPhoneNumber')) || '';
 | 
			
		||||
    $c->stash(title => $title, modul => $modul, dir_datas => \%dir_datas);
 | 
			
		||||
    $c->render(template => 'directory');
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
} ## end sub main
 | 
			
		||||
 | 
			
		||||
sub do_update {
 | 
			
		||||
    my $c = shift;
 | 
			
		||||
    $c->app->log->info($c->log_req);
 | 
			
		||||
 | 
			
		||||
    my $access = $c->param('access');
 | 
			
		||||
    my $department = $c->param('department');
 | 
			
		||||
    my $company = $c->param('company');
 | 
			
		||||
    my $street = $c->param('street');
 | 
			
		||||
    my $city = $c->param('city');
 | 
			
		||||
    my $access      = $c->param('access');
 | 
			
		||||
    my $department  = $c->param('department');
 | 
			
		||||
    my $company     = $c->param('company');
 | 
			
		||||
    my $street      = $c->param('street');
 | 
			
		||||
    my $city        = $c->param('city');
 | 
			
		||||
    my $phonenumber = $c->param('phonenumber');
 | 
			
		||||
    my $existing = $c->param('existing');
 | 
			
		||||
 | 
			
		||||
    my $result = "";
 | 
			
		||||
 | 
			
		||||
    $db->get('ldap')->set_prop('access', $access);
 | 
			
		||||
    $db->get('ldap')->set_prop('defaultDepartment', $department);
 | 
			
		||||
    $db->get('ldap')->set_prop('defaultCompany', $company);
 | 
			
		||||
    $db->get('ldap')->set_prop('defaultStreet', $street);
 | 
			
		||||
    $db->get('ldap')->set_prop('defaultCity', $city);
 | 
			
		||||
    my $existing    = $c->param('existing');
 | 
			
		||||
    my $result      = "";
 | 
			
		||||
    $db->get('ldap')->set_prop('access',             $access);
 | 
			
		||||
    $db->get('ldap')->set_prop('defaultDepartment',  $department);
 | 
			
		||||
    $db->get('ldap')->set_prop('defaultCompany',     $company);
 | 
			
		||||
    $db->get('ldap')->set_prop('defaultStreet',      $street);
 | 
			
		||||
    $db->get('ldap')->set_prop('defaultCity',        $city);
 | 
			
		||||
    $db->get('ldap')->set_prop('defaultPhoneNumber', $phonenumber);
 | 
			
		||||
 | 
			
		||||
    if ($existing eq 'update') {
 | 
			
		||||
	my $ac = esmith::AccountsDB->open() || die "Couldn't open accounts db";
 | 
			
		||||
	my @users = $ac->users();
 | 
			
		||||
	
 | 
			
		||||
	foreach my $user (@users) {
 | 
			
		||||
	    $user->set_prop('Phone', $phonenumber);
 | 
			
		||||
	    $user->set_prop('Company', $company);
 | 
			
		||||
	    $user->set_prop('Dept', $department);
 | 
			
		||||
	    $user->set_prop('City', $city);
 | 
			
		||||
	    $user->set_prop('Street', $street);
 | 
			
		||||
	}
 | 
			
		||||
    }
 | 
			
		||||
        my $ac = esmith::AccountsDB->open() || die "Couldn't open accounts db";
 | 
			
		||||
        my @users = $ac->users();
 | 
			
		||||
 | 
			
		||||
        foreach my $user (@users) {
 | 
			
		||||
            $user->set_prop('Phone',   $phonenumber);
 | 
			
		||||
            $user->set_prop('Company', $company);
 | 
			
		||||
            $user->set_prop('Dept',    $department);
 | 
			
		||||
            $user->set_prop('City',    $city);
 | 
			
		||||
            $user->set_prop('Street',  $street);
 | 
			
		||||
        } ## end foreach my $user (@users)
 | 
			
		||||
    } ## end if ($existing eq 'update')
 | 
			
		||||
    #
 | 
			
		||||
    # Update the system
 | 
			
		||||
    #
 | 
			
		||||
    
 | 
			
		||||
    system ("/sbin/e-smith/signal-event ldap-update") == 0
 | 
			
		||||
	or $result = $c->l('ERROR_UPDATING_CONFIGURATION');
 | 
			
		||||
 | 
			
		||||
    system("/sbin/e-smith/signal-event ldap-update") == 0
 | 
			
		||||
        or $result = $c->l('ERROR_UPDATING_CONFIGURATION');
 | 
			
		||||
    my $title = $c->l('dir_FORM_TITLE');
 | 
			
		||||
 | 
			
		||||
    if ( $result eq '' ) { $result = $c->l('dir_SUCCESS'); }
 | 
			
		||||
 | 
			
		||||
    $c->stash( title => $title, modul => $result );
 | 
			
		||||
    if ($result eq '') { $result = $c->l('dir_SUCCESS'); }
 | 
			
		||||
    $c->stash(title => $title, modul => $result);
 | 
			
		||||
    $c->render(template => 'module');
 | 
			
		||||
} ## end sub do_update
 | 
			
		||||
 | 
			
		||||
};
 | 
			
		||||
sub get_ldap_base {
 | 
			
		||||
    return esmith::util::ldapBase(get_value('','DomainName'));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub get_value {
 | 
			
		||||
    my $fm = shift;
 | 
			
		||||
    my $item = shift;
 | 
			
		||||
 | 
			
		||||
    my $record = $db->get($item);
 | 
			
		||||
    if ($record) {
 | 
			
		||||
        return $record->value();
 | 
			
		||||
    }
 | 
			
		||||
    else {
 | 
			
		||||
        return '';
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
1;
 | 
			
		||||
 
 | 
			
		||||
@@ -10,493 +10,421 @@ package SrvMngr::Controller::Domains;
 | 
			
		||||
use strict;
 | 
			
		||||
use warnings;
 | 
			
		||||
use Mojo::Base 'Mojolicious::Controller';
 | 
			
		||||
 | 
			
		||||
use Locale::gettext;
 | 
			
		||||
use SrvMngr::I18N;
 | 
			
		||||
 | 
			
		||||
use SrvMngr qw(theme_list init_session);
 | 
			
		||||
 | 
			
		||||
#use Data::Dumper;
 | 
			
		||||
 | 
			
		||||
#use esmith::FormMagick::Panel::domains;
 | 
			
		||||
 | 
			
		||||
use esmith::DomainsDB;
 | 
			
		||||
use esmith::AccountsDB;
 | 
			
		||||
 | 
			
		||||
#use URI::Escape;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
our $ddb = esmith::DomainsDB->open || die "Couldn't open domains db";
 | 
			
		||||
our $cdb = esmith::ConfigDB->open || die "Couldn't open configuration db";
 | 
			
		||||
our $adb = esmith::AccountsDB->open || die "Couldn't open accounts db";
 | 
			
		||||
 | 
			
		||||
my ($ddb,$cdb,$adb);
 | 
			
		||||
#our $cdb = esmith::ConfigDB->open   || die "Couldn't open configuration db";
 | 
			
		||||
#our $adb = esmith::AccountsDB->open || die "Couldn't open accounts db";
 | 
			
		||||
our $REGEXP_DOMAIN = qq([a-zA-Z0-9\-\.]+);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
sub main {
 | 
			
		||||
 | 
			
		||||
    my $c = shift;
 | 
			
		||||
    $c->app->log->info($c->log_req);
 | 
			
		||||
 | 
			
		||||
    my %dom_datas = ();
 | 
			
		||||
    my $title = $c->l('dom_FORM_TITLE');
 | 
			
		||||
 | 
			
		||||
    my $title     = $c->l('dom_FORM_TITLE');
 | 
			
		||||
	$ddb = esmith::DomainsDB->open  || die "Couldn't open domains db";
 | 
			
		||||
	$cdb = esmith::ConfigDB->open   || die "Couldn't open configuration db";
 | 
			
		||||
	$adb = esmith::AccountsDB->open || die "Couldn't open accounts db";
 | 
			
		||||
    $dom_datas{trt} = 'LST';
 | 
			
		||||
 | 
			
		||||
    my @domains;
 | 
			
		||||
    for ($ddb->domains())
 | 
			
		||||
    {
 | 
			
		||||
 | 
			
		||||
    for ($ddb->domains()) {
 | 
			
		||||
        my $ns = $_->prop('Nameservers') || 'internet';
 | 
			
		||||
 | 
			
		||||
        push @domains, 
 | 
			
		||||
            { Domain => $_->key, $_->props,
 | 
			
		||||
              Nameservers => $ns,
 | 
			
		||||
            }
 | 
			
		||||
    }
 | 
			
		||||
    $dom_datas{forwarder} = $cdb->get_prop('dnscache', 'Forwarder'); 
 | 
			
		||||
    $dom_datas{forwarder2} = $cdb->get_prop('dnscache', 'Forwarder2') || ''; 
 | 
			
		||||
 | 
			
		||||
    $c->stash( title => $title, dom_datas => \%dom_datas, domains => \@domains );
 | 
			
		||||
        push @domains,
 | 
			
		||||
            {
 | 
			
		||||
            Domain => $_->key,
 | 
			
		||||
            $_->props,
 | 
			
		||||
            Nameservers => $ns,
 | 
			
		||||
            };
 | 
			
		||||
    } ## end for ($ddb->domains())
 | 
			
		||||
    $dom_datas{forwarder} = $cdb->get_prop('dnscache', 'Forwarder');
 | 
			
		||||
    $dom_datas{forwarder2} = $cdb->get_prop('dnscache', 'Forwarder2') || '';
 | 
			
		||||
    $c->stash(title => $title, dom_datas => \%dom_datas, domains => \@domains);
 | 
			
		||||
    $c->render(template => 'domains');
 | 
			
		||||
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
} ## end sub main
 | 
			
		||||
 | 
			
		||||
sub do_display {
 | 
			
		||||
 | 
			
		||||
    my $c = shift;
 | 
			
		||||
    $c->app->log->info($c->log_req);
 | 
			
		||||
 | 
			
		||||
    my $rt = $c->current_route;
 | 
			
		||||
    my $trt = $c->param('trt');
 | 
			
		||||
    my $rt     = $c->current_route;
 | 
			
		||||
    my $trt    = $c->param('trt');
 | 
			
		||||
    my $domain = $c->param('Domain') || '';
 | 
			
		||||
	$ddb = esmith::DomainsDB->open  || die "Couldn't open domains db";
 | 
			
		||||
	$cdb = esmith::ConfigDB->open   || die "Couldn't open configuration db";
 | 
			
		||||
	$adb = esmith::AccountsDB->open || die "Couldn't open accounts db";
 | 
			
		||||
 | 
			
		||||
    #$trt = 'DEL' if ( $rt eq 'domaindel1' );
 | 
			
		||||
    #$trt = 'UPD' if ( $rt eq 'domainupd1' );
 | 
			
		||||
    #$trt = 'UP2' if ( $rt eq 'domainup21' );
 | 
			
		||||
    #$trt = 'ADD' if ( $rt eq 'domainadd1' );
 | 
			
		||||
 | 
			
		||||
    my %dom_datas = ();
 | 
			
		||||
    my $title = $c->l('dom_FORM_TITLE');
 | 
			
		||||
    my $result = '';
 | 
			
		||||
 | 
			
		||||
    my $title     = $c->l('dom_FORM_TITLE');
 | 
			
		||||
    my $result    = '';
 | 
			
		||||
    $dom_datas{'trt'} = $trt;
 | 
			
		||||
    if ( $trt ne 'ADD' and $trt ne 'UPD' and $trt ne 'UP2' and $trt ne 'DEL' ) {
 | 
			
		||||
		$result = "Trt unknown ( $trt ) !"
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if ( $trt eq 'ADD' ) {
 | 
			
		||||
	    #nothing
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if ( $trt eq 'UPD' ) {
 | 
			
		||||
	
 | 
			
		||||
	    my $rec = $ddb->get($domain);
 | 
			
		||||
	    if ( $rec ) {
 | 
			
		||||
    		$dom_datas{domain} = $domain;
 | 
			
		||||
    		$dom_datas{description} = $rec->prop('Description') || '';
 | 
			
		||||
    		$dom_datas{content} = $rec->prop('Content') || '';
 | 
			
		||||
    		$dom_datas{nameservers} = $rec->prop('Nameservers') || 'internet';
 | 
			
		||||
	    } else {
 | 
			
		||||
		$result = "Domain $domain not found !"
 | 
			
		||||
	    }
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if ( $trt eq 'UP2' ) {
 | 
			
		||||
	
 | 
			
		||||
	    $dom_datas{forwarder} = $cdb->get_prop('dnscache', 'Forwarder') || ''; 
 | 
			
		||||
	    $dom_datas{forwarder2} = $cdb->get_prop('dnscache', 'Forwarder2') || ''; 
 | 
			
		||||
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
        if ( $trt eq 'DEL' ) {
 | 
			
		||||
 | 
			
		||||
	    my $rec = $ddb->get($domain);
 | 
			
		||||
	    if ( $rec ) {
 | 
			
		||||
    		$dom_datas{domain} = $domain;
 | 
			
		||||
    		$dom_datas{description} = $rec->prop('Description') || '';
 | 
			
		||||
	    }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        if ( $trt eq 'LST' ) {
 | 
			
		||||
	    my @domains;
 | 
			
		||||
	    if ($adb) {
 | 
			
		||||
	        @domains = $ddb->domains();
 | 
			
		||||
	    }
 | 
			
		||||
	    $c->stash( domains => \@domains );
 | 
			
		||||
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
    if ( ! $result ) {
 | 
			
		||||
	$c->stash( error => $result );
 | 
			
		||||
    if ($trt ne 'ADD' and $trt ne 'UPD' and $trt ne 'UP2' and $trt ne 'DEL') {
 | 
			
		||||
        $result = "Trt unknown ( $trt ) !";
 | 
			
		||||
    }
 | 
			
		||||
    $c->stash( title => $title, dom_datas => \%dom_datas );
 | 
			
		||||
    $c->render( template => 'domains' );
 | 
			
		||||
 | 
			
		||||
};
 | 
			
		||||
    if ($trt eq 'ADD') {
 | 
			
		||||
 | 
			
		||||
        #nothing
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if ($trt eq 'UPD') {
 | 
			
		||||
        my $rec = $ddb->get($domain);
 | 
			
		||||
 | 
			
		||||
        if ($rec) {
 | 
			
		||||
            $dom_datas{domain}      = $domain;
 | 
			
		||||
            $dom_datas{description} = $rec->prop('Description') || '';
 | 
			
		||||
            $dom_datas{content}     = $rec->prop('Content') || '';
 | 
			
		||||
            $dom_datas{nameservers} = $rec->prop('Nameservers') || 'internet';
 | 
			
		||||
        } else {
 | 
			
		||||
            $result = "Domain $domain not found !";
 | 
			
		||||
        }
 | 
			
		||||
    } ## end if ($trt eq 'UPD')
 | 
			
		||||
 | 
			
		||||
    if ($trt eq 'UP2') {
 | 
			
		||||
        $dom_datas{forwarder}  = $cdb->get_prop('dnscache', 'Forwarder')  || '';
 | 
			
		||||
        $dom_datas{forwarder2} = $cdb->get_prop('dnscache', 'Forwarder2') || '';
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if ($trt eq 'DEL') {
 | 
			
		||||
        my $rec = $ddb->get($domain);
 | 
			
		||||
 | 
			
		||||
        if ($rec) {
 | 
			
		||||
            $dom_datas{domain} = $domain;
 | 
			
		||||
            $dom_datas{description} = $rec->prop('Description') || '';
 | 
			
		||||
        }
 | 
			
		||||
    } ## end if ($trt eq 'DEL')
 | 
			
		||||
 | 
			
		||||
    if ($trt eq 'LST') {
 | 
			
		||||
        my @domains;
 | 
			
		||||
 | 
			
		||||
        if ($adb) {
 | 
			
		||||
            @domains = $ddb->domains();
 | 
			
		||||
        }
 | 
			
		||||
        $c->stash(domains => \@domains);
 | 
			
		||||
    } ## end if ($trt eq 'LST')
 | 
			
		||||
 | 
			
		||||
    if (!$result) {
 | 
			
		||||
        $c->stash(error => $result);
 | 
			
		||||
    }
 | 
			
		||||
    $c->stash(title => $title, dom_datas => \%dom_datas);
 | 
			
		||||
    $c->render(template => 'domains');
 | 
			
		||||
} ## end sub do_display
 | 
			
		||||
 | 
			
		||||
sub do_update {
 | 
			
		||||
 | 
			
		||||
    my $c = shift;
 | 
			
		||||
    $c->app->log->info($c->log_req);
 | 
			
		||||
 | 
			
		||||
    my $rt = $c->current_route;
 | 
			
		||||
    my $trt = $c->param('trt');
 | 
			
		||||
 | 
			
		||||
    my $rt        = $c->current_route;
 | 
			
		||||
    my $trt       = $c->param('trt');
 | 
			
		||||
	$ddb = esmith::DomainsDB->open  || die "Couldn't open domains db";
 | 
			
		||||
	$cdb = esmith::ConfigDB->open   || die "Couldn't open configuration db";
 | 
			
		||||
	$adb = esmith::AccountsDB->open || die "Couldn't open accounts db";
 | 
			
		||||
    my %dom_datas = ();
 | 
			
		||||
    my ($res, $result) = '';
 | 
			
		||||
 | 
			
		||||
    #my $domain = uri_unescape($c->param('domain'));
 | 
			
		||||
    my $domain = $c->param('Domain');
 | 
			
		||||
 | 
			
		||||
    if ( $trt eq 'ADD' ) {
 | 
			
		||||
 | 
			
		||||
    if ($trt eq 'ADD') {
 | 
			
		||||
        my $account = $c->param('Account');
 | 
			
		||||
 | 
			
		||||
	# controls (validate ?????)
 | 
			
		||||
	#? validate_new_domain_name( $c, $domain, $account );
 | 
			
		||||
	#$result .= $res unless $res eq 'OK';
 | 
			
		||||
        # controls (validate ?????)
 | 
			
		||||
        #? validate_new_domain_name( $c, $domain, $account );
 | 
			
		||||
        #$result .= $res unless $res eq 'OK';
 | 
			
		||||
        #$result .= ' blocked';
 | 
			
		||||
        $res = '';
 | 
			
		||||
 | 
			
		||||
	#$result .= ' blocked';
 | 
			
		||||
	
 | 
			
		||||
	$res = '';
 | 
			
		||||
	if ( ! $result ) {
 | 
			
		||||
	    $res = $c->create_modify_domain( 'create', $domain );
 | 
			
		||||
	    $result .= $res unless $res eq 'OK';
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
	if ( ! $result ) {
 | 
			
		||||
	    $result = $c->l('dom_SUCCESSFULLY_CREATED') . " $domain"; 
 | 
			
		||||
	}
 | 
			
		||||
    }
 | 
			
		||||
        if (!$result) {
 | 
			
		||||
            $res = $c->create_modify_domain('create', $domain);
 | 
			
		||||
            $result .= $res unless $res eq 'OK';
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
    if ( $trt eq 'UPD' ) {
 | 
			
		||||
        if (!$result) {
 | 
			
		||||
            $result = $c->l('dom_SUCCESSFULLY_CREATED') . " $domain";
 | 
			
		||||
        }
 | 
			
		||||
    } ## end if ($trt eq 'ADD')
 | 
			
		||||
 | 
			
		||||
    if ($trt eq 'UPD') {
 | 
			
		||||
        my $description = $c->param('Description');
 | 
			
		||||
        my $content = $c->param('Content');
 | 
			
		||||
        my $content     = $c->param('Content');
 | 
			
		||||
        my $nameservers = $c->param('Nameservers');
 | 
			
		||||
 | 
			
		||||
	# controls
 | 
			
		||||
	#$res = validate_description( $c, $account );
 | 
			
		||||
	#$result .= $res unless $res eq 'OK';
 | 
			
		||||
        # controls
 | 
			
		||||
        #$res = validate_description( $c, $account );
 | 
			
		||||
        #$result .= $res unless $res eq 'OK';
 | 
			
		||||
        #$result .= 'blocked';
 | 
			
		||||
        $res = '';
 | 
			
		||||
 | 
			
		||||
	#$result .= 'blocked';
 | 
			
		||||
        if (!$result) {
 | 
			
		||||
            $res = $c->create_modify_domain('modify', $domain);
 | 
			
		||||
            $result .= $res unless $res eq 'OK';
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
	$res = '';
 | 
			
		||||
	if ( ! $result ) {
 | 
			
		||||
	    $res = $c->create_modify_domain( 'modify', $domain );
 | 
			
		||||
	    $result .= $res unless $res eq 'OK';
 | 
			
		||||
	}
 | 
			
		||||
        if (!$result) {
 | 
			
		||||
            $result = $c->l('dom_SUCCESSFULLY_MODIFIED') . " $domain";
 | 
			
		||||
        }
 | 
			
		||||
    } ## end if ($trt eq 'UPD')
 | 
			
		||||
 | 
			
		||||
	if ( ! $result ) { 
 | 
			
		||||
		$result = $c->l('dom_SUCCESSFULLY_MODIFIED') . " $domain"; 
 | 
			
		||||
	}
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    if ( $trt eq 'UP2' ) {
 | 
			
		||||
 | 
			
		||||
        my $forwarder = $c->param('Forwarder');
 | 
			
		||||
    if ($trt eq 'UP2') {
 | 
			
		||||
        my $forwarder  = $c->param('Forwarder');
 | 
			
		||||
        my $forwarder2 = $c->param('Forwarder2');
 | 
			
		||||
 | 
			
		||||
	# controls
 | 
			
		||||
        # controls
 | 
			
		||||
        $res = $c->ip_number_or_blank($forwarder);
 | 
			
		||||
        $result .= $res unless $res eq 'OK';
 | 
			
		||||
        $res = $c->ip_number_or_blank($forwarder2);
 | 
			
		||||
        $result .= $res unless $res eq 'OK';
 | 
			
		||||
 | 
			
		||||
	$res = $c->ip_number_or_blank( $forwarder );
 | 
			
		||||
	$result .= $res unless $res eq 'OK';
 | 
			
		||||
        #$result .= 'blocked';
 | 
			
		||||
        $res = '';
 | 
			
		||||
 | 
			
		||||
	$res = $c->ip_number_or_blank( $forwarder2 );
 | 
			
		||||
	$result .= $res unless $res eq 'OK';
 | 
			
		||||
	
 | 
			
		||||
	#$result .= 'blocked';
 | 
			
		||||
	
 | 
			
		||||
	$res = '';
 | 
			
		||||
	if ( ! $result ) {
 | 
			
		||||
	    $res = $c->modify_dns( $forwarder, $forwarder2 );
 | 
			
		||||
	    $result .= $res unless $res eq 'OK';
 | 
			
		||||
	}
 | 
			
		||||
	if ( ! $result ) { 
 | 
			
		||||
	    $result = $c->l('SUCCESS') . " $forwarder $forwarder2"; 
 | 
			
		||||
	}
 | 
			
		||||
    }
 | 
			
		||||
        if (!$result) {
 | 
			
		||||
            $res = $c->modify_dns($forwarder, $forwarder2);
 | 
			
		||||
            $result .= $res unless $res eq 'OK';
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        if (!$result) {
 | 
			
		||||
            $result = $c->l('SUCCESS') . " $forwarder $forwarder2";
 | 
			
		||||
        }
 | 
			
		||||
    } ## end if ($trt eq 'UP2')
 | 
			
		||||
 | 
			
		||||
    if ( $trt eq 'DEL' ) {
 | 
			
		||||
    if ($trt eq 'DEL') {
 | 
			
		||||
 | 
			
		||||
	# controls
 | 
			
		||||
	#$res = validate_is_domain($c, $domain);
 | 
			
		||||
	#$result .= $res unless $res eq 'OK';
 | 
			
		||||
	
 | 
			
		||||
	#$result .= 'blocked';
 | 
			
		||||
	
 | 
			
		||||
	$res = '';
 | 
			
		||||
	if ( ! $result ) {
 | 
			
		||||
	    $res = $c->delete_domain( $domain );
 | 
			
		||||
	    $result .= $res unless $res eq 'OK';
 | 
			
		||||
	}
 | 
			
		||||
	if ( ! $result ) { 
 | 
			
		||||
	    $result = $c->l('dom_SUCCESSFULLY_DELETED') . " $domain"; 
 | 
			
		||||
	}
 | 
			
		||||
    }
 | 
			
		||||
        # controls
 | 
			
		||||
        #$res = validate_is_domain($c, $domain);
 | 
			
		||||
        #$result .= $res unless $res eq 'OK';
 | 
			
		||||
        #$result .= 'blocked';
 | 
			
		||||
        $res = '';
 | 
			
		||||
 | 
			
		||||
        if (!$result) {
 | 
			
		||||
            $res = $c->delete_domain($domain);
 | 
			
		||||
            $result .= $res unless $res eq 'OK';
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        if (!$result) {
 | 
			
		||||
            $result = $c->l('dom_SUCCESSFULLY_DELETED') . " $domain";
 | 
			
		||||
        }
 | 
			
		||||
    } ## end if ($trt eq 'DEL')
 | 
			
		||||
 | 
			
		||||
    # common parts
 | 
			
		||||
 | 
			
		||||
    if ($res ne 'OK') {
 | 
			
		||||
	my $title = $c->l('dom_FORM_TITLE');
 | 
			
		||||
	$dom_datas{'domain'} = $domain;
 | 
			
		||||
	$dom_datas{'trt'} = $trt;
 | 
			
		||||
 | 
			
		||||
	$c->stash( error => $result . "($res)" );
 | 
			
		||||
	$c->stash( title => $title, dom_datas => \%dom_datas );
 | 
			
		||||
	return $c->render( 'domains' );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
        my $title = $c->l('dom_FORM_TITLE');
 | 
			
		||||
        $dom_datas{'domain'} = $domain;
 | 
			
		||||
        $dom_datas{'trt'}    = $trt;
 | 
			
		||||
        $c->stash(error => $result . "($res)");
 | 
			
		||||
        $c->stash(title => $title, dom_datas => \%dom_datas);
 | 
			
		||||
        return $c->render('domains');
 | 
			
		||||
    } ## end if ($res ne 'OK')
 | 
			
		||||
    my $message = "'Domains' updates ($trt) DONE";
 | 
			
		||||
    $c->app->log->info($message);
 | 
			
		||||
 | 
			
		||||
    $c->flash( success => $result );
 | 
			
		||||
    $c->flash(success => $result);
 | 
			
		||||
    $c->redirect_to('/domains');
 | 
			
		||||
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
} ## end sub do_update
 | 
			
		||||
 | 
			
		||||
sub create_modify_domain {
 | 
			
		||||
 | 
			
		||||
    my ($c, $action, $domain) = @_;
 | 
			
		||||
 | 
			
		||||
    $domain = $1 if ($domain =~ /^($REGEXP_DOMAIN)$/);
 | 
			
		||||
    unless ($domain) {
 | 
			
		||||
        return ($c->l($action eq 'create' ? 'dom_ERROR_CREATING_DOMAIN'
 | 
			
		||||
                                        : 'dom_ERROR_MODIFYING_DOMAIN') . ' Ctl');
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    unless ($domain) {
 | 
			
		||||
        return (
 | 
			
		||||
            $c->l(
 | 
			
		||||
                $action eq 'create'
 | 
			
		||||
                ? 'dom_ERROR_CREATING_DOMAIN'
 | 
			
		||||
                : 'dom_ERROR_MODIFYING_DOMAIN'
 | 
			
		||||
                )
 | 
			
		||||
                . ' Ctl'
 | 
			
		||||
        );
 | 
			
		||||
    } ## end unless ($domain)
 | 
			
		||||
    my $rec = $ddb->get($domain);
 | 
			
		||||
 | 
			
		||||
    if ($rec and $action eq 'create') {
 | 
			
		||||
        return $c->l('dom_DOMAIN_IN_USE_ERROR');
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if (not $rec and $action eq 'modify') {
 | 
			
		||||
        return $c->l('dom_NONEXISTENT_DOMAIN_ERROR');
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    $rec ||= $ddb->new_record($domain, { type => 'domain' });
 | 
			
		||||
    my %props;
 | 
			
		||||
    $props{$_} = $c->param($_) for ( qw(Content Description Nameservers) );
 | 
			
		||||
    $props{$_} = $c->param($_) for (qw(Content Description Nameservers));
 | 
			
		||||
    $rec->merge_props(%props);
 | 
			
		||||
 | 
			
		||||
    if ( system( "/sbin/e-smith/signal-event", 
 | 
			
		||||
                        "domain-$action", "$domain" ) != 0 ) {
 | 
			
		||||
        return ($c->l($action eq 'create' ? 'dom_ERROR_CREATING_DOMAIN'
 | 
			
		||||
                                       : 'dom_ERROR_MODIFYING_DOMAIN') . " Exe $action");
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if (system("/sbin/e-smith/signal-event", "domain-$action", "$domain") != 0) {
 | 
			
		||||
        return (
 | 
			
		||||
            $c->l(
 | 
			
		||||
                $action eq 'create'
 | 
			
		||||
                ? 'dom_ERROR_CREATING_DOMAIN'
 | 
			
		||||
                : 'dom_ERROR_MODIFYING_DOMAIN'
 | 
			
		||||
                )
 | 
			
		||||
                . " Exe $action"
 | 
			
		||||
        );
 | 
			
		||||
    } ## end if (system("/sbin/e-smith/signal-event"...))
 | 
			
		||||
    return 'OK';
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
} ## end sub create_modify_domain
 | 
			
		||||
 | 
			
		||||
sub delete_domain {
 | 
			
		||||
 | 
			
		||||
    my ($c, $domain) = @_;
 | 
			
		||||
 | 
			
		||||
    $domain = $1 if ($domain =~ /^($REGEXP_DOMAIN)$/);
 | 
			
		||||
    return ($c->l('dom_ERROR_WHILE_REMOVING_DOMAIN') . ' Ctl') unless ($domain);
 | 
			
		||||
 | 
			
		||||
    my $rec = $ddb->get($domain);
 | 
			
		||||
    return ($c->l('dom_NONEXISTENT_DOMAIN_ERROR')) if (not $rec);
 | 
			
		||||
 | 
			
		||||
    $rec->set_prop('type', 'domain-deleted');
 | 
			
		||||
 | 
			
		||||
    if (system("/sbin/e-smith/signal-event", "domain-delete", "$domain") != 0) {
 | 
			
		||||
	return ($c->l('dom_ERROR_WHILE_REMOVING_DOMAIN') . 'Exe');
 | 
			
		||||
        return ($c->l('dom_ERROR_WHILE_REMOVING_DOMAIN') . 'Exe');
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    $rec->delete;
 | 
			
		||||
    return 'OK';
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
} ## end sub delete_domain
 | 
			
		||||
 | 
			
		||||
sub modify_dns {
 | 
			
		||||
 | 
			
		||||
    my ($c, $forwarder, $forwarder2) = @_;
 | 
			
		||||
 | 
			
		||||
    my $dnscache = $cdb->get('dnscache');
 | 
			
		||||
 | 
			
		||||
    ($forwarder, $forwarder2) = ($forwarder2, '')
 | 
			
		||||
        if ($forwarder2 and not $forwarder);
 | 
			
		||||
 | 
			
		||||
    if ($forwarder) {
 | 
			
		||||
	$dnscache->set_prop('Forwarder', $forwarder);
 | 
			
		||||
        $dnscache->set_prop('Forwarder', $forwarder);
 | 
			
		||||
    } else {
 | 
			
		||||
	$dnscache->delete_prop('Forwarder');
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    if ($forwarder2) {
 | 
			
		||||
	$dnscache->set_prop('Forwarder2', $forwarder2);
 | 
			
		||||
    } else {
 | 
			
		||||
	$dnscache->delete_prop('Forwarder2');
 | 
			
		||||
        $dnscache->delete_prop('Forwarder');
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    unless ( system( "/sbin/e-smith/signal-event", "dns-update" ) == 0 )
 | 
			
		||||
    {
 | 
			
		||||
    if ($forwarder2) {
 | 
			
		||||
        $dnscache->set_prop('Forwarder2', $forwarder2);
 | 
			
		||||
    } else {
 | 
			
		||||
        $dnscache->delete_prop('Forwarder2');
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    unless (system("/sbin/e-smith/signal-event", "dns-update") == 0) {
 | 
			
		||||
        return $c->l('dom_ERROR_UPDATING');
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return 'OK';
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
} ## end sub modify_dns
 | 
			
		||||
 | 
			
		||||
sub existing_accounts_list {
 | 
			
		||||
 | 
			
		||||
    my $c = shift;
 | 
			
		||||
 | 
			
		||||
    my @existingAccounts = ( ['Administrator' => 'admin']);
 | 
			
		||||
    my @existingAccounts = ([ 'Administrator' => 'admin' ]);
 | 
			
		||||
 | 
			
		||||
    foreach my $a ($adb->get_all) {
 | 
			
		||||
        if ($a->prop('type') =~ /(user|group)/) {
 | 
			
		||||
            push @existingAccounts, [ $a->key => $a->key ];
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        if ($a->prop('type') eq "domain") {
 | 
			
		||||
            my $target = $adb->get($a->prop('Account'));
 | 
			
		||||
 | 
			
		||||
            unless ($target)
 | 
			
		||||
            {
 | 
			
		||||
                warn "WARNING: domain (" . $a->key . ") => missing Account(" 
 | 
			
		||||
			. $a->prop('Account')  . ")\n";
 | 
			
		||||
            unless ($target) {
 | 
			
		||||
                warn "WARNING: domain (" . $a->key . ") => missing Account(" . $a->prop('Account') . ")\n";
 | 
			
		||||
                next;
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            push @existingAccounts, [ $a->key, $a->key ]
 | 
			
		||||
                unless ($target->prop('type') eq "domain");
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return(\@existingAccounts);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
        } ## end if ($a->prop('type') eq...)
 | 
			
		||||
    } ## end foreach my $a ($adb->get_all)
 | 
			
		||||
    return (\@existingAccounts);
 | 
			
		||||
} ## end sub existing_accounts_list
 | 
			
		||||
 | 
			
		||||
sub content_options_list {
 | 
			
		||||
 | 
			
		||||
    my $c = shift;
 | 
			
		||||
 | 
			
		||||
    my @options = ( [ $c->l('dom_PRIMARY_SITE') => 'Primary' ]);
 | 
			
		||||
    my @options = ([ $c->l('dom_PRIMARY_SITE') => 'Primary' ]);
 | 
			
		||||
 | 
			
		||||
    foreach ($adb->ibays) {
 | 
			
		||||
	push @options, [ $_->prop('Name') => $_->key ]
 | 
			
		||||
		if ($_->key ne 'Primary');
 | 
			
		||||
        push @options, [ $_->prop('Name') => $_->key ]
 | 
			
		||||
            if ($_->key ne 'Primary');
 | 
			
		||||
    }
 | 
			
		||||
    return \@options;
 | 
			
		||||
} ## end sub content_options_list
 | 
			
		||||
 | 
			
		||||
    return \@options
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
sub get_content_value
 | 
			
		||||
{
 | 
			
		||||
    my $c = shift;
 | 
			
		||||
sub get_content_value {
 | 
			
		||||
    my $c      = shift;
 | 
			
		||||
    my $domain = shift;
 | 
			
		||||
 | 
			
		||||
    return $domain ? $ddb->get_prop($domain, 'Content') : 'Primary';
 | 
			
		||||
}
 | 
			
		||||
} ## end sub get_content_value
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
sub get_description_value
 | 
			
		||||
{
 | 
			
		||||
sub get_description_value {
 | 
			
		||||
    my $c = shift;
 | 
			
		||||
 | 
			
		||||
    my $domain = $c->param('Domain') || undef;
 | 
			
		||||
 | 
			
		||||
    return $ddb->get_prop($domain, 'Description');
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
} ## end sub get_description_value
 | 
			
		||||
 | 
			
		||||
sub nameserver_options_list {
 | 
			
		||||
 | 
			
		||||
    my $c = shift;
 | 
			
		||||
    my $c      = shift;
 | 
			
		||||
    my $domain = $c->param('Domain') || undef;
 | 
			
		||||
 | 
			
		||||
    my @opts = qw(localhost internet);
 | 
			
		||||
    my @opts   = qw(localhost internet);
 | 
			
		||||
    push @opts, 'corporate' if ($cdb->get_prop('dnscache', 'Forwarder'));
 | 
			
		||||
    my $ns = ($ddb->get_prop($domain, 'Nameservers') || 'internet');
 | 
			
		||||
    push @opts, $ns unless scalar grep { /^$ns$/ } @opts;
 | 
			
		||||
 | 
			
		||||
    push @opts, $ns unless scalar grep {/^$ns$/} @opts;
 | 
			
		||||
    my @options;
 | 
			
		||||
 | 
			
		||||
    foreach (@opts) {
 | 
			
		||||
	push @options, [ $c->l( "dom_$_" ) => $_ ];
 | 
			
		||||
        push @options, [ $c->l("dom_$_") => $_ ];
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return \@options;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
} ## end sub nameserver_options_list
 | 
			
		||||
 | 
			
		||||
sub get_nameserver_value {
 | 
			
		||||
    my $c = shift;
 | 
			
		||||
 | 
			
		||||
    my $domain = $c->param('Domain') || undef;
 | 
			
		||||
 | 
			
		||||
    return ($ddb->get_prop($domain, 'Nameservers') || 'internet');
 | 
			
		||||
}
 | 
			
		||||
} ## end sub get_nameserver_value
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
sub validate_Domain
 | 
			
		||||
{
 | 
			
		||||
    my $c = shift;
 | 
			
		||||
sub validate_Domain {
 | 
			
		||||
    my $c      = shift;
 | 
			
		||||
    my $domain = lc shift;
 | 
			
		||||
    return ($domain =~ /^($REGEXP_DOMAIN)$/)
 | 
			
		||||
        ? 'OK'
 | 
			
		||||
        : 'DOMAIN_NAME_VALIDATION_ERROR';
 | 
			
		||||
} ## end sub validate_Domain
 | 
			
		||||
 | 
			
		||||
    return ($domain =~ /^($REGEXP_DOMAIN)$/) ? 'OK' :
 | 
			
		||||
                            'DOMAIN_NAME_VALIDATION_ERROR';
 | 
			
		||||
}
 | 
			
		||||
sub validate_Description {
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
sub validate_Description
 | 
			
		||||
{
 | 
			
		||||
    # XXX - FIXME - NOTREACHED
 | 
			
		||||
    # We used to use the Description in the Appletalk volume name
 | 
			
		||||
    # which meant it needed validation. I don't see any reason to
 | 
			
		||||
    # do this any more
 | 
			
		||||
    
 | 
			
		||||
    my $c = shift;
 | 
			
		||||
    my $c           = shift;
 | 
			
		||||
    my $description = shift;
 | 
			
		||||
 | 
			
		||||
    return ($description =~ /^([\-\'\w][\-\'\w\s\.]*)$/) ? 'OK' :
 | 
			
		||||
                    'DOMAIN_DESCRIPTION_VALIDATION_ERROR';
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
    return ($description =~ /^([\-\'\w][\-\'\w\s\.]*)$/)
 | 
			
		||||
        ? 'OK'
 | 
			
		||||
        : 'DOMAIN_DESCRIPTION_VALIDATION_ERROR';
 | 
			
		||||
} ## end sub validate_Description
 | 
			
		||||
 | 
			
		||||
sub ip_number_or_blank {
 | 
			
		||||
 | 
			
		||||
    # XXX - FIXME - we should push this down into CGI::FormMagick
 | 
			
		||||
 | 
			
		||||
    my $c = shift;
 | 
			
		||||
    my $c  = shift;
 | 
			
		||||
    my $ip = shift;
 | 
			
		||||
 | 
			
		||||
    if (!defined($ip) || $ip eq "")
 | 
			
		||||
    {
 | 
			
		||||
    if (!defined($ip) || $ip eq "") {
 | 
			
		||||
        return 'OK';
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    return ip_number( $c, $ip ); 
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
    return ip_number($c, $ip);
 | 
			
		||||
} ## end sub ip_number_or_blank
 | 
			
		||||
 | 
			
		||||
sub ip_number {
 | 
			
		||||
 | 
			
		||||
#  from CGI::FormMagick::Validator qw( ip_number );
 | 
			
		||||
 | 
			
		||||
    #  from CGI::FormMagick::Validator qw( ip_number );
 | 
			
		||||
    my ($c, $data) = @_;
 | 
			
		||||
 | 
			
		||||
    return undef unless defined $data;
 | 
			
		||||
 | 
			
		||||
    return $c->l('FM_IP_NUMBER1') unless $data =~ /^[\d.]+$/;
 | 
			
		||||
 | 
			
		||||
    my @octets = split /\./, $data;
 | 
			
		||||
    my $dots = ($data =~ tr/.//);
 | 
			
		||||
 | 
			
		||||
    return $c->l('FM_IP_NUMBER2') unless (scalar @octets == 4 and $dots == 3);
 | 
			
		||||
 | 
			
		||||
    foreach my $octet (@octets) {
 | 
			
		||||
        return $c->l("FM_IP_NUMBER3", $octet) if $octet > 255;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return 'OK';
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
} ## end sub ip_number
 | 
			
		||||
1;
 | 
			
		||||
 
 | 
			
		||||
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							@@ -11,329 +11,259 @@ package SrvMngr::Controller::Groups;
 | 
			
		||||
use strict;
 | 
			
		||||
use warnings;
 | 
			
		||||
use Mojo::Base 'Mojolicious::Controller';
 | 
			
		||||
 | 
			
		||||
use Locale::gettext;
 | 
			
		||||
use SrvMngr::I18N;
 | 
			
		||||
use SrvMngr qw(theme_list init_session);
 | 
			
		||||
 | 
			
		||||
#use Data::Dumper;
 | 
			
		||||
 | 
			
		||||
#use esmith::FormMagick::Panel::groups;
 | 
			
		||||
use esmith::AccountsDB;
 | 
			
		||||
 | 
			
		||||
our $cdb = esmith::ConfigDB->open || die "Couldn't open configuration db";
 | 
			
		||||
our $adb = esmith::AccountsDB->open || die "Couldn't open accounts db";
 | 
			
		||||
#our $cdb = esmith::ConfigDB->open   || die "Couldn't open configuration db";
 | 
			
		||||
#our $adb = esmith::AccountsDB->open || die "Couldn't open accounts db";
 | 
			
		||||
my ($cdb,$adb);
 | 
			
		||||
 | 
			
		||||
sub main {
 | 
			
		||||
 | 
			
		||||
    my $c = shift;
 | 
			
		||||
    $c->app->log->info($c->log_req);
 | 
			
		||||
 | 
			
		||||
    my %grp_datas = ();
 | 
			
		||||
    my $title = $c->l('grp_FORM_TITLE');
 | 
			
		||||
 | 
			
		||||
    my $title     = $c->l('grp_FORM_TITLE');
 | 
			
		||||
	$cdb = esmith::ConfigDB->open   || die "Couldn't open configuration db";
 | 
			
		||||
	$adb = esmith::AccountsDB->open || die "Couldn't open accounts db";
 | 
			
		||||
    $grp_datas{trt} = 'LST';
 | 
			
		||||
 | 
			
		||||
    my @groups;
 | 
			
		||||
 | 
			
		||||
    if ($adb) {
 | 
			
		||||
        @groups = $adb->groups();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    $c->stash( title => $title, grp_datas => \%grp_datas, groups => \@groups );
 | 
			
		||||
    $c->stash(title => $title, grp_datas => \%grp_datas, groups => \@groups);
 | 
			
		||||
    $c->render(template => 'groups');
 | 
			
		||||
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
} ## end sub main
 | 
			
		||||
 | 
			
		||||
sub do_display {
 | 
			
		||||
 | 
			
		||||
    my $c = shift;
 | 
			
		||||
    $c->app->log->info($c->log_req);
 | 
			
		||||
 | 
			
		||||
    my $rt = $c->current_route;
 | 
			
		||||
    my $trt = ($c->param('trt') || 'LST');
 | 
			
		||||
    my $group = $c->param('group');
 | 
			
		||||
 | 
			
		||||
    my $rt        = $c->current_route;
 | 
			
		||||
    my $trt       = ($c->param('trt') || 'LST');
 | 
			
		||||
    my $group     = $c->param('group');
 | 
			
		||||
    my %grp_datas = ();
 | 
			
		||||
    my $title = $c->l('grp_FORM_TITLE');
 | 
			
		||||
 | 
			
		||||
    my $title     = $c->l('grp_FORM_TITLE');
 | 
			
		||||
	$cdb = esmith::ConfigDB->open   || die "Couldn't open configuration db";
 | 
			
		||||
	$adb = esmith::AccountsDB->open || die "Couldn't open accounts db";
 | 
			
		||||
    $grp_datas{'trt'} = $trt;
 | 
			
		||||
 | 
			
		||||
	if ( $trt eq 'ADD' ) {
 | 
			
		||||
	    #nothing
 | 
			
		||||
	}
 | 
			
		||||
    if ($trt eq 'ADD') {
 | 
			
		||||
 | 
			
		||||
        #nothing
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
	if ( $trt eq 'UPD' ) {
 | 
			
		||||
	
 | 
			
		||||
	    my %members = ();
 | 
			
		||||
	    my %users = ();
 | 
			
		||||
    if ($trt eq 'UPD') {
 | 
			
		||||
        my %members = ();
 | 
			
		||||
        my %users   = ();
 | 
			
		||||
        my $rec     = $adb->get($group);
 | 
			
		||||
 | 
			
		||||
	    my $rec = $adb->get($group);
 | 
			
		||||
	    if ($rec and $rec->prop('type') eq 'group') {
 | 
			
		||||
        if ($rec and $rec->prop('type') eq 'group') {
 | 
			
		||||
            $grp_datas{group}       = $group;
 | 
			
		||||
            $grp_datas{description} = $rec->prop('Description') || '';
 | 
			
		||||
            %members                = @{ $c->gen_members_list($group) };
 | 
			
		||||
        } ## end if ($rec and $rec->prop...)
 | 
			
		||||
        $c->stash(members => \%members, users => \%users);
 | 
			
		||||
    } ## end if ($trt eq 'UPD')
 | 
			
		||||
 | 
			
		||||
    		$grp_datas{group} = $group;
 | 
			
		||||
    		$grp_datas{description} = $rec->prop('Description') || '';
 | 
			
		||||
    if ($trt eq 'DEL') {
 | 
			
		||||
        my %members = ();
 | 
			
		||||
        my %ibays   = ();
 | 
			
		||||
        my $rec     = $adb->get($group);
 | 
			
		||||
 | 
			
		||||
		%members = @{$c->gen_members_list( $group )};
 | 
			
		||||
	    }
 | 
			
		||||
        if ($rec and $rec->prop('type') eq 'group') {
 | 
			
		||||
            $grp_datas{group}       = $group;
 | 
			
		||||
            $grp_datas{description} = $rec->prop('Description') || '';
 | 
			
		||||
            %members                = @{ $c->gen_members_list($group) };
 | 
			
		||||
            %ibays                  = @{ $c->gen_ibays_list($group) };
 | 
			
		||||
        } ## end if ($rec and $rec->prop...)
 | 
			
		||||
        $c->stash(members => \%members, ibays => \%ibays);
 | 
			
		||||
    } ## end if ($trt eq 'DEL')
 | 
			
		||||
 | 
			
		||||
	    $c->stash( members => \%members, users => \%users );
 | 
			
		||||
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
        if ( $trt eq 'DEL' ) {
 | 
			
		||||
 | 
			
		||||
	    my %members = ();
 | 
			
		||||
	    my %ibays = ();
 | 
			
		||||
 | 
			
		||||
	    my $rec = $adb->get($group);
 | 
			
		||||
	    if ($rec and $rec->prop('type') eq 'group') {
 | 
			
		||||
 | 
			
		||||
    		$grp_datas{group} = $group;
 | 
			
		||||
    		$grp_datas{description} = $rec->prop('Description') || '';
 | 
			
		||||
 | 
			
		||||
		%members = @{$c->gen_members_list($group)};
 | 
			
		||||
 | 
			
		||||
		%ibays = @{$c->gen_ibays_list($group)};
 | 
			
		||||
 | 
			
		||||
	    }
 | 
			
		||||
 | 
			
		||||
	    $c->stash( members => \%members, ibays => \%ibays );
 | 
			
		||||
    if ($trt eq 'LST') {
 | 
			
		||||
        my @groups;
 | 
			
		||||
 | 
			
		||||
        if ($adb) {
 | 
			
		||||
            @groups = $adb->groups();
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
        if ( $trt eq 'LST' ) {
 | 
			
		||||
	    my @groups;
 | 
			
		||||
	    if ($adb) {
 | 
			
		||||
	        @groups = $adb->groups();
 | 
			
		||||
	    }
 | 
			
		||||
 | 
			
		||||
	    $c->stash( groups => \@groups );
 | 
			
		||||
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
    $c->stash( title => $title, grp_datas => \%grp_datas );
 | 
			
		||||
    $c->render( template => 'groups' );
 | 
			
		||||
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
        $c->stash(groups => \@groups);
 | 
			
		||||
    } ## end if ($trt eq 'LST')
 | 
			
		||||
    $c->stash(title => $title, grp_datas => \%grp_datas);
 | 
			
		||||
    $c->render(template => 'groups');
 | 
			
		||||
} ## end sub do_display
 | 
			
		||||
 | 
			
		||||
sub do_update {
 | 
			
		||||
 | 
			
		||||
    my $c = shift;
 | 
			
		||||
    $c->app->log->info($c->log_req);
 | 
			
		||||
 | 
			
		||||
    my $rt = $c->current_route;
 | 
			
		||||
    my $trt = ($c->param('trt') || 'LST');
 | 
			
		||||
    my $rt        = $c->current_route;
 | 
			
		||||
    my $trt       = ($c->param('trt') || 'LST');
 | 
			
		||||
    my $groupName = $c->param('groupName') || '';
 | 
			
		||||
 | 
			
		||||
    my $title = $c->l('grp_FORM_TITLE');
 | 
			
		||||
    my $title     = $c->l('grp_FORM_TITLE');
 | 
			
		||||
    my ($res, $result) = '';
 | 
			
		||||
    
 | 
			
		||||
    my %grp_datas = ();
 | 
			
		||||
    $grp_datas{'trt'} = $trt;
 | 
			
		||||
	$cdb = esmith::ConfigDB->open   || die "Couldn't open configuration db";
 | 
			
		||||
	$adb = esmith::AccountsDB->open || die "Couldn't open accounts db";
 | 
			
		||||
    $grp_datas{'trt'}   = $trt;
 | 
			
		||||
    $grp_datas{'group'} = $groupName;
 | 
			
		||||
    my @members = ();
 | 
			
		||||
 | 
			
		||||
    if ( $trt eq 'ADD' ) {
 | 
			
		||||
 | 
			
		||||
    if ($trt eq 'ADD') {
 | 
			
		||||
        my $groupDesc = $c->param('groupDesc');
 | 
			
		||||
	@members = @{$c->every_param('groupMembers')};
 | 
			
		||||
        @members = @{ $c->every_param('groupMembers') };
 | 
			
		||||
        my $members = join(",", @members);
 | 
			
		||||
 | 
			
		||||
        my $members = join ( ",", @members );
 | 
			
		||||
        # controls
 | 
			
		||||
        $res = $c->validate_group($groupName);
 | 
			
		||||
        $result .= $res . '<br>' unless $res eq 'OK';
 | 
			
		||||
        $res = $c->validate_group_length($groupName);
 | 
			
		||||
        $result .= $res . '<br>' unless $res eq 'OK';
 | 
			
		||||
        $res = $c->validate_group_naming_conflict($groupName);
 | 
			
		||||
        $result .= $res . '<br>' unless $res eq 'OK';
 | 
			
		||||
        $res = $c->validate_description($groupDesc);
 | 
			
		||||
        $result .= $res . '<br>' unless $res eq 'OK';
 | 
			
		||||
        $res = $c->validate_group_has_members(@members);
 | 
			
		||||
        $result .= $res . '<br>' unless $res eq 'OK';
 | 
			
		||||
        my %props = ('type', 'group', 'Description', $groupDesc, 'Members', $members);
 | 
			
		||||
        $res = '';
 | 
			
		||||
 | 
			
		||||
	# controls 
 | 
			
		||||
	$res = $c->validate_group( $groupName );
 | 
			
		||||
	$result .= $res . '<br>' unless $res eq 'OK';
 | 
			
		||||
        if (!$result) {
 | 
			
		||||
            $adb->new_record($groupName, \%props);
 | 
			
		||||
 | 
			
		||||
	$res = $c->validate_group_length( $groupName );
 | 
			
		||||
	$result .= $res . '<br>' unless $res eq 'OK';
 | 
			
		||||
            # Untaint groupName before use in system()
 | 
			
		||||
            ($groupName) = ($groupName =~ /^([a-z][\-\_\.a-z0-9]*)$/);
 | 
			
		||||
            system("/sbin/e-smith/signal-event", "group-create", "$groupName") == 0
 | 
			
		||||
                or $result .= $c->l('qgp_CREATE_ERROR') . "\n";
 | 
			
		||||
        } ## end if (!$result)
 | 
			
		||||
 | 
			
		||||
	$res = $c->validate_group_naming_conflict( $groupName );
 | 
			
		||||
	$result .= $res . '<br>' unless $res eq 'OK';
 | 
			
		||||
 | 
			
		||||
	$res = $c->validate_description( $groupDesc );
 | 
			
		||||
	$result .= $res . '<br>' unless $res eq 'OK';
 | 
			
		||||
 | 
			
		||||
	$res = $c->validate_group_has_members( @members );
 | 
			
		||||
	$result .= $res . '<br>' unless $res eq 'OK';
 | 
			
		||||
 | 
			
		||||
	my %props = (
 | 
			
		||||
    		'type', 'group', 'Description',
 | 
			
		||||
    		$groupDesc, 'Members', $members
 | 
			
		||||
	);
 | 
			
		||||
 | 
			
		||||
	$res = '';
 | 
			
		||||
	if ( ! $result ) {
 | 
			
		||||
 | 
			
		||||
	    $adb->new_record( $groupName, \%props );
 | 
			
		||||
 | 
			
		||||
    	    # Untaint groupName before use in system()
 | 
			
		||||
	    ($groupName) = ($groupName =~ /^([a-z][\-\_\.a-z0-9]*)$/);
 | 
			
		||||
 | 
			
		||||
	    system("/sbin/e-smith/signal-event", "group-create", "$groupName") == 0 
 | 
			
		||||
    		or $result .= $c->l('qgp_CREATE_ERROR')."\n";
 | 
			
		||||
	}
 | 
			
		||||
	if ( ! $result ) {
 | 
			
		||||
	    $result = $c->l('grp_CREATED_GROUP') . ' ' . $groupName; 
 | 
			
		||||
	    $res = 'OK';
 | 
			
		||||
	}
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    if ( $trt eq 'UPD' ) {
 | 
			
		||||
        if (!$result) {
 | 
			
		||||
            $result = $c->l('grp_CREATED_GROUP') . ' ' . $groupName;
 | 
			
		||||
            $res    = 'OK';
 | 
			
		||||
        }
 | 
			
		||||
    } ## end if ($trt eq 'ADD')
 | 
			
		||||
 | 
			
		||||
    if ($trt eq 'UPD') {
 | 
			
		||||
        my $groupDesc = $c->param('groupDesc');
 | 
			
		||||
	@members = @{$c->every_param('groupMembers')};
 | 
			
		||||
        my $members = join ( ",", @members );
 | 
			
		||||
        @members = @{ $c->every_param('groupMembers') };
 | 
			
		||||
        my $members = join(",", @members);
 | 
			
		||||
 | 
			
		||||
	# controls
 | 
			
		||||
	$res = '';
 | 
			
		||||
	$res = validate_description( $c, $groupDesc );
 | 
			
		||||
	$result .= $res . '<br>' unless $res eq 'OK';
 | 
			
		||||
        # controls
 | 
			
		||||
        $res = '';
 | 
			
		||||
        $res = validate_description($c, $groupDesc);
 | 
			
		||||
        $result .= $res . '<br>' unless $res eq 'OK';
 | 
			
		||||
        $res = validate_group_has_members($c, @members);
 | 
			
		||||
        $result .= $res . '<br>' unless $res eq 'OK';
 | 
			
		||||
        $res = '';
 | 
			
		||||
 | 
			
		||||
	$res = validate_group_has_members( $c, @members );
 | 
			
		||||
	$result .= $res . '<br>' unless $res eq 'OK';
 | 
			
		||||
        if (!$result) {
 | 
			
		||||
            $adb->get($groupName)->set_prop('Members',     $members);
 | 
			
		||||
            $adb->get($groupName)->set_prop('Description', $groupDesc);
 | 
			
		||||
 | 
			
		||||
	$res = '';
 | 
			
		||||
	if ( ! $result ) {
 | 
			
		||||
            # Untaint groupName before use in system()
 | 
			
		||||
            ($groupName) = ($groupName =~ /^([a-z][\-\_\.a-z0-9]*)$/);
 | 
			
		||||
            system("/sbin/e-smith/signal-event", "group-modify", "$groupName") == 0
 | 
			
		||||
                or $result .= $c->l('qgp_MODIFY_ERROR') . "\n";
 | 
			
		||||
        } ## end if (!$result)
 | 
			
		||||
 | 
			
		||||
	    $adb->get($groupName)->set_prop( 'Members', $members );
 | 
			
		||||
	    $adb->get($groupName)->set_prop( 'Description', $groupDesc );
 | 
			
		||||
        if (!$result) {
 | 
			
		||||
            $result = $c->l('grp_MODIFIED_GROUP') . ' ' . $groupName;
 | 
			
		||||
            $res    = 'OK';
 | 
			
		||||
        }
 | 
			
		||||
    } ## end if ($trt eq 'UPD')
 | 
			
		||||
 | 
			
		||||
	    # Untaint groupName before use in system()
 | 
			
		||||
	    ($groupName) = ($groupName =~ /^([a-z][\-\_\.a-z0-9]*)$/);
 | 
			
		||||
    if ($trt eq 'DEL') {
 | 
			
		||||
        if ($groupName =~ /^([a-z][\-\_\.a-z0-9]*)$/) {
 | 
			
		||||
            $groupName = $1;
 | 
			
		||||
        } else {
 | 
			
		||||
            $result .= $c->l('grp_ERR_INTERNAL_FAILURE') . ':' . $groupName;
 | 
			
		||||
        }
 | 
			
		||||
        my $rec = $adb->get($groupName);
 | 
			
		||||
        $result .= $c->l('grp_ERR_INTERNAL_FAILURE') . ':' . $groupName unless ($rec);
 | 
			
		||||
        $res = '';
 | 
			
		||||
 | 
			
		||||
	    system("/sbin/e-smith/signal-event", "group-modify", "$groupName") ==0 
 | 
			
		||||
    		or $result .= $c->l('qgp_MODIFY_ERROR')."\n";
 | 
			
		||||
	}
 | 
			
		||||
        if (!$result) {
 | 
			
		||||
            $res = delete_group($c, $groupName);
 | 
			
		||||
            $result .= $res unless $res eq 'OK';
 | 
			
		||||
 | 
			
		||||
	if ( ! $result ) { 
 | 
			
		||||
	    $result = $c->l('grp_MODIFIED_GROUP') . ' ' . $groupName; 
 | 
			
		||||
	    $res = 'OK';
 | 
			
		||||
	}
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    if ( $trt eq 'DEL' ) {
 | 
			
		||||
 | 
			
		||||
	if ($groupName =~ /^([a-z][\-\_\.a-z0-9]*)$/) {
 | 
			
		||||
    	    $groupName = $1;
 | 
			
		||||
	} else {
 | 
			
		||||
    	    $result .= $c->l('grp_ERR_INTERNAL_FAILURE') . ':' . $groupName;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	my $rec = $adb->get($groupName);
 | 
			
		||||
	$result .= $c->l('grp_ERR_INTERNAL_FAILURE') . ':' . $groupName unless ($rec);
 | 
			
		||||
 | 
			
		||||
	$res = '';
 | 
			
		||||
	if ( ! $result ) {
 | 
			
		||||
	    $res = delete_group( $c, $groupName );
 | 
			
		||||
	    $result .= $res unless $res eq 'OK';
 | 
			
		||||
	    if ( ! $result ) { 
 | 
			
		||||
		$result = $c->l('grp_DELETED_GROUP') . ' ' . $groupName; 
 | 
			
		||||
		$res = 'OK';
 | 
			
		||||
	    }
 | 
			
		||||
	}
 | 
			
		||||
    }
 | 
			
		||||
            if (!$result) {
 | 
			
		||||
                $result = $c->l('grp_DELETED_GROUP') . ' ' . $groupName;
 | 
			
		||||
                $res    = 'OK';
 | 
			
		||||
            }
 | 
			
		||||
        } ## end if (!$result)
 | 
			
		||||
    } ## end if ($trt eq 'DEL')
 | 
			
		||||
 | 
			
		||||
    # common parts
 | 
			
		||||
 | 
			
		||||
    if ($res ne 'OK') {
 | 
			
		||||
	$c->stash( error => $result );
 | 
			
		||||
	my %members = @{$c->gen_members_list($groupName)};
 | 
			
		||||
	$c->stash( title => $title, members => \%members, grp_datas => \%grp_datas );
 | 
			
		||||
	return $c->render('groups');
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
        $c->stash(error => $result);
 | 
			
		||||
        my %members = @{ $c->gen_members_list($groupName) };
 | 
			
		||||
        $c->stash(title => $title, members => \%members, grp_datas => \%grp_datas);
 | 
			
		||||
        return $c->render('groups');
 | 
			
		||||
    } ## end if ($res ne 'OK')
 | 
			
		||||
    my $message = "'Groups' updates ($trt) DONE";
 | 
			
		||||
    $c->app->log->info($message);
 | 
			
		||||
    $c->flash( success => $result );
 | 
			
		||||
 | 
			
		||||
    $c->flash(success => $result);
 | 
			
		||||
    $c->redirect_to('/groups');
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
} ## end sub do_update
 | 
			
		||||
 | 
			
		||||
sub delete_group {
 | 
			
		||||
 | 
			
		||||
    my ( $c, $groupName ) = @_;
 | 
			
		||||
    my ($c, $groupName) = @_;
 | 
			
		||||
 | 
			
		||||
    # Update the db account (1)
 | 
			
		||||
    $adb->get($groupName)->set_prop('type', 'group-deleted');
 | 
			
		||||
 | 
			
		||||
    # Untaint groupName before use in system()
 | 
			
		||||
    ($groupName) = ($groupName =~ /^([a-z][\-\_\.a-z0-9]*)$/);
 | 
			
		||||
 | 
			
		||||
    return (system ("/sbin/e-smith/signal-event", "group-delete", "$groupName") ||
 | 
			
		||||
	    ! $adb->get($groupName)->delete()) ?
 | 
			
		||||
            $c->l('DELETE_ERROR') : 'OK';
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
    return (system("/sbin/e-smith/signal-event", "group-delete", "$groupName") || !$adb->get($groupName)->delete())
 | 
			
		||||
        ? $c->l('DELETE_ERROR')
 | 
			
		||||
        : 'OK';
 | 
			
		||||
} ## end sub delete_group
 | 
			
		||||
 | 
			
		||||
sub gen_members_list {
 | 
			
		||||
 | 
			
		||||
    my ( $c, $group ) = @_;
 | 
			
		||||
 | 
			
		||||
    my ($c, $group) = @_;
 | 
			
		||||
    my @members = ();
 | 
			
		||||
    my $rec = $adb->get($group);
 | 
			
		||||
    @members = split ( /,/, $rec->prop('Members') ) if ( $rec );
 | 
			
		||||
 | 
			
		||||
    my $rec     = $adb->get($group);
 | 
			
		||||
    @members = split(/,/, $rec->prop('Members')) if ($rec);
 | 
			
		||||
    my %names;
 | 
			
		||||
 | 
			
		||||
    foreach my $m (@members) {
 | 
			
		||||
        my $name;
 | 
			
		||||
        if ( $m eq 'admin' ) {
 | 
			
		||||
 | 
			
		||||
        if ($m eq 'admin') {
 | 
			
		||||
            $name = "Administrator";
 | 
			
		||||
        } else {
 | 
			
		||||
            $name = $adb->get($m)->prop('FirstName') . " " . $adb->get($m)->prop('LastName');
 | 
			
		||||
        }
 | 
			
		||||
        else {
 | 
			
		||||
            $name = $adb->get($m)->prop('FirstName') . " "
 | 
			
		||||
              . $adb->get($m)->prop('LastName');
 | 
			
		||||
        }
 | 
			
		||||
	$names{$m} = $name;
 | 
			
		||||
    }
 | 
			
		||||
        $names{$m} = $name;
 | 
			
		||||
    } ## end foreach my $m (@members)
 | 
			
		||||
    @members = %names;
 | 
			
		||||
 | 
			
		||||
    return \@members;
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
} ## end sub gen_members_list
 | 
			
		||||
 | 
			
		||||
sub gen_ibays_list {
 | 
			
		||||
 | 
			
		||||
    my ( $c, $group ) = @_;
 | 
			
		||||
 | 
			
		||||
    my ($c, $group) = @_;
 | 
			
		||||
    my %names;
 | 
			
		||||
    foreach my $ibay ( $adb->ibays ) {
 | 
			
		||||
        if ( $ibay->prop('Group') eq $group ) {
 | 
			
		||||
	    $names{$ibay->key} = $ibay->prop('Name');
 | 
			
		||||
 | 
			
		||||
    foreach my $ibay ($adb->ibays) {
 | 
			
		||||
        if ($ibay->prop('Group') eq $group) {
 | 
			
		||||
            $names{ $ibay->key } = $ibay->prop('Name');
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    } ## end foreach my $ibay ($adb->ibays)
 | 
			
		||||
    my @ibays = %names;
 | 
			
		||||
 | 
			
		||||
    return \@ibays;
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
} ## end sub gen_ibays_list
 | 
			
		||||
 | 
			
		||||
sub gen_users_list {
 | 
			
		||||
 | 
			
		||||
    my $c = shift;
 | 
			
		||||
 | 
			
		||||
    my @users = sort { $a->key() cmp $b->key() } $adb->users();
 | 
			
		||||
    my %names;
 | 
			
		||||
 | 
			
		||||
    foreach my $user ( @users ) {
 | 
			
		||||
	$names{$user->key} = $user->prop('FirstName') . " "
 | 
			
		||||
        	  . $user->prop('LastName');
 | 
			
		||||
    foreach my $user (@users) {
 | 
			
		||||
        $names{ $user->key } = $user->prop('FirstName') . " " . $user->prop('LastName');
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return \%names;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
} ## end sub gen_users_list
 | 
			
		||||
 | 
			
		||||
=head1 VALIDATION
 | 
			
		||||
 | 
			
		||||
@@ -350,21 +280,17 @@ ok($panel->validate_is_group('ro2ot') eq 'NOT_A_GROUP', "Ro2ot is not a group");
 | 
			
		||||
 | 
			
		||||
=cut
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
sub validate_is_group () {
 | 
			
		||||
    my $c    = shift;
 | 
			
		||||
    my $group = shift;
 | 
			
		||||
 | 
			
		||||
    my $c      = shift;
 | 
			
		||||
    my $group  = shift;
 | 
			
		||||
    my @groups = $adb->groups();
 | 
			
		||||
    my %groups = map { $_->key => 1 } @groups;
 | 
			
		||||
 | 
			
		||||
    unless ( exists $groups{$group} ) {
 | 
			
		||||
    unless (exists $groups{$group}) {
 | 
			
		||||
        return ($c->l('grp_NOT_A_GROUP'));
 | 
			
		||||
    }
 | 
			
		||||
    return ("OK");
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
} ## end sub validate_is_group
 | 
			
		||||
 | 
			
		||||
=head2 validate_group_naming_conflict FM GROUPNAME 
 | 
			
		||||
 | 
			
		||||
@@ -375,29 +301,21 @@ Returns "NAME_CONFLICT" if this group name conflicts with anything else
 | 
			
		||||
ok (undef, 'need testing for validate_naming_Conflicts');
 | 
			
		||||
=cut
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
sub validate_group_naming_conflict
 | 
			
		||||
{
 | 
			
		||||
    my $c        = shift;
 | 
			
		||||
sub validate_group_naming_conflict {
 | 
			
		||||
    my $c         = shift;
 | 
			
		||||
    my $groupName = shift;
 | 
			
		||||
 | 
			
		||||
    my $account = $adb->get($groupName);
 | 
			
		||||
    my $account   = $adb->get($groupName);
 | 
			
		||||
    my $type;
 | 
			
		||||
 | 
			
		||||
    if (defined $account)
 | 
			
		||||
    {
 | 
			
		||||
	$type = $account->prop('type');
 | 
			
		||||
    }
 | 
			
		||||
    elsif (defined getpwnam($groupName) || defined getgrnam($groupName))
 | 
			
		||||
    {
 | 
			
		||||
	$type = "system";
 | 
			
		||||
    }
 | 
			
		||||
    else
 | 
			
		||||
    {
 | 
			
		||||
	return('OK');
 | 
			
		||||
    if (defined $account) {
 | 
			
		||||
        $type = $account->prop('type');
 | 
			
		||||
    } elsif (defined getpwnam($groupName) || defined getgrnam($groupName)) {
 | 
			
		||||
        $type = "system";
 | 
			
		||||
    } else {
 | 
			
		||||
        return ('OK');
 | 
			
		||||
    }
 | 
			
		||||
    return ($c->l('grp_ACCOUNT_CONFLICT', $groupName, $type));
 | 
			
		||||
}
 | 
			
		||||
} ## end sub validate_group_naming_conflict
 | 
			
		||||
 | 
			
		||||
=head2 validate_group FM groupname
 | 
			
		||||
 | 
			
		||||
@@ -414,14 +332,14 @@ ok(validate_group('','f&oo') eq 'GROUP_CONTAINS_INVALD', 'f&oo is not a valid gr
 | 
			
		||||
=cut
 | 
			
		||||
 | 
			
		||||
sub validate_group {
 | 
			
		||||
    my $c        = shift;
 | 
			
		||||
    my $c         = shift;
 | 
			
		||||
    my $groupName = shift;
 | 
			
		||||
    unless ( $groupName =~ /^([a-z][\-\_\.a-z0-9]*)$/ ) {
 | 
			
		||||
 | 
			
		||||
    unless ($groupName =~ /^([a-z][\-\_\.a-z0-9]*)$/) {
 | 
			
		||||
        return $c->l('grp_GROUP_NAMING');
 | 
			
		||||
    }
 | 
			
		||||
    return ('OK');
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
} ## end sub validate_group
 | 
			
		||||
 | 
			
		||||
=head2 validate_group_length FM GROUPNAME
 | 
			
		||||
 | 
			
		||||
@@ -438,22 +356,21 @@ ok(($panel->validate_group_length('fooooooooooooooooo') eq 'GROUP_TOO_LONG'), "a
 | 
			
		||||
=cut
 | 
			
		||||
 | 
			
		||||
sub validate_group_length {
 | 
			
		||||
    my $c        = shift;
 | 
			
		||||
    my $groupName = shift;
 | 
			
		||||
    my $c                  = shift;
 | 
			
		||||
    my $groupName          = shift;
 | 
			
		||||
    my $maxGroupNameLength = (
 | 
			
		||||
          $cdb->get('maxGroupNameLength')
 | 
			
		||||
        ? $cdb->get('maxGroupNameLength')->prop('type')
 | 
			
		||||
        : ""
 | 
			
		||||
        )
 | 
			
		||||
        || 12;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    my $maxGroupNameLength = ($cdb->get('maxGroupNameLength')
 | 
			
		||||
			       ? $cdb->get('maxGroupNameLength')->prop('type')
 | 
			
		||||
			       : "") || 12;
 | 
			
		||||
 | 
			
		||||
    if ( length $groupName > $maxGroupNameLength ) {
 | 
			
		||||
    if (length $groupName > $maxGroupNameLength) {
 | 
			
		||||
        return $c->l('grp_GROUP_TOO_LONG', $maxGroupNameLength);
 | 
			
		||||
    }
 | 
			
		||||
    else {
 | 
			
		||||
    } else {
 | 
			
		||||
        return ('OK');
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
} ## end sub validate_group_length
 | 
			
		||||
 | 
			
		||||
=head2 validate_group_has_members FM MEMBERS
 | 
			
		||||
 | 
			
		||||
@@ -473,17 +390,16 @@ ok(validate_group_has_members('')  eq 'NO_MEMBERS', "We do ok with a group with
 | 
			
		||||
=cut
 | 
			
		||||
 | 
			
		||||
sub validate_group_has_members {
 | 
			
		||||
    my $c      = shift;
 | 
			
		||||
    my $c       = shift;
 | 
			
		||||
    my @members = (@_);
 | 
			
		||||
    my $count   = @members;
 | 
			
		||||
    if ( $count == 0 ) {
 | 
			
		||||
 | 
			
		||||
    if ($count == 0) {
 | 
			
		||||
        return ($c->l('grp_NO_MEMBERS'));
 | 
			
		||||
    }
 | 
			
		||||
    else {
 | 
			
		||||
    } else {
 | 
			
		||||
        return ('OK');
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
} ## end sub validate_group_has_members
 | 
			
		||||
 | 
			
		||||
=pod
 | 
			
		||||
 | 
			
		||||
@@ -492,16 +408,13 @@ Checks the supplied description. Period is allowed in description
 | 
			
		||||
 | 
			
		||||
=cut
 | 
			
		||||
 | 
			
		||||
sub validate_description
 | 
			
		||||
{
 | 
			
		||||
sub validate_description {
 | 
			
		||||
    my ($c, $description) = @_;
 | 
			
		||||
    if ( $description =~ /^([\-\'\w][\-\'\w\s\.]*)$/ ) {
 | 
			
		||||
 | 
			
		||||
    if ($description =~ /^([\-\'\w][\-\'\w\s\.]*)$/) {
 | 
			
		||||
        return ('OK');
 | 
			
		||||
    }
 | 
			
		||||
    else {
 | 
			
		||||
    } else {
 | 
			
		||||
        return ($c->l('FM_ERR_UNEXPECTED_DESC'));
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
} ## end sub validate_description
 | 
			
		||||
1
 | 
			
		||||
 
 | 
			
		||||
@@ -11,16 +11,12 @@ package SrvMngr::Controller::Hostentries;
 | 
			
		||||
use strict;
 | 
			
		||||
use warnings;
 | 
			
		||||
use Mojo::Base 'Mojolicious::Controller';
 | 
			
		||||
 | 
			
		||||
use Locale::gettext;
 | 
			
		||||
use SrvMngr::I18N;
 | 
			
		||||
 | 
			
		||||
use SrvMngr qw(theme_list init_session);
 | 
			
		||||
 | 
			
		||||
#use Data::Dumper;
 | 
			
		||||
 | 
			
		||||
#use esmith::FormMagick::Panel::hostentries;
 | 
			
		||||
 | 
			
		||||
use esmith::DomainsDB;
 | 
			
		||||
use esmith::AccountsDB;
 | 
			
		||||
use esmith::HostsDB;
 | 
			
		||||
@@ -29,89 +25,81 @@ use HTML::Entities;
 | 
			
		||||
use Net::IPv4Addr qw(ipv4_in_network);
 | 
			
		||||
 | 
			
		||||
#use URI::Escape;
 | 
			
		||||
 | 
			
		||||
our $ddb = esmith::DomainsDB->open  || die "Couldn't open hostentries db";
 | 
			
		||||
our $cdb = esmith::ConfigDB->open   || die "Couldn't open configuration db";
 | 
			
		||||
our $hdb = esmith::HostsDB->open    || die "Couldn't open hosts db";
 | 
			
		||||
our $ndb = esmith::NetworksDB->open || die "Couldn't open networks db";
 | 
			
		||||
#our $ddb = esmith::DomainsDB->open  || die "Couldn't open hostentries db";
 | 
			
		||||
#our $cdb = esmith::ConfigDB->open   || die "Couldn't open configuration db";
 | 
			
		||||
#our $hdb = esmith::HostsDB->open    || die "Couldn't open hosts db";
 | 
			
		||||
#our $ndb = esmith::NetworksDB->open || die "Couldn't open networks db";
 | 
			
		||||
my ($ddb,$cdb,$hdb,$ndb);
 | 
			
		||||
 | 
			
		||||
sub main {
 | 
			
		||||
 | 
			
		||||
    my $c = shift;
 | 
			
		||||
    $c->app->log->info( $c->log_req );
 | 
			
		||||
 | 
			
		||||
    $c->app->log->info($c->log_req);
 | 
			
		||||
    my %hos_datas = ();
 | 
			
		||||
    my $title     = $c->l('hos_FORM_TITLE');
 | 
			
		||||
    my $notif     = '';
 | 
			
		||||
 | 
			
		||||
	#my $ddb = esmith::DomainsDB->open  || die "Couldn't open hostentries db";
 | 
			
		||||
	$cdb = esmith::ConfigDB->open   || die "Couldn't open configuration db";
 | 
			
		||||
	$hdb = esmith::HostsDB->open    || die "Couldn't open hosts db";
 | 
			
		||||
	$ndb = esmith::NetworksDB->open || die "Couldn't open networks db";
 | 
			
		||||
    $hos_datas{trt} = 'LIST';
 | 
			
		||||
 | 
			
		||||
    my %dom_hosts = ();
 | 
			
		||||
 | 
			
		||||
    foreach my $d ( @{ domains_list() } ) {
 | 
			
		||||
    foreach my $d (@{ domains_list() }) {
 | 
			
		||||
        $dom_hosts{$d} = { COUNT => 0, HOSTS => [] };
 | 
			
		||||
 | 
			
		||||
        if ( my @hosts = $hdb->get_hosts_by_domain($d) ) {
 | 
			
		||||
        if (my @hosts = $hdb->get_hosts_by_domain($d)) {
 | 
			
		||||
            $dom_hosts{$d}{'COUNT'} = scalar(@hosts);
 | 
			
		||||
 | 
			
		||||
            #    my @entries;
 | 
			
		||||
            push @{ $dom_hosts{$d}{'HOSTS'} }, host_data($_) foreach (@hosts);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
        } ## end if (my @hosts = $hdb->...)
 | 
			
		||||
    } ## end foreach my $d (@{ domains_list...})
 | 
			
		||||
    $c->stash(
 | 
			
		||||
        title     => $title,
 | 
			
		||||
        notif     => $notif,
 | 
			
		||||
        hos_datas => \%hos_datas,
 | 
			
		||||
        dom_hosts => \%dom_hosts
 | 
			
		||||
    );
 | 
			
		||||
    $c->render( template => 'hostentries' );
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
    $c->render(template => 'hostentries');
 | 
			
		||||
} ## end sub main
 | 
			
		||||
 | 
			
		||||
sub do_display {
 | 
			
		||||
 | 
			
		||||
    my $c = shift;
 | 
			
		||||
    $c->app->log->info( $c->log_req );
 | 
			
		||||
 | 
			
		||||
    $c->app->log->info($c->log_req);
 | 
			
		||||
    my $rt       = $c->current_route;
 | 
			
		||||
    my $trt      = $c->param('trt') || 'LST';
 | 
			
		||||
    my $hostname = $c->param('Hostname') || '';
 | 
			
		||||
 | 
			
		||||
    $trt = 'ADD' if ( $rt eq 'hostentryadd' );
 | 
			
		||||
    $trt = 'LST' if ( $trt ne 'DEL' && $trt ne 'UPD' && $trt ne 'ADD' );
 | 
			
		||||
 | 
			
		||||
    $trt = 'ADD' if ($rt eq 'hostentryadd');
 | 
			
		||||
    $trt = 'LST' if ($trt ne 'DEL' && $trt ne 'UPD' && $trt ne 'ADD');
 | 
			
		||||
    my %hos_datas = ();
 | 
			
		||||
    my $title     = $c->l('hos_FORM_TITLE');
 | 
			
		||||
	$cdb = esmith::ConfigDB->open   || die "Couldn't open configuration db";
 | 
			
		||||
	$hdb = esmith::HostsDB->open    || die "Couldn't open hosts db";
 | 
			
		||||
	$ndb = esmith::NetworksDB->open || die "Couldn't open networks db";
 | 
			
		||||
    my $notif     = '';
 | 
			
		||||
 | 
			
		||||
    $hos_datas{'trt'} = $trt;
 | 
			
		||||
 | 
			
		||||
    if ( $trt eq 'ADD' ) {
 | 
			
		||||
 | 
			
		||||
    if ($trt eq 'ADD') {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if ( $trt eq 'UPD' or $trt eq 'DEL' ) {
 | 
			
		||||
 | 
			
		||||
    if ($trt eq 'UPD' or $trt eq 'DEL') {
 | 
			
		||||
        my $rec = $hdb->get($hostname);
 | 
			
		||||
 | 
			
		||||
        if ($rec) {
 | 
			
		||||
            $hos_datas{hostname} = $rec->key;
 | 
			
		||||
            ( $hos_datas{name}, $hos_datas{domain} ) =
 | 
			
		||||
              split_hostname($hostname);
 | 
			
		||||
            ($hos_datas{name}, $hos_datas{domain})
 | 
			
		||||
                = split_hostname($hostname);
 | 
			
		||||
            $hos_datas{internalip} = $rec->prop('InternalIP') || '';
 | 
			
		||||
            $hos_datas{externalip} = $rec->prop('ExternalIP') || '';
 | 
			
		||||
            $hos_datas{macaddress} = $rec->prop('MACAddress') || '';
 | 
			
		||||
            $hos_datas{hosttype}   = $rec->prop('HostType');
 | 
			
		||||
            $hos_datas{comment} =
 | 
			
		||||
              HTML::Entities::encode( $rec->prop('Comment') );
 | 
			
		||||
        }
 | 
			
		||||
        else {
 | 
			
		||||
            $hos_datas{comment}    = HTML::Entities::encode($rec->prop('Comment'));
 | 
			
		||||
        } else {
 | 
			
		||||
            $notif = "Hostname $hostname not found !";
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    } ## end if ($trt eq 'UPD' or $trt...)
 | 
			
		||||
 | 
			
		||||
    #if ( $trt eq 'DEL' ) {
 | 
			
		||||
 | 
			
		||||
    #    my $rec = $hdb->get($hostname);
 | 
			
		||||
    #    if ( $rec ) {
 | 
			
		||||
    #	get_hos_datas( $rec, %hos_datas );
 | 
			
		||||
@@ -119,29 +107,24 @@ sub do_display {
 | 
			
		||||
    #	$notif = "Hostname $hostname not found !"
 | 
			
		||||
    #    }
 | 
			
		||||
    #}
 | 
			
		||||
 | 
			
		||||
    if ( $trt eq 'LIST' ) {
 | 
			
		||||
 | 
			
		||||
    if ($trt eq 'LIST') {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    $c->stash( title => $title, notif => $notif, hos_datas => \%hos_datas );
 | 
			
		||||
    $c->render( template => 'hostentries' );
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
    $c->stash(title => $title, notif => $notif, hos_datas => \%hos_datas);
 | 
			
		||||
    $c->render(template => 'hostentries');
 | 
			
		||||
} ## end sub do_display
 | 
			
		||||
 | 
			
		||||
sub do_update {
 | 
			
		||||
 | 
			
		||||
    my $c = shift;
 | 
			
		||||
    $c->app->log->info( $c->log_req );
 | 
			
		||||
 | 
			
		||||
    my $rt = $c->current_route;
 | 
			
		||||
    my $trt = ( $c->param('trt') || 'LIST' );
 | 
			
		||||
 | 
			
		||||
    $c->app->log->info($c->log_req);
 | 
			
		||||
    my $rt        = $c->current_route;
 | 
			
		||||
    my $trt       = ($c->param('trt') || 'LIST');
 | 
			
		||||
    my %hos_datas = ();
 | 
			
		||||
    my $title     = $c->l('hos_FORM_TITLE');
 | 
			
		||||
	$cdb = esmith::ConfigDB->open   || die "Couldn't open configuration db";
 | 
			
		||||
	$hdb = esmith::HostsDB->open    || die "Couldn't open hosts db";
 | 
			
		||||
	$ndb = esmith::NetworksDB->open || die "Couldn't open networks db";
 | 
			
		||||
    my $notif     = '';
 | 
			
		||||
    my $result    = '';
 | 
			
		||||
 | 
			
		||||
    $hos_datas{'name'}       = lc $c->param('Name');
 | 
			
		||||
    $hos_datas{'domain'}     = lc $c->param('Domain');
 | 
			
		||||
    $hos_datas{'hostname'}   = $c->param('Hostname');
 | 
			
		||||
@@ -151,199 +134,180 @@ sub do_update {
 | 
			
		||||
    $hos_datas{'macaddress'} = $c->param('Macaddress');
 | 
			
		||||
    $hos_datas{'externalip'} = $c->param('Externalip');
 | 
			
		||||
    my $hostname = "$hos_datas{'name'}.$hos_datas{'domain'}";
 | 
			
		||||
    if ( $trt eq 'ADD' ) {
 | 
			
		||||
		
 | 
			
		||||
		$hos_datas{'hostname'} = $hostname;
 | 
			
		||||
 | 
			
		||||
    if ($trt eq 'ADD') {
 | 
			
		||||
        $hos_datas{'hostname'} = $hostname;
 | 
			
		||||
 | 
			
		||||
        # controls
 | 
			
		||||
        my $res = '';
 | 
			
		||||
        unless ( $hos_datas{'name'} =~ /^[a-z0-9][a-z0-9-]*$/ ) {
 | 
			
		||||
 | 
			
		||||
        unless ($hos_datas{'name'} =~ /^[a-z0-9][a-z0-9-]*$/) {
 | 
			
		||||
            $result .= $c->l('hos_HOSTNAME_VALIDATOR_ERROR') . '<br>';
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        unless ( $hos_datas{comment} =~ /^([a-zA-Z0-9][\_\.\-,A-Za-z0-9\s]*)$/
 | 
			
		||||
            || $hos_datas{comment} eq '' )
 | 
			
		||||
        unless ($hos_datas{comment} =~ /^([a-zA-Z0-9][\_\.\-,A-Za-z0-9\s]*)$/
 | 
			
		||||
            || $hos_datas{comment} eq '')
 | 
			
		||||
        {
 | 
			
		||||
            $result .= $c->l('hos_HOSTNAME_COMMENT_ERROR') . '<br>';
 | 
			
		||||
        }
 | 
			
		||||
        } ## end unless ($hos_datas{comment...})
 | 
			
		||||
 | 
			
		||||
        # Look for duplicate hosts.
 | 
			
		||||
        my $hostrec = undef;
 | 
			
		||||
        if ( $hostrec = $hdb->get($hostname) ) {
 | 
			
		||||
 | 
			
		||||
        if ($hostrec = $hdb->get($hostname)) {
 | 
			
		||||
            $result .= $c->l(
 | 
			
		||||
                'hos_HOSTNAME_EXISTS_ERROR',
 | 
			
		||||
                {
 | 
			
		||||
                    fullHostName => $hostname,
 | 
			
		||||
                {   fullHostName => $hostname,
 | 
			
		||||
                    type         => $hostrec->prop('HostType')
 | 
			
		||||
                }
 | 
			
		||||
            ) . '<br>',;
 | 
			
		||||
        }
 | 
			
		||||
        } ## end if ($hostrec = $hdb->get...)
 | 
			
		||||
 | 
			
		||||
        if ( !$result and $hos_datas{hosttype} ne 'Self' ) {
 | 
			
		||||
            if ( $hos_datas{hosttype} eq 'Local' ) {
 | 
			
		||||
        if (!$result and $hos_datas{hosttype} ne 'Self') {
 | 
			
		||||
            if ($hos_datas{hosttype} eq 'Local') {
 | 
			
		||||
                $hos_datas{'trt'} = 'ALC';    # ADD/LOCAL
 | 
			
		||||
            }
 | 
			
		||||
            else {
 | 
			
		||||
            } else {
 | 
			
		||||
                $hos_datas{'trt'} = 'ARM';    # ADD/REMOVE
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            $c->stash( title => $title, notif => '', hos_datas => \%hos_datas );
 | 
			
		||||
            return $c->render( template => 'hostentries' );
 | 
			
		||||
        }
 | 
			
		||||
            $c->stash(title => $title, notif => '', hos_datas => \%hos_datas);
 | 
			
		||||
            return $c->render(template => 'hostentries');
 | 
			
		||||
        } ## end if (!$result and $hos_datas...)
 | 
			
		||||
 | 
			
		||||
        #!#$result .= ' blocked';
 | 
			
		||||
 | 
			
		||||
        if ( !$result ) {
 | 
			
		||||
            $res = create_modify_hostentry( $c, $trt, %hos_datas );
 | 
			
		||||
        if (!$result) {
 | 
			
		||||
            $res = create_modify_hostentry($c, $trt, %hos_datas);
 | 
			
		||||
            $result .= $res unless $res eq 'OK';
 | 
			
		||||
        }
 | 
			
		||||
        if ( !$result ) {
 | 
			
		||||
 | 
			
		||||
        if (!$result) {
 | 
			
		||||
            $result = $c->l('hos_CREATE_OR_MODIFY_SUCCEEDED') . ' ' . $hostname;
 | 
			
		||||
            $trt    = 'SUC';
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    } ## end if ($trt eq 'ADD')
 | 
			
		||||
 | 
			
		||||
    if ( $trt eq 'UPD' ) {
 | 
			
		||||
    if ($trt eq 'UPD') {
 | 
			
		||||
 | 
			
		||||
        # controls
 | 
			
		||||
        my $res = '';
 | 
			
		||||
 | 
			
		||||
        #$res = validate_description( $c, $account );
 | 
			
		||||
        #$result .= $res unless $res eq 'OK';
 | 
			
		||||
 | 
			
		||||
        unless ( $hos_datas{comment} =~ /^([a-zA-Z0-9][\_\.\-,A-Za-z0-9\s]*)$/
 | 
			
		||||
            || $hos_datas{comment} eq '' )
 | 
			
		||||
        unless ($hos_datas{comment} =~ /^([a-zA-Z0-9][\_\.\-,A-Za-z0-9\s]*)$/
 | 
			
		||||
            || $hos_datas{comment} eq '')
 | 
			
		||||
        {
 | 
			
		||||
            $result .= $c->l('hos_HOSTNAME_COMMENT_ERROR') . '<br>';
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        if ( !$result and $hos_datas{hosttype} ne 'Self' ) {
 | 
			
		||||
            if ( $hos_datas{hosttype} eq 'Local' ) {
 | 
			
		||||
        if (!$result and $hos_datas{hosttype} ne 'Self') {
 | 
			
		||||
            if ($hos_datas{hosttype} eq 'Local') {
 | 
			
		||||
                $hos_datas{'trt'} = 'ULC';    # UPDATE/LOCAL
 | 
			
		||||
            }
 | 
			
		||||
            else {
 | 
			
		||||
            } else {
 | 
			
		||||
                $hos_datas{'trt'} = 'URM';    # UPDATE/REMOVE
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            $c->stash( title => $title, notif => '', hos_datas => \%hos_datas );
 | 
			
		||||
            return $c->render( template => 'hostentries' );
 | 
			
		||||
        }
 | 
			
		||||
            $c->stash(title => $title, notif => '', hos_datas => \%hos_datas);
 | 
			
		||||
            return $c->render(template => 'hostentries');
 | 
			
		||||
        } ## end if (!$result and $hos_datas...)
 | 
			
		||||
 | 
			
		||||
        #!#$result .= 'blocked';
 | 
			
		||||
 | 
			
		||||
        if ( !$result ) {
 | 
			
		||||
            $res = create_modify_hostentry( $c, $trt, %hos_datas );
 | 
			
		||||
        if (!$result) {
 | 
			
		||||
            $res = create_modify_hostentry($c, $trt, %hos_datas);
 | 
			
		||||
            $result .= $res unless $res eq 'OK';
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        if ( !$result ) {
 | 
			
		||||
        if (!$result) {
 | 
			
		||||
            $result = $c->l('hos_MODIFY_SUCCEEDED') . ' ' . $hostname;
 | 
			
		||||
            $trt    = 'SUC';
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    } ## end if ($trt eq 'UPD')
 | 
			
		||||
 | 
			
		||||
    if ( $trt =~ /^.LC$/ ) {
 | 
			
		||||
    if ($trt =~ /^.LC$/) {
 | 
			
		||||
 | 
			
		||||
        # controls
 | 
			
		||||
        my $res = '';
 | 
			
		||||
        $res = ip_number( $c, $hos_datas{internalip} );
 | 
			
		||||
        $res = ip_number($c, $hos_datas{internalip});
 | 
			
		||||
        $result .= $res . ' ' unless $res eq 'OK';
 | 
			
		||||
 | 
			
		||||
        $res = not_in_dhcp_range( $c, $hos_datas{internalip} );
 | 
			
		||||
        $res = not_in_dhcp_range($c, $hos_datas{internalip});
 | 
			
		||||
        $result .= $res . ' ' unless $res eq 'OK';
 | 
			
		||||
 | 
			
		||||
        $res = not_taken( $c, $hos_datas{internalip} );
 | 
			
		||||
        $res = not_taken($c, $hos_datas{internalip});
 | 
			
		||||
        $result .= $res . ' ' unless $res eq 'OK';
 | 
			
		||||
 | 
			
		||||
        $res = must_be_local( $c, $hos_datas{internalip} );
 | 
			
		||||
        $res = must_be_local($c, $hos_datas{internalip});
 | 
			
		||||
        $result .= $res . ' ' unless $res eq 'OK';
 | 
			
		||||
 | 
			
		||||
        $res = mac_address_or_blank( $c, $hos_datas{macaddress} );
 | 
			
		||||
        $res = mac_address_or_blank($c, $hos_datas{macaddress});
 | 
			
		||||
        $result .= $res . ' ' unless $res eq 'OK';
 | 
			
		||||
 | 
			
		||||
        #!#$result .= 'blocked';
 | 
			
		||||
 | 
			
		||||
        if ( !$result ) {
 | 
			
		||||
            $res = create_modify_hostentry( $c, $trt, %hos_datas );
 | 
			
		||||
        if (!$result) {
 | 
			
		||||
            $res = create_modify_hostentry($c, $trt, %hos_datas);
 | 
			
		||||
            $result .= $res unless $res eq 'OK';
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        if ( !$result ) {
 | 
			
		||||
        if (!$result) {
 | 
			
		||||
            $result = $c->l('hos_MODIFY_SUCCEEDED') . ' ' . $hostname;
 | 
			
		||||
            $trt    = 'SUC';
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    } ## end if ($trt =~ /^.LC$/)
 | 
			
		||||
 | 
			
		||||
    if ( $trt =~ /^.RM$/ ) {
 | 
			
		||||
    if ($trt =~ /^.RM$/) {
 | 
			
		||||
 | 
			
		||||
        # controls
 | 
			
		||||
        my $res = '';
 | 
			
		||||
        $res = ip_number_or_blank( $c, $hos_datas{externalip} );
 | 
			
		||||
        $res = ip_number_or_blank($c, $hos_datas{externalip});
 | 
			
		||||
        $result .= $res . '<br>' unless $res eq 'OK';
 | 
			
		||||
 | 
			
		||||
        #!#$result .= 'blocked';
 | 
			
		||||
 | 
			
		||||
        if ( !$result ) {
 | 
			
		||||
            $res = create_modify_hostentry( $c, $trt, %hos_datas );
 | 
			
		||||
        if (!$result) {
 | 
			
		||||
            $res = create_modify_hostentry($c, $trt, %hos_datas);
 | 
			
		||||
            $result .= $res unless $res eq 'OK';
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        if ( !$result ) {
 | 
			
		||||
        if (!$result) {
 | 
			
		||||
            $result = $c->l('hos_MODIFY_SUCCEEDED') . ' ' . $hostname;
 | 
			
		||||
            $trt    = 'SUC';
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
    }
 | 
			
		||||
    } ## end if ($trt =~ /^.RM$/)
 | 
			
		||||
 | 
			
		||||
    #if ( $trt eq 'ULC' ) {
 | 
			
		||||
    #}
 | 
			
		||||
 | 
			
		||||
    #if ( $trt eq 'URM' ) {
 | 
			
		||||
    #}
 | 
			
		||||
 | 
			
		||||
    if ( $trt eq 'DEL' ) {
 | 
			
		||||
    if ($trt eq 'DEL') {
 | 
			
		||||
 | 
			
		||||
        # controls
 | 
			
		||||
        my $res = '';
 | 
			
		||||
 | 
			
		||||
        #$res = validate_is_hostentry($c, $hostname);
 | 
			
		||||
        #$result .= $res unless $res eq 'OK';
 | 
			
		||||
 | 
			
		||||
        #!#$result .= 'blocked';
 | 
			
		||||
 | 
			
		||||
        if ( !$result ) {
 | 
			
		||||
            my $res = delete_hostentry( $c, $hos_datas{hostname} );
 | 
			
		||||
        if (!$result) {
 | 
			
		||||
            my $res = delete_hostentry($c, $hos_datas{hostname});
 | 
			
		||||
            $result .= $res unless $res eq 'OK';
 | 
			
		||||
        }
 | 
			
		||||
        if ( !$result ) {
 | 
			
		||||
 | 
			
		||||
        if (!$result) {
 | 
			
		||||
            $result = $c->l('hos_REMOVE_SUCCEEDED') . ' ' . $hostname;
 | 
			
		||||
            $trt    = 'SUC';
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    } ## end if ($trt eq 'DEL')
 | 
			
		||||
    $hos_datas{'hostname'} = $hostname;
 | 
			
		||||
    $hos_datas{'trt'}      = $trt;
 | 
			
		||||
    $c->stash(title => $title, notif => $result, hos_datas => \%hos_datas);
 | 
			
		||||
 | 
			
		||||
    $c->stash( title => $title, notif => $result, hos_datas => \%hos_datas );
 | 
			
		||||
 | 
			
		||||
    if ( $hos_datas{trt} ne 'SUC' ) {
 | 
			
		||||
        return $c->render( template => 'hostentries' );
 | 
			
		||||
    if ($hos_datas{trt} ne 'SUC') {
 | 
			
		||||
        return $c->render(template => 'hostentries');
 | 
			
		||||
    }
 | 
			
		||||
    $c->redirect_to('/hostentries');
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
} ## end sub do_update
 | 
			
		||||
 | 
			
		||||
sub create_modify_hostentry {
 | 
			
		||||
 | 
			
		||||
    my ( $c, $trt, %hos_datas ) = @_;
 | 
			
		||||
 | 
			
		||||
    my ($c, $trt, %hos_datas) = @_;
 | 
			
		||||
    my $hostname = $hos_datas{hostname};
 | 
			
		||||
    my $action;
 | 
			
		||||
 | 
			
		||||
    if ( $trt eq 'ADD' or $trt eq 'ALC' or $trt eq 'ARM' ) {
 | 
			
		||||
    if ($trt eq 'ADD' or $trt eq 'ALC' or $trt eq 'ARM') {
 | 
			
		||||
        $action = 'create';
 | 
			
		||||
    }
 | 
			
		||||
    if ( $trt eq 'UPD' or $trt eq 'ULC' or $trt eq 'URM' ) {
 | 
			
		||||
 | 
			
		||||
    if ($trt eq 'UPD' or $trt eq 'ULC' or $trt eq 'URM') {
 | 
			
		||||
        $action = 'modify';
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@@ -353,20 +317,20 @@ sub create_modify_hostentry {
 | 
			
		||||
            ? $c->l('hos_ERROR_CREATING_HOST')
 | 
			
		||||
            : $c->l('hos_ERROR_MODIFYING_HOST')
 | 
			
		||||
        );
 | 
			
		||||
    }
 | 
			
		||||
    } ## end unless ($hostname)
 | 
			
		||||
 | 
			
		||||
    # Untaint and lowercase $hostname
 | 
			
		||||
    $hostname =~ /([\w\.-]+)/;
 | 
			
		||||
    $hostname = lc($1);
 | 
			
		||||
 | 
			
		||||
    my $rec = $hdb->get($hostname);
 | 
			
		||||
    if ( $rec and $action eq 'create' ) {
 | 
			
		||||
 | 
			
		||||
    if ($rec and $action eq 'create') {
 | 
			
		||||
        return $c->l('hos_HOSTNAME_IN_USE_ERROR');
 | 
			
		||||
    }
 | 
			
		||||
    if ( not $rec and $action eq 'modify' ) {
 | 
			
		||||
 | 
			
		||||
    if (not $rec and $action eq 'modify') {
 | 
			
		||||
        return $c->l('hos_NONEXISTENT_HOSTNAME_ERROR');
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    my %props = (
 | 
			
		||||
        type       => 'host',
 | 
			
		||||
        HostType   => $hos_datas{hosttype},
 | 
			
		||||
@@ -376,224 +340,178 @@ sub create_modify_hostentry {
 | 
			
		||||
        Comment    => $hos_datas{comment},
 | 
			
		||||
    );
 | 
			
		||||
 | 
			
		||||
    if ( $action eq 'create' ) {
 | 
			
		||||
        if ( $hdb->new_record( $hostname, \%props ) ) {
 | 
			
		||||
            if (
 | 
			
		||||
                system( "/sbin/e-smith/signal-event", "host-$action",
 | 
			
		||||
                    $hostname ) != 0
 | 
			
		||||
              )
 | 
			
		||||
            {
 | 
			
		||||
    if ($action eq 'create') {
 | 
			
		||||
        if ($hdb->new_record($hostname, \%props)) {
 | 
			
		||||
 | 
			
		||||
            if (system("/sbin/e-smith/signal-event", "host-$action", $hostname) != 0) {
 | 
			
		||||
                return $c->l('hos_ERROR_WHILE_CREATING_HOST');
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
        } ## end if ($hdb->new_record($hostname...))
 | 
			
		||||
    } ## end if ($action eq 'create')
 | 
			
		||||
 | 
			
		||||
    if ( $action eq 'modify' ) {
 | 
			
		||||
        if ( $rec->merge_props(%props) ) {
 | 
			
		||||
            if (
 | 
			
		||||
                system( "/sbin/e-smith/signal-event", "host-$action",
 | 
			
		||||
                    $hostname ) != 0
 | 
			
		||||
              )
 | 
			
		||||
            {
 | 
			
		||||
    if ($action eq 'modify') {
 | 
			
		||||
        if ($rec->merge_props(%props)) {
 | 
			
		||||
 | 
			
		||||
            if (system("/sbin/e-smith/signal-event", "host-$action", $hostname) != 0) {
 | 
			
		||||
                rturn $c->l('hos_ERROR_WHILE_MODIFYING_HOST');
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
        } ## end if ($rec->merge_props(...))
 | 
			
		||||
    } ## end if ($action eq 'modify')
 | 
			
		||||
    return 'OK';
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
} ## end sub create_modify_hostentry
 | 
			
		||||
 | 
			
		||||
sub delete_hostentry {
 | 
			
		||||
 | 
			
		||||
    my ( $c, $hostname ) = @_;
 | 
			
		||||
    my ($c, $hostname) = @_;
 | 
			
		||||
 | 
			
		||||
    # Untaint $hostname before use in system()
 | 
			
		||||
    $hostname =~ /([\w\.-]+)/;
 | 
			
		||||
    $hostname = $1;
 | 
			
		||||
 | 
			
		||||
    return ( $c->l('hos_ERROR_WHILE_REMOVING_HOST') ) unless ($hostname);
 | 
			
		||||
 | 
			
		||||
    return ($c->l('hos_ERROR_WHILE_REMOVING_HOST')) unless ($hostname);
 | 
			
		||||
    my $rec = $hdb->get($hostname);
 | 
			
		||||
    return ( $c->l('hos_NONEXISTENT_HOST_ERROR') ) if ( not $rec );
 | 
			
		||||
    return ($c->l('hos_NONEXISTENT_HOST_ERROR')) if (not $rec);
 | 
			
		||||
 | 
			
		||||
    if ( $rec->delete() ) {
 | 
			
		||||
        if (
 | 
			
		||||
            system( "/sbin/e-smith/signal-event", "host-delete", "$hostname" )
 | 
			
		||||
            == 0 )
 | 
			
		||||
        {
 | 
			
		||||
    if ($rec->delete()) {
 | 
			
		||||
        if (system("/sbin/e-smith/signal-event", "host-delete", "$hostname") == 0) {
 | 
			
		||||
            return 'OK';
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    return ( $c->l('hos_ERROR_WHILE_DELETING_HOST') );
 | 
			
		||||
}
 | 
			
		||||
    } ## end if ($rec->delete())
 | 
			
		||||
    return ($c->l('hos_ERROR_WHILE_DELETING_HOST'));
 | 
			
		||||
} ## end sub delete_hostentry
 | 
			
		||||
 | 
			
		||||
sub domains_list {
 | 
			
		||||
 | 
			
		||||
    my $d = esmith::DomainsDB->open_ro() or die "Couldn't open DomainsDB";
 | 
			
		||||
    my @domains;
 | 
			
		||||
    for ( $d->domains ) {
 | 
			
		||||
        my $ns = $_->prop("Nameservers") || 'localhost';
 | 
			
		||||
        push @domains, $_->key if ( $ns eq 'localhost' );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    for ($d->domains) {
 | 
			
		||||
        my $ns = $_->prop("Nameservers") || 'localhost';
 | 
			
		||||
        push @domains, $_->key if ($ns eq 'localhost');
 | 
			
		||||
    }
 | 
			
		||||
    return \@domains;
 | 
			
		||||
}
 | 
			
		||||
} ## end sub domains_list
 | 
			
		||||
 | 
			
		||||
sub host_data {
 | 
			
		||||
 | 
			
		||||
    my $host_record = shift;
 | 
			
		||||
 | 
			
		||||
    my $ht = $host_record->prop('HostType');
 | 
			
		||||
    my $ip =
 | 
			
		||||
        ( $ht eq 'Self' )   ? $cdb->get_value('LocalIP')
 | 
			
		||||
      : ( $ht eq 'Remote' ) ? $host_record->prop('ExternalIP')
 | 
			
		||||
      :                       $host_record->prop('InternalIP');
 | 
			
		||||
 | 
			
		||||
    my $ht          = $host_record->prop('HostType');
 | 
			
		||||
    my $ip
 | 
			
		||||
        = ($ht eq 'Self') ? $cdb->get_value('LocalIP')
 | 
			
		||||
        : ($ht eq 'Remote') ? $host_record->prop('ExternalIP')
 | 
			
		||||
        :                     $host_record->prop('InternalIP');
 | 
			
		||||
    my %data = (
 | 
			
		||||
        'IP'         => $ip,
 | 
			
		||||
        'HostName'   => $host_record->key(),
 | 
			
		||||
        'HostType'   => $host_record->prop('HostType'),
 | 
			
		||||
        'MACAddress' => ( $host_record->prop('MACAddress') || '' ),
 | 
			
		||||
        'Comment'    => ( $host_record->prop('Comment') || '' ),
 | 
			
		||||
        'static'     => ( $host_record->prop('static') || 'no' )
 | 
			
		||||
        'MACAddress' => ($host_record->prop('MACAddress') || ''),
 | 
			
		||||
        'Comment'    => ($host_record->prop('Comment') || ''),
 | 
			
		||||
        'static'     => ($host_record->prop('static') || 'no')
 | 
			
		||||
    );
 | 
			
		||||
    return \%data
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
    return \%data;
 | 
			
		||||
} ## end sub host_data
 | 
			
		||||
 | 
			
		||||
sub hosttype_list {
 | 
			
		||||
 | 
			
		||||
    my $c = shift;
 | 
			
		||||
 | 
			
		||||
    return [
 | 
			
		||||
        [ $c->l('SELF')   => 'Self' ],
 | 
			
		||||
        [ $c->l('LOCAL')  => 'Local' ],
 | 
			
		||||
        [ $c->l('REMOTE') => 'Remote' ]
 | 
			
		||||
    ];
 | 
			
		||||
    return [ [ $c->l('SELF') => 'Self' ], [ $c->l('LOCAL') => 'Local' ], [ $c->l('REMOTE') => 'Remote' ] ];
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub split_hostname {
 | 
			
		||||
    my $hostname = shift;
 | 
			
		||||
    return ( $hostname =~ /^([^\.]+)\.(.+)$/ );
 | 
			
		||||
    return ($hostname =~ /^([^\.]+)\.(.+)$/);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub mac_address_or_blank {
 | 
			
		||||
    my ( $c, $data ) = @_;
 | 
			
		||||
    my ($c, $data) = @_;
 | 
			
		||||
    return "OK" unless $data;
 | 
			
		||||
    return mac_address( $c, $data );
 | 
			
		||||
}
 | 
			
		||||
    return mac_address($c, $data);
 | 
			
		||||
} ## end sub mac_address_or_blank
 | 
			
		||||
 | 
			
		||||
sub mac_address {
 | 
			
		||||
 | 
			
		||||
    #	from CGI::FormMagick::Validator::Network
 | 
			
		||||
 | 
			
		||||
    my ( $c, $data ) = @_;
 | 
			
		||||
 | 
			
		||||
    my ($c, $data) = @_;
 | 
			
		||||
    $_ = lc $data;    # easier to match on $_
 | 
			
		||||
    if ( not defined $_ ) {
 | 
			
		||||
 | 
			
		||||
    if (not defined $_) {
 | 
			
		||||
        return $c->l('FM_MAC_ADDRESS1');
 | 
			
		||||
    }
 | 
			
		||||
    elsif (/^([0-9a-f][0-9a-f](:[0-9a-f][0-9a-f]){5})$/) {
 | 
			
		||||
    } elsif (/^([0-9a-f][0-9a-f](:[0-9a-f][0-9a-f]){5})$/) {
 | 
			
		||||
        return "OK";
 | 
			
		||||
    }
 | 
			
		||||
    else {
 | 
			
		||||
    } else {
 | 
			
		||||
        return $c->l('FM_MAC_ADDRESS2');
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
} ## end sub mac_address
 | 
			
		||||
 | 
			
		||||
sub ip_number_or_blank {
 | 
			
		||||
 | 
			
		||||
    # XXX - FIXME - we should push this down into CGI::FormMagick
 | 
			
		||||
 | 
			
		||||
    my $c  = shift;
 | 
			
		||||
    my $ip = shift;
 | 
			
		||||
 | 
			
		||||
    if ( !defined($ip) || $ip eq "" ) {
 | 
			
		||||
    if (!defined($ip) || $ip eq "") {
 | 
			
		||||
        return 'OK';
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return ip_number( $c, $ip );
 | 
			
		||||
}
 | 
			
		||||
    return ip_number($c, $ip);
 | 
			
		||||
} ## end sub ip_number_or_blank
 | 
			
		||||
 | 
			
		||||
sub ip_number {
 | 
			
		||||
 | 
			
		||||
    #  from CGI::FormMagick::Validator qw( ip_number );
 | 
			
		||||
 | 
			
		||||
    my ( $c, $data ) = @_;
 | 
			
		||||
 | 
			
		||||
    my ($c, $data) = @_;
 | 
			
		||||
    return undef unless defined $data;
 | 
			
		||||
 | 
			
		||||
    return $c->l('FM_IP_NUMBER1') unless $data =~ /^[\d.]+$/;
 | 
			
		||||
 | 
			
		||||
    my @octets = split /\./, $data;
 | 
			
		||||
    my $dots = ( $data =~ tr/.// );
 | 
			
		||||
 | 
			
		||||
    return $c->l('FM_IP_NUMBER2') unless ( scalar @octets == 4 and $dots == 3 );
 | 
			
		||||
    my $dots = ($data =~ tr/.//);
 | 
			
		||||
    return $c->l('FM_IP_NUMBER2') unless (scalar @octets == 4 and $dots == 3);
 | 
			
		||||
 | 
			
		||||
    foreach my $octet (@octets) {
 | 
			
		||||
        return $c->l( "FM_IP_NUMBER3", $octet ) if $octet > 255;
 | 
			
		||||
        return $c->l("FM_IP_NUMBER3", $octet) if $octet > 255;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return 'OK';
 | 
			
		||||
}
 | 
			
		||||
} ## end sub ip_number
 | 
			
		||||
 | 
			
		||||
sub not_in_dhcp_range {
 | 
			
		||||
 | 
			
		||||
    my $c       = shift;
 | 
			
		||||
    my $address = shift;
 | 
			
		||||
 | 
			
		||||
    my $status = $cdb->get('dhcpd')->prop('status') || "disabled";
 | 
			
		||||
    my $status  = $cdb->get('dhcpd')->prop('status') || "disabled";
 | 
			
		||||
    return 'OK' unless $status eq "enabled";
 | 
			
		||||
 | 
			
		||||
    my $start = $cdb->get('dhcpd')->prop('start');
 | 
			
		||||
    my $end   = $cdb->get('dhcpd')->prop('end');
 | 
			
		||||
 | 
			
		||||
    return ( esmith::util::IPquadToAddr($start) <=
 | 
			
		||||
             esmith::util::IPquadToAddr($address)
 | 
			
		||||
          && esmith::util::IPquadToAddr($address) <=
 | 
			
		||||
          esmith::util::IPquadToAddr($end) )
 | 
			
		||||
      ? $c->l('hos_ADDR_IN_DHCP_RANGE')
 | 
			
		||||
      : 'OK';
 | 
			
		||||
}
 | 
			
		||||
    return (   esmith::util::IPquadToAddr($start) <= esmith::util::IPquadToAddr($address)
 | 
			
		||||
            && esmith::util::IPquadToAddr($address) <= esmith::util::IPquadToAddr($end))
 | 
			
		||||
        ? $c->l('hos_ADDR_IN_DHCP_RANGE')
 | 
			
		||||
        : 'OK';
 | 
			
		||||
} ## end sub not_in_dhcp_range
 | 
			
		||||
 | 
			
		||||
sub not_taken {
 | 
			
		||||
 | 
			
		||||
    my $c       = shift;
 | 
			
		||||
    my $localip = shift;
 | 
			
		||||
 | 
			
		||||
    my $server_localip = $cdb->get_value('LocalIP')    || '';
 | 
			
		||||
    my $server_gateway = $cdb->get_value('GatewayIP')  || '';
 | 
			
		||||
    my $c              = shift;
 | 
			
		||||
    my $localip        = shift;
 | 
			
		||||
    my $server_localip = $cdb->get_value('LocalIP') || '';
 | 
			
		||||
    my $server_gateway = $cdb->get_value('GatewayIP') || '';
 | 
			
		||||
    my $server_extip   = $cdb->get_value('ExternalIP') || '';
 | 
			
		||||
 | 
			
		||||
    #$c->debug_msg("\$localip is $localip");
 | 
			
		||||
    #$c->debug_msg("\$server_localip is $server_localip");
 | 
			
		||||
    #$c->debug_msg("\$server_gateway is $server_gateway");
 | 
			
		||||
    #$c->debug_msg("\$server_extip is $server_extip");
 | 
			
		||||
 | 
			
		||||
    if ( $localip eq $server_localip ) {
 | 
			
		||||
    if ($localip eq $server_localip) {
 | 
			
		||||
        return $c->l('hos_ERR_IP_IS_LOCAL_OR_GATEWAY');
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if ( $localip eq $server_gateway ) {
 | 
			
		||||
    if ($localip eq $server_gateway) {
 | 
			
		||||
        return $c->l('hos_ERR_IP_IS_LOCAL_OR_GATEWAY');
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if (   ( $cdb->get_value('SystemMode') ne 'serveronly' )
 | 
			
		||||
        && ( $server_extip eq $localip ) )
 | 
			
		||||
    if (   ($cdb->get_value('SystemMode') ne 'serveronly')
 | 
			
		||||
        && ($server_extip eq $localip))
 | 
			
		||||
    {
 | 
			
		||||
        return $c->l('hos_ERR_IP_IS_LOCAL_OR_GATEWAY');
 | 
			
		||||
    }
 | 
			
		||||
    } ## end if (($cdb->get_value('SystemMode'...)))
 | 
			
		||||
 | 
			
		||||
    if ( $localip eq '127.0.0.1' ) {
 | 
			
		||||
    if ($localip eq '127.0.0.1') {
 | 
			
		||||
        return $c->l('hos_ERR_IP_IS_LOCAL_OR_GATEWAY');
 | 
			
		||||
    }
 | 
			
		||||
    else {
 | 
			
		||||
    } else {
 | 
			
		||||
        return 'OK';
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
} ## end sub not_taken
 | 
			
		||||
 | 
			
		||||
sub must_be_local {
 | 
			
		||||
 | 
			
		||||
    my $c       = shift;
 | 
			
		||||
    my $localip = shift;
 | 
			
		||||
 | 
			
		||||
@@ -603,13 +521,13 @@ sub must_be_local {
 | 
			
		||||
 | 
			
		||||
    foreach my $spec (@local_list) {
 | 
			
		||||
        next if $spec eq '127.0.0.1';
 | 
			
		||||
        if ( eval { Net::IPv4Addr::ipv4_in_network( $spec, $localip ) } ) {
 | 
			
		||||
 | 
			
		||||
        if (eval { Net::IPv4Addr::ipv4_in_network($spec, $localip) }) {
 | 
			
		||||
            return 'OK';
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    } ## end foreach my $spec (@local_list)
 | 
			
		||||
 | 
			
		||||
    # Not OK. The IP is not on any of our local networks.
 | 
			
		||||
    return $c->l('hos_ERR_IP_NOT_LOCAL');
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
} ## end sub must_be_local
 | 
			
		||||
1;
 | 
			
		||||
 
 | 
			
		||||
@@ -2,291 +2,263 @@ package SrvMngr::Controller::Ibays;
 | 
			
		||||
 | 
			
		||||
#----------------------------------------------------------------------
 | 
			
		||||
# heading     : Network
 | 
			
		||||
# description : Shared areas (was ibays)
 | 
			
		||||
# description : Ibays
 | 
			
		||||
# navigation  : 6000 100
 | 
			
		||||
# 
 | 
			
		||||
#
 | 
			
		||||
#
 | 
			
		||||
# routes : end
 | 
			
		||||
#----------------------------------------------------------------------
 | 
			
		||||
use strict;
 | 
			
		||||
use warnings;
 | 
			
		||||
use Mojo::Base 'Mojolicious::Controller';
 | 
			
		||||
 | 
			
		||||
use Locale::gettext;
 | 
			
		||||
use SrvMngr::I18N;
 | 
			
		||||
use SrvMngr qw( theme_list init_session is_normal_password );
 | 
			
		||||
 | 
			
		||||
use SrvMngr qw( theme_list init_session validate_password );
 | 
			
		||||
use esmith::AccountsDB;
 | 
			
		||||
use esmith::ConfigDB;
 | 
			
		||||
use esmith::DomainsDB;
 | 
			
		||||
 | 
			
		||||
#use esmith::FormMagick::Panel::ibays;
 | 
			
		||||
 | 
			
		||||
our $adb = esmith::AccountsDB->open || die "Couldn't open accounts db";
 | 
			
		||||
our $cdb = esmith::ConfigDB->open() || die "Couldn't open config db";
 | 
			
		||||
#our $adb = esmith::AccountsDB->open || die "Couldn't open accounts db";
 | 
			
		||||
#our $cdb = esmith::ConfigDB->open() || die "Couldn't open config db";
 | 
			
		||||
my ($adb,$cdb);
 | 
			
		||||
 | 
			
		||||
sub main {
 | 
			
		||||
 | 
			
		||||
    my $c = shift;
 | 
			
		||||
    $c->app->log->info($c->log_req);
 | 
			
		||||
 | 
			
		||||
    my %iba_datas = ();
 | 
			
		||||
    my $title = $c->l('iba_FORM_TITLE');
 | 
			
		||||
 | 
			
		||||
    $iba_datas{'trt'} = 'LIST';
 | 
			
		||||
 | 
			
		||||
    my $title     = $c->l('iba_FORM_TITLE');
 | 
			
		||||
    $adb = esmith::AccountsDB->open || die "Couldn't open accounts db";
 | 
			
		||||
	$cdb = esmith::ConfigDB->open() || die "Couldn't open config db";
 | 
			
		||||
	$iba_datas{'trt'} = 'LIST';
 | 
			
		||||
    my @ibays;
 | 
			
		||||
    if ($adb)
 | 
			
		||||
    {
 | 
			
		||||
 | 
			
		||||
    if ($adb) {
 | 
			
		||||
        @ibays = $adb->ibays();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    $c->stash( title => $title, iba_datas => \%iba_datas, ibays => \@ibays );
 | 
			
		||||
    $c->stash(title => $title, iba_datas => \%iba_datas, ibays => \@ibays);
 | 
			
		||||
    $c->render(template => 'ibays');
 | 
			
		||||
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
} ## end sub main
 | 
			
		||||
 | 
			
		||||
sub do_display {
 | 
			
		||||
 | 
			
		||||
    my $c = shift;
 | 
			
		||||
 | 
			
		||||
    my $rt = $c->current_route;
 | 
			
		||||
    my $trt = ($c->param('trt') || 'LIST');
 | 
			
		||||
    my $c    = shift;
 | 
			
		||||
    my $rt   = $c->current_route;
 | 
			
		||||
    my $trt  = ($c->param('trt') || 'LIST');
 | 
			
		||||
    my $ibay = $c->param('ibay') || '';
 | 
			
		||||
    $adb = esmith::AccountsDB->open || die "Couldn't open accounts db";
 | 
			
		||||
	$cdb = esmith::ConfigDB->open() || die "Couldn't open config db";
 | 
			
		||||
 | 
			
		||||
    #$trt = 'DEL' if ( $ibay );
 | 
			
		||||
    #$trt = 'ADD' if ( $rt eq 'ibayadd' );
 | 
			
		||||
 | 
			
		||||
    my %iba_datas = ();
 | 
			
		||||
    my $title = $c->l('iba_FORM_TITLE');
 | 
			
		||||
    my $modul = '';
 | 
			
		||||
 | 
			
		||||
    my $title     = $c->l('iba_FORM_TITLE');
 | 
			
		||||
    my $modul     = '';
 | 
			
		||||
    $iba_datas{'trt'} = $trt;
 | 
			
		||||
 | 
			
		||||
        if ( $trt eq 'ADD' ) {
 | 
			
		||||
    if ($trt eq 'ADD') {
 | 
			
		||||
        $iba_datas{ibay}         = '';
 | 
			
		||||
        $iba_datas{description}  = '';
 | 
			
		||||
        $iba_datas{group}        = '';
 | 
			
		||||
        $iba_datas{userAccess}   = '';
 | 
			
		||||
        $iba_datas{publicAccess} = '';
 | 
			
		||||
        $iba_datas{CgiBin}       = '';
 | 
			
		||||
        $iba_datas{SSL}          = '';
 | 
			
		||||
    } ## end if ($trt eq 'ADD')
 | 
			
		||||
 | 
			
		||||
    	    $iba_datas{ibay} = '';
 | 
			
		||||
    	    $iba_datas{description} = '';
 | 
			
		||||
    	    $iba_datas{group} = '';
 | 
			
		||||
    	    $iba_datas{userAccess} = '';
 | 
			
		||||
    	    $iba_datas{publicAccess} = '';
 | 
			
		||||
    	    $iba_datas{CgiBin} = '';
 | 
			
		||||
    	    $iba_datas{SSL} = '';
 | 
			
		||||
    if ($trt eq 'UPD') {
 | 
			
		||||
        my $rec = $adb->get($ibay);
 | 
			
		||||
 | 
			
		||||
        if ($rec and $rec->prop('type') eq 'ibay') {
 | 
			
		||||
            $iba_datas{ibay}         = $ibay;
 | 
			
		||||
            $iba_datas{description}  = $rec->prop('Name') || '';
 | 
			
		||||
            $iba_datas{group}        = $rec->prop('Group') || '';
 | 
			
		||||
            $iba_datas{userAccess}   = $rec->prop('UserAccess') || '';
 | 
			
		||||
            $iba_datas{publicAccess} = $rec->prop('PublicAccess') || '';
 | 
			
		||||
            $iba_datas{CgiBin}       = $rec->prop('CgiBin') || 'disabled';
 | 
			
		||||
            $iba_datas{SSL}          = $rec->prop('SSL') || 'disabled';
 | 
			
		||||
        } ## end if ($rec and $rec->prop...)
 | 
			
		||||
    } ## end if ($trt eq 'UPD')
 | 
			
		||||
 | 
			
		||||
    if ($trt eq 'DEL') {
 | 
			
		||||
        my $rec = $adb->get($ibay);
 | 
			
		||||
 | 
			
		||||
        if ($rec and $rec->prop('type') eq 'ibay') {
 | 
			
		||||
            $iba_datas{ibay} = $ibay;
 | 
			
		||||
            $iba_datas{description} = $rec->prop('Name') || '';
 | 
			
		||||
            $modul .= print_vhost_message($c, $ibay);
 | 
			
		||||
        } ## end if ($rec and $rec->prop...)
 | 
			
		||||
    } ## end if ($trt eq 'DEL')
 | 
			
		||||
 | 
			
		||||
    if ($trt eq 'PWD') {
 | 
			
		||||
        my $rec = $adb->get($ibay);
 | 
			
		||||
 | 
			
		||||
        if ($rec and $rec->prop('type') eq 'ibay') {
 | 
			
		||||
            $iba_datas{ibay} = $ibay;
 | 
			
		||||
            $iba_datas{description} = $rec->prop('Name') || '';
 | 
			
		||||
        }
 | 
			
		||||
    } ## end if ($trt eq 'PWD')
 | 
			
		||||
 | 
			
		||||
        if ( $trt eq 'UPD' ) {
 | 
			
		||||
    if ($trt eq 'LIST') {
 | 
			
		||||
        my @ibays;
 | 
			
		||||
        $adb = esmith::AccountsDB->open || die "Couldn't open accounts db";
 | 
			
		||||
 | 
			
		||||
			my $rec = $adb->get($ibay);
 | 
			
		||||
			if ($rec and $rec->prop('type') eq 'ibay') {
 | 
			
		||||
				$iba_datas{ibay} = $ibay;
 | 
			
		||||
				$iba_datas{description} = $rec->prop('Name') || '';
 | 
			
		||||
				$iba_datas{group} = $rec->prop('Group') || '';
 | 
			
		||||
				$iba_datas{userAccess} = $rec->prop('UserAccess') || '';
 | 
			
		||||
				$iba_datas{publicAccess} = $rec->prop('PublicAccess') || '';
 | 
			
		||||
				$iba_datas{CgiBin} = $rec->prop('CgiBin') || 'disabled';
 | 
			
		||||
				$iba_datas{SSL} = $rec->prop('SSL') || 'disabled';
 | 
			
		||||
			}
 | 
			
		||||
        if ($adb) {
 | 
			
		||||
            @ibays = $adb->ibays();
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        if ( $trt eq 'DEL' ) {
 | 
			
		||||
 | 
			
		||||
			my $rec = $adb->get($ibay);
 | 
			
		||||
			if ($rec and $rec->prop('type') eq 'ibay') {
 | 
			
		||||
				$iba_datas{ibay} = $ibay;
 | 
			
		||||
				$iba_datas{description} = $rec->prop('Name') || '';
 | 
			
		||||
			$modul .= print_vhost_message( $c, $ibay );
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        if ( $trt eq 'PWD' ) {
 | 
			
		||||
 | 
			
		||||
			my $rec = $adb->get($ibay);
 | 
			
		||||
			if ($rec and $rec->prop('type') eq 'ibay') {
 | 
			
		||||
				$iba_datas{ibay} = $ibay;
 | 
			
		||||
				$iba_datas{description} = $rec->prop('Name') || '';
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        if ( $trt eq 'LIST' ) {
 | 
			
		||||
	    my @ibays;
 | 
			
		||||
	    $adb = esmith::AccountsDB->open || die "Couldn't open accounts db";
 | 
			
		||||
	    if ($adb)
 | 
			
		||||
	    {
 | 
			
		||||
    		@ibays = $adb->ibays();
 | 
			
		||||
	    }
 | 
			
		||||
            $c->stash( ibays => \@ibays );
 | 
			
		||||
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
    $c->stash( title => $title, modul => $modul, iba_datas => \%iba_datas );
 | 
			
		||||
    $c->render( template => 'ibays' );
 | 
			
		||||
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
        $c->stash(ibays => \@ibays);
 | 
			
		||||
    } ## end if ($trt eq 'LIST')
 | 
			
		||||
    $c->stash(title => $title, modul => $modul, iba_datas => \%iba_datas);
 | 
			
		||||
    $c->render(template => 'ibays');
 | 
			
		||||
} ## end sub do_display
 | 
			
		||||
 | 
			
		||||
sub do_update {
 | 
			
		||||
 | 
			
		||||
    my $c = shift;
 | 
			
		||||
    $c->app->log->info($c->log_req);
 | 
			
		||||
 | 
			
		||||
    my $rt = $c->current_route;
 | 
			
		||||
    my $trt = ($c->param('trt') || 'LIST');
 | 
			
		||||
 | 
			
		||||
    my $rt        = $c->current_route;
 | 
			
		||||
    my $trt       = ($c->param('trt') || 'LIST');
 | 
			
		||||
    my %iba_datas = ();
 | 
			
		||||
    my $title = $c->l('iba_FORM_TITLE');
 | 
			
		||||
 | 
			
		||||
    my $title     = $c->l('iba_FORM_TITLE');
 | 
			
		||||
    $iba_datas{'trt'} = $trt;
 | 
			
		||||
 | 
			
		||||
    my $result = '';
 | 
			
		||||
    my $res;
 | 
			
		||||
    $adb = esmith::AccountsDB->open || die "Couldn't open accounts db";
 | 
			
		||||
	$cdb = esmith::ConfigDB->open() || die "Couldn't open config db";
 | 
			
		||||
 | 
			
		||||
    if ( $trt eq 'ADD' ) {
 | 
			
		||||
    if ($trt eq 'ADD') {
 | 
			
		||||
        my $name = ($c->param('ibay') || '');
 | 
			
		||||
 | 
			
		||||
	my $name = ($c->param('ibay') || '');
 | 
			
		||||
        # controls
 | 
			
		||||
        $res = validate_ibay($c, $name);
 | 
			
		||||
        $result .= $res unless $res eq 'OK';
 | 
			
		||||
 | 
			
		||||
	# controls
 | 
			
		||||
	$res = validate_ibay( $c, $name );
 | 
			
		||||
	$result .= $res unless $res eq 'OK';
 | 
			
		||||
        if (!$result) {
 | 
			
		||||
            $res = create_ibay($c, $name);
 | 
			
		||||
            $result .= $res unless $res eq 'OK';
 | 
			
		||||
 | 
			
		||||
	if ( ! $result ) {
 | 
			
		||||
	    $res = create_ibay( $c, $name ); 
 | 
			
		||||
	    $result .= $res unless $res eq 'OK';
 | 
			
		||||
	    if ( ! $result ) { 
 | 
			
		||||
		$result = $c->l('iba_SUCCESSFULLY_CREATED_IBAY') . ' ' . $name; 
 | 
			
		||||
		$iba_datas{trt} = 'LST';
 | 
			
		||||
	    }
 | 
			
		||||
	}
 | 
			
		||||
    }
 | 
			
		||||
            if (!$result) {
 | 
			
		||||
                $result = $c->l('iba_SUCCESSFULLY_CREATED_IBAY') . ' ' . $name;
 | 
			
		||||
                $iba_datas{trt} = 'LST';
 | 
			
		||||
            }
 | 
			
		||||
        } ## end if (!$result)
 | 
			
		||||
    } ## end if ($trt eq 'ADD')
 | 
			
		||||
 | 
			
		||||
    if ( $trt eq 'UPD' ) {
 | 
			
		||||
    if ($trt eq 'UPD') {
 | 
			
		||||
        my $name = ($c->param('ibay') || '');
 | 
			
		||||
 | 
			
		||||
	my $name = ($c->param('ibay') || '');
 | 
			
		||||
        # controls
 | 
			
		||||
        $res = '';
 | 
			
		||||
 | 
			
		||||
	# controls
 | 
			
		||||
	$res = '';
 | 
			
		||||
        if (!$result) {
 | 
			
		||||
            $res = modify_ibay($c, $name);
 | 
			
		||||
            $result .= $res unless $res eq 'OK';
 | 
			
		||||
 | 
			
		||||
	if ( ! $result ) {
 | 
			
		||||
	    $res = modify_ibay( $c, $name ); 
 | 
			
		||||
	    $result .= $res unless $res eq 'OK';
 | 
			
		||||
	    if ( ! $result ) { 
 | 
			
		||||
		$result = $c->l('iba_SUCCESSFULLY_MODIFIED_IBAY') . ' ' . $name; 
 | 
			
		||||
		$iba_datas{trt} = 'LST';
 | 
			
		||||
	    }
 | 
			
		||||
	}
 | 
			
		||||
    }
 | 
			
		||||
            if (!$result) {
 | 
			
		||||
                $result = $c->l('iba_SUCCESSFULLY_MODIFIED_IBAY') . ' ' . $name;
 | 
			
		||||
                $iba_datas{trt} = 'LST';
 | 
			
		||||
            }
 | 
			
		||||
        } ## end if (!$result)
 | 
			
		||||
    } ## end if ($trt eq 'UPD')
 | 
			
		||||
 | 
			
		||||
    if ( $trt eq 'PWD' ) {
 | 
			
		||||
 | 
			
		||||
	my $ibay = ($c->param('ibay') || '');
 | 
			
		||||
        my $pass1 = ($c->param('newPass') || '');
 | 
			
		||||
    if ($trt eq 'PWD') {
 | 
			
		||||
        my $ibay  = ($c->param('ibay')          || '');
 | 
			
		||||
        my $pass1 = ($c->param('newPass')       || '');
 | 
			
		||||
        my $pass2 = ($c->param('newPassVerify') || '');
 | 
			
		||||
 | 
			
		||||
	# controls
 | 
			
		||||
        # controls
 | 
			
		||||
        unless ($pass1 eq $pass2) {
 | 
			
		||||
            $result .= $c->l('iba_IBAY_PASSWD_VERIFY_ERROR') . ' - ';
 | 
			
		||||
	}
 | 
			
		||||
        }
 | 
			
		||||
        $res = check_password($c, $pass1);
 | 
			
		||||
        $result .= $res unless $res eq 'OK';
 | 
			
		||||
 | 
			
		||||
	$res = check_password( $c, $pass1 );
 | 
			
		||||
	$result .= $res unless $res eq 'OK';
 | 
			
		||||
	
 | 
			
		||||
	if ( ! $result ) {
 | 
			
		||||
	    $res = reset_password( $c, $ibay, $pass1 );
 | 
			
		||||
	    $result .= $res unless $res eq 'OK';
 | 
			
		||||
	    if ( ! $result ) { 
 | 
			
		||||
		$result = $c->l('iba_SUCCESSFULLY_RESET_PASSWORD') . ' ' . $ibay; 
 | 
			
		||||
		$iba_datas{trt} = 'LST';
 | 
			
		||||
	    }
 | 
			
		||||
	}
 | 
			
		||||
    }
 | 
			
		||||
        if (!$result) {
 | 
			
		||||
            $res = reset_password($c, $ibay, $pass1);
 | 
			
		||||
            $result .= $res unless $res eq 'OK';
 | 
			
		||||
 | 
			
		||||
    if ( $trt eq 'DEL' ) {
 | 
			
		||||
    
 | 
			
		||||
	my $ibay = $c->param ('ibay');
 | 
			
		||||
            if (!$result) {
 | 
			
		||||
                $result = $c->l('iba_SUCCESSFULLY_RESET_PASSWORD') . ' ' . $ibay;
 | 
			
		||||
                $iba_datas{trt} = 'LST';
 | 
			
		||||
            }
 | 
			
		||||
        } ## end if (!$result)
 | 
			
		||||
    } ## end if ($trt eq 'PWD')
 | 
			
		||||
 | 
			
		||||
	if ($ibay =~ /^([a-z][a-z0-9]*)$/) {
 | 
			
		||||
    	    $ibay = $1;
 | 
			
		||||
	} else {
 | 
			
		||||
    	    $result .= $c->l('iba_ERR_INTERNAL_FAILURE') . ':' . $ibay;
 | 
			
		||||
	}
 | 
			
		||||
    if ($trt eq 'DEL') {
 | 
			
		||||
        my $ibay = $c->param('ibay');
 | 
			
		||||
 | 
			
		||||
	if ( ! $result ) {
 | 
			
		||||
	    $res = remove_ibay( $c, $ibay );
 | 
			
		||||
	    $result .= $res unless $res eq 'OK';
 | 
			
		||||
	    if ( ! $result ) { 
 | 
			
		||||
		$result = $c->l('iba_SUCCESSFULLY_DELETED_IBAY') . ' ' . $ibay; 
 | 
			
		||||
		$iba_datas{trt} = 'LST';
 | 
			
		||||
	    }
 | 
			
		||||
	}
 | 
			
		||||
    }
 | 
			
		||||
        if ($ibay =~ /^([a-z][a-z0-9]*)$/) {
 | 
			
		||||
            $ibay = $1;
 | 
			
		||||
        } else {
 | 
			
		||||
            $result .= $c->l('iba_ERR_INTERNAL_FAILURE') . ':' . $ibay;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        if (!$result) {
 | 
			
		||||
            $res = remove_ibay($c, $ibay);
 | 
			
		||||
            $result .= $res unless $res eq 'OK';
 | 
			
		||||
 | 
			
		||||
            if (!$result) {
 | 
			
		||||
                $result = $c->l('iba_SUCCESSFULLY_DELETED_IBAY') . ' ' . $ibay;
 | 
			
		||||
                $iba_datas{trt} = 'LST';
 | 
			
		||||
            }
 | 
			
		||||
        } ## end if (!$result)
 | 
			
		||||
    } ## end if ($trt eq 'DEL')
 | 
			
		||||
 | 
			
		||||
    # common parts
 | 
			
		||||
 | 
			
		||||
    if ($res ne 'OK') {
 | 
			
		||||
	$c->stash( error => $result );
 | 
			
		||||
	$c->stash( title => $title, iba_datas => \%iba_datas );
 | 
			
		||||
	return $c->render('ibays');
 | 
			
		||||
        $c->stash(error => $result);
 | 
			
		||||
        $c->stash(title => $title, iba_datas => \%iba_datas);
 | 
			
		||||
        return $c->render('ibays');
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    my $message = "'Ibays' updates ($trt) DONE";
 | 
			
		||||
    $c->app->log->info($message);
 | 
			
		||||
    $c->flash( success => $result );
 | 
			
		||||
 | 
			
		||||
    $c->flash(success => $result);
 | 
			
		||||
    $c->redirect_to('/ibays');
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
} ## end sub do_update
 | 
			
		||||
 | 
			
		||||
sub validate_ibay {
 | 
			
		||||
 | 
			
		||||
    my ($c, $name) = @_;
 | 
			
		||||
 | 
			
		||||
    my $msg = validate_name($c, $name);
 | 
			
		||||
    unless ($msg eq "OK")
 | 
			
		||||
    {
 | 
			
		||||
 | 
			
		||||
    unless ($msg eq "OK") {
 | 
			
		||||
        return ($msg);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    $msg = max_ibay_name_length($c, $name);
 | 
			
		||||
    unless ($msg eq "OK")
 | 
			
		||||
    {
 | 
			
		||||
 | 
			
		||||
    unless ($msg eq "OK") {
 | 
			
		||||
        return ($msg);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    $msg = conflict_check($c, $name);
 | 
			
		||||
    unless ($msg eq "OK")
 | 
			
		||||
    {
 | 
			
		||||
 | 
			
		||||
    unless ($msg eq "OK") {
 | 
			
		||||
        return ($msg);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return ('OK');
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
} ## end sub validate_ibay
 | 
			
		||||
 | 
			
		||||
sub create_ibay {
 | 
			
		||||
 | 
			
		||||
    my ($c, $name) = @_;
 | 
			
		||||
 | 
			
		||||
    my $msg;
 | 
			
		||||
    my $uid  = $adb->get_next_uid();
 | 
			
		||||
    if (my $acct = $adb->new_record($name, {
 | 
			
		||||
            Name         => $c->param('ibayDesc'),
 | 
			
		||||
            CgiBin       => $c->param('CgiBin'),
 | 
			
		||||
            Group        => $c->param('group'),
 | 
			
		||||
            PublicAccess => $c->param('publicAccess'),
 | 
			
		||||
            SSL          => $c->param('SSL'),
 | 
			
		||||
            UserAccess   => $c->param('userAccess'),
 | 
			
		||||
            Uid          => $uid,
 | 
			
		||||
            Gid          => $uid,
 | 
			
		||||
            PasswordSet  => 'no',
 | 
			
		||||
            type         => 'ibay',
 | 
			
		||||
        }) ) 
 | 
			
		||||
    my $uid = $adb->get_next_uid();
 | 
			
		||||
 | 
			
		||||
    if (my $acct = $adb->new_record(
 | 
			
		||||
            $name,
 | 
			
		||||
            {   Name         => $c->param('ibayDesc'),
 | 
			
		||||
                CgiBin       => $c->param('CgiBin'),
 | 
			
		||||
                Group        => $c->param('group'),
 | 
			
		||||
                PublicAccess => $c->param('publicAccess'),
 | 
			
		||||
                SSL          => $c->param('SSL'),
 | 
			
		||||
                UserAccess   => $c->param('userAccess'),
 | 
			
		||||
                Uid          => $uid,
 | 
			
		||||
                Gid          => $uid,
 | 
			
		||||
                PasswordSet  => 'no',
 | 
			
		||||
                type         => 'ibay',
 | 
			
		||||
            }
 | 
			
		||||
        )
 | 
			
		||||
        )
 | 
			
		||||
    {
 | 
			
		||||
        # Untaint $name before use in system()
 | 
			
		||||
        $name =~ /(.+)/; $name = $1;
 | 
			
		||||
        if (system ("/sbin/e-smith/signal-event", "ibay-create", $name) == 0) {
 | 
			
		||||
        $name =~ /(.+)/;
 | 
			
		||||
        $name = $1;
 | 
			
		||||
 | 
			
		||||
        if (system("/sbin/e-smith/signal-event", "ibay-create", $name) == 0) {
 | 
			
		||||
            $msg = 'OK';
 | 
			
		||||
        } else {
 | 
			
		||||
            $msg = $c->l('iba_ERROR_WHILE_CREATING_IBAY');
 | 
			
		||||
@@ -295,14 +267,12 @@ sub create_ibay {
 | 
			
		||||
        $msg = $c->l('iba_CANT_CREATE_IBAY');
 | 
			
		||||
    }
 | 
			
		||||
    return $msg;
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
} ## end sub create_ibay
 | 
			
		||||
 | 
			
		||||
sub modify_ibay {
 | 
			
		||||
    my ($c, $name) = @_;
 | 
			
		||||
 | 
			
		||||
    my $msg;
 | 
			
		||||
 | 
			
		||||
    if (my $acct = $adb->get($name)) {
 | 
			
		||||
        if ($acct->prop('type') eq 'ibay') {
 | 
			
		||||
            $acct->merge_props(
 | 
			
		||||
@@ -315,10 +285,10 @@ sub modify_ibay {
 | 
			
		||||
            );
 | 
			
		||||
 | 
			
		||||
            # Untaint $name before use in system()
 | 
			
		||||
            $name =~ /(.+)/; $name = $1;
 | 
			
		||||
            if (system ("/sbin/e-smith/signal-event", "ibay-modify", 
 | 
			
		||||
                $name) == 0) 
 | 
			
		||||
            {
 | 
			
		||||
            $name =~ /(.+)/;
 | 
			
		||||
            $name = $1;
 | 
			
		||||
 | 
			
		||||
            if (system("/sbin/e-smith/signal-event", "ibay-modify", $name) == 0) {
 | 
			
		||||
                $msg = 'OK';
 | 
			
		||||
            } else {
 | 
			
		||||
                $msg = $c->l('iba_ERROR_WHILE_MODIFYING_IBAY');
 | 
			
		||||
@@ -329,53 +299,47 @@ sub modify_ibay {
 | 
			
		||||
    } else {
 | 
			
		||||
        $msg = $c->l('iba_CANT_FIND_IBAY');
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return $msg;
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
} ## end sub modify_ibay
 | 
			
		||||
 | 
			
		||||
sub print_vhost_message {
 | 
			
		||||
    my $c = shift;
 | 
			
		||||
    my $name = $c->param('ibay');
 | 
			
		||||
    my $c              = shift;
 | 
			
		||||
    my $name           = $c->param('ibay');
 | 
			
		||||
    my $result         = '';
 | 
			
		||||
    my $domaindb       = esmith::DomainsDB->open();
 | 
			
		||||
    my @domains        = $domaindb->get_all_by_prop(Content => $name);
 | 
			
		||||
    my $vhostListItems = join "\n", (map ($_->key . " " . $_->prop('Description'), @domains));
 | 
			
		||||
 | 
			
		||||
    my $result = '';
 | 
			
		||||
 | 
			
		||||
    my $domaindb = esmith::DomainsDB->open();
 | 
			
		||||
    my @domains = $domaindb->get_all_by_prop(Content => $name);
 | 
			
		||||
    my $vhostListItems = join "\n",
 | 
			
		||||
        (map ($_->key." ".$_->prop('Description'), @domains));
 | 
			
		||||
    if ($vhostListItems)
 | 
			
		||||
    {
 | 
			
		||||
    if ($vhostListItems) {
 | 
			
		||||
        $result = $c->l('iba_VHOST_MESSAGE') . "<br><ul>";
 | 
			
		||||
        foreach ( $vhostListItems ) {
 | 
			
		||||
    	    $result .= "<li> $_ </li>";
 | 
			
		||||
    	}
 | 
			
		||||
    	$result .= '</ul>'
 | 
			
		||||
    }
 | 
			
		||||
    return $result;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
        foreach ($vhostListItems) {
 | 
			
		||||
            $result .= "<li> $_ </li>";
 | 
			
		||||
        }
 | 
			
		||||
        $result .= '</ul>';
 | 
			
		||||
    } ## end if ($vhostListItems)
 | 
			
		||||
    return $result;
 | 
			
		||||
} ## end sub print_vhost_message
 | 
			
		||||
 | 
			
		||||
sub remove_ibay {
 | 
			
		||||
    my ($c, $name) = @_;
 | 
			
		||||
 | 
			
		||||
    my $msg = '';
 | 
			
		||||
 | 
			
		||||
    if (my $acct = $adb->get($name)) {
 | 
			
		||||
        if ($acct->prop('type') eq 'ibay') {
 | 
			
		||||
            $acct->set_prop('type', 'ibay-deleted');
 | 
			
		||||
 | 
			
		||||
            my $domains_db = esmith::DomainsDB->open();
 | 
			
		||||
            my @domains = $domains_db->get_all_by_prop(Content=>$name);
 | 
			
		||||
            my @domains = $domains_db->get_all_by_prop(Content => $name);
 | 
			
		||||
 | 
			
		||||
            foreach my $d (@domains) {
 | 
			
		||||
                $d->set_prop(Content => 'Primary');
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            # Untaint $name before use in system()
 | 
			
		||||
            $name =~ /(.+)/; $name = $1;
 | 
			
		||||
            if (system ("/sbin/e-smith/signal-event", "ibay-delete", 
 | 
			
		||||
                $name) == 0) 
 | 
			
		||||
            {
 | 
			
		||||
            $name =~ /(.+)/;
 | 
			
		||||
            $name = $1;
 | 
			
		||||
 | 
			
		||||
            if (system("/sbin/e-smith/signal-event", "ibay-delete", $name) == 0) {
 | 
			
		||||
                $msg = 'OK';
 | 
			
		||||
                $acct->delete();
 | 
			
		||||
            } else {
 | 
			
		||||
@@ -384,27 +348,25 @@ sub remove_ibay {
 | 
			
		||||
        } else {
 | 
			
		||||
            $msg = $c->l('iba_CANT_FIND_IBAY');
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
    } else {
 | 
			
		||||
        $msg = $c->l('iba_CANT_FIND_IBAY');
 | 
			
		||||
    }
 | 
			
		||||
    return $msg;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
} ## end sub remove_ibay
 | 
			
		||||
 | 
			
		||||
sub reset_password {
 | 
			
		||||
    my ($c, $name, $newPass) = @_;
 | 
			
		||||
 | 
			
		||||
    my ($msg, $acct);
 | 
			
		||||
    
 | 
			
		||||
 | 
			
		||||
    if (($acct = $adb->get($name)) && ($acct->prop('type') eq 'ibay')) {
 | 
			
		||||
        esmith::util::setIbayPassword ($acct->key, $newPass);
 | 
			
		||||
        esmith::util::setIbayPassword($acct->key, $newPass);
 | 
			
		||||
        $acct->set_prop('PasswordSet', 'yes');
 | 
			
		||||
 | 
			
		||||
        # Untaint $name before use in system()
 | 
			
		||||
        $name =~ /(.+)/; $name = $1;
 | 
			
		||||
        if (system ("/sbin/e-smith/signal-event", "password-modify", 
 | 
			
		||||
            $name) == 0) 
 | 
			
		||||
        {
 | 
			
		||||
        $name =~ /(.+)/;
 | 
			
		||||
        $name = $1;
 | 
			
		||||
 | 
			
		||||
        if (system("/sbin/e-smith/signal-event", "password-modify", $name) == 0) {
 | 
			
		||||
            $msg = 'OK';
 | 
			
		||||
        } else {
 | 
			
		||||
            $msg = $c->l('iba_ERROR_WHILE_RESETTING_PASSWORD');
 | 
			
		||||
@@ -413,51 +375,15 @@ sub reset_password {
 | 
			
		||||
        $msg = $c->l('iba_CANT_FIND_IBAY');
 | 
			
		||||
    }
 | 
			
		||||
    return $msg;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
} ## end sub reset_password
 | 
			
		||||
 | 
			
		||||
sub check_password {
 | 
			
		||||
    my ($c, $password) = @_;
 | 
			
		||||
 | 
			
		||||
    my $strength;
 | 
			
		||||
    
 | 
			
		||||
    my $rec = $cdb->get('passwordstrength');
 | 
			
		||||
    $strength = ($rec ? ($rec->prop('Ibays') || 'none') : 'none');
 | 
			
		||||
 | 
			
		||||
    return validate_password( $c, $strength, $password );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
sub validate_password {
 | 
			
		||||
 | 
			
		||||
    my ($c, $strength, $pass) = @_;
 | 
			
		||||
 | 
			
		||||
    use Crypt::Cracklib;
 | 
			
		||||
 | 
			
		||||
    my $reason;
 | 
			
		||||
 | 
			
		||||
    if ($strength eq "none") {
 | 
			
		||||
        return $c->l("Passwords must be at least 7 characters long") unless (length($pass) > 6);
 | 
			
		||||
        return "OK";
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    $reason = is_normal_password($c, $pass, undef);
 | 
			
		||||
    return $reason unless ($reason eq "OK");
 | 
			
		||||
    return "OK" unless ($strength eq "strong");
 | 
			
		||||
 | 
			
		||||
    if ( -f '/usr/lib64/cracklib_dict.pwd' ) {
 | 
			
		||||
        $reason = fascist_check($pass, '/usr/lib64/cracklib_dict');
 | 
			
		||||
    } else {
 | 
			
		||||
        $reason = fascist_check($pass, '/usr/lib/cracklib_dict');
 | 
			
		||||
    }
 | 
			
		||||
    $reason ||= "Software error: password check failed";
 | 
			
		||||
 | 
			
		||||
    return "OK" if ($reason eq "ok");
 | 
			
		||||
 | 
			
		||||
    return $c->l("Bad Password Choice") . ": "
 | 
			
		||||
	. $c->l("The password you have chosen is not a good choice, because")
 | 
			
		||||
	. " " . $c->($reason) . ".";
 | 
			
		||||
}
 | 
			
		||||
    return validate_password($c, $strength, $password);
 | 
			
		||||
} ## end sub check_password
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
=head2 group_list()
 | 
			
		||||
@@ -468,18 +394,14 @@ drop down list.
 | 
			
		||||
=cut
 | 
			
		||||
 | 
			
		||||
sub group_list_m {
 | 
			
		||||
 | 
			
		||||
    my @groups = $adb->groups();
 | 
			
		||||
 | 
			
		||||
    my @grps = ( ['Admin' => 'admin'], ['Everyone' => 'shared']);
 | 
			
		||||
    my @grps = ([ 'Admin' => 'admin' ], [ 'Everyone' => 'shared' ]);
 | 
			
		||||
 | 
			
		||||
    foreach my $g (@groups) {
 | 
			
		||||
	push @grps, [ $g->prop('Description')." (". $g->key.")", $g->key() ];
 | 
			
		||||
        push @grps, [ $g->prop('Description') . " (" . $g->key . ")", $g->key() ];
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return \@grps;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
} ## end sub group_list_m
 | 
			
		||||
 | 
			
		||||
=head2 userAccess_list
 | 
			
		||||
 | 
			
		||||
@@ -489,13 +411,13 @@ drop down list.
 | 
			
		||||
=cut
 | 
			
		||||
 | 
			
		||||
sub userAccess_list_m {
 | 
			
		||||
 | 
			
		||||
    my $c = shift;
 | 
			
		||||
    return [[ $c->l('WARG') => 'wr-admin-rd-group'],
 | 
			
		||||
	    [ $c->l('WGRE') => 'wr-group-rd-everyone'],
 | 
			
		||||
	    [ $c->l('WGRG') => 'wr-group-rd-group']];
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
    return [
 | 
			
		||||
        [ $c->l('WARG') => 'wr-admin-rd-group' ],
 | 
			
		||||
        [ $c->l('WGRE') => 'wr-group-rd-everyone' ],
 | 
			
		||||
        [ $c->l('WGRG') => 'wr-group-rd-group' ]
 | 
			
		||||
    ];
 | 
			
		||||
} ## end sub userAccess_list_m
 | 
			
		||||
 | 
			
		||||
=head2 publicAccess_list
 | 
			
		||||
 | 
			
		||||
@@ -505,19 +427,18 @@ access drop down list.
 | 
			
		||||
=cut
 | 
			
		||||
 | 
			
		||||
sub publicAccess_list_m {
 | 
			
		||||
 | 
			
		||||
    my $c = shift;
 | 
			
		||||
    return [[ $c->l('NONE') => 'none'],
 | 
			
		||||
            [ $c->l('LOCAL_NETWORK_NO_PASSWORD') => 'local'],
 | 
			
		||||
            [ $c->l('LOCAL_NETWORK_PASSWORD') => 'local-pw'],
 | 
			
		||||
            [ $c->l('ENTIRE_INTERNET_NO_PASSWORD') => 'global'],
 | 
			
		||||
            [ $c->l('ENTIRE_INTERNET_PASSWORD') => 'global-pw'],
 | 
			
		||||
            [ $c->l('ENTIRE_INTERNET_PASSWORD_REMOTE') => 'global-pw-remote']];
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
    return [
 | 
			
		||||
        [ $c->l('NONE')                            => 'none' ],
 | 
			
		||||
        [ $c->l('LOCAL_NETWORK_NO_PASSWORD')       => 'local' ],
 | 
			
		||||
        [ $c->l('LOCAL_NETWORK_PASSWORD')          => 'local-pw' ],
 | 
			
		||||
        [ $c->l('ENTIRE_INTERNET_NO_PASSWORD')     => 'global' ],
 | 
			
		||||
        [ $c->l('ENTIRE_INTERNET_PASSWORD')        => 'global-pw' ],
 | 
			
		||||
        [ $c->l('ENTIRE_INTERNET_PASSWORD_REMOTE') => 'global-pw-remote' ]
 | 
			
		||||
    ];
 | 
			
		||||
} ## end sub publicAccess_list_m
 | 
			
		||||
 | 
			
		||||
sub max_ibay_name_length {
 | 
			
		||||
 | 
			
		||||
    my ($c, $data) = @_;
 | 
			
		||||
    $cdb->reload();
 | 
			
		||||
    my $max = $cdb->get('maxIbayNameLength')->value;
 | 
			
		||||
@@ -526,52 +447,42 @@ sub max_ibay_name_length {
 | 
			
		||||
        return "OK";
 | 
			
		||||
    } else {
 | 
			
		||||
        return $c->l('iba_MAX_IBAY_NAME_LENGTH_ERROR', $data, $max, $max);
 | 
			
		||||
    #        {acctName => $data, 
 | 
			
		||||
    #         maxIbayNameLength => $max, 
 | 
			
		||||
    #         maxLength => $max});
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
        #        {acctName => $data,
 | 
			
		||||
        #         maxIbayNameLength => $max,
 | 
			
		||||
        #         maxLength => $max});
 | 
			
		||||
    } ## end else [ if (length($data) <= $max)]
 | 
			
		||||
} ## end sub max_ibay_name_length
 | 
			
		||||
 | 
			
		||||
sub conflict_check {
 | 
			
		||||
 | 
			
		||||
    my ($c, $name) = @_;
 | 
			
		||||
    my $rec = $adb->get($name);
 | 
			
		||||
 | 
			
		||||
    my $type;
 | 
			
		||||
    if (defined $rec)
 | 
			
		||||
    {
 | 
			
		||||
		my $type = $rec->prop('type');
 | 
			
		||||
		if ($type eq "pseudonym")
 | 
			
		||||
		{
 | 
			
		||||
			my $acct = $rec->prop("Account");
 | 
			
		||||
			my $acct_type = $adb->get($acct)->prop('type');
 | 
			
		||||
 | 
			
		||||
			return $c->l('iba_ACCT_CLASHES_WITH_PSEUDONYM', $name, $acct_type, $acct);
 | 
			
		||||
		}
 | 
			
		||||
    }
 | 
			
		||||
    elsif (defined getpwnam($name) || defined getgrnam($name))
 | 
			
		||||
    {
 | 
			
		||||
    if (defined $rec) {
 | 
			
		||||
        my $type = $rec->prop('type');
 | 
			
		||||
 | 
			
		||||
        if ($type eq "pseudonym") {
 | 
			
		||||
            my $acct      = $rec->prop("Account");
 | 
			
		||||
            my $acct_type = $adb->get($acct)->prop('type');
 | 
			
		||||
            return $c->l('iba_ACCT_CLASHES_WITH_PSEUDONYM', $name, $acct_type, $acct);
 | 
			
		||||
        } ## end if ($type eq "pseudonym")
 | 
			
		||||
    } elsif (defined getpwnam($name) || defined getgrnam($name)) {
 | 
			
		||||
        $type = 'system';
 | 
			
		||||
    }
 | 
			
		||||
    else
 | 
			
		||||
    {
 | 
			
		||||
    } else {
 | 
			
		||||
 | 
			
		||||
        # No account record and no account
 | 
			
		||||
        return 'OK';
 | 
			
		||||
    }
 | 
			
		||||
    return $c->l('iba_ACCOUNT_EXISTS', $name, $type);
 | 
			
		||||
}
 | 
			
		||||
} ## end sub conflict_check
 | 
			
		||||
 | 
			
		||||
sub validate_name {
 | 
			
		||||
 | 
			
		||||
    my ($c, $acctName) = @_;
 | 
			
		||||
 | 
			
		||||
    unless ($acctName =~ /^([a-z][\_\.\-a-z0-9]*)$/)
 | 
			
		||||
    {
 | 
			
		||||
    unless ($acctName =~ /^([a-z][\_\.\-a-z0-9]*)$/) {
 | 
			
		||||
        return $c->l('iba_ACCT_NAME_HAS_INVALID_CHARS', $acctName);
 | 
			
		||||
    }
 | 
			
		||||
    return "OK";
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
} ## end sub validate_name
 | 
			
		||||
1
 | 
			
		||||
 
 | 
			
		||||
@@ -9,29 +9,18 @@ package SrvMngr::Controller::Initial;
 | 
			
		||||
#----------------------------------------------------------------------
 | 
			
		||||
use strict;
 | 
			
		||||
use warnings;
 | 
			
		||||
 | 
			
		||||
use Mojo::Base 'Mojolicious::Controller';
 | 
			
		||||
 | 
			
		||||
use Locale::gettext;
 | 
			
		||||
use SrvMngr::I18N;
 | 
			
		||||
use SrvMngr qw(theme_list init_session);
 | 
			
		||||
 | 
			
		||||
#use SrvMngr::Model::Main;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
sub main {
 | 
			
		||||
 | 
			
		||||
    my $c = shift;
 | 
			
		||||
    $c->app->log->info($c->log_req);
 | 
			
		||||
 | 
			
		||||
    my $title = $c->l('initial_FORM_TITLE');
 | 
			
		||||
    my $modul = $c->render_to_string(inline => $c->l('initial_FRAMES_BODY'));
 | 
			
		||||
 | 
			
		||||
    $c->stash( title => $title, modul => $modul );
 | 
			
		||||
 | 
			
		||||
    $c->stash(title => $title, modul => $modul);
 | 
			
		||||
    $c->render(template => 'initial');
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
} ## end sub main
 | 
			
		||||
1;
 | 
			
		||||
 
 | 
			
		||||
@@ -10,37 +10,27 @@ package SrvMngr::Controller::Legacypanel;
 | 
			
		||||
#
 | 
			
		||||
# routes : end
 | 
			
		||||
#----------------------------------------------------------------------
 | 
			
		||||
 | 
			
		||||
use strict;
 | 
			
		||||
use warnings;
 | 
			
		||||
 | 
			
		||||
use Mojo::Base 'Mojolicious::Controller';
 | 
			
		||||
 | 
			
		||||
use Locale::gettext;
 | 
			
		||||
use SrvMngr::I18N;
 | 
			
		||||
use SrvMngr qw(theme_list init_session);
 | 
			
		||||
 | 
			
		||||
#use SrvMngr::Model::Main;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
sub main {
 | 
			
		||||
 | 
			
		||||
    my $c = shift;
 | 
			
		||||
    $c->app->log->info($c->log_req);
 | 
			
		||||
 | 
			
		||||
    my $title = $c->l('legacy panel');
 | 
			
		||||
    my $legacy_url = $c->param('url');
 | 
			
		||||
    my $title         = $c->l('legacy panel');
 | 
			
		||||
    my $legacy_url    = $c->param('url');
 | 
			
		||||
    my $legacy_height = $c->param('height') | 600;
 | 
			
		||||
    $c->stash( title => $title, modul => $legacy_url, height => $legacy_height );
 | 
			
		||||
    $c->stash(title => $title, modul => $legacy_url, height => $legacy_height);
 | 
			
		||||
    $c->render(template => 'embedded');
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
} ## end sub main
 | 
			
		||||
 | 
			
		||||
sub getlegacyurl {
 | 
			
		||||
	my $c = shift;
 | 
			
		||||
	my $url = shift;
 | 
			
		||||
	return "/smanager/legacypanel?url=$url";
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    my $c   = shift;
 | 
			
		||||
    my $url = shift;
 | 
			
		||||
    return "/smanager/legacypanel?url=$url";
 | 
			
		||||
} ## end sub getlegacyurl
 | 
			
		||||
1;
 | 
			
		||||
 
 | 
			
		||||
@@ -4,13 +4,12 @@ package SrvMngr::Controller::Localnetworks;
 | 
			
		||||
# heading     : Network
 | 
			
		||||
# description : Local networks
 | 
			
		||||
# navigation  : 6000 500
 | 
			
		||||
# 
 | 
			
		||||
#
 | 
			
		||||
# routes : end
 | 
			
		||||
#----------------------------------------------------------------------
 | 
			
		||||
use strict;
 | 
			
		||||
use warnings;
 | 
			
		||||
use Mojo::Base 'Mojolicious::Controller';
 | 
			
		||||
 | 
			
		||||
use Locale::gettext;
 | 
			
		||||
use SrvMngr::I18N;
 | 
			
		||||
use SrvMngr qw(theme_list init_session subnet_mask get_reg_mask ip_number);
 | 
			
		||||
@@ -18,246 +17,226 @@ use SrvMngr qw(theme_list init_session subnet_mask get_reg_mask ip_number);
 | 
			
		||||
#use Data::Dumper;
 | 
			
		||||
use esmith::util;
 | 
			
		||||
use esmith::HostsDB;
 | 
			
		||||
 | 
			
		||||
my $network_db = esmith::NetworksDB->open() || die("Couldn't open networks db");
 | 
			
		||||
#my $network_db = esmith::NetworksDB->open() || die("Couldn't open networks db");
 | 
			
		||||
my $ret = "OK";
 | 
			
		||||
my ($network_db);
 | 
			
		||||
 | 
			
		||||
sub main {
 | 
			
		||||
 | 
			
		||||
    my $c = shift;
 | 
			
		||||
    $c->app->log->info( $c->log_req );
 | 
			
		||||
 | 
			
		||||
    $c->app->log->info($c->log_req);
 | 
			
		||||
    my %ln_datas = ();
 | 
			
		||||
    $ln_datas{return} = "";
 | 
			
		||||
    my $title = $c->l('ln_LOCAL NETWORKS');
 | 
			
		||||
	$network_db = esmith::NetworksDB->open() || die("Couldn't open networks db");
 | 
			
		||||
    my $modul = '';
 | 
			
		||||
 | 
			
		||||
    $ln_datas{trt} = 'LIST';
 | 
			
		||||
 | 
			
		||||
    my @localnetworks;
 | 
			
		||||
    if ($network_db) {
 | 
			
		||||
        @localnetworks = $network_db->get_all_by_prop( type => 'network' );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if ($network_db) {
 | 
			
		||||
        @localnetworks = $network_db->get_all_by_prop(type => 'network');
 | 
			
		||||
    }
 | 
			
		||||
    $c->stash(
 | 
			
		||||
        title         => $title,
 | 
			
		||||
        modul         => $modul,
 | 
			
		||||
        ln_datas      => \%ln_datas,
 | 
			
		||||
        localnetworks => \@localnetworks
 | 
			
		||||
    );
 | 
			
		||||
    $c->render( template => 'localnetworks' );
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
    $c->render(template => 'localnetworks');
 | 
			
		||||
} ## end sub main
 | 
			
		||||
 | 
			
		||||
sub do_display {
 | 
			
		||||
 | 
			
		||||
    my $c = shift;
 | 
			
		||||
    $c->app->log->info( $c->log_req );
 | 
			
		||||
 | 
			
		||||
    my $rt           = $c->current_route;
 | 
			
		||||
    my $trt          = ( $c->param('trt') || 'LIST' );
 | 
			
		||||
 | 
			
		||||
    $trt = 'DEL'  if ( $rt eq 'localnetworksdel' );
 | 
			
		||||
    $trt = 'ADD'  if ( $rt eq 'localnetworksadd' );
 | 
			
		||||
    $trt = 'ADD1'  if ( $rt eq 'localnetworksadd1' );
 | 
			
		||||
    $trt = 'DEL1' if ( $rt eq 'localnetworksdel1' );
 | 
			
		||||
 | 
			
		||||
    $c->app->log->info($c->log_req);
 | 
			
		||||
    my $rt = $c->current_route;
 | 
			
		||||
    my $trt = ($c->param('trt') || 'LIST');
 | 
			
		||||
	$network_db = esmith::NetworksDB->open() || die("Couldn't open networks db");
 | 
			
		||||
    $trt = 'DEL'  if ($rt eq 'localnetworksdel');
 | 
			
		||||
    $trt = 'ADD'  if ($rt eq 'localnetworksadd');
 | 
			
		||||
    $trt = 'ADD1' if ($rt eq 'localnetworksadd1');
 | 
			
		||||
    $trt = 'DEL1' if ($rt eq 'localnetworksdel1');
 | 
			
		||||
    my %ln_datas = ();
 | 
			
		||||
    my $title    = $c->l('ln_LOCAL NETWORKS');
 | 
			
		||||
    my $modul    = '';
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
    if ( $trt eq 'ADD' ) {
 | 
			
		||||
		#Add a network - called from the list panel
 | 
			
		||||
		# Nothing to do here...as just need fields to input data.
 | 
			
		||||
    if ($trt eq 'ADD') {
 | 
			
		||||
 | 
			
		||||
    }
 | 
			
		||||
        #Add a network - called from the list panel
 | 
			
		||||
        # Nothing to do here...as just need fields to input data.
 | 
			
		||||
    } ## end if ($trt eq 'ADD')
 | 
			
		||||
 | 
			
		||||
   if ( $trt eq 'ADD1' ) {
 | 
			
		||||
		#Add a network - called after new network details filled in
 | 
			
		||||
        my %ret = add_network($c);	
 | 
			
		||||
        #Return to list page if success	
 | 
			
		||||
        if ((index($ret{ret},"SUCCESS") != -1))  {
 | 
			
		||||
			$trt = "LIST";
 | 
			
		||||
		} else {
 | 
			
		||||
			#Error - return to Add page
 | 
			
		||||
			$trt = "ADD";
 | 
			
		||||
		}	
 | 
			
		||||
        $network_db = esmith::NetworksDB->open() || die("Failed to open Networkdb-3");  #Refresh the network DB 
 | 
			
		||||
		$c->stash(ret=>\%ret);	 #stash it away for the template
 | 
			
		||||
    }
 | 
			
		||||
    if ($trt eq 'ADD1') {
 | 
			
		||||
 | 
			
		||||
    if ( $trt eq 'DEL1' ) {
 | 
			
		||||
		#After Remove clicked on Delete network panel
 | 
			
		||||
        my $network_db = esmith::NetworksDB->open() || die("Failed to open Networkdb-1");
 | 
			
		||||
        #Add a network - called after new network details filled in
 | 
			
		||||
        my %ret = add_network($c);
 | 
			
		||||
 | 
			
		||||
        #Return to list page if success
 | 
			
		||||
        if ((index($ret{ret}, "SUCCESS") != -1)) {
 | 
			
		||||
            $trt = "LIST";
 | 
			
		||||
        } else {
 | 
			
		||||
 | 
			
		||||
            #Error - return to Add page
 | 
			
		||||
            $trt = "ADD";
 | 
			
		||||
        }
 | 
			
		||||
        $network_db = esmith::NetworksDB->open() || die("Failed to open Networkdb-3");    #Refresh the network DB
 | 
			
		||||
        $c->stash(ret => \%ret);    #stash it away for the template
 | 
			
		||||
    } ## end if ($trt eq 'ADD1')
 | 
			
		||||
 | 
			
		||||
    if ($trt eq 'DEL1') {
 | 
			
		||||
 | 
			
		||||
        #After Remove clicked on Delete network panel
 | 
			
		||||
        $network_db   = esmith::NetworksDB->open() || die("Failed to open Networkdb-1");
 | 
			
		||||
        my $localnetwork = $c->param("localnetwork");
 | 
			
		||||
        my $delete_hosts = $c->param("deletehost")||"1";  #default to deleting them.
 | 
			
		||||
	    my $rec = $network_db->get($localnetwork)||die("Failed to find network on db:$localnetwork");
 | 
			
		||||
        if ( $rec and $rec->prop('type') eq 'localnetwork' ) {
 | 
			
		||||
        my $delete_hosts = $c->param("deletehost") || "1";                                    #default to deleting them.
 | 
			
		||||
        my $rec = $network_db->get($localnetwork) || die("Failed to find network on db:$localnetwork");
 | 
			
		||||
 | 
			
		||||
        if ($rec and $rec->prop('type') eq 'localnetwork') {
 | 
			
		||||
            $ln_datas{localnetwork} = $localnetwork;
 | 
			
		||||
        }
 | 
			
		||||
        my %ret = remove_network($localnetwork,$delete_hosts);
 | 
			
		||||
        
 | 
			
		||||
        $network_db = esmith::NetworksDB->open() || die("Failed to open Networkdb-2");  #Refresh the network DB 
 | 
			
		||||
        my %ret = remove_network($localnetwork, $delete_hosts);
 | 
			
		||||
        $network_db = esmith::NetworksDB->open() || die("Failed to open Networkdb-2");        #Refresh the network DB
 | 
			
		||||
        my @localnetworks;
 | 
			
		||||
        if ($network_db) {
 | 
			
		||||
            @localnetworks = $network_db->get_all_by_prop( type => 'network' );
 | 
			
		||||
        }
 | 
			
		||||
        # Load up ln_datas with values need by template
 | 
			
		||||
		$ln_datas{subnet}      = $rec->prop('Mask');
 | 
			
		||||
		$ln_datas{router}      = $rec->prop('Router');
 | 
			
		||||
        $c->stash( ln_datas => \%ln_datas, localnetworks => \@localnetworks ,ret =>\%ret);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if ( $trt eq 'DEL' ) {
 | 
			
		||||
		#Initial delete panel requiring confirmation
 | 
			
		||||
    	my $localnetwork = $c->param("localnetwork") || '';
 | 
			
		||||
    	$c->stash(localnetwork=>$localnetwork);
 | 
			
		||||
        if ($network_db) {
 | 
			
		||||
            @localnetworks = $network_db->get_all_by_prop(type => 'network');
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        # Load up ln_datas with values need by template
 | 
			
		||||
        $ln_datas{subnet} = $rec->prop('Mask');
 | 
			
		||||
        $ln_datas{router} = $rec->prop('Router');
 | 
			
		||||
        $c->stash(ln_datas => \%ln_datas, localnetworks => \@localnetworks, ret => \%ret);
 | 
			
		||||
    } ## end if ($trt eq 'DEL1')
 | 
			
		||||
 | 
			
		||||
    if ($trt eq 'DEL') {
 | 
			
		||||
 | 
			
		||||
        #Initial delete panel requiring confirmation
 | 
			
		||||
        my $localnetwork = $c->param("localnetwork") || '';
 | 
			
		||||
        $c->stash(localnetwork => $localnetwork);
 | 
			
		||||
        my $rec = $network_db->get($localnetwork) || die("Failed to get local network in db::$localnetwork");
 | 
			
		||||
        my $subnet = $rec->prop('Mask');
 | 
			
		||||
        $ln_datas{subnet} = $subnet;
 | 
			
		||||
        $ln_datas{router} = $rec->prop('Router');
 | 
			
		||||
        my $numhosts = hosts_on_network($localnetwork,$subnet);
 | 
			
		||||
        my $numhosts = hosts_on_network($localnetwork, $subnet);
 | 
			
		||||
        $ln_datas{localnetwork} = $localnetwork;
 | 
			
		||||
        $ln_datas{deletehosts} = $numhosts>0?1:0;
 | 
			
		||||
     }
 | 
			
		||||
        $ln_datas{deletehosts} = $numhosts > 0 ? 1 : 0;
 | 
			
		||||
    } ## end if ($trt eq 'DEL')
 | 
			
		||||
 | 
			
		||||
    if ( $trt eq 'LIST' ) {
 | 
			
		||||
		#List all the networks
 | 
			
		||||
    if ($trt eq 'LIST') {
 | 
			
		||||
 | 
			
		||||
        #List all the networks
 | 
			
		||||
        my @localnetworks;
 | 
			
		||||
 | 
			
		||||
        if ($network_db) {
 | 
			
		||||
            @localnetworks = $network_db->get_all_by_prop( type => 'network' );
 | 
			
		||||
            @localnetworks = $network_db->get_all_by_prop(type => 'network');
 | 
			
		||||
        }
 | 
			
		||||
        $c->stash( localnetworks => \@localnetworks );
 | 
			
		||||
	## $c->redirect_to('/localnetworks');
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
        $c->stash(localnetworks => \@localnetworks);
 | 
			
		||||
        ## $c->redirect_to('/localnetworks');
 | 
			
		||||
    } ## end if ($trt eq 'LIST')
 | 
			
		||||
    $ln_datas{'trt'} = $trt;
 | 
			
		||||
    $c->stash( title => $title, modul => $modul, ln_datas => \%ln_datas );
 | 
			
		||||
    $c->render( template => 'localnetworks' );
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
    $c->stash(title => $title, modul => $modul, ln_datas => \%ln_datas);
 | 
			
		||||
    $c->render(template => 'localnetworks');
 | 
			
		||||
} ## end sub do_display
 | 
			
		||||
 | 
			
		||||
sub remove_network {
 | 
			
		||||
    my $network    = shift; 	
 | 
			
		||||
    my $network_db = esmith::NetworksDB->open();
 | 
			
		||||
    my $record     = $network_db->get($network);
 | 
			
		||||
    my $delete_hosts = shift;    
 | 
			
		||||
    my $network      = shift;
 | 
			
		||||
    $network_db   = esmith::NetworksDB->open();
 | 
			
		||||
    my $record       = $network_db->get($network);
 | 
			
		||||
    my $delete_hosts = shift;
 | 
			
		||||
 | 
			
		||||
    if ( my $record = $network_db->get($network) ) {
 | 
			
		||||
    if (my $record = $network_db->get($network)) {
 | 
			
		||||
        my $subnet = $record->prop('Mask');
 | 
			
		||||
        my $router = $record->prop('Router');
 | 
			
		||||
        $record->set_prop( type => 'network-deleted' );
 | 
			
		||||
        $record->set_prop(type => 'network-deleted');
 | 
			
		||||
 | 
			
		||||
        # Untaint $network before use in system()
 | 
			
		||||
        $network =~ /(.+)/;
 | 
			
		||||
        $network = $1;
 | 
			
		||||
        if ( system( "/sbin/e-smith/signal-event", "network-delete", $network )  == 0 )   {
 | 
			
		||||
 | 
			
		||||
        if (system("/sbin/e-smith/signal-event", "network-delete", $network) == 0) {
 | 
			
		||||
            if ($delete_hosts) {
 | 
			
		||||
                my @hosts_to_delete = hosts_on_network( $network, $subnet );
 | 
			
		||||
                my @hosts_to_delete = hosts_on_network($network, $subnet);
 | 
			
		||||
 | 
			
		||||
                foreach my $host (@hosts_to_delete) {
 | 
			
		||||
                    $host->delete;
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
            } ## end if ($delete_hosts)
 | 
			
		||||
            $record->delete;
 | 
			
		||||
            return (ret=>'ln_SUCCESS_REMOVED_NETWORK',vars=>"$network,$subnet,$router");
 | 
			
		||||
        }
 | 
			
		||||
        else {
 | 
			
		||||
            return (ret=>"ln_ERROR_DELETING_NETWORK");
 | 
			
		||||
            return (ret => 'ln_SUCCESS_REMOVED_NETWORK', vars => "$network,$subnet,$router");
 | 
			
		||||
        } else {
 | 
			
		||||
            return (ret => "ln_ERROR_DELETING_NETWORK");
 | 
			
		||||
        }
 | 
			
		||||
    } else {
 | 
			
		||||
        return (ret => "ln_NO_SUCH_NETWORK");
 | 
			
		||||
    }
 | 
			
		||||
    else {
 | 
			
		||||
        return (ret=>"ln_NO_SUCH_NETWORK");
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
} ## end sub remove_network
 | 
			
		||||
 | 
			
		||||
sub hosts_on_network {
 | 
			
		||||
    my $network = shift;
 | 
			
		||||
    my $netmask = shift;
 | 
			
		||||
 | 
			
		||||
    die if not $network and $netmask;
 | 
			
		||||
 | 
			
		||||
    my $cidr       = "$network/$netmask";
 | 
			
		||||
    my $hosts      = esmith::HostsDB->open() || die("Couldn't open hosts db");
 | 
			
		||||
    my @localhosts = grep { $_->prop('HostType') eq 'Local' } $hosts->hosts;
 | 
			
		||||
    my $cidr             = "$network/$netmask";
 | 
			
		||||
    my $hosts            = esmith::HostsDB->open() || die("Couldn't open hosts db");
 | 
			
		||||
    my @localhosts       = grep { $_->prop('HostType') eq 'Local' } $hosts->hosts;
 | 
			
		||||
    my @hosts_on_network = ();
 | 
			
		||||
 | 
			
		||||
    foreach my $host (@localhosts) {
 | 
			
		||||
        my $ip = $host->prop('InternalIP') || "";
 | 
			
		||||
 | 
			
		||||
        if ($ip) {
 | 
			
		||||
            if ( Net::IPv4Addr::ipv4_in_network( $cidr, $ip ) ) {
 | 
			
		||||
            if (Net::IPv4Addr::ipv4_in_network($cidr, $ip)) {
 | 
			
		||||
                push @hosts_on_network, $host;
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
        } ## end if ($ip)
 | 
			
		||||
    } ## end foreach my $host (@localhosts)
 | 
			
		||||
    return @hosts_on_network if wantarray;
 | 
			
		||||
    return scalar @hosts_on_network;
 | 
			
		||||
}
 | 
			
		||||
} ## end sub hosts_on_network
 | 
			
		||||
 | 
			
		||||
sub add_network
 | 
			
		||||
{
 | 
			
		||||
sub add_network {
 | 
			
		||||
    my ($fm)           = @_;
 | 
			
		||||
    my $networkAddress = $fm->param('networkAddress');
 | 
			
		||||
    my $networkMask    = $fm->param('networkMask');
 | 
			
		||||
    my $networkRouter  = $fm->param('networkRouter');
 | 
			
		||||
 | 
			
		||||
    #Validate Ips and subnet mask
 | 
			
		||||
 | 
			
		||||
    my $res = ip_number($fm, $networkAddress);
 | 
			
		||||
    return (ret=>'ln_INVALID_IP_ADDRESS', vars=>"Network Address $res") unless $res eq 'OK';
 | 
			
		||||
 | 
			
		||||
    $res = subnet_mask( $networkMask );
 | 
			
		||||
    return (ret=>'ln_INVALID_SUBNET_MASK', vars=>"$networkMask" ) unless $res eq 'OK';
 | 
			
		||||
 | 
			
		||||
    return (ret => 'ln_INVALID_IP_ADDRESS', vars => "Network Address $res") unless $res eq 'OK';
 | 
			
		||||
    $res = subnet_mask($networkMask);
 | 
			
		||||
    return (ret => 'ln_INVALID_SUBNET_MASK', vars => "$networkMask") unless $res eq 'OK';
 | 
			
		||||
    $res = ip_number($fm, $networkRouter);
 | 
			
		||||
    return (ret=>'ln_INVALID_IP_ADDRESS' , vars=>"Routeur Address $res") unless $res eq 'OK';
 | 
			
		||||
    return (ret => 'ln_INVALID_IP_ADDRESS', vars => "Routeur Address $res") unless $res eq 'OK';
 | 
			
		||||
 | 
			
		||||
    # we transform bit mask to regular mask
 | 
			
		||||
    $networkMask = get_reg_mask( $networkAddress, $networkMask );
 | 
			
		||||
 | 
			
		||||
    $networkMask = get_reg_mask($networkAddress, $networkMask);
 | 
			
		||||
    my $network_db = esmith::NetworksDB->open()
 | 
			
		||||
      || esmith::NetworksDB->create();
 | 
			
		||||
    my $config_db = esmith::ConfigDB->open();
 | 
			
		||||
 | 
			
		||||
        || esmith::NetworksDB->create();
 | 
			
		||||
    my $config_db    = esmith::ConfigDB->open();
 | 
			
		||||
    my $localIP      = $config_db->get('LocalIP');
 | 
			
		||||
    my $localNetmask = $config_db->get('LocalNetmask');
 | 
			
		||||
 | 
			
		||||
    my ( $localNetwork, $localBroadcast ) =
 | 
			
		||||
      esmith::util::computeNetworkAndBroadcast( $localIP->value(),
 | 
			
		||||
        $localNetmask->value() );
 | 
			
		||||
 | 
			
		||||
    my ( $routerNetwork, $routerBroadcast ) =
 | 
			
		||||
      esmith::util::computeNetworkAndBroadcast( $networkRouter,
 | 
			
		||||
        $localNetmask->value() );
 | 
			
		||||
    my ($localNetwork, $localBroadcast)
 | 
			
		||||
        = esmith::util::computeNetworkAndBroadcast($localIP->value(), $localNetmask->value());
 | 
			
		||||
    my ($routerNetwork, $routerBroadcast)
 | 
			
		||||
        = esmith::util::computeNetworkAndBroadcast($networkRouter, $localNetmask->value());
 | 
			
		||||
 | 
			
		||||
    # Note to self or future developers:
 | 
			
		||||
    # the following tests should probably be validation routines
 | 
			
		||||
    # in the form itself, but it just seemed too fiddly to do that
 | 
			
		||||
    # at the moment.  -- Skud 2002-04-11
 | 
			
		||||
    # I agree --bjr 2020-04-18
 | 
			
		||||
    
 | 
			
		||||
 	
 | 
			
		||||
    if ( $routerNetwork ne $localNetwork )
 | 
			
		||||
    {
 | 
			
		||||
       return (ret=>'ln_NOT_ACCESSIBLE_FROM_LOCAL_NETWORK');
 | 
			
		||||
    if ($routerNetwork ne $localNetwork) {
 | 
			
		||||
        return (ret => 'ln_NOT_ACCESSIBLE_FROM_LOCAL_NETWORK');
 | 
			
		||||
    }
 | 
			
		||||
    my ($network, $broadcast) = esmith::util::computeNetworkAndBroadcast($networkAddress, $networkMask);
 | 
			
		||||
 | 
			
		||||
    if ($network eq $localNetwork) {
 | 
			
		||||
        return (ret => 'ln_NETWORK_ALREADY_LOCAL');
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    my ( $network, $broadcast ) =
 | 
			
		||||
      esmith::util::computeNetworkAndBroadcast( $networkAddress, $networkMask );
 | 
			
		||||
 | 
			
		||||
    if ( $network eq $localNetwork )
 | 
			
		||||
    {
 | 
			
		||||
        return (ret=>'ln_NETWORK_ALREADY_LOCAL');
 | 
			
		||||
    if ($network_db->get($network)) {
 | 
			
		||||
        return (ret => 'ln_NETWORK_ALREADY_ADDED');
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if ( $network_db->get($network) )
 | 
			
		||||
    {
 | 
			
		||||
        return (ret=>'ln_NETWORK_ALREADY_ADDED');
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    $network_db->new_record(
 | 
			
		||||
        $network,
 | 
			
		||||
        {
 | 
			
		||||
            Mask   => $networkMask,
 | 
			
		||||
        {   Mask   => $networkMask,
 | 
			
		||||
            Router => $networkRouter,
 | 
			
		||||
            type   => 'network',
 | 
			
		||||
        }
 | 
			
		||||
@@ -266,26 +245,27 @@ sub add_network
 | 
			
		||||
    # Untaint $network before use in system()
 | 
			
		||||
    $network =~ /(.+)/;
 | 
			
		||||
    $network = $1;
 | 
			
		||||
    system( "/sbin/e-smith/signal-event", "network-create", $network ) == 0
 | 
			
		||||
      or ( return (ret=>'ln_ERROR_CREATING_NETWORK' ));
 | 
			
		||||
 | 
			
		||||
    my ( $totalHosts, $firstAddr, $lastAddr ) =
 | 
			
		||||
      esmith::util::computeHostRange( $network, $networkMask );
 | 
			
		||||
 | 
			
		||||
    system("/sbin/e-smith/signal-event", "network-create", $network) == 0
 | 
			
		||||
        or (return (ret => 'ln_ERROR_CREATING_NETWORK'));
 | 
			
		||||
    my ($totalHosts, $firstAddr, $lastAddr) = esmith::util::computeHostRange($network, $networkMask);
 | 
			
		||||
    my $msg;
 | 
			
		||||
    if ( $totalHosts == 1 )
 | 
			
		||||
 | 
			
		||||
    if ($totalHosts == 1) {
 | 
			
		||||
        return (ret => 'ln_SUCCESS_SINGLE_ADDRESS', vars => "$network,$networkMask,$networkRouter");
 | 
			
		||||
    } elsif (($totalHosts == 256)
 | 
			
		||||
        || ($totalHosts == 65536)
 | 
			
		||||
        || ($totalHosts == 16777216))
 | 
			
		||||
    {
 | 
			
		||||
        return (ret=>'ln_SUCCESS_SINGLE_ADDRESS',vars=>"$network,$networkMask,$networkRouter");
 | 
			
		||||
    }
 | 
			
		||||
    elsif (( $totalHosts == 256 )
 | 
			
		||||
        || ( $totalHosts == 65536 )
 | 
			
		||||
        || ( $totalHosts == 16777216 ) )
 | 
			
		||||
    {
 | 
			
		||||
         return ( ret=>'ln_SUCCESS_NETWORK_RANGE',vars=>"$network,$networkMask,$networkRouter,$totalHosts,$firstAddr,$lastAddr");
 | 
			
		||||
    }
 | 
			
		||||
    else
 | 
			
		||||
    {  	my $simpleMask = esmith::util::computeLocalNetworkPrefix( $network, $networkMask );
 | 
			
		||||
        return ( ret => 'ln_SUCCESS_NONSTANDARD_RANGE',
 | 
			
		||||
    	    vars=>"$network,$networkMask,$networkRouter,$totalHosts,$firstAddr,$lastAddr,$simpleMask");
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
        return (
 | 
			
		||||
            ret  => 'ln_SUCCESS_NETWORK_RANGE',
 | 
			
		||||
            vars => "$network,$networkMask,$networkRouter,$totalHosts,$firstAddr,$lastAddr"
 | 
			
		||||
        );
 | 
			
		||||
    } else {
 | 
			
		||||
        my $simpleMask = esmith::util::computeLocalNetworkPrefix($network, $networkMask);
 | 
			
		||||
        return (
 | 
			
		||||
            ret  => 'ln_SUCCESS_NONSTANDARD_RANGE',
 | 
			
		||||
            vars => "$network,$networkMask,$networkRouter,$totalHosts,$firstAddr,$lastAddr,$simpleMask"
 | 
			
		||||
        );
 | 
			
		||||
    } ## end else [ if ($totalHosts == 1) ]
 | 
			
		||||
} ## end sub add_network
 | 
			
		||||
1;
 | 
			
		||||
 
 | 
			
		||||
@@ -8,266 +8,215 @@ package SrvMngr::Controller::Login;
 | 
			
		||||
#
 | 
			
		||||
# routes : end
 | 
			
		||||
#----------------------------------------------------------------------
 | 
			
		||||
 | 
			
		||||
# for information
 | 
			
		||||
#    $r->get('/login')->to('login#main')->name('login');
 | 
			
		||||
#    $r->post('/login')->to('login#login')->name('signin');
 | 
			
		||||
#    $r->get('/login2')->to('login#pwdrescue')->name('pwdresc');
 | 
			
		||||
#    $r->get('/loginc')->to('login#confpwd')->name('resetpwdconf');
 | 
			
		||||
# for information
 | 
			
		||||
 | 
			
		||||
use strict;
 | 
			
		||||
use warnings;
 | 
			
		||||
use Mojo::Base 'Mojolicious::Controller';
 | 
			
		||||
 | 
			
		||||
use Locale::gettext;
 | 
			
		||||
 | 
			
		||||
use esmith::AccountsDB;
 | 
			
		||||
use SrvMngr::I18N;
 | 
			
		||||
use SrvMngr::Model::Main;
 | 
			
		||||
 | 
			
		||||
use SrvMngr qw( theme_list init_session );
 | 
			
		||||
 | 
			
		||||
my $MAX_LOGIN_ATTEMPTS = 3;
 | 
			
		||||
my $DURATION_BLOCKED = 30 * 60;		# access blocked for 30 min
 | 
			
		||||
my $MAX_LOGIN_ATTEMPTS   = 3;
 | 
			
		||||
my $DURATION_BLOCKED     = 30 * 60;        # access blocked for 30 min
 | 
			
		||||
my $TIMEOUT_FAILED_LOGIN = 1;
 | 
			
		||||
my $RESET_DURATION = 2 * 60 * 60;  # 2 hours for resetting
 | 
			
		||||
 | 
			
		||||
my $RESET_DURATION       = 2 * 60 * 60;    # 2 hours for resetting
 | 
			
		||||
our $adb = esmith::AccountsDB->open() or die "Couldn't open DB Accounts\n";
 | 
			
		||||
 | 
			
		||||
my $allowed_user_re = qr/^\w{5,10}$/;
 | 
			
		||||
my %Login_Attempts;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
sub main {
 | 
			
		||||
 | 
			
		||||
  my $c = shift;
 | 
			
		||||
  $c->stash( trt => 'NORM' );
 | 
			
		||||
  $c->render('login');
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
    my $c = shift;
 | 
			
		||||
    $c->stash(trt => 'NORM');
 | 
			
		||||
    $c->render('login');
 | 
			
		||||
} ## end sub main
 | 
			
		||||
 | 
			
		||||
sub login {
 | 
			
		||||
 | 
			
		||||
  my $c = shift;
 | 
			
		||||
 | 
			
		||||
  my $trt  = $c->param('Trt');
 | 
			
		||||
    my $c   = shift;
 | 
			
		||||
    my $trt = $c->param('Trt');
 | 
			
		||||
 | 
			
		||||
    # password reset request
 | 
			
		||||
  if ( $trt eq 'RESET' ) {
 | 
			
		||||
    my $res = $c->mail_rescue();
 | 
			
		||||
    if ( $res ne 'OK' ) {
 | 
			
		||||
      $c->stash( error => $res, trt => $trt );
 | 
			
		||||
      return $c->render('login');
 | 
			
		||||
    }
 | 
			
		||||
    $c->flash( success => $c->l('use_RESET_REGISTERED') );
 | 
			
		||||
    record_login_attempt($c, 'RESET');
 | 
			
		||||
    return $c->redirect_to( $c->home_page );
 | 
			
		||||
  }
 | 
			
		||||
    if ($trt eq 'RESET') {
 | 
			
		||||
        my $res = $c->mail_rescue();
 | 
			
		||||
 | 
			
		||||
        if ($res ne 'OK') {
 | 
			
		||||
            $c->stash(error => $res, trt => $trt);
 | 
			
		||||
            return $c->render('login');
 | 
			
		||||
        }
 | 
			
		||||
        $c->flash(success => $c->l('use_RESET_REGISTERED'));
 | 
			
		||||
        record_login_attempt($c, 'RESET');
 | 
			
		||||
        return $c->redirect_to($c->home_page);
 | 
			
		||||
    } ## end if ($trt eq 'RESET')
 | 
			
		||||
 | 
			
		||||
    # normal loggin
 | 
			
		||||
  my $name = $c->param('Username');
 | 
			
		||||
  my $pass = $c->param('Password');
 | 
			
		||||
  my $from = $c->param('From');
 | 
			
		||||
    my $name = $c->param('Username');
 | 
			
		||||
    my $pass = $c->param('Password');
 | 
			
		||||
    my $from = $c->param('From');
 | 
			
		||||
 | 
			
		||||
  if ( is_denied($c) ) {
 | 
			
		||||
	$c->stash( error => $c->l('use_TOO_MANY_LOGIN'), trt => 'NORM'  );
 | 
			
		||||
	return $c->render('login');
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
#	untaint
 | 
			
		||||
  unless ( ($name =~ /^([a-z][\-\_\.a-z0-9]*)$/) && ($pass =~ /^([ -~]+)$/) ) {
 | 
			
		||||
	record_login_attempt($c, 'FAILED');
 | 
			
		||||
	$c->stash( error => $c->l('use_INVALID_DATA'), trt => 'NORM'  );
 | 
			
		||||
	return $c->render('login');
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  my $alias = SrvMngr::Model::Main->check_adminalias( $c );
 | 
			
		||||
  if ( $alias ) {
 | 
			
		||||
    if ( $name eq $alias ) {
 | 
			
		||||
	$name = 'admin';
 | 
			
		||||
    } elsif ( $name eq 'admin' ) {
 | 
			
		||||
	record_login_attempt($c, 'FAILED');
 | 
			
		||||
	$c->stash( error => $c->l('use_SORRY'), trt => 'NORM'  );
 | 
			
		||||
	return $c->render('login');
 | 
			
		||||
    if (is_denied($c)) {
 | 
			
		||||
        $c->stash(error => $c->l('use_TOO_MANY_LOGIN'), trt => 'NORM');
 | 
			
		||||
        return $c->render('login');
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  if (SrvMngr::Model::Main->check_credentials($name, $pass)) {
 | 
			
		||||
    $c->session(logged_in => 1);             # set the logged_in flag
 | 
			
		||||
    $c->session(username => $name);      # keep a copy of the username
 | 
			
		||||
#    if ( $name eq 'admin' || $adb->is_user_in_group($name, 'AdmiN') )  # for futur use
 | 
			
		||||
    if ( $name eq 'admin' ) {
 | 
			
		||||
	$c->session(is_admin => 1);
 | 
			
		||||
    #	untaint
 | 
			
		||||
    unless (($name =~ /^([a-z][\-\_\.a-z0-9]*)$/) && ($pass =~ /^([ -~]+)$/)) {
 | 
			
		||||
        record_login_attempt($c, 'FAILED');
 | 
			
		||||
        $c->stash(error => $c->l('use_INVALID_DATA'), trt => 'NORM');
 | 
			
		||||
        return $c->render('login');
 | 
			
		||||
    }
 | 
			
		||||
    my $alias = SrvMngr::Model::Main->check_adminalias($c);
 | 
			
		||||
 | 
			
		||||
    if ($alias) {
 | 
			
		||||
        if ($name eq $alias) {
 | 
			
		||||
            $name = 'admin';
 | 
			
		||||
        } elsif ($name eq 'admin') {
 | 
			
		||||
            record_login_attempt($c, 'FAILED');
 | 
			
		||||
            $c->stash(error => $c->l('use_SORRY'), trt => 'NORM');
 | 
			
		||||
            return $c->render('login');
 | 
			
		||||
        }
 | 
			
		||||
    } ## end if ($alias)
 | 
			
		||||
 | 
			
		||||
    if (SrvMngr::Model::Main->check_credentials($name, $pass)) {
 | 
			
		||||
        $c->session(logged_in => 1);        # set the logged_in flag
 | 
			
		||||
        $c->session(username  => $name);    # keep a copy of the username
 | 
			
		||||
 | 
			
		||||
        #    if ( $name eq 'admin' || $adb->is_user_in_group($name, 'AdmiN') )  # for futur use
 | 
			
		||||
        if ($name eq 'admin') {
 | 
			
		||||
            $c->session(is_admin => 1);
 | 
			
		||||
        } else {
 | 
			
		||||
            $c->session(is_admin => 0);
 | 
			
		||||
        }
 | 
			
		||||
        $c->session(expiration => 600);     # expire this session in 10 minutes
 | 
			
		||||
        $c->flash(success => $c->l('use_WELCOME'));
 | 
			
		||||
        record_login_attempt($c, 'SUCCESS');
 | 
			
		||||
    } else {
 | 
			
		||||
	$c->session(is_admin => 0);
 | 
			
		||||
    }
 | 
			
		||||
    $c->session(expiration => 600);          # expire this session in 10 minutes
 | 
			
		||||
 | 
			
		||||
    $c->flash( success =>  $c->l('use_WELCOME') );
 | 
			
		||||
    record_login_attempt($c, 'SUCCESS');
 | 
			
		||||
  } else {
 | 
			
		||||
    record_login_attempt($c, 'FAILED');
 | 
			
		||||
    sleep $TIMEOUT_FAILED_LOGIN;
 | 
			
		||||
 | 
			
		||||
    $c->stash( error => $c->l('use_SORRY'), trt => 'NORM'  );
 | 
			
		||||
    return $c->render('login');
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  $from = $c->home_page if ( $from eq 'login' );
 | 
			
		||||
  $c->redirect_to( $from );
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
        record_login_attempt($c, 'FAILED');
 | 
			
		||||
        sleep $TIMEOUT_FAILED_LOGIN;
 | 
			
		||||
        $c->stash(error => $c->l('use_SORRY'), trt => 'NORM');
 | 
			
		||||
        return $c->render('login');
 | 
			
		||||
    } ## end else [ if (SrvMngr::Model::Main...)]
 | 
			
		||||
    $from = $c->home_page if ($from eq 'login');
 | 
			
		||||
    $c->redirect_to($from);
 | 
			
		||||
} ## end sub login
 | 
			
		||||
 | 
			
		||||
sub pwdrescue {
 | 
			
		||||
 | 
			
		||||
  my $c = shift;
 | 
			
		||||
 | 
			
		||||
  $c->stash( trt => 'RESET' );
 | 
			
		||||
 | 
			
		||||
  $c->render('login');
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
    my $c = shift;
 | 
			
		||||
    $c->stash(trt => 'RESET');
 | 
			
		||||
    $c->render('login');
 | 
			
		||||
} ## end sub pwdrescue
 | 
			
		||||
 | 
			
		||||
sub mail_rescue {
 | 
			
		||||
    my $c    = shift;
 | 
			
		||||
    my $name = $c->param('Username');
 | 
			
		||||
    my $from = $c->param('From');
 | 
			
		||||
    my $res;
 | 
			
		||||
    $res .= $c->l('use_TOO_MANY_LOGIN') if (is_denied($c));
 | 
			
		||||
 | 
			
		||||
  my $c = shift;
 | 
			
		||||
  my $name = $c->param('Username');
 | 
			
		||||
  my $from = $c->param('From');
 | 
			
		||||
 | 
			
		||||
  my $res;
 | 
			
		||||
 | 
			
		||||
  $res .= $c->l('use_TOO_MANY_LOGIN') if ( is_denied($c) );
 | 
			
		||||
 | 
			
		||||
#	untaint
 | 
			
		||||
  if ( ! $res &&  $name !~ /^([a-z][\-\_\.a-z0-9]*)$/ )  {
 | 
			
		||||
	record_login_attempt($c, 'FAILED');
 | 
			
		||||
	$res .= $c->l('use_ERR_NAME');
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  if ( ! $res && $name eq 'admin' )  {
 | 
			
		||||
	$res .= $c->l('use_NOT_THAT_OPER');
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
# user exists ?
 | 
			
		||||
    if ( ! $res ) {
 | 
			
		||||
	my $acct = $adb->get($name);
 | 
			
		||||
	if ( ! $acct || $acct->prop('type') ne "user" || $acct->prop('PasswordSet') ne 'yes' ) {
 | 
			
		||||
	    $res .= $c->l('use_NOT_THAT_OPER');
 | 
			
		||||
	}
 | 
			
		||||
    #	untaint
 | 
			
		||||
    if (!$res && $name !~ /^([a-z][\-\_\.a-z0-9]*)$/) {
 | 
			
		||||
        record_login_attempt($c, 'FAILED');
 | 
			
		||||
        $res .= $c->l('use_ERR_NAME');
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if (!$res && $name eq 'admin') {
 | 
			
		||||
        $res .= $c->l('use_NOT_THAT_OPER');
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    # user exists ?
 | 
			
		||||
    if (!$res) {
 | 
			
		||||
        my $acct = $adb->get($name);
 | 
			
		||||
 | 
			
		||||
        if (!$acct || $acct->prop('type') ne "user" || $acct->prop('PasswordSet') ne 'yes') {
 | 
			
		||||
            $res .= $c->l('use_NOT_THAT_OPER');
 | 
			
		||||
        }
 | 
			
		||||
    } ## end if (!$res)
 | 
			
		||||
    return $res if $res;
 | 
			
		||||
 | 
			
		||||
# send email
 | 
			
		||||
    my $email = $name .'@'. $c->session->{DomainName};
 | 
			
		||||
    # send email
 | 
			
		||||
    my $email = $name . '@' . $c->session->{DomainName};
 | 
			
		||||
    my $until = time() + $RESET_DURATION;
 | 
			
		||||
    $c->pwdrst->{$name} = {
 | 
			
		||||
        email     => $email,
 | 
			
		||||
        date      => $until,
 | 
			
		||||
        confirmed => 0,
 | 
			
		||||
    };
 | 
			
		||||
    my $jwt = $c->jwt->claims({ username => $name })->encode;
 | 
			
		||||
    my $url = $c->url_for('loginc')->to_abs->query(jwt => $jwt);
 | 
			
		||||
 | 
			
		||||
  $c->pwdrst->{$name} = {
 | 
			
		||||
    email  => $email,
 | 
			
		||||
    date   => $until,
 | 
			
		||||
    confirmed => 0,
 | 
			
		||||
  };
 | 
			
		||||
  my $jwt = $c->jwt->claims({username => $name})->encode;
 | 
			
		||||
  my $url = $c->url_for('loginc')->to_abs->query(jwt => $jwt);
 | 
			
		||||
 | 
			
		||||
#  $c->email( $email, $c->l('use_CONFIRM_RESET'), $c->render_to_string(inline => $c->l('use_GO_TO_URL', $url) ) );
 | 
			
		||||
#  directly (without minion)
 | 
			
		||||
  $c->send_email( $email, $c->l('use_CONFIRM_RESET'), $c->render_to_string(inline => $c->l('use_GO_TO_URL', $url) ) );
 | 
			
		||||
 | 
			
		||||
  return 'OK';
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
    #  $c->email( $email, $c->l('use_CONFIRM_RESET'), $c->render_to_string(inline => $c->l('use_GO_TO_URL', $url) ) );
 | 
			
		||||
    #  directly (without minion)
 | 
			
		||||
    $c->send_email($email, $c->l('use_CONFIRM_RESET'), $c->render_to_string(inline => $c->l('use_GO_TO_URL', $url)));
 | 
			
		||||
    return 'OK';
 | 
			
		||||
} ## end sub mail_rescue
 | 
			
		||||
 | 
			
		||||
sub logout {
 | 
			
		||||
 | 
			
		||||
  my $c = shift;
 | 
			
		||||
  $c->app->log->info($c->log_req);
 | 
			
		||||
 | 
			
		||||
  $c->session( expires => 1 );
 | 
			
		||||
  $c->flash( success => $c->l('use_BYE') );
 | 
			
		||||
  $c->flash( error => 'Byegood' );
 | 
			
		||||
 | 
			
		||||
  $c->redirect_to( $c->home_page );
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
    my $c = shift;
 | 
			
		||||
    $c->app->log->info($c->log_req);
 | 
			
		||||
    $c->session(expires => 1);
 | 
			
		||||
    $c->flash(success => $c->l('use_BYE'));
 | 
			
		||||
    $c->flash(error   => 'Byegood');
 | 
			
		||||
    $c->redirect_to($c->home_page);
 | 
			
		||||
} ## end sub logout
 | 
			
		||||
 | 
			
		||||
sub confpwd {
 | 
			
		||||
 | 
			
		||||
  my $c = shift;
 | 
			
		||||
 | 
			
		||||
  my $jwt = $c->param('jwt');
 | 
			
		||||
  my $name = $c->jwt->decode($jwt)->{username};
 | 
			
		||||
    my $c    = shift;
 | 
			
		||||
    my $jwt  = $c->param('jwt');
 | 
			
		||||
    my $name = $c->jwt->decode($jwt)->{username};
 | 
			
		||||
 | 
			
		||||
    # request already treated or outdated
 | 
			
		||||
  if ( $c->pwdrst->{$name}{confirmed} != 0 or $c->pwdrst->{$name}{date} < time() ) {
 | 
			
		||||
	$c->flash( error => $c->l('use_INVALID_REQUEST'));
 | 
			
		||||
	return $c->redirect_to( $c->home_page );
 | 
			
		||||
  }
 | 
			
		||||
    if ($c->pwdrst->{$name}{confirmed} != 0 or $c->pwdrst->{$name}{date} < time()) {
 | 
			
		||||
        $c->flash(error => $c->l('use_INVALID_REQUEST'));
 | 
			
		||||
        return $c->redirect_to($c->home_page);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    # reset password for this account
 | 
			
		||||
  $c->pwdrst->{$name}{confirmed} = 1;
 | 
			
		||||
 | 
			
		||||
  $c->flash( success => $c->l('use_OK_FOR_RESET') );
 | 
			
		||||
    $c->pwdrst->{$name}{confirmed} = 1;
 | 
			
		||||
    $c->flash(success => $c->l('use_OK_FOR_RESET'));
 | 
			
		||||
 | 
			
		||||
    # call userpassword with encoded name
 | 
			
		||||
  my $url = $c->url_for('userpasswordr')->to_abs->query(jwt => $jwt);
 | 
			
		||||
    my $url = $c->url_for('userpasswordr')->to_abs->query(jwt => $jwt);
 | 
			
		||||
 | 
			
		||||
    # warn "confpwd: " . $url . "\n";
 | 
			
		||||
 | 
			
		||||
  return $c->redirect_to( $url );
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
    return $c->redirect_to($url);
 | 
			
		||||
} ## end sub confpwd
 | 
			
		||||
 | 
			
		||||
sub record_login_attempt {
 | 
			
		||||
    my ($c, $result) = @_;
 | 
			
		||||
    my $user       = $c->param('Username');
 | 
			
		||||
    my $ip_address = $c->tx->remote_address;
 | 
			
		||||
 | 
			
		||||
  my ($c, $result) = @_;
 | 
			
		||||
 | 
			
		||||
  my $user = $c->param('Username');
 | 
			
		||||
  my $ip_address = $c->tx->remote_address;
 | 
			
		||||
 | 
			
		||||
  if ($result eq 'RESET') {
 | 
			
		||||
 | 
			
		||||
    $c->app->log->info(join "\t", "Password reset requested for : $user at ", $ip_address);
 | 
			
		||||
 | 
			
		||||
  } elsif ($result eq 'SUCCESS') {
 | 
			
		||||
 | 
			
		||||
    $c->app->log->info(join "\t", "Login succeeded: $user", $ip_address);
 | 
			
		||||
    $Login_Attempts{$ip_address}->{tries} = 0;	# reset the number of login attempts
 | 
			
		||||
 | 
			
		||||
  } else {
 | 
			
		||||
 | 
			
		||||
    $c->app->log->info(join "\t", "Login FAILED: $user", $ip_address);
 | 
			
		||||
    $Login_Attempts{$ip_address}->{tries}++;
 | 
			
		||||
    if ( $Login_Attempts{$ip_address}->{tries} > $MAX_LOGIN_ATTEMPTS ) {
 | 
			
		||||
      $Login_Attempts{$ip_address}->{denied_until} = time() + $DURATION_BLOCKED;
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
    if ($result eq 'RESET') {
 | 
			
		||||
        $c->app->log->info(join "\t", "Password reset requested for : $user at ", $ip_address);
 | 
			
		||||
    } elsif ($result eq 'SUCCESS') {
 | 
			
		||||
        $c->app->log->info(join "\t", "Login succeeded: $user", $ip_address);
 | 
			
		||||
        $Login_Attempts{$ip_address}->{tries} = 0;    # reset the number of login attempts
 | 
			
		||||
    } else {
 | 
			
		||||
        $c->app->log->info(join "\t", "Login FAILED: $user", $ip_address);
 | 
			
		||||
        $Login_Attempts{$ip_address}->{tries}++;
 | 
			
		||||
 | 
			
		||||
        if ($Login_Attempts{$ip_address}->{tries} > $MAX_LOGIN_ATTEMPTS) {
 | 
			
		||||
            $Login_Attempts{$ip_address}->{denied_until} = time() + $DURATION_BLOCKED;
 | 
			
		||||
        }
 | 
			
		||||
    } ## end else [ if ($result eq 'RESET')]
 | 
			
		||||
} ## end sub record_login_attempt
 | 
			
		||||
 | 
			
		||||
sub is_denied {
 | 
			
		||||
  my ($c) = @_;
 | 
			
		||||
 | 
			
		||||
  my $ip_address = $c->tx->remote_address;
 | 
			
		||||
 | 
			
		||||
  return unless exists $Login_Attempts{$ip_address}
 | 
			
		||||
    my ($c) = @_;
 | 
			
		||||
    my $ip_address = $c->tx->remote_address;
 | 
			
		||||
    return
 | 
			
		||||
        unless exists $Login_Attempts{$ip_address}
 | 
			
		||||
        && exists $Login_Attempts{$ip_address}->{denied_until};
 | 
			
		||||
    return 'Denied'
 | 
			
		||||
        if $Login_Attempts{$ip_address}->{denied_until} > time();
 | 
			
		||||
 | 
			
		||||
  return 'Denied'
 | 
			
		||||
    if $Login_Attempts{$ip_address}->{denied_until} > time();
 | 
			
		||||
 | 
			
		||||
  # TIMEOUT has expired, reset attempts
 | 
			
		||||
  delete $Login_Attempts{$ip_address}->{denied_until};
 | 
			
		||||
  $Login_Attempts{$ip_address}->{tries} = 0;
 | 
			
		||||
 | 
			
		||||
  return;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    # TIMEOUT has expired, reset attempts
 | 
			
		||||
    delete $Login_Attempts{$ip_address}->{denied_until};
 | 
			
		||||
    $Login_Attempts{$ip_address}->{tries} = 0;
 | 
			
		||||
    return;
 | 
			
		||||
} ## end sub is_denied
 | 
			
		||||
1;
 | 
			
		||||
 
 | 
			
		||||
@@ -8,27 +8,18 @@ package SrvMngr::Controller::Logout;
 | 
			
		||||
#
 | 
			
		||||
# routes : end
 | 
			
		||||
#----------------------------------------------------------------------
 | 
			
		||||
 | 
			
		||||
use strict;
 | 
			
		||||
use warnings;
 | 
			
		||||
use Mojo::Base 'Mojolicious::Controller';
 | 
			
		||||
 | 
			
		||||
use Locale::gettext;
 | 
			
		||||
use SrvMngr::I18N;
 | 
			
		||||
 | 
			
		||||
use SrvMngr qw( theme_list init_session );
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
sub logout {
 | 
			
		||||
 | 
			
		||||
  my $c = shift;
 | 
			
		||||
  $c->app->log->info($c->log_req);
 | 
			
		||||
 | 
			
		||||
  $c->session( expires => 1 );
 | 
			
		||||
  $c->flash( success => 'Goodbye' );
 | 
			
		||||
 | 
			
		||||
  $c->redirect_to( $c->home_page );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    my $c = shift;
 | 
			
		||||
    $c->app->log->info($c->log_req);
 | 
			
		||||
    $c->session(expires => 1);
 | 
			
		||||
    $c->flash(success => 'Goodbye');
 | 
			
		||||
    $c->redirect_to($c->home_page);
 | 
			
		||||
} ## end sub logout
 | 
			
		||||
1;
 | 
			
		||||
 
 | 
			
		||||
@@ -10,25 +10,17 @@ package SrvMngr::Controller::Manual;
 | 
			
		||||
#----------------------------------------------------------------------
 | 
			
		||||
use strict;
 | 
			
		||||
use warnings;
 | 
			
		||||
 | 
			
		||||
use Mojo::Base 'Mojolicious::Controller';
 | 
			
		||||
 | 
			
		||||
use Locale::gettext;
 | 
			
		||||
use SrvMngr::I18N;
 | 
			
		||||
use SrvMngr qw(theme_list init_session);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
sub main {
 | 
			
		||||
    my $c = shift;
 | 
			
		||||
    $c->app->log->info($c->log_req);
 | 
			
		||||
 | 
			
		||||
    my $title = $c->l('manual_FORM_TITLE');
 | 
			
		||||
    my $modul = $c->render_to_string(inline => $c->l('manual_DESCRIPTION'));
 | 
			
		||||
 | 
			
		||||
    $c->stash( title => $title, modul => $modul);
 | 
			
		||||
 | 
			
		||||
    $c->stash(title => $title, modul => $modul);
 | 
			
		||||
    $c->render(template => 'manual');
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
} ## end sub main
 | 
			
		||||
1;
 | 
			
		||||
 
 | 
			
		||||
@@ -1,71 +1,57 @@
 | 
			
		||||
package SrvMngr::Controller::Modules;
 | 
			
		||||
 | 
			
		||||
use strict;
 | 
			
		||||
use warnings;
 | 
			
		||||
use Mojo::Base 'Mojolicious::Controller';
 | 
			
		||||
 | 
			
		||||
use Locale::gettext;
 | 
			
		||||
use SrvMngr::I18N;
 | 
			
		||||
 | 
			
		||||
#
 | 
			
		||||
# routes : end
 | 
			
		||||
#----------------------------------------------------------------------
 | 
			
		||||
use SrvMngr qw(theme_list init_session);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
sub bugreport {
 | 
			
		||||
    my $c = shift;
 | 
			
		||||
 | 
			
		||||
    $c->app->log->info($c->log_req);
 | 
			
		||||
 | 
			
		||||
    my $modul = $c->render_to_string( inline => "<p>#    my (\$lang, \$releaseVersion,
 | 
			
		||||
    my $modul = $c->render_to_string(
 | 
			
		||||
        inline => "<p>#    my (\$lang, \$releaseVersion,
 | 
			
		||||
<br>#	\$c->stash\(\'lang\', \'releaseVer\'
 | 
			
		||||
#	\'navigation\'</p>");
 | 
			
		||||
 | 
			
		||||
    $c->stash( modul => $modul );
 | 
			
		||||
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
#	\'navigation\'</p>"
 | 
			
		||||
    );
 | 
			
		||||
    $c->stash(modul => $modul);
 | 
			
		||||
} ## end sub bugreport
 | 
			
		||||
 | 
			
		||||
sub support {
 | 
			
		||||
    my $c = shift;
 | 
			
		||||
 | 
			
		||||
    $c->app->log->info($c->log_req);
 | 
			
		||||
    my $modul = $c->stash('modul');
 | 
			
		||||
    $modul .= 'Mail result is 1 + 8.';
 | 
			
		||||
 | 
			
		||||
    $c->stash( modul => $modul, PwdSet => '0', Unsafe => '0' );
 | 
			
		||||
    $c->stash(modul => $modul, PwdSet => '0', Unsafe => '0');
 | 
			
		||||
 | 
			
		||||
    #$c->render('modules/support');
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
} ## end sub support
 | 
			
		||||
 | 
			
		||||
sub modsearch {
 | 
			
		||||
    my $c = shift;
 | 
			
		||||
    my $c      = shift;
 | 
			
		||||
    my $module = $c->param('module');
 | 
			
		||||
 | 
			
		||||
    $c->app->log->info($c->log_req);
 | 
			
		||||
 | 
			
		||||
    my $redirect_url = SrvMngr->get_mod_url($module);
 | 
			
		||||
    if($redirect_url ne "-1"){
 | 
			
		||||
	#$c->render(text => "mod_search: $module to $redirect_url");
 | 
			
		||||
 | 
			
		||||
    if ($redirect_url ne "-1") {
 | 
			
		||||
 | 
			
		||||
        #$c->render(text => "mod_search: $module to $redirect_url");
 | 
			
		||||
        return $c->redirect_to($redirect_url);
 | 
			
		||||
 | 
			
		||||
        #return $c->redirect_to( url_for($redirect_url) );
 | 
			
		||||
    }
 | 
			
		||||
    } ## end if ($redirect_url ne "-1")
 | 
			
		||||
 | 
			
		||||
    #$c->render(text => "mod_search: $module to 'welcome'");
 | 
			
		||||
    return $c->redirect_to( $c->home_page );
 | 
			
		||||
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
    return $c->redirect_to($c->home_page);
 | 
			
		||||
} ## end sub modsearch
 | 
			
		||||
 | 
			
		||||
sub whatever {
 | 
			
		||||
    my $c = shift;
 | 
			
		||||
    my $c        = shift;
 | 
			
		||||
    my $whatever = $c->param('whatever');
 | 
			
		||||
 | 
			
		||||
    $c->app->log->info($c->log_req . ' ' . $whatever);
 | 
			
		||||
 | 
			
		||||
    $c->render(text => "whatever: /$whatever did not match.", status => 404);
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
} ## end sub whatever
 | 
			
		||||
1;
 | 
			
		||||
 
 | 
			
		||||
@@ -10,248 +10,256 @@ package SrvMngr::Controller::Portforwarding;
 | 
			
		||||
use strict;
 | 
			
		||||
use warnings;
 | 
			
		||||
use Mojo::Base 'Mojolicious::Controller';
 | 
			
		||||
 | 
			
		||||
use Locale::gettext;
 | 
			
		||||
use SrvMngr::I18N;
 | 
			
		||||
use SrvMngr qw(theme_list init_session);
 | 
			
		||||
#use Regexp::Common qw /net/;
 | 
			
		||||
 | 
			
		||||
#use Regexp::Common qw /net/;
 | 
			
		||||
#use Data::Dumper;
 | 
			
		||||
use esmith::util;
 | 
			
		||||
use esmith::HostsDB;
 | 
			
		||||
 | 
			
		||||
our $db = esmith::ConfigDB->open
 | 
			
		||||
    || die "Can't open configuration database: $!\n";
 | 
			
		||||
our $tcp_db = esmith::ConfigDB->open('portforward_tcp')
 | 
			
		||||
    || die "Can't open portforward_tcp database: $!\n";
 | 
			
		||||
our $udp_db = esmith::ConfigDB->open('portforward_udp')
 | 
			
		||||
    || die "Can't open portforward_udp database: $!\n";
 | 
			
		||||
 | 
			
		||||
#our $db = esmith::ConfigDB->open || die "Can't open configuration database: $!\n";
 | 
			
		||||
#our $tcp_db = esmith::ConfigDB->open('portforward_tcp') || die "Can't open portforward_tcp database: $!\n";
 | 
			
		||||
#our $udp_db = esmith::ConfigDB->open('portforward_udp') || die "Can't open portforward_udp database: $!\n";
 | 
			
		||||
my ($cdb,$tcp_db,$udp_db);
 | 
			
		||||
 | 
			
		||||
my %ret = ();
 | 
			
		||||
 | 
			
		||||
use constant FALSE => 0;
 | 
			
		||||
use constant TRUE  => 1;
 | 
			
		||||
 | 
			
		||||
sub main {
 | 
			
		||||
 | 
			
		||||
    my $c = shift;
 | 
			
		||||
    $c->app->log->info( $c->log_req );
 | 
			
		||||
 | 
			
		||||
    $c->app->log->info($c->log_req);
 | 
			
		||||
    my %pf_datas = ();
 | 
			
		||||
    $pf_datas{return} = "";
 | 
			
		||||
    my $title = $c->l('pf_FORM_TITLE');
 | 
			
		||||
    my $modul = '';
 | 
			
		||||
 | 
			
		||||
	$cdb = esmith::ConfigDB->open || die "Can't open configuration database: $!\n";
 | 
			
		||||
	$tcp_db = esmith::ConfigDB->open('portforward_tcp') || die "Can't open portforward_tcp database: $!\n";
 | 
			
		||||
	$udp_db = esmith::ConfigDB->open('portforward_udp') || die "Can't open portforward_udp database: $!\n";
 | 
			
		||||
    $pf_datas{trt} = 'LIST';
 | 
			
		||||
 | 
			
		||||
    my @tcpforwards = $tcp_db->get_all;
 | 
			
		||||
    my @udpforwards = $udp_db->get_all;
 | 
			
		||||
    my $empty = 1 if not @tcpforwards and not @udpforwards;
 | 
			
		||||
 | 
			
		||||
     $c->stash(
 | 
			
		||||
        title         => $title,
 | 
			
		||||
        modul         => $modul,
 | 
			
		||||
        pf_datas      => \%pf_datas,
 | 
			
		||||
        tcpforwards =>\@tcpforwards,
 | 
			
		||||
        udpforwards =>\@udpforwards,
 | 
			
		||||
        empty => $empty
 | 
			
		||||
    my $empty       = 1 if not @tcpforwards and not @udpforwards;
 | 
			
		||||
    $c->stash(
 | 
			
		||||
        title       => $title,
 | 
			
		||||
        modul       => $modul,
 | 
			
		||||
        pf_datas    => \%pf_datas,
 | 
			
		||||
        tcpforwards => \@tcpforwards,
 | 
			
		||||
        udpforwards => \@udpforwards,
 | 
			
		||||
        empty       => $empty
 | 
			
		||||
    );
 | 
			
		||||
    $c->render( template => 'portforwarding' );
 | 
			
		||||
}
 | 
			
		||||
    $c->render(template => 'portforwarding');
 | 
			
		||||
} ## end sub main
 | 
			
		||||
 | 
			
		||||
sub do_display {
 | 
			
		||||
 | 
			
		||||
    my $c = shift;
 | 
			
		||||
    $c->app->log->info( $c->log_req );
 | 
			
		||||
 | 
			
		||||
    my $rt           = $c->current_route;
 | 
			
		||||
    my $trt          = ( $c->param('trt') || 'LIST' );
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    $trt = 'DEL'  if ( $rt eq 'portforwardingdel' );
 | 
			
		||||
    $trt = 'ADD'  if ( $rt eq 'portforwardingadd' );
 | 
			
		||||
    $trt = 'ADD1'  if ( $rt eq 'portforwardingadd1' );
 | 
			
		||||
    $trt = 'DEL1' if ( $rt eq 'portforwardingdel1' );
 | 
			
		||||
 | 
			
		||||
    $c->app->log->info($c->log_req);
 | 
			
		||||
    my $rt = $c->current_route;
 | 
			
		||||
    my $trt = ($c->param('trt') || 'LIST');
 | 
			
		||||
	my $cdb = esmith::ConfigDB->open || die "Can't open configuration database: $!\n";
 | 
			
		||||
	my $tcp_db = esmith::ConfigDB->open('portforward_tcp') || die "Can't open portforward_tcp database: $!\n";
 | 
			
		||||
	my $udp_db = esmith::ConfigDB->open('portforward_udp') || die "Can't open portforward_udp database: $!\n";
 | 
			
		||||
    $trt = 'DEL'  if ($rt eq 'portforwardingdel');
 | 
			
		||||
    $trt = 'ADD'  if ($rt eq 'portforwardingadd');
 | 
			
		||||
    $trt = 'ADD1' if ($rt eq 'portforwardingadd1');
 | 
			
		||||
    $trt = 'DEL1' if ($rt eq 'portforwardingdel1');
 | 
			
		||||
    my %pf_datas = ();
 | 
			
		||||
    my $title    = $c->l('pf_FORM_TITLE');
 | 
			
		||||
    my $modul    = '';
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
    if ( $trt eq 'ADD' ) {
 | 
			
		||||
		# Add a portforward- called from the list panel
 | 
			
		||||
		# Nothing to do here...as just need template to display fields to input data.
 | 
			
		||||
    if ($trt eq 'ADD') {
 | 
			
		||||
 | 
			
		||||
    }
 | 
			
		||||
        # Add a portforward- called from the list panel
 | 
			
		||||
        # Nothing to do here...as just need template to display fields to input data.
 | 
			
		||||
    } ## end if ($trt eq 'ADD')
 | 
			
		||||
 | 
			
		||||
   if ( $trt eq 'ADD1' ) {
 | 
			
		||||
		#Add a port forward - called after new pf details filled in
 | 
			
		||||
        my %ret = add_portforward($c);	
 | 
			
		||||
        #Return to list page if success	
 | 
			
		||||
        if ((index($ret{ret},"SUCCESS") != -1))  {
 | 
			
		||||
			$trt = "LIST";
 | 
			
		||||
		} else {
 | 
			
		||||
			#Error - return to Add page
 | 
			
		||||
			$trt = "ADD";
 | 
			
		||||
		}	
 | 
			
		||||
		$c->stash(ret=>\%ret);
 | 
			
		||||
    }
 | 
			
		||||
    if ($trt eq 'ADD1') {
 | 
			
		||||
 | 
			
		||||
    if ( $trt eq 'DEL1' ) {
 | 
			
		||||
		##After Remove clicked on Delete network panel
 | 
			
		||||
		my $sport = $c->param("sport") || '';
 | 
			
		||||
		my $proto = $c->param("proto") || '';
 | 
			
		||||
     	#work out which protocol   	
 | 
			
		||||
        #Add a port forward - called after new pf details filled in
 | 
			
		||||
        my %ret = add_portforward($c);
 | 
			
		||||
 | 
			
		||||
        #Return to list page if success
 | 
			
		||||
        if ((index($ret{ret}, "SUCCESS") != -1)) {
 | 
			
		||||
            $trt = "LIST";
 | 
			
		||||
        } else {
 | 
			
		||||
 | 
			
		||||
            #Error - return to Add page
 | 
			
		||||
            $trt = "ADD";
 | 
			
		||||
        }
 | 
			
		||||
        $c->stash(ret => \%ret);
 | 
			
		||||
    } ## end if ($trt eq 'ADD1')
 | 
			
		||||
 | 
			
		||||
    if ($trt eq 'DEL1') {
 | 
			
		||||
        ##After Remove clicked on Delete network panel
 | 
			
		||||
        my $sport = $c->param("sport") || '';
 | 
			
		||||
        my $proto = $c->param("proto") || '';
 | 
			
		||||
 | 
			
		||||
        #work out which protocol
 | 
			
		||||
        my $fdb;
 | 
			
		||||
 | 
			
		||||
        if ($proto eq 'TCP') {
 | 
			
		||||
            $fdb = $tcp_db;
 | 
			
		||||
        }
 | 
			
		||||
        else {
 | 
			
		||||
        } else {
 | 
			
		||||
            $fdb = $udp_db;
 | 
			
		||||
        }
 | 
			
		||||
		#check that the sport is in the db
 | 
			
		||||
		my $entry = $fdb->get($sport) || die("Unable to find sport and proto $sport $proto");
 | 
			
		||||
 | 
			
		||||
        #check that the sport is in the db
 | 
			
		||||
        my $entry = $fdb->get($sport) || die("Unable to find sport and proto $sport $proto");
 | 
			
		||||
        $entry->delete;
 | 
			
		||||
		system( "/sbin/e-smith/signal-event", "portforwarding-update") == 0
 | 
			
		||||
		  or ( die($c->l('pf_ERR_NONZERO_RETURN_EVENT')));
 | 
			
		||||
		$trt = "LIST";
 | 
			
		||||
		my %ret = (ret=>"pf_SUCCESS");
 | 
			
		||||
		$c->stash(ret=>\%ret);
 | 
			
		||||
    }
 | 
			
		||||
        system("/sbin/e-smith/signal-event", "portforwarding-update") == 0
 | 
			
		||||
            or (die($c->l('pf_ERR_NONZERO_RETURN_EVENT')));
 | 
			
		||||
        $trt = "LIST";
 | 
			
		||||
        my %ret = (ret => "pf_SUCCESS");
 | 
			
		||||
        $c->stash(ret => \%ret);
 | 
			
		||||
    } ## end if ($trt eq 'DEL1')
 | 
			
		||||
 | 
			
		||||
    if ( $trt eq 'DEL' ) {
 | 
			
		||||
		##Initial delete panel requiring confirmation
 | 
			
		||||
		my $sport = $c->param("sport") || '';
 | 
			
		||||
		my $proto = $c->param("proto") || '';
 | 
			
		||||
    	$c->stash(sport=>$sport);
 | 
			
		||||
    	#work out which protocol   	
 | 
			
		||||
    if ($trt eq 'DEL') {
 | 
			
		||||
        ##Initial delete panel requiring confirmation
 | 
			
		||||
        my $sport = $c->param("sport") || '';
 | 
			
		||||
        my $proto = $c->param("proto") || '';
 | 
			
		||||
        $c->stash(sport => $sport);
 | 
			
		||||
 | 
			
		||||
        #work out which protocol
 | 
			
		||||
        my $fdb;
 | 
			
		||||
 | 
			
		||||
        if ($proto eq 'TCP') {
 | 
			
		||||
            $fdb = $tcp_db;
 | 
			
		||||
        }
 | 
			
		||||
        else {
 | 
			
		||||
        } else {
 | 
			
		||||
            $fdb = $udp_db;
 | 
			
		||||
        }
 | 
			
		||||
		#pull out details and pass to template
 | 
			
		||||
		my $entry = $fdb->get($sport) || die("Unable to find sport and proto $sport $proto");
 | 
			
		||||
 | 
			
		||||
        #pull out details and pass to template
 | 
			
		||||
        my $entry = $fdb->get($sport) || die("Unable to find sport and proto $sport $proto");
 | 
			
		||||
        $pf_datas{proto} = $proto;
 | 
			
		||||
        $pf_datas{sport} = $sport;
 | 
			
		||||
        $pf_datas{dhost} = $entry->prop('DestHost');
 | 
			
		||||
        $pf_datas{dport} = $entry->prop('DestPort') || '';
 | 
			
		||||
        $pf_datas{cmmnt}  = $entry->prop('Comment') || '';
 | 
			
		||||
        $pf_datas{allow}  = $entry->prop('AllowHosts') || '';        
 | 
			
		||||
     }
 | 
			
		||||
        $pf_datas{cmmnt} = $entry->prop('Comment') || '';
 | 
			
		||||
        $pf_datas{allow} = $entry->prop('AllowHosts') || '';
 | 
			
		||||
    } ## end if ($trt eq 'DEL')
 | 
			
		||||
 | 
			
		||||
    if ( $trt eq 'LIST' ) {
 | 
			
		||||
		#List all the port forwards
 | 
			
		||||
		my @tcpforwards = $tcp_db->get_all;
 | 
			
		||||
		my @udpforwards = $udp_db->get_all;
 | 
			
		||||
		my $empty = 1 if not @tcpforwards and not @udpforwards;
 | 
			
		||||
    if ($trt eq 'LIST') {
 | 
			
		||||
 | 
			
		||||
		$c->stash(
 | 
			
		||||
			tcpforwards =>\@tcpforwards,
 | 
			
		||||
			udpforwards =>\@udpforwards,
 | 
			
		||||
			empty => $empty
 | 
			
		||||
		);
 | 
			
		||||
        #List all the port forwards
 | 
			
		||||
        # Open them again as maybe written to above 
 | 
			
		||||
        $tcp_db = esmith::ConfigDB->open('portforward_tcp') || die "Can't open portforward_tcp database: $!\n";
 | 
			
		||||
		$udp_db = esmith::ConfigDB->open('portforward_udp') || die "Can't open portforward_udp database: $!\n";
 | 
			
		||||
 | 
			
		||||
		#my %forwards = (TCP=>@tcpforwards,UDP=>@udpforwards);
 | 
			
		||||
		#$c->stash(portforwarding => %forwards);
 | 
			
		||||
    }
 | 
			
		||||
        my @tcpforwards = $tcp_db->get_all;
 | 
			
		||||
        my @udpforwards = $udp_db->get_all;
 | 
			
		||||
        my $empty       = 1 if not @tcpforwards and not @udpforwards;
 | 
			
		||||
        $c->stash(
 | 
			
		||||
            tcpforwards => \@tcpforwards,
 | 
			
		||||
            udpforwards => \@udpforwards,
 | 
			
		||||
            empty       => $empty
 | 
			
		||||
        );
 | 
			
		||||
 | 
			
		||||
    $pf_datas{'trt'} = $trt;  
 | 
			
		||||
    $c->stash( title => $title, modul => $modul, pf_datas => \%pf_datas );
 | 
			
		||||
    $c->render( template => 'portforwarding' );
 | 
			
		||||
}
 | 
			
		||||
        #my %forwards = (TCP=>@tcpforwards,UDP=>@udpforwards);
 | 
			
		||||
        #$c->stash(portforwarding => %forwards);
 | 
			
		||||
    } ## end if ($trt eq 'LIST')
 | 
			
		||||
    $pf_datas{'trt'} = $trt;
 | 
			
		||||
    $c->stash(title => $title, modul => $modul, pf_datas => \%pf_datas);
 | 
			
		||||
    $c->render(template => 'portforwarding');
 | 
			
		||||
} ## end sub do_display
 | 
			
		||||
 | 
			
		||||
sub add_portforward {
 | 
			
		||||
	my $c = shift;
 | 
			
		||||
	my $sport = $c->param("sport") || '';
 | 
			
		||||
	my $proto = $c->param("proto") || '';
 | 
			
		||||
	#work out which protocol   	
 | 
			
		||||
	my $fdb;
 | 
			
		||||
	if ($proto eq 'TCP') {
 | 
			
		||||
		$tcp_db = esmith::ConfigDB->open('portforward_tcp') || die "Can't open portforward_tcp database: $!\n";
 | 
			
		||||
		$fdb = $tcp_db;
 | 
			
		||||
	}
 | 
			
		||||
	else {
 | 
			
		||||
		$udp_db = esmith::ConfigDB->open('portforward_udp') || die "Can't open portforward_udp database: $!\n";
 | 
			
		||||
		$fdb = $udp_db;
 | 
			
		||||
	}
 | 
			
		||||
	#Get the other values 
 | 
			
		||||
	my $dport = $c->param("dport");
 | 
			
		||||
	my $dhost = get_destination_host($c);
 | 
			
		||||
	my $cmmnt = $c->param("cmmnt") || "";
 | 
			
		||||
	my $allow = $c->param("allow") || "";
 | 
			
		||||
	my $deny = (($c->param("allow")) ? "0.0.0.0/0" : "");
 | 
			
		||||
	$proto =~ s/^\s+|\s+$//g;
 | 
			
		||||
	$sport =~ s/^\s+|\s+$//g;
 | 
			
		||||
	$dport =~ s/^\s+|\s+$//g;
 | 
			
		||||
	$dhost =~ s/^\s+|\s+$//g;
 | 
			
		||||
	#Validate the values
 | 
			
		||||
	%ret=validate_source_port($c) ; unless (index($ret{ret},"SUCCESS")!= -1) {return %ret;}
 | 
			
		||||
	%ret=validate_allowed_hosts($c) ; if (index($ret{ret},"SUCCESS")== -1) {return %ret;}
 | 
			
		||||
	%ret=validate_destination_port($c) ; if (index($ret{ret},"SUCCESS")== -1) {return %ret;}
 | 
			
		||||
	%ret=validate_destination_host($c) ; if (index($ret{ret},"SUCCESS")== -1) {return %ret;}
 | 
			
		||||
    # and then write it to the DB and tell the exec about it.        
 | 
			
		||||
	my $entry = $fdb->get($sport) || $fdb->new_record($sport, { type => 'forward' });
 | 
			
		||||
	$entry->set_prop('DestHost', $dhost);
 | 
			
		||||
	$entry->set_prop('DestPort', $dport) if $dport;
 | 
			
		||||
	$entry->set_prop('Comment', $cmmnt);
 | 
			
		||||
	$entry->set_prop('AllowHosts', $allow);
 | 
			
		||||
	$entry->set_prop('DenyHosts', $deny);
 | 
			
		||||
	system( "/sbin/e-smith/signal-event", "portforwarding-update") == 0
 | 
			
		||||
      or ( return (ret=>'pf_ERR_NONZERO_RETURN_EVENT' ));
 | 
			
		||||
    my %ret = (ret=>"pf_SUCCESS");
 | 
			
		||||
    my $c     = shift;
 | 
			
		||||
    my $sport = $c->param("sport") || '';
 | 
			
		||||
    my $proto = $c->param("proto") || '';
 | 
			
		||||
 | 
			
		||||
    #work out which protocol
 | 
			
		||||
    my $fdb;
 | 
			
		||||
 | 
			
		||||
    if ($proto eq 'TCP') {
 | 
			
		||||
        $tcp_db = esmith::ConfigDB->open('portforward_tcp') || die "Can't open portforward_tcp database: $!\n";
 | 
			
		||||
        $fdb = $tcp_db;
 | 
			
		||||
    } else {
 | 
			
		||||
        $udp_db = esmith::ConfigDB->open('portforward_udp') || die "Can't open portforward_udp database: $!\n";
 | 
			
		||||
        $fdb = $udp_db;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    #Get the other values
 | 
			
		||||
    my $dport = $c->param("dport");
 | 
			
		||||
    my $dhost = get_destination_host($c);
 | 
			
		||||
    my $cmmnt = $c->param("cmmnt") || "";
 | 
			
		||||
    my $allow = $c->param("allow") || "";
 | 
			
		||||
    my $deny  = (($c->param("allow")) ? "0.0.0.0/0" : "");
 | 
			
		||||
    $proto =~ s/^\s+|\s+$//g;
 | 
			
		||||
    $sport =~ s/^\s+|\s+$//g;
 | 
			
		||||
    $dport =~ s/^\s+|\s+$//g;
 | 
			
		||||
    $dhost =~ s/^\s+|\s+$//g;
 | 
			
		||||
 | 
			
		||||
    #Validate the values
 | 
			
		||||
    %ret = validate_source_port($c);
 | 
			
		||||
    unless (index($ret{ret}, "SUCCESS") != -1) { return %ret; }
 | 
			
		||||
    %ret = validate_allowed_hosts($c);
 | 
			
		||||
    if (index($ret{ret}, "SUCCESS") == -1) { return %ret; }
 | 
			
		||||
    %ret = validate_destination_port($c);
 | 
			
		||||
    if (index($ret{ret}, "SUCCESS") == -1) { return %ret; }
 | 
			
		||||
    %ret = validate_destination_host($c);
 | 
			
		||||
    if (index($ret{ret}, "SUCCESS") == -1) { return %ret; }
 | 
			
		||||
 | 
			
		||||
    # and then write it to the DB and tell the exec about it.
 | 
			
		||||
    my $entry = $fdb->get($sport) || $fdb->new_record($sport, { type => 'forward' });
 | 
			
		||||
    $entry->set_prop('DestHost',   $dhost);
 | 
			
		||||
    $entry->set_prop('DestPort',   $dport) if $dport;
 | 
			
		||||
    $entry->set_prop('Comment',    $cmmnt);
 | 
			
		||||
    $entry->set_prop('AllowHosts', $allow);
 | 
			
		||||
    $entry->set_prop('DenyHosts',  $deny);
 | 
			
		||||
    system("/sbin/e-smith/signal-event", "portforwarding-update") == 0
 | 
			
		||||
        or (return (ret => 'pf_ERR_NONZERO_RETURN_EVENT'));
 | 
			
		||||
    my %ret = (ret => "pf_SUCCESS");
 | 
			
		||||
    return %ret;
 | 
			
		||||
    
 | 
			
		||||
}
 | 
			
		||||
} ## end sub add_portforward
 | 
			
		||||
 | 
			
		||||
sub get_destination_host
 | 
			
		||||
{
 | 
			
		||||
    my $q = shift;
 | 
			
		||||
    my $dhost = $q->param("dhost");
 | 
			
		||||
    my $localip = $db->get_prop('InternalInterface', 'IPAddress');
 | 
			
		||||
    my $external_ip = $db->get_prop('ExternalInterface', 'IPAddress') || $localip;
 | 
			
		||||
sub get_destination_host {
 | 
			
		||||
    my $q           = shift;
 | 
			
		||||
	$cdb = esmith::ConfigDB->open || die "Can't open configuration database: $!\n";
 | 
			
		||||
    my $dhost       = $q->param("dhost");
 | 
			
		||||
    my $localip     = $cdb->get_prop('InternalInterface', 'IPAddress');
 | 
			
		||||
    my $external_ip = $cdb->get_prop('ExternalInterface', 'IPAddress') || $localip;
 | 
			
		||||
 | 
			
		||||
    if ($dhost =~ /^(127.0.0.1|$localip|$external_ip)$/i) {
 | 
			
		||||
 | 
			
		||||
    if ($dhost =~ /^(127.0.0.1|$localip|$external_ip)$/i)
 | 
			
		||||
    {
 | 
			
		||||
        # localhost token gets expanded at runtime to current external IP
 | 
			
		||||
        $dhost = 'localhost';
 | 
			
		||||
    }
 | 
			
		||||
    } ## end if ($dhost =~ /^(127.0.0.1|$localip|$external_ip)$/i)
 | 
			
		||||
    return $dhost;
 | 
			
		||||
}
 | 
			
		||||
} ## end sub get_destination_host
 | 
			
		||||
 | 
			
		||||
sub validate_source_port {
 | 
			
		||||
    my $q = shift;
 | 
			
		||||
    my $q     = shift;
 | 
			
		||||
    my $sport = $q->param('sport');
 | 
			
		||||
    $sport =~ s/^\s+|\s+$//g;
 | 
			
		||||
 | 
			
		||||
    # If this is a port range, split it up and validate it individually.
 | 
			
		||||
    my @ports = ();
 | 
			
		||||
    if ($sport =~ /-/)
 | 
			
		||||
    {
 | 
			
		||||
 | 
			
		||||
    if ($sport =~ /-/) {
 | 
			
		||||
        @ports = split /-/, $sport;
 | 
			
		||||
        if (@ports > 2)
 | 
			
		||||
        {
 | 
			
		||||
 | 
			
		||||
        if (@ports > 2) {
 | 
			
		||||
 | 
			
		||||
            #$self->debug_msg("found more than 2 ports: @ports");
 | 
			
		||||
            return (ret=>'pf_ERR_BADPORT');
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    else
 | 
			
		||||
    {
 | 
			
		||||
            return (ret => 'pf_ERR_BADPORT');
 | 
			
		||||
        } ## end if (@ports > 2)
 | 
			
		||||
    } else {
 | 
			
		||||
        push @ports, $sport;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    #$self->debug_msg("the ports array is: @ports");
 | 
			
		||||
    foreach my $port (@ports)
 | 
			
		||||
    {
 | 
			
		||||
    foreach my $port (@ports) {
 | 
			
		||||
 | 
			
		||||
        #$self->debug_msg("looping on port $port");
 | 
			
		||||
        if (! isValidPort($port))
 | 
			
		||||
        {
 | 
			
		||||
        if (!isValidPort($port)) {
 | 
			
		||||
 | 
			
		||||
            #$self->debug_msg("returning: " . $self->localise('ERR_BADPORT'));
 | 
			
		||||
            return (ret=>'pf_ERR_BADPORT');
 | 
			
		||||
            return (ret => 'pf_ERR_BADPORT');
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    # Now, lets screen any duplicates. 
 | 
			
		||||
    } ## end foreach my $port (@ports)
 | 
			
		||||
 | 
			
		||||
    # Now, lets screen any duplicates.
 | 
			
		||||
    my $protocol = $q->param('protocol');
 | 
			
		||||
    my @forwards = ();
 | 
			
		||||
 | 
			
		||||
@@ -261,152 +269,136 @@ sub validate_source_port {
 | 
			
		||||
    } elsif ($protocol eq 'UDP') {
 | 
			
		||||
        @forwards = map { $_->key } $udp_db->get_all;
 | 
			
		||||
    }
 | 
			
		||||
    foreach my $psport (@forwards)
 | 
			
		||||
    {
 | 
			
		||||
        if (detect_collision($sport, $psport))
 | 
			
		||||
        {
 | 
			
		||||
            return (ret=>'pf_ERR_PORT_COLLISION');
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    return (ret=>"pf_SUCCESS");
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub detect_collision
 | 
			
		||||
{
 | 
			
		||||
    foreach my $psport (@forwards) {
 | 
			
		||||
        if (detect_collision($sport, $psport)) {
 | 
			
		||||
            return (ret => 'pf_ERR_PORT_COLLISION');
 | 
			
		||||
        }
 | 
			
		||||
    } ## end foreach my $psport (@forwards)
 | 
			
		||||
    return (ret => "pf_SUCCESS");
 | 
			
		||||
} ## end sub validate_source_port
 | 
			
		||||
 | 
			
		||||
sub detect_collision {
 | 
			
		||||
    my $port_a = shift;
 | 
			
		||||
    my $port_b = shift;
 | 
			
		||||
    
 | 
			
		||||
 | 
			
		||||
    # If they're both single ports, see if they're the same.
 | 
			
		||||
    if (($port_a !~ /-/) && ($port_b !~ /-/))
 | 
			
		||||
    {
 | 
			
		||||
    if (($port_a !~ /-/) && ($port_b !~ /-/)) {
 | 
			
		||||
        return $port_a eq $port_b;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    # If port_a is not a range but port_b is, is a in b?
 | 
			
		||||
    elsif ($port_a !~ /-/)
 | 
			
		||||
    {
 | 
			
		||||
    elsif ($port_a !~ /-/) {
 | 
			
		||||
        my ($b1, $b2) = split /-/, $port_b;
 | 
			
		||||
        return (($port_a >= $b1) && ($port_a <= $b2));
 | 
			
		||||
    }
 | 
			
		||||
    elsif ($port_b !~ /-/)
 | 
			
		||||
    {
 | 
			
		||||
    } elsif ($port_b !~ /-/) {
 | 
			
		||||
        my ($a1, $a2) = split /-/, $port_a;
 | 
			
		||||
        return (($port_b >= $a1) && ($port_b <= $a2));
 | 
			
		||||
    }
 | 
			
		||||
    else
 | 
			
		||||
    {
 | 
			
		||||
    } else {
 | 
			
		||||
 | 
			
		||||
        # They're both ranges. Do they overlap?
 | 
			
		||||
        my ($a1, $a2) = split /-/, $port_a;
 | 
			
		||||
        my ($b1, $b2) = split /-/, $port_b;
 | 
			
		||||
 | 
			
		||||
        # They can overlap in two ways. Either a1 is in b, or b1 is in a.
 | 
			
		||||
        if (($a1 >= $b1) && ($a1 <= $b2))
 | 
			
		||||
        {
 | 
			
		||||
        if (($a1 >= $b1) && ($a1 <= $b2)) {
 | 
			
		||||
            return TRUE;
 | 
			
		||||
        }
 | 
			
		||||
        elsif (($b1 >= $a1) && ($b1 <= $a2))
 | 
			
		||||
        {
 | 
			
		||||
        } elsif (($b1 >= $a1) && ($b1 <= $a2)) {
 | 
			
		||||
            return TRUE;
 | 
			
		||||
        }
 | 
			
		||||
        return FALSE;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
    } ## end else [ if (($port_a !~ /-/) &&...)]
 | 
			
		||||
} ## end sub detect_collision
 | 
			
		||||
 | 
			
		||||
sub validate_destination_port {
 | 
			
		||||
    my $c = shift;
 | 
			
		||||
    my $c     = shift;
 | 
			
		||||
    my $dport = $c->param('dport');
 | 
			
		||||
    $dport =~ s/^\s+|\s+$//g;
 | 
			
		||||
    # If the dport is empty, that's ok. 
 | 
			
		||||
    return (ret=>'pf_SUCCESS') if not $dport;
 | 
			
		||||
 | 
			
		||||
    # If the dport is empty, that's ok.
 | 
			
		||||
    return (ret => 'pf_SUCCESS') if not $dport;
 | 
			
		||||
 | 
			
		||||
    # If this is a port range, split it up and validate it individually.
 | 
			
		||||
    my @ports = ();
 | 
			
		||||
    if ($dport =~ /-/)
 | 
			
		||||
    {
 | 
			
		||||
 | 
			
		||||
    if ($dport =~ /-/) {
 | 
			
		||||
        @ports = split /-/, $dport;
 | 
			
		||||
        if (@ports > 2)
 | 
			
		||||
        {
 | 
			
		||||
 | 
			
		||||
        if (@ports > 2) {
 | 
			
		||||
 | 
			
		||||
            #$self->debug_msg("found more than 2 ports: @ports");
 | 
			
		||||
            return (ret=>'pf_ERR_BADPORT');
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    else
 | 
			
		||||
    {
 | 
			
		||||
            return (ret => 'pf_ERR_BADPORT');
 | 
			
		||||
        } ## end if (@ports > 2)
 | 
			
		||||
    } else {
 | 
			
		||||
        push @ports, $dport;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    #$self->debug_msg("the ports array is: @ports");
 | 
			
		||||
    foreach my $port (@ports) {
 | 
			
		||||
 | 
			
		||||
    foreach my $port (@ports)
 | 
			
		||||
    {
 | 
			
		||||
        #$self->debug_msg("looping on port $port");
 | 
			
		||||
        if (! isValidPort($port))
 | 
			
		||||
        {
 | 
			
		||||
            #$self->debug_msg("returning: " . $self->localise('ERR_BADPORT'));
 | 
			
		||||
            return (ret=>'pf_ERR_BADPORT');
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    return (ret=>'pf_SUCCESS');
 | 
			
		||||
}
 | 
			
		||||
        if (!isValidPort($port)) {
 | 
			
		||||
 | 
			
		||||
            #$self->debug_msg("returning: " . $self->localise('ERR_BADPORT'));
 | 
			
		||||
            return (ret => 'pf_ERR_BADPORT');
 | 
			
		||||
        }
 | 
			
		||||
    } ## end foreach my $port (@ports)
 | 
			
		||||
    return (ret => 'pf_SUCCESS');
 | 
			
		||||
} ## end sub validate_destination_port
 | 
			
		||||
 | 
			
		||||
sub isValidPort() {
 | 
			
		||||
    my $port = shift;
 | 
			
		||||
 | 
			
		||||
    return FALSE unless defined $port;
 | 
			
		||||
 | 
			
		||||
    if (($port =~ /^\d+$/) &&
 | 
			
		||||
        ($port > 0) &&
 | 
			
		||||
        ($port < 65536))
 | 
			
		||||
    if (   ($port =~ /^\d+$/)
 | 
			
		||||
        && ($port > 0)
 | 
			
		||||
        && ($port < 65536))
 | 
			
		||||
    {
 | 
			
		||||
        return TRUE;
 | 
			
		||||
    }
 | 
			
		||||
    else {
 | 
			
		||||
    } else {
 | 
			
		||||
        return FALSE;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
} ## end sub isValidPort
 | 
			
		||||
 | 
			
		||||
sub validate_destination_host {
 | 
			
		||||
    my $c = shift;
 | 
			
		||||
    my $c     = shift;
 | 
			
		||||
	$cdb = esmith::ConfigDB->open || die "Can't open configuration database: $!\n";
 | 
			
		||||
    my $dhost = $c->param('dhost');
 | 
			
		||||
    $dhost =~ s/^\s+|\s+$//g;
 | 
			
		||||
    my $localip = $cdb->get_prop('InternalInterface', 'IPAddress');
 | 
			
		||||
    my $external_ip = $cdb->get_prop('ExternalInterface', 'IPAddress') || $localip;
 | 
			
		||||
 | 
			
		||||
    my $localip = $db->get_prop('InternalInterface', 'IPAddress');
 | 
			
		||||
    my $external_ip = $db->get_prop('ExternalInterface', 'IPAddress') || $localip;
 | 
			
		||||
    if ($dhost =~ /^(localhost|127.0.0.1|$localip|$external_ip)$/i) {
 | 
			
		||||
 | 
			
		||||
    if ($dhost =~ /^(localhost|127.0.0.1|$localip|$external_ip)$/i)
 | 
			
		||||
    {
 | 
			
		||||
        # localhost token gets expanded at runtime to current external IP
 | 
			
		||||
        $c->param(-name=>'dhost', -value=>'localhost');
 | 
			
		||||
        return (ret=>'pf_SUCCESS');
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    my $systemmode = $db->get_value('SystemMode');
 | 
			
		||||
        $c->param(-name => 'dhost', -value => 'localhost');
 | 
			
		||||
        return (ret => 'pf_SUCCESS');
 | 
			
		||||
    } ## end if ($dhost =~ /^(localhost|127.0.0.1|$localip|$external_ip)$/i)
 | 
			
		||||
    my $systemmode = $cdb->get_value('SystemMode');
 | 
			
		||||
 | 
			
		||||
    if ($systemmode eq 'serveronly') {
 | 
			
		||||
        return (ret=>'pf_IN_SERVERONLY');
 | 
			
		||||
        return (ret => 'pf_IN_SERVERONLY');
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if (isValidIP($dhost)) {
 | 
			
		||||
        return (ret=>'pf_SUCCESS');
 | 
			
		||||
        return (ret => 'pf_SUCCESS');
 | 
			
		||||
    } else {
 | 
			
		||||
        return (ret => 'pf_ERR_BADIP');
 | 
			
		||||
    }
 | 
			
		||||
    else {
 | 
			
		||||
        return (ret=>'pf_ERR_BADIP');
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
} ## end sub validate_destination_host
 | 
			
		||||
 | 
			
		||||
sub validate_allowed_hosts {
 | 
			
		||||
    my $c = shift;
 | 
			
		||||
    my $c     = shift;
 | 
			
		||||
    my $ahost = $c->param('allow');
 | 
			
		||||
    $ahost =~ s/^\s+|\s+$//g;
 | 
			
		||||
 | 
			
		||||
    my %valid_ahost_list = (ret=>"pf_SUCCESS");
 | 
			
		||||
    my %valid_ahost_list = (ret => "pf_SUCCESS");
 | 
			
		||||
 | 
			
		||||
    foreach (split(/[\s,]+/, $ahost)) {
 | 
			
		||||
        my $valid_ipnet = 0;
 | 
			
		||||
        $valid_ipnet = 1 if ($_ =~ m/^\d+\.\d+\.\d+\.\d+$/);
 | 
			
		||||
        $valid_ipnet = 1 if ($_ =~ m/^\d+\.\d+\.\d+\.\d+\/\d+$/);
 | 
			
		||||
        %valid_ahost_list = (ret=>"pf_ERR_BADAHOST") if ($valid_ipnet != 1);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
        %valid_ahost_list = (ret => "pf_ERR_BADAHOST") if ($valid_ipnet != 1);
 | 
			
		||||
    } ## end foreach (split(/[\s,]+/, $ahost...))
 | 
			
		||||
    return %valid_ahost_list;
 | 
			
		||||
}
 | 
			
		||||
1;
 | 
			
		||||
} ## end sub validate_allowed_hosts
 | 
			
		||||
1;
 | 
			
		||||
@@ -11,236 +11,201 @@ package SrvMngr::Controller::Printers;
 | 
			
		||||
use strict;
 | 
			
		||||
use warnings;
 | 
			
		||||
use Mojo::Base 'Mojolicious::Controller';
 | 
			
		||||
 | 
			
		||||
use Locale::gettext;
 | 
			
		||||
use SrvMngr::I18N;
 | 
			
		||||
 | 
			
		||||
use SrvMngr qw(theme_list init_session);
 | 
			
		||||
 | 
			
		||||
use esmith::FormMagick::Panel::printers;
 | 
			
		||||
 | 
			
		||||
our $adb = esmith::AccountsDB->open || die "Couldn't open accounts db";
 | 
			
		||||
#our $adb = esmith::AccountsDB->open || die "Couldn't open accounts db";
 | 
			
		||||
my $adb;
 | 
			
		||||
 | 
			
		||||
sub main {
 | 
			
		||||
 | 
			
		||||
    my $c = shift;
 | 
			
		||||
    $c->app->log->info($c->log_req);
 | 
			
		||||
 | 
			
		||||
    my %prt_datas = ();
 | 
			
		||||
    my $title = $c->l('prt_FORM_TITLE');
 | 
			
		||||
 | 
			
		||||
    my $title     = $c->l('prt_FORM_TITLE');
 | 
			
		||||
	$adb = esmith::AccountsDB->open || die "Couldn't open accounts db";
 | 
			
		||||
    $prt_datas{'trt'} = 'LIST';
 | 
			
		||||
 | 
			
		||||
    my @printerDrivers;
 | 
			
		||||
    if ($adb)
 | 
			
		||||
    {
 | 
			
		||||
 | 
			
		||||
    if ($adb) {
 | 
			
		||||
        @printerDrivers = $adb->printers();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    $c->stash( title => $title, prt_datas => \%prt_datas, printerDrivers => \@printerDrivers );
 | 
			
		||||
    $c->stash(title => $title, prt_datas => \%prt_datas, printerDrivers => \@printerDrivers);
 | 
			
		||||
    $c->render(template => 'printers');
 | 
			
		||||
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
} ## end sub main
 | 
			
		||||
 | 
			
		||||
sub do_display {
 | 
			
		||||
 | 
			
		||||
    my $c = shift;
 | 
			
		||||
 | 
			
		||||
    my $rt = $c->current_route;
 | 
			
		||||
    my $trt = ($c->param('trt') || 'LIST');
 | 
			
		||||
    my $c       = shift;
 | 
			
		||||
    my $rt      = $c->current_route;
 | 
			
		||||
    my $trt     = ($c->param('trt') || 'LIST');
 | 
			
		||||
    my $printer = $c->param('printer') || '';
 | 
			
		||||
	$adb = esmith::AccountsDB->open || die "Couldn't open accounts db";
 | 
			
		||||
 | 
			
		||||
    #$trt = 'DEL' if ( $printer );
 | 
			
		||||
    #$trt = 'ADD' if ( $rt eq 'printeradd' );
 | 
			
		||||
 | 
			
		||||
    my %prt_datas = ();
 | 
			
		||||
    my $title = $c->l('prt_FORM_TITLE');
 | 
			
		||||
 | 
			
		||||
    my $title     = $c->l('prt_FORM_TITLE');
 | 
			
		||||
    $prt_datas{'trt'} = $trt;
 | 
			
		||||
 | 
			
		||||
        if ( $trt eq 'ADD' ) {
 | 
			
		||||
    if ($trt eq 'ADD') {
 | 
			
		||||
 | 
			
		||||
	# nothing
 | 
			
		||||
        # nothing
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if ($trt eq 'DEL') {
 | 
			
		||||
        my $rec = $adb->get($printer);
 | 
			
		||||
 | 
			
		||||
        if ($rec and $rec->prop('type') eq 'printer') {
 | 
			
		||||
            $prt_datas{printer} = $printer;
 | 
			
		||||
            $prt_datas{description} = $rec->prop('Description') || '';
 | 
			
		||||
        }
 | 
			
		||||
    } ## end if ($trt eq 'DEL')
 | 
			
		||||
 | 
			
		||||
        if ( $trt eq 'DEL' ) {
 | 
			
		||||
 | 
			
		||||
	    my $rec = $adb->get($printer);
 | 
			
		||||
	    if ($rec and $rec->prop('type') eq 'printer') {
 | 
			
		||||
    		$prt_datas{printer} = $printer;
 | 
			
		||||
    		$prt_datas{description} = $rec->prop('Description') || '';
 | 
			
		||||
	    }
 | 
			
		||||
    if ($trt eq 'LIST') {
 | 
			
		||||
        my @printerDrivers;
 | 
			
		||||
 | 
			
		||||
        if ($adb) {
 | 
			
		||||
            @printerDrivers = $adb->printers();
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        if ( $trt eq 'LIST' ) {
 | 
			
		||||
	    my @printerDrivers;
 | 
			
		||||
	    if ($adb)
 | 
			
		||||
	    {
 | 
			
		||||
    		@printerDrivers = $adb->printers();
 | 
			
		||||
	    }
 | 
			
		||||
            $c->stash( printerDrivers => \@printerDrivers );
 | 
			
		||||
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
    $c->stash( title => $title, prt_datas => \%prt_datas );
 | 
			
		||||
    $c->render( template => 'printers' );
 | 
			
		||||
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
        $c->stash(printerDrivers => \@printerDrivers);
 | 
			
		||||
    } ## end if ($trt eq 'LIST')
 | 
			
		||||
    $c->stash(title => $title, prt_datas => \%prt_datas);
 | 
			
		||||
    $c->render(template => 'printers');
 | 
			
		||||
} ## end sub do_display
 | 
			
		||||
 | 
			
		||||
sub do_update {
 | 
			
		||||
 | 
			
		||||
    my $c = shift;
 | 
			
		||||
    $c->app->log->info($c->log_req);
 | 
			
		||||
 | 
			
		||||
    my $rt = $c->current_route;
 | 
			
		||||
    my $trt = ($c->param('trt') || 'LIST');
 | 
			
		||||
 | 
			
		||||
    my $rt        = $c->current_route;
 | 
			
		||||
    my $trt       = ($c->param('trt') || 'LIST');
 | 
			
		||||
    my %prt_datas = ();
 | 
			
		||||
    my $title = $c->l('prt_FORM_TITLE');
 | 
			
		||||
    my $title     = $c->l('prt_FORM_TITLE');
 | 
			
		||||
   	$adb = esmith::AccountsDB->open || die "Couldn't open accounts db";
 | 
			
		||||
    $prt_datas{'trt'} = $trt;
 | 
			
		||||
 | 
			
		||||
    my ($res, $result) = '';
 | 
			
		||||
 | 
			
		||||
    if ( $trt eq 'ADD' ) {
 | 
			
		||||
 | 
			
		||||
	my $name = ($c->param('Name') || '');
 | 
			
		||||
    if ($trt eq 'ADD') {
 | 
			
		||||
        my $name        = ($c->param('Name')        || '');
 | 
			
		||||
        my $description = ($c->param('Description') || '');
 | 
			
		||||
        my $location = ($c->param('Location') || '');
 | 
			
		||||
        my $location    = ($c->param('Location')    || '');
 | 
			
		||||
 | 
			
		||||
	# controls
 | 
			
		||||
	$res = $c->validate_printer( $name, $description, $location );
 | 
			
		||||
	$result .= $res unless $res eq 'OK';
 | 
			
		||||
        # controls
 | 
			
		||||
        $res = $c->validate_printer($name, $description, $location);
 | 
			
		||||
        $result .= $res unless $res eq 'OK';
 | 
			
		||||
 | 
			
		||||
	if ( $location eq 'remote' and ! $result) {
 | 
			
		||||
	    $prt_datas{'trt'} = 'NET';
 | 
			
		||||
	    $prt_datas{'name'} = $name;
 | 
			
		||||
	    $prt_datas{'description'} = $description;
 | 
			
		||||
	    $prt_datas{'location'} = $location;
 | 
			
		||||
	    $c->stash( title => $title, prt_datas => \%prt_datas );
 | 
			
		||||
	    return $c->render( template => 'printers' );
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
	$res = '';
 | 
			
		||||
	if ( ! $result ) {
 | 
			
		||||
	    $res = $c->new_printer( $name, $description, $location ); 
 | 
			
		||||
	    #$remoteName, $address );
 | 
			
		||||
	    $result .= $res unless $res eq 'OK';
 | 
			
		||||
	    if ( ! $result ) { 
 | 
			
		||||
		$result = $c->l('prt_CREATED_SUCCESSFULLY') . ' ' . $name; 
 | 
			
		||||
	    }
 | 
			
		||||
	}
 | 
			
		||||
    }
 | 
			
		||||
        if ($location eq 'remote' and !$result) {
 | 
			
		||||
            $prt_datas{'trt'}         = 'NET';
 | 
			
		||||
            $prt_datas{'name'}        = $name;
 | 
			
		||||
            $prt_datas{'description'} = $description;
 | 
			
		||||
            $prt_datas{'location'}    = $location;
 | 
			
		||||
            $c->stash(title => $title, prt_datas => \%prt_datas);
 | 
			
		||||
            return $c->render(template => 'printers');
 | 
			
		||||
        } ## end if ($location eq 'remote'...)
 | 
			
		||||
        $res = '';
 | 
			
		||||
 | 
			
		||||
    if ( $trt eq 'NET' ) {
 | 
			
		||||
        if (!$result) {
 | 
			
		||||
            $res = $c->new_printer($name, $description, $location);
 | 
			
		||||
 | 
			
		||||
	my $name = ($c->param('Name') || '');
 | 
			
		||||
            #$remoteName, $address );
 | 
			
		||||
            $result .= $res unless $res eq 'OK';
 | 
			
		||||
 | 
			
		||||
            if (!$result) {
 | 
			
		||||
                $result = $c->l('prt_CREATED_SUCCESSFULLY') . ' ' . $name;
 | 
			
		||||
            }
 | 
			
		||||
        } ## end if (!$result)
 | 
			
		||||
    } ## end if ($trt eq 'ADD')
 | 
			
		||||
 | 
			
		||||
    if ($trt eq 'NET') {
 | 
			
		||||
        my $name        = ($c->param('Name')        || '');
 | 
			
		||||
        my $description = ($c->param('Description') || '');
 | 
			
		||||
        my $location = ($c->param('Location') || '');
 | 
			
		||||
	my $remoteName = ($c->param ('RemoteName') || '');
 | 
			
		||||
	my $address = ($c->param ('Address') || '');
 | 
			
		||||
        my $location    = ($c->param('Location')    || '');
 | 
			
		||||
        my $remoteName  = ($c->param('RemoteName')  || '');
 | 
			
		||||
        my $address     = ($c->param('Address')     || '');
 | 
			
		||||
        $prt_datas{'name'}        = $name;
 | 
			
		||||
        $prt_datas{'description'} = $description;
 | 
			
		||||
        $prt_datas{'location'}    = $location;
 | 
			
		||||
 | 
			
		||||
	$prt_datas{'name'} = $name;
 | 
			
		||||
	$prt_datas{'description'} = $description;
 | 
			
		||||
	$prt_datas{'location'} = $location;
 | 
			
		||||
        # controls
 | 
			
		||||
        $res = $c->validate_network($location, $remoteName, $address);
 | 
			
		||||
        $result .= $res unless $res eq 'OK';
 | 
			
		||||
        $res = '';
 | 
			
		||||
 | 
			
		||||
	# controls
 | 
			
		||||
	$res = $c->validate_network( $location, $remoteName, $address);
 | 
			
		||||
	$result .= $res unless $res eq 'OK';
 | 
			
		||||
        if (!$result) {
 | 
			
		||||
            $res = $c->new_printer($name, $description, $location, $remoteName, $address);
 | 
			
		||||
            $result .= $res unless $res eq 'OK';
 | 
			
		||||
 | 
			
		||||
	$res = '';
 | 
			
		||||
	if ( ! $result ) {
 | 
			
		||||
	    $res = $c->new_printer( $name, $description, $location, $remoteName, $address );
 | 
			
		||||
	    $result .= $res unless $res eq 'OK';
 | 
			
		||||
	    if ( ! $result ) { 
 | 
			
		||||
		$result = $c->l('prt_CREATED_SUCCESSFULLY') . ' ' . $name; 
 | 
			
		||||
	    }
 | 
			
		||||
	}
 | 
			
		||||
    }
 | 
			
		||||
            if (!$result) {
 | 
			
		||||
                $result = $c->l('prt_CREATED_SUCCESSFULLY') . ' ' . $name;
 | 
			
		||||
            }
 | 
			
		||||
        } ## end if (!$result)
 | 
			
		||||
    } ## end if ($trt eq 'NET')
 | 
			
		||||
 | 
			
		||||
    if ( $trt eq 'DEL' ) {
 | 
			
		||||
    
 | 
			
		||||
	my $printer = ($c->param ('printer') || '');
 | 
			
		||||
    if ($trt eq 'DEL') {
 | 
			
		||||
        my $printer = ($c->param('printer') || '');
 | 
			
		||||
 | 
			
		||||
	if ($printer =~ /^([a-z][a-z0-9]*)$/) {
 | 
			
		||||
    	    $printer = $1;
 | 
			
		||||
	} else {
 | 
			
		||||
    	    $result .= $c->l('prt_ERR_INTERNAL_FAILURE') . ':' . $printer;
 | 
			
		||||
	}
 | 
			
		||||
        if ($printer =~ /^([a-z][a-z0-9]*)$/) {
 | 
			
		||||
            $printer = $1;
 | 
			
		||||
        } else {
 | 
			
		||||
            $result .= $c->l('prt_ERR_INTERNAL_FAILURE') . ':' . $printer;
 | 
			
		||||
        }
 | 
			
		||||
        my $rec = $adb->get($printer);
 | 
			
		||||
        $result .= $c->l('prt_ERR_INTERNAL_FAILURE') . ':' . $printer unless ($rec);
 | 
			
		||||
        $res = '';
 | 
			
		||||
 | 
			
		||||
	my $rec = $adb->get($printer);
 | 
			
		||||
	$result .= $c->l('prt_ERR_INTERNAL_FAILURE') . ':' . $printer unless ($rec);
 | 
			
		||||
        if (!$result) {
 | 
			
		||||
            $res = $c->del_printer($printer);
 | 
			
		||||
            $result .= $res unless $res eq 'OK';
 | 
			
		||||
 | 
			
		||||
	$res = '';
 | 
			
		||||
	if ( ! $result ) {
 | 
			
		||||
	    $res = $c->del_printer( $printer );
 | 
			
		||||
	    $result .= $res unless $res eq 'OK';
 | 
			
		||||
	    if ( ! $result ) { 
 | 
			
		||||
		$result = $c->l('prt_DELETED_SUCCESSFULLY') . ' ' . $printer; 
 | 
			
		||||
	    }
 | 
			
		||||
	}
 | 
			
		||||
    }
 | 
			
		||||
            if (!$result) {
 | 
			
		||||
                $result = $c->l('prt_DELETED_SUCCESSFULLY') . ' ' . $printer;
 | 
			
		||||
            }
 | 
			
		||||
        } ## end if (!$result)
 | 
			
		||||
    } ## end if ($trt eq 'DEL')
 | 
			
		||||
 | 
			
		||||
    # common parts
 | 
			
		||||
 | 
			
		||||
    if ($res ne 'OK') {
 | 
			
		||||
	$c->stash( error => $result );
 | 
			
		||||
	$c->stash( title => $title, prt_datas => \%prt_datas );
 | 
			
		||||
	return $c->render('printers');
 | 
			
		||||
        $c->stash(error => $result);
 | 
			
		||||
        $c->stash(title => $title, prt_datas => \%prt_datas);
 | 
			
		||||
        return $c->render('printers');
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    my $message = "'Printers' updates ($trt) DONE";
 | 
			
		||||
    $c->app->log->info($message);
 | 
			
		||||
    $c->flash( success => $result );
 | 
			
		||||
    $c->flash(success => $result);
 | 
			
		||||
 | 
			
		||||
    #$c->flash( error => 'No changes applied !!' );	# for testing purpose
 | 
			
		||||
 | 
			
		||||
    $c->redirect_to('/printers');
 | 
			
		||||
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
} ## end sub do_update
 | 
			
		||||
 | 
			
		||||
sub del_printer {
 | 
			
		||||
 | 
			
		||||
    my ( $c, $printer ) = @_;
 | 
			
		||||
    my ($c, $printer) = @_;
 | 
			
		||||
 | 
			
		||||
    # Update the db account (1)
 | 
			
		||||
    my $rec = $adb->get($printer);
 | 
			
		||||
    
 | 
			
		||||
    $rec->set_prop('type', 'printer-deleted');
 | 
			
		||||
    system ("/sbin/e-smith/signal-event printer-delete $printer") == 0
 | 
			
		||||
            or return $c->error('ERR_DELETING');
 | 
			
		||||
 | 
			
		||||
    system("/sbin/e-smith/signal-event printer-delete $printer") == 0
 | 
			
		||||
        or return $c->error('ERR_DELETING');
 | 
			
		||||
    $rec->delete();
 | 
			
		||||
 | 
			
		||||
    return 'OK';
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
} ## end sub del_printer
 | 
			
		||||
 | 
			
		||||
sub validate_printer {
 | 
			
		||||
 | 
			
		||||
    my ($c, $name, $description, $location, $remoteName, $address ) = @_;
 | 
			
		||||
    my ($c, $name, $description, $location, $remoteName, $address) = @_;
 | 
			
		||||
 | 
			
		||||
    #------------------------------------------------------------
 | 
			
		||||
    # Validate parameters and untaint them
 | 
			
		||||
    #------------------------------------------------------------
 | 
			
		||||
 | 
			
		||||
    if ($name =~ /^([a-z][a-z0-9]*)$/)  {
 | 
			
		||||
    if ($name =~ /^([a-z][a-z0-9]*)$/) {
 | 
			
		||||
        $name = $1;
 | 
			
		||||
    } else  {
 | 
			
		||||
    } else {
 | 
			
		||||
        return $c->l('prt_ERR_UNEXPECTED_NAME') . ': ' . $name;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if ($description =~ /^([\'\w\s]+)$/) {
 | 
			
		||||
        $description = $1; 
 | 
			
		||||
        $description = $1;
 | 
			
		||||
    } else {
 | 
			
		||||
        return $c->l('prt_ERR_UNEXPECTED_DESC') . ': ' . $description;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if ($location =~ /^(lp[0-9]+|remote|usb\/lp[0-9]+)$/){
 | 
			
		||||
    if ($location =~ /^(lp[0-9]+|remote|usb\/lp[0-9]+)$/) {
 | 
			
		||||
        $location = $1;
 | 
			
		||||
    } else {
 | 
			
		||||
        $location = "lp0";
 | 
			
		||||
@@ -249,26 +214,22 @@ sub validate_printer {
 | 
			
		||||
    #------------------------------------------------------------
 | 
			
		||||
    # Looks good. Find out if this printer has been taken
 | 
			
		||||
    #------------------------------------------------------------
 | 
			
		||||
 | 
			
		||||
    my $rec = $adb->get($name);
 | 
			
		||||
    my $type;
 | 
			
		||||
 | 
			
		||||
    if ($rec and ($type = $rec->prop('type'))) {
 | 
			
		||||
        return $c->l('prt_ERR_EXISTS') . ' : ' . $name;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return 'OK';
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
} ## end sub validate_printer
 | 
			
		||||
 | 
			
		||||
sub validate_network {
 | 
			
		||||
 | 
			
		||||
    my ($c, $location, $remoteName, $address ) = @_;
 | 
			
		||||
    my ($c, $location, $remoteName, $address) = @_;
 | 
			
		||||
 | 
			
		||||
    if ($location eq 'remote') {
 | 
			
		||||
        my $msg = hostname_or_ip2($c, $address);
 | 
			
		||||
        return $msg unless $msg eq 'OK';
 | 
			
		||||
 | 
			
		||||
	my $msg = hostname_or_ip2 ( $c, $address );
 | 
			
		||||
	return $msg unless $msg eq 'OK';
 | 
			
		||||
	
 | 
			
		||||
        if ($address =~ /^([a-zA-Z0-9\.\-]+)$/) {
 | 
			
		||||
            $address = $1;
 | 
			
		||||
        } else {
 | 
			
		||||
@@ -280,82 +241,63 @@ sub validate_network {
 | 
			
		||||
        } else {
 | 
			
		||||
            return $c->l('prt_ERR_INVALID_REMOTE_NAME') . ' : ' . $remoteName;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    } ## end if ($location eq 'remote')
 | 
			
		||||
    return 'OK';
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
} ## end sub validate_network
 | 
			
		||||
 | 
			
		||||
sub new_printer {
 | 
			
		||||
 | 
			
		||||
    my ($c, $name, $description, $location, $remoteName, $address ) = @_;
 | 
			
		||||
    my ($c, $name, $description, $location, $remoteName, $address) = @_;
 | 
			
		||||
 | 
			
		||||
    #------------------------------------------------------------
 | 
			
		||||
    # Printer name is available! Update printers database and 
 | 
			
		||||
    # Printer name is available! Update printers database and
 | 
			
		||||
    # signal the create-printer event.
 | 
			
		||||
    #------------------------------------------------------------
 | 
			
		||||
 | 
			
		||||
    my $result = '';
 | 
			
		||||
 | 
			
		||||
    my $rec = $adb->new_record($name, 
 | 
			
		||||
        {type=>'printer',
 | 
			
		||||
        Description => $description,
 | 
			
		||||
        Address => $address,
 | 
			
		||||
        RemoteName => $remoteName,
 | 
			
		||||
        Location => $location});
 | 
			
		||||
 | 
			
		||||
    system ("/sbin/e-smith/signal-event printer-create $name") == 0
 | 
			
		||||
            or return $c->error('ERR_CREATING');
 | 
			
		||||
 | 
			
		||||
    return 'OK',
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
    my $rec    = $adb->new_record(
 | 
			
		||||
        $name,
 | 
			
		||||
        {   type        => 'printer',
 | 
			
		||||
            Description => $description,
 | 
			
		||||
            Address     => $address,
 | 
			
		||||
            RemoteName  => $remoteName,
 | 
			
		||||
            Location    => $location
 | 
			
		||||
        }
 | 
			
		||||
    );
 | 
			
		||||
    system("/sbin/e-smith/signal-event printer-create $name") == 0
 | 
			
		||||
        or return $c->error('ERR_CREATING');
 | 
			
		||||
    return 'OK',;
 | 
			
		||||
} ## end sub new_printer
 | 
			
		||||
 | 
			
		||||
sub hostname_or_ip2 {
 | 
			
		||||
 | 
			
		||||
    my ($fm, $data) = @_;
 | 
			
		||||
 | 
			
		||||
    if ($data =~ /^[\d\.]+$/) {
 | 
			
		||||
        if (ip_number2($fm, $data) eq "OK")
 | 
			
		||||
        {
 | 
			
		||||
        if (ip_number2($fm, $data) eq "OK") {
 | 
			
		||||
            return "OK";
 | 
			
		||||
        }
 | 
			
		||||
        else 
 | 
			
		||||
        {
 | 
			
		||||
        } else {
 | 
			
		||||
            return $fm->l('prt_MUST_BE_VALID_HOSTNAME_OR_IP');
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    elsif ($data =~ /^([a-zA-Z0-9\.\-]+)$/ ) 
 | 
			
		||||
    {
 | 
			
		||||
    } elsif ($data =~ /^([a-zA-Z0-9\.\-]+)$/) {
 | 
			
		||||
        return "OK";
 | 
			
		||||
    } 
 | 
			
		||||
    else 
 | 
			
		||||
    {
 | 
			
		||||
    } else {
 | 
			
		||||
        return $fm->l('prt_MUST_BE_VALID_HOSTNAME_OR_IP');
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
} ## end sub hostname_or_ip2
 | 
			
		||||
 | 
			
		||||
sub ip_number2 {
 | 
			
		||||
 | 
			
		||||
    # from CGI::FormMagick::Validator::ip_number($fm, $data)
 | 
			
		||||
    
 | 
			
		||||
    my ($fm, $data) = @_;
 | 
			
		||||
 | 
			
		||||
    return undef unless defined $data;
 | 
			
		||||
 | 
			
		||||
    return 'FM_IP_NUMBER1' unless $data =~ /^[\d.]+$/;
 | 
			
		||||
 | 
			
		||||
    my @octets = split /\./, $data;
 | 
			
		||||
    my $dots = ($data =~ tr/.//);
 | 
			
		||||
 | 
			
		||||
    return 'FM_IP_NUMBER2' unless (scalar @octets == 4 and $dots == 3);
 | 
			
		||||
 | 
			
		||||
    foreach my $octet (@octets) {
 | 
			
		||||
        return $fm->l("FM_IP_NUMBER3", {octet => $octet}) if $octet > 255;
 | 
			
		||||
        return $fm->l("FM_IP_NUMBER3", { octet => $octet }) if $octet > 255;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return 'OK';
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
} ## end sub ip_number2
 | 
			
		||||
 | 
			
		||||
=head2 publicAccess_list
 | 
			
		||||
 | 
			
		||||
@@ -365,15 +307,14 @@ access drop down list.
 | 
			
		||||
=cut
 | 
			
		||||
 | 
			
		||||
sub printerLocation_list {
 | 
			
		||||
 | 
			
		||||
    my $c = shift;
 | 
			
		||||
    return  [[ $c->l('prt_LOCAL_PRINTER_0') => 'lp0'],
 | 
			
		||||
	    [ $c->l('prt_LOCAL_PRINTER_1') => 'lp1'],
 | 
			
		||||
	    [ $c->l('prt_LOCAL_PRINTER_2') => 'lp2'],
 | 
			
		||||
	    [ $c->l('prt_NET_PRINTER') => 'remote' ],
 | 
			
		||||
	    [ $c->l('prt_FIRST_USB_PRINTER') => 'usb/lp0'],
 | 
			
		||||
	    [ $c->l('prt_SECOND_USB_PRINTER') => 'usb/lp1']];
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    return [
 | 
			
		||||
        [ $c->l('prt_LOCAL_PRINTER_0')    => 'lp0' ],
 | 
			
		||||
        [ $c->l('prt_LOCAL_PRINTER_1')    => 'lp1' ],
 | 
			
		||||
        [ $c->l('prt_LOCAL_PRINTER_2')    => 'lp2' ],
 | 
			
		||||
        [ $c->l('prt_NET_PRINTER')        => 'remote' ],
 | 
			
		||||
        [ $c->l('prt_FIRST_USB_PRINTER')  => 'usb/lp0' ],
 | 
			
		||||
        [ $c->l('prt_SECOND_USB_PRINTER') => 'usb/lp1' ]
 | 
			
		||||
    ];
 | 
			
		||||
} ## end sub printerLocation_list
 | 
			
		||||
1
 | 
			
		||||
 
 | 
			
		||||
@@ -3,7 +3,7 @@ package SrvMngr::Controller::Proxy;
 | 
			
		||||
#----------------------------------------------------------------------
 | 
			
		||||
# heading     : System
 | 
			
		||||
# description : Proxy settings
 | 
			
		||||
# navigation  : 4000 700
 | 
			
		||||
# navigation  : 4000 710
 | 
			
		||||
#----------------------------------------------------------------------
 | 
			
		||||
#
 | 
			
		||||
# routes : end
 | 
			
		||||
@@ -11,65 +11,50 @@ package SrvMngr::Controller::Proxy;
 | 
			
		||||
use strict;
 | 
			
		||||
use warnings;
 | 
			
		||||
use Mojo::Base 'Mojolicious::Controller';
 | 
			
		||||
 | 
			
		||||
use Locale::gettext;
 | 
			
		||||
use SrvMngr::I18N;
 | 
			
		||||
 | 
			
		||||
use SrvMngr qw(theme_list init_session);
 | 
			
		||||
 | 
			
		||||
our $db = esmith::ConfigDB->open || die "Couldn't open config db";
 | 
			
		||||
 | 
			
		||||
sub main {
 | 
			
		||||
    my $c = shift;
 | 
			
		||||
    $c->app->log->info($c->log_req);
 | 
			
		||||
 | 
			
		||||
    my %prx_datas = ();
 | 
			
		||||
    my $title = $c->l('prx_TITLE');
 | 
			
		||||
    my $modul = $c->render_to_string(inline => $c->l('prx_FIRST_PAGE_DESCRIPTION'));
 | 
			
		||||
 | 
			
		||||
    $prx_datas{'http_proxy_status'} = ($db->get_prop('squid','status')) || 'disabled';
 | 
			
		||||
    my $title     = $c->l('prx_TITLE');
 | 
			
		||||
    my $modul     = $c->render_to_string(inline => $c->l('prx_FIRST_PAGE_DESCRIPTION'));
 | 
			
		||||
    $prx_datas{'http_proxy_status'} = ($db->get_prop('squid', 'status')) || 'disabled';
 | 
			
		||||
 | 
			
		||||
    #if (system('/bin/rpm -q e-smith-email > /dev/null') == 0)
 | 
			
		||||
    #{
 | 
			
		||||
	$prx_datas{'smtp_proxy_status'} = $db->get_prop('qpsmtpd','Proxy') || undef;
 | 
			
		||||
    $prx_datas{'smtp_proxy_status'} = $db->get_prop('qpsmtpd', 'Proxy') || undef;
 | 
			
		||||
 | 
			
		||||
    #}
 | 
			
		||||
    #(system('/bin/rpm -q e-smith-email > /dev/null') == 0) ?
 | 
			
		||||
 | 
			
		||||
    $c->stash( title => $title, modul => $modul, prx_datas => \%prx_datas );
 | 
			
		||||
    $c->stash(title => $title, modul => $modul, prx_datas => \%prx_datas);
 | 
			
		||||
    $c->render(template => 'proxy');
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
} ## end sub main
 | 
			
		||||
 | 
			
		||||
sub do_update {
 | 
			
		||||
    my $c = shift;
 | 
			
		||||
    $c->app->log->info($c->log_req);
 | 
			
		||||
 | 
			
		||||
    my $http_proxy_status = $c->param('http_proxy_status') || 'disabled';
 | 
			
		||||
    my $smtp_proxy_status = $c->param('smtp_proxy_status') || '';
 | 
			
		||||
 | 
			
		||||
    my $result = "";
 | 
			
		||||
 | 
			
		||||
    my $result            = "";
 | 
			
		||||
    my $squid = $db->get('squid') or $result = $c->l('prx_ERR_NO_SQUID_REC');
 | 
			
		||||
 | 
			
		||||
    # smtpd is allowed to not exist, as the relevant packages may not be
 | 
			
		||||
    # installed.
 | 
			
		||||
    my $smtpd = $db->get('qpsmtpd') || undef;
 | 
			
		||||
 | 
			
		||||
    $squid->set_prop('status', $http_proxy_status);
 | 
			
		||||
    $smtpd->set_prop('Proxy', $smtp_proxy_status) if $smtpd;
 | 
			
		||||
 | 
			
		||||
    #
 | 
			
		||||
    # Update the system
 | 
			
		||||
    #
 | 
			
		||||
    system("/sbin/e-smith/signal-event proxy-update") == 0
 | 
			
		||||
        or $result = $c->l('prx_ERR_PROXY_UPDATE_FAILED');
 | 
			
		||||
 | 
			
		||||
    my $title = $c->l('prx_TITLE');
 | 
			
		||||
 | 
			
		||||
    if ( $result eq '' ) { $result = $c->l('prx_SUCCESS'); }
 | 
			
		||||
 | 
			
		||||
    $c->stash( title => $title, modul => $result );
 | 
			
		||||
    if ($result eq '') { $result = $c->l('prx_SUCCESS'); }
 | 
			
		||||
    $c->stash(title => $title, modul => $result);
 | 
			
		||||
    $c->render(template => 'module');
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
} ## end sub do_update
 | 
			
		||||
1;
 | 
			
		||||
 
 | 
			
		||||
@@ -11,288 +11,259 @@ package SrvMngr::Controller::Pseudonyms;
 | 
			
		||||
use strict;
 | 
			
		||||
use warnings;
 | 
			
		||||
use Mojo::Base 'Mojolicious::Controller';
 | 
			
		||||
 | 
			
		||||
use Locale::gettext;
 | 
			
		||||
use SrvMngr::I18N;
 | 
			
		||||
 | 
			
		||||
use SrvMngr qw(theme_list init_session);
 | 
			
		||||
 | 
			
		||||
#use Data::Dumper;
 | 
			
		||||
 | 
			
		||||
#use esmith::FormMagick::Panel::pseudonyms;
 | 
			
		||||
use esmith::AccountsDB;
 | 
			
		||||
 | 
			
		||||
#use URI::Escape;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
our $cdb = esmith::ConfigDB->open || die "Couldn't open configuration db";
 | 
			
		||||
our $adb = esmith::AccountsDB->open || die "Couldn't open accounts db";
 | 
			
		||||
#our $cdb = esmith::ConfigDB->open   || die "Couldn't open configuration db";
 | 
			
		||||
#our $adb = esmith::AccountsDB->open || die "Couldn't open accounts db";
 | 
			
		||||
my ($cdb,$adb);
 | 
			
		||||
 | 
			
		||||
sub main {
 | 
			
		||||
 | 
			
		||||
    my $c = shift;
 | 
			
		||||
    $c->app->log->info($c->log_req);
 | 
			
		||||
 | 
			
		||||
    my %pse_datas = ();
 | 
			
		||||
    my $title = $c->l('pse_FORM_TITLE');
 | 
			
		||||
    my $notif = '';
 | 
			
		||||
 | 
			
		||||
    my $title     = $c->l('pse_FORM_TITLE');
 | 
			
		||||
    my $notif     = '';
 | 
			
		||||
    $pse_datas{trt} = 'LST';
 | 
			
		||||
 | 
			
		||||
    my @pseudonyms;
 | 
			
		||||
    if ($adb)
 | 
			
		||||
    {
 | 
			
		||||
	#$cdb = esmith::ConfigDB->open   || die "Couldn't open configuration db";
 | 
			
		||||
	$adb = esmith::AccountsDB->open || die "Couldn't open accounts db";
 | 
			
		||||
 | 
			
		||||
    if ($adb) {
 | 
			
		||||
        @pseudonyms = $adb->pseudonyms();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    $c->stash( title => $title, notif => $notif, pse_datas => \%pse_datas, pseudonyms => \@pseudonyms );
 | 
			
		||||
    $c->stash(title => $title, notif => $notif, pse_datas => \%pse_datas, pseudonyms => \@pseudonyms);
 | 
			
		||||
    $c->render(template => 'pseudonyms');
 | 
			
		||||
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
} ## end sub main
 | 
			
		||||
 | 
			
		||||
sub do_display {
 | 
			
		||||
 | 
			
		||||
    my $c = shift;
 | 
			
		||||
    $c->app->log->info($c->log_req);
 | 
			
		||||
 | 
			
		||||
    my $rt = $c->current_route;
 | 
			
		||||
    my $trt = ($c->param('trt') || 'LST');
 | 
			
		||||
    my $rt        = $c->current_route;
 | 
			
		||||
    my $trt       = ($c->param('trt') || 'LST');
 | 
			
		||||
    my $pseudonym = $c->param('pseudonym') || '';
 | 
			
		||||
 | 
			
		||||
    my $title = $c->l('pse_FORM_TITLE');
 | 
			
		||||
    my $title     = $c->l('pse_FORM_TITLE');
 | 
			
		||||
    my %pse_datas = ();
 | 
			
		||||
    $pse_datas{'trt'} = $trt;
 | 
			
		||||
 	#$cdb = esmith::ConfigDB->open   || die "Couldn't open configuration db";
 | 
			
		||||
	$adb = esmith::AccountsDB->open || die "Couldn't open accounts db";
 | 
			
		||||
	$pse_datas{'trt'} = $trt;
 | 
			
		||||
 | 
			
		||||
	if ( $trt eq 'ADD' ) {
 | 
			
		||||
	    #nothing
 | 
			
		||||
	}
 | 
			
		||||
    if ($trt eq 'ADD') {
 | 
			
		||||
 | 
			
		||||
	if ( $trt eq 'UPD' ) {
 | 
			
		||||
	
 | 
			
		||||
	    my $rec = $adb->get($pseudonym);
 | 
			
		||||
	    if ($rec and $rec->prop('type') eq 'pseudonym') {
 | 
			
		||||
        #nothing
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    		$pse_datas{pseudonym} = $pseudonym;
 | 
			
		||||
    		$pse_datas{account} = $rec->prop('Account') || '';
 | 
			
		||||
    		$pse_datas{internal} = is_pseudonym_internal($pseudonym);
 | 
			
		||||
	    }
 | 
			
		||||
	}
 | 
			
		||||
    if ($trt eq 'UPD') {
 | 
			
		||||
        my $rec = $adb->get($pseudonym);
 | 
			
		||||
 | 
			
		||||
        if ( $trt eq 'DEL' ) {
 | 
			
		||||
        if ($rec and $rec->prop('type') eq 'pseudonym') {
 | 
			
		||||
            $pse_datas{pseudonym} = $pseudonym;
 | 
			
		||||
            $pse_datas{account}   = $rec->prop('Account') || '';
 | 
			
		||||
            $pse_datas{internal}  = is_pseudonym_internal($pseudonym);
 | 
			
		||||
        } ## end if ($rec and $rec->prop...)
 | 
			
		||||
    } ## end if ($trt eq 'UPD')
 | 
			
		||||
 | 
			
		||||
	    my $rec = $adb->get($pseudonym);
 | 
			
		||||
	    if ($rec and $rec->prop('type') eq 'pseudonym') {
 | 
			
		||||
    if ($trt eq 'DEL') {
 | 
			
		||||
        my $rec = $adb->get($pseudonym);
 | 
			
		||||
 | 
			
		||||
    		$pse_datas{pseudonym} = $pseudonym;
 | 
			
		||||
    		$pse_datas{account} = $rec->prop('Account') || '';
 | 
			
		||||
    		$pse_datas{internal} = is_pseudonym_internal($pseudonym);
 | 
			
		||||
        if ($rec and $rec->prop('type') eq 'pseudonym') {
 | 
			
		||||
            $pse_datas{pseudonym} = $pseudonym;
 | 
			
		||||
            $pse_datas{account}   = $rec->prop('Account') || '';
 | 
			
		||||
            $pse_datas{internal}  = is_pseudonym_internal($pseudonym);
 | 
			
		||||
        } ## end if ($rec and $rec->prop...)
 | 
			
		||||
    } ## end if ($trt eq 'DEL')
 | 
			
		||||
 | 
			
		||||
	    }
 | 
			
		||||
    if ($trt eq 'LST') {
 | 
			
		||||
        my @pseudonyms;
 | 
			
		||||
 | 
			
		||||
        if ($adb) {
 | 
			
		||||
            @pseudonyms = $adb->pseudonyms();
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        if ( $trt eq 'LST' ) {
 | 
			
		||||
	    my @pseudonyms;
 | 
			
		||||
	    if ($adb) {
 | 
			
		||||
	        @pseudonyms = $adb->pseudonyms();
 | 
			
		||||
	    }
 | 
			
		||||
	    $c->stash( pseudonyms => \@pseudonyms );
 | 
			
		||||
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
    $c->stash( title => $title, pse_datas => \%pse_datas );
 | 
			
		||||
    $c->render( template => 'pseudonyms' );
 | 
			
		||||
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
        $c->stash(pseudonyms => \@pseudonyms);
 | 
			
		||||
    } ## end if ($trt eq 'LST')
 | 
			
		||||
    $c->stash(title => $title, pse_datas => \%pse_datas);
 | 
			
		||||
    $c->render(template => 'pseudonyms');
 | 
			
		||||
} ## end sub do_display
 | 
			
		||||
 | 
			
		||||
sub do_update {
 | 
			
		||||
 | 
			
		||||
    my $c = shift;
 | 
			
		||||
    $c->app->log->info($c->log_req);
 | 
			
		||||
 | 
			
		||||
    my $rt = $c->current_route;
 | 
			
		||||
    my $trt = ($c->param('trt') || 'LST');
 | 
			
		||||
 | 
			
		||||
    my $title = $c->l('pse_FORM_TITLE');
 | 
			
		||||
    my $rt        = $c->current_route;
 | 
			
		||||
    my $trt       = ($c->param('trt') || 'LST');
 | 
			
		||||
    my $title     = $c->l('pse_FORM_TITLE');
 | 
			
		||||
   	#$cdb = esmith::ConfigDB->open   || die "Couldn't open configuration db";
 | 
			
		||||
	$adb = esmith::AccountsDB->open || die "Couldn't open accounts db";
 | 
			
		||||
    my %pse_datas = ();
 | 
			
		||||
    $pse_datas{'trt'} = $trt;
 | 
			
		||||
 | 
			
		||||
    my ($res, $result) = '';
 | 
			
		||||
 | 
			
		||||
    #my $pseudonym = uri_unescape($c->param('Pseudonym'));
 | 
			
		||||
    my $pseudonym = $c->param('Pseudonym');
 | 
			
		||||
    $pse_datas{'pseudonym'} = $pseudonym;
 | 
			
		||||
 | 
			
		||||
    if ( $trt eq 'ADD' ) {
 | 
			
		||||
 | 
			
		||||
    if ($trt eq 'ADD') {
 | 
			
		||||
        my $account = $c->param('Account');
 | 
			
		||||
 | 
			
		||||
	# controls 
 | 
			
		||||
	$res = $c->validate_new_pseudonym_name( $pseudonym, $account );
 | 
			
		||||
	$result .= $res unless $res eq 'OK';
 | 
			
		||||
        # controls
 | 
			
		||||
        $res = $c->validate_new_pseudonym_name($pseudonym, $account);
 | 
			
		||||
        $result .= $res unless $res eq 'OK';
 | 
			
		||||
 | 
			
		||||
	#$result .= ' blocked';
 | 
			
		||||
	
 | 
			
		||||
	$res = '';
 | 
			
		||||
	if ( ! $result ) {
 | 
			
		||||
	    $adb->new_record( $pseudonym, { type => 'pseudonym',
 | 
			
		||||
                                     Account => $account} )
 | 
			
		||||
    	    or $result .= "Error occurred while creating pseudonym in database.";
 | 
			
		||||
	    # Untaint $pseudonym before use in system()
 | 
			
		||||
	    ($pseudonym) = ($pseudonym =~ /(.+)/);
 | 
			
		||||
	    system( "/sbin/e-smith/signal-event", "pseudonym-create", "$pseudonym",) 
 | 
			
		||||
		== 0 or $result .= 'pse_CREATE_ERROR.';
 | 
			
		||||
	}
 | 
			
		||||
	if ( ! $result ) {
 | 
			
		||||
	    $res = 'OK';
 | 
			
		||||
	    $result = $c->l('pse_CREATE_SUCCEEDED') . ' ' . $pseudonym; 
 | 
			
		||||
	}
 | 
			
		||||
    }
 | 
			
		||||
        #$result .= ' blocked';
 | 
			
		||||
        $res = '';
 | 
			
		||||
 | 
			
		||||
    if ( $trt eq 'UPD' ) {
 | 
			
		||||
        if (!$result) {
 | 
			
		||||
            $adb->new_record(
 | 
			
		||||
                $pseudonym,
 | 
			
		||||
                {   type    => 'pseudonym',
 | 
			
		||||
                    Account => $account
 | 
			
		||||
                }
 | 
			
		||||
            ) or $result .= "Error occurred while creating pseudonym in database.";
 | 
			
		||||
 | 
			
		||||
        my $account = $c->param('Account');
 | 
			
		||||
	my $internal = $c->param ('Internal') || 'NO';
 | 
			
		||||
	my $removable = $adb->get($pseudonym)->prop('Removable') || 'yes';
 | 
			
		||||
            # Untaint $pseudonym before use in system()
 | 
			
		||||
            ($pseudonym) = ($pseudonym =~ /(.+)/);
 | 
			
		||||
            system("/sbin/e-smith/signal-event", "pseudonym-create", "$pseudonym",) == 0
 | 
			
		||||
                or $result .= 'pse_CREATE_ERROR.';
 | 
			
		||||
        } ## end if (!$result)
 | 
			
		||||
 | 
			
		||||
	my %props = ('Account' =>  $account);
 | 
			
		||||
        if (!$result) {
 | 
			
		||||
            $res    = 'OK';
 | 
			
		||||
            $result = $c->l('pse_CREATE_SUCCEEDED') . ' ' . $pseudonym;
 | 
			
		||||
        }
 | 
			
		||||
    } ## end if ($trt eq 'ADD')
 | 
			
		||||
 | 
			
		||||
	if ($removable eq 'yes') {
 | 
			
		||||
    	    if ($internal eq "YES") { $props{'Visible'} = 'internal'; }
 | 
			
		||||
    	    else { $adb->get($pseudonym)->delete_prop('Visible'); }
 | 
			
		||||
	}
 | 
			
		||||
    if ($trt eq 'UPD') {
 | 
			
		||||
        my $account   = $c->param('Account');
 | 
			
		||||
        my $internal  = $c->param('Internal') || 'NO';
 | 
			
		||||
        my $removable = $adb->get($pseudonym)->prop('Removable') || 'yes';
 | 
			
		||||
        my %props     = ('Account' => $account);
 | 
			
		||||
 | 
			
		||||
	# controls
 | 
			
		||||
	#$res = '';
 | 
			
		||||
	#$res = validate_description( $c, $account );
 | 
			
		||||
	#$result .= $res unless $res eq 'OK';
 | 
			
		||||
        if ($removable eq 'yes') {
 | 
			
		||||
            if ($internal eq "YES") { $props{'Visible'} = 'internal'; }
 | 
			
		||||
            else                    { $adb->get($pseudonym)->delete_prop('Visible'); }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
	#$result .= 'blocked';
 | 
			
		||||
        # controls
 | 
			
		||||
        #$res = '';
 | 
			
		||||
        #$res = validate_description( $c, $account );
 | 
			
		||||
        #$result .= $res unless $res eq 'OK';
 | 
			
		||||
        #$result .= 'blocked';
 | 
			
		||||
        $res = '';
 | 
			
		||||
 | 
			
		||||
	$res = '';
 | 
			
		||||
	if ( ! $result ) {
 | 
			
		||||
	    $adb->get($pseudonym)->merge_props(%props)
 | 
			
		||||
    		or $result .= "Error occurred while modifying pseudonym in database.";
 | 
			
		||||
	    # Untaint $pseudonym before use in system()
 | 
			
		||||
	    ($pseudonym) = ($pseudonym =~ /(.+)/);
 | 
			
		||||
	    system( "/sbin/e-smith/signal-event", "pseudonym-modify", "$pseudonym",)
 | 
			
		||||
    		== 0 or $result .= "Error occurred while modifying pseudonym.";
 | 
			
		||||
	}
 | 
			
		||||
	if ( ! $result ) { 
 | 
			
		||||
	    $res = 'OK';
 | 
			
		||||
	    $result = $c->l('pse_MODIFY_SUCCEEDED') . ' ' . $pseudonym; 
 | 
			
		||||
	}
 | 
			
		||||
    }
 | 
			
		||||
        if (!$result) {
 | 
			
		||||
            $adb->get($pseudonym)->merge_props(%props)
 | 
			
		||||
                or $result .= "Error occurred while modifying pseudonym in database.";
 | 
			
		||||
 | 
			
		||||
    if ( $trt eq 'DEL' ) {
 | 
			
		||||
            # Untaint $pseudonym before use in system()
 | 
			
		||||
            ($pseudonym) = ($pseudonym =~ /(.+)/);
 | 
			
		||||
            system("/sbin/e-smith/signal-event", "pseudonym-modify", "$pseudonym",) == 0
 | 
			
		||||
                or $result .= "Error occurred while modifying pseudonym.";
 | 
			
		||||
        } ## end if (!$result)
 | 
			
		||||
 | 
			
		||||
	# controls
 | 
			
		||||
	$res = '';
 | 
			
		||||
	$res = validate_is_pseudonym($c, $pseudonym);
 | 
			
		||||
	$result .= $res unless $res eq 'OK';
 | 
			
		||||
	
 | 
			
		||||
	#$result .= 'blocked';
 | 
			
		||||
	
 | 
			
		||||
	$res = '';
 | 
			
		||||
	if ( ! $result ) {
 | 
			
		||||
	    $res = $c->delete_pseudonym( $pseudonym );
 | 
			
		||||
	    $result .= $res unless $res eq 'OK';
 | 
			
		||||
	    if ( ! $result ) { 
 | 
			
		||||
		$res = 'OK';
 | 
			
		||||
		$result = $c->l('pse_REMOVE_SUCCEEDED') . ' ' . $pseudonym; 
 | 
			
		||||
	    }
 | 
			
		||||
	}
 | 
			
		||||
    }
 | 
			
		||||
        if (!$result) {
 | 
			
		||||
            $res    = 'OK';
 | 
			
		||||
            $result = $c->l('pse_MODIFY_SUCCEEDED') . ' ' . $pseudonym;
 | 
			
		||||
        }
 | 
			
		||||
    } ## end if ($trt eq 'UPD')
 | 
			
		||||
 | 
			
		||||
    if ($trt eq 'DEL') {
 | 
			
		||||
 | 
			
		||||
        # controls
 | 
			
		||||
        $res = '';
 | 
			
		||||
        $res = validate_is_pseudonym($c, $pseudonym);
 | 
			
		||||
        $result .= $res unless $res eq 'OK';
 | 
			
		||||
 | 
			
		||||
        #$result .= 'blocked';
 | 
			
		||||
        $res = '';
 | 
			
		||||
 | 
			
		||||
        if (!$result) {
 | 
			
		||||
            $res = $c->delete_pseudonym($pseudonym);
 | 
			
		||||
            $result .= $res unless $res eq 'OK';
 | 
			
		||||
 | 
			
		||||
            if (!$result) {
 | 
			
		||||
                $res    = 'OK';
 | 
			
		||||
                $result = $c->l('pse_REMOVE_SUCCEEDED') . ' ' . $pseudonym;
 | 
			
		||||
            }
 | 
			
		||||
        } ## end if (!$result)
 | 
			
		||||
    } ## end if ($trt eq 'DEL')
 | 
			
		||||
 | 
			
		||||
    # common parts
 | 
			
		||||
 | 
			
		||||
    if ( $res ne 'OK' ) {
 | 
			
		||||
	$c->stash( error => $result);
 | 
			
		||||
	$c->stash( title => $title, pse_datas => \%pse_datas );
 | 
			
		||||
	return $c->render('pseudonyms');
 | 
			
		||||
    if ($res ne 'OK') {
 | 
			
		||||
        $c->stash(error => $result);
 | 
			
		||||
        $c->stash(title => $title, pse_datas => \%pse_datas);
 | 
			
		||||
        return $c->render('pseudonyms');
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    my $message = "'Pseudonyms' updates $trt DONE";
 | 
			
		||||
    $c->app->log->info($message);
 | 
			
		||||
    $c->flash( success => $result );
 | 
			
		||||
 | 
			
		||||
    $c->flash(success => $result);
 | 
			
		||||
    $c->redirect_to('/pseudonyms');
 | 
			
		||||
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
} ## end sub do_update
 | 
			
		||||
 | 
			
		||||
sub delete_pseudonym {
 | 
			
		||||
 | 
			
		||||
    my ($c, $pseudonym) = @_;
 | 
			
		||||
 | 
			
		||||
    my $msg = '';
 | 
			
		||||
 | 
			
		||||
    #------------------------------------------------------------
 | 
			
		||||
    # Make the pseudonym inactive, signal pseudonym-delete event
 | 
			
		||||
    # and then delete it
 | 
			
		||||
    #------------------------------------------------------------
 | 
			
		||||
 | 
			
		||||
    my @pseudonyms = $adb->pseudonyms();
 | 
			
		||||
 | 
			
		||||
    foreach my $p_rec (@pseudonyms) {
 | 
			
		||||
        if ($p_rec->prop("Account") eq $pseudonym) {
 | 
			
		||||
            $adb->get($p_rec->key)->set_prop('type','pseudonym-deleted')
 | 
			
		||||
            $adb->get($p_rec->key)->set_prop('type', 'pseudonym-deleted')
 | 
			
		||||
                or $msg .= "Error occurred while changing pseudonym type.";
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    $adb->get($pseudonym)->set_prop('type','pseudonym-deleted')
 | 
			
		||||
    } ## end foreach my $p_rec (@pseudonyms)
 | 
			
		||||
    $adb->get($pseudonym)->set_prop('type', 'pseudonym-deleted')
 | 
			
		||||
        or $msg .= "Error occurred while changing pseudonym type.";
 | 
			
		||||
 | 
			
		||||
    # Untaint $pseudonym before use in system()
 | 
			
		||||
    ($pseudonym) = ($pseudonym =~ /(.+)/);
 | 
			
		||||
    system( "/sbin/e-smith/signal-event", "pseudonym-delete", "$pseudonym") == 0
 | 
			
		||||
    system("/sbin/e-smith/signal-event", "pseudonym-delete", "$pseudonym") == 0
 | 
			
		||||
        or $msg .= "Error occurred while removing pseudonym.";
 | 
			
		||||
 | 
			
		||||
    #TODO: is it ->delete or get()->delete
 | 
			
		||||
    foreach my $p_rec (@pseudonyms) {
 | 
			
		||||
 | 
			
		||||
        if ($p_rec->prop("Account") eq $pseudonym) {
 | 
			
		||||
            $adb->get($p_rec->key)->delete()
 | 
			
		||||
                or $msg .= "Error occurred while deleting pseudonym from database.";
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    } ## end foreach my $p_rec (@pseudonyms)
 | 
			
		||||
    $adb->get($pseudonym)->delete()
 | 
			
		||||
        or $msg .= "Error occurred while deleting pseudonym from database.";
 | 
			
		||||
 | 
			
		||||
    return $msg  unless $msg;
 | 
			
		||||
 | 
			
		||||
    return $msg unless $msg;
 | 
			
		||||
    return 'OK';
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
} ## end sub delete_pseudonym
 | 
			
		||||
 | 
			
		||||
sub existing_accounts_list {
 | 
			
		||||
    my $c = shift;
 | 
			
		||||
 | 
			
		||||
    my @existingAccounts = ( ['Administrator' => 'admin']);
 | 
			
		||||
    my @existingAccounts = ([ 'Administrator' => 'admin' ]);
 | 
			
		||||
 | 
			
		||||
    foreach my $a ($adb->get_all) {
 | 
			
		||||
        if ($a->prop('type') =~ /(user|group)/) {
 | 
			
		||||
            push @existingAccounts, [ $a->key => $a->key ];
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        if ($a->prop('type') eq "pseudonym") {
 | 
			
		||||
            my $target = $adb->get($a->prop('Account'));
 | 
			
		||||
 | 
			
		||||
            unless ($target)
 | 
			
		||||
            {
 | 
			
		||||
                warn "WARNING: pseudonym (" . $a->key . ") => missing Account(" 
 | 
			
		||||
			. $a->prop('Account')  . ")\n";
 | 
			
		||||
            unless ($target) {
 | 
			
		||||
                warn "WARNING: pseudonym (" . $a->key . ") => missing Account(" . $a->prop('Account') . ")\n";
 | 
			
		||||
                next;
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            push @existingAccounts, [ $a->key, $a->key ]
 | 
			
		||||
                unless ($target->prop('type') eq "pseudonym");
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return(\@existingAccounts);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
        } ## end if ($a->prop('type') eq...)
 | 
			
		||||
    } ## end foreach my $a ($adb->get_all)
 | 
			
		||||
    return (\@existingAccounts);
 | 
			
		||||
} ## end sub existing_accounts_list
 | 
			
		||||
 | 
			
		||||
=head2 get_pseudonym_account
 | 
			
		||||
 | 
			
		||||
@@ -301,17 +272,17 @@ Returns the current Account property for this pseudonym
 | 
			
		||||
=cut
 | 
			
		||||
 | 
			
		||||
sub get_pseudonym_account {
 | 
			
		||||
    my $c = shift;
 | 
			
		||||
    my $c         = shift;
 | 
			
		||||
    my $pseudonym = shift;
 | 
			
		||||
    my $a         = $adb->get($pseudonym)->prop('Account');
 | 
			
		||||
 | 
			
		||||
    my $a = $adb->get($pseudonym)->prop('Account');
 | 
			
		||||
    if ($a eq "admin") {
 | 
			
		||||
        $a = "Administrator";
 | 
			
		||||
    } elsif ($a eq "shared") {
 | 
			
		||||
        $a = $c->l("EVERYONE"); 
 | 
			
		||||
        $a = $c->l("EVERYONE");
 | 
			
		||||
    }
 | 
			
		||||
    return($a);
 | 
			
		||||
}
 | 
			
		||||
    return ($a);
 | 
			
		||||
} ## end sub get_pseudonym_account
 | 
			
		||||
 | 
			
		||||
=head2 is_pseudonym_not_removable
 | 
			
		||||
 | 
			
		||||
@@ -320,13 +291,12 @@ Returns 1 if the current Account is not removable, 0 otherwise
 | 
			
		||||
=cut
 | 
			
		||||
 | 
			
		||||
sub is_pseudonym_not_removable {
 | 
			
		||||
    my $c = shift;
 | 
			
		||||
    my $c         = shift;
 | 
			
		||||
    my $pseudonym = shift;
 | 
			
		||||
 | 
			
		||||
    my $removable = $adb->get($pseudonym)->prop('Removable') || 'yes';
 | 
			
		||||
    return 1  if ($removable eq 'yes');
 | 
			
		||||
    return 1 if ($removable eq 'yes');
 | 
			
		||||
    return 0;
 | 
			
		||||
}
 | 
			
		||||
} ## end sub is_pseudonym_not_removable
 | 
			
		||||
 | 
			
		||||
=head2 is_pseudonym_internal
 | 
			
		||||
 | 
			
		||||
@@ -335,13 +305,13 @@ Returns YES if the current Account property Visible is 'internal'
 | 
			
		||||
=cut
 | 
			
		||||
 | 
			
		||||
sub is_pseudonym_internal {
 | 
			
		||||
#    my $c = shift;
 | 
			
		||||
    my $pseudonym = shift;
 | 
			
		||||
 | 
			
		||||
    #    my $c = shift;
 | 
			
		||||
    my $pseudonym = shift;
 | 
			
		||||
    my $visible = $adb->get($pseudonym)->prop('Visible') || '';
 | 
			
		||||
    return 'YES'  if ($visible eq 'internal');
 | 
			
		||||
    return 'YES' if ($visible eq 'internal');
 | 
			
		||||
    return 'NO';
 | 
			
		||||
}
 | 
			
		||||
} ## end sub is_pseudonym_internal
 | 
			
		||||
 | 
			
		||||
=head2 validate_new_pseudonym_name FM PSEUDONYM
 | 
			
		||||
 | 
			
		||||
@@ -355,30 +325,25 @@ Returns "NAME_IN_USE" if this pseudonym is taken.
 | 
			
		||||
=cut
 | 
			
		||||
 | 
			
		||||
sub validate_new_pseudonym_name {
 | 
			
		||||
 | 
			
		||||
    my ($c, $pseudonym, $account) = @_;
 | 
			
		||||
 | 
			
		||||
    my $acct = $adb->get($pseudonym);
 | 
			
		||||
 | 
			
		||||
    if (defined $acct) {
 | 
			
		||||
        return($c->l('pse_NAME_IN_USE'));
 | 
			
		||||
 | 
			
		||||
        return ($c->l('pse_NAME_IN_USE'));
 | 
			
		||||
    } elsif ($pseudonym =~ /@/) {
 | 
			
		||||
        use esmith::DomainsDB;
 | 
			
		||||
        my $ddb = esmith::DomainsDB->open_ro
 | 
			
		||||
                or die "Couldn't open DomainsDB\n";
 | 
			
		||||
            or die "Couldn't open DomainsDB\n";
 | 
			
		||||
        my ($lhs, $rhs) = split /@/, $pseudonym;
 | 
			
		||||
        return ($c->l('pse_PSEUDONYM_INVALID_DOMAIN')) unless ($ddb->get($rhs));
 | 
			
		||||
        return ($c->l('pse_PSEUDONYM_INVALID_SAMEACCT')) if ($lhs eq $account);
 | 
			
		||||
        return ('OK');	# p:' . $pseudonym . ' a:' . $account);
 | 
			
		||||
 | 
			
		||||
    } elsif ( $pseudonym !~ /^([a-z0-9][a-z0-9\.\-_!#\?~\$\^\+&`%\/\*]*)$/ ) {
 | 
			
		||||
        return($c->l('pse_VALID_PSEUDONYM_NAMES'));
 | 
			
		||||
        return ('OK');    # p:' . $pseudonym . ' a:' . $account);
 | 
			
		||||
    } elsif ($pseudonym !~ /^([a-z0-9][a-z0-9\.\-_!#\?~\$\^\+&`%\/\*]*)$/) {
 | 
			
		||||
        return ($c->l('pse_VALID_PSEUDONYM_NAMES'));
 | 
			
		||||
    } else {
 | 
			
		||||
        return('OK');
 | 
			
		||||
        return ('OK');
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
} ## end sub validate_new_pseudonym_name
 | 
			
		||||
 | 
			
		||||
=head2 validate_is_pseudonym FM NAME
 | 
			
		||||
 | 
			
		||||
@@ -388,19 +353,15 @@ returns "NOT_A_PSEUDONYM" if the name in question isn't an existing pseudonym
 | 
			
		||||
=cut
 | 
			
		||||
 | 
			
		||||
sub validate_is_pseudonym {
 | 
			
		||||
    my $c = shift;
 | 
			
		||||
    my $c         = shift;
 | 
			
		||||
    my $pseudonym = shift;
 | 
			
		||||
 | 
			
		||||
    $pseudonym = $adb->get($pseudonym);
 | 
			
		||||
    return($c->l('pse_NOT_A_PSEUDONYM')) unless $pseudonym;
 | 
			
		||||
 | 
			
		||||
    return ($c->l('pse_NOT_A_PSEUDONYM')) unless $pseudonym;
 | 
			
		||||
    my $type = $pseudonym->prop('type');
 | 
			
		||||
    unless (defined $type && ($type eq 'pseudonym') ) {
 | 
			
		||||
        return($c->l('NOT_A_PSEUDONYM'));
 | 
			
		||||
 | 
			
		||||
    unless (defined $type && ($type eq 'pseudonym')) {
 | 
			
		||||
        return ($c->l('NOT_A_PSEUDONYM'));
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return ('OK');
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
} ## end sub validate_is_pseudonym
 | 
			
		||||
1;
 | 
			
		||||
 
 | 
			
		||||
@@ -10,143 +10,352 @@ package SrvMngr::Controller::Qmailanalog;
 | 
			
		||||
use strict;
 | 
			
		||||
use warnings;
 | 
			
		||||
use Mojo::Base 'Mojolicious::Controller';
 | 
			
		||||
 | 
			
		||||
use esmith::FormMagick qw(gen_locale_date_string);
 | 
			
		||||
 | 
			
		||||
use SrvMngr qw(gen_locale_date_string);
 | 
			
		||||
use Locale::gettext;
 | 
			
		||||
use SrvMngr::I18N;
 | 
			
		||||
 | 
			
		||||
use SrvMngr qw(theme_list init_session);
 | 
			
		||||
use List::Util qw(sum); 
 | 
			
		||||
 | 
			
		||||
#use Mail::Log::Trace::Postfix;
 | 
			
		||||
 | 
			
		||||
sub main {
 | 
			
		||||
    my $c = shift;
 | 
			
		||||
    $c->app->log->info($c->log_req);
 | 
			
		||||
 | 
			
		||||
    my $title = $c->l('qma_FORM_TITLE');
 | 
			
		||||
    my $modul = $c->render_to_string(inline => $c->l('qma_INITIAL_DESC'));
 | 
			
		||||
 | 
			
		||||
    $c->stash( title => $title, modul => $modul );
 | 
			
		||||
    $c->stash(title => $title, modul => $modul);
 | 
			
		||||
    $c->render(template => 'qmailanalog');
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
} ## end sub main
 | 
			
		||||
 | 
			
		||||
sub do_update {
 | 
			
		||||
    my $c = shift;
 | 
			
		||||
    $c->app->log->info($c->log_req);
 | 
			
		||||
 | 
			
		||||
    my $result = "";
 | 
			
		||||
 | 
			
		||||
    my $result      = "";
 | 
			
		||||
    my $report_type = $c->param('report_type');
 | 
			
		||||
 | 
			
		||||
    if ($report_type =~ /^(\S+)$/)
 | 
			
		||||
    {
 | 
			
		||||
    	$report_type = $1;
 | 
			
		||||
    if ($report_type =~ /^(\S+)$/) {
 | 
			
		||||
        $report_type = $1;
 | 
			
		||||
    } elsif ($report_type =~ /^\s*$/) {
 | 
			
		||||
        $report_type = "zoverall";
 | 
			
		||||
    } else {
 | 
			
		||||
        $result      = $c->l('INVALID_REPORT_TYPE') . $report_type;
 | 
			
		||||
        $report_type = undef;
 | 
			
		||||
    }
 | 
			
		||||
    elsif ($report_type =~ /^\s*$/)
 | 
			
		||||
    {
 | 
			
		||||
	$report_type = "zoverall";
 | 
			
		||||
    }  else {
 | 
			
		||||
	    $result = $c->l('INVALID_REPORT_TYPE') . $report_type;
 | 
			
		||||
	    $report_type = undef;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
    my $title = $c->l('qma_FORM_TITLE');
 | 
			
		||||
 | 
			
		||||
    $result = $c->render_to_string(inline => generateReport($c, $report_type)) if $report_type;
 | 
			
		||||
 | 
			
		||||
    $c->stash( title => $title, modul => $result );
 | 
			
		||||
    $c->stash(title => $title, modul => $result);
 | 
			
		||||
    $c->render(template => 'module');
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
} ## end sub do_update
 | 
			
		||||
 | 
			
		||||
sub generateReport {
 | 
			
		||||
    my $c           = shift;
 | 
			
		||||
    my $report_type = shift;
 | 
			
		||||
    my $out         = '';
 | 
			
		||||
    #------------------------------------------------------------
 | 
			
		||||
    # Go ahead and generate the report.
 | 
			
		||||
    #------------------------------------------------------------
 | 
			
		||||
    my $now_string = $c->gen_locale_date_string();
 | 
			
		||||
    my $log_path = '/var/log/maillog';
 | 
			
		||||
    $out .= sprintf("<h3>%s %s </h3>", $c->l('REPORT_GENERATED'), $now_string);
 | 
			
		||||
    $out .= sprintf "<pre>";
 | 
			
		||||
    # Get the selected report from the form submission
 | 
			
		||||
    my $selected_report = $report_type;
 | 
			
		||||
 | 
			
		||||
	my $c = shift;
 | 
			
		||||
	my $report_type = shift;
 | 
			
		||||
 | 
			
		||||
	my $out = '';
 | 
			
		||||
	
 | 
			
		||||
	#------------------------------------------------------------
 | 
			
		||||
	# Looks good; go ahead and generate the report.
 | 
			
		||||
	#------------------------------------------------------------
 | 
			
		||||
 | 
			
		||||
#	$| = 1;
 | 
			
		||||
 | 
			
		||||
	my $now_string = $c->gen_locale_date_string();
 | 
			
		||||
	$out .= sprintf("<h3>%s %s </h3>", $c->l('REPORT_GENERATED'), $now_string);
 | 
			
		||||
 | 
			
		||||
	if ($report_type =~ /^qmail-q/)
 | 
			
		||||
	{
 | 
			
		||||
		open(QMAILQUEUEREPORT, "/var/qmail/bin/$report_type |");
 | 
			
		||||
 | 
			
		||||
		$out .= sprintf "<pre>";
 | 
			
		||||
 | 
			
		||||
		while (<QMAILQUEUEREPORT>)
 | 
			
		||||
		{
 | 
			
		||||
			$out .= sprintf("%s", $_);
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		close QMAILQUEUEREPORT;
 | 
			
		||||
		$out .= sprintf "</pre>";
 | 
			
		||||
 | 
			
		||||
		$out .= sprintf("<h3>%s</h3>", $c->l('END_OF_REPORT'));
 | 
			
		||||
		return '';
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	chdir "/var/log/qmail";
 | 
			
		||||
 | 
			
		||||
	open(QMAILANALOG,
 | 
			
		||||
	"/bin/cat \@* current 2>/dev/null"
 | 
			
		||||
	    . "| /usr/local/bin/tai64nunix"
 | 
			
		||||
	    . "| /usr/local/qmailanalog/bin/matchup 5>/dev/null"
 | 
			
		||||
	    . "| /usr/local/qmailanalog/bin/$report_type |"
 | 
			
		||||
	);
 | 
			
		||||
 | 
			
		||||
	$out .= sprintf "<pre>";
 | 
			
		||||
 | 
			
		||||
	while (<QMAILANALOG>)
 | 
			
		||||
	{
 | 
			
		||||
		# Cook any special HTML characters
 | 
			
		||||
 | 
			
		||||
		s/\&/\&/g;
 | 
			
		||||
		s/\"/\"/g;
 | 
			
		||||
		s/\>/\>/g;
 | 
			
		||||
		s/\</\</g;
 | 
			
		||||
 | 
			
		||||
			$out .= sprintf("%s", $_);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	close QMAILANALOG;
 | 
			
		||||
	$out .= sprintf "</pre>";
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
	$out .= sprintf("<h3>%s</h3>", $c->l('END_OF_REPORT'));
 | 
			
		||||
	return $out;
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
    # Call the relevant report sub based on the selection
 | 
			
		||||
    if ($selected_report eq 'daily_summary') {
 | 
			
		||||
        $out .= daily_summary_report($log_path);  
 | 
			
		||||
    }
 | 
			
		||||
    elsif ($selected_report eq 'daily_summary_today') {
 | 
			
		||||
        $out .= daily_summary_report_today($log_path);  
 | 
			
		||||
    }
 | 
			
		||||
    elsif ($selected_report eq 'daily_summary_all') {
 | 
			
		||||
        $out .= daily_summary_report_all($log_path);  
 | 
			
		||||
    }
 | 
			
		||||
    elsif ($selected_report eq 'top_senders') {
 | 
			
		||||
        $out .= top_senders_and_recipients($log_path);  
 | 
			
		||||
    }
 | 
			
		||||
    elsif ($selected_report eq 'bounce_analysis') {
 | 
			
		||||
        $out .= bounce_rate_analysis($log_path);  
 | 
			
		||||
    }
 | 
			
		||||
    elsif ($selected_report eq 'spam_and_virus') {
 | 
			
		||||
        $out .= spam_and_virus_filter_report($log_path);  
 | 
			
		||||
    }
 | 
			
		||||
    elsif ($selected_report eq 'delivery_status') {
 | 
			
		||||
        $out .= delivery_status_report($log_path);  
 | 
			
		||||
    }
 | 
			
		||||
    elsif ($selected_report eq 'geo_analysis') {
 | 
			
		||||
        $out .= geographical_analysis_of_email($log_path);  
 | 
			
		||||
    }
 | 
			
		||||
    elsif ($selected_report eq 'traffic_analysis') {
 | 
			
		||||
        $out .= traffic_analysis($log_path);  
 | 
			
		||||
    }
 | 
			
		||||
    elsif ($selected_report eq 'auth_analysis') {
 | 
			
		||||
        $out .= authentication_analysis($log_path);  
 | 
			
		||||
    }
 | 
			
		||||
    elsif ($selected_report eq 'user_activity') {
 | 
			
		||||
        $out .= user_activity_report($log_path);  
 | 
			
		||||
    }
 | 
			
		||||
    elsif ($selected_report eq 'error_reporting') {
 | 
			
		||||
        $out .= error_reporting($log_path);  
 | 
			
		||||
    }
 | 
			
		||||
    elsif ($selected_report eq 'comparison_reports') {
 | 
			
		||||
        $out .= comparison_reports($log_path, '/var/log/mail.log.1');
 | 
			
		||||
    }
 | 
			
		||||
    elsif ($selected_report eq 'customized_reports') {
 | 
			
		||||
        $out .= customized_reports($log_path);  
 | 
			
		||||
    }
 | 
			
		||||
    else {
 | 
			
		||||
        $out .= 'Invalid report selected';
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    # The $output variable now contains the generated report output.
 | 
			
		||||
    # Further processing can be done here, or you can render it later.
 | 
			
		||||
  
 | 
			
		||||
    $out .= sprintf "</pre>";
 | 
			
		||||
    $out .= sprintf("<h3>%s</h3>", $c->l('END_OF_REPORT'));
 | 
			
		||||
    return $out;
 | 
			
		||||
} ## end sub generateReport
 | 
			
		||||
 | 
			
		||||
sub reportType_list {
 | 
			
		||||
 | 
			
		||||
    my $c = shift;
 | 
			
		||||
    
 | 
			
		||||
    my $c     = shift;
 | 
			
		||||
    my @array = (
 | 
			
		||||
#        [ $c->l('qma_LIST_OUTGOING') => 'qmail-qread' ],
 | 
			
		||||
#        [ $c->l('qma_SUMMARIZE_QUEUE') => 'qmail-qstat' ],
 | 
			
		||||
        [ $c->l('qma_SUCCESSFUL_DELIVERY_DELAY') => 'zddist' ],
 | 
			
		||||
        [ $c->l('qma_REASONS_DEFERRAL') => 'zdeferrals' ],
 | 
			
		||||
        [ $c->l('qma_REASONS_FAILURE') => 'zfailures' ],
 | 
			
		||||
        [ $c->l('qma_BASIC_STATS') => 'zoverall' ],
 | 
			
		||||
        [ $c->l('qma_RECIP_STATS') => 'zrecipients' ],
 | 
			
		||||
        [ $c->l('qma_RECIP_HOSTS') => 'zrhosts' ],
 | 
			
		||||
        [ $c->l('qma_RECIP_ORDERED') => 'zrxdelay' ],
 | 
			
		||||
        [ $c->l('qma_SENDER_STATS') => 'zsenders' ],
 | 
			
		||||
        [ $c->l('qma_SENDMAIL_STYLE') => 'zsendmail' ],
 | 
			
		||||
        [ $c->l('qma_REASONS_SUCCESS') => 'zsuccesses' ],
 | 
			
		||||
        [ $c->l('qma_SENDER_UIDS') => 'zsuids' ]
 | 
			
		||||
    );
 | 
			
		||||
		[$c->l('qma_Daily_Summary_Report_yesterday') => 'daily_summary'],
 | 
			
		||||
		[$c->l('qma_Daily_Summary_Report_today') => 'daily_summary_today'],
 | 
			
		||||
		[$c->l('qma_Daily_Summary_Report_all') => 'daily_summary_all'],
 | 
			
		||||
		#[$c->l('qma_Top Senders and Recipients') => 'top_senders'],
 | 
			
		||||
		#[$c->l('qma_Bounce Rate Analysis') => 'bounce_analysis'],
 | 
			
		||||
		#[$c->l('qma_Spam and Virus Filtering Report') => 'spam_and_virus'],
 | 
			
		||||
		#[$c->l('qma_Delivery Status Report') => 'delivery_status'],
 | 
			
		||||
		#[$c->l('qma_Geographic Analysis of Email') => 'geo_analysis'],
 | 
			
		||||
		#[$c->l('qma_Traffic Analysis') => 'traffic_analysis'],
 | 
			
		||||
		#[$c->l('qma_Authentication Analysis') => 'auth_analysis'],
 | 
			
		||||
		#[$c->l('qma_User Activity Report') => 'user_activity'],
 | 
			
		||||
		#[$c->l('qma_Error Reporting') => 'error_reporting'],
 | 
			
		||||
		#[$c->l('qma_Comparison Reports') => 'comparison_reports'],
 | 
			
		||||
		#[$c->l('qma_Customized Reports') => 'customized_reports'],
 | 
			
		||||
	);
 | 
			
		||||
    my @sorted_array = sort { $a->[0] cmp $b->[0] } @array;
 | 
			
		||||
    return \@sorted_array;
 | 
			
		||||
} ## end sub reportType_list
 | 
			
		||||
 | 
			
		||||
sub daily_summary_report {
 | 
			
		||||
    my $log_file = shift;  # Path to log file
 | 
			
		||||
    my $output = qx(ls -1 /var/log/maillog* | xargs cat |pflogsumm -d yesterday --detail 0 --no-no-msg-size);
 | 
			
		||||
    return format_as_html("Daily Summary Report", $output);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
1;
 | 
			
		||||
sub daily_summary_report_today {
 | 
			
		||||
    my $log_file = shift;  # Path to log file
 | 
			
		||||
    my $output = qx(ls -1 /var/log/maillog* | xargs cat |pflogsumm -d today --detail 0 --no-no-msg-size);
 | 
			
		||||
    return format_as_html("Daily Summary Report", $output);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub daily_summary_report_all {
 | 
			
		||||
    my $log_file = shift;  # Path to log file
 | 
			
		||||
    my $output = qx(ls -1 /var/log/maillog* | xargs cat |pflogsumm --detail 0 --no-no-msg-size);
 | 
			
		||||
    return format_as_html("Summary Report across all logs", $output);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub top_senders_and_recipients {
 | 
			
		||||
    my $log_file = shift;
 | 
			
		||||
    my $output = qx(pflogsumm --smtpd-stats $log_file);
 | 
			
		||||
    return format_as_html("Top Senders and Recipients", $output);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub bounce_rate_analysis {
 | 
			
		||||
    my $log_file = shift;
 | 
			
		||||
    my $output = qx(pflogsumm --bounce-detail 10 $log_file);  # Show up to 10 bounce details
 | 
			
		||||
    return format_as_html("Bounce Rate Analysis", $output);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub spam_and_virus_filter_report {
 | 
			
		||||
    my $log_file = shift;
 | 
			
		||||
    my $output = qx(pflogsumm -u 10 $log_file);  # User report with up to 10 entries
 | 
			
		||||
    return format_as_html("Spam and Virus Filtering Report", $output);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub delivery_status_report {
 | 
			
		||||
    my $log_file = shift;
 | 
			
		||||
    my $output = qx(pflogsumm --deferral-detail 10 $log_file);  # Show deferral details
 | 
			
		||||
    return format_as_html("Delivery Status Report", $output);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub geographical_analysis_of_email {
 | 
			
		||||
    my $log_file = shift;
 | 
			
		||||
    # `pflogsumm` doesn't have a specific option for geographic analysis in the help text;
 | 
			
		||||
    # It's assumed this could be replaced with something relevant, like a SMTP detail.
 | 
			
		||||
    my $output = qx(pflogsumm --smtp-detail 10 $log_file);  # Show up to 10 SMTP details
 | 
			
		||||
    return format_as_html("Geographic Analysis of Email", $output);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub traffic_analysis {
 | 
			
		||||
    my $log_file = shift;
 | 
			
		||||
    my $output = qx(pflogsumm --verbose-msg-detail $log_file);  # Request verbose detail
 | 
			
		||||
    return format_as_html("Traffic Analysis", $output);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub authentication_analysis {
 | 
			
		||||
    my $log_file = shift;
 | 
			
		||||
    my $output = qx(pflogsumm -u 10 --verbose-msg-detail $log_file);  # User detailed report
 | 
			
		||||
    return format_as_html("Authentication Analysis", $output);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub user_activity_report {
 | 
			
		||||
    my $log_file = shift;
 | 
			
		||||
    my $output = qx(pflogsumm -u 20 $log_file);  # Show user activity for up to 20 users
 | 
			
		||||
    return format_as_html("User Activity Report", $output);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub error_reporting {
 | 
			
		||||
    my $log_file = shift;
 | 
			
		||||
    my $output = qx(pflogsumm --problems-first $log_file);  # This will show problems first
 | 
			
		||||
    return format_as_html("Error Reporting", $output);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub comparison_reports {
 | 
			
		||||
    my ($log_file1, $log_file2) = @_; # Comparing two log files
 | 
			
		||||
    my $output = qx(pflogsumm $log_file1 $log_file2);  # Standard comparison without special flags
 | 
			
		||||
    return format_as_html("Comparison Reports", $output);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub customized_reports {
 | 
			
		||||
    my $log_file = shift;
 | 
			
		||||
    # Because we don't have a concrete custom flag, we'll consider using -d with specific detail.
 | 
			
		||||
    my $output = qx(pflogsumm --detail 10 $log_file);  # Generally show detailed summary
 | 
			
		||||
    return format_as_html("Customized Reports", $output);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub format_as_html {
 | 
			
		||||
    my ($title, $content) = @_;
 | 
			
		||||
    return <<HTML;
 | 
			
		||||
<h2>$title</h2>
 | 
			
		||||
<pre>$content</pre>
 | 
			
		||||
HTML
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
### 1. Message Tracking
 | 
			
		||||
#sub trace_message {
 | 
			
		||||
    #my ($log_path, $message_id) = @_;
 | 
			
		||||
    ##my $tracer = Mail::Log::Trace::Postfix->new({log_file => $log_path});
 | 
			
		||||
    ##$tracer->set_message_id($message_id);
 | 
			
		||||
    
 | 
			
		||||
    #my $output = "Message Tracking Report for ID: $message_id\n";
 | 
			
		||||
    ##$output .= "=" x 50 . "\n";
 | 
			
		||||
    ##$output .= sprintf "%-12s: %s\n", 'From', $tracer->get_from_address;
 | 
			
		||||
    ##$output .= sprintf "%-12s: %s\n", 'Status', $tracer->get_final_status;
 | 
			
		||||
    
 | 
			
		||||
    ##$output .= "\nRecipients:\n";
 | 
			
		||||
    ##$output .= join("\n", map { "- $_" } $tracer->get_recipient_addresses);
 | 
			
		||||
    
 | 
			
		||||
    ##$output .= "\n\nTimeline:\n";
 | 
			
		||||
    ##my $timeline = $tracer->get_timestamps;
 | 
			
		||||
    ##while (my ($stage, $time) = each %$timeline) {
 | 
			
		||||
        ##$output .= sprintf "%-10s: %s\n", ucfirst($stage), $time;
 | 
			
		||||
    ##}
 | 
			
		||||
    
 | 
			
		||||
    #return $output || "No records found for message ID: $message_id";
 | 
			
		||||
#}
 | 
			
		||||
 | 
			
		||||
#### 2. Queue Analysis
 | 
			
		||||
#sub get_queue_stats {
 | 
			
		||||
    #my $spool_dir = '/var/spool/postfix';
 | 
			
		||||
    #my %queues = map { $_ => 0 } qw(active deferred bounce hold corrupt);
 | 
			
		||||
    
 | 
			
		||||
    #foreach my $q (keys %queues) {
 | 
			
		||||
        #opendir(my $dh, "$spool_dir/$q");
 | 
			
		||||
        #$queues{$q} = scalar(grep { -f "$spool_dir/$q/$_" } readdir($dh));
 | 
			
		||||
        #closedir($dh);
 | 
			
		||||
    #}
 | 
			
		||||
    
 | 
			
		||||
    #my $output = "Current Postfix Queue Status\n";
 | 
			
		||||
    #$output .= "=" x 30 . "\n";
 | 
			
		||||
    #$output .= sprintf "%-10s: %3d messages\n", ucfirst($_), $queues{$_} 
 | 
			
		||||
        #for sort keys %queues;
 | 
			
		||||
    #$output .= "\nTotal: " . sum(values %queues) . " messages in queue";
 | 
			
		||||
    
 | 
			
		||||
    #return $output;
 | 
			
		||||
#}
 | 
			
		||||
 | 
			
		||||
#### 3. Message Statistics
 | 
			
		||||
#sub get_message_stats {
 | 
			
		||||
    #my ($log_path) = @_;
 | 
			
		||||
    #my %stats = (received => 0, rejected => 0, delivered => 0, 
 | 
			
		||||
                #deferred => 0, bounced => 0, held => 0);
 | 
			
		||||
 | 
			
		||||
    #open(my $fh, '<', $log_path);
 | 
			
		||||
    #while(<$fh>) {
 | 
			
		||||
        #$stats{received}++ if /qmgr.*: [A-Z0-9]+: from=/;
 | 
			
		||||
        #$stats{delivered}++ if /status=sent/;
 | 
			
		||||
        #$stats{rejected}++ if /NOQUEUE: reject/;
 | 
			
		||||
        #$stats{deferred}++ if /status=deferred/;
 | 
			
		||||
        #$stats{bounced}++ if /status=bounced/;
 | 
			
		||||
        #$stats{held}++ if /status=hold/;
 | 
			
		||||
    #}
 | 
			
		||||
    #close($fh);
 | 
			
		||||
    
 | 
			
		||||
    #my $output = "Message Statistics for " . localtime . "\n";
 | 
			
		||||
    #$output .= "=" x 40 . "\n";
 | 
			
		||||
    #$output .= sprintf "%-12s: %6d\n", 'Received', $stats{received};
 | 
			
		||||
    #$output .= sprintf "%-12s: %6d (%.1f%%)\n", 'Delivered', $stats{delivered},
 | 
			
		||||
        #($stats{received} ? ($stats{delivered}/$stats{received}*100) : 0);
 | 
			
		||||
    #$output .= sprintf "%-12s: %6d\n", 'Rejected', $stats{rejected};
 | 
			
		||||
    #$output .= sprintf "%-12s: %6d\n", 'Deferred', $stats{deferred};
 | 
			
		||||
    #$output .= sprintf "%-12s: %6d\n", 'Bounced', $stats{bounced};
 | 
			
		||||
    #$output .= sprintf "%-12s: %6d\n", 'Held', $stats{held};
 | 
			
		||||
    
 | 
			
		||||
    #return $output;
 | 
			
		||||
#}
 | 
			
		||||
 | 
			
		||||
#### 4. User Activity Audit
 | 
			
		||||
#sub get_user_activity {
 | 
			
		||||
    #my ($log_path, $email) = @_;
 | 
			
		||||
    ##my $tracer = Mail::Log::Trace::Postfix->new({log_file => $log_path});
 | 
			
		||||
    
 | 
			
		||||
    ##my $sent = scalar $tracer->find_messages_by_sender($email);
 | 
			
		||||
    ##my $received = scalar $tracer->find_messages_by_recipient($email);
 | 
			
		||||
    
 | 
			
		||||
    #my $output = "Activity Report for: $email\n";
 | 
			
		||||
    ##$output .= "=" x (length($email) + 18) . "\n";
 | 
			
		||||
    ##$output .= "Messages sent:     $sent\n";
 | 
			
		||||
    ##$output .= "Messages received: $received\n\n";
 | 
			
		||||
    
 | 
			
		||||
    ##$output .= "Last week's activity:\n";
 | 
			
		||||
    ##$output .= join("\n", map { sprintf "- %s: %d messages", $_->[0], $_->[1] }
 | 
			
		||||
        ##$tracer->get_weekly_stats($email));
 | 
			
		||||
    
 | 
			
		||||
    #return $output || "No activity found for $email";
 | 
			
		||||
#}
 | 
			
		||||
 | 
			
		||||
#### 5. Security Monitoring
 | 
			
		||||
#sub detect_auth_failures {
 | 
			
		||||
    #my ($log_path) = @_;
 | 
			
		||||
    #my %failures;
 | 
			
		||||
    
 | 
			
		||||
    #open(my $fh, '<', $log_path);
 | 
			
		||||
    #while(<$fh>) {
 | 
			
		||||
        #if(/SASL (?:LOGIN|PLAIN) authentication failed.*?\[([0-9.]+)\]/) {
 | 
			
		||||
            #$failures{$1}++;
 | 
			
		||||
        #}
 | 
			
		||||
    #}
 | 
			
		||||
    #close($fh);
 | 
			
		||||
    
 | 
			
		||||
    #return "No authentication failures found" unless keys %failures;
 | 
			
		||||
    
 | 
			
		||||
    #my $output = "Authentication Failure Report\n";
 | 
			
		||||
    #$output .= "=" x 30 . "\n";
 | 
			
		||||
    #$output .= sprintf "%-15s %s\n", 'IP Address', 'Attempts';
 | 
			
		||||
    #$output .= sprintf "%-15s %s\n", '-' x 15, '-' x 7;
 | 
			
		||||
    
 | 
			
		||||
    #foreach my $ip (sort { $failures{$b} <=> $failures{$a} } keys %failures) {
 | 
			
		||||
        #$output .= sprintf "%-15s %5d\n", $ip, $failures{$ip};
 | 
			
		||||
    #}
 | 
			
		||||
    #$output .= "\nTotal failures: " . sum(values %failures);
 | 
			
		||||
    
 | 
			
		||||
    #return $output;
 | 
			
		||||
#}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
1;
 | 
			
		||||
@@ -12,182 +12,199 @@ use strict;
 | 
			
		||||
use warnings;
 | 
			
		||||
use Mojo::Base 'Mojolicious::Controller';
 | 
			
		||||
 | 
			
		||||
use esmith::FormMagick::Panel::quota;
 | 
			
		||||
 | 
			
		||||
#use esmith::TestUtils;
 | 
			
		||||
use Scalar::Util qw(looks_like_number);
 | 
			
		||||
 | 
			
		||||
use Locale::gettext;
 | 
			
		||||
use SrvMngr::I18N;
 | 
			
		||||
 | 
			
		||||
use SrvMngr qw(theme_list init_session);
 | 
			
		||||
 | 
			
		||||
#our $db = esmith::ConfigDB->open || die "Couldn't open config db";
 | 
			
		||||
our $adb = esmith::AccountsDB->open || die "Couldn't open accounts db";
 | 
			
		||||
 | 
			
		||||
#our $adb = esmith::AccountsDB->open || die "Couldn't open accounts db";
 | 
			
		||||
my $adb;
 | 
			
		||||
 | 
			
		||||
sub main {
 | 
			
		||||
 | 
			
		||||
    my $c = shift;
 | 
			
		||||
    $c->app->log->info($c->log_req);
 | 
			
		||||
 | 
			
		||||
    my %quo_datas = ();
 | 
			
		||||
    my $title = $c->l('quo_FORM_TITLE');
 | 
			
		||||
 | 
			
		||||
    my $title     = $c->l('quo_FORM_TITLE');
 | 
			
		||||
	$adb = esmith::AccountsDB->open || die "Couldn't open accounts db";
 | 
			
		||||
    $quo_datas{'trt'} = 'LIST';
 | 
			
		||||
 | 
			
		||||
    my @userAccounts;
 | 
			
		||||
 | 
			
		||||
    if ($adb) {
 | 
			
		||||
        @userAccounts = $adb->users();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    $c->stash( title => $title, quo_datas => \%quo_datas, userAccounts => \@userAccounts );
 | 
			
		||||
    $c->stash(title => $title, quo_datas => \%quo_datas, userAccounts => \@userAccounts);
 | 
			
		||||
    $c->render(template => 'quota');
 | 
			
		||||
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
} ## end sub main
 | 
			
		||||
 | 
			
		||||
sub do_display {
 | 
			
		||||
 | 
			
		||||
    my $c = shift;
 | 
			
		||||
 | 
			
		||||
    my $rt = $c->current_route;
 | 
			
		||||
    my $trt = ($c->param('trt') || 'LIST');
 | 
			
		||||
    my $c    = shift;
 | 
			
		||||
    my $rt   = $c->current_route;
 | 
			
		||||
    my $trt  = ($c->param('trt') || 'LIST');
 | 
			
		||||
    my $user = $c->param('user') || '';
 | 
			
		||||
 | 
			
		||||
    $trt = 'UPD' if ( $user );
 | 
			
		||||
 | 
			
		||||
    $trt = 'UPD' if ($user);
 | 
			
		||||
    my %quo_datas = ();
 | 
			
		||||
    my $title = $c->l('quo_FORM_TITLE');
 | 
			
		||||
 | 
			
		||||
    my $title     = $c->l('quo_FORM_TITLE');
 | 
			
		||||
	$adb = esmith::AccountsDB->open || die "Couldn't open accounts db";
 | 
			
		||||
    $quo_datas{'trt'} = $trt;
 | 
			
		||||
 | 
			
		||||
        if ( $trt eq 'UPD' ) {
 | 
			
		||||
 | 
			
		||||
	    my $rec = $adb->get($user);
 | 
			
		||||
	    if ($rec and $rec->prop('type') eq 'user') {
 | 
			
		||||
    		$quo_datas{user} = $user;
 | 
			
		||||
    		$quo_datas{userRec} = $rec;
 | 
			
		||||
		my $max = esmith::FormMagick::Panel::quota->toBestUnit($rec->prop('MaxBlocks'));
 | 
			
		||||
    		$quo_datas{hardlim} = $max;
 | 
			
		||||
		$max = esmith::FormMagick::Panel::quota->toBestUnit($rec->prop('MaxBlocksSoftLim'));
 | 
			
		||||
    		$quo_datas{softlim} = $max;
 | 
			
		||||
	    }
 | 
			
		||||
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
    $c->stash( title => $title, quo_datas => \%quo_datas );
 | 
			
		||||
    $c->render( template => 'quota' );
 | 
			
		||||
 | 
			
		||||
};
 | 
			
		||||
    if ($trt eq 'UPD') {
 | 
			
		||||
        my $rec = $adb->get($user);
 | 
			
		||||
 | 
			
		||||
        if ($rec and $rec->prop('type') eq 'user') {
 | 
			
		||||
            $quo_datas{user}    = $user;
 | 
			
		||||
            $quo_datas{userRec} = $rec;
 | 
			
		||||
            my $max = $c->toBestUnit($rec->prop('MaxBlocks'));
 | 
			
		||||
            $quo_datas{hardlim} = $max;
 | 
			
		||||
            $max                = $c->toBestUnit($rec->prop('MaxBlocksSoftLim'));
 | 
			
		||||
            $quo_datas{softlim} = $max;
 | 
			
		||||
        } ## end if ($rec and $rec->prop...)
 | 
			
		||||
    } ## end if ($trt eq 'UPD')
 | 
			
		||||
    $c->stash(title => $title, quo_datas => \%quo_datas);
 | 
			
		||||
    $c->render(template => 'quota');
 | 
			
		||||
} ## end sub do_display
 | 
			
		||||
 | 
			
		||||
sub do_update {
 | 
			
		||||
 | 
			
		||||
    my $c = shift;
 | 
			
		||||
    $c->app->log->info($c->log_req);
 | 
			
		||||
 | 
			
		||||
    my $title = $c->l('quo_FORM_TITLE');
 | 
			
		||||
    my $title     = $c->l('quo_FORM_TITLE');
 | 
			
		||||
    my %quo_datas = ();
 | 
			
		||||
 | 
			
		||||
    my $rt = $c->current_route;
 | 
			
		||||
    my $trt = ($c->param('trt') || 'LIST');
 | 
			
		||||
 | 
			
		||||
    my $rt        = $c->current_route;
 | 
			
		||||
    my $trt       = ($c->param('trt') || 'LIST');
 | 
			
		||||
    $quo_datas{trt} = $trt;
 | 
			
		||||
    my $result = '';
 | 
			
		||||
    my $res;
 | 
			
		||||
	$adb = esmith::AccountsDB->open || die "Couldn't open accounts db";
 | 
			
		||||
 | 
			
		||||
    if ( $trt eq 'UPD' ) {
 | 
			
		||||
 | 
			
		||||
	$quo_datas{user} = ($c->param('user') || '');
 | 
			
		||||
	$quo_datas{softlim} = ($c->param('Soft') || '');
 | 
			
		||||
    if ($trt eq 'UPD') {
 | 
			
		||||
        $quo_datas{user}    = ($c->param('user') || '');
 | 
			
		||||
        $quo_datas{softlim} = ($c->param('Soft') || '');
 | 
			
		||||
        $quo_datas{hardlim} = ($c->param('Hard') || '');
 | 
			
		||||
 | 
			
		||||
	# controls
 | 
			
		||||
	$res = validate_quota( $c, $quo_datas{user}, $quo_datas{softlim}, $quo_datas{hardlim} );
 | 
			
		||||
	$result .= $res unless $res eq 'OK';
 | 
			
		||||
        # controls
 | 
			
		||||
        $res = validate_quota($c, $quo_datas{user}, $quo_datas{softlim}, $quo_datas{hardlim});
 | 
			
		||||
        $result .= $res unless $res eq 'OK';
 | 
			
		||||
 | 
			
		||||
	if ( ! $result ) {
 | 
			
		||||
	    $result = $c->l('quo_SUCCESSFULLY_MODIFIED') . ' ' . $quo_datas{user};
 | 
			
		||||
	} else {
 | 
			
		||||
	    $quo_datas{userRec} = $adb->get($quo_datas{user}) || undef;
 | 
			
		||||
	}
 | 
			
		||||
    }
 | 
			
		||||
        if (!$result) {
 | 
			
		||||
            $result = $c->l('quo_SUCCESSFULLY_MODIFIED') . ' ' . $quo_datas{user};
 | 
			
		||||
        } else {
 | 
			
		||||
            $quo_datas{userRec} = $adb->get($quo_datas{user}) || undef;
 | 
			
		||||
        }
 | 
			
		||||
    } ## end if ($trt eq 'UPD')
 | 
			
		||||
 | 
			
		||||
    # common parts
 | 
			
		||||
 | 
			
		||||
    if ($res ne 'OK') {
 | 
			
		||||
	$c->stash( error => $result );
 | 
			
		||||
	$c->stash( title => $title, quo_datas => \%quo_datas );
 | 
			
		||||
	return $c->render('quota');
 | 
			
		||||
        $c->stash(error => $result);
 | 
			
		||||
        $c->stash(title => $title, quo_datas => \%quo_datas);
 | 
			
		||||
        return $c->render('quota');
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    my $message = "'Quota' updates ($trt) DONE";
 | 
			
		||||
    $c->app->log->info($message);
 | 
			
		||||
    $c->flash( success => $result );
 | 
			
		||||
 | 
			
		||||
    $c->flash(success => $result);
 | 
			
		||||
    $c->redirect_to('/quota');
 | 
			
		||||
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
} ## end sub do_update
 | 
			
		||||
 | 
			
		||||
sub validate_quota {
 | 
			
		||||
    my ($c, $acct, $softlim, $hardlim ) = @_;
 | 
			
		||||
    my ($c, $acct, $softlim, $hardlim) = @_;
 | 
			
		||||
    my $msg;
 | 
			
		||||
 | 
			
		||||
    my $rec = $adb->get($acct);
 | 
			
		||||
    return $c->l('quo_ERR_NO_SUCH_ACCT') . ' : ' . $acct  unless (defined $rec);
 | 
			
		||||
 | 
			
		||||
    return $c->l('quo_ERR_NO_SUCH_ACCT') . ' : ' . $acct unless (defined $rec);
 | 
			
		||||
    my $type = $rec->prop('type');
 | 
			
		||||
 | 
			
		||||
    unless ($type eq "user") {
 | 
			
		||||
	$msg = $c->l('quo_ERR_NOT_A_USER_ACCT').$acct.$c->l('quo_ACCOUNT_IS_TYPE').$type;
 | 
			
		||||
	return $msg;
 | 
			
		||||
        $msg = $c->l('quo_ERR_NOT_A_USER_ACCT') . $acct . $c->l('quo_ACCOUNT_IS_TYPE') . $type;
 | 
			
		||||
        return $msg;
 | 
			
		||||
    }
 | 
			
		||||
    my $uid = getpwnam($acct);
 | 
			
		||||
    return $c->l('COULD_NOT_GET_UID').$acct unless ($uid);
 | 
			
		||||
    return $c->l('COULD_NOT_GET_UID') . $acct unless ($uid);
 | 
			
		||||
 | 
			
		||||
    if (($softlim !~ /^(.+?)\s*([KMGT])?$/ ) || (!looks_like_number ($1)))  {
 | 
			
		||||
	return $c->l('quo_SOFT_VAL_MUST_BE_NUMBER');
 | 
			
		||||
    if (($softlim !~ /^(.+?)\s*([KMGT])?$/) || (!looks_like_number($1))) {
 | 
			
		||||
        return $c->l('quo_SOFT_VAL_MUST_BE_NUMBER');
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
   my $exponent = 1; # Entries with no suffix are assumed to be in megabytes.
 | 
			
		||||
   if (defined ($2)) { 
 | 
			
		||||
   	$exponent = index("KMGT",$2);
 | 
			
		||||
   }
 | 
			
		||||
   $softlim = ($1 * 1024 ** $exponent);
 | 
			
		||||
    my $exponent = 1;    # Entries with no suffix are assumed to be in megabytes.
 | 
			
		||||
 | 
			
		||||
    if (($hardlim !~ /^(.+?)\s*([KMGT])?$/ ) || (!looks_like_number ($1))) {
 | 
			
		||||
	return $c->l('quo_HARD_VAL_MUST_BE_NUMBER');
 | 
			
		||||
    if (defined($2)) {
 | 
			
		||||
        $exponent = index("KMGT", $2);
 | 
			
		||||
    }
 | 
			
		||||
   $exponent = 1; # Entries with no suffix are assumed to be in megabytes.
 | 
			
		||||
   if (defined ($2)) 
 | 
			
		||||
   { 
 | 
			
		||||
   	$exponent = index("KMGT",$2);
 | 
			
		||||
   }   
 | 
			
		||||
   $hardlim = ($1 * 1024 ** $exponent);
 | 
			
		||||
    $softlim = ($1 * 1024**$exponent);
 | 
			
		||||
 | 
			
		||||
    if (($hardlim !~ /^(.+?)\s*([KMGT])?$/) || (!looks_like_number($1))) {
 | 
			
		||||
        return $c->l('quo_HARD_VAL_MUST_BE_NUMBER');
 | 
			
		||||
    }
 | 
			
		||||
    $exponent = 1;       # Entries with no suffix are assumed to be in megabytes.
 | 
			
		||||
 | 
			
		||||
    if (defined($2)) {
 | 
			
		||||
        $exponent = index("KMGT", $2);
 | 
			
		||||
    }
 | 
			
		||||
    $hardlim = ($1 * 1024**$exponent);
 | 
			
		||||
 | 
			
		||||
    #------------------------------------------------------------
 | 
			
		||||
    # Make sure that soft limit is less than hard limit.
 | 
			
		||||
    #------------------------------------------------------------
 | 
			
		||||
 | 
			
		||||
    unless ($hardlim == 0 or $hardlim > $softlim) {
 | 
			
		||||
	return $c->l('quo_ERR_HARD_LT_SOFT');
 | 
			
		||||
        return $c->l('quo_ERR_HARD_LT_SOFT');
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    #------------------------------------------------------------
 | 
			
		||||
    # Update accounts database and signal the user-modify event.
 | 
			
		||||
    #------------------------------------------------------------
 | 
			
		||||
 | 
			
		||||
    $rec->set_prop('MaxBlocks', $hardlim);
 | 
			
		||||
    $rec->set_prop('MaxBlocks',        $hardlim);
 | 
			
		||||
    $rec->set_prop('MaxBlocksSoftLim', $softlim);
 | 
			
		||||
 | 
			
		||||
    # Untaint $acct before using in system().
 | 
			
		||||
    $acct =~ /^(\w[\-\w_\.]*)$/; $acct = $1;
 | 
			
		||||
    system ("/sbin/e-smith/signal-event", "user-modify", "$acct") == 0
 | 
			
		||||
        or die ($c->l('quo_ERR_MODIFYING')."\n");
 | 
			
		||||
 | 
			
		||||
    $acct =~ /^(\w[\-\w_\.]*)$/;
 | 
			
		||||
    $acct = $1;
 | 
			
		||||
    system("/sbin/e-smith/signal-event", "user-modify", "$acct") == 0
 | 
			
		||||
        or die($c->l('quo_ERR_MODIFYING') . "\n");
 | 
			
		||||
    return 'OK';
 | 
			
		||||
} ## end sub validate_quota
 | 
			
		||||
 | 
			
		||||
sub toMB
 | 
			
		||||
{
 | 
			
		||||
    my ($self,$kb) = @_;
 | 
			
		||||
    return sprintf("%.2f", $kb / 1024);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub toMBNoDecimalPlaces
 | 
			
		||||
{
 | 
			
		||||
    my ($self,$kb) = @_;
 | 
			
		||||
    return sprintf("%.0f", $kb / 1024);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub toGBNoDecimalPlaces
 | 
			
		||||
{
 | 
			
		||||
    my ($self,$kb) = @_;
 | 
			
		||||
    return sprintf("%.0f", $kb / 1024 / 1024);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub toKB 
 | 
			
		||||
{
 | 
			
		||||
    my ($self,$mb) = @_;
 | 
			
		||||
    return sprintf("%.0f", $mb * 1024);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
sub GBtoKB
 | 
			
		||||
{
 | 
			
		||||
    my ($self,$gb) = @_;
 | 
			
		||||
    return sprintf("%.0f", $gb * 1024 * 1024);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub MBtoKB
 | 
			
		||||
{
 | 
			
		||||
    my ($self,$mb) = @_;
 | 
			
		||||
    return sprintf("%.0f", $mb * 1024);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub toBestUnit
 | 
			
		||||
{
 | 
			
		||||
    my ($self,$kb) = @_;
 | 
			
		||||
    return 0 if($kb == 0);
 | 
			
		||||
    return $kb."K" if($kb < 1024);
 | 
			
		||||
    return $kb."K" if($kb > 1024 && $kb < 1048576 && $kb % 1024 != 0);
 | 
			
		||||
    return $self->toMBNoDecimalPlaces($kb)."M" if($kb < 1048576);
 | 
			
		||||
    return $self->toMBNoDecimalPlaces($kb)."M" if($kb > 1048576 
 | 
			
		||||
	&& ($kb % 1048576 != 0));
 | 
			
		||||
    return $self->toGBNoDecimalPlaces($kb)."G";
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
1
 | 
			
		||||
 
 | 
			
		||||
@@ -1,87 +1,78 @@
 | 
			
		||||
package SrvMngr::Controller::Reboot;
 | 
			
		||||
 | 
			
		||||
#----------------------------------------------------------------------
 | 
			
		||||
# heading     : System 
 | 
			
		||||
# heading     : System
 | 
			
		||||
# description : Reboot or shutdown
 | 
			
		||||
# navigation  : 4000 700 
 | 
			
		||||
# navigation  : 4000 700
 | 
			
		||||
#
 | 
			
		||||
# routes : end
 | 
			
		||||
#----------------------------------------------------------------------
 | 
			
		||||
use strict;
 | 
			
		||||
use warnings;
 | 
			
		||||
use Mojo::Base 'Mojolicious::Controller';
 | 
			
		||||
 | 
			
		||||
use Locale::gettext;
 | 
			
		||||
use SrvMngr::I18N;
 | 
			
		||||
 | 
			
		||||
use SrvMngr qw(theme_list init_session);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
sub main {
 | 
			
		||||
 | 
			
		||||
    my $c = shift;
 | 
			
		||||
    $c->app->log->info($c->log_req);
 | 
			
		||||
 | 
			
		||||
    my $title = $c->l('rbo_FORM_TITLE');
 | 
			
		||||
    my $modul = '';
 | 
			
		||||
 | 
			
		||||
    $c->stash( title => $title, modul => $modul );
 | 
			
		||||
    $c->stash(title => $title, modul => $modul);
 | 
			
		||||
    $c->render(template => 'reboot');
 | 
			
		||||
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
} ## end sub main
 | 
			
		||||
 | 
			
		||||
sub do_action {
 | 
			
		||||
 | 
			
		||||
    my $c = shift;
 | 
			
		||||
    $c->app->log->info($c->log_req);
 | 
			
		||||
 | 
			
		||||
    my $title = $c->l('rbo_FORM_TITLE');
 | 
			
		||||
    my $result = "";
 | 
			
		||||
 | 
			
		||||
    my $function = $c->param ('function');
 | 
			
		||||
 | 
			
		||||
    my $debug = $c->param('debug');
 | 
			
		||||
    my $title    = $c->l('rbo_FORM_TITLE');
 | 
			
		||||
    my $result   = "";
 | 
			
		||||
    my $function = $c->param('function');
 | 
			
		||||
    my $debug    = $c->param('debug');
 | 
			
		||||
 | 
			
		||||
    if ($function eq "reboot") {
 | 
			
		||||
	$result = $c->l('rbo_REBOOT_SUCCEEDED') . '<br>' . $c->l('rbo_DESC_REBOOT');
 | 
			
		||||
        $result = $c->l('rbo_REBOOT_SUCCEEDED') . '<br>' . $c->l('rbo_DESC_REBOOT');
 | 
			
		||||
 | 
			
		||||
        unless ($debug) {
 | 
			
		||||
	    esmith::util::backgroundCommand( 1, "/sbin/e-smith/signal-event", "reboot" );
 | 
			
		||||
    #       system( "/sbin/e-smith/signal-event", "reboot" ) == 0
 | 
			
		||||
    #             or die ("Error occurred while rebooting.\n");
 | 
			
		||||
                 }
 | 
			
		||||
            esmith::util::backgroundCommand(1, "/sbin/e-smith/signal-event", "reboot");
 | 
			
		||||
 | 
			
		||||
            #       system( "/sbin/e-smith/signal-event", "reboot" ) == 0
 | 
			
		||||
            #             or die ("Error occurred while rebooting.\n");
 | 
			
		||||
        } ## end unless ($debug)
 | 
			
		||||
    } elsif ($function eq 'shutdown') {
 | 
			
		||||
	$result = $c->l('rbo_SHUTDOWN_SUCCEEDED') . '<br>' . $c->l('rbo_DESC_SHUTDOWN');
 | 
			
		||||
        $result = $c->l('rbo_SHUTDOWN_SUCCEEDED') . '<br>' . $c->l('rbo_DESC_SHUTDOWN');
 | 
			
		||||
 | 
			
		||||
        unless ($debug) {
 | 
			
		||||
	    esmith::util::backgroundCommand( 1, "/sbin/e-smith/signal-event", "halt" );
 | 
			
		||||
    #       system( "/sbin/e-smith/signal-event", "halt" ) == 0
 | 
			
		||||
    #             or die ("Error occurred while halting.\n");
 | 
			
		||||
           }
 | 
			
		||||
            esmith::util::backgroundCommand(1, "/sbin/e-smith/signal-event", "halt");
 | 
			
		||||
 | 
			
		||||
            #       system( "/sbin/e-smith/signal-event", "halt" ) == 0
 | 
			
		||||
            #             or die ("Error occurred while halting.\n");
 | 
			
		||||
        } ## end unless ($debug)
 | 
			
		||||
    } elsif ($function eq 'reconfigure') {
 | 
			
		||||
	$result = $c->l('rbo_RECONFIGURE_SUCCEEDED') . '<br>' . $c->l('rbo_DESC_RECONFIGURE');
 | 
			
		||||
        $result = $c->l('rbo_RECONFIGURE_SUCCEEDED') . '<br>' . $c->l('rbo_DESC_RECONFIGURE');
 | 
			
		||||
 | 
			
		||||
        unless ($debug) {
 | 
			
		||||
	#    esmith::util::backgroundCommand( 1, "/sbin/e-smith/signal-event", "post-upgrade",
 | 
			
		||||
	#	    "; ", "/sbin/e-smith/signal-event", "reboot" );
 | 
			
		||||
           system( "/sbin/e-smith/signal-event", "post-upgrade" ) == 0
 | 
			
		||||
                 or die ("Error occurred while running post-upgrade.\n");
 | 
			
		||||
           system( "/sbin/e-smith/signal-event", "reboot" ) == 0
 | 
			
		||||
                 or die ("Error occurred while rebooting.\n");
 | 
			
		||||
           }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    $c->stash( title => $title, modul => $result );
 | 
			
		||||
            #    esmith::util::backgroundCommand( 1, "/sbin/e-smith/signal-event", "post-upgrade",
 | 
			
		||||
            #	    "; ", "/sbin/e-smith/signal-event", "reboot" );
 | 
			
		||||
            esmith::util::backgroundCommand( 1, "/sbin/e-smith/signal-event", "post-upgrade-and-reboot");
 | 
			
		||||
		    #system("/sbin/e-smith/signal-event", "post-upgrade") == 0
 | 
			
		||||
		    #or die("Error occurred while running post-upgrade.\n");
 | 
			
		||||
		    #system("/sbin/e-smith/signal-event", "reboot") == 0
 | 
			
		||||
		    #or die("Error occurred while rebooting.\n");
 | 
			
		||||
        } ## end unless ($debug)
 | 
			
		||||
    } ## end elsif ($function eq 'reconfigure')
 | 
			
		||||
    $c->stash(title => $title, modul => $result);
 | 
			
		||||
    $c->render(template => 'module');
 | 
			
		||||
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
} ## end sub do_action
 | 
			
		||||
 | 
			
		||||
sub rebootFunction_list {
 | 
			
		||||
 | 
			
		||||
    my $c = shift;
 | 
			
		||||
    return [[ $c->l('rbo_REBOOT') => 'reboot' ],
 | 
			
		||||
	    [ $c->l('RECONFIGURE') => 'reconfigure' ],
 | 
			
		||||
	    [ $c->l('SHUTDOWN') => 'shutdown' ]];
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    return [
 | 
			
		||||
        [ $c->l('rbo_REBOOT')  => 'reboot' ],
 | 
			
		||||
        [ $c->l('RECONFIGURE') => 'reconfigure' ],
 | 
			
		||||
        [ $c->l('SHUTDOWN')    => 'shutdown' ]
 | 
			
		||||
    ];
 | 
			
		||||
} ## end sub rebootFunction_list
 | 
			
		||||
1;
 | 
			
		||||
 
 | 
			
		||||
@@ -11,12 +11,9 @@ package SrvMngr::Controller::Remoteaccess;
 | 
			
		||||
use strict;
 | 
			
		||||
use warnings;
 | 
			
		||||
use Mojo::Base 'Mojolicious::Controller';
 | 
			
		||||
 | 
			
		||||
use Locale::gettext;
 | 
			
		||||
use SrvMngr::I18N;
 | 
			
		||||
 | 
			
		||||
use SrvMngr qw(theme_list init_session ip_number subnet_mask get_reg_mask);
 | 
			
		||||
 | 
			
		||||
use esmith::ConfigDB;
 | 
			
		||||
use esmith::util;
 | 
			
		||||
use File::Basename;
 | 
			
		||||
@@ -25,165 +22,150 @@ use Carp;
 | 
			
		||||
use Socket qw( inet_aton );
 | 
			
		||||
 | 
			
		||||
#our @ISA = qw(esmith::FormMagick Exporter);
 | 
			
		||||
 | 
			
		||||
our @EXPORT = qw( networkAccess_list passwordLogin_list get_ssh_permit_root_login get_ssh_access get_telnet_mode
 | 
			
		||||
		get_ftp_access  get_ftp_password_login_access
 | 
			
		||||
		get_value get_prop get_ssh_password_auth
 | 
			
		||||
		validate_network_and_mask ip_number_or_blank subnet_mask_or_blank
 | 
			
		||||
		get_ipsecrw_sessions pptp_and_dhcp_range
 | 
			
		||||
    get_ftp_access  get_ftp_password_login_access
 | 
			
		||||
    get_value get_prop get_ssh_password_auth
 | 
			
		||||
    validate_network_and_mask ip_number_or_blank subnet_mask_or_blank
 | 
			
		||||
    get_ipsecrw_sessions pptp_and_dhcp_range
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
#		get_pptp_sessions
 | 
			
		||||
 | 
			
		||||
our $db = esmith::ConfigDB->open || warn "Couldn't open configuration database";
 | 
			
		||||
 | 
			
		||||
my  $db; # = esmith::ConfigDB->open || warn "Couldn't open configuration database"; 
 | 
			
		||||
 | 
			
		||||
sub main {
 | 
			
		||||
 | 
			
		||||
    my $c = shift;
 | 
			
		||||
    $c->app->log->info($c->log_req);
 | 
			
		||||
 | 
			
		||||
    my $title = $c->l('rma_FORM_TITLE');
 | 
			
		||||
    my $notif = '';
 | 
			
		||||
    my $title     = $c->l('rma_FORM_TITLE');
 | 
			
		||||
    my $notif     = '';
 | 
			
		||||
    my %rma_datas = ();
 | 
			
		||||
    $db = esmith::ConfigDB->open || warn "Couldn't open configuration database";
 | 
			
		||||
 | 
			
		||||
    #$rma_datas{ipsecrwSess}  = $c->get_ipsecrw_sessions();
 | 
			
		||||
    #$rma_datas{pptpSessions} = $c->get_pptp_sessions();
 | 
			
		||||
    $rma_datas{sshAccess} = $c->get_ssh_access();
 | 
			
		||||
    $rma_datas{sshPermitRootLogin} = $c->get_ssh_permit_root_login();
 | 
			
		||||
    $rma_datas{sshAccess}                 = $c->get_ssh_access();
 | 
			
		||||
    $rma_datas{sshPermitRootLogin}        = $c->get_ssh_permit_root_login();
 | 
			
		||||
    $rma_datas{sshPasswordAuthentication} = $c->get_ssh_password_auth();
 | 
			
		||||
    $rma_datas{sshTCPPort} = $c->get_ssh_port();
 | 
			
		||||
    $rma_datas{ftpAccess} = $c->get_ftp_access();
 | 
			
		||||
    $rma_datas{ftpPasswordAccess} = $c->get_ftp_password_login_access();
 | 
			
		||||
    $rma_datas{sshTCPPort}                = $c->get_ssh_port();
 | 
			
		||||
    $rma_datas{ftpAccess}                 = $c->get_ftp_access();
 | 
			
		||||
    $rma_datas{ftpPasswordAccess}         = $c->get_ftp_password_login_access();
 | 
			
		||||
 | 
			
		||||
    #$rma_datas{telnetAccess} = $c->get_telnet_access;
 | 
			
		||||
 | 
			
		||||
    $c->stash( title => $title, notif => $notif, rma_datas => \%rma_datas );
 | 
			
		||||
    $c->stash(title => $title, notif => $notif, rma_datas => \%rma_datas);
 | 
			
		||||
    $c->render(template => 'remoteaccess');
 | 
			
		||||
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
} ## end sub main
 | 
			
		||||
 | 
			
		||||
sub do_action {
 | 
			
		||||
 | 
			
		||||
    my $c = shift;
 | 
			
		||||
    $c->app->log->info($c->log_req);
 | 
			
		||||
 | 
			
		||||
    my $title = $c->l('rma_FORM_TITLE');
 | 
			
		||||
    my ($result, $res, $trt) = '';
 | 
			
		||||
    my %rma_datas = ();
 | 
			
		||||
 | 
			
		||||
    $rma_datas{ipsecrwSess}  = ($c->param ('IpsecrwSess') || '');
 | 
			
		||||
    $rma_datas{ipsecrwReset}  = ($c->param ('IpsecrwReset') || '');
 | 
			
		||||
    $db = esmith::ConfigDB->open || warn "Couldn't open configuration database";
 | 
			
		||||
    $rma_datas{ipsecrwSess}  = ($c->param('IpsecrwSess')  || '');
 | 
			
		||||
    $rma_datas{ipsecrwReset} = ($c->param('IpsecrwReset') || '');
 | 
			
		||||
 | 
			
		||||
    #$rma_datas{pptpSessions} = ($c->param ('PptpSessions') || '0');
 | 
			
		||||
 | 
			
		||||
    $rma_datas{validFromNetwork} = ($c->param ('ValidFromNetwork') || '');
 | 
			
		||||
    $rma_datas{validFromMask} = ($c->param ('ValidFromMask') || '');
 | 
			
		||||
    $rma_datas{validFromNetwork} = ($c->param('ValidFromNetwork') || '');
 | 
			
		||||
    $rma_datas{validFromMask}    = ($c->param('ValidFromMask')    || '');
 | 
			
		||||
##	my @remove = $q->param('validFromRemove');  ???????? the first one only !!
 | 
			
		||||
    my @vals = $c->param ('Remove_nets');
 | 
			
		||||
    my @vals = $c->param('Remove_nets');
 | 
			
		||||
    $rma_datas{remove_nets} = join ',', @vals;
 | 
			
		||||
 | 
			
		||||
    $rma_datas{sshaccess} = ($c->param ('SshAccess') || 'off');
 | 
			
		||||
    $rma_datas{sshPermitRootLogin} = ($c->param ('SshPermitRootLogin') || 'no');
 | 
			
		||||
    $rma_datas{sshPasswordAuthentication} = ($c->param ('SshPasswordAuthentication') || 'no');
 | 
			
		||||
    $rma_datas{sshTCPPort} = ($c->param ('SshTCPPort') || '22');
 | 
			
		||||
 | 
			
		||||
    $rma_datas{ftpAccess} = ($c->param ('FtpAccess') || 'off');
 | 
			
		||||
    $rma_datas{ftpPasswordAccess} = ($c->param ('FtpPasswordAccess') || 'private');
 | 
			
		||||
 | 
			
		||||
    $rma_datas{telnetAccess} = ($c->param ('TelnetAccess') || 'off');
 | 
			
		||||
    $rma_datas{sshaccess}                 = ($c->param('SshAccess')                 || 'off');
 | 
			
		||||
    $rma_datas{sshPermitRootLogin}        = ($c->param('SshPermitRootLogin')        || 'no');
 | 
			
		||||
    $rma_datas{sshPasswordAuthentication} = ($c->param('SshPasswordAuthentication') || 'no');
 | 
			
		||||
    $rma_datas{sshTCPPort}                = ($c->param('SshTCPPort')                || '22');
 | 
			
		||||
    $rma_datas{ftpAccess}                 = ($c->param('FtpAccess')                 || 'off');
 | 
			
		||||
    $rma_datas{ftpPasswordAccess}         = ($c->param('FtpPasswordAccess')         || 'private');
 | 
			
		||||
    $rma_datas{telnetAccess}              = ($c->param('TelnetAccess')              || 'off');
 | 
			
		||||
 | 
			
		||||
    # validate
 | 
			
		||||
    my $v = $c->validation;
 | 
			
		||||
    return $c->render('remoteaccess') unless $v->has_data;
 | 
			
		||||
 | 
			
		||||
    #$v->optional('PptpSessions')->num(0, 999)->is_valid;
 | 
			
		||||
    $v->optional('ValidFromNetwork')->size(7, 15)->is_valid;
 | 
			
		||||
    $v->optional('ValidFromMask')->size(7, 15)->is_valid;
 | 
			
		||||
    $v->required('SshTCPPort')->num(1, 65535)->is_valid;
 | 
			
		||||
 | 
			
		||||
    $result .= 'field validation error' if $v->has_error;
 | 
			
		||||
 | 
			
		||||
    if ( ! $result ) {
 | 
			
		||||
 | 
			
		||||
	# controls
 | 
			
		||||
	#$res = pptp_and_dhcp_range( $c, $rma_datas{pptpSessions} );
 | 
			
		||||
	#$result .= $res . ' ' unless $res eq 'OK';
 | 
			
		||||
 | 
			
		||||
	$res = ip_number_or_blank( $c, $rma_datas{validFromNetwork} );
 | 
			
		||||
	$result .= $res . ' ' unless $res eq 'OK';
 | 
			
		||||
 | 
			
		||||
	$res = subnet_mask_or_blank( $c, $rma_datas{validFromMask} );
 | 
			
		||||
	$result .= $res . ' ' unless $res eq 'OK';
 | 
			
		||||
 | 
			
		||||
	$res = validate_network_and_mask( $c, $rma_datas{validFromNetwork}, $rma_datas{validFromMask} );
 | 
			
		||||
	$result .= $res . ' ' unless $res eq 'OK';
 | 
			
		||||
 | 
			
		||||
	#$result .= ' blocked for testing !' . $rma_datas{remove_nets};
 | 
			
		||||
    if ($c->param('ValidFromNetwork') ne "") {
 | 
			
		||||
        $v->optional('ValidFromNetwork')->size(7, 15)->is_valid;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if ( ! $result ) {
 | 
			
		||||
        $res = change_settings( $c, %rma_datas );
 | 
			
		||||
    if ($c->param('ValidFromMask') ne "") {
 | 
			
		||||
        $v->optional('ValidFromMask')->size(7, 15)->is_valid;
 | 
			
		||||
    }
 | 
			
		||||
    $v->required('SshTCPPort')->num(1, 65535)->is_valid;
 | 
			
		||||
    $result .= 'field validation error' if $v->has_error;
 | 
			
		||||
 | 
			
		||||
    if (!$result) {
 | 
			
		||||
 | 
			
		||||
        # controls
 | 
			
		||||
        #$res = pptp_and_dhcp_range( $c, $rma_datas{pptpSessions} );
 | 
			
		||||
        #$result .= $res . ' ' unless $res eq 'OK';
 | 
			
		||||
        $res = ip_number_or_blank($c, $rma_datas{validFromNetwork});
 | 
			
		||||
        $result .= $res . ' ' unless $res eq 'OK';
 | 
			
		||||
        $res = subnet_mask_or_blank($c, $rma_datas{validFromMask});
 | 
			
		||||
        $result .= $res . ' ' unless $res eq 'OK';
 | 
			
		||||
        $res = validate_network_and_mask($c, $rma_datas{validFromNetwork}, $rma_datas{validFromMask});
 | 
			
		||||
        $result .= $res . ' ' unless $res eq 'OK';
 | 
			
		||||
 | 
			
		||||
        #$result .= ' blocked for testing !' . $rma_datas{remove_nets};
 | 
			
		||||
    } ## end if (!$result)
 | 
			
		||||
 | 
			
		||||
    if (!$result) {
 | 
			
		||||
        $res = change_settings($c, %rma_datas);
 | 
			
		||||
        $result .= $res unless $res eq 'OK';
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if ( ! $result ) {
 | 
			
		||||
        $result = $c->l('rma_ACTION_SUCCEEDED'); 
 | 
			
		||||
        $trt = 'SUC';
 | 
			
		||||
    if ($result eq "") {
 | 
			
		||||
        $result = $c->l('rma_SUCCESS');
 | 
			
		||||
        $trt    = 'SUC';
 | 
			
		||||
    }
 | 
			
		||||
    $c->stash(title => $title, notif => $result, rma_datas => \%rma_datas);
 | 
			
		||||
 | 
			
		||||
    $c->stash( title => $title, notif => $result, rma_datas => \%rma_datas );
 | 
			
		||||
 | 
			
		||||
    if ( $trt ne 'SUC' ) {
 | 
			
		||||
	return $c->render(template => 'remoteaccess');
 | 
			
		||||
    #return $c->render( template => 'remoteaccess' );
 | 
			
		||||
    if ($trt eq 'SUC') {
 | 
			
		||||
        $c->stash(title => $title, modul => $result);
 | 
			
		||||
        return $c->render(template => 'module');
 | 
			
		||||
    }
 | 
			
		||||
    return $c->render(template => 'remoteaccess');
 | 
			
		||||
 | 
			
		||||
    $c->redirect_to('/remoteaccess');
 | 
			
		||||
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
    #$c->redirect_to('/remoteaccess');
 | 
			
		||||
} ## end sub do_action
 | 
			
		||||
 | 
			
		||||
sub networkAccess_list {
 | 
			
		||||
    my $c = shift;
 | 
			
		||||
    return  [[ $c->l('rma_NO_ACCESS') => 'off'], 
 | 
			
		||||
	    [ $c->l('NETWORKS_ALLOW_LOCAL') => 'private'], 
 | 
			
		||||
	    [ $c->l('NETWORKS_ALLOW_PUBLIC') => 'public']];
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
    return [
 | 
			
		||||
        [ $c->l('rma_NO_ACCESS')         => 'off' ],
 | 
			
		||||
        [ $c->l('NETWORKS_ALLOW_LOCAL')  => 'private' ],
 | 
			
		||||
        [ $c->l('NETWORKS_ALLOW_PUBLIC') => 'public' ]
 | 
			
		||||
    ];
 | 
			
		||||
} ## end sub networkAccess_list
 | 
			
		||||
 | 
			
		||||
sub passwordLogin_list {
 | 
			
		||||
    my $c = shift;
 | 
			
		||||
    return  [[$c->l('rma_PASSWORD_LOGIN_PRIVATE') => 'private'],
 | 
			
		||||
	     [$c->l('rma_PASSWORD_LOGIN_PUBLIC') => 'public']];
 | 
			
		||||
    return [ [ $c->l('rma_PASSWORD_LOGIN_PRIVATE') => 'private' ], [ $c->l('rma_PASSWORD_LOGIN_PUBLIC') => 'public' ] ];
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
sub get_prop {
 | 
			
		||||
 | 
			
		||||
  my ($c, $item, $prop) = @_;
 | 
			
		||||
  warn "You must specify a record key"    unless $item;
 | 
			
		||||
  warn "You must specify a property name" unless $prop;
 | 
			
		||||
  my $record = $db->get($item) or warn "Couldn't get record for $item";
 | 
			
		||||
  return $record ? $record->prop($prop) : undef;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
    $db = esmith::ConfigDB->open || warn "Couldn't open configuration database";
 | 
			
		||||
    my ($c, $item, $prop) = @_;
 | 
			
		||||
    warn "You must specify a record key"    unless $item;
 | 
			
		||||
    warn "You must specify a property name" unless $prop;
 | 
			
		||||
    my $record = $db->get($item) or warn "Couldn't get record for $item";
 | 
			
		||||
    return $record ? $record->prop($prop) : undef;
 | 
			
		||||
} ## end sub get_prop
 | 
			
		||||
 | 
			
		||||
sub get_value {
 | 
			
		||||
 | 
			
		||||
  my $c = shift;
 | 
			
		||||
  my $item = shift;
 | 
			
		||||
  return ($db->get($item)->value());
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
    my $c    = shift;
 | 
			
		||||
    my $item = shift;
 | 
			
		||||
    $db = esmith::ConfigDB->open || warn "Couldn't open configuration database";
 | 
			
		||||
    $db = esmith::ConfigDB->open || warn "Couldn't open configuration database";
 | 
			
		||||
    return ($db->get($item)->value());
 | 
			
		||||
} ## end sub get_value
 | 
			
		||||
 | 
			
		||||
sub get_ftp_access {
 | 
			
		||||
 | 
			
		||||
    my $status = get_prop('','ftp','status') || 'disabled';
 | 
			
		||||
    my $status = get_prop('', 'ftp', 'status') || 'disabled';
 | 
			
		||||
    return 'off' unless $status eq 'enabled';
 | 
			
		||||
 | 
			
		||||
    my $access = get_prop('','ftp','access') || 'private';
 | 
			
		||||
    return ($access  eq 'public') ? 'normal' : 'private';
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
    my $access = get_prop('', 'ftp', 'access') || 'private';
 | 
			
		||||
    return ($access eq 'public') ? 'normal' : 'private';
 | 
			
		||||
} ## end sub get_ftp_access
 | 
			
		||||
 | 
			
		||||
#sub get_pptp_sessions {
 | 
			
		||||
#  my $status = get_prop('','pptpd','status');
 | 
			
		||||
@@ -191,315 +173,270 @@ sub get_ftp_access {
 | 
			
		||||
#    return(get_prop('','pptpd','sessions') || 'no');
 | 
			
		||||
#  return '0';
 | 
			
		||||
#}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
sub get_ssh_permit_root_login {
 | 
			
		||||
    return(get_prop('','sshd','PermitRootLogin') || 'no');
 | 
			
		||||
    return (get_prop('', 'sshd', 'PermitRootLogin') || 'no');
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
sub get_ssh_password_auth {
 | 
			
		||||
    return(get_prop('','sshd','PasswordAuthentication') || 'yes');
 | 
			
		||||
    return (get_prop('', 'sshd', 'PasswordAuthentication') || 'yes');
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
sub get_ssh_access {
 | 
			
		||||
 | 
			
		||||
  my $status = get_prop('','sshd','status');
 | 
			
		||||
  if (defined($status) && ($status eq 'enabled')) {
 | 
			
		||||
    my $access = get_prop('','sshd','access');
 | 
			
		||||
    $access = ($access eq 'public') ? 'public' : 'private';
 | 
			
		||||
    return($access);
 | 
			
		||||
  }
 | 
			
		||||
  else {
 | 
			
		||||
    return('off');
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
	my $c = shift;
 | 
			
		||||
    my $status = $c->get_prop('sshd', 'status');
 | 
			
		||||
    if (defined($status) && ($status eq 'enabled')) {
 | 
			
		||||
        my $access = get_prop('', 'sshd', 'access');
 | 
			
		||||
        $access = ($access eq 'public') ? 'public' : 'private';
 | 
			
		||||
        return ($access);
 | 
			
		||||
    } else {
 | 
			
		||||
        return ('off');
 | 
			
		||||
    }
 | 
			
		||||
} ## end sub get_ssh_access
 | 
			
		||||
 | 
			
		||||
sub get_ssh_port {
 | 
			
		||||
    return(get_prop('$c','sshd','TCPPort') || '22');
 | 
			
		||||
    return (get_prop('$c', 'sshd', 'TCPPort') || '22');
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
sub get_ftp_password_login_access {
 | 
			
		||||
 | 
			
		||||
    my $status = get_prop('','ftp','status') || 'disabled';
 | 
			
		||||
    my $status = get_prop('', 'ftp', 'status') || 'disabled';
 | 
			
		||||
    return 'private' unless $status eq 'enabled';
 | 
			
		||||
 | 
			
		||||
    my $access = get_prop('','ftp','LoginAccess') || 'private';
 | 
			
		||||
 | 
			
		||||
    return ($access  eq 'public') ? 'public' : 'private';
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
    my $access = get_prop('', 'ftp', 'LoginAccess') || 'private';
 | 
			
		||||
    return ($access eq 'public') ? 'public' : 'private';
 | 
			
		||||
} ## end sub get_ftp_password_login_access
 | 
			
		||||
 | 
			
		||||
sub get_telnet_mode {
 | 
			
		||||
    $db = esmith::ConfigDB->open || warn "Couldn't open configuration database";
 | 
			
		||||
    my $telnet = $db->get('telnet');
 | 
			
		||||
    return ('off') unless $telnet;
 | 
			
		||||
    my $status = $telnet->prop('status') || 'disabled';
 | 
			
		||||
    return ('off') unless $status eq 'enabled';
 | 
			
		||||
    my $access = $telnet->prop('access') || 'private';
 | 
			
		||||
    return ($access eq "public") ? "public" : "private";
 | 
			
		||||
} ## end sub get_telnet_mode
 | 
			
		||||
 | 
			
		||||
  my $telnet = $db->get('telnet');
 | 
			
		||||
  return('off') unless $telnet;
 | 
			
		||||
  my $status = $telnet->prop('status') || 'disabled';
 | 
			
		||||
  return('off') unless $status eq 'enabled';
 | 
			
		||||
  my $access = $telnet->prop('access') || 'private';
 | 
			
		||||
  return ($access eq "public") ? "public" : "private";
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
sub get_ipsecrw_sessions  {
 | 
			
		||||
 | 
			
		||||
  my $status = $db->get('ipsec')->prop('RoadWarriorStatus');
 | 
			
		||||
  if (defined($status) && ($status eq 'enabled')) {
 | 
			
		||||
    return($db->get('ipsec')->prop('RoadWarriorSessions') || '0');
 | 
			
		||||
  }
 | 
			
		||||
  else {
 | 
			
		||||
    return('0');
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub get_ipsecrw_sessions {
 | 
			
		||||
    $db = esmith::ConfigDB->open || warn "Couldn't open configuration database";
 | 
			
		||||
    my $status = $db->get('ipsec')->prop('RoadWarriorStatus');
 | 
			
		||||
    if (defined($status) && ($status eq 'enabled')) {
 | 
			
		||||
        return ($db->get('ipsec')->prop('RoadWarriorSessions') || '0');
 | 
			
		||||
    } else {
 | 
			
		||||
        return ('0');
 | 
			
		||||
    }
 | 
			
		||||
} ## end sub get_ipsecrw_sessions
 | 
			
		||||
 | 
			
		||||
sub get_ipsecrw_status {
 | 
			
		||||
 | 
			
		||||
  return undef unless ( $db->get('ipsec'));
 | 
			
		||||
  return $db->get('ipsec')->prop('RoadWarriorStatus');
 | 
			
		||||
 | 
			
		||||
    $db = esmith::ConfigDB->open || warn "Couldn't open configuration database";
 | 
			
		||||
    return undef unless ($db->get('ipsec'));
 | 
			
		||||
    return $db->get('ipsec')->prop('RoadWarriorStatus');
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
sub pptp_and_dhcp_range {
 | 
			
		||||
    my $c           = shift;
 | 
			
		||||
    my $val         = shift || 0;
 | 
			
		||||
    $db = esmith::ConfigDB->open || warn "Couldn't open configuration database";
 | 
			
		||||
    my $dhcp_status = $db->get_prop('dhcpd', 'status') || 'disabled';
 | 
			
		||||
    my $dhcp_end    = $db->get_prop('dhcpd', 'end') || '';
 | 
			
		||||
    my $dhcp_start  = $db->get_prop('dhcpd', 'start') || '';
 | 
			
		||||
 | 
			
		||||
  my $c = shift;
 | 
			
		||||
  my $val = shift || 0;
 | 
			
		||||
  my $dhcp_status     = $db->get_prop('dhcpd','status') || 'disabled';
 | 
			
		||||
  my $dhcp_end        = $db->get_prop('dhcpd','end') || '';
 | 
			
		||||
  my $dhcp_start      = $db->get_prop('dhcpd','start') || '';
 | 
			
		||||
 | 
			
		||||
    if ( $dhcp_status eq 'enabled' ) {
 | 
			
		||||
        my $ip_start     = unpack 'N', inet_aton($dhcp_start);
 | 
			
		||||
        my $ip_end       = unpack 'N', inet_aton($dhcp_end);
 | 
			
		||||
        my $ip_count     = $ip_end - $ip_start;
 | 
			
		||||
        return 'OK' if( $val < $ip_count );
 | 
			
		||||
    if ($dhcp_status eq 'enabled') {
 | 
			
		||||
        my $ip_start = unpack 'N', inet_aton($dhcp_start);
 | 
			
		||||
        my $ip_end   = unpack 'N', inet_aton($dhcp_end);
 | 
			
		||||
        my $ip_count = $ip_end - $ip_start;
 | 
			
		||||
        return 'OK' if ($val < $ip_count);
 | 
			
		||||
        return $c->l('rma_NUMBER_OF_PPTP_CLIENTS_MUST_BE_LESSER_THAN_NUMBER_OF_IP_IN_DHCP_RANGE');
 | 
			
		||||
    } else {
 | 
			
		||||
        return 'OK';
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
} ## end sub pptp_and_dhcp_range
 | 
			
		||||
 | 
			
		||||
sub _get_valid_from {
 | 
			
		||||
 | 
			
		||||
	my $c = shift;
 | 
			
		||||
 | 
			
		||||
	my $rec = $db->get('httpd-admin');
 | 
			
		||||
	return undef unless($rec);
 | 
			
		||||
	my @vals = (split ',', ($rec->prop('ValidFrom') || ''));
 | 
			
		||||
	return @vals;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
    my $c   = shift;
 | 
			
		||||
    $db = esmith::ConfigDB->open || warn "Couldn't open configuration database";
 | 
			
		||||
    my $rec = $db->get('httpd-admin');
 | 
			
		||||
    return undef unless ($rec);
 | 
			
		||||
    my @vals = (split ',', ($rec->prop('ValidFrom') || ''));
 | 
			
		||||
    return @vals;
 | 
			
		||||
} ## end sub _get_valid_from
 | 
			
		||||
 | 
			
		||||
sub ip_number_or_blank {
 | 
			
		||||
 | 
			
		||||
    my $c = shift;
 | 
			
		||||
    my $c  = shift;
 | 
			
		||||
    my $ip = shift;
 | 
			
		||||
 | 
			
		||||
    if (!defined($ip) || $ip eq "") {
 | 
			
		||||
	return 'OK';
 | 
			
		||||
        return 'OK';
 | 
			
		||||
    }
 | 
			
		||||
    return ip_number($c, $ip);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
} ## end sub ip_number_or_blank
 | 
			
		||||
 | 
			
		||||
sub subnet_mask_or_blank {
 | 
			
		||||
 | 
			
		||||
    my $c = shift;
 | 
			
		||||
    my $c    = shift;
 | 
			
		||||
    my $mask = shift;
 | 
			
		||||
 | 
			
		||||
    if (!defined($mask) || $mask eq "") {
 | 
			
		||||
        return "OK";
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    chomp $mask ;
 | 
			
		||||
 | 
			
		||||
    return ( subnet_mask( $mask ) ne 'OK' ) ? $c->l('rma_INVALID_SUBNET_MASK') . " (" . $mask . ")" : 'OK';
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
    chomp $mask;
 | 
			
		||||
    return (subnet_mask($mask) ne 'OK')
 | 
			
		||||
        ? $c->l('rma_INVALID_SUBNET_MASK') . " (" . $mask . ")"
 | 
			
		||||
        : 'OK';
 | 
			
		||||
} ## end sub subnet_mask_or_blank
 | 
			
		||||
 | 
			
		||||
sub validate_network_and_mask {
 | 
			
		||||
    my $c    = shift;
 | 
			
		||||
    my $net  = shift || "";
 | 
			
		||||
    my $mask = shift || "";
 | 
			
		||||
 | 
			
		||||
  my $c = shift;
 | 
			
		||||
  my $net = shift  || "";
 | 
			
		||||
  my $mask = shift || "";
 | 
			
		||||
 | 
			
		||||
  if ($net xor $mask) {
 | 
			
		||||
    return $c->l('rma_ERR_INVALID_PARAMS' . " (" . $net."/".$mask . ")");
 | 
			
		||||
  }
 | 
			
		||||
  return 'OK';
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
    if ($net xor $mask) {
 | 
			
		||||
        return $c->l('rma_ERR_INVALID_PARAMS' . " (" . $net . "/" . $mask . ")");
 | 
			
		||||
    }
 | 
			
		||||
    return 'OK';
 | 
			
		||||
} ## end sub validate_network_and_mask
 | 
			
		||||
 | 
			
		||||
sub change_settings {
 | 
			
		||||
 | 
			
		||||
    my ($c, %rma_datas) = @_;
 | 
			
		||||
 | 
			
		||||
    $db = esmith::ConfigDB->open || warn "Couldn't open configuration database";
 | 
			
		||||
    #------------------------------------------------------------
 | 
			
		||||
    # good; go ahead and change the access.
 | 
			
		||||
    #------------------------------------------------------------
 | 
			
		||||
 | 
			
		||||
    $db = esmith::ConfigDB->open || warn "Couldn't open configuration database";
 | 
			
		||||
    my $rec = $db->get('telnet');
 | 
			
		||||
    if($rec) {
 | 
			
		||||
    	if ($rma_datas{telnetAccess} eq "off") {
 | 
			
		||||
	    $rec->set_prop('status','disabled');
 | 
			
		||||
    	} else {
 | 
			
		||||
	    $rec->set_prop('status','enabled');
 | 
			
		||||
	    $rec->set_prop('access', $rma_datas{telnetAccess});
 | 
			
		||||
      	}
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    $rec = $db->get('sshd') || $db->new_record('sshd', {type => 'service'});
 | 
			
		||||
    if ($rec) {
 | 
			
		||||
        if ($rma_datas{telnetAccess} eq "off") {
 | 
			
		||||
            $rec->set_prop('status', 'disabled');
 | 
			
		||||
        } else {
 | 
			
		||||
            $rec->set_prop('status', 'enabled');
 | 
			
		||||
            $rec->set_prop('access', $rma_datas{telnetAccess});
 | 
			
		||||
        }
 | 
			
		||||
    } ## end if ($rec)
 | 
			
		||||
    $rec = $db->get('sshd') || $db->new_record('sshd', { type => 'service' });
 | 
			
		||||
    $rec->set_prop('TCPPort', $rma_datas{sshTCPPort});
 | 
			
		||||
    $rec->set_prop('status', ( $rma_datas{sshaccess} eq "off" ? 'disabled' : 'enabled'));
 | 
			
		||||
    $rec->set_prop('access', $rma_datas{sshaccess});
 | 
			
		||||
    $rec->set_prop('PermitRootLogin', $rma_datas{sshPermitRootLogin});
 | 
			
		||||
    $rec->set_prop('status', ($rma_datas{sshaccess} eq "off" ? 'disabled' : 'enabled'));
 | 
			
		||||
    $rec->set_prop('access',                 $rma_datas{sshaccess});
 | 
			
		||||
    $rec->set_prop('PermitRootLogin',        $rma_datas{sshPermitRootLogin});
 | 
			
		||||
    $rec->set_prop('PasswordAuthentication', $rma_datas{sshPasswordAuthentication});
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    $rec = $db->get('ftp');
 | 
			
		||||
    if($rec) {
 | 
			
		||||
    	if ($rma_datas{ftpAccess} eq "off") {
 | 
			
		||||
	    $rec->set_prop('status', 'disabled');
 | 
			
		||||
	    $rec->set_prop('access', 'private');
 | 
			
		||||
	    $rec->set_prop('LoginAccess', 'private');
 | 
			
		||||
    	} elsif ($rma_datas{ftpAccess} eq "normal") {
 | 
			
		||||
	    $rec->set_prop('status', 'enabled');
 | 
			
		||||
	    $rec->set_prop('access', 'public');
 | 
			
		||||
	    $rec->set_prop('LoginAccess', $rma_datas{ftpPasswordAccess});
 | 
			
		||||
    	} else {
 | 
			
		||||
	    $rec->set_prop('status', 'enabled');
 | 
			
		||||
	    $rec->set_prop('access', 'private');
 | 
			
		||||
	    $rec->set_prop('LoginAccess', $rma_datas{ftpPasswordAccess});
 | 
			
		||||
    	}
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
#	if ($rma_datas{pptpSessions} == 0) {
 | 
			
		||||
#	$db->get('pptpd')->set_prop('status', 'disabled');
 | 
			
		||||
#    } else {
 | 
			
		||||
#	$db->get('pptpd')->set_prop('status', 'enabled');
 | 
			
		||||
#	$db->get('pptpd')->set_prop('sessions', $rma_datas{pptpSessions});
 | 
			
		||||
#    }
 | 
			
		||||
    if ($rec) {
 | 
			
		||||
        if ($rma_datas{ftpAccess} eq "off") {
 | 
			
		||||
            $rec->set_prop('status',      'disabled');
 | 
			
		||||
            $rec->set_prop('access',      'private');
 | 
			
		||||
            $rec->set_prop('LoginAccess', 'private');
 | 
			
		||||
        } elsif ($rma_datas{ftpAccess} eq "normal") {
 | 
			
		||||
            $rec->set_prop('status',      'enabled');
 | 
			
		||||
            $rec->set_prop('access',      'public');
 | 
			
		||||
            $rec->set_prop('LoginAccess', $rma_datas{ftpPasswordAccess});
 | 
			
		||||
        } else {
 | 
			
		||||
            $rec->set_prop('status',      'enabled');
 | 
			
		||||
            $rec->set_prop('access',      'private');
 | 
			
		||||
            $rec->set_prop('LoginAccess', $rma_datas{ftpPasswordAccess});
 | 
			
		||||
        }
 | 
			
		||||
    } ## end if ($rec)
 | 
			
		||||
 | 
			
		||||
    if ( $rma_datas{validFromNetwork} && $rma_datas{validFromMask} ) {
 | 
			
		||||
	unless (add_new_valid_from( $c, $rma_datas{validFromNetwork}, $rma_datas{validFromMask} )) {
 | 
			
		||||
	    return $c->l('rma_ERROR_UPDATING_CONFIGURATION') . 'new net';
 | 
			
		||||
	}
 | 
			
		||||
    }
 | 
			
		||||
    #	if ($rma_datas{pptpSessions} == 0) {
 | 
			
		||||
    #	$db->get('pptpd')->set_prop('status', 'disabled');
 | 
			
		||||
    #    } else {
 | 
			
		||||
    #	$db->get('pptpd')->set_prop('status', 'enabled');
 | 
			
		||||
    #	$db->get('pptpd')->set_prop('sessions', $rma_datas{pptpSessions});
 | 
			
		||||
    #    }
 | 
			
		||||
    if ($rma_datas{validFromNetwork} && $rma_datas{validFromMask}) {
 | 
			
		||||
 | 
			
		||||
        unless (add_new_valid_from($c, $rma_datas{validFromNetwork}, $rma_datas{validFromMask})) {
 | 
			
		||||
            return $c->l('rma_ERROR_UPDATING_CONFIGURATION') . 'new net';
 | 
			
		||||
        }
 | 
			
		||||
    } ## end if ($rma_datas{validFromNetwork...})
 | 
			
		||||
 | 
			
		||||
    if ($rma_datas{remove_nets}) {
 | 
			
		||||
        unless (remove_valid_from($c, $rma_datas{remove_nets})) {
 | 
			
		||||
            return $c->l('rma_ERROR_UPDATING_CONFIGURATION') . 'del net';
 | 
			
		||||
        }
 | 
			
		||||
    } ## end if ($rma_datas{remove_nets...})
 | 
			
		||||
 | 
			
		||||
    if ( $rma_datas{remove_nets} ) {
 | 
			
		||||
	unless (remove_valid_from( $c, $rma_datas{remove_nets} )) {
 | 
			
		||||
	    return $c->l('rma_ERROR_UPDATING_CONFIGURATION') . 'del net';
 | 
			
		||||
	}
 | 
			
		||||
    }
 | 
			
		||||
  
 | 
			
		||||
    # reset ipsec roadwarrior CA,server,client certificates
 | 
			
		||||
    if ($rma_datas{ipsecrwReset}) {
 | 
			
		||||
	system('/sbin/e-smith/roadwarrior', 'reset_certs') == 0 or
 | 
			
		||||
	    return $c->l('rma_ERROR_UPDATING_CONFIGURATION') . 'rst ipsec';
 | 
			
		||||
        system('/sbin/e-smith/roadwarrior', 'reset_certs') == 0
 | 
			
		||||
            or return $c->l('rma_ERROR_UPDATING_CONFIGURATION') . 'rst ipsec';
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if ( $rma_datas{ipsecrwSess} ) {
 | 
			
		||||
	set_ipsecrw_sessions( $c, $rma_datas{ipsecrwSess} );
 | 
			
		||||
    if ($rma_datas{ipsecrwSess}) {
 | 
			
		||||
        set_ipsecrw_sessions($c, $rma_datas{ipsecrwSess});
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    unless ( system( "/sbin/e-smith/signal-event", "remoteaccess-update" ) == 0 ) {
 | 
			
		||||
    unless (system("/sbin/e-smith/signal-event", "remoteaccess-update") == 0) {
 | 
			
		||||
        return $c->l('rma_ERROR_UPDATING_CONFIGURATION');
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return 'OK';
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
} ## end sub change_settings
 | 
			
		||||
 | 
			
		||||
sub set_ipsecrw_sessions {
 | 
			
		||||
 | 
			
		||||
    my $c = shift;
 | 
			
		||||
    my $c        = shift;
 | 
			
		||||
    my $sessions = shift;
 | 
			
		||||
 | 
			
		||||
    $db = esmith::ConfigDB->open || warn "Couldn't open configuration database";
 | 
			
		||||
    if (defined $sessions) {
 | 
			
		||||
	$db->get('ipsec')->set_prop('RoadWarriorSessions', $sessions);
 | 
			
		||||
	if (int($sessions) > 0) {
 | 
			
		||||
	    $db->get('ipsec')->set_prop('RoadWarriorStatus', 'enabled');
 | 
			
		||||
	}
 | 
			
		||||
    }
 | 
			
		||||
    return '';
 | 
			
		||||
}
 | 
			
		||||
        $db->get('ipsec')->set_prop('RoadWarriorSessions', $sessions);
 | 
			
		||||
 | 
			
		||||
        if (int($sessions) > 0) {
 | 
			
		||||
            $db->get('ipsec')->set_prop('RoadWarriorStatus', 'enabled');
 | 
			
		||||
        }
 | 
			
		||||
    } ## end if (defined $sessions)
 | 
			
		||||
    return '';
 | 
			
		||||
} ## end sub set_ipsecrw_sessions
 | 
			
		||||
 | 
			
		||||
sub add_new_valid_from {
 | 
			
		||||
    my $c    = shift;
 | 
			
		||||
    my $net  = shift;
 | 
			
		||||
    my $mask = shift;
 | 
			
		||||
    $db = esmith::ConfigDB->open || warn "Couldn't open configuration database";
 | 
			
		||||
 | 
			
		||||
	my $c = shift;
 | 
			
		||||
	my $net = shift;
 | 
			
		||||
	my $mask = shift;
 | 
			
		||||
 | 
			
		||||
	# we transform bit mask to regular mask
 | 
			
		||||
	$mask = get_reg_mask( $net, $mask );
 | 
			
		||||
 
 | 
			
		||||
	my $rec = $db->get('httpd-admin');
 | 
			
		||||
	return $c->error('ERR_NO_RECORD') unless $rec;
 | 
			
		||||
 | 
			
		||||
	my $prop = $rec->prop('ValidFrom') || '';
 | 
			
		||||
 | 
			
		||||
	my @vals = split /,/, $prop;
 | 
			
		||||
	return '' if (grep /^$net\/$mask$/, @vals); # already have this entry
 | 
			
		||||
 | 
			
		||||
	if ($prop ne '') {
 | 
			
		||||
		$prop .= ",$net/$mask";
 | 
			
		||||
	} else {
 | 
			
		||||
		$prop = "$net/$mask";
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	$rec->set_prop('ValidFrom', $prop);
 | 
			
		||||
 | 
			
		||||
	return 1;
 | 
			
		||||
}
 | 
			
		||||
    # we transform bit mask to regular mask
 | 
			
		||||
    $mask = get_reg_mask($net, $mask);
 | 
			
		||||
    my $rec = $db->get('httpd-admin');
 | 
			
		||||
    return $c->error('ERR_NO_RECORD') unless $rec;
 | 
			
		||||
    my $prop = $rec->prop('ValidFrom') || '';
 | 
			
		||||
    my @vals = split /,/, $prop;
 | 
			
		||||
    return '' if (grep /^$net\/$mask$/, @vals);    # already have this entry
 | 
			
		||||
 | 
			
		||||
    if ($prop ne '') {
 | 
			
		||||
        $prop .= ",$net/$mask";
 | 
			
		||||
    } else {
 | 
			
		||||
        $prop = "$net/$mask";
 | 
			
		||||
    }
 | 
			
		||||
    $rec->set_prop('ValidFrom', $prop);
 | 
			
		||||
    return 1;
 | 
			
		||||
} ## end sub add_new_valid_from
 | 
			
		||||
 | 
			
		||||
sub remove_valid_from {
 | 
			
		||||
    my $c           = shift;
 | 
			
		||||
    my $remove_nets = shift;
 | 
			
		||||
    my @remove      = split /,/, $remove_nets;
 | 
			
		||||
    $db = esmith::ConfigDB->open || warn "Couldn't open configuration database";
 | 
			
		||||
 | 
			
		||||
	my $c = shift;
 | 
			
		||||
	my $remove_nets = shift;
 | 
			
		||||
    #	my @remove = $c->param('Remove_nets');
 | 
			
		||||
    my @vals = $c->_get_valid_from();
 | 
			
		||||
 | 
			
		||||
	my @remove = split /,/, $remove_nets;
 | 
			
		||||
    foreach my $entry (@remove) {
 | 
			
		||||
        return undef unless $entry;
 | 
			
		||||
        my ($net, $mask) = split(/\//, $entry);
 | 
			
		||||
 | 
			
		||||
#	my @remove = $c->param('Remove_nets');
 | 
			
		||||
	my @vals = $c->_get_valid_from();
 | 
			
		||||
        unless (@vals) {
 | 
			
		||||
            print STDERR "ERROR: unable to load ValidFrom property from conf db\n";
 | 
			
		||||
            return undef;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
	foreach my $entry (@remove) {
 | 
			
		||||
	
 | 
			
		||||
	    return undef unless $entry;
 | 
			
		||||
        # what if we don't have a mask because someone added an entry from
 | 
			
		||||
        # the command line? by the time we get here, the panel will have
 | 
			
		||||
        # added a 32 bit mask, so we don't know for sure if the value in db
 | 
			
		||||
        # is $net alone or $net/255.255.255.255. we have to check for both
 | 
			
		||||
        # in this special case...
 | 
			
		||||
        @vals = (grep { $entry ne $_ && $net ne $_ } @vals);
 | 
			
		||||
    } ## end foreach my $entry (@remove)
 | 
			
		||||
    my $prop;
 | 
			
		||||
 | 
			
		||||
	    my ($net, $mask) = split (/\//, $entry);
 | 
			
		||||
 | 
			
		||||
	    unless (@vals)  {
 | 
			
		||||
		print STDERR "ERROR: unable to load ValidFrom property from conf db\n";
 | 
			
		||||
		return undef;
 | 
			
		||||
	    }
 | 
			
		||||
 | 
			
		||||
	    # what if we don't have a mask because someone added an entry from
 | 
			
		||||
	    # the command line? by the time we get here, the panel will have
 | 
			
		||||
	    # added a 32 bit mask, so we don't know for sure if the value in db
 | 
			
		||||
	    # is $net alone or $net/255.255.255.255. we have to check for both
 | 
			
		||||
	    # in this special case...
 | 
			
		||||
	    @vals = (grep { $entry ne $_ && $net ne $_ } @vals);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	my $prop;
 | 
			
		||||
	if (@vals) {
 | 
			
		||||
	    $prop = join ',',@vals;
 | 
			
		||||
	} else {
 | 
			
		||||
	    $prop = '';
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	$db->get('httpd-admin')->set_prop('ValidFrom', $prop);
 | 
			
		||||
 | 
			
		||||
	return 1;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
1;
 | 
			
		||||
    if (@vals) {
 | 
			
		||||
        $prop = join ',', @vals;
 | 
			
		||||
    } else {
 | 
			
		||||
        $prop = '';
 | 
			
		||||
    }
 | 
			
		||||
    $db->get('httpd-admin')->set_prop('ValidFrom', $prop);
 | 
			
		||||
    return 1;
 | 
			
		||||
} ## end sub remove_valid_from
 | 
			
		||||
1;
 | 
			
		||||
@@ -1,56 +1,46 @@
 | 
			
		||||
package SrvMngr::Controller::Request;
 | 
			
		||||
 | 
			
		||||
#
 | 
			
		||||
# routes : end
 | 
			
		||||
#----------------------------------------------------------------------
 | 
			
		||||
use strict;
 | 
			
		||||
use warnings;
 | 
			
		||||
use Mojo::Base 'Mojolicious::Controller';
 | 
			
		||||
 | 
			
		||||
use Locale::gettext;
 | 
			
		||||
use SrvMngr::I18N;
 | 
			
		||||
 | 
			
		||||
use SrvMngr qw(theme_list init_session);
 | 
			
		||||
 | 
			
		||||
# retrieve a configuration db record
 | 
			
		||||
sub getconfig {
 | 
			
		||||
    my $c = shift;
 | 
			
		||||
    my $c   = shift;
 | 
			
		||||
    my $key = $c->param('key');
 | 
			
		||||
 | 
			
		||||
    $c->app->log->info($c->log_req . ' ' . $key);
 | 
			
		||||
 | 
			
		||||
    if ($key) {
 | 
			
		||||
	use esmith::ConfigDB qw(open_ro);
 | 
			
		||||
	my $cdb = esmith::ConfigDB->open_ro;
 | 
			
		||||
	return getdb( $c, $cdb, $key);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
        use esmith::ConfigDB qw(open_ro);
 | 
			
		||||
        my $cdb = esmith::ConfigDB->open_ro;
 | 
			
		||||
        return getdb($c, $cdb, $key);
 | 
			
		||||
    } ## end if ($key)
 | 
			
		||||
} ## end sub getconfig
 | 
			
		||||
 | 
			
		||||
# retrieve an accounts db record, given its name
 | 
			
		||||
sub getaccount {
 | 
			
		||||
    my $c = shift;
 | 
			
		||||
    my $c   = shift;
 | 
			
		||||
    my $key = $c->param('key');
 | 
			
		||||
 | 
			
		||||
    $c->app->log->info($c->log_req . ' ' . $key);
 | 
			
		||||
 | 
			
		||||
    if ($key) {
 | 
			
		||||
	use esmith::AccountsDB qw(open_ro);
 | 
			
		||||
	my $adb = esmith::AccountsDB->open_ro;
 | 
			
		||||
	return getdb( $c, $adb, $key);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
        use esmith::AccountsDB qw(open_ro);
 | 
			
		||||
        my $adb = esmith::AccountsDB->open_ro;
 | 
			
		||||
        return getdb($c, $adb, $key);
 | 
			
		||||
    } ## end if ($key)
 | 
			
		||||
} ## end sub getaccount
 | 
			
		||||
 | 
			
		||||
sub getdb {
 | 
			
		||||
 | 
			
		||||
    my ($c, $db, $key) = @_;
 | 
			
		||||
 | 
			
		||||
    if ( my $rec = $db->get($key) ) {
 | 
			
		||||
	return $c->render(json => { $key => { $rec->props }} );
 | 
			
		||||
    if (my $rec = $db->get($key)) {
 | 
			
		||||
        return $c->render(json => { $key => { $rec->props } });
 | 
			
		||||
    }
 | 
			
		||||
    return undef;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
} ## end sub getdb
 | 
			
		||||
1;
 | 
			
		||||
 
 | 
			
		||||
@@ -1,82 +1,61 @@
 | 
			
		||||
package SrvMngr::Controller::Review;
 | 
			
		||||
 | 
			
		||||
#----------------------------------------------------------------------
 | 
			
		||||
# heading     : Support
 | 
			
		||||
# heading     : Investigation
 | 
			
		||||
# description : Review configuration
 | 
			
		||||
# navigation  : 000 500
 | 
			
		||||
# menu        : N
 | 
			
		||||
# navigation  : 6000 6800
 | 
			
		||||
# routes : end
 | 
			
		||||
#----------------------------------------------------------------------
 | 
			
		||||
# heading-o     : Configuration 
 | 
			
		||||
# description-o : Review configuration
 | 
			
		||||
# navigation-o  : 6000 6800
 | 
			
		||||
 | 
			
		||||
#----------------------------------------------------------------------
 | 
			
		||||
use strict;
 | 
			
		||||
use warnings;
 | 
			
		||||
 | 
			
		||||
use Mojo::Base 'Mojolicious::Controller';
 | 
			
		||||
 | 
			
		||||
use Locale::gettext;
 | 
			
		||||
use SrvMngr::I18N;
 | 
			
		||||
 | 
			
		||||
use SrvMngr qw(theme_list init_session);
 | 
			
		||||
use SrvMngr qw(gen_locale_date_string);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#use SrvMngr::Review_sub qw(print_page);
 | 
			
		||||
#use smeserver::Panel::review;
 | 
			
		||||
use esmith::FormMagick::Panel::review;
 | 
			
		||||
 | 
			
		||||
our $db = esmith::ConfigDB->open_ro || die "Couldn't open config db";
 | 
			
		||||
our $domains = esmith::DomainsDB->open_ro || die "Couldn't open domains";
 | 
			
		||||
our $db       = esmith::ConfigDB->open_ro   || die "Couldn't open config db";
 | 
			
		||||
our $domains  = esmith::DomainsDB->open_ro  || die "Couldn't open domains";
 | 
			
		||||
our $networks = esmith::NetworksDB->open_ro || die "Couldn't open networks";
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
sub main {
 | 
			
		||||
    my $c = shift;
 | 
			
		||||
    $c->app->log->info($c->log_req);
 | 
			
		||||
 | 
			
		||||
    my $title = $c->l('rvw_FORM_TITLE');
 | 
			
		||||
    my $modul = $c->render_to_string(inline => $c->l('rvw_DESCRIPTION'));
 | 
			
		||||
    my $title     = $c->l('rvw_FORM_TITLE');
 | 
			
		||||
    my $modul     = $c->render_to_string(inline => $c->l('rvw_DESCRIPTION'));
 | 
			
		||||
    my %rvw_datas = ();
 | 
			
		||||
 | 
			
		||||
    $rvw_datas{'servermode'} = (get_value('','SystemMode' )|| '');
 | 
			
		||||
    $rvw_datas{'localip'} = get_value('$c','LocalIP' ) 
 | 
			
		||||
			.'/'.get_value('$c','LocalNetmask');
 | 
			
		||||
    $rvw_datas{'publicip'} = 
 | 
			
		||||
	esmith::FormMagick::Panel::review->get_public_ip_address($c);
 | 
			
		||||
    $rvw_datas{'gateway'} = 
 | 
			
		||||
	$c->render_to_string(inline => print2_gateway_stanza($c));
 | 
			
		||||
    $rvw_datas{'serveronly'} = 
 | 
			
		||||
	$c->render_to_string(inline => print2_serveronly_stanza($c));
 | 
			
		||||
    $rvw_datas{'servermode'} = (get_value('', 'SystemMode') || '');
 | 
			
		||||
    $rvw_datas{'localip'}          = get_value('$c', 'LocalIP') . '/' . get_value('$c', 'LocalNetmask');
 | 
			
		||||
    $rvw_datas{'publicip'}         = $c->get_public_ip_address($c);
 | 
			
		||||
    $rvw_datas{'gateway'}          = $c->render_to_string(inline => print2_gateway_stanza($c));
 | 
			
		||||
    $rvw_datas{'serveronly'}       = $c->render_to_string(inline => print2_serveronly_stanza($c));
 | 
			
		||||
    $rvw_datas{'addlocalnetworks'} = get_local_networks($c);
 | 
			
		||||
    $rvw_datas{'dhcpserver'} = 
 | 
			
		||||
	$c->render_to_string(inline => print2_dhcp_stanza($c));
 | 
			
		||||
 | 
			
		||||
    $rvw_datas{'dnsserver'} = (get_value('','LocalIP' )|| '');
 | 
			
		||||
    $rvw_datas{'webserver'} = 'www.'.(get_local_domain());
 | 
			
		||||
    $rvw_datas{'dhcpserver'}       = $c->render_to_string(inline => print2_dhcp_stanza($c));
 | 
			
		||||
    $rvw_datas{'dnsserver'}        = (get_value('', 'LocalIP') || '');
 | 
			
		||||
    $rvw_datas{'webserver'}        = 'www.' . (get_local_domain());
 | 
			
		||||
    my $port = $db->get_prop("squid", "TransparentPort") || 3128;
 | 
			
		||||
    $rvw_datas{'proxyserver'} = 'proxy.'.get_local_domain().":$port";
 | 
			
		||||
    $rvw_datas{'ftpserver'} = 'ftp.'.get_local_domain();
 | 
			
		||||
    $rvw_datas{'smtpserver'} = 'mail.'.get_local_domain();
 | 
			
		||||
 | 
			
		||||
    $rvw_datas{'domainname'} = (get_value('','DomainName' )|| '');
 | 
			
		||||
    $rvw_datas{'virtualdomains'} = 
 | 
			
		||||
	$c->render_to_string(inline => gen2_domains($c));
 | 
			
		||||
    $rvw_datas{'primarywebsite'} = 'http://www.'.get_value('','DomainName');
 | 
			
		||||
    $rvw_datas{'servermanager'} = 'https://'. (get_value('','SystemName') || 'localhost').'/server-manager/';
 | 
			
		||||
    $rvw_datas{'usermanager'} = 'https://'. (get_value('','SystemName') || 'localhost').'/user-password/';
 | 
			
		||||
    $rvw_datas{'emailaddresses'} = 
 | 
			
		||||
	$c->render_to_string(inline => gen2_email_addresses($c));
 | 
			
		||||
    $rvw_datas{'proxyserver'}    = 'proxy.' . get_local_domain() . ":$port";
 | 
			
		||||
    $rvw_datas{'ftpserver'}      = 'ftp.' . get_local_domain();
 | 
			
		||||
    $rvw_datas{'smtpserver'}     = 'mail.' . get_local_domain();
 | 
			
		||||
    $rvw_datas{'domainname'}     = (get_value('', 'DomainName') || '');
 | 
			
		||||
    $rvw_datas{'virtualdomains'} = $c->render_to_string(inline => gen2_domains($c));
 | 
			
		||||
    $rvw_datas{'primarywebsite'} = 'http://www.' . get_value('', 'DomainName');
 | 
			
		||||
    $rvw_datas{'servermanager'}  = 'https://' . (get_value('', 'SystemName') || 'localhost') . '/server-manager/';
 | 
			
		||||
    $rvw_datas{'usermanager'}    = 'https://' . (get_value('', 'SystemName') || 'localhost') . '/user-password/';
 | 
			
		||||
    $rvw_datas{'emailaddresses'} = $c->render_to_string(inline => gen2_email_addresses($c));
 | 
			
		||||
 | 
			
		||||
    #$c->stash( releaseVersion => $c->session->{releaseVersion}, copyRight => $c->session->{copyRight},
 | 
			
		||||
	#PwdSet => $c->session->{PwdSet}, Unsafe => $c->session->{Unsafe},
 | 
			
		||||
    $c->stash( title => $title, modul => $modul, rvw_datas => \%rvw_datas,
 | 
			
		||||
	);
 | 
			
		||||
 | 
			
		||||
    #PwdSet => $c->session->{PwdSet}, Unsafe => $c->session->{Unsafe},
 | 
			
		||||
    $c->stash(
 | 
			
		||||
        title     => $title,
 | 
			
		||||
        modul     => $modul,
 | 
			
		||||
        rvw_datas => \%rvw_datas,
 | 
			
		||||
    );
 | 
			
		||||
    $c->render(template => 'review');
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
} ## end sub main
 | 
			
		||||
 | 
			
		||||
=head2 gen2_email_addresses
 | 
			
		||||
 | 
			
		||||
@@ -86,20 +65,28 @@ sub main {
 | 
			
		||||
=cut
 | 
			
		||||
 | 
			
		||||
sub gen2_email_addresses {
 | 
			
		||||
    my $c = shift;
 | 
			
		||||
 | 
			
		||||
    my $domain = get_value($c,'DomainName'); 
 | 
			
		||||
    my $c           = shift;
 | 
			
		||||
    my $domain      = get_value($c, 'DomainName');
 | 
			
		||||
    my $useraccount = $c->l("rvw_EMAIL_USERACCOUNT");
 | 
			
		||||
    my $firstname = $c->l("rvw_EMAIL_FIRSTNAME");
 | 
			
		||||
    my $lastname = $c->l("rvw_EMAIL_LASTNAME");
 | 
			
		||||
 | 
			
		||||
        my $out = "<I>" . $useraccount . "</I>\@" . $domain . "<BR>"
 | 
			
		||||
        . "<I>" . $firstname . "</I>.<I>" . $lastname . "</I>\@" . $domain . "<BR>"
 | 
			
		||||
        . "<I>" . $firstname . "</I>_<I>" . $lastname . "</I>\@" . $domain . "<BR>"; 
 | 
			
		||||
 | 
			
		||||
        return $out;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
    my $firstname   = $c->l("rvw_EMAIL_FIRSTNAME");
 | 
			
		||||
    my $lastname    = $c->l("rvw_EMAIL_LASTNAME");
 | 
			
		||||
    my $out
 | 
			
		||||
        = "<I>"
 | 
			
		||||
        . $useraccount
 | 
			
		||||
        . "</I>\@"
 | 
			
		||||
        . $domain . "<BR>" . "<I>"
 | 
			
		||||
        . $firstname
 | 
			
		||||
        . "</I>.<I>"
 | 
			
		||||
        . $lastname
 | 
			
		||||
        . "</I>\@"
 | 
			
		||||
        . $domain . "<BR>" . "<I>"
 | 
			
		||||
        . $firstname
 | 
			
		||||
        . "</I>_<I>"
 | 
			
		||||
        . $lastname
 | 
			
		||||
        . "</I>\@"
 | 
			
		||||
        . $domain . "<BR>";
 | 
			
		||||
    return $out;
 | 
			
		||||
} ## end sub gen2_email_addresses
 | 
			
		||||
 | 
			
		||||
=head2 gen2_domains 
 | 
			
		||||
 | 
			
		||||
@@ -109,26 +96,25 @@ sub gen2_email_addresses {
 | 
			
		||||
=cut
 | 
			
		||||
 | 
			
		||||
sub gen2_domains {
 | 
			
		||||
    my $c = shift;
 | 
			
		||||
 | 
			
		||||
    my @virtual = $domains->get_all_by_prop( type => 'domain');
 | 
			
		||||
    my $c          = shift;
 | 
			
		||||
    my @virtual    = $domains->get_all_by_prop(type => 'domain');
 | 
			
		||||
    my $numvirtual = @virtual;
 | 
			
		||||
 | 
			
		||||
    if ($numvirtual == 0) {
 | 
			
		||||
        $c->localise("NO_VIRTUAL_DOMAINS");
 | 
			
		||||
    }
 | 
			
		||||
    else {
 | 
			
		||||
    } else {
 | 
			
		||||
        my $out = "";
 | 
			
		||||
        my $domain;
 | 
			
		||||
 | 
			
		||||
        foreach $domain (sort @virtual) {
 | 
			
		||||
            if ($out ne "") {
 | 
			
		||||
                $out .= "<BR>";
 | 
			
		||||
            }
 | 
			
		||||
            $out .= $domain->key;
 | 
			
		||||
        }
 | 
			
		||||
        } ## end foreach $domain (sort @virtual)
 | 
			
		||||
        return $out;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
    } ## end else [ if ($numvirtual == 0) ]
 | 
			
		||||
} ## end sub gen2_domains
 | 
			
		||||
 | 
			
		||||
=head2 get2_local_networks
 | 
			
		||||
 | 
			
		||||
@@ -138,13 +124,53 @@ serving.	(mojo ver)
 | 
			
		||||
=cut
 | 
			
		||||
 | 
			
		||||
sub get2_local_networks {
 | 
			
		||||
    my $c = shift;
 | 
			
		||||
    my $c           = shift;
 | 
			
		||||
    my @nets        = $networks->get_all_by_prop('type' => 'network');
 | 
			
		||||
    my $numNetworks = @nets;
 | 
			
		||||
 | 
			
		||||
    if ($numNetworks == 0) {
 | 
			
		||||
        return $c->l('rvw_NO_NETWORKS');
 | 
			
		||||
    } else {
 | 
			
		||||
        my $out = "";
 | 
			
		||||
 | 
			
		||||
        foreach my $network (sort @nets) {
 | 
			
		||||
            if ($out ne "") {
 | 
			
		||||
                $out .= "<BR>";
 | 
			
		||||
            }
 | 
			
		||||
            $out .= $network->key . "/" . get_net_prop($c, $network->key, 'Mask');
 | 
			
		||||
 | 
			
		||||
            if (defined get_net_prop($c, $network->key, 'Router')) {
 | 
			
		||||
                $out .= " via " . get_net_prop($c, $network->key, 'Router');
 | 
			
		||||
            }
 | 
			
		||||
        } ## end foreach my $network (sort @nets)
 | 
			
		||||
        return $out;
 | 
			
		||||
    } ## end else [ if ($numNetworks == 0)]
 | 
			
		||||
} ## end sub get2_local_networks
 | 
			
		||||
 | 
			
		||||
sub get_net_prop {
 | 
			
		||||
  my $fm = shift;
 | 
			
		||||
  my $item = shift;
 | 
			
		||||
  my $prop = shift;
 | 
			
		||||
 | 
			
		||||
  my $record = $networks->get($item);
 | 
			
		||||
  if ($record) {
 | 
			
		||||
    return $record->prop($prop);
 | 
			
		||||
  }
 | 
			
		||||
  else {
 | 
			
		||||
    return '';
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
sub get_local_networks {
 | 
			
		||||
    my $fm = shift;
 | 
			
		||||
 | 
			
		||||
    my @nets = $networks->get_all_by_prop('type' => 'network');
 | 
			
		||||
 | 
			
		||||
    my $numNetworks = @nets;
 | 
			
		||||
    if ($numNetworks == 0) {
 | 
			
		||||
        return  $c->l('rvw_NO_NETWORKS');
 | 
			
		||||
        return  $fm->localise('NO_NETWORKS');
 | 
			
		||||
    }
 | 
			
		||||
    else {
 | 
			
		||||
        my $out = "";
 | 
			
		||||
@@ -153,10 +179,10 @@ sub get2_local_networks {
 | 
			
		||||
                $out .= "<BR>";
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            $out .= $network->key."/" . get_net_prop($c, $network->key, 'Mask');
 | 
			
		||||
            $out .= $network->key."/" . get_net_prop($fm, $network->key, 'Mask');
 | 
			
		||||
 | 
			
		||||
            if ( defined get_net_prop($c, $network->key, 'Router') ) {
 | 
			
		||||
                $out .= " via " . get_net_prop ($c, $network->key, 'Router'); 
 | 
			
		||||
            if ( defined get_net_prop($fm, $network->key, 'Router') ) {
 | 
			
		||||
                $out .= " via " . get_net_prop ($fm, $network->key, 'Router'); 
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        return $out;
 | 
			
		||||
@@ -164,6 +190,10 @@ sub get2_local_networks {
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub get_local_domain
 | 
			
		||||
{
 | 
			
		||||
    return (get_value('','DomainName'));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
=head2 print2_gateway_stanza
 | 
			
		||||
@@ -172,28 +202,28 @@ If this system is a server gateway, show the external ip and gateway ip (mojo ve
 | 
			
		||||
 | 
			
		||||
=cut
 | 
			
		||||
 | 
			
		||||
sub print2_gateway_stanza
 | 
			
		||||
{
 | 
			
		||||
sub print2_gateway_stanza {
 | 
			
		||||
    my $c = shift;
 | 
			
		||||
    if (get_value($c,'SystemMode') =~ /servergateway/)
 | 
			
		||||
    {
 | 
			
		||||
	my $ip = get_value($c,'ExternalIP');
 | 
			
		||||
	my $static =
 | 
			
		||||
	     (get_value($c, 'AccessType') eq 'dedicated') &&
 | 
			
		||||
	     (get_value($c, 'ExternalDHCP') eq 'off') &&
 | 
			
		||||
	     (get_prop($c, 'pppoe', 'status') eq 'disabled');
 | 
			
		||||
	if ($static)
 | 
			
		||||
	{
 | 
			
		||||
	    $ip .= "/".get_value($c,'ExternalNetmask');
 | 
			
		||||
	}
 | 
			
		||||
	my $out = $c->l('rvw_EXTERNAL_IP_ADDRESS_SUBNET_MASK').':'.$ip;
 | 
			
		||||
	if ($static)
 | 
			
		||||
	{
 | 
			
		||||
	    $out .= $c->l('rvw_GATEWAY').':'.get_value($c,'GatewayIP');
 | 
			
		||||
	}
 | 
			
		||||
	return $out
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
    if (get_value($c, 'SystemMode') =~ /servergateway/) {
 | 
			
		||||
        my $ip = get_value($c, 'ExternalIP');
 | 
			
		||||
        my $static
 | 
			
		||||
            = (get_value($c, 'AccessType') eq 'dedicated')
 | 
			
		||||
            && (get_value($c, 'ExternalDHCP') eq 'off')
 | 
			
		||||
            && (get_prop($c, 'pppoe', 'status') eq 'disabled');
 | 
			
		||||
 | 
			
		||||
        if ($static) {
 | 
			
		||||
            $ip .= "/" . get_value($c, 'ExternalNetmask');
 | 
			
		||||
        }
 | 
			
		||||
        my $out = $c->l('rvw_EXTERNAL_IP_ADDRESS_SUBNET_MASK') . ':' . $ip;
 | 
			
		||||
 | 
			
		||||
        if ($static) {
 | 
			
		||||
            $out .= $c->l('rvw_GATEWAY') . ':' . get_value($c, 'GatewayIP');
 | 
			
		||||
        }
 | 
			
		||||
        return $out;
 | 
			
		||||
    } ## end if (get_value($c, 'SystemMode'...))
 | 
			
		||||
} ## end sub print2_gateway_stanza
 | 
			
		||||
 | 
			
		||||
=head2 print2_serveronly_stanza
 | 
			
		||||
 | 
			
		||||
If this system is a standalone server with net access, show the external
 | 
			
		||||
@@ -202,14 +232,15 @@ gateway IP	(mojo ver)
 | 
			
		||||
=cut
 | 
			
		||||
 | 
			
		||||
sub print2_serveronly_stanza {
 | 
			
		||||
  my $c = shift;
 | 
			
		||||
  if ( (get_value($c,'SystemMode') eq 'serveronly') &&
 | 
			
		||||
       get_value($c,'AccessType') && 
 | 
			
		||||
       (get_value($c,'AccessType') ne "off")) {
 | 
			
		||||
    return ( get_value($c,'GatewayIP') );
 | 
			
		||||
  }
 | 
			
		||||
  
 | 
			
		||||
}
 | 
			
		||||
    my $c = shift;
 | 
			
		||||
 | 
			
		||||
    if (   (get_value($c, 'SystemMode') eq 'serveronly')
 | 
			
		||||
        && get_value($c, 'AccessType')
 | 
			
		||||
        && (get_value($c, 'AccessType') ne "off"))
 | 
			
		||||
    {
 | 
			
		||||
        return (get_value($c, 'GatewayIP'));
 | 
			
		||||
    } ## end if ((get_value($c, 'SystemMode'...)))
 | 
			
		||||
} ## end sub print2_serveronly_stanza
 | 
			
		||||
 | 
			
		||||
=head2 print2_dhcp_stanza 
 | 
			
		||||
 | 
			
		||||
@@ -220,16 +251,61 @@ Prints out the current state of dhcp service	(mojo ver)
 | 
			
		||||
 | 
			
		||||
sub print2_dhcp_stanza {
 | 
			
		||||
    my $c = shift;
 | 
			
		||||
    my $out = (get_prop($c,'dhcpd','status') || 'disabled' );
 | 
			
		||||
    my $out = (get_prop($c, 'dhcpd', 'status') || 'disabled');
 | 
			
		||||
 | 
			
		||||
    if (get_prop($c,'dhcpd', 'status') eq 'enabled') {
 | 
			
		||||
        $out .= '<br>'.$c->l('rvw_BEGINNING_OF_DHCP_ADDRESS_RANGE').':';
 | 
			
		||||
	$out .= (get_prop($c,'dhcpd','start') || '' ).'<br>';
 | 
			
		||||
        $out .= $c->l('rvw_END_OF_DHCP_ADDRESS_RANGE').':';
 | 
			
		||||
	$out .= (get_prop($c,'dhcpd','end') || '' );
 | 
			
		||||
    }
 | 
			
		||||
    if (get_prop($c, 'dhcpd', 'status') eq 'enabled') {
 | 
			
		||||
        $out .= '<br>' . $c->l('rvw_BEGINNING_OF_DHCP_ADDRESS_RANGE') . ':';
 | 
			
		||||
        $out .= (get_prop($c, 'dhcpd', 'start') || '') . '<br>';
 | 
			
		||||
        $out .= $c->l('rvw_END_OF_DHCP_ADDRESS_RANGE') . ':';
 | 
			
		||||
        $out .= (get_prop($c, 'dhcpd', 'end') || '');
 | 
			
		||||
    } ## end if (get_prop($c, 'dhcpd'...))
 | 
			
		||||
    return $out;
 | 
			
		||||
} ## end sub print2_dhcp_stanza
 | 
			
		||||
 | 
			
		||||
sub get_value {
 | 
			
		||||
  my $fm = shift;
 | 
			
		||||
  my $item = shift;
 | 
			
		||||
  my $record = $db->get($item);
 | 
			
		||||
  if ($record) {
 | 
			
		||||
    return $record->value();
 | 
			
		||||
  }
 | 
			
		||||
  else {
 | 
			
		||||
    return '';
 | 
			
		||||
  }
 | 
			
		||||
  
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub get_prop {
 | 
			
		||||
  my $fm = shift if (ref($_[0]) ); # If we're being called in a formmagick context
 | 
			
		||||
				 # The first argument will always be a fm.
 | 
			
		||||
				 #otherwise, we don't want to grab it
 | 
			
		||||
  my $item = shift;
 | 
			
		||||
  my $prop = shift;
 | 
			
		||||
 | 
			
		||||
  my $record = $db->get($item);
 | 
			
		||||
  if ($record) {
 | 
			
		||||
    return $record->prop($prop);
 | 
			
		||||
  }
 | 
			
		||||
  else {
 | 
			
		||||
    return '';
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub get_public_ip_address
 | 
			
		||||
{
 | 
			
		||||
    my $self = shift;
 | 
			
		||||
    my $sysconfig = $db->get('sysconfig');
 | 
			
		||||
    if ($sysconfig)
 | 
			
		||||
    {
 | 
			
		||||
        my $publicIP = $sysconfig->prop('PublicIP');
 | 
			
		||||
        if ($publicIP)
 | 
			
		||||
        {
 | 
			
		||||
            return $publicIP;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    return undef;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
1;
 | 
			
		||||
1;
 | 
			
		||||
@@ -0,0 +1,35 @@
 | 
			
		||||
package SrvMngr::Controller::Roundcubepanel;
 | 
			
		||||
 | 
			
		||||
#----------------------------------------------------------------------
 | 
			
		||||
# heading     : System
 | 
			
		||||
# description : Webmail
 | 
			
		||||
# navigation  : 99999 9999
 | 
			
		||||
#----------------------------------------------------------------------
 | 
			
		||||
#----------------------------------------------------------------------
 | 
			
		||||
# name   : roundcubepanel,    method : get,   url : /roundcubepanel,     ctlact : Roundcubepanel#main
 | 
			
		||||
#
 | 
			
		||||
# routes : end
 | 
			
		||||
#----------------------------------------------------------------------
 | 
			
		||||
use strict;
 | 
			
		||||
use warnings;
 | 
			
		||||
use Mojo::Base 'Mojolicious::Controller';
 | 
			
		||||
use Locale::gettext;
 | 
			
		||||
use SrvMngr::I18N;
 | 
			
		||||
use SrvMngr qw(theme_list init_session);
 | 
			
		||||
 | 
			
		||||
#use SrvMngr::Model::Main;
 | 
			
		||||
sub main {
 | 
			
		||||
    my $c = shift;
 | 
			
		||||
    $c->app->log->info($c->log_req);
 | 
			
		||||
    my $title            = $c->l('Webmail');
 | 
			
		||||
    my $roundcube_url    = $c->param('url');
 | 
			
		||||
    $c->stash(title => $title, modul => $roundcube_url);
 | 
			
		||||
    $c->render(template => 'roundcube');
 | 
			
		||||
} ## end sub main
 | 
			
		||||
 | 
			
		||||
sub getroundcubeurl {
 | 
			
		||||
    my $c   = shift;
 | 
			
		||||
    my $url = shift;
 | 
			
		||||
    return "/smanager/roundcube?url=$url";
 | 
			
		||||
} ## end sub getroundcubeurl
 | 
			
		||||
1;
 | 
			
		||||
@@ -11,34 +11,25 @@ package  SrvMngr::Controller::Support;
 | 
			
		||||
use strict;
 | 
			
		||||
use warnings;
 | 
			
		||||
use Mojo::Base 'Mojolicious::Controller';
 | 
			
		||||
 | 
			
		||||
use SrvMngr qw(theme_list init_session);
 | 
			
		||||
 | 
			
		||||
use esmith::util;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
sub display_licenses {
 | 
			
		||||
    my $lang = shift;
 | 
			
		||||
    my $lic  = '';
 | 
			
		||||
 | 
			
		||||
	my $lang = shift;
 | 
			
		||||
 | 
			
		||||
	my $lic = '';
 | 
			
		||||
	foreach my $license (esmith::util::getLicenses($lang)) {
 | 
			
		||||
 | 
			
		||||
		$lic .= $license . '<br>';
 | 
			
		||||
	}
 | 
			
		||||
	return $lic;
 | 
			
		||||
}
 | 
			
		||||
    foreach my $license (esmith::util::getLicenses($lang)) {
 | 
			
		||||
        $lic .= $license . '<br>';
 | 
			
		||||
    }
 | 
			
		||||
    return $lic;
 | 
			
		||||
} ## end sub display_licenses
 | 
			
		||||
 | 
			
		||||
sub main {
 | 
			
		||||
    my $c = shift;
 | 
			
		||||
    $c->app->log->info($c->log_req);
 | 
			
		||||
 | 
			
		||||
    my $title = $c->l('support_FORM_TITLE');
 | 
			
		||||
    my $modul = $c->render_to_string(inline => display_licenses($c->session->{lang}));
 | 
			
		||||
 | 
			
		||||
    $c->stash( title => $title, modul => $modul );
 | 
			
		||||
    $c->stash(title => $title, modul => $modul);
 | 
			
		||||
    $c->render(template => 'module');
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
} ## end sub main
 | 
			
		||||
1;
 | 
			
		||||
 
 | 
			
		||||
@@ -1,51 +1,39 @@
 | 
			
		||||
package SrvMngr::Controller::Swttheme;
 | 
			
		||||
 | 
			
		||||
#
 | 
			
		||||
# routes : end
 | 
			
		||||
#----------------------------------------------------------------------
 | 
			
		||||
use strict;
 | 
			
		||||
use warnings;
 | 
			
		||||
 | 
			
		||||
use Mojo::Base 'Mojolicious::Controller';
 | 
			
		||||
 | 
			
		||||
#use SrvMngr qw(theme_list init_session);
 | 
			
		||||
 | 
			
		||||
our $db = esmith::ConfigDB->open() || die "Couldn't open config db";
 | 
			
		||||
 | 
			
		||||
sub main {
 | 
			
		||||
 | 
			
		||||
    my $c = shift;
 | 
			
		||||
 | 
			
		||||
    my $from = $c->param('From') || '/';
 | 
			
		||||
    my $c     = shift;
 | 
			
		||||
    my $from  = $c->param('From') || '/';
 | 
			
		||||
    my $theme = $c->param('Theme');
 | 
			
		||||
 | 
			
		||||
    $c->app->log->info(" swt theme '$from'  '$theme' ");
 | 
			
		||||
 | 
			
		||||
    my $oldTheme = $c->session->{CurrentTheme};
 | 
			
		||||
 | 
			
		||||
    if ( $theme ne $oldTheme ) {
 | 
			
		||||
#	$c->app->renderer->paths([$c->app->home->rel_file('themes/default/templates')]);
 | 
			
		||||
#	$c->app->static->paths([$c->app->home->rel_file('themes/default/public')]);
 | 
			
		||||
#	if ( $theme ne 'default' ) {
 | 
			
		||||
#        # Put the new theme first
 | 
			
		||||
#	    my $t_path = $c->app->home->rel_file('themes/'.$theme);
 | 
			
		||||
#	    unshift @{$c->app->renderer->paths}, $t_path.'/templates' if -d $t_path.'/templates';
 | 
			
		||||
#	    unshift @{$c->app->static->paths},   $t_path.'/public' if -d $t_path.'/public';
 | 
			
		||||
#	}
 | 
			
		||||
    if ($theme ne $oldTheme) {
 | 
			
		||||
 | 
			
		||||
        #	$c->app->renderer->paths([$c->app->home->rel_file('themes/default/templates')]);
 | 
			
		||||
        #	$c->app->static->paths([$c->app->home->rel_file('themes/default/public')]);
 | 
			
		||||
        #	if ( $theme ne 'default' ) {
 | 
			
		||||
        #        # Put the new theme first
 | 
			
		||||
        #	    my $t_path = $c->app->home->rel_file('themes/'.$theme);
 | 
			
		||||
        #	    unshift @{$c->app->renderer->paths}, $t_path.'/templates' if -d $t_path.'/templates';
 | 
			
		||||
        #	    unshift @{$c->app->static->paths},   $t_path.'/public' if -d $t_path.'/public';
 | 
			
		||||
        #	}
 | 
			
		||||
        $c->session->{CurrentTheme} = $theme;
 | 
			
		||||
 | 
			
		||||
	$db->get('smanager')->set_prop('Theme', $theme);
 | 
			
		||||
	system ("/sbin/e-smith/signal-event smanager-theme-change") == 0
 | 
			
		||||
	    or warn "$c->l('ERROR_UPDATING')";
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
        $db->get('smanager')->set_prop('Theme', $theme);
 | 
			
		||||
        system("/sbin/e-smith/signal-event smanager-theme-change") == 0
 | 
			
		||||
            or warn "$c->l('ERROR_UPDATING')";
 | 
			
		||||
    } ## end if ($theme ne $oldTheme)
 | 
			
		||||
## (not sure)     $c->flash( warning => $c->l('swt_LOGIN_AGAIN') );
 | 
			
		||||
    $from = '/initial' if $from eq '/';
 | 
			
		||||
    $from = '/' . $from if ( $from !~ m|^\/| );
 | 
			
		||||
 | 
			
		||||
    $c->redirect_to( $from);
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    $from = '/initial'  if $from eq '/';
 | 
			
		||||
    $from = '/' . $from if ($from !~ m|^\/|);
 | 
			
		||||
    $c->redirect_to($from);
 | 
			
		||||
} ## end sub main
 | 
			
		||||
1;
 | 
			
		||||
 
 | 
			
		||||
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							@@ -1,38 +0,0 @@
 | 
			
		||||
package SrvMngr::Controller::Userpanelaccess;
 | 
			
		||||
 | 
			
		||||
#----------------------------------------------------------------------
 | 
			
		||||
# heading     : User management
 | 
			
		||||
# description : User Panel Access
 | 
			
		||||
# navigation  : 2000 150
 | 
			
		||||
# menu        : 
 | 
			
		||||
#----------------------------------------------------------------------
 | 
			
		||||
# name   : userpanelaccess,    method : get,   url : /userpanelaccess,     ctlact : Userpanelaccess#main
 | 
			
		||||
#
 | 
			
		||||
# routes : end
 | 
			
		||||
#----------------------------------------------------------------------
 | 
			
		||||
 | 
			
		||||
use strict;
 | 
			
		||||
use warnings;
 | 
			
		||||
 | 
			
		||||
use Mojo::Base 'Mojolicious::Controller';
 | 
			
		||||
 | 
			
		||||
use Locale::gettext;
 | 
			
		||||
use SrvMngr::I18N;
 | 
			
		||||
use SrvMngr qw(theme_list init_session);
 | 
			
		||||
 | 
			
		||||
#use SrvMngr::Model::Main;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
sub main {
 | 
			
		||||
 | 
			
		||||
    my $c = shift;
 | 
			
		||||
    $c->app->log->info($c->log_req);
 | 
			
		||||
 | 
			
		||||
    my $title = $c->l('User panel access');
 | 
			
		||||
    $c->stash( title => $title, modul => 'https://mailserver.bjsystems.co.uk/server-manager/cgi-bin/userpanelaccess', height => 600 );
 | 
			
		||||
    $c->render(template => 'embedded');
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
1;
 | 
			
		||||
@@ -8,182 +8,165 @@ package SrvMngr::Controller::Userpassword;
 | 
			
		||||
#
 | 
			
		||||
# routes : end
 | 
			
		||||
#----------------------------------------------------------------------
 | 
			
		||||
 | 
			
		||||
use strict;
 | 
			
		||||
use warnings;
 | 
			
		||||
use Mojo::Base 'Mojolicious::Controller';
 | 
			
		||||
 | 
			
		||||
use esmith::util;
 | 
			
		||||
use esmith::ConfigDB;
 | 
			
		||||
use esmith::AccountsDB;
 | 
			
		||||
 | 
			
		||||
use Locale::gettext;
 | 
			
		||||
use SrvMngr::I18N;
 | 
			
		||||
use SrvMngr qw( theme_list init_session is_normal_password );
 | 
			
		||||
 | 
			
		||||
our $cdb = esmith::ConfigDB->open_ro || die "Couldn't open configuration db";
 | 
			
		||||
 | 
			
		||||
use SrvMngr qw( theme_list init_session validate_password );
 | 
			
		||||
#our $cdb = esmith::ConfigDB->open_ro || die "Couldn't open configuration db";
 | 
			
		||||
 | 
			
		||||
sub main {
 | 
			
		||||
    my $c = shift;
 | 
			
		||||
 | 
			
		||||
    my $c         = shift;
 | 
			
		||||
    my %pwd_datas = ();
 | 
			
		||||
 | 
			
		||||
    if ( $c->is_logged_in ) {
 | 
			
		||||
	$pwd_datas{Account} = $c->session->{username};
 | 
			
		||||
	$pwd_datas{trt} = 'NORM';
 | 
			
		||||
    if ($c->is_logged_in) {
 | 
			
		||||
        $pwd_datas{Account} = $c->session->{username};
 | 
			
		||||
        $pwd_datas{trt}     = 'NORM';
 | 
			
		||||
    } else {
 | 
			
		||||
        my $rt = $c->current_route;
 | 
			
		||||
	my $mess = '';
 | 
			
		||||
	my $jwt = $c->param('jwt') || '';
 | 
			
		||||
	my $name = $c->jwt->decode($jwt)->{username} || '';
 | 
			
		||||
        my $rt   = $c->current_route;
 | 
			
		||||
        my $mess = '';
 | 
			
		||||
        my $jwt  = $c->param('jwt') || '';
 | 
			
		||||
        my $name = $c->jwt->decode($jwt)->{username} || '';
 | 
			
		||||
        $mess = 'Invalid state' unless ($jwt and $name and $rt eq 'upwdreset');
 | 
			
		||||
 | 
			
		||||
	$mess = 'Invalid state' unless ($jwt and $name and $rt eq 'upwdreset');
 | 
			
		||||
	
 | 
			
		||||
        # request already treated or outdated
 | 
			
		||||
        if ( $c->pwdrst->{$name}{confirmed} != 1 or $c->pwdrst->{$name}{date} < time() ) {
 | 
			
		||||
	    $mess = $c->l('use_INVALID_REQUEST').' -step 1-';
 | 
			
		||||
	}
 | 
			
		||||
        if ($c->pwdrst->{$name}{confirmed} != 1 or $c->pwdrst->{$name}{date} < time()) {
 | 
			
		||||
            $mess = $c->l('use_INVALID_REQUEST') . ' -step 1-';
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        if ($mess) {
 | 
			
		||||
            $c->stash(error => $mess);
 | 
			
		||||
            return $c->redirect_to($c->home_page);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
	if ( $mess ) {
 | 
			
		||||
	    $c->stash( error => $mess );
 | 
			
		||||
	    return $c->redirect_to ( $c->home_page );
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
        # ok for reset password for this account - step 2
 | 
			
		||||
	$c->pwdrst->{$name}{confirmed} = 2;
 | 
			
		||||
	$pwd_datas{Account} = $name;
 | 
			
		||||
	$pwd_datas{trt} = 'RESET';
 | 
			
		||||
	$pwd_datas{jwt} = $jwt;
 | 
			
		||||
	$c->flash( success => $c->l('use_OK_FOR_RESET') );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    $c->stash( pwd_datas => \%pwd_datas );
 | 
			
		||||
    $c->render( 'userpassword' );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
        $c->pwdrst->{$name}{confirmed} = 2;
 | 
			
		||||
        $pwd_datas{Account}            = $name;
 | 
			
		||||
        $pwd_datas{trt}                = 'RESET';
 | 
			
		||||
        $pwd_datas{jwt}                = $jwt;
 | 
			
		||||
        $c->flash(success => $c->l('use_OK_FOR_RESET'));
 | 
			
		||||
    } ## end else [ if ($c->is_logged_in) ]
 | 
			
		||||
    $c->stash(pwd_datas => \%pwd_datas);
 | 
			
		||||
    $c->render('userpassword');
 | 
			
		||||
} ## end sub main
 | 
			
		||||
 | 
			
		||||
sub change_password {
 | 
			
		||||
    my $c = shift;
 | 
			
		||||
 | 
			
		||||
    my $result;
 | 
			
		||||
    my $res;
 | 
			
		||||
    my %pwd_datas = ();
 | 
			
		||||
 | 
			
		||||
    my $trt = $c->param('Trt');
 | 
			
		||||
    my $acctName = $c->param('User');
 | 
			
		||||
    my $oldPass = $c->param('Oldpass') || '';
 | 
			
		||||
    my $pass = $c->param('Pass');
 | 
			
		||||
    my %pwd_datas  = ();
 | 
			
		||||
    my $trt        = $c->param('Trt');
 | 
			
		||||
    my $acctName   = $c->param('User');
 | 
			
		||||
    my $oldPass    = $c->param('Oldpass') || '';
 | 
			
		||||
    my $pass       = $c->param('Pass');
 | 
			
		||||
    my $passVerify = $c->param('Passverify');
 | 
			
		||||
 | 
			
		||||
    my $jwt = $c->param('jwt') || '';
 | 
			
		||||
    my $rt = $c->current_route;
 | 
			
		||||
    my $mess = ''; my $name = '';
 | 
			
		||||
    my $jwt        = $c->param('jwt') || '';
 | 
			
		||||
    my $rt         = $c->current_route;
 | 
			
		||||
    my $mess       = '';
 | 
			
		||||
    my $name       = '';
 | 
			
		||||
    $name = $c->jwt->decode($jwt)->{username} if $jwt;
 | 
			
		||||
 | 
			
		||||
    if ( $trt eq 'RESET' ) {
 | 
			
		||||
	$mess = 'Invalid state' unless ($jwt and $name and ($rt eq 'upwdreset2'));
 | 
			
		||||
	# request already treated or outdated
 | 
			
		||||
	if ( $c->pwdrst->{$name}{confirmed} != 2 or $c->pwdrst->{$name}{date} < time() ) {
 | 
			
		||||
    	    $mess = $c->l('use_INVALID_REQUEST').' -step 2-';
 | 
			
		||||
	}
 | 
			
		||||
        if ( ! $name or $c->is_logged_in or $name ne $acctName ) {
 | 
			
		||||
    	    $mess = 'Invalid reset state';
 | 
			
		||||
    if ($trt eq 'RESET') {
 | 
			
		||||
        $mess = 'Invalid state' unless ($jwt and $name and ($rt eq 'upwdreset2'));
 | 
			
		||||
 | 
			
		||||
        # request already treated or outdated
 | 
			
		||||
        if ($c->pwdrst->{$name}{confirmed} != 2 or $c->pwdrst->{$name}{date} < time()) {
 | 
			
		||||
            $mess = $c->l('use_INVALID_REQUEST') . ' -step 2-';
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        if (!$name or $c->is_logged_in or $name ne $acctName) {
 | 
			
		||||
            $mess = 'Invalid reset state';
 | 
			
		||||
        }
 | 
			
		||||
    } else {
 | 
			
		||||
	if ( $name or $jwt or ! $c->is_logged_in ) {
 | 
			
		||||
    	    $mess = 'Invalid update state';
 | 
			
		||||
	}
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if ( $mess ) {
 | 
			
		||||
        $c->stash( error => $mess );
 | 
			
		||||
        return $c->redirect_to ( $c->home_page );
 | 
			
		||||
    }
 | 
			
		||||
        if ($name or $jwt or !$c->is_logged_in) {
 | 
			
		||||
            $mess = 'Invalid update state';
 | 
			
		||||
        }
 | 
			
		||||
    } ## end else [ if ($trt eq 'RESET') ]
 | 
			
		||||
 | 
			
		||||
    if ($mess) {
 | 
			
		||||
        $c->stash(error => $mess);
 | 
			
		||||
        return $c->redirect_to($c->home_page);
 | 
			
		||||
    }
 | 
			
		||||
    $pwd_datas{Account} = $acctName;
 | 
			
		||||
    $pwd_datas{trt} = $trt;
 | 
			
		||||
    $pwd_datas{trt}     = $trt;
 | 
			
		||||
 | 
			
		||||
    # common controls
 | 
			
		||||
    if ( $acctName eq 'admin' ) {
 | 
			
		||||
    if ($acctName eq 'admin') {
 | 
			
		||||
        $result .= "Admin password should not be reset here !";
 | 
			
		||||
    } else {
 | 
			
		||||
        unless ( $pass && $passVerify ) {
 | 
			
		||||
		$result .= $c->l('pwd_FIELDS_REQUIRED') . "<br>";
 | 
			
		||||
        } else {
 | 
			
		||||
		$result .= $c->l('pwd_PASSWORD_INVALID_CHARS') . "<br>" unless (($pass) = ($pass =~ /^([ -~]+)$/ ));
 | 
			
		||||
		$result .= $c->l('pwd_PASSWORD_VERIFY_ERROR') . "<br>" unless ( $pass eq $passVerify );
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if ( $result ne '' ) {
 | 
			
		||||
        $c->stash( error => $result, pwd_datas => \%pwd_datas );
 | 
			
		||||
	return $c->render( 'userpassword' );
 | 
			
		||||
        unless ($pass && $passVerify) {
 | 
			
		||||
            $result .= $c->l('pwd_FIELDS_REQUIRED') . "<br>";
 | 
			
		||||
        } else {
 | 
			
		||||
            $result .= $c->l('pwd_PASSWORD_INVALID_CHARS') . "<br>" unless (($pass) = ($pass =~ /^([ -~]+)$/));
 | 
			
		||||
            $result .= $c->l('pwd_PASSWORD_VERIFY_ERROR') . "<br>" unless ($pass eq $passVerify);
 | 
			
		||||
        }
 | 
			
		||||
    } ## end else [ if ($acctName eq 'admin')]
 | 
			
		||||
 | 
			
		||||
    if ($result ne '') {
 | 
			
		||||
        $c->stash(error => $result, pwd_datas => \%pwd_datas);
 | 
			
		||||
        return $c->render('userpassword');
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    # validate new password
 | 
			
		||||
    $res = $c->check_password( $pass );
 | 
			
		||||
    $result .= $res . "<br>" unless ( $res eq 'OK' );
 | 
			
		||||
    $res = $c->check_password($pass);
 | 
			
		||||
    $result .= $res . "<br>" unless ($res eq 'OK');
 | 
			
		||||
 | 
			
		||||
    #  controls old password
 | 
			
		||||
    if ( $trt ne 'RESET' ) {
 | 
			
		||||
        unless ( $oldPass ) {
 | 
			
		||||
		$result .= $c->l('pwd_FIELDS_REQUIRED') . "<br>" unless $trt eq 'RESET';
 | 
			
		||||
    if ($trt ne 'RESET') {
 | 
			
		||||
 | 
			
		||||
        unless ($oldPass) {
 | 
			
		||||
            $result .= $c->l('pwd_FIELDS_REQUIRED') . "<br>" unless $trt eq 'RESET';
 | 
			
		||||
        } else {
 | 
			
		||||
		$result .= $c->l('pwd_PASSWORD_OLD_INVALID_CHARS') . "<br>" unless (($oldPass) = ($oldPass =~ /^(\S+)$/ ));
 | 
			
		||||
            $result .= $c->l('pwd_PASSWORD_OLD_INVALID_CHARS') . "<br>" unless (($oldPass) = ($oldPass =~ /^(\S+)$/));
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        if ( $result ne '' ) {
 | 
			
		||||
	    $c->stash( error => $result, pwd_datas => \%pwd_datas );
 | 
			
		||||
		return $c->render( 'userpassword' );
 | 
			
		||||
        if ($result ne '') {
 | 
			
		||||
            $c->stash(error => $result, pwd_datas => \%pwd_datas);
 | 
			
		||||
            return $c->render('userpassword');
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        # verify old password
 | 
			
		||||
        if ( $trt ne 'RESET') {
 | 
			
		||||
    	    $result .= $c->l('pwd_ERROR_PASSWORD_CHANGE') . "<br>" 
 | 
			
		||||
		    unless (SrvMngr::Model::Main->check_credentials($acctName, $oldPass));
 | 
			
		||||
	}
 | 
			
		||||
    }
 | 
			
		||||
        if ($trt ne 'RESET') {
 | 
			
		||||
            $result .= $c->l('pwd_ERROR_PASSWORD_CHANGE') . "<br>"
 | 
			
		||||
                unless (SrvMngr::Model::Main->check_credentials($acctName, $oldPass));
 | 
			
		||||
        }
 | 
			
		||||
    } ## end if ($trt ne 'RESET')
 | 
			
		||||
 | 
			
		||||
    # $result .= 'Blocked for test (prevents updates)<br>';
 | 
			
		||||
 | 
			
		||||
    if ( ! $result ) {
 | 
			
		||||
        my $res = $c->reset_password( $trt, $acctName, $pass, $oldPass );
 | 
			
		||||
    if (!$result) {
 | 
			
		||||
        my $res = $c->reset_password($trt, $acctName, $pass, $oldPass);
 | 
			
		||||
        $result .= $res unless $res eq 'OK';
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if ( $result ) {
 | 
			
		||||
	record_password_change_attempt($c, 'FAILED');
 | 
			
		||||
    	$c->stash( error => $result, pwd_datas => \%pwd_datas );
 | 
			
		||||
	return $c->render( 'userpassword' );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if ($result) {
 | 
			
		||||
        record_password_change_attempt($c, 'FAILED');
 | 
			
		||||
        $c->stash(error => $result, pwd_datas => \%pwd_datas);
 | 
			
		||||
        return $c->render('userpassword');
 | 
			
		||||
    } ## end if ($result)
 | 
			
		||||
    $c->pwdrst->{$name}{confirmed} = 9 if $trt eq 'RESET';
 | 
			
		||||
    record_password_change_attempt($c, 'SUCCESS');
 | 
			
		||||
    $result .= $c->l('pwd_PASSWORD_CHANGE_SUCCESS');
 | 
			
		||||
    $c->flash( success => $result );
 | 
			
		||||
    $c->redirect_to( $c->home_page );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
    $c->flash(success => $result);
 | 
			
		||||
    $c->redirect_to($c->home_page);
 | 
			
		||||
} ## end sub change_password
 | 
			
		||||
 | 
			
		||||
sub reset_password {
 | 
			
		||||
 | 
			
		||||
    my ($c, $trt, $user, $password, $oldpassword) = @_;
 | 
			
		||||
    my $ret;
 | 
			
		||||
 | 
			
		||||
    return $c->l('usr_TAINTED_USER') unless (($user) = ($user =~ /^(\w[\-\w_\.]*)$/));
 | 
			
		||||
    $user = $1;
 | 
			
		||||
 | 
			
		||||
    my $adb = esmith::AccountsDB->open();
 | 
			
		||||
 | 
			
		||||
    my $adb  = esmith::AccountsDB->open();
 | 
			
		||||
    my $acct = $adb->get($user);
 | 
			
		||||
    return $c->l('NO_SUCH_USER', $user) unless ( $acct->prop('type') eq 'user' );
 | 
			
		||||
 | 
			
		||||
    $ret = esmith::util::setUserPasswordRequirePrevious( $user, $oldpassword, $password ) if $trt ne 'RESET';
 | 
			
		||||
    $ret = esmith::util::setUserPassword( $user, $password ) if $trt eq 'RESET';
 | 
			
		||||
 | 
			
		||||
    return $c->l('pwd_ERROR_PASSWORD_CHANGE') .' '. $trt unless $ret;
 | 
			
		||||
 | 
			
		||||
    return $c->l('NO_SUCH_USER', $user) unless ($acct->prop('type') eq 'user');
 | 
			
		||||
    $ret = esmith::util::setUserPasswordRequirePrevious($user, $oldpassword, $password) if $trt ne 'RESET';
 | 
			
		||||
    $ret = esmith::util::setUserPassword($user, $password) if $trt eq 'RESET';
 | 
			
		||||
    return $c->l('pwd_ERROR_PASSWORD_CHANGE') . ' ' . $trt unless $ret;
 | 
			
		||||
    $acct->set_prop("PasswordSet", "yes");
 | 
			
		||||
    undef $adb;
 | 
			
		||||
 | 
			
		||||
@@ -192,66 +175,29 @@ sub reset_password {
 | 
			
		||||
        return $c->l("usr_ERR_OCCURRED_MODIFYING_PASSWORD");
 | 
			
		||||
    }
 | 
			
		||||
    $adb = esmith::AccountsDB->open();
 | 
			
		||||
 | 
			
		||||
    return 'OK';
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
} ## end sub reset_password
 | 
			
		||||
 | 
			
		||||
sub record_password_change_attempt {
 | 
			
		||||
    my ($c, $result) = @_;
 | 
			
		||||
    my $user       = $c->param('User');
 | 
			
		||||
    my $ip_address = $c->tx->remote_address;
 | 
			
		||||
 | 
			
		||||
  my ($c, $result) = @_;
 | 
			
		||||
 | 
			
		||||
  my $user = $c->param('User');
 | 
			
		||||
  my $ip_address = $c->tx->remote_address;
 | 
			
		||||
 | 
			
		||||
  if ($result eq 'SUCCESS') {
 | 
			
		||||
    $c->app->log->info(join "\t", "Password change succeeded: $user", $ip_address);
 | 
			
		||||
  } else {
 | 
			
		||||
    $c->app->log->info(join "\t", "Password change FAILED: $user", $ip_address);
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
    if ($result eq 'SUCCESS') {
 | 
			
		||||
        $c->app->log->info(join "\t", "Password change succeeded: $user", $ip_address);
 | 
			
		||||
    } else {
 | 
			
		||||
        $c->app->log->info(join "\t", "Password change FAILED: $user", $ip_address);
 | 
			
		||||
    }
 | 
			
		||||
} ## end sub record_password_change_attempt
 | 
			
		||||
 | 
			
		||||
sub check_password {
 | 
			
		||||
        my $c = shift;
 | 
			
		||||
        my $password = shift;
 | 
			
		||||
 
 | 
			
		||||
        my $strength;
 | 
			
		||||
        my $rec = $cdb->get('passwordstrength');
 | 
			
		||||
        $strength = ($rec ? ($rec->prop('Users') || 'none') : 'none');
 | 
			
		||||
 
 | 
			
		||||
        return validate_password( $c, $strength, $password );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
sub validate_password {
 | 
			
		||||
 | 
			
		||||
    my ($c, $strength, $pass) = @_;
 | 
			
		||||
 | 
			
		||||
    use Crypt::Cracklib;
 | 
			
		||||
 | 
			
		||||
    if ($strength eq "none") {
 | 
			
		||||
        return $c->l("Passwords must be at least 7 characters long") unless ( length( $pass ) > 6 );
 | 
			
		||||
        return "OK";
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    my $reason = is_normal_password($c, $pass, undef);
 | 
			
		||||
    return $reason unless ($reason eq "OK");
 | 
			
		||||
    return "OK" unless ($strength eq "strong");
 | 
			
		||||
 | 
			
		||||
    if ( -f '/usr/lib64/cracklib_dict.pwd' ) {
 | 
			
		||||
        $reason = fascist_check($pass, '/usr/lib64/cracklib_dict');
 | 
			
		||||
    } else {
 | 
			
		||||
        $reason = fascist_check($pass, '/usr/lib/cracklib_dict');
 | 
			
		||||
    }
 | 
			
		||||
    $reason ||= "Software error: password check failed";
 | 
			
		||||
 | 
			
		||||
    return "OK" if ($reason eq "ok");
 | 
			
		||||
 | 
			
		||||
    return $c->l("Bad Password Choice") . ": "
 | 
			
		||||
	. $c->l("The password you have chosen is not a good choice, because")
 | 
			
		||||
	. " " . $c->($reason) . ".";
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
    my $c        = shift;
 | 
			
		||||
    my $password = shift;
 | 
			
		||||
    my $strength;
 | 
			
		||||
   	my $cdb = esmith::ConfigDB->open_ro || die "Couldn't open configuration db";
 | 
			
		||||
    my $rec = $cdb->get('passwordstrength');
 | 
			
		||||
    $strength = ($rec ? ($rec->prop('Users') || 'none') : 'none');
 | 
			
		||||
    return validate_password($c, $strength, $password);
 | 
			
		||||
} ## end sub check_password
 | 
			
		||||
 | 
			
		||||
1;
 | 
			
		||||
 
 | 
			
		||||
@@ -12,146 +12,122 @@ use strict;
 | 
			
		||||
use warnings;
 | 
			
		||||
use Mojo::Base 'Mojolicious::Controller';
 | 
			
		||||
 | 
			
		||||
#use esmith::FormMagick qw(gen_locale_date_string);
 | 
			
		||||
 | 
			
		||||
use Locale::gettext;
 | 
			
		||||
use SrvMngr::I18N;
 | 
			
		||||
use SrvMngr qw(theme_list init_session);
 | 
			
		||||
 | 
			
		||||
use esmith::ConfigDB;
 | 
			
		||||
use Time::TAI64;
 | 
			
		||||
use File::Basename;
 | 
			
		||||
use HTML::Entities;
 | 
			
		||||
use esmith::FormMagick qw(gen_locale_date_string);
 | 
			
		||||
use SrvMngr qw(gen_locale_date_string);
 | 
			
		||||
use File::Temp qw(tempfile);
 | 
			
		||||
 | 
			
		||||
use constant TRUE  => 1;
 | 
			
		||||
use constant FALSE => 0;
 | 
			
		||||
 | 
			
		||||
our $cdb = esmith::ConfigDB->open() || die "Couldn't open config db";
 | 
			
		||||
 | 
			
		||||
our @logfiles = ();	# with array
 | 
			
		||||
 | 
			
		||||
our @logfiles = ();    # with array
 | 
			
		||||
 | 
			
		||||
sub main {
 | 
			
		||||
    my $c = shift;
 | 
			
		||||
    $c->app->log->info($c->log_req);
 | 
			
		||||
 | 
			
		||||
    my %log_datas = ();
 | 
			
		||||
    my $title = $c->l('log_FORM_TITLE');
 | 
			
		||||
    my $notif = '';
 | 
			
		||||
 | 
			
		||||
    $log_datas{default_op} = 
 | 
			
		||||
	($cdb->get('viewlogfiles')->prop('DefaultOperation')) || 'view';
 | 
			
		||||
 | 
			
		||||
    $c->stash( title => $title, notif => $notif, log_datas => \%log_datas);
 | 
			
		||||
    my $title     = $c->l('log_FORM_TITLE');
 | 
			
		||||
    my $notif     = '';
 | 
			
		||||
    $log_datas{default_op} = ($cdb->get('viewlogfiles')->prop('DefaultOperation')) || 'view';
 | 
			
		||||
    $c->stash(title => $title, notif => $notif, log_datas => \%log_datas);
 | 
			
		||||
    $c->render(template => 'viewlogfiles');
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
} ## end sub main
 | 
			
		||||
 | 
			
		||||
sub do_action {
 | 
			
		||||
    my $c = shift;
 | 
			
		||||
    $c->app->log->info($c->log_req);
 | 
			
		||||
 | 
			
		||||
    my $title = $c->l('log_FORM_TITLE');
 | 
			
		||||
    my $notif = '';
 | 
			
		||||
    my $result = "";
 | 
			
		||||
    my $title     = $c->l('log_FORM_TITLE');
 | 
			
		||||
    my $notif     = '';
 | 
			
		||||
    my $result    = "";
 | 
			
		||||
    my %log_datas = ();
 | 
			
		||||
 | 
			
		||||
    $log_datas{filename} = $c->param('Filename');
 | 
			
		||||
    $log_datas{matchpattern} = $c->param('Matchpattern');
 | 
			
		||||
    $log_datas{filename}         = $c->param('Filename');
 | 
			
		||||
    $log_datas{matchpattern}     = $c->param('Matchpattern');
 | 
			
		||||
    $log_datas{highlightpattern} = $c->param('Highlightpattern');
 | 
			
		||||
    $log_datas{operation} = $c->param('Operation');
 | 
			
		||||
    if ($log_datas{operation} eq 'download') {
 | 
			
		||||
	$log_datas{'trt'} = "DOWN"
 | 
			
		||||
    } else {
 | 
			
		||||
	$log_datas{'trt'} = "SHOW"
 | 
			
		||||
    }
 | 
			
		||||
    $log_datas{operation}        = $c->param('Operation');
 | 
			
		||||
 | 
			
		||||
    if ($log_datas{operation} eq 'download') {
 | 
			
		||||
        $log_datas{'trt'} = "DOWN";
 | 
			
		||||
    } else {
 | 
			
		||||
        $log_datas{'trt'} = "SHOW";
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if ($log_datas{filename} =~ /^([\S\s]+)$/) {
 | 
			
		||||
	$log_datas{filename} = $1;
 | 
			
		||||
        $log_datas{filename} = $1;
 | 
			
		||||
    } elsif ($log_datas{filename} =~ /^$/) {
 | 
			
		||||
	$log_datas{filename} = "messages";
 | 
			
		||||
        $log_datas{filename} = "messages";
 | 
			
		||||
    } else {
 | 
			
		||||
	$result .= $c->l("log_FILENAME_ERROR", $log_datas{filename} )
 | 
			
		||||
    	    . " ";
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    if ($log_datas{matchpattern} =~ /^(\S+)$/) {
 | 
			
		||||
	$log_datas{matchpattern} = $1; 
 | 
			
		||||
    } else {
 | 
			
		||||
	$log_datas{matchpattern} = ".";
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    if ($log_datas{highlightpattern} =~ /^(\S+)$/) {
 | 
			
		||||
	$log_datas{highlightpattern} = $1;
 | 
			
		||||
    } else {
 | 
			
		||||
	$log_datas{highlightpattern} = '';
 | 
			
		||||
        $result .= $c->l("log_FILENAME_ERROR", $log_datas{filename}) . " ";
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if ($log_datas{matchpattern} =~ /^(\S+)$/) {
 | 
			
		||||
        $log_datas{matchpattern} = $1;
 | 
			
		||||
    } else {
 | 
			
		||||
        $log_datas{matchpattern} = ".";
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if ($log_datas{highlightpattern} =~ /^(\S+)$/) {
 | 
			
		||||
        $log_datas{highlightpattern} = $1;
 | 
			
		||||
    } else {
 | 
			
		||||
        $log_datas{highlightpattern} = '';
 | 
			
		||||
    }
 | 
			
		||||
    my $fullpath = "/var/log/$log_datas{filename}";
 | 
			
		||||
 | 
			
		||||
    if (-z $fullpath) {
 | 
			
		||||
        $result .= $c->l("log_LOG_FILE_EMPTY", "$log_datas{filename}" );
 | 
			
		||||
        $result .= $c->l("log_LOG_FILE_EMPTY", "$log_datas{filename}");
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if ($log_datas{trt} eq "SHOW") {
 | 
			
		||||
        if ( ! $result ) {
 | 
			
		||||
	    $result = $c->render_to_string(inline => showlogFile( $c, %log_datas ));
 | 
			
		||||
	}
 | 
			
		||||
        if (!$result) {
 | 
			
		||||
            $result = $c->render_to_string(inline => showlogFile($c, %log_datas));
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
	if ( $result ) {
 | 
			
		||||
	    $c->stash(title => $title, modul => $result, log_datas => \%log_datas);
 | 
			
		||||
	    return $c->render(template => 'viewlogfiles2');
 | 
			
		||||
	}
 | 
			
		||||
    }
 | 
			
		||||
        if ($result) {
 | 
			
		||||
            $c->stash(title => $title, modul => $result, log_datas => \%log_datas);
 | 
			
		||||
            return $c->render(template => 'viewlogfiles2');
 | 
			
		||||
        }
 | 
			
		||||
    } ## end if ($log_datas{trt} eq...)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    if ( $log_datas{trt} eq 'DOWN' ) {
 | 
			
		||||
 | 
			
		||||
	my $modul = 'Log file download';
 | 
			
		||||
	
 | 
			
		||||
	$notif = download_logFile( $c, %log_datas );
 | 
			
		||||
	return undef unless defined $notif;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    $c->stash( title => $title, notif => $notif, log_datas => \%log_datas);
 | 
			
		||||
    if ($log_datas{trt} eq 'DOWN') {
 | 
			
		||||
        my $modul = 'Log file download';
 | 
			
		||||
        $notif = download_logFile($c, %log_datas);
 | 
			
		||||
        return undef unless defined $notif;
 | 
			
		||||
    } ## end if ($log_datas{trt} eq...)
 | 
			
		||||
    $c->stash(title => $title, notif => $notif, log_datas => \%log_datas);
 | 
			
		||||
    $c->render(template => 'viewlogfiles');
 | 
			
		||||
} ## end sub do_action
 | 
			
		||||
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
sub timestamp2local
 | 
			
		||||
{
 | 
			
		||||
sub timestamp2local {
 | 
			
		||||
    $_ = shift;
 | 
			
		||||
    if (/^(\@[0-9a-f]{24})(.*)/s)
 | 
			
		||||
    {
 | 
			
		||||
	return Time::TAI64::tai64nlocal($1) . $2;
 | 
			
		||||
    }
 | 
			
		||||
    elsif (/^([0-9]{10}\.[0-9]{3})(.*)/s)
 | 
			
		||||
    {
 | 
			
		||||
	return localtime($1) . $2;
 | 
			
		||||
 | 
			
		||||
    #if (/^(\@[0-9a-f]{24})(.*)/s) {
 | 
			
		||||
    #    return Time::TAI64::tai64nlocal($1) . $2;
 | 
			
		||||
    #} els
 | 
			
		||||
	if (/^([0-9]{10}\.[0-9]{3})(.*)/s) {
 | 
			
		||||
		return localtime($1) . $2;
 | 
			
		||||
    }
 | 
			
		||||
    return $_;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
} ## end sub timestamp2local
 | 
			
		||||
 | 
			
		||||
sub findlogFiles {
 | 
			
		||||
 | 
			
		||||
    my $c = shift;
 | 
			
		||||
 | 
			
		||||
    use File::Find;
 | 
			
		||||
    sub findlogfiles
 | 
			
		||||
    {
 | 
			
		||||
 | 
			
		||||
    sub findlogfiles {
 | 
			
		||||
        my $path = $File::Find::name;
 | 
			
		||||
 | 
			
		||||
        if (-f)
 | 
			
		||||
        {
 | 
			
		||||
        if (-f) {
 | 
			
		||||
 | 
			
		||||
            # Remove leading /var/log/messages
 | 
			
		||||
            $path =~ s:^/var/log/::;
 | 
			
		||||
 | 
			
		||||
            # don't bother to collect files known to be non-text
 | 
			
		||||
            # or not log files
 | 
			
		||||
            foreach (qw(
 | 
			
		||||
            foreach (
 | 
			
		||||
                qw(
 | 
			
		||||
                journal
 | 
			
		||||
                lastlog
 | 
			
		||||
                btmp$
 | 
			
		||||
                wtmp
 | 
			
		||||
@@ -161,176 +137,160 @@ sub findlogFiles {
 | 
			
		||||
                httpd/ssl_scache.pag
 | 
			
		||||
                httpd/ssl_scache.dir
 | 
			
		||||
                \/config$
 | 
			
		||||
            ))
 | 
			
		||||
                )
 | 
			
		||||
                )
 | 
			
		||||
            {
 | 
			
		||||
                return if $path =~ /$_/;
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            } ## end foreach (qw( lastlog btmp$ wtmp...))
 | 
			
		||||
            my ($file_base, $file_path, $file_type) = fileparse($path);
 | 
			
		||||
 | 
			
		||||
            if ( $file_base =~ /@.*/ )
 | 
			
		||||
            {
 | 
			
		||||
            if ($file_base =~ /@.*/) {
 | 
			
		||||
 | 
			
		||||
                #$logfiles{$path} = $file_path . timestamp2local($file_base);
 | 
			
		||||
		push @logfiles, [ $file_path . timestamp2local($file_base), $path  ];
 | 
			
		||||
            }
 | 
			
		||||
            else
 | 
			
		||||
            {
 | 
			
		||||
                push @logfiles, [ $file_path . timestamp2local($file_base), $path ];
 | 
			
		||||
            } else {
 | 
			
		||||
 | 
			
		||||
                #$logfiles{$path} = $path;
 | 
			
		||||
		push @logfiles, [ $path, $path ];
 | 
			
		||||
                push @logfiles, [ $path, $path ];
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
        } ## end if (-f)
 | 
			
		||||
    } ## end sub findlogfiles
 | 
			
		||||
    @logfiles = ();
 | 
			
		||||
 | 
			
		||||
    # Now go and find all the files under /var/log
 | 
			
		||||
    find({wanted => \&findlogfiles, no_chdir => 1}, '/var/log');
 | 
			
		||||
 | 
			
		||||
    find({ wanted => \&findlogfiles, no_chdir => 1 }, '/var/log');
 | 
			
		||||
    my @logf = sort { $a->[0] cmp $b->[0] } @logfiles;
 | 
			
		||||
 | 
			
		||||
    return \@logf;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
} ## end sub findlogFiles
 | 
			
		||||
 | 
			
		||||
sub showlogFile {
 | 
			
		||||
 | 
			
		||||
    my ($c, %log_datas) = @_;
 | 
			
		||||
 | 
			
		||||
    my $fullpath = "/var/log/$log_datas{filename}";
 | 
			
		||||
    my $out = '';
 | 
			
		||||
 | 
			
		||||
    my $out      = '';
 | 
			
		||||
    $out .= sprintf("$fullpath: \n");
 | 
			
		||||
    $out .= sprintf($c->l("log_VIEWING_TIME", $c->gen_locale_date_string()));
 | 
			
		||||
 | 
			
		||||
    $out .= sprintf($c->l("log_VIEWING_TIME", $c->gen_locale_date_string() ));
 | 
			
		||||
    unless ($log_datas{matchpattern} eq '.') {
 | 
			
		||||
 | 
			
		||||
    unless ( $log_datas{matchpattern} eq '.' )
 | 
			
		||||
    {
 | 
			
		||||
        #$out .= sprintf("<p>\n");
 | 
			
		||||
        $out .= sprintf($c->l("log_MATCH_HEADER", $log_datas{matchpattern}  ));
 | 
			
		||||
    }
 | 
			
		||||
        $out .= sprintf($c->l("log_MATCH_HEADER", $log_datas{matchpattern}));
 | 
			
		||||
    } ## end unless ($log_datas{matchpattern...})
 | 
			
		||||
 | 
			
		||||
    if ($log_datas{highlightpattern}) {
 | 
			
		||||
 | 
			
		||||
    if ( $log_datas{highlightpattern} )
 | 
			
		||||
    {
 | 
			
		||||
        #$out .= sprintf("<p>\n");
 | 
			
		||||
        $out .= sprintf($c->l("log_HIGHLIGHT_HEADER", "$log_datas{highlightpattern}" ));
 | 
			
		||||
    }
 | 
			
		||||
        $out .= sprintf($c->l("log_HIGHLIGHT_HEADER", "$log_datas{highlightpattern}"));
 | 
			
		||||
    } ## end if ($log_datas{highlightpattern...})
 | 
			
		||||
 | 
			
		||||
    if ($log_datas{filename} =~ /\.gz$/) {
 | 
			
		||||
        my $pid = open(LOGFILE, "-|");
 | 
			
		||||
        die "Couldn't fork: $!" unless defined $pid;
 | 
			
		||||
 | 
			
		||||
        unless ($pid) {
 | 
			
		||||
 | 
			
		||||
            # Child
 | 
			
		||||
            exec("/bin/zcat", $fullpath)
 | 
			
		||||
            || die "Can't exec zcat: $!";
 | 
			
		||||
                || die "Can't exec zcat: $!";
 | 
			
		||||
 | 
			
		||||
            # NOTREACHED
 | 
			
		||||
        }
 | 
			
		||||
        } ## end unless ($pid)
 | 
			
		||||
    } else {
 | 
			
		||||
        open(LOGFILE, "$fullpath");
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    my $somethingMatched = 0;
 | 
			
		||||
    my $fileEmpty = 1;
 | 
			
		||||
    my $fileEmpty        = 1;
 | 
			
		||||
    $out .= sprintf("<PRE>");
 | 
			
		||||
    while(<LOGFILE>)
 | 
			
		||||
    {
 | 
			
		||||
 | 
			
		||||
    while (<LOGFILE>) {
 | 
			
		||||
        $fileEmpty = 0;
 | 
			
		||||
        next unless /$log_datas{matchpattern}/;
 | 
			
		||||
        $somethingMatched = 1;
 | 
			
		||||
 | 
			
		||||
        $_ = timestamp2local($_);
 | 
			
		||||
        $_ = HTML::Entities::encode_entities($_);
 | 
			
		||||
        $_                = timestamp2local($_);
 | 
			
		||||
        $_                = HTML::Entities::encode_entities($_);
 | 
			
		||||
        ($log_datas{highlightpattern} && /$log_datas{highlightpattern}/)
 | 
			
		||||
    	    ? $out .= sprintf( "<b>$_</b>" )
 | 
			
		||||
    	    : $out .= sprintf("$_");
 | 
			
		||||
    }
 | 
			
		||||
            ? $out .= sprintf("<b>$_</b>")
 | 
			
		||||
            : $out .= sprintf("$_");
 | 
			
		||||
    } ## end while (<LOGFILE>)
 | 
			
		||||
    $out .= sprintf("</PRE>");
 | 
			
		||||
 | 
			
		||||
    if ($fileEmpty) {
 | 
			
		||||
        $out .= sprintf("<p>\n");
 | 
			
		||||
        $out .= sprintf($c->l("log_LOG_FILE_EMPTY"));
 | 
			
		||||
    } else {
 | 
			
		||||
        unless ($somethingMatched)
 | 
			
		||||
        {
 | 
			
		||||
 | 
			
		||||
        unless ($somethingMatched) {
 | 
			
		||||
            $out .= sprintf("<p>\n");
 | 
			
		||||
            $out .= sprintf($c->l("log_NO_MATCHING_LINES"));
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    } ## end else [ if ($fileEmpty) ]
 | 
			
		||||
    close LOGFILE;
 | 
			
		||||
 | 
			
		||||
    return $out;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
} ## end sub showlogFile
 | 
			
		||||
 | 
			
		||||
sub download_logFile {
 | 
			
		||||
 | 
			
		||||
    my ($c, %log_datas) = @_;
 | 
			
		||||
 | 
			
		||||
    my $fullpath = "/var/log/$log_datas{filename}";
 | 
			
		||||
 | 
			
		||||
    # Save this information for later.
 | 
			
		||||
 | 
			
		||||
    $cdb->get('viewlogfiles')->merge_props('DefaultOperation', $log_datas{operation});
 | 
			
		||||
 | 
			
		||||
    # If the client is on windows, we must handle this a little differently.
 | 
			
		||||
    my $win32 = FALSE;
 | 
			
		||||
    my $mac   = FALSE;
 | 
			
		||||
    my $agent = $ENV{HTTP_USER_AGENT} || "";
 | 
			
		||||
 | 
			
		||||
    if ($agent =~ /win32|windows/i) {
 | 
			
		||||
        $win32 = TRUE;
 | 
			
		||||
    }  elsif ($agent =~ /mac/i) {
 | 
			
		||||
    } elsif ($agent =~ /mac/i) {
 | 
			
		||||
        $mac = TRUE;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    # Check for errors first. Once we start sending the file it's too late to
 | 
			
		||||
    # report them.
 | 
			
		||||
    my $error = "";
 | 
			
		||||
    unless (-f $fullpath)  {
 | 
			
		||||
 | 
			
		||||
    unless (-f $fullpath) {
 | 
			
		||||
        $error = $c->l("log_ERR_NOEXIST_FILE") . $fullpath;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    local *FILE;
 | 
			
		||||
    open(FILE, "<$fullpath")
 | 
			
		||||
        or $error = $c->l("log_ERR_NOOPEN_FILE");
 | 
			
		||||
    # Put other error checking here. 
 | 
			
		||||
 | 
			
		||||
    # Put other error checking here.
 | 
			
		||||
    return $error if $error;
 | 
			
		||||
 | 
			
		||||
    # Fix the filename, as it might have a directory prefixed to it. 
 | 
			
		||||
    # Fix the filename, as it might have a directory prefixed to it.
 | 
			
		||||
    my $filename = $log_datas{filename};
 | 
			
		||||
    if ( $filename =~ m#/# ) {
 | 
			
		||||
 | 
			
		||||
    if ($filename =~ m#/#) {
 | 
			
		||||
        $filename = (split /\//, $filename)[-1];
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    # And send the file.
 | 
			
		||||
    my $nl = "\n";
 | 
			
		||||
    if ($win32)  { $nl = "\r\n" }
 | 
			
		||||
    elsif ($mac) { $nl = "\r" }
 | 
			
		||||
    if    ($win32) { $nl = "\r\n" }
 | 
			
		||||
    elsif ($mac)   { $nl = "\r" }
 | 
			
		||||
 | 
			
		||||
    # Otherwise, send the file. Start with the headers.
 | 
			
		||||
    # Note: The Content-disposition must be attachment, or IE will view the
 | 
			
		||||
    # file inline like it's told. It ignores the Content-type, but it likes
 | 
			
		||||
    # the Content-disposition (an officially unsupported header) for some
 | 
			
		||||
    # reason. Yay Microsoft.
 | 
			
		||||
 | 
			
		||||
    my $file2 = new File::Temp( UNLINK => 0 );
 | 
			
		||||
    my $file2 = new File::Temp(UNLINK => 0);
 | 
			
		||||
 | 
			
		||||
    while (my $line = <FILE>) {
 | 
			
		||||
        chomp $line;
 | 
			
		||||
        my $linew = timestamp2local($line) . $nl;
 | 
			
		||||
        print $file2 $linew;
 | 
			
		||||
    }
 | 
			
		||||
    } ## end while (my $line = <FILE>)
 | 
			
		||||
    close(FILE);
 | 
			
		||||
 | 
			
		||||
    $c->render_file(
 | 
			
		||||
        'filepath' => "$file2",
 | 
			
		||||
        'filename' => "$filename",
 | 
			
		||||
        'format' => 'x-download',
 | 
			
		||||
	'content_disposition' => 'attachment',
 | 
			
		||||
        'cleanup' => 1,
 | 
			
		||||
        'filepath'            => "$file2",
 | 
			
		||||
        'filename'            => "$filename",
 | 
			
		||||
        'format'              => 'x-download',
 | 
			
		||||
        'content_disposition' => 'attachment',
 | 
			
		||||
        'cleanup'             => 1,
 | 
			
		||||
    );
 | 
			
		||||
 | 
			
		||||
    return undef;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
} ## end sub download_logFile
 | 
			
		||||
1;
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -10,94 +10,70 @@ package SrvMngr::Controller::Workgroup;
 | 
			
		||||
use strict;
 | 
			
		||||
use warnings;
 | 
			
		||||
use Mojo::Base 'Mojolicious::Controller';
 | 
			
		||||
 | 
			
		||||
use Locale::gettext;
 | 
			
		||||
use SrvMngr::I18N;
 | 
			
		||||
 | 
			
		||||
use SrvMngr qw(theme_list init_session);
 | 
			
		||||
 | 
			
		||||
use esmith::FormMagick::Panel::workgroup;
 | 
			
		||||
 | 
			
		||||
our $db = esmith::ConfigDB->open || die "Couldn't open config db";
 | 
			
		||||
 | 
			
		||||
sub main {
 | 
			
		||||
    my $c = shift;
 | 
			
		||||
    $c->app->log->info($c->log_req);
 | 
			
		||||
 | 
			
		||||
    my %wkg_datas = ();
 | 
			
		||||
    my $title = $c->l('wkg_FORM_TITLE');
 | 
			
		||||
    my $modul = '';
 | 
			
		||||
 | 
			
		||||
    $wkg_datas{'Workgroup'} = ($db->get_prop('smb','Workgroup')) || '';
 | 
			
		||||
    $wkg_datas{'ServerName'} = ($db->get_prop('smb','ServerName')) || '';
 | 
			
		||||
    $wkg_datas{'ServerRole'} = ($db->get_prop('smb','ServerRole')) || '';
 | 
			
		||||
    $wkg_datas{'RoamingProfiles'} = ($db->get_prop('smb','RoamingProfiles')) || '';
 | 
			
		||||
 | 
			
		||||
    $c->stash( title => $title, modul => $modul, wkg_datas => \%wkg_datas );
 | 
			
		||||
    my $title     = $c->l('wkg_FORM_TITLE');
 | 
			
		||||
    my $modul     = '';
 | 
			
		||||
    $wkg_datas{'Workgroup'}       = ($db->get_prop('smb', 'Workgroup'))       || '';
 | 
			
		||||
    $wkg_datas{'ServerName'}      = ($db->get_prop('smb', 'ServerName'))      || '';
 | 
			
		||||
    $wkg_datas{'ServerRole'}      = ($db->get_prop('smb', 'ServerRole'))      || '';
 | 
			
		||||
    $wkg_datas{'RoamingProfiles'} = ($db->get_prop('smb', 'RoamingProfiles')) || '';
 | 
			
		||||
    $c->stash(title => $title, modul => $modul, wkg_datas => \%wkg_datas);
 | 
			
		||||
    $c->render(template => 'workgroup');
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
} ## end sub main
 | 
			
		||||
 | 
			
		||||
sub do_update {
 | 
			
		||||
    my $c = shift;
 | 
			
		||||
    $c->app->log->info($c->log_req);
 | 
			
		||||
 | 
			
		||||
    my $result = "";
 | 
			
		||||
 | 
			
		||||
    my $workgroup = ($c->param('Workgroup') || 'no');
 | 
			
		||||
    my $servername = ($c->param('ServerName') || 'WS');
 | 
			
		||||
    my $result          = "";
 | 
			
		||||
    my $workgroup       = ($c->param('Workgroup') || 'no');
 | 
			
		||||
    my $servername      = ($c->param('ServerName') || 'WS');
 | 
			
		||||
    my $roamingprofiles = ($c->param('RoamingProfiles') || 'no');
 | 
			
		||||
    my $serverrole = ($c->param('ServerRole') || 'WS');
 | 
			
		||||
    my $serverrole      = ($c->param('ServerRole') || 'WS');
 | 
			
		||||
 | 
			
		||||
    # controls
 | 
			
		||||
    my $res = validate2_workgroup($c, $workgroup, $servername);
 | 
			
		||||
    $result .= $res unless $res eq 'OK';
 | 
			
		||||
 | 
			
		||||
    $res = validate2_servername($c, $servername);
 | 
			
		||||
    $result .= $res unless $res eq 'OK';
 | 
			
		||||
 | 
			
		||||
    if ($result eq '') {
 | 
			
		||||
        $db->get('smb')->set_prop('Workgroup', $workgroup);
 | 
			
		||||
	$db->get('smb')->set_prop('ServerRole', $serverrole);
 | 
			
		||||
        $db->get('smb')->set_prop('ServerName', $servername);
 | 
			
		||||
        $db->get('smb')->set_prop('Workgroup',       $workgroup);
 | 
			
		||||
        $db->get('smb')->set_prop('ServerRole',      $serverrole);
 | 
			
		||||
        $db->get('smb')->set_prop('ServerName',      $servername);
 | 
			
		||||
        $db->get('smb')->set_prop('RoamingProfiles', $roamingprofiles);
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    system( "/sbin/e-smith/signal-event", "workgroup-update" ) == 0
 | 
			
		||||
	or $result = $c->l('ERROR_UPDATING') . " system";
 | 
			
		||||
 | 
			
		||||
    } ## end if ($result eq '')
 | 
			
		||||
    system("/sbin/e-smith/signal-event", "workgroup-update") == 0
 | 
			
		||||
        or $result = $c->l('ERROR_UPDATING') . " system";
 | 
			
		||||
    my $title = $c->l('wkg_FORM_TITLE');
 | 
			
		||||
 | 
			
		||||
    if ( $result eq '' ) { $result = $c->l('wkg_SUCCESS'); }
 | 
			
		||||
 | 
			
		||||
    $c->stash( title => $title, modul => $result );
 | 
			
		||||
    if ($result eq '') { $result = $c->l('wkg_SUCCESS'); }
 | 
			
		||||
    $c->stash(title => $title, modul => $result);
 | 
			
		||||
    $c->render(template => 'module');
 | 
			
		||||
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
} ## end sub do_update
 | 
			
		||||
 | 
			
		||||
sub validate2_servername {
 | 
			
		||||
    my $c = shift;
 | 
			
		||||
    my $c          = shift;
 | 
			
		||||
    my $servername = shift;
 | 
			
		||||
 | 
			
		||||
    return ('OK') if ( $servername =~ /^([a-zA-Z][\-\w]*)$/ );
 | 
			
		||||
 | 
			
		||||
    return ('OK') if ($servername =~ /^([a-zA-Z][\-\w]*)$/);
 | 
			
		||||
    return $c->l('INVALID_SERVERNAME');
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
} ## end sub validate2_servername
 | 
			
		||||
 | 
			
		||||
sub validate2_workgroup {
 | 
			
		||||
    my $c = shift;
 | 
			
		||||
    my $workgroup = lc(shift);
 | 
			
		||||
    my $c          = shift;
 | 
			
		||||
    my $workgroup  = lc(shift);
 | 
			
		||||
    my $servername = lc(shift);
 | 
			
		||||
#    my $workgroup = $c->l(shift);
 | 
			
		||||
#    my $servername = $c->l(shift);
 | 
			
		||||
 | 
			
		||||
    return $c->l('INVALID_WORKGROUP') unless ( $workgroup =~ /^([a-zA-Z0-9][\-\w\.]*)$/ );
 | 
			
		||||
    return $c->l('INVALID_WORKGROUP_MATCHES_SERVERNAME') if ( $servername eq $workgroup);
 | 
			
		||||
    return ('OK'); 
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    #    my $workgroup = $c->l(shift);
 | 
			
		||||
    #    my $servername = $c->l(shift);
 | 
			
		||||
    return $c->l('INVALID_WORKGROUP') unless ($workgroup =~ /^([a-zA-Z0-9][\-\w\.]*)$/);
 | 
			
		||||
    return $c->l('INVALID_WORKGROUP_MATCHES_SERVERNAME') if ($servername eq $workgroup);
 | 
			
		||||
    return ('OK');
 | 
			
		||||
} ## end sub validate2_workgroup
 | 
			
		||||
1;
 | 
			
		||||
 
 | 
			
		||||
@@ -10,270 +10,238 @@ package SrvMngr::Controller::Yum;
 | 
			
		||||
use strict;
 | 
			
		||||
use warnings;
 | 
			
		||||
use Mojo::Base 'Mojolicious::Controller';
 | 
			
		||||
 | 
			
		||||
use Locale::gettext;
 | 
			
		||||
use SrvMngr::I18N;
 | 
			
		||||
 | 
			
		||||
use SrvMngr qw(theme_list init_session ip_number_or_blank);
 | 
			
		||||
 | 
			
		||||
use esmith::ConfigDB;
 | 
			
		||||
 | 
			
		||||
use esmith::util;
 | 
			
		||||
use File::Basename;
 | 
			
		||||
 | 
			
		||||
our $cdb = esmith::ConfigDB->open || die "Couldn't open config db";
 | 
			
		||||
 | 
			
		||||
my $dnf_status_file  = '/var/cache/dnf/dnf.status';
 | 
			
		||||
my $dnf_status_file = '/var/cache/dnf/dnf.status';
 | 
			
		||||
 | 
			
		||||
#use File::stat;
 | 
			
		||||
 | 
			
		||||
our %dbs;
 | 
			
		||||
 | 
			
		||||
for ( qw(available installed updates) )
 | 
			
		||||
{
 | 
			
		||||
    $dbs{$_} = esmith::ConfigDB->open_ro("dnf_$_") or
 | 
			
		||||
	die "Couldn't open dnf_$_ DB\n";
 | 
			
		||||
for (qw(available installed updates)) {
 | 
			
		||||
    $dbs{$_} = esmith::ConfigDB->open_ro("dnf_$_")
 | 
			
		||||
        or die "Couldn't open dnf_$_ DB\n";
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
for ( qw(repositories) )
 | 
			
		||||
{
 | 
			
		||||
    $dbs{$_} = esmith::ConfigDB->open("yum_$_") or
 | 
			
		||||
	die "Couldn't open yum_$_ DB\n";
 | 
			
		||||
for (qw(repositories)) {
 | 
			
		||||
    $dbs{$_} = esmith::ConfigDB->open("yum_$_")
 | 
			
		||||
        or die "Couldn't open yum_$_ DB\n";
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
sub main {
 | 
			
		||||
 | 
			
		||||
    my $c = shift;
 | 
			
		||||
    $c->app->log->info($c->log_req);
 | 
			
		||||
 | 
			
		||||
    my %yum_datas = ();
 | 
			
		||||
    my $title = $c->l('yum_FORM_TITLE');
 | 
			
		||||
    my $dest = 'yum';
 | 
			
		||||
    my $notif = '';
 | 
			
		||||
 | 
			
		||||
    my $title     = $c->l('yum_FORM_TITLE');
 | 
			
		||||
    my $dest      = 'yum';
 | 
			
		||||
    my $notif     = '';
 | 
			
		||||
    $yum_datas{'trt'} = 'STAT';
 | 
			
		||||
 | 
			
		||||
   
 | 
			
		||||
    if ( $c->is_dnf_running()) {
 | 
			
		||||
	$yum_datas{'trt'} = 'LOGF';
 | 
			
		||||
	$dest = 'yumlogfile';
 | 
			
		||||
    if ($c->is_dnf_running()) {
 | 
			
		||||
        $yum_datas{'trt'} = 'LOGF';
 | 
			
		||||
        $dest = 'yumlogfile';
 | 
			
		||||
    } elsif ($cdb->get_prop('dnf', 'LogFile')) {
 | 
			
		||||
	$yum_datas{'trt'} = 'PSTU';
 | 
			
		||||
	$yum_datas{'reconf'} = $cdb->get_value('UnsavedChanges', 'yes');
 | 
			
		||||
	$dest = 'yumpostupg';
 | 
			
		||||
        $yum_datas{'trt'}    = 'PSTU';
 | 
			
		||||
        $yum_datas{'reconf'} = $cdb->get_value('UnsavedChanges', 'yes');
 | 
			
		||||
        $dest                = 'yumpostupg';
 | 
			
		||||
    } else {
 | 
			
		||||
	# normal other trt
 | 
			
		||||
 | 
			
		||||
        # normal other trt
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    $c->stash( title => $title, notif => $notif, yum_datas => \%yum_datas );
 | 
			
		||||
    return $c->render( template => $dest );
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
    $c->stash(title => $title, notif => $notif, yum_datas => \%yum_datas);
 | 
			
		||||
    return $c->render(template => $dest);
 | 
			
		||||
} ## end sub main
 | 
			
		||||
 | 
			
		||||
sub do_display {
 | 
			
		||||
 | 
			
		||||
    my $c = shift;
 | 
			
		||||
 | 
			
		||||
    my $rt = $c->current_route;
 | 
			
		||||
    my $trt = ($c->param('trt') || 'STAT');
 | 
			
		||||
 | 
			
		||||
    my $c         = shift;
 | 
			
		||||
    my $rt        = $c->current_route;
 | 
			
		||||
    my $trt       = ($c->param('trt') || 'STAT');
 | 
			
		||||
    my %yum_datas = ();
 | 
			
		||||
    my $title = $c->l('yum_FORM_TITLE');
 | 
			
		||||
    my $title     = $c->l('yum_FORM_TITLE');
 | 
			
		||||
    my ($notif, $dest) = '';
 | 
			
		||||
 | 
			
		||||
    $yum_datas{'trt'} = $trt;
 | 
			
		||||
 | 
			
		||||
    # force $trt if current logfile
 | 
			
		||||
    if ( $c->is_dnf_running() ) {
 | 
			
		||||
	$trt = 'LOGF';
 | 
			
		||||
    if ($c->is_dnf_running()) {
 | 
			
		||||
        $trt = 'LOGF';
 | 
			
		||||
    } elsif ($cdb->get_prop('dnf', 'LogFile')) {
 | 
			
		||||
	$trt = 'PSTU';
 | 
			
		||||
        $trt = 'PSTU';
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
        if ( $trt eq 'UPDT' ) {
 | 
			
		||||
	    $dest = 'yumupdate';
 | 
			
		||||
    if ($trt eq 'UPDT') {
 | 
			
		||||
        $dest = 'yumupdate';
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if ($trt eq 'INST') {
 | 
			
		||||
        $dest = 'yuminstall';
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if ($trt eq 'REMO') {
 | 
			
		||||
        $dest = 'yumremove';
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if ($trt eq 'CONF') {
 | 
			
		||||
        $dest = 'yumconfig';
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if ($trt eq 'LOGF') {
 | 
			
		||||
        if ($c->is_dnf_running()) {
 | 
			
		||||
            $dest = 'yumlogfile';
 | 
			
		||||
        }
 | 
			
		||||
    } ## end if ($trt eq 'LOGF')
 | 
			
		||||
 | 
			
		||||
        if ( $trt eq 'INST' ) {
 | 
			
		||||
	    $dest = 'yuminstall';
 | 
			
		||||
    if ($trt eq 'PSTU') {
 | 
			
		||||
        if ($cdb->get_prop('dnf', 'LogFile')) {
 | 
			
		||||
            $dest = 'yumpostupg';
 | 
			
		||||
            $yum_datas{'reconf'} = $cdb->get_value('UnsavedChanges', 'yes');
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        if ( $trt eq 'REMO' ) {
 | 
			
		||||
	    $dest = 'yumremove';
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
        if ( $trt eq 'CONF' ) {
 | 
			
		||||
	    $dest = 'yumconfig';
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
        if ( $trt eq 'LOGF' ) {
 | 
			
		||||
	    if ($c->is_dnf_running()) {
 | 
			
		||||
	    $dest = 'yumlogfile';
 | 
			
		||||
	    }
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
        if ( $trt eq 'PSTU') {
 | 
			
		||||
	    if ($cdb->get_prop('dnf', 'LogFile')) {
 | 
			
		||||
		$dest = 'yumpostupg';
 | 
			
		||||
		$yum_datas{'reconf'} = $cdb->get_value('UnsavedChanges', 'yes');
 | 
			
		||||
	    }
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
	if ( ! $dest ) { $dest = 'yum'; }
 | 
			
		||||
 | 
			
		||||
    $c->stash( title => $title, notif => $notif, yum_datas => \%yum_datas );
 | 
			
		||||
    return $c->render( template => $dest );
 | 
			
		||||
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
    } ## end if ($trt eq 'PSTU')
 | 
			
		||||
    if (!$dest) { $dest = 'yum'; }
 | 
			
		||||
    $c->stash(title => $title, notif => $notif, yum_datas => \%yum_datas);
 | 
			
		||||
    return $c->render(template => $dest);
 | 
			
		||||
} ## end sub do_display
 | 
			
		||||
 | 
			
		||||
sub do_update {
 | 
			
		||||
 | 
			
		||||
    my $c = shift;
 | 
			
		||||
    $c->app->log->info($c->log_req);
 | 
			
		||||
 | 
			
		||||
    my $rt = $c->current_route;
 | 
			
		||||
    my $trt = $c->param('trt');
 | 
			
		||||
 | 
			
		||||
    my $rt        = $c->current_route;
 | 
			
		||||
    my $trt       = $c->param('trt');
 | 
			
		||||
    my %yum_datas = ();
 | 
			
		||||
    $yum_datas{trt} = $trt;
 | 
			
		||||
 | 
			
		||||
    my $title = $c->l('yum_FORM_TITLE');
 | 
			
		||||
 | 
			
		||||
    my ($dest, $res, $result) = '';
 | 
			
		||||
 | 
			
		||||
    if ( $trt eq 'UPDT' ) {
 | 
			
		||||
    if ($trt eq 'UPDT') {
 | 
			
		||||
        $dest = 'yumupdate';
 | 
			
		||||
 | 
			
		||||
	$dest = 'yumupdate';
 | 
			
		||||
        if (!$result) {
 | 
			
		||||
            $res = $c->do_yum('update');
 | 
			
		||||
            $result .= $res unless $res eq 'OK';
 | 
			
		||||
 | 
			
		||||
	if ( ! $result ) {
 | 
			
		||||
	    $res = $c->do_yum('update');
 | 
			
		||||
	    $result .= $res unless $res eq 'OK';
 | 
			
		||||
	    if ( ! $result ) { 
 | 
			
		||||
		$yum_datas{trt} = 'SUC';
 | 
			
		||||
		#$result = $c->l('yum_SUCCESS'); 
 | 
			
		||||
	    }
 | 
			
		||||
	}
 | 
			
		||||
    }
 | 
			
		||||
            if (!$result) {
 | 
			
		||||
                $yum_datas{trt} = 'SUC';
 | 
			
		||||
 | 
			
		||||
    if ( $trt eq 'INST' ) {
 | 
			
		||||
                #$result = $c->l('yum_SUCCESS');
 | 
			
		||||
            } ## end if (!$result)
 | 
			
		||||
        } ## end if (!$result)
 | 
			
		||||
    } ## end if ($trt eq 'UPDT')
 | 
			
		||||
 | 
			
		||||
	$dest = 'yuminstall';
 | 
			
		||||
    if ($trt eq 'INST') {
 | 
			
		||||
        $dest = 'yuminstall';
 | 
			
		||||
 | 
			
		||||
	if ( ! $result ) {
 | 
			
		||||
	    $res = $c->do_yum('install');
 | 
			
		||||
	    $result .= $res unless $res eq 'OK';
 | 
			
		||||
	    if ( ! $result ) { 
 | 
			
		||||
		$yum_datas{trt} = 'SUC';
 | 
			
		||||
		#$result = $c->l('yum_SUCCESS'); 
 | 
			
		||||
	    }
 | 
			
		||||
	}
 | 
			
		||||
    }
 | 
			
		||||
        if (!$result) {
 | 
			
		||||
            $res = $c->do_yum('install');
 | 
			
		||||
            $result .= $res unless $res eq 'OK';
 | 
			
		||||
 | 
			
		||||
    if ( $trt eq 'REMO' ) {
 | 
			
		||||
            if (!$result) {
 | 
			
		||||
                $yum_datas{trt} = 'SUC';
 | 
			
		||||
 | 
			
		||||
	$dest = 'yumremove';
 | 
			
		||||
                #$result = $c->l('yum_SUCCESS');
 | 
			
		||||
            } ## end if (!$result)
 | 
			
		||||
        } ## end if (!$result)
 | 
			
		||||
    } ## end if ($trt eq 'INST')
 | 
			
		||||
 | 
			
		||||
	if ( ! $result ) {
 | 
			
		||||
	    $res = $c->do_yum('remove');
 | 
			
		||||
	    $result .= $res unless $res eq 'OK';
 | 
			
		||||
	    if ( ! $result ) { 
 | 
			
		||||
		$yum_datas{trt} = 'SUC';
 | 
			
		||||
		#$result = $c->l('yum_SUCCESS'); 
 | 
			
		||||
	    }
 | 
			
		||||
	}
 | 
			
		||||
    }
 | 
			
		||||
    if ($trt eq 'REMO') {
 | 
			
		||||
        $dest = 'yumremove';
 | 
			
		||||
 | 
			
		||||
    if ( $trt eq 'CONF' ) {
 | 
			
		||||
        if (!$result) {
 | 
			
		||||
            $res = $c->do_yum('remove');
 | 
			
		||||
            $result .= $res unless $res eq 'OK';
 | 
			
		||||
 | 
			
		||||
	$dest = 'yumconfig';
 | 
			
		||||
            if (!$result) {
 | 
			
		||||
                $yum_datas{trt} = 'SUC';
 | 
			
		||||
 | 
			
		||||
	if ( ! $result ) {
 | 
			
		||||
	    $res = $c->change_settings();
 | 
			
		||||
	    $result .= $res unless $res eq 'OK';
 | 
			
		||||
	    if ( ! $result ) { 
 | 
			
		||||
		$yum_datas{trt} = 'SUC';
 | 
			
		||||
		$result = $c->l('yum_SUCCESS');
 | 
			
		||||
	    }
 | 
			
		||||
	}
 | 
			
		||||
    }
 | 
			
		||||
                #$result = $c->l('yum_SUCCESS');
 | 
			
		||||
            } ## end if (!$result)
 | 
			
		||||
        } ## end if (!$result)
 | 
			
		||||
    } ## end if ($trt eq 'REMO')
 | 
			
		||||
 | 
			
		||||
    if ($trt eq 'CONF') {
 | 
			
		||||
        $dest = 'yumconfig';
 | 
			
		||||
 | 
			
		||||
    if ( $trt eq 'PSTU') {
 | 
			
		||||
        if (!$result) {
 | 
			
		||||
            $res = $c->change_settings();
 | 
			
		||||
            $result .= $res unless $res eq 'OK';
 | 
			
		||||
 | 
			
		||||
	my $reconf = $c->param('reconf') || 'yes';
 | 
			
		||||
	$dest = 'yumpostupg';
 | 
			
		||||
            if (!$result) {
 | 
			
		||||
                $yum_datas{trt} = 'SUC';
 | 
			
		||||
                $result = $c->l('yum_SUCCESS');
 | 
			
		||||
            }
 | 
			
		||||
        } ## end if (!$result)
 | 
			
		||||
    } ## end if ($trt eq 'CONF')
 | 
			
		||||
 | 
			
		||||
    # 	effective reconfigure and reboot required
 | 
			
		||||
	if ( $reconf eq 'yes' ) {
 | 
			
		||||
	    $res = $c->post_upgrade_reboot();
 | 
			
		||||
	    $result .= $res unless $res eq 'OK';
 | 
			
		||||
	    if ( ! $result ) { 
 | 
			
		||||
		$yum_datas{trt} = 'SUC';
 | 
			
		||||
		$result = $c->l('yum_SYSTEM_BEING_RECONFIGURED');
 | 
			
		||||
	    }
 | 
			
		||||
	} else {
 | 
			
		||||
	    $yum_datas{trt} = 'SUC';
 | 
			
		||||
	    $result = $c->l('yum_UPDATE_SUCCESS');
 | 
			
		||||
	}
 | 
			
		||||
    }
 | 
			
		||||
    if ($trt eq 'PSTU') {
 | 
			
		||||
        my $reconf = $c->param('reconf') || 'yes';
 | 
			
		||||
        $dest = 'yumpostupg';
 | 
			
		||||
 | 
			
		||||
        # 	effective reconfigure and reboot required
 | 
			
		||||
        if ($reconf eq 'yes') {
 | 
			
		||||
            $res = $c->post_upgrade_reboot();
 | 
			
		||||
            $result .= $res unless $res eq 'OK';
 | 
			
		||||
 | 
			
		||||
    if ( $trt eq 'LOGF' ) {
 | 
			
		||||
 | 
			
		||||
    	$dest = 'yumlogfile';
 | 
			
		||||
        if ( ! $c->is_dnf_running()) {
 | 
			
		||||
	    $yum_datas{trt} = 'SUC';
 | 
			
		||||
	    $result = $c->l('yum_SUCCESS');
 | 
			
		||||
            if (!$result) {
 | 
			
		||||
                $yum_datas{trt} = 'SUC';
 | 
			
		||||
                $result = $c->l('yum_SYSTEM_BEING_RECONFIGURED');
 | 
			
		||||
            }
 | 
			
		||||
        } else {
 | 
			
		||||
            $yum_datas{trt} = 'SUC';
 | 
			
		||||
            $result = $c->l('yum_UPDATE_SUCCESS');
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    } ## end if ($trt eq 'PSTU')
 | 
			
		||||
 | 
			
		||||
    if ($trt eq 'LOGF') {
 | 
			
		||||
        $dest = 'yumlogfile';
 | 
			
		||||
 | 
			
		||||
        if (!$c->is_dnf_running()) {
 | 
			
		||||
            $yum_datas{trt} = 'SUC';
 | 
			
		||||
            $result = $c->l('yum_SUCCESS');
 | 
			
		||||
        }
 | 
			
		||||
    } ## end if ($trt eq 'LOGF')
 | 
			
		||||
 | 
			
		||||
    # do_yum ended (no message) --> forced to LOGFile
 | 
			
		||||
    if ( ! $result ) { 
 | 
			
		||||
	$dest = 'yumlogfile';
 | 
			
		||||
	$yum_datas{trt} = 'LOGF';
 | 
			
		||||
    if (!$result) {
 | 
			
		||||
        $dest = 'yumlogfile';
 | 
			
		||||
        $yum_datas{trt} = 'LOGF';
 | 
			
		||||
    }
 | 
			
		||||
    $c->stash(title => $title, notif => $result, yum_datas => \%yum_datas);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    $c->stash( title => $title, notif => $result, yum_datas => \%yum_datas );
 | 
			
		||||
    if ($yum_datas{trt} ne 'SUC') {
 | 
			
		||||
	return $c->render(template => $dest);
 | 
			
		||||
        return $c->render(template => $dest);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    my $message = "'Yum' $trt update DONE";
 | 
			
		||||
    $c->app->log->info($message);
 | 
			
		||||
    $c->flash(success => $result) if $result;
 | 
			
		||||
 | 
			
		||||
    $c->redirect_to("/yum");
 | 
			
		||||
 | 
			
		||||
};
 | 
			
		||||
} ## end sub do_update
 | 
			
		||||
 | 
			
		||||
sub get_dnf_status {
 | 
			
		||||
 | 
			
		||||
    #interrogate status file created and maintained by smeserver.py plugin for dnf.
 | 
			
		||||
    my ($c) = @_;
 | 
			
		||||
    my ($c)       = @_;
 | 
			
		||||
    my $file_name = $dnf_status_file;
 | 
			
		||||
    my $content = "resolved";
 | 
			
		||||
    if ( -e "$file_name") {
 | 
			
		||||
	open my $fh, '<', $file_name or die "Can't open file: $!";
 | 
			
		||||
	$content = <$fh>;
 | 
			
		||||
	close $fh;
 | 
			
		||||
    }
 | 
			
		||||
    my $content   = "resolved";
 | 
			
		||||
 | 
			
		||||
    if (-e "$file_name") {
 | 
			
		||||
        open my $fh, '<', $file_name or die "Can't open file: $!";
 | 
			
		||||
        $content = <$fh>;
 | 
			
		||||
        close $fh;
 | 
			
		||||
    } ## end if (-e "$file_name")
 | 
			
		||||
    return $content;
 | 
			
		||||
}
 | 
			
		||||
} ## end sub get_dnf_status
 | 
			
		||||
 | 
			
		||||
sub is_dnf_running {
 | 
			
		||||
    my ($c) = @_;
 | 
			
		||||
    my $dnf_status = $c->get_dnf_status();
 | 
			
		||||
    return $dnf_status ne "resolved" && $dnf_status ne "config" && $dnf_status ne "sack";
 | 
			
		||||
}
 | 
			
		||||
} ## end sub is_dnf_running
 | 
			
		||||
 | 
			
		||||
sub is_empty {
 | 
			
		||||
 | 
			
		||||
    my ($c, $yumdb) = @_;
 | 
			
		||||
 | 
			
		||||
    my $groups = $dbs{$yumdb}->get_all_by_prop(type => 'group') || 'none';
 | 
			
		||||
    my $groups   = $dbs{$yumdb}->get_all_by_prop(type => 'group')   || 'none';
 | 
			
		||||
    my $packages = $dbs{$yumdb}->get_all_by_prop(type => 'package') || 'none';
 | 
			
		||||
 | 
			
		||||
    #Show no updates if both = none
 | 
			
		||||
@@ -281,283 +249,194 @@ sub is_empty {
 | 
			
		||||
 | 
			
		||||
    #else return here
 | 
			
		||||
    return;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
} ## end sub is_empty
 | 
			
		||||
 | 
			
		||||
sub non_empty {
 | 
			
		||||
 | 
			
		||||
    my ($c, $yumdb, $type) = @_;
 | 
			
		||||
 | 
			
		||||
    $type ||= 'both';
 | 
			
		||||
 | 
			
		||||
    return 0 unless (exists $dbs{$yumdb});
 | 
			
		||||
 | 
			
		||||
    my $groups   = scalar $dbs{$yumdb}->get_all_by_prop(type => 'group');
 | 
			
		||||
    my $groups = scalar $dbs{$yumdb}->get_all_by_prop(type => 'group');
 | 
			
		||||
    return $groups if ($type eq 'group');
 | 
			
		||||
 | 
			
		||||
    my $packages = scalar $dbs{$yumdb}->get_all_by_prop(type => 'package');
 | 
			
		||||
    if ($type eq 'package')
 | 
			
		||||
    {
 | 
			
		||||
	return $c->package_functions_enabled ? $packages : 0;
 | 
			
		||||
 | 
			
		||||
    if ($type eq 'package') {
 | 
			
		||||
        return $c->package_functions_enabled ? $packages : 0;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return ($c->package_functions_enabled or $yumdb eq 'updates') ?
 | 
			
		||||
		($groups || $packages) : $groups;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
    return ($c->package_functions_enabled or $yumdb eq 'updates') ? ($groups || $packages) : $groups;
 | 
			
		||||
} ## end sub non_empty
 | 
			
		||||
 | 
			
		||||
sub package_functions_enabled {
 | 
			
		||||
 | 
			
		||||
    my ($c) = @_;
 | 
			
		||||
 | 
			
		||||
    return ($cdb->get_prop("dnf", "PackageFunctions") eq "enabled");
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
sub get_status {
 | 
			
		||||
 | 
			
		||||
    my ($c, $prop, $localise) = @_;
 | 
			
		||||
 | 
			
		||||
    my $status = $cdb->get_prop("dnf", $prop) || 'disabled';
 | 
			
		||||
 | 
			
		||||
    return $status unless $localise;
 | 
			
		||||
 | 
			
		||||
    return $c->l($status eq 'enabled' ? 'ENABLED' : 'DISABLED');
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
} ## end sub get_status
 | 
			
		||||
 | 
			
		||||
sub get_options {
 | 
			
		||||
 | 
			
		||||
    my ($c, $yumdb, $type) = @_;
 | 
			
		||||
 | 
			
		||||
    my %options;
 | 
			
		||||
 | 
			
		||||
    for ($dbs{$yumdb}->get_all_by_prop(type => $type))
 | 
			
		||||
    {
 | 
			
		||||
        $options{$_->key} = $_->key . " " . $_->prop("Version") . " - " .
 | 
			
		||||
            $_->prop("Repo");
 | 
			
		||||
    for ($dbs{$yumdb}->get_all_by_prop(type => $type)) {
 | 
			
		||||
        $options{ $_->key } = $_->key . " " . $_->prop("Version") . " - " . $_->prop("Repo");
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return \%options;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
} ## end sub get_options
 | 
			
		||||
 | 
			
		||||
sub get_options2 {
 | 
			
		||||
 | 
			
		||||
    my ($c, $yumdb, $type) = @_;
 | 
			
		||||
 | 
			
		||||
    my @options;
 | 
			
		||||
 | 
			
		||||
    for ($dbs{$yumdb}->get_all_by_prop(type => $type))
 | 
			
		||||
    {
 | 
			
		||||
        push @options, [ $_->key . " " . $_->prop("Version") . " - " .
 | 
			
		||||
            $_->prop("Repo") => $_->key ];
 | 
			
		||||
    for ($dbs{$yumdb}->get_all_by_prop(type => $type)) {
 | 
			
		||||
        push @options, [ $_->key . " " . $_->prop("Version") . " - " . $_->prop("Repo") => $_->key ];
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return \@options;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
} ## end sub get_options2
 | 
			
		||||
 | 
			
		||||
sub get_names {
 | 
			
		||||
 | 
			
		||||
    return [ keys %{get_options(@_)} ];
 | 
			
		||||
    return [ keys %{ get_options(@_) } ];
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
sub get_names2 {
 | 
			
		||||
 | 
			
		||||
    my ($c, $yumdb, $type) = @_;
 | 
			
		||||
    my @selected;
 | 
			
		||||
 | 
			
		||||
    for ($dbs{$yumdb}->get_all_by_prop(type => $type)) {
 | 
			
		||||
        push @selected, $_->key;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return \@selected;
 | 
			
		||||
#    return [ values @{get_options2(@_)} ];
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
    #    return [ values @{get_options2(@_)} ];
 | 
			
		||||
} ## end sub get_names2
 | 
			
		||||
 | 
			
		||||
sub get_repository_options2 {
 | 
			
		||||
 | 
			
		||||
    my $c = shift;
 | 
			
		||||
 | 
			
		||||
    my @options;
 | 
			
		||||
 | 
			
		||||
    foreach my $repos (
 | 
			
		||||
	$dbs{repositories}->get_all_by_prop(type => "repository") )
 | 
			
		||||
    {
 | 
			
		||||
	next unless ($repos->prop('Visible') eq 'yes'
 | 
			
		||||
		or $repos->prop('status') eq 'enabled');
 | 
			
		||||
 | 
			
		||||
    foreach my $repos ($dbs{repositories}->get_all_by_prop(type => "repository")) {
 | 
			
		||||
        next unless ($repos->prop('Visible') eq 'yes'
 | 
			
		||||
            or $repos->prop('status') eq 'enabled');
 | 
			
		||||
        push @options, [ $repos->prop('Name') => $repos->key ];
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    } ## end foreach my $repos ($dbs{repositories...})
 | 
			
		||||
    my @opts = sort { $a->[0] cmp $b->[0] } @options;
 | 
			
		||||
 | 
			
		||||
    return \@opts;
 | 
			
		||||
}
 | 
			
		||||
} ## end sub get_repository_options2
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
sub get_repository_current_options
 | 
			
		||||
{
 | 
			
		||||
sub get_repository_current_options {
 | 
			
		||||
    my $c = shift;
 | 
			
		||||
 | 
			
		||||
    my @selected;
 | 
			
		||||
 | 
			
		||||
    foreach my $repos ( 
 | 
			
		||||
	$dbs{repositories}->get_all_by_prop( type => "repository" ) )
 | 
			
		||||
    {
 | 
			
		||||
	next unless ($repos->prop('Visible') eq 'yes'
 | 
			
		||||
		or $repos->prop('status') eq 'enabled');
 | 
			
		||||
 | 
			
		||||
    foreach my $repos ($dbs{repositories}->get_all_by_prop(type => "repository")) {
 | 
			
		||||
        next unless ($repos->prop('Visible') eq 'yes'
 | 
			
		||||
            or $repos->prop('status') eq 'enabled');
 | 
			
		||||
        push @selected, $repos->key if ($repos->prop('status') eq 'enabled');
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    } ## end foreach my $repos ($dbs{repositories...})
 | 
			
		||||
    return \@selected;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
} ## end sub get_repository_current_options
 | 
			
		||||
 | 
			
		||||
sub get_avail2 {
 | 
			
		||||
 | 
			
		||||
    my ($c, $yumdb, $type) = @_;
 | 
			
		||||
 | 
			
		||||
    return $c->get_options2("available", "package");
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
sub get_check_freq_opt {
 | 
			
		||||
 | 
			
		||||
    my ($c) = @_;
 | 
			
		||||
 | 
			
		||||
    return [[ $c->l('DISABLED') => 'disabled'],
 | 
			
		||||
	    [  $c->l('yum_1DAILY') => 'daily'],
 | 
			
		||||
	    [  $c->l('yum_2WEEKLY') => 'weekly'],
 | 
			
		||||
	    [  $c->l('yum_3MONTHLY') => 'monthly']];
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
    return [
 | 
			
		||||
        [ $c->l('DISABLED')     => 'disabled' ],
 | 
			
		||||
        [ $c->l('yum_1DAILY')   => 'daily' ],
 | 
			
		||||
        [ $c->l('yum_2WEEKLY')  => 'weekly' ],
 | 
			
		||||
        [ $c->l('yum_3MONTHLY') => 'monthly' ]
 | 
			
		||||
    ];
 | 
			
		||||
} ## end sub get_check_freq_opt
 | 
			
		||||
 | 
			
		||||
sub print_skip_header {
 | 
			
		||||
 | 
			
		||||
    my ($c) = shift;
 | 
			
		||||
 | 
			
		||||
    return "<INPUT TYPE=\"hidden\" NAME=\"skip_header\" VALUE=\"1\">\n";
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
sub change_settings {
 | 
			
		||||
 | 
			
		||||
    my ($c) = @_;
 | 
			
		||||
 | 
			
		||||
    for my $param ( qw(
 | 
			
		||||
			PackageFunctions
 | 
			
		||||
            	) )
 | 
			
		||||
    for my $param (
 | 
			
		||||
        qw(
 | 
			
		||||
        PackageFunctions
 | 
			
		||||
        )
 | 
			
		||||
        )
 | 
			
		||||
    {
 | 
			
		||||
	$cdb->set_prop("dnf", $param, $c->param("yum_$param"));
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
        $cdb->set_prop("dnf", $param, $c->param("yum_$param"));
 | 
			
		||||
    } ## end for my $param (qw( PackageFunctions...))
 | 
			
		||||
    my $check4updates = $c->param("yum_check4updates");
 | 
			
		||||
    my $status = 'disabled';
 | 
			
		||||
 | 
			
		||||
    my $status        = 'disabled';
 | 
			
		||||
    if ($check4updates ne 'disabled') { $status = 'enabled'; }
 | 
			
		||||
 | 
			
		||||
    $cdb->set_prop("dnf", 'check4updates', $check4updates);
 | 
			
		||||
 | 
			
		||||
    my $deltarpm = $c->param("yum_DeltaRpmProcess");
 | 
			
		||||
    $cdb->set_prop("dnf", 'DeltaRpmProcess', $deltarpm);
 | 
			
		||||
 | 
			
		||||
    my $downloadonly = $c->param("yum_DownloadOnly");
 | 
			
		||||
    if ($downloadonly ne 'disabled') { $status = 'enabled'; }
 | 
			
		||||
 | 
			
		||||
    $cdb->set_prop("dnf", 'DownloadOnly', $downloadonly);
 | 
			
		||||
 | 
			
		||||
    my $AutoInstallUpdates = $c->param("yum_AutoInstallUpdates");
 | 
			
		||||
    if ($AutoInstallUpdates ne 'disabled') { $status = 'enabled'; }
 | 
			
		||||
 | 
			
		||||
    $cdb->set_prop("dnf", 'AutoInstallUpdates', $AutoInstallUpdates);
 | 
			
		||||
    $cdb->set_prop("dnf", 'status', $status);
 | 
			
		||||
 | 
			
		||||
    my %selected = map {$_ => 1} @{$c->every_param('SelectedRepositories')};
 | 
			
		||||
 | 
			
		||||
    foreach my $repos (
 | 
			
		||||
	$dbs{repositories}->get_all_by_prop(type => "repository") )
 | 
			
		||||
    {
 | 
			
		||||
	$repos->set_prop("status", 
 | 
			
		||||
		exists $selected{$repos->key} ? 'enabled' : 'disabled');
 | 
			
		||||
    $cdb->set_prop("dnf", 'status',             $status);
 | 
			
		||||
    my %selected = map { $_ => 1 } @{ $c->every_param('SelectedRepositories') };
 | 
			
		||||
 | 
			
		||||
    foreach my $repos ($dbs{repositories}->get_all_by_prop(type => "repository")) {
 | 
			
		||||
        $repos->set_prop("status", exists $selected{ $repos->key } ? 'enabled' : 'disabled');
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    $dbs{repositories}->reload;
 | 
			
		||||
 | 
			
		||||
    unless ( system( "/sbin/e-smith/signal-event", "dnf-modify" ) == 0 )
 | 
			
		||||
    {
 | 
			
		||||
	return $c->l('yum_ERROR_UPDATING_CONFIGURATION');
 | 
			
		||||
    unless (system("/sbin/e-smith/signal-event", "dnf-modify") == 0) {
 | 
			
		||||
        return $c->l('yum_ERROR_UPDATING_CONFIGURATION');
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return 'OK';
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
} ## end sub change_settings
 | 
			
		||||
 | 
			
		||||
sub do_yum {
 | 
			
		||||
 | 
			
		||||
    my ($c, $function) = @_;
 | 
			
		||||
 | 
			
		||||
    for ( qw(SelectedGroups SelectedPackages) )
 | 
			
		||||
    {
 | 
			
		||||
	$cdb->set_prop("dnf", $_, join(',', (@{$c->every_param($_)} )));
 | 
			
		||||
    for (qw(SelectedGroups SelectedPackages)) {
 | 
			
		||||
        $cdb->set_prop("dnf", $_, join(',', (@{ $c->every_param($_) })));
 | 
			
		||||
    }
 | 
			
		||||
    esmith::util::backgroundCommand(0, "/sbin/e-smith/signal-event", "dnf-$function");
 | 
			
		||||
 | 
			
		||||
    esmith::util::backgroundCommand(0,
 | 
			
		||||
        "/sbin/e-smith/signal-event", "dnf-$function");
 | 
			
		||||
 | 
			
		||||
    for ( qw(available installed updates) ) {
 | 
			
		||||
	$dbs{$_}->reload;
 | 
			
		||||
    for (qw(available installed updates)) {
 | 
			
		||||
        $dbs{$_}->reload;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return 'OK';
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
} ## end sub do_yum
 | 
			
		||||
 | 
			
		||||
sub get_yum_status_page {
 | 
			
		||||
 | 
			
		||||
    my ($c) = @_;
 | 
			
		||||
    my $yum_status;
 | 
			
		||||
 | 
			
		||||
    open(YUM_STATUS, "</var/run/yum.status");
 | 
			
		||||
    $yum_status = <YUM_STATUS>;
 | 
			
		||||
    close(YUM_STATUS);
 | 
			
		||||
 | 
			
		||||
    return $yum_status;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
} ## end sub get_yum_status_page
 | 
			
		||||
 | 
			
		||||
sub format_yum_log {
 | 
			
		||||
 | 
			
		||||
    my $c = shift;
 | 
			
		||||
 | 
			
		||||
    $cdb->reload;
 | 
			
		||||
 | 
			
		||||
    my $filepage = $cdb->get_prop('dnf', 'LogFile');
 | 
			
		||||
    return '' unless $filepage and ( -e "$filepage" );
 | 
			
		||||
 | 
			
		||||
    return '' unless $filepage and (-e "$filepage");
 | 
			
		||||
    my $out = sprintf "<PRE>";
 | 
			
		||||
    open (FILE, "$filepage");
 | 
			
		||||
    open(FILE, "$filepage");
 | 
			
		||||
 | 
			
		||||
    while (<FILE>) {
 | 
			
		||||
	$out .= sprintf("%s", $_);
 | 
			
		||||
        $out .= sprintf("%s", $_);
 | 
			
		||||
    }
 | 
			
		||||
    close FILE;
 | 
			
		||||
    $out .= sprintf "</PRE>";
 | 
			
		||||
 | 
			
		||||
    undef $filepage;
 | 
			
		||||
    return $out;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
} ## end sub format_yum_log
 | 
			
		||||
 | 
			
		||||
sub post_upgrade_reboot {
 | 
			
		||||
 | 
			
		||||
    my $c = shift;
 | 
			
		||||
 | 
			
		||||
    $cdb->get_prop_and_delete('dnf', 'LogFile');
 | 
			
		||||
    $cdb->reload;
 | 
			
		||||
 | 
			
		||||
@@ -565,17 +444,13 @@ sub post_upgrade_reboot {
 | 
			
		||||
        exec "/sbin/e-smith/signal-event post-upgrade; /sbin/e-smith/signal-event reboot";
 | 
			
		||||
        die "Exec failed";
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return 'OK'
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
    return 'OK';
 | 
			
		||||
} ## end sub post_upgrade_reboot
 | 
			
		||||
 | 
			
		||||
sub show_yum_log {
 | 
			
		||||
    my $c = shift;
 | 
			
		||||
    my $out = $c->format_yum_log();
 | 
			
		||||
    my $c       = shift;
 | 
			
		||||
    my $out     = $c->format_yum_log();
 | 
			
		||||
    my $yum_log = $cdb->get_prop_and_delete('dnf', 'LogFile');
 | 
			
		||||
    return $out;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
} ## end sub show_yum_log
 | 
			
		||||
1;
 | 
			
		||||
 
 | 
			
		||||
@@ -2,7 +2,7 @@
 | 
			
		||||
'clm_LABEL_FILESYSTEM_SCAN_PERIOD' => 'Scan filesystem',
 | 
			
		||||
'clm_DESC_FILESYSTEM_SCAN_PERIOD' => '<h2>General Settings</h2>
 | 
			
		||||
If this option is enabled then the filesystem will be 
 | 
			
		||||
scanned for viruses.A report of any found viruses will be
 | 
			
		||||
scanned for viruses. A report of any found viruses will be
 | 
			
		||||
emailed to the administrator.',
 | 
			
		||||
'clm_LABEL_QUARANTINE' => 'Quarantine infected files',
 | 
			
		||||
'clm_LABEL_CLAM_VERSIONS' => 'ClamAV and db versions',
 | 
			
		||||
 
 | 
			
		||||
@@ -14,26 +14,26 @@ web site for that domain.',
 | 
			
		||||
i-bay as the content.',
 | 
			
		||||
'dom_DOMAIN_NAME_VALIDATION_ERROR' => 'Error: unexpected or missing characters in domain name
 | 
			
		||||
[_1].The domain name should contain one or more
 | 
			
		||||
letters, numbers, periods and minus signs.Did not create new domain.',
 | 
			
		||||
letters, numbers, periods and minus signs. Did not create new domain.',
 | 
			
		||||
'dom_DOMAIN_DESCRIPTION_VALIDATION_ERROR' => 'Error: unexpected or missing characters in domain description
 | 
			
		||||
[_1]. Did not create new domain.',
 | 
			
		||||
'dom_DOMAIN_IN_USE_ERROR' => 'Error: domain [_1] is already in use.Did not create
 | 
			
		||||
'dom_DOMAIN_IN_USE_ERROR' => 'Error: domain [_1] is already in use. Did not create
 | 
			
		||||
new domain.',
 | 
			
		||||
'dom_SYSTEM_DOMAIN_ERROR' => 'Error: domain [_1] is your system domain name.You
 | 
			
		||||
cannot have a domain with the same name.Did not create new domain.',
 | 
			
		||||
'dom_SYSTEM_DOMAIN_ERROR' => 'Error: domain [_1] is your system domain name. You
 | 
			
		||||
cannot have a domain with the same name. Did not create new domain.',
 | 
			
		||||
'dom_SUCCESSFULLY_CREATED' => 'Successfully created domain [_1].Your web
 | 
			
		||||
server is now being restarted.The links on this page will be
 | 
			
		||||
server is now being restarted. The links on this page will be
 | 
			
		||||
inactive until the web server restart is complete.',
 | 
			
		||||
'dom_MODIFY_TITLE' => 'Modify domain',
 | 
			
		||||
'dom_NONEXISTENT_DOMAIN_ERROR' => 'Error: [_1] is not an existing domain.',
 | 
			
		||||
'dom_SUCCESSFULLY_MODIFIED' => 'Successfully modified domain [_1].Your web
 | 
			
		||||
server is now being restarted.The links on this page will be inactive until the web server restart is complete.',
 | 
			
		||||
server is now being restarted. The links on this page will be inactive until the web server restart is complete.',
 | 
			
		||||
'dom_REMOVE_TITLE' => 'Remove domain',
 | 
			
		||||
'dom_REMOVE_DESCRIPTION' => 'You are about to remove the domain "[_1]" ([_2]).',
 | 
			
		||||
'dom_ABOUT_TO_REMOVE' => 'Are you sure you wish to remove this domain ?',
 | 
			
		||||
'dom_ERROR_WHILE_REMOVING_DOMAIN' => 'Error: internal failure while removing domain [_1].',
 | 
			
		||||
'dom_SUCCESSFULLY_DELETED' => 'Successfully deleted domain [_1]. Your web server
 | 
			
		||||
is now being restarted.The links on this page will be inactive
 | 
			
		||||
is now being restarted. The links on this page will be inactive
 | 
			
		||||
until the web server restart is complete.',
 | 
			
		||||
'dom_DESC_CORPORATE_DNS_CURRENT' => 'Corporate DNS Settings',
 | 
			
		||||
'dom_DOMAINS_PAGE_CORPORATE_DNS' => 'Modify corporate DNS settings',
 | 
			
		||||
 
 | 
			
		||||
@@ -128,7 +128,7 @@
 | 
			
		||||
'FM_IP_NUMBER3' => '[_1] is more than 255',
 | 
			
		||||
'FM_USERNAME' => 'This field must look like a valid username (3 to 8 letters and numbers)',
 | 
			
		||||
'FM_PASSWORD1' => 'You must provide a password.',
 | 
			
		||||
'FM_PASSWORD2' => 'The password you provided was not a good password.A good password must contain all of the following: upper case letter, lower case letter, number, non-alphanumeric character, be at least 7 characters long.',
 | 
			
		||||
'FM_PASSWORD2' => 'The password you provided was not a good password. A good password must contain all of the following: upper case letter, lower case letter, number, non-alphanumeric character, be at least 7 characters long.',
 | 
			
		||||
'FM_MAC_ADDRESS1' => 'You must provide a MAC address.',
 | 
			
		||||
'FM_MAC_ADDRESS2' => 'The MAC address you provided was not valid.',
 | 
			
		||||
'FM_ERR_UNEXPECTED_DESC' => 'Error: unexpected or missing characters in description',
 | 
			
		||||
@@ -151,4 +151,5 @@ SMALL => 'Small',
 | 
			
		||||
MEDIUM => 'Medium',
 | 
			
		||||
LARGE => 'Large',
 | 
			
		||||
FIELD_INVALID_CHARS => 'A field you entered contains invalid characters.',
 | 
			
		||||
 | 
			
		||||
'REPORT_GENERATED' => "Report generated",
 | 
			
		||||
'END_OF_REPORT' => 'End of Report',
 | 
			
		||||
 
 | 
			
		||||
@@ -4,7 +4,7 @@
 | 
			
		||||
'grp_ACCOUNT_CONFLICT' => 'Error: the group "[_1]" can\'t be created because there is
 | 
			
		||||
already a [_2] account of that name.',
 | 
			
		||||
'grp_INVALID_GROUP_DESCRIPTION' => 'Error: unexpected or missing characters in group description',
 | 
			
		||||
'grp_NO_MEMBERS' => 'Error: no members in group.Did not create new group.',
 | 
			
		||||
'grp_NO_MEMBERS' => 'Error: no members in group. Did not create new group.',
 | 
			
		||||
'grp_CREATED_GROUP' => 'Successfully created user group',
 | 
			
		||||
'grp_DELETED_GROUP' => 'Successfully removed user group',
 | 
			
		||||
'grp_MODIFIED_GROUP' => 'Successfully modifed user group',
 | 
			
		||||
 
 | 
			
		||||
@@ -34,17 +34,17 @@ the local network. Please enter a valid IP address in the
 | 
			
		||||
format "aaa.bbb.ccc.ddd".',
 | 
			
		||||
'hos_ETHERNET_ADDRESS_DESCRIPTION' => 'The ethernet address is optional and causes the DHCP server to
 | 
			
		||||
statically bind the local IP address to the computer with this
 | 
			
		||||
ethernet address.If specified, it must be of the form
 | 
			
		||||
ethernet address. If specified, it must be of the form
 | 
			
		||||
"AA:BB:CC:DD:EE:FF" and must contain only the numbers 0-9 and
 | 
			
		||||
the letters A-F.',
 | 
			
		||||
'hos_CREATE_LOCAL_HOST_TITLE' => 'Create a new hostname referring to a local host.',
 | 
			
		||||
'hos_DIDNT_ENTER_LOCAL_IP' => 'Error: You did not specify a Local IP address.IP
 | 
			
		||||
'hos_DIDNT_ENTER_LOCAL_IP' => 'Error: You did not specify a Local IP address. IP
 | 
			
		||||
addresses must contain only numbers and periods and
 | 
			
		||||
be in the form "aaa.bbb.ccc.ddd".Did not create hostname.',
 | 
			
		||||
'hos_IP_VALIDATION_ERROR' => 'Error: IP Address [_1] is
 | 
			
		||||
invalid. IP Addresses must contain only numbers and periodsand be in the form "aaa.bbb.ccc.ddd". Did not create hostname.',
 | 
			
		||||
'hos_MAC_ADDRESS_VALIDATION_ERROR' => 'Error: Ethernet address [_1]
 | 
			
		||||
is invalid.Ethernet addresses must be in the
 | 
			
		||||
is invalid. Ethernet addresses must be in the
 | 
			
		||||
form "AA:BB:CC:DD:EE:FF" and only contain the
 | 
			
		||||
numbers 0-9 and the letters A-F. Did not create
 | 
			
		||||
hostname.',
 | 
			
		||||
 
 | 
			
		||||
@@ -14,7 +14,7 @@ For example, you may wish to create a pseudonym
 | 
			
		||||
"webmaster" for your "webdevelopers" group or a
 | 
			
		||||
pseudonym "joe" for the user "joseph".</p>
 | 
			
		||||
<p>The server automatically creates pseudonyms of the form
 | 
			
		||||
firstname.lastname and firstname_lastname for every user
 | 
			
		||||
firstname. lastname and firstname_lastname for every user
 | 
			
		||||
on the system and a pseudonym "everyone" which contains
 | 
			
		||||
all users on the system.</p>
 | 
			
		||||
<p>Pseudonyms also allow you to create e-mail aliases for valid
 | 
			
		||||
 
 | 
			
		||||
@@ -8,6 +8,15 @@ reports are available.</P>
 | 
			
		||||
these reports</P>',
 | 
			
		||||
'qma_REPORT_TYPE' => 'Choose a report type',
 | 
			
		||||
'qma_GENERATE_REPORT' => 'Generate report',
 | 
			
		||||
'qma_INVALID_REPORT_TYPE' => 'Invalid report type: ',
 | 
			
		||||
'qma_REPORT_GENERATED' => 'Report generated: ',
 | 
			
		||||
'qma_END_OF_REPORT' => 'End of Report',
 | 
			
		||||
'Mail log file analysis' => 'Mail log file analysis',
 | 
			
		||||
 | 
			
		||||
'qma_Daily_Summary_Report_yesterday' => 'Summary report for yesterday',
 | 
			
		||||
'qma_Daily_Summary_Report_today' => 'Summary report for today up to now',
 | 
			
		||||
'qma_Daily_Summary_Report_all' => 'Summary report for all time up to now',
 | 
			
		||||
 | 
			
		||||
'qma_LIST_OUTGOING' => 'List outgoing messages and recipients',
 | 
			
		||||
'qma_SUMMARIZE_QUEUE' => 'Summarize status of mail queue',
 | 
			
		||||
'qma_SUCCESSFUL_DELIVERY_DELAY' => 'Successful delivery delay distribution',
 | 
			
		||||
@@ -20,9 +29,4 @@ these reports</P>',
 | 
			
		||||
'qma_SENDER_STATS' => 'Sender statistics',
 | 
			
		||||
'qma_SENDMAIL_STYLE' => 'Sendmail style log',
 | 
			
		||||
'qma_REASONS_SUCCESS' => 'Reasons for success',
 | 
			
		||||
'qma_SENDER_UIDS' => 'Sender uids',
 | 
			
		||||
'qma_INVALID_REPORT_TYPE' => 'Invalid report type: ',
 | 
			
		||||
'qma_REPORT_GENERATED' => 'Report generated: ',
 | 
			
		||||
'qma_END_OF_REPORT' => 'End of Report',
 | 
			
		||||
'Mail log file analysis' => 'Mail log file analysis',
 | 
			
		||||
 | 
			
		||||
'qma_SENDER_UIDS' => 'Sender uids',
 | 
			
		||||
@@ -26,7 +26,9 @@ experienced administrators
 | 
			
		||||
for remote problem diagnosis and resolution. 
 | 
			
		||||
We recommend leaving this
 | 
			
		||||
parameter set to "No Access"
 | 
			
		||||
unless you have a specific reason to do otherwise.',
 | 
			
		||||
unless you have a specific reason to do otherwise.
 | 
			
		||||
Note that an "Autoblock" feature is enabled by default when public access is enabled; to disable or tune this feature, refer to the manual at https://wiki.koozali.org/AutoBlock
 | 
			
		||||
',
 | 
			
		||||
'rma_TITLE_FTP_ACCESS' => 'FTP Settings',
 | 
			
		||||
'rma_DESC_FTP_ACCESS' => 'You can also control <b>FTP</b> access to your server. We
 | 
			
		||||
recommend leaving this parameter set to \'no access\' unless you
 | 
			
		||||
@@ -75,11 +77,11 @@ connected to a server serial port.',
 | 
			
		||||
'rma_LABEL_PPTP_ACCESS' => 'PPTP default user access',
 | 
			
		||||
'rma_TITLE_TELNET_ACCESS' => 'Telnet Settings',
 | 
			
		||||
'rma_DESC_TELNET_ACCESS' => 'WARNING:Telnet is currently enabled, but this feature is
 | 
			
		||||
no longer supported.Telnet is inherently insecure and should only
 | 
			
		||||
no longer supported. Telnet is inherently insecure and should only
 | 
			
		||||
be used in circumstances where no practical alternative exists. You
 | 
			
		||||
should change option to [_1] and use
 | 
			
		||||
secure shell if remote access is
 | 
			
		||||
required.Once disabled, telnet will no longer appear on this 
 | 
			
		||||
required. Once disabled, telnet will no longer appear on this 
 | 
			
		||||
screen. ',
 | 
			
		||||
'rma_TITLE_IPSECRW' => 'IPSEC Client (Roadwarrior) Settings',
 | 
			
		||||
'rma_DESC_IPSECRW' => 'You can allow IPSEC client access to your server, authenticated by
 | 
			
		||||
@@ -90,4 +92,4 @@ to the number 0 unless you require IPSEC client access.',
 | 
			
		||||
can do so here.<br>Any old certificates will no longer
 | 
			
		||||
authenticate against the server, so <b><i>all IPSEC clients will
 | 
			
		||||
need to import a new certificate!</i></b>.',
 | 
			
		||||
'rma_LABEL_IPSECRW_RESET' => 'Reset digital certificates',
 | 
			
		||||
'rma_LABEL_IPSECRW_RESET' => 'Reset digital certificates',
 | 
			
		||||
@@ -2,7 +2,7 @@
 | 
			
		||||
'rvw_FORM_TITLE' => 'Review configuration',
 | 
			
		||||
'rvw_DESCRIPTION' => 'This report summarizes the networking, server, and domain
 | 
			
		||||
parameters on this server relevant to configuring
 | 
			
		||||
the client computers on your network.You may wish to print this
 | 
			
		||||
the client computers on your network. You may wish to print this
 | 
			
		||||
page and use it as a reference.',
 | 
			
		||||
'rvw_NETWORKING_PARAMS' => 'Networking Parameters',
 | 
			
		||||
'rvw_SERVER_MODE' => 'Server Mode',
 | 
			
		||||
 
 | 
			
		||||
@@ -4,7 +4,7 @@
 | 
			
		||||
by the services running on your server.',
 | 
			
		||||
'log_LOG_FILE_SELECT_DESC' => 'Choose a log file to view',
 | 
			
		||||
'log_FILTER_PATTERN_DESC' => 'You may optionally specify a filter pattern to display only the
 | 
			
		||||
lines from the log file which match this pattern.If you leave
 | 
			
		||||
lines from the log file which match this pattern. If you leave
 | 
			
		||||
this field blank, all available lines of the log file will be
 | 
			
		||||
displayed. Note that this option is not used if you download the
 | 
			
		||||
logfile.',
 | 
			
		||||
 
 | 
			
		||||
@@ -43,8 +43,9 @@ sub init_data {
 | 
			
		||||
sub reconf_needed {
 | 
			
		||||
 | 
			
		||||
    my $cdb = esmith::ConfigDB->open_ro() or die("can't open Config DB");
 | 
			
		||||
    my $unsafe = ($cdb->get('bootstrap-console') and $cdb->get('bootstrap-console')->prop('Run') eq 'yes') ||
 | 
			
		||||
         ($cdb->get('UnsavedChanges') and $cdb->get('UnsavedChanges')->value eq 'yes') || '0';
 | 
			
		||||
    #my $unsafe = ($cdb->get('bootstrap-console') and $cdb->get('bootstrap-console')->prop('Run') eq 'yes') ||
 | 
			
		||||
    #     ($cdb->get('UnsavedChanges') and $cdb->get('UnsavedChanges')->value eq 'yes') || '0';
 | 
			
		||||
	my $unsafe = ($cdb->get('UnsavedChanges') and $cdb->get('UnsavedChanges')->value eq 'yes') || '0';   
 | 
			
		||||
    return $unsafe;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@@ -104,5 +105,4 @@ sub check_adminalias {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
1;
 | 
			
		||||
 | 
			
		||||
1;
 | 
			
		||||
@@ -9,7 +9,7 @@ use esmith::util;
 | 
			
		||||
BEGIN
 | 
			
		||||
{
 | 
			
		||||
    $0 =~ /^(.+)$/ms; $0 = $1; # Untaint script name
 | 
			
		||||
    $ENV{'PATH'} = '/bin:/usr/bin:/usr/local/bin';
 | 
			
		||||
    $ENV{'PATH'} = '/usr/sbin:/usr/bin:/usr/local/bin';
 | 
			
		||||
    $ENV{'SHELL'} = '/bin/bash';
 | 
			
		||||
    $ENV{'HOME'} = '/usr/share/smanager';
 | 
			
		||||
    delete $ENV{'ENV'};
 | 
			
		||||
 
 | 
			
		||||
@@ -0,0 +1,38 @@
 | 
			
		||||
Configuration report created {$report_creation_time}
 | 
			
		||||
 | 
			
		||||
==================
 | 
			
		||||
Base configuration
 | 
			
		||||
==================
 | 
			
		||||
SME server version: 	  {$releaseversion}
 | 
			
		||||
SME server mode:    	  {$systemmode}
 | 
			
		||||
SME server previous mode: {$previoussystemmode }
 | 
			
		||||
Running Kernel:     	  {$curkernel}
 | 
			
		||||
===========================
 | 
			
		||||
New RPMs not in base system
 | 
			
		||||
===========================     
 | 
			
		||||
{ foreach $i (@newrpms) {
 | 
			
		||||
            $OUT .= "$i";
 | 
			
		||||
          }    
 | 
			
		||||
} 
 | 
			
		||||
===========================
 | 
			
		||||
Custom and modified templates
 | 
			
		||||
===========================
 | 
			
		||||
{ foreach $i (@templates) {
 | 
			
		||||
            $OUT .= "$i";
 | 
			
		||||
          }
 | 
			
		||||
}
 | 
			
		||||
===========================
 | 
			
		||||
Modified events
 | 
			
		||||
===========================
 | 
			
		||||
{ foreach $i (@events) {
 | 
			
		||||
            $OUT .= "$i";
 | 
			
		||||
          }
 | 
			
		||||
}
 | 
			
		||||
=======================
 | 
			
		||||
Additional repositories
 | 
			
		||||
=======================
 | 
			
		||||
{ foreach $r (@repositories) {
 | 
			
		||||
            $OUT .= "$r";
 | 
			
		||||
          }
 | 
			
		||||
}   		
 | 
			
		||||
DONE!
 | 
			
		||||
							
								
								
									
										1
									
								
								root/usr/share/smanager/themes/default/public/css/flag-icon.min.css
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								root/usr/share/smanager/themes/default/public/css/flag-icon.min.css
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because one or more lines are too long
											
										
									
								
							
							
								
								
									
										43
									
								
								root/usr/share/smanager/themes/default/public/css/module.css
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										43
									
								
								root/usr/share/smanager/themes/default/public/css/module.css
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,43 @@
 | 
			
		||||
/* General styles for the module panel */
 | 
			
		||||
#module {
 | 
			
		||||
    padding: 20px;
 | 
			
		||||
    border: 1px solid #ccc;
 | 
			
		||||
    border-radius: 10px;
 | 
			
		||||
    background-color: #f9f9f9;
 | 
			
		||||
    box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* Debug information styling */
 | 
			
		||||
#module p {
 | 
			
		||||
    font-family: monospace;
 | 
			
		||||
    color: #555;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#module pre {
 | 
			
		||||
    background-color: #eee;
 | 
			
		||||
    padding: 10px;
 | 
			
		||||
    border-radius: 5px;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* Error message styling */
 | 
			
		||||
.sme-error {
 | 
			
		||||
    color: #d9534f;
 | 
			
		||||
    font-weight: bold;
 | 
			
		||||
    margin-bottom: 15px;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* Title styling */
 | 
			
		||||
#module h1 {
 | 
			
		||||
    font-family: Arial, sans-serif;
 | 
			
		||||
    color: #333;
 | 
			
		||||
    text-align: center;
 | 
			
		||||
    margin-bottom: 20px;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* Content styling */
 | 
			
		||||
.module-content {
 | 
			
		||||
    font-family: Georgia, serif;
 | 
			
		||||
    font-size: 13px;
 | 
			
		||||
    line-height: 1.2;
 | 
			
		||||
    color: #555;
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1,505 @@
 | 
			
		||||
 {
 | 
			
		||||
    margin-left: 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
a.alert {
 | 
			
		||||
    color: red;
 | 
			
		||||
    font-family: Verdana, Tahoma, sans-serif;
 | 
			
		||||
    font-size: 11px;
 | 
			
		||||
    background: #e8f3e1;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
a.item {
 | 
			
		||||
    color: #00008b;
 | 
			
		||||
    font-family: Verdana, Tahoma, sans-serif;
 | 
			
		||||
    font-size: 11px;
 | 
			
		||||
    background: #e8f3e1;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
a.item-current:hover,   a.warn-current:hover {
 | 
			
		||||
    border-color: #888;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
a.item-current:link,    a.warn-current:link,
 | 
			
		||||
a.item-current:visited, a.warn-current:visited, 
 | 
			
		||||
a.item-current:active,  a.warn-current:active,
 | 
			
		||||
a.item-current:hover,   a.warn-current:hover {
 | 
			
		||||
    display: block;
 | 
			
		||||
    font-family: Verdana, Tahoma, sans-serif;
 | 
			
		||||
    font-size: 10px;
 | 
			
		||||
    color: black;
 | 
			
		||||
    text-decoration: none;
 | 
			
		||||
    background: #fff;
 | 
			
		||||
    border-color: #888;
 | 
			
		||||
    margin: 0;
 | 
			
		||||
    border-style: solid;
 | 
			
		||||
    border-width: 1px;
 | 
			
		||||
    padding-right: 10px;
 | 
			
		||||
    padding-left: 10px;
 | 
			
		||||
    padding-bottom: 2px;
 | 
			
		||||
    text-align: left;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
a.item:active, a.item-current:active, 
 | 
			
		||||
a.warn:active, a.warn-current:active {
 | 
			
		||||
    display: block;
 | 
			
		||||
    font-family: Verdana, Tahoma, sans-serif;
 | 
			
		||||
    font-size: 10px;
 | 
			
		||||
    color: white;
 | 
			
		||||
    background: black;
 | 
			
		||||
    text-decoration: none;
 | 
			
		||||
    border-color: #000;
 | 
			
		||||
    margin: 0;
 | 
			
		||||
    border-style: solid;
 | 
			
		||||
    border-width: 1px;
 | 
			
		||||
    padding-right: 10px;
 | 
			
		||||
    padding-left: 10px;
 | 
			
		||||
    padding-bottom: 2px;
 | 
			
		||||
    text-align: left;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
a.item:hover, a.item-current:hover,
 | 
			
		||||
a.warn:hover, a.warn-current:hover {
 | 
			
		||||
    display: block;
 | 
			
		||||
    font-family: Verdana, Tahoma, sans-serif;
 | 
			
		||||
    font-size: 10px;
 | 
			
		||||
    color: black;
 | 
			
		||||
    text-decoration: none;
 | 
			
		||||
    background: #ccc;
 | 
			
		||||
    border-color: #888;
 | 
			
		||||
    margin: 0;
 | 
			
		||||
    border-style: solid;
 | 
			
		||||
    border-width: 1px;
 | 
			
		||||
    padding-right: 10px;
 | 
			
		||||
    padding-left: 10px;
 | 
			
		||||
    padding-bottom: 2px;
 | 
			
		||||
    text-align: left;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
a.item:link, a.item-current:link, 
 | 
			
		||||
a.warn:link, a.warn-current:link {
 | 
			
		||||
    display: block;
 | 
			
		||||
    font-family: Verdana, Tahoma, sans-serif;
 | 
			
		||||
    font-size: 10px;
 | 
			
		||||
    color: black;
 | 
			
		||||
    background: #e8f3e1;
 | 
			
		||||
    text-decoration: none;
 | 
			
		||||
    text-align: left;
 | 
			
		||||
    border-color: #e8f3e1;
 | 
			
		||||
    margin: 0;
 | 
			
		||||
    border-style: solid;
 | 
			
		||||
    border-width: 1px;
 | 
			
		||||
    padding: 0 10px 2px;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
a.item:visited, a.item-current:visited, 
 | 
			
		||||
a.warn:visited, a.warn-current:visited {
 | 
			
		||||
    display: block;
 | 
			
		||||
    font-family: Verdana, Tahoma, sans-serif;
 | 
			
		||||
    font-size: 10px;
 | 
			
		||||
    color: black;
 | 
			
		||||
    background: #e8f3e1;
 | 
			
		||||
    text-decoration: none;
 | 
			
		||||
    border-color: #e8f3e1;
 | 
			
		||||
    margin: 0;
 | 
			
		||||
    border-style: solid;
 | 
			
		||||
    border-width: 1px;
 | 
			
		||||
    padding-right: 10px;
 | 
			
		||||
    padding-left: 10px;
 | 
			
		||||
    padding-bottom: 2px;
 | 
			
		||||
    text-align: left;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
a.section-title {
 | 
			
		||||
    display: inline-block;
 | 
			
		||||
    color: #6CA345;
 | 
			
		||||
    padding-left: 5px;
 | 
			
		||||
    padding-right: 5px;
 | 
			
		||||
    line-height: 18px;
 | 
			
		||||
    font-weight: bold;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
a.sl {
 | 
			
		||||
    color: green;
 | 
			
		||||
    font-family: Verdana, Tahoma, sans-serif;
 | 
			
		||||
    font-size: 11px;
 | 
			
		||||
    background: #e8f3e1;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
a.update {
 | 
			
		||||
    color: red;
 | 
			
		||||
    font-family: Verdana, Tahoma, sans-serif;
 | 
			
		||||
    font-size: 11px;
 | 
			
		||||
    background: #98d36e;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
a.warn:link,    a.warn-current:link, 
 | 
			
		||||
a.warn:visited, a.warn-current:visited, 
 | 
			
		||||
a.warn:active,  a.warn-current:active,
 | 
			
		||||
a.warn:hover,   a.warn-current:hover {
 | 
			
		||||
    background-image: url("/server-common/warn.gif");
 | 
			
		||||
    background-repeat: no-repeat;
 | 
			
		||||
    background-position: 10px;
 | 
			
		||||
    padding-left: 25px;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
a:active {
 | 
			
		||||
    color: #606060;
 | 
			
		||||
    text-decoration: none;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
a:hover {
 | 
			
		||||
    color: #F00;
 | 
			
		||||
    text-decoration: none;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
a:link {
 | 
			
		||||
    color: #006921;
 | 
			
		||||
    text-decoration: none;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
a:visited {
 | 
			
		||||
    color: #063;
 | 
			
		||||
    text-decoration: none;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
body {
 | 
			
		||||
    background-color: #FFF;
 | 
			
		||||
    color: #000;
 | 
			
		||||
    font-family: Verdana, Tahoma, sans-serif;
 | 
			
		||||
    font-size: 11px;
 | 
			
		||||
    border-width: 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
body, body.main {
 | 
			
		||||
    margin: 5px 20px 5px 5px;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
body, body.menu {
 | 
			
		||||
    margin: 0 0 0 2px;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
body.header {
 | 
			
		||||
    font-family: Verdana, Tahoma, sans-serif;
 | 
			
		||||
    font-size: 11px;
 | 
			
		||||
    background-color: #bee6a2;
 | 
			
		||||
    margin: 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
body.main {
 | 
			
		||||
    font-family: Verdana, Tahoma, sans-serif;
 | 
			
		||||
    font-size: 11px;
 | 
			
		||||
    background-color: #fff;
 | 
			
		||||
    color: #000;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
body.menu {
 | 
			
		||||
    font-family: Verdana, Tahoma, sans-serif;
 | 
			
		||||
    font-size: 11px;
 | 
			
		||||
    background-color: #e8f3e1;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
div.error, div.sme-error, span.error, span.sme-error {
 | 
			
		||||
    color: red;
 | 
			
		||||
    background-color: #f9f9f9;
 | 
			
		||||
    border-width: 1px;
 | 
			
		||||
    border-style: solid;
 | 
			
		||||
    border-color: red;
 | 
			
		||||
    padding: 10px;
 | 
			
		||||
    border-radius: 10px;
 | 
			
		||||
    
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
form {
 | 
			
		||||
    margin-top: 2px;
 | 
			
		||||
    margin-bottom: 2px;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
h1, .h1 {
 | 
			
		||||
    font-family: Verdana, Tahoma, sans-serif;
 | 
			
		||||
    color: #333;
 | 
			
		||||
    font-size: 18px;
 | 
			
		||||
    margin-bottom: 4px;
 | 
			
		||||
    margin-top: 12px;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
h2, .h2 {
 | 
			
		||||
    font-family: Verdana, Tahoma, sans-serif;
 | 
			
		||||
    color: #333;
 | 
			
		||||
    font-size: 14px;
 | 
			
		||||
    margin-bottom: 3px;
 | 
			
		||||
    margin-top: 12px;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
h3, .h3 {
 | 
			
		||||
    font-family: Verdana, Tahoma, sans-serif;
 | 
			
		||||
    color: #333;
 | 
			
		||||
    font-size: 12px;
 | 
			
		||||
    margin-bottom: 2px;
 | 
			
		||||
    margin-top: 12px;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
h4, .h4 {
 | 
			
		||||
    font-family: Verdana, Tahoma, sans-serif;
 | 
			
		||||
    font-style: italic;
 | 
			
		||||
    color: #333;
 | 
			
		||||
    font-size: 12px;
 | 
			
		||||
    margin-bottom: 2px;
 | 
			
		||||
    margin-top: 10px;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
hr.sectionbar {
 | 
			
		||||
    color: #8ebe43;
 | 
			
		||||
    background-color: #8ebe43;
 | 
			
		||||
    height: 1px;
 | 
			
		||||
    width: 80%;
 | 
			
		||||
    border: 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
hr.sme-copyrightbar {
 | 
			
		||||
    color: #8ebe43;
 | 
			
		||||
    background-color: #8ebe43;
 | 
			
		||||
    height: 1px;
 | 
			
		||||
    width: 100%;
 | 
			
		||||
    border: 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
input.action {
 | 
			
		||||
    margin-left: 0;
 | 
			
		||||
    background-color: #bee6a2;
 | 
			
		||||
    color: darkgreen;
 | 
			
		||||
    border-radius: 8px;
 | 
			
		||||
    border: 2px solid #4CAF50;
 | 
			
		||||
    display: flex;
 | 
			
		||||
    justify-content: center;
 | 
			
		||||
    align-items: center;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
input.action2 {
 | 
			
		||||
    margin-left: 0;
 | 
			
		||||
    color: black;
 | 
			
		||||
    background-color: #d4d0c8;
 | 
			
		||||
    display: flex;
 | 
			
		||||
    justify-content: center;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
input.action:active {
 | 
			
		||||
    background-color: #3e8e41;
 | 
			
		||||
    transform: translate(-2px,2px);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
input.action:hover {
 | 
			
		||||
    background-color: #3e8e41;
 | 
			
		||||
    color: white;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
input.field-with-error {
 | 
			
		||||
    background-color: #fd9e7e;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
label.field-with-error {
 | 
			
		||||
    color: #dd7e5e;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
ol, ul, li {
 | 
			
		||||
    font-family: Verdana, Tahoma, sans-serif;
 | 
			
		||||
    font-size: 10px;
 | 
			
		||||
    font-weight: normal;
 | 
			
		||||
    color: black;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
p {
 | 
			
		||||
    margin-top: 8px;
 | 
			
		||||
    margin-bottom: 2px;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
span {
 | 
			
		||||
    font-family: Verdana, Tahoma, sans-serif;
 | 
			
		||||
    font-size: 11px;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
span.data {
 | 
			
		||||
    padding: 2px;
 | 
			
		||||
    font-weight: bold;
 | 
			
		||||
    margin-left: 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
span.data2 {
 | 
			
		||||
    padding: 2px;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
span.label {
 | 
			
		||||
    display: inline-block;
 | 
			
		||||
    font-weight: bold;
 | 
			
		||||
    background-color: #e8f3e1;
 | 
			
		||||
    width: 30%;
 | 
			
		||||
    text-align: right;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
span.label2 {
 | 
			
		||||
    display: inline-block;
 | 
			
		||||
    font-weight: bold;
 | 
			
		||||
    background-color: #e8f3e1;
 | 
			
		||||
    text-align: right;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
table, tr, td, div, p, form {
 | 
			
		||||
    color: #000;
 | 
			
		||||
    font-family: Verdana, Tahoma, sans-serif;
 | 
			
		||||
    font-size: 11px;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
table.sme-border {
 | 
			
		||||
    border-collapse: collapse;
 | 
			
		||||
    border: 2px solid #cccccc;
 | 
			
		||||
    empty-cells: show;
 | 
			
		||||
    margin: 5px;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
table.sme-layout {
 | 
			
		||||
    border-collapse: collapse;
 | 
			
		||||
    margin-bottom: 2px;
 | 
			
		||||
    margin-top: 2px;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
table.sme-noborders {
 | 
			
		||||
    padding: 0;
 | 
			
		||||
    margin: 0 0 20px;
 | 
			
		||||
    font-family: Verdana, Tahoma, sans-serif;
 | 
			
		||||
    font-size: 11px;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
td {
 | 
			
		||||
    text-align: left;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
td.darkgrey {
 | 
			
		||||
    background-color: #888;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
td.label {
 | 
			
		||||
    font-weight: bold;
 | 
			
		||||
    background-color: #e8f3e1;
 | 
			
		||||
    width: 30%;
 | 
			
		||||
    text-align: right;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
td.menu-cell {
 | 
			
		||||
    margin: 0;
 | 
			
		||||
    padding: 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
td.section {
 | 
			
		||||
    padding-bottom: 2px;
 | 
			
		||||
    padding-top: 8px;
 | 
			
		||||
    background-color: #e8f3e1;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
td.sme-border a, td.sme-border-right a, td.sme-border-center a {
 | 
			
		||||
    font-size: 10px;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
td.sme-border, td.sme-border-warning, td.sme-border-right, td.sme-border-center {
 | 
			
		||||
    border: 1px solid #cccccc;
 | 
			
		||||
    font-family: Verdana, Tahoma, sans-serif;
 | 
			
		||||
    font-size: 10px;
 | 
			
		||||
    font-weight: normal;
 | 
			
		||||
    color: #000;
 | 
			
		||||
    text-align: left;
 | 
			
		||||
    padding: 3px 2px;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
td.sme-border-center {
 | 
			
		||||
    text-align: center;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
td.sme-border-right {
 | 
			
		||||
    text-align: right;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
td.sme-border-warning {
 | 
			
		||||
    color: red;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* sme-layout* : Used for top-level layout */
 | 
			
		||||
 table.sme-layout {
 | 
			
		||||
     border-collapse: collapse;
 | 
			
		||||
     margin-bottom: 2px;
 | 
			
		||||
     margin-top: 2px;
 | 
			
		||||
}
 | 
			
		||||
 tr.sme-layout {
 | 
			
		||||
     border: 1px solid #dddddd;
 | 
			
		||||
}
 | 
			
		||||
 td.sme-layout {
 | 
			
		||||
     border: 1px solid #dddddd;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
td.sme-noborders-content {
 | 
			
		||||
    text-align: left;
 | 
			
		||||
    vertical-align: top;
 | 
			
		||||
    font-family: Verdana, Tahoma, sans-serif;
 | 
			
		||||
    font-size: 11px;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
td.sme-noborders-info, div.sme-noborders-info {
 | 
			
		||||
    text-align: left;
 | 
			
		||||
    vertical-align: top;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
td.sme-noborders-label {
 | 
			
		||||
    font-weight: bold;
 | 
			
		||||
    text-align: right;
 | 
			
		||||
    background-color: #e8f3e1;
 | 
			
		||||
    font-family: Verdana, Tahoma, sans-serif;
 | 
			
		||||
    font-size: 11px;
 | 
			
		||||
    width: 33%;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
td.sme-radiobutton {
 | 
			
		||||
    width: 30px;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
th.sme-border {
 | 
			
		||||
    border: 1px;
 | 
			
		||||
    background-color: #bee6a2;
 | 
			
		||||
    font-family: Verdana, Tahoma, sans-serif;
 | 
			
		||||
    font-size: 10px;
 | 
			
		||||
    font-weight: bold;
 | 
			
		||||
    color: #000;
 | 
			
		||||
    text-align: center;
 | 
			
		||||
    vertical-align: bottom;
 | 
			
		||||
    padding: 3px;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
th.sme-layout {
 | 
			
		||||
    border: 1px;
 | 
			
		||||
    background-color: #e8f3e1;
 | 
			
		||||
    font-family: Verdana, Tahoma, sans-serif;
 | 
			
		||||
    font-size: 9pt;
 | 
			
		||||
    font-weight: bold;
 | 
			
		||||
    color: #000;
 | 
			
		||||
    text-align: right;
 | 
			
		||||
    padding: 4px;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
tr.sme-layout {
 | 
			
		||||
    border: 1px;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
ul {
 | 
			
		||||
    list-style-type: circle;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
div.success, span.success {
 | 
			
		||||
     color: #006400;
 | 
			
		||||
     border-width: 1px;
 | 
			
		||||
     border-style: solid;
 | 
			
		||||
     border-color: #006400 ;
 | 
			
		||||
     padding: 10px;
 | 
			
		||||
     border-radius: 10px;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
div.roundcube #roundcube{
 | 
			
		||||
	width:100%;
 | 
			
		||||
	height:600px;
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										283
									
								
								root/usr/share/smanager/themes/default/public/css/new_sme.css
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										283
									
								
								root/usr/share/smanager/themes/default/public/css/new_sme.css
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,283 @@
 | 
			
		||||
/* css/sme-password.css */
 | 
			
		||||
.input-container {
 | 
			
		||||
    position: relative;
 | 
			
		||||
    display: inline-block;
 | 
			
		||||
}
 | 
			
		||||
.sme-password {
 | 
			
		||||
    padding-right: 5px; /* Ensure space for the toggle icon */
 | 
			
		||||
}
 | 
			
		||||
.toggle-password {
 | 
			
		||||
    position: absolute;
 | 
			
		||||
    right: 4px; /* Position it towards the right */
 | 
			
		||||
    top: 50%; /* Center vertically */
 | 
			
		||||
    transform: translateY(-50%); /* Adjust for exact centering */
 | 
			
		||||
    cursor: pointer;
 | 
			
		||||
    width: 20px; /* Set the width of the icon */
 | 
			
		||||
    height: 20px; /* Set the height of the icon */
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.module {
 | 
			
		||||
    padding: 20px;
 | 
			
		||||
    border: 1px ;
 | 
			
		||||
    border-radius: 10px;
 | 
			
		||||
    background-color: #f9f9f9;
 | 
			
		||||
    box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1);
 | 
			
		||||
    margin-left: 10px !important;
 | 
			
		||||
    margin-top: 10px;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.sme-copyright {
 | 
			
		||||
    color: #777;
 | 
			
		||||
    font-family: Verdana, Tahoma, sans-serif;
 | 
			
		||||
    font-size: 10px;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.logo {
 | 
			
		||||
    height: 142%;
 | 
			
		||||
    width: auto;
 | 
			
		||||
    margin-left: -16px;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.gradient-panel {
 | 
			
		||||
    width: 100%;
 | 
			
		||||
    height: 40px;
 | 
			
		||||
    background: linear-gradient(to right, white ,#c0e7a5 );
 | 
			
		||||
    display: flex;
 | 
			
		||||
    align-items: center;
 | 
			
		||||
    position: relative;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.sme-error {
 | 
			
		||||
    color: #d9534f;
 | 
			
		||||
    display: block;
 | 
			
		||||
    background-color: #fff;
 | 
			
		||||
    border-width: 1px;
 | 
			
		||||
    border-style: solid;
 | 
			
		||||
    border-color: red;
 | 
			
		||||
    padding: 2px;
 | 
			
		||||
    font-weight: bold;
 | 
			
		||||
    margin-bottom: 15px;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.login-button {
 | 
			
		||||
    position: absolute;
 | 
			
		||||
    left: 7%;
 | 
			
		||||
    transform: translateX(-50%);
 | 
			
		||||
    background-color: #4caf50b8;
 | 
			
		||||
    color: white !important;
 | 
			
		||||
    border: none;
 | 
			
		||||
    padding: 8px;
 | 
			
		||||
    text-align: center;
 | 
			
		||||
    text-decoration: none;
 | 
			
		||||
    display: inline-block;
 | 
			
		||||
    font-size: 14px;
 | 
			
		||||
    cursor: pointer;
 | 
			
		||||
    border-radius: 4px;
 | 
			
		||||
    margin-left: 77%;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.sme-warning {
 | 
			
		||||
    color: orange;
 | 
			
		||||
    display: block;
 | 
			
		||||
    background-color: #fff;
 | 
			
		||||
    border-width: 1px;
 | 
			
		||||
    border-style: solid;
 | 
			
		||||
    border-color: orange;
 | 
			
		||||
    padding: 2px;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.infobar {
 | 
			
		||||
    font-family: Verdana, Tahoma, sans-serif;
 | 
			
		||||
    font-size: 11px;
 | 
			
		||||
    background-color: #98d36e;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.module-content {
 | 
			
		||||
    font-family: Georgia, Garamond, serif;
 | 
			
		||||
    font-size: 13px;
 | 
			
		||||
    line-height: 1.2;
 | 
			
		||||
    color: #555;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#help-button {
 | 
			
		||||
    text-decoration: none;
 | 
			
		||||
    font-size: 20px;
 | 
			
		||||
    padding: 8px;
 | 
			
		||||
    background-color: #98d36e;
 | 
			
		||||
    border-radius: 4px;
 | 
			
		||||
    color: #000;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
#module {
 | 
			
		||||
    padding: 20px;
 | 
			
		||||
    border: 1px;
 | 
			
		||||
    border-radius: 10px;
 | 
			
		||||
    background-color: #f9f9f9;
 | 
			
		||||
    box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1);
 | 
			
		||||
}
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
#container {
 | 
			
		||||
    max-width: 100%;
 | 
			
		||||
    position: relative;
 | 
			
		||||
    margin: auto;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#header2 {
 | 
			
		||||
    width:96%;
 | 
			
		||||
    margin-left: 1px;
 | 
			
		||||
    margin-top: 4px;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#main {
 | 
			
		||||
    margin-left: 200px;
 | 
			
		||||
    padding: 10px;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#central {
 | 
			
		||||
    padding: 5px;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#footer {
 | 
			
		||||
    padding-left: 5px;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#header {
 | 
			
		||||
    width: 100%;
 | 
			
		||||
    margin: auto;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#navigation {
 | 
			
		||||
    width: 190px;
 | 
			
		||||
    position: absolute;
 | 
			
		||||
    padding: 5px;
 | 
			
		||||
    background-color: #E8F3E1;
 | 
			
		||||
    overflow: auto;
 | 
			
		||||
    margin-top:20px;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#footer img {
 | 
			
		||||
     float: right;
 | 
			
		||||
     position: fixed;
 | 
			
		||||
     /*margin-left: 40%;*/
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.flag-style {
 | 
			
		||||
     position: absolute;
 | 
			
		||||
     transform: translateY(-50%);
 | 
			
		||||
     left: 95%;
 | 
			
		||||
    /*right: 20px;
 | 
			
		||||
    */
 | 
			
		||||
     width: 24px;
 | 
			
		||||
     height: 14px;
 | 
			
		||||
     display: inline-block;
 | 
			
		||||
     vertical-align: middle;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/* flag container*/
 | 
			
		||||
#flag-container span {
 | 
			
		||||
	font-size: 24px;
 | 
			
		||||
    display: flex;                     /* Allows for easy centering */
 | 
			
		||||
    justify-content: center;           /* Center horizontally */
 | 
			
		||||
    align-items: center;               /* Center vertically */
 | 
			
		||||
    width: 100%;                       /* Full width of parent */
 | 
			
		||||
    height: 24px;                      /* Set a fixed height */
 | 
			
		||||
    border: 1px solid #ccc;            /* Light gray border */
 | 
			
		||||
    border-radius: 5px;                /* Rounded corners */
 | 
			
		||||
    cursor: default;                   /* Prevent text cursor */
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.fallback-box {
 | 
			
		||||
  display: inline-block; /* Make it inline-block to fit around the content */
 | 
			
		||||
  border: 2px solid gray; /* Change the border color as desired */
 | 
			
		||||
  padding: 10px; /* Add some padding */
 | 
			
		||||
  border-radius: 10px; /* Round the corners of the box */
 | 
			
		||||
  font-size: 60px; /* Adjust size if needed */
 | 
			
		||||
  margin-top: 10px; /* Add some margin */
 | 
			
		||||
  text-align: center; /* Center text inside the box */
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 table.sme-border {
 | 
			
		||||
     border-collapse: collapse;
 | 
			
		||||
     border: 2px solid #cccccc;
 | 
			
		||||
     empty-cells: show;
 | 
			
		||||
     margin: 5px 5px 5px 2px;
 | 
			
		||||
}
 | 
			
		||||
 td.sme-border, td.sme-border-warning, td.sme-border-right, td.sme-border-center {
 | 
			
		||||
     border: 1px solid #cccccc;
 | 
			
		||||
     font-family: Verdana, Arial, Helvetica, sans-serif;
 | 
			
		||||
     font-size: 10px;
 | 
			
		||||
     font-weight: normal;
 | 
			
		||||
     color: #000000;
 | 
			
		||||
     text-align: left;
 | 
			
		||||
     padding-left: 2px;
 | 
			
		||||
     padding-right: 2px;
 | 
			
		||||
     padding-top: 3px;
 | 
			
		||||
     padding-bottom: 3px;
 | 
			
		||||
}
 | 
			
		||||
 td.sme-border-warning {
 | 
			
		||||
     color: red;
 | 
			
		||||
}
 | 
			
		||||
 td.sme-border-right {
 | 
			
		||||
    text-align: right;
 | 
			
		||||
}
 | 
			
		||||
 td.sme-border-center {
 | 
			
		||||
    text-align: center;
 | 
			
		||||
}
 | 
			
		||||
 th.sme-border {
 | 
			
		||||
     border: 1px solid #cccccc;
 | 
			
		||||
     background-color: #bee6a2;
 | 
			
		||||
     font-family: Verdana, Arial, Helvetica, sans-serif;
 | 
			
		||||
     font-size: 10px;
 | 
			
		||||
     font-weight: bold;
 | 
			
		||||
     color: #000000;
 | 
			
		||||
     text-align: center;
 | 
			
		||||
     vertical-align: bottom;
 | 
			
		||||
     padding-left: 3px;
 | 
			
		||||
     padding-right: 3px;
 | 
			
		||||
     padding-top: 3px;
 | 
			
		||||
     padding-bottom: 3px;
 | 
			
		||||
    /*border-width: 1px;
 | 
			
		||||
     border-style: solid;
 | 
			
		||||
     border-color: #F2F0EE #75736E #75736E #F2F0EE ;
 | 
			
		||||
    */
 | 
			
		||||
}
 | 
			
		||||
 td.sme-border a, td.sme-border-right a, td.sme-border-center a {
 | 
			
		||||
     font-size: 10px;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
th.sme-layout {
 | 
			
		||||
border: 1px solid #8ebe43;
 | 
			
		||||
background-color: #bee6a2;
 | 
			
		||||
    }
 | 
			
		||||
table.sme-border {
 | 
			
		||||
border: 2px solid #dddddd;
 | 
			
		||||
    }
 | 
			
		||||
td.sme-border-warning,
 | 
			
		||||
td.sme-border-right,
 | 
			
		||||
td.sme-border-center {
 | 
			
		||||
border: 1px solid #dddddd;
 | 
			
		||||
    }
 | 
			
		||||
td.sme-border-right {text-align: right;}
 | 
			
		||||
td.sme-border-center {text-align: center;}
 | 
			
		||||
th.sme-border {
 | 
			
		||||
border: 1px solid #dddddd;
 | 
			
		||||
background-color: #e8f3e1;
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
.no-visited-state {
 | 
			
		||||
     color: inherit;
 | 
			
		||||
    /* Or specify the desired color */
 | 
			
		||||
     text-decoration: none;
 | 
			
		||||
    /* Or any other style you want to reset */
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.no-visited-state:visited {
 | 
			
		||||
     color: inherit;
 | 
			
		||||
    /* Or specify the desired color */
 | 
			
		||||
     text-decoration: none;
 | 
			
		||||
    /* Or any other style you want to reset */
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1,17 @@
 | 
			
		||||
/* css/sme-password.css */
 | 
			
		||||
.input-container {
 | 
			
		||||
    position: relative;
 | 
			
		||||
    display: inline-block;
 | 
			
		||||
}
 | 
			
		||||
.sme-password {
 | 
			
		||||
    padding-right: 5px; /* Ensure space for the toggle icon */
 | 
			
		||||
}
 | 
			
		||||
.toggle-password {
 | 
			
		||||
    position: absolute;
 | 
			
		||||
    right: 4px; /* Position it towards the right */
 | 
			
		||||
    top: 50%; /* Center vertically */
 | 
			
		||||
    transform: translateY(-50%); /* Adjust for exact centering */
 | 
			
		||||
    cursor: pointer;
 | 
			
		||||
    width: 20px; /* Set the width of the icon */
 | 
			
		||||
    height: 20px; /* Set the height of the icon */
 | 
			
		||||
}
 | 
			
		||||
										
											Binary file not shown.
										
									
								
							| 
		 After Width: | Height: | Size: 12 KiB  | 
										
											Binary file not shown.
										
									
								
							| 
		 After Width: | Height: | Size: 3.5 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								root/usr/share/smanager/themes/default/public/images/visible.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								root/usr/share/smanager/themes/default/public/images/visible.png
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							| 
		 After Width: | Height: | Size: 3.2 KiB  | 
@@ -1,278 +1,298 @@
 | 
			
		||||
document.addEventListener('DOMContentLoaded', () => {
 | 
			
		||||
  const flagContainer = document.getElementById('flag-container');
 | 
			
		||||
 | 
			
		||||
        async function getCountryName(countryCode) {
 | 
			
		||||
            try {
 | 
			
		||||
                const response = await fetch(`https://restcountries.com/v3.1/alpha/${countryCode}`);
 | 
			
		||||
                if (!response.ok) throw new Error('Country not found');
 | 
			
		||||
                const data = await response.json();
 | 
			
		||||
                // Return the name in the native language
 | 
			
		||||
                return data[0].name.common; 
 | 
			
		||||
            } catch (error) {
 | 
			
		||||
                console.error(error);
 | 
			
		||||
                return 'Unknown Country';
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        function getFlagEmoji(locale) {
 | 
			
		||||
            // Split the locale to get the language and country code
 | 
			
		||||
            const parts = locale.split('-');
 | 
			
		||||
            let countryCode;
 | 
			
		||||
 | 
			
		||||
            // Handle single subtag (language only) or double subtag (language-country)
 | 
			
		||||
            if (parts.length === 1) {
 | 
			
		||||
                countryCode = getCountryCodeFromLanguage(parts[0]);
 | 
			
		||||
            } else if (parts.length === 2) {
 | 
			
		||||
                countryCode = parts[1].toLowerCase(); // Use the country code
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            // If country code is not found, set a fallback output
 | 
			
		||||
            if (!countryCode) {
 | 
			
		||||
                const fallback = `? ${locale.toUpperCase()}`; // Just a question mark and the full locale
 | 
			
		||||
                return { flag: fallback, isUnknown: true, countryName: 'Unknown Country' };
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            // Convert the country code to a flag emoji
 | 
			
		||||
            return {
 | 
			
		||||
                flag: String.fromCodePoint(...[...countryCode.toUpperCase()].map(char => 0x1F1E6 + char.charCodeAt(0) - 'A'.charCodeAt(0))),
 | 
			
		||||
                isUnknown: false,
 | 
			
		||||
                countryCode: countryCode
 | 
			
		||||
            };
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        function getCountryCodeFromLanguage(language) {
 | 
			
		||||
            // Map languages to countries (this is an example, extend as needed)
 | 
			
		||||
            const languageToCountryMap = {
 | 
			
		||||
                  // Add more mappings as needed
 | 
			
		||||
    "af": "NA",
 | 
			
		||||
    "agq": "CM",
 | 
			
		||||
    "ak": "GH",
 | 
			
		||||
    "am": "ET",
 | 
			
		||||
    "ar": "01",
 | 
			
		||||
    "as": "IN",
 | 
			
		||||
    "asa": "TZ",
 | 
			
		||||
    "ast": "ES",
 | 
			
		||||
    "az": "rl",
 | 
			
		||||
    "bas": "CM",
 | 
			
		||||
    "be": "BY",
 | 
			
		||||
    "bem": "ZM",
 | 
			
		||||
    "bez": "TZ",
 | 
			
		||||
    "bg": "BG",
 | 
			
		||||
    "bm": "ML",
 | 
			
		||||
    "bn": "BD",
 | 
			
		||||
    "bo": "CN",
 | 
			
		||||
    "br": "FR",
 | 
			
		||||
    "brx": "IN",
 | 
			
		||||
    "bs": "rl",
 | 
			
		||||
    "ca": "AD",
 | 
			
		||||
    "ccp": "BD",
 | 
			
		||||
    "ce": "RU",
 | 
			
		||||
    "cgg": "UG",
 | 
			
		||||
    "chr": "US",
 | 
			
		||||
    "ckb": "IQ",
 | 
			
		||||
    "cs": "CZ",
 | 
			
		||||
    "cy": "GB",
 | 
			
		||||
    "da": "DK",
 | 
			
		||||
    "dav": "KE",
 | 
			
		||||
    "de": "DE",
 | 
			
		||||
    "dje": "NE",
 | 
			
		||||
    "dsb": "DE",
 | 
			
		||||
    "dua": "CM",
 | 
			
		||||
    "dyo": "SN",
 | 
			
		||||
    "dz": "BT",
 | 
			
		||||
    "ebu": "KE",
 | 
			
		||||
    "ee": "GH",
 | 
			
		||||
    "el": "CY",
 | 
			
		||||
    "en": "01",
 | 
			
		||||
    "es": "ES",
 | 
			
		||||
    "et": "EE",
 | 
			
		||||
    "eu": "ES",
 | 
			
		||||
    "ewo": "CM",
 | 
			
		||||
    "fa": "AF",
 | 
			
		||||
    "ff": "CM",
 | 
			
		||||
    "fi": "FI",
 | 
			
		||||
    "fil": "PH",
 | 
			
		||||
    "fo": "FO",
 | 
			
		||||
    "fr": "FR",
 | 
			
		||||
    "fur": "IT",
 | 
			
		||||
    "fy": "NL",
 | 
			
		||||
    "ga": "IE",
 | 
			
		||||
    "gd": "GB",
 | 
			
		||||
    "gl": "ES",
 | 
			
		||||
    "gsw": "CH",
 | 
			
		||||
    "gu": "IN",
 | 
			
		||||
    "guz": "KE",
 | 
			
		||||
    "gv": "IM",
 | 
			
		||||
    "ha": "GH",
 | 
			
		||||
    "haw": "US",
 | 
			
		||||
    "he": "IL",
 | 
			
		||||
    "hi": "IN",
 | 
			
		||||
    "hr": "HR",
 | 
			
		||||
    "hsb": "DE",
 | 
			
		||||
    "hu": "HU",
 | 
			
		||||
    "hy": "AM",
 | 
			
		||||
    "id": "ID",
 | 
			
		||||
    "ig": "NG",
 | 
			
		||||
    "ii": "CN",
 | 
			
		||||
    "is": "IS",
 | 
			
		||||
    "it": "IT",
 | 
			
		||||
    "ja": "JP",
 | 
			
		||||
    "jgo": "CM",
 | 
			
		||||
    "jmc": "TZ",
 | 
			
		||||
    "ka": "GE",
 | 
			
		||||
    "kab": "DZ",
 | 
			
		||||
    "kam": "KE",
 | 
			
		||||
    "kde": "TZ",
 | 
			
		||||
    "kea": "CV",
 | 
			
		||||
    "khq": "ML",
 | 
			
		||||
    "ki": "KE",
 | 
			
		||||
    "kk": "KZ",
 | 
			
		||||
    "kkj": "CM",
 | 
			
		||||
    "kl": "GL",
 | 
			
		||||
    "kln": "KE",
 | 
			
		||||
    "km": "KH",
 | 
			
		||||
    "kn": "IN",
 | 
			
		||||
    "ko": "KP",
 | 
			
		||||
    "kok": "IN",
 | 
			
		||||
    "ks": "IN",
 | 
			
		||||
    "ksb": "TZ",
 | 
			
		||||
    "ksf": "CM",
 | 
			
		||||
    "ksh": "DE",
 | 
			
		||||
    "kw": "GB",
 | 
			
		||||
    "ky": "KG",
 | 
			
		||||
    "lag": "TZ",
 | 
			
		||||
    "lb": "LU",
 | 
			
		||||
    "lg": "UG",
 | 
			
		||||
    "lkt": "US",
 | 
			
		||||
    "ln": "AO",
 | 
			
		||||
    "lo": "LA",
 | 
			
		||||
    "lrc": "IQ",
 | 
			
		||||
    "lt": "LT",
 | 
			
		||||
    "lu": "CD",
 | 
			
		||||
    "luo": "KE",
 | 
			
		||||
    "Luo": "KE",
 | 
			
		||||
    "luy": "KE",
 | 
			
		||||
    "lv": "LV",
 | 
			
		||||
    "mas": "KE",
 | 
			
		||||
    "mer": "KE",
 | 
			
		||||
    "mfe": "MU",
 | 
			
		||||
    "mg": "MG",
 | 
			
		||||
    "mgh": "MZ",
 | 
			
		||||
    "mgo": "CM",
 | 
			
		||||
    "mk": "MK",
 | 
			
		||||
    "ml": "IN",
 | 
			
		||||
    "mn": "MN",
 | 
			
		||||
    "mr": "IN",
 | 
			
		||||
    "ms": "BN",
 | 
			
		||||
    "mt": "MT",
 | 
			
		||||
    "mua": "CM",
 | 
			
		||||
    "my": "MM",
 | 
			
		||||
    "mzn": "IR",
 | 
			
		||||
    "naq": "NA",
 | 
			
		||||
    "nb": "NO",
 | 
			
		||||
    "nd": "ZW",
 | 
			
		||||
    "nds": "DE",
 | 
			
		||||
    "ne": "IN",
 | 
			
		||||
    "nl": "NL",
 | 
			
		||||
    "nmg": "CM",
 | 
			
		||||
    "nn": "NO",
 | 
			
		||||
    "nnh": "CM",
 | 
			
		||||
    "nus": "SS",
 | 
			
		||||
    "nyn": "UG",
 | 
			
		||||
    "om": "ET",
 | 
			
		||||
    "or": "IN",
 | 
			
		||||
    "os": "GE",
 | 
			
		||||
    "pa": "ab",
 | 
			
		||||
    "pl": "PL",
 | 
			
		||||
    "ps": "AF",
 | 
			
		||||
    "pt": "PT",
 | 
			
		||||
    "qu": "BO",
 | 
			
		||||
    "rm": "CH",
 | 
			
		||||
    "rn": "BI",
 | 
			
		||||
    "ro": "RO",
 | 
			
		||||
    "rof": "TZ",
 | 
			
		||||
    "ru": "RU",
 | 
			
		||||
    "rw": "RW",
 | 
			
		||||
    "rwk": "TZ",
 | 
			
		||||
    "sah": "RU",
 | 
			
		||||
    "saq": "KE",
 | 
			
		||||
    "sbp": "TZ",
 | 
			
		||||
    "se": "SE",
 | 
			
		||||
    "seh": "MZ",
 | 
			
		||||
    "ses": "ML",
 | 
			
		||||
    "sg": "CF",
 | 
			
		||||
    "shi": "tn",
 | 
			
		||||
    "si": "LK",
 | 
			
		||||
    "sk": "SK",
 | 
			
		||||
    "sl": "SI",
 | 
			
		||||
    "smn": "FI",
 | 
			
		||||
    "sn": "ZW",
 | 
			
		||||
    "so": "SO",
 | 
			
		||||
    "sq": "AL",
 | 
			
		||||
    "sr": "rl",
 | 
			
		||||
    "sv": "AX",
 | 
			
		||||
    "sw": "CD",
 | 
			
		||||
    "ta": "IN",
 | 
			
		||||
    "te": "IN",
 | 
			
		||||
    "teo": "KE",
 | 
			
		||||
    "tg": "TJ",
 | 
			
		||||
    "th": "TH",
 | 
			
		||||
    "ti": "ER",
 | 
			
		||||
    "to": "TO",
 | 
			
		||||
    "tr": "TR",
 | 
			
		||||
    "tt": "RU",
 | 
			
		||||
    "twq": "NE",
 | 
			
		||||
    "tzm": "MA",
 | 
			
		||||
    "ug": "CN",
 | 
			
		||||
    "uk": "UA",
 | 
			
		||||
    "ur": "IN",
 | 
			
		||||
    "uz": "ab",
 | 
			
		||||
    "vai": "tn",
 | 
			
		||||
    "Vai": "tn",
 | 
			
		||||
    "vi": "VN",
 | 
			
		||||
    "vun": "TZ",
 | 
			
		||||
    "wae": "CH",
 | 
			
		||||
    "wo": "SN",
 | 
			
		||||
    "xog": "UG",
 | 
			
		||||
    "yav": "CM",
 | 
			
		||||
    "yi": "01",
 | 
			
		||||
    "yo": "BJ",
 | 
			
		||||
    "yue": "ns",
 | 
			
		||||
    "zgh": "MA",
 | 
			
		||||
    "zh": "ns",
 | 
			
		||||
    "zu": "ZA"
 | 
			
		||||
	const flagContainer = document.getElementById('flag-container');
 | 
			
		||||
	// Mapping of language codes to country codes and their names
 | 
			
		||||
	const languageToCountryMap = {
 | 
			
		||||
		"af": { code: "NA", name: "Namibia" },
 | 
			
		||||
		"agq": { code: "CM", name: "Cameroon" },
 | 
			
		||||
		"ak": { code: "GH", name: "Ghana" },
 | 
			
		||||
		"am": { code: "ET", name: "Ethiopia" },
 | 
			
		||||
		"ar": { code: "SA", name: "Saudi Arabia" },
 | 
			
		||||
		"as": { code: "IN", name: "India" },
 | 
			
		||||
		"asa": { code: "TZ", name: "Tanzania" },
 | 
			
		||||
		"ast": { code: "ES", name: "Spain" },
 | 
			
		||||
		"az": { code: "AZ", name: "Azerbaijan" },
 | 
			
		||||
		"bas": { code: "CM", name: "Cameroon" },
 | 
			
		||||
		"be": { code: "BY", name: "Belarus" },
 | 
			
		||||
		"bem": { code: "ZM", name: "Zambia" },
 | 
			
		||||
		"bez": { code: "TZ", name: "Tanzania" },
 | 
			
		||||
		"bg": { code: "BG", name: "Bulgaria" },
 | 
			
		||||
		"bm": { code: "ML", name: "Mali" },
 | 
			
		||||
		"bn": { code: "BD", name: "Bangladesh" },
 | 
			
		||||
		"bo": { code: "CN", name: "China" },
 | 
			
		||||
		"br": { code: "FR", name: "France" },
 | 
			
		||||
		"brx": { code: "IN", name: "India" },
 | 
			
		||||
		"bs": { code: "BA", name: "Bosnia and Herzegovina" },
 | 
			
		||||
		"ca": { code: "AD", name: "Andorra" },
 | 
			
		||||
		"ccp": { code: "BD", name: "Bangladesh" },
 | 
			
		||||
		"ce": { code: "RU", name: "Russia" },
 | 
			
		||||
		"cgg": { code: "UG", name: "Uganda" },
 | 
			
		||||
		"chr": { code: "US", name: "United States" },
 | 
			
		||||
		"ckb": { code: "IQ", name: "Iraq" },
 | 
			
		||||
		"cs": { code: "CZ", name: "Czech Republic" },
 | 
			
		||||
		"cy": { code: "GB", name: "United Kingdom" },
 | 
			
		||||
		"da": { code: "DK", name: "Denmark" },
 | 
			
		||||
		"dav": { code: "KE", name: "Kenya" },
 | 
			
		||||
		"de": { code: "DE", name: "Germany" },
 | 
			
		||||
		"dje": { code: "NE", name: "Niger" },
 | 
			
		||||
		"dsb": { code: "DE", name: "Germany" },
 | 
			
		||||
		"dua": { code: "CM", name: "Cameroon" },
 | 
			
		||||
		"dyo": { code: "SN", name: "Senegal" },
 | 
			
		||||
		"dz": { code: "BT", name: "Bhutan" },
 | 
			
		||||
		"ebu": { code: "KE", name: "Kenya" },
 | 
			
		||||
		"ee": { code: "GH", name: "Ghana" },
 | 
			
		||||
		"el": { code: "CY", name: "Cyprus" },
 | 
			
		||||
		"en": { code: "US", name: "United States" }, // Assume US for English if unspecified
 | 
			
		||||
		"es": { code: "ES", name: "Spain" },
 | 
			
		||||
		"et": { code: "EE", name: "Estonia" },
 | 
			
		||||
		"eu": { code: "ES", name: "Spain" },
 | 
			
		||||
		"ewo": { code: "CM", name: "Cameroon" },
 | 
			
		||||
		"fa": { code: "AF", name: "Afghanistan" },
 | 
			
		||||
		"ff": { code: "CM", name: "Cameroon" },
 | 
			
		||||
		"fi": { code: "FI", name: "Finland" },
 | 
			
		||||
		"fil": { code: "PH", name: "Philippines" },
 | 
			
		||||
		"fo": { code: "FO", name: "Faroe Islands" },
 | 
			
		||||
		"fr": { code: "FR", name: "France" },
 | 
			
		||||
		"fur": { code: "IT", name: "Italy" },
 | 
			
		||||
		"fy": { code: "NL", name: "Netherlands" },
 | 
			
		||||
		"ga": { code: "IE", name: "Ireland" },
 | 
			
		||||
		"gd": { code: "GB", name: "United Kingdom" },
 | 
			
		||||
		"gl": { code: "ES", name: "Spain" },
 | 
			
		||||
		"gsw": { code: "CH", name: "Switzerland" },
 | 
			
		||||
		"gu": { code: "IN", name: "India" },
 | 
			
		||||
		"guz": { code: "KE", name: "Kenya" },
 | 
			
		||||
		"gv": { code: "IM", name: "Isle of Man" },
 | 
			
		||||
		"ha": { code: "GH", name: "Ghana" },
 | 
			
		||||
		"haw": { code: "US", name: "United States" },
 | 
			
		||||
		"he": { code: "IL", name: "Israel" },
 | 
			
		||||
		"hi": { code: "IN", name: "India" },
 | 
			
		||||
		"hr": { code: "HR", name: "Croatia" },
 | 
			
		||||
		"hsb": { code: "DE", name: "Germany" },
 | 
			
		||||
		"hu": { code: "HU", name: "Hungary" },
 | 
			
		||||
		"hy": { code: "AM", name: "Armenia" },
 | 
			
		||||
		"id": { code: "ID", name: "Indonesia" },
 | 
			
		||||
		"ig": { code: "NG", name: "Nigeria" },
 | 
			
		||||
		"ii": { code: "CN", name: "China" },
 | 
			
		||||
		"is": { code: "IS", name: "Iceland" },
 | 
			
		||||
		"it": { code: "IT", name: "Italy" },
 | 
			
		||||
		"ja": { code: "JP", name: "Japan" },
 | 
			
		||||
		"jgo": { code: "CM", name: "Cameroon" },
 | 
			
		||||
		"jmc": { code: "TZ", name: "Tanzania" },
 | 
			
		||||
		"ka": { code: "GE", name: "Georgia" },
 | 
			
		||||
		"kab": { code: "DZ", name: "Algeria" },
 | 
			
		||||
		"kam": { code: "KE", name: "Kenya" },
 | 
			
		||||
		"kde": { code: "TZ", name: "Tanzania" },
 | 
			
		||||
		"kea": { code: "CV", name: "Cabo Verde" },
 | 
			
		||||
		"khq": { code: "ML", name: "Mali" },
 | 
			
		||||
		"ki": { code: "KE", name: "Kenya" },
 | 
			
		||||
		"kk": { code: "KZ", name: "Kazakhstan" },
 | 
			
		||||
		"kkj": { code: "CM", name: "Cameroon" },
 | 
			
		||||
		"kl": { code: "GL", name: "Greenland" },
 | 
			
		||||
		"kln": { code: "KE", name: "Kenya" },
 | 
			
		||||
		"km": { code: "KH", name: "Cambodia" },
 | 
			
		||||
		"kn": { code: "IN", name: "India" },
 | 
			
		||||
		"ko": { code: "KP", name: "North Korea" },
 | 
			
		||||
		"kok": { code: "IN", name: "India" },
 | 
			
		||||
		"ks": { code: "IN", name: "India" },
 | 
			
		||||
		"ksb": { code: "TZ", name: "Tanzania" },
 | 
			
		||||
		"ksf": { code: "CM", name: "Cameroon" },
 | 
			
		||||
		"ksh": { code: "DE", name: "Germany" },
 | 
			
		||||
		"kw": { code: "GB", name: "United Kingdom" },
 | 
			
		||||
		"ky": { code: "KG", name: "Kyrgyzstan" },
 | 
			
		||||
		"lag": { code: "TZ", name: "Tanzania" },
 | 
			
		||||
		"lb": { code: "LU", name: "Luxembourg" },
 | 
			
		||||
		"lg": { code: "UG", name: "Uganda" },
 | 
			
		||||
		"lkt": { code: "US", name: "United States" },
 | 
			
		||||
		"ln": { code: "AO", name: "Angola" },
 | 
			
		||||
		"lo": { code: "LA", name: "Laos" },
 | 
			
		||||
		"lrc": { code: "IQ", name: "Iraq" },
 | 
			
		||||
		"lt": { code: "LT", name: "Lithuania" },
 | 
			
		||||
		"lu": { code: "CD", name: "Democratic Republic of the Congo" },
 | 
			
		||||
		"luo": { code: "KE", name: "Kenya" },
 | 
			
		||||
		"Luo": { code: "KE", name: "Kenya" },
 | 
			
		||||
		"luy": { code: "KE", name: "Kenya" },
 | 
			
		||||
		"lv": { code: "LV", name: "Latvia" },
 | 
			
		||||
		"mas": { code: "KE", name: "Kenya" },
 | 
			
		||||
		"mer": { code: "KE", name: "Kenya" },
 | 
			
		||||
		"mfe": { code: "MU", name: "Mauritius" },
 | 
			
		||||
		"mg": { code: "MG", name: "Madagascar" },
 | 
			
		||||
		"mgh": { code: "MZ", name: "Mozambique" },
 | 
			
		||||
		"mgo": { code: "CM", name: "Cameroon" },
 | 
			
		||||
		"mk": { code: "MK", name: "North Macedonia" },
 | 
			
		||||
		"ml": { code: "IN", name: "India" },
 | 
			
		||||
		"mn": { code: "MN", name: "Mongolia" },
 | 
			
		||||
		"mr": { code: "IN", name: "India" },
 | 
			
		||||
		"ms": { code: "BN", name: "Brunei" },
 | 
			
		||||
		"mt": { code: "MT", name: "Malta" },
 | 
			
		||||
		"mua": { code: "CM", name: "Cameroon" },
 | 
			
		||||
		"my": { code: "MM", name: "Myanmar" },
 | 
			
		||||
		"mzn": { code: "IR", name: "Iran" },
 | 
			
		||||
		"naq": { code: "NA", name: "Namibia" },
 | 
			
		||||
		"nb": { code: "NO", name: "Norway" },
 | 
			
		||||
		"nd": { code: "ZW", name: "Zimbabwe" },
 | 
			
		||||
		"nds": { code: "DE", name: "Germany" },
 | 
			
		||||
		"ne": { code: "IN", name: "India" },
 | 
			
		||||
		"nl": { code: "NL", name: "Netherlands" },
 | 
			
		||||
		"nmg": { code: "CM", name: "Cameroon" },
 | 
			
		||||
		"nn": { code: "NO", name: "Norway" },
 | 
			
		||||
		"nnh": { code: "CM", name: "Cameroon" },
 | 
			
		||||
		"nus": { code: "SS", name: "South Sudan" },
 | 
			
		||||
		"nyn": { code: "UG", name: "Uganda" },
 | 
			
		||||
		"om": { code: "ET", name: "Ethiopia" },
 | 
			
		||||
		"or": { code: "IN", name: "India" },
 | 
			
		||||
		"os": { code: "GE", name: "Georgia" },
 | 
			
		||||
		"pa": { code: "PK", name: "Pakistan" },
 | 
			
		||||
		"pl": { code: "PL", name: "Poland" },
 | 
			
		||||
		"ps": { code: "AF", name: "Afghanistan" },
 | 
			
		||||
		"pt": { code: "PT", name: "Portugal" },
 | 
			
		||||
		"qu": { code: "BO", name: "Bolivia" },
 | 
			
		||||
		"rm": { code: "CH", name: "Switzerland" },
 | 
			
		||||
		"rn": { code: "BI", name: "Burundi" },
 | 
			
		||||
		"ro": { code: "RO", name: "Romania" },
 | 
			
		||||
		"rof": { code: "TZ", name: "Tanzania" },
 | 
			
		||||
		"ru": { code: "RU", name: "Russia" },
 | 
			
		||||
		"rw": { code: "RW", name: "Rwanda" },
 | 
			
		||||
		"rwk": { code: "TZ", name: "Tanzania" },
 | 
			
		||||
		"sah": { code: "RU", name: "Russia" },
 | 
			
		||||
		"saq": { code: "KE", name: "Kenya" },
 | 
			
		||||
		"sbp": { code: "TZ", name: "Tanzania" },
 | 
			
		||||
		"se": { code: "SE", name: "Sweden" },
 | 
			
		||||
		"seh": { code: "MZ", name: "Mozambique" },
 | 
			
		||||
		"ses": { code: "ML", name: "Mali" },
 | 
			
		||||
		"sg": { code: "CF", name: "Central African Republic" },
 | 
			
		||||
		"shi": { code: "TN", name: "Tunisia" },
 | 
			
		||||
		"si": { code: "LK", name: "Sri Lanka" },
 | 
			
		||||
		"sk": { code: "SK", name: "Slovakia" },
 | 
			
		||||
		"sl": { code: "SI", name: "Slovenia" },
 | 
			
		||||
		"smn": { code: "FI", name: "Finland" },
 | 
			
		||||
		"sn": { code: "ZW", name: "Zimbabwe" },
 | 
			
		||||
		"so": { code: "SO", name: "Somalia" },
 | 
			
		||||
		"sq": { code: "AL", name: "Albania" },
 | 
			
		||||
		"sr": { code: "RS", name: "Serbia" },
 | 
			
		||||
		"sv": { code: "SE", name: "Sweden" },
 | 
			
		||||
		"sw": { code: "CD", name: "Democratic Republic of the Congo" },
 | 
			
		||||
		"ta": { code: "IN", name: "India" },
 | 
			
		||||
		"te": { code: "IN", name: "India" },
 | 
			
		||||
		"teo": { code: "KE", name: "Kenya" },
 | 
			
		||||
		"tg": { code: "TJ", name: "Tajikistan" },
 | 
			
		||||
		"th": { code: "TH", name: "Thailand" },
 | 
			
		||||
		"ti": { code: "ER", name: "Eritrea" },
 | 
			
		||||
		"to": { code: "TO", name: "Tonga" },
 | 
			
		||||
		"tr": { code: "TR", name: "Turkey" },
 | 
			
		||||
		"tt": { code: "RU", name: "Russia" },
 | 
			
		||||
		"twq": { code: "NE", name: "Niger" },
 | 
			
		||||
		"tzm": { code: "MA", name: "Morocco" },
 | 
			
		||||
		"ug": { code: "CN", name: "China" },
 | 
			
		||||
		"uk": { code: "UA", name: "Ukraine" },
 | 
			
		||||
		"ur": { code: "IN", name: "India" },
 | 
			
		||||
		"uz": { code: "UZ", name: "Uzbekistan" },
 | 
			
		||||
		"vai": { code: "TN", name: "Tunisia" },
 | 
			
		||||
		"Vai": { code: "TN", name: "Tunisia" },
 | 
			
		||||
		"vi": { code: "VN", name: "Vietnam" },
 | 
			
		||||
		"vun": { code: "TZ", name: "Tanzania" },
 | 
			
		||||
		"wae": { code: "CH", name: "Switzerland" },
 | 
			
		||||
		"wo": { code: "SN", name: "Senegal" },
 | 
			
		||||
		"xog": { code: "UG", name: "Uganda" },
 | 
			
		||||
		"yav": { code: "CM", name: "Cameroon" },
 | 
			
		||||
		"yi": { code: "01", name: "Unknown" }, // Placeholder for unspecified region
 | 
			
		||||
		"yo": { code: "BJ", name: "Benin" },
 | 
			
		||||
		"yue": { code: "CN", name: "China" },
 | 
			
		||||
		"zgh": { code: "MA", name: "Morocco" },
 | 
			
		||||
		"zh": { code: "CN", name: "China" },
 | 
			
		||||
		"zu": { code: "ZA", name: "South Africa" },
 | 
			
		||||
	};
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
            };
 | 
			
		||||
		//async function getCountryName(countryCode) {
 | 
			
		||||
			//try {
 | 
			
		||||
				//const response = await fetch(`https://restcountries.com/v3.1/alpha/${countryCode}`);
 | 
			
		||||
				//if (!response.ok) throw new Error('Country not found');
 | 
			
		||||
				//const data = await response.json();
 | 
			
		||||
				//// Return the name in the native language
 | 
			
		||||
				//return data[0].name.common; 
 | 
			
		||||
			//} catch (error) {
 | 
			
		||||
				//console.error(error);
 | 
			
		||||
				//return 'Unknown Country';
 | 
			
		||||
			//}
 | 
			
		||||
		//}
 | 
			
		||||
 | 
			
		||||
            return languageToCountryMap[language] || null;
 | 
			
		||||
        }
 | 
			
		||||
		function getCountryNameFromLanguage(language) {
 | 
			
		||||
			return languageToCountryMap[language] ? languageToCountryMap[language].name : null;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
        async function displayLocaleAndFlag() {
 | 
			
		||||
            // Get the browser locale
 | 
			
		||||
            const userLocale = navigator.language || navigator.userLanguage;
 | 
			
		||||
            const { flag, isUnknown, countryCode } = getFlagEmoji(userLocale);
 | 
			
		||||
		function getCountryCodeFromLanguage(language) {
 | 
			
		||||
			return languageToCountryMap[language] ? languageToCountryMap[language].code : null;
 | 
			
		||||
		}
 | 
			
		||||
		
 | 
			
		||||
		function getCountryNameFromCountryCode(countryCode) {
 | 
			
		||||
			//alert(`Country code: ${countryCode}`);
 | 
			
		||||
			for (const language in languageToCountryMap) {
 | 
			
		||||
				if (languageToCountryMap.hasOwnProperty(language)) {
 | 
			
		||||
					if (languageToCountryMap[language].code === countryCode) {
 | 
			
		||||
						return languageToCountryMap[language].name;
 | 
			
		||||
					}
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
			return null; // Return null if country code not found
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
            // Display the locale and the corresponding flag (or fallback)
 | 
			
		||||
            //document.getElementById('locale').textContent = `Your Locale: ${userLocale}`;
 | 
			
		||||
		function getFlagEmoji(locale) {
 | 
			
		||||
			// Split the locale to get the language and country code
 | 
			
		||||
			const parts = locale.split('-');
 | 
			
		||||
			let countryCode;
 | 
			
		||||
 | 
			
		||||
            if (isUnknown) {
 | 
			
		||||
                const fallbackDiv = document.createElement('div');
 | 
			
		||||
                fallbackDiv.className = 'fallback-box';
 | 
			
		||||
                fallbackDiv.textContent = `? ${userLocale.toUpperCase()}`; // Only show ? and locale code inside the box
 | 
			
		||||
                //document.getElementById('flag-container').textContent = "Flag: ";
 | 
			
		||||
                document.getElementById('flag-container').appendChild(fallbackDiv);
 | 
			
		||||
                // Tooltip for fallback
 | 
			
		||||
                fallbackDiv.title = "Unknown Country"; // Tooltip for fallback
 | 
			
		||||
            } else {
 | 
			
		||||
                const countryName = await getCountryName(countryCode);
 | 
			
		||||
                const flagSpan = document.createElement('span');
 | 
			
		||||
                flagSpan.textContent = flag; // Use flag emoji
 | 
			
		||||
                flagSpan.title = countryName; // Tooltip for the flag in country language
 | 
			
		||||
                //document.getElementById('flag-container').textContent = "Flag: ";
 | 
			
		||||
                document.getElementById('flag-container').appendChild(flagSpan);
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
			// Handle single subtag (language only) or double subtag (language-country)
 | 
			
		||||
			if (parts.length === 1) {
 | 
			
		||||
				countryCode = getCountryCodeFromLanguage(parts[0]);
 | 
			
		||||
			} else if (parts.length === 2) {
 | 
			
		||||
				countryCode = parts[1].toLowerCase(); // Use the country code
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
        displayLocaleAndFlag();
 | 
			
		||||
});
 | 
			
		||||
			// If country code is not found, set a fallback output
 | 
			
		||||
			if (!countryCode) {
 | 
			
		||||
				const fallback = `? ${locale.toUpperCase()}`; // Just a question mark and the full locale
 | 
			
		||||
				return { flag: fallback, isUnknown: true, countryName: 'Unknown Country' };
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			// Convert the country code to a flag emoji
 | 
			
		||||
			return {
 | 
			
		||||
				flag: String.fromCodePoint(...[...countryCode.toUpperCase()].map(char => 0x1F1E6 + char.charCodeAt(0) - 'A'.charCodeAt(0))),
 | 
			
		||||
				isUnknown: false,
 | 
			
		||||
				countryCode: countryCode
 | 
			
		||||
			};
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
function displayLocaleAndFlag() {
 | 
			
		||||
    // Get the browser locale
 | 
			
		||||
    const userLocale = navigator.language || navigator.userLanguage;
 | 
			
		||||
    //alert(`User Locale: ${userLocale}`); // Alert the detected locale
 | 
			
		||||
 | 
			
		||||
    const { flag, isUnknown, countryCode } = getFlagEmoji(userLocale);
 | 
			
		||||
    
 | 
			
		||||
    //alert(`Country Code: ${countryCode}, Is Unknown: ${isUnknown}`); // Debug country code and unknown flag status
 | 
			
		||||
 | 
			
		||||
    // Display the locale and the corresponding flag (or fallback)
 | 
			
		||||
    //document.getElementById('locale').textContent = `Your Locale: ${userLocale}`;
 | 
			
		||||
 | 
			
		||||
    if (isUnknown) {
 | 
			
		||||
        const fallbackDiv = document.createElement('div');
 | 
			
		||||
        fallbackDiv.className = 'fallback-box';
 | 
			
		||||
        fallbackDiv.textContent = `? ${userLocale.toUpperCase()}`; // Show ? and locale code inside the box
 | 
			
		||||
        document.getElementById('flag-container').appendChild(fallbackDiv);
 | 
			
		||||
        
 | 
			
		||||
        // Tooltip for fallback
 | 
			
		||||
        fallbackDiv.title = "Unknown Country"; // Tooltip for fallback
 | 
			
		||||
        //alert('Fallback triggered: Unknown Country'); // Debug fallback
 | 
			
		||||
    } else {
 | 
			
		||||
        const countryName = getCountryNameFromCountryCode(countryCode.toUpperCase());
 | 
			
		||||
        //alert(`Country Name from Country Code: ${countryName}`); // Alert the country name
 | 
			
		||||
 | 
			
		||||
        const flagSpan = document.createElement('span');
 | 
			
		||||
        flagSpan.textContent = flag; // Use flag emoji
 | 
			
		||||
        flagSpan.title = countryName; // Tooltip for the flag in country language
 | 
			
		||||
        document.getElementById('flag-container').appendChild(flagSpan);
 | 
			
		||||
        
 | 
			
		||||
        //alert(`Flag Emoji: ${flag}`); // Debug flag emoji display
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
		displayLocaleAndFlag();
 | 
			
		||||
	});
 | 
			
		||||
@@ -0,0 +1,25 @@
 | 
			
		||||
document.addEventListener('DOMContentLoaded', function() {
 | 
			
		||||
    const analysisType = document.getElementById('analysis_type');
 | 
			
		||||
    const messageIdGroup = document.getElementById('message_id_group');
 | 
			
		||||
    const emailAddressGroup = document.getElementById('email_address_group');
 | 
			
		||||
 | 
			
		||||
    // Initially hide both controls
 | 
			
		||||
    messageIdGroup.style.display = 'none';
 | 
			
		||||
    emailAddressGroup.style.display = 'none';
 | 
			
		||||
 | 
			
		||||
    analysisType.addEventListener('change', function() {
 | 
			
		||||
        // Hide both controls first
 | 
			
		||||
        messageIdGroup.style.display = 'none';
 | 
			
		||||
        emailAddressGroup.style.display = 'none';
 | 
			
		||||
 | 
			
		||||
        // Show the relevant control based on the selected option
 | 
			
		||||
        switch(this.value) {
 | 
			
		||||
            case 'trace_message':
 | 
			
		||||
                messageIdGroup.style.display = 'block';
 | 
			
		||||
                break;
 | 
			
		||||
            case 'user_activity':
 | 
			
		||||
                emailAddressGroup.style.display = 'block';
 | 
			
		||||
                break;
 | 
			
		||||
        }
 | 
			
		||||
    });
 | 
			
		||||
});
 | 
			
		||||
@@ -0,0 +1,31 @@
 | 
			
		||||
// js/sme-password.js
 | 
			
		||||
$(document).ready(function() {
 | 
			
		||||
    // For each password input
 | 
			
		||||
    $('.sme-password').each(function() {
 | 
			
		||||
        // Create a new container
 | 
			
		||||
        //alert("sme-password");
 | 
			
		||||
        var $inputContainer = $('<div class="input-container"></div>');
 | 
			
		||||
        
 | 
			
		||||
        // Move the input into the new container
 | 
			
		||||
        $(this).wrap($inputContainer);
 | 
			
		||||
        
 | 
			
		||||
        // Create the toggle image
 | 
			
		||||
        var $togglePassword = $('<img src="images/visible.png" alt="Show Password" class="toggle-password" />');
 | 
			
		||||
        
 | 
			
		||||
        // Append the toggle image to the container
 | 
			
		||||
        $(this).after($togglePassword);
 | 
			
		||||
    });
 | 
			
		||||
 | 
			
		||||
    $('.toggle-password').on('click', function() {
 | 
			
		||||
        // Find the associated password field
 | 
			
		||||
        var input = $(this).siblings('.sme-password');
 | 
			
		||||
 | 
			
		||||
        // Toggle the type attribute between password and text
 | 
			
		||||
        var inputType = input.attr('type') === 'password' ? 'text' : 'password';
 | 
			
		||||
        input.attr('type', inputType);
 | 
			
		||||
        
 | 
			
		||||
        // Toggle the icon source based on the input type
 | 
			
		||||
        var iconSrc = inputType === 'password' ? 'images/visible.png' : 'images/visible-slash.png';
 | 
			
		||||
        $(this).attr('src', iconSrc);
 | 
			
		||||
    });
 | 
			
		||||
});
 | 
			
		||||
@@ -3,7 +3,7 @@
 | 
			
		||||
% content_for 'module' => begin
 | 
			
		||||
 | 
			
		||||
<div id='module' class='module back_tape_configure-panel'>
 | 
			
		||||
    % if ($config->{debug} == 1) {
 | 
			
		||||
    % if (config->{debug} == 1) {
 | 
			
		||||
	<p>
 | 
			
		||||
	%= dumper $c->current_route
 | 
			
		||||
	%= dumper $bac_datas
 | 
			
		||||
@@ -74,10 +74,8 @@
 | 
			
		||||
	</p><br>
 | 
			
		||||
 | 
			
		||||
	%= hidden_field 'Function' => $bac_datas->{'function'}
 | 
			
		||||
    <div class='center'>
 | 
			
		||||
	%= submit_button $c->l('bac_UPDATE_CONF'), class => 'action'
 | 
			
		||||
    </div>
 | 
			
		||||
 | 
			
		||||
    % end
 | 
			
		||||
</div>
 | 
			
		||||
% end
 | 
			
		||||
% end
 | 
			
		||||
@@ -3,7 +3,7 @@
 | 
			
		||||
% content_for 'module' => begin
 | 
			
		||||
 | 
			
		||||
<div id='module' class='module back_tape_restore-panel'>
 | 
			
		||||
    % if ($config->{debug} == 1) {
 | 
			
		||||
    % if (config->{debug} == 1) {
 | 
			
		||||
	<p>
 | 
			
		||||
	%= dumper $c->current_route
 | 
			
		||||
	%= dumper $bac_datas
 | 
			
		||||
@@ -30,10 +30,8 @@
 | 
			
		||||
 | 
			
		||||
	%= hidden_field 'Function' => $bac_datas->{'function'}
 | 
			
		||||
 | 
			
		||||
    <div class='center'>
 | 
			
		||||
	%= submit_button $c->l('bac_RESTORE_FROM_TAPE'), class => 'action'
 | 
			
		||||
    </div>
 | 
			
		||||
 | 
			
		||||
    % end
 | 
			
		||||
</div>
 | 
			
		||||
% end
 | 
			
		||||
% end
 | 
			
		||||
@@ -3,7 +3,7 @@
 | 
			
		||||
% content_for 'module' => begin
 | 
			
		||||
 | 
			
		||||
<div id='module' class='module back_workstn_configure-panel'>
 | 
			
		||||
    % if ($config->{debug} == 1) {
 | 
			
		||||
    % if (config->{debug} == 1) {
 | 
			
		||||
	<p>
 | 
			
		||||
	%= dumper $c->current_route
 | 
			
		||||
	%= dumper $bac_datas
 | 
			
		||||
@@ -44,12 +44,10 @@
 | 
			
		||||
	</span></p>
 | 
			
		||||
 | 
			
		||||
	%= hidden_field 'Function' => $bac_datas->{'function'} . '1'
 | 
			
		||||
    <div class='center'>
 | 
			
		||||
	%= submit_button $c->l('NEXT'), class => 'action'
 | 
			
		||||
    </div>
 | 
			
		||||
 | 
			
		||||
    % end
 | 
			
		||||
 | 
			
		||||
</div>
 | 
			
		||||
 | 
			
		||||
% end
 | 
			
		||||
% end
 | 
			
		||||
@@ -3,7 +3,7 @@
 | 
			
		||||
% content_for 'module' => begin
 | 
			
		||||
 | 
			
		||||
<div id='module' class='module back_workstn_configure1-panel'>
 | 
			
		||||
    % if ($config->{debug} == 1) {
 | 
			
		||||
    % if (config->{debug} == 1) {
 | 
			
		||||
	<p>
 | 
			
		||||
	%= dumper $c->current_route
 | 
			
		||||
	%= dumper $bac_datas
 | 
			
		||||
@@ -148,9 +148,7 @@
 | 
			
		||||
 | 
			
		||||
	%= hidden_field 'Function' => $bac_datas->{function}
 | 
			
		||||
	%= hidden_field 'VFSType' => $bac_datas->{vfstype}
 | 
			
		||||
    <div class='center'>
 | 
			
		||||
	%= submit_button $c->l('bac_UPDATE_CONF'), class => 'action'
 | 
			
		||||
    </div>
 | 
			
		||||
    % end
 | 
			
		||||
</div>
 | 
			
		||||
% end
 | 
			
		||||
% end
 | 
			
		||||
@@ -3,7 +3,7 @@
 | 
			
		||||
% content_for 'module' => begin
 | 
			
		||||
 | 
			
		||||
<div id='module' class='module back_workstn_restore-panel'>
 | 
			
		||||
    % if ($config->{debug} == 1) {
 | 
			
		||||
    % if (config->{debug} == 1) {
 | 
			
		||||
	<p>
 | 
			
		||||
	%= dumper $c->current_route
 | 
			
		||||
	%= dumper $bac_datas
 | 
			
		||||
@@ -38,9 +38,7 @@
 | 
			
		||||
	</span><br><br>
 | 
			
		||||
 | 
			
		||||
	%= hidden_field 'Function' => $bac_datas->{'function'}
 | 
			
		||||
    <div class='center'>
 | 
			
		||||
	%= submit_button $c->l('bac_RESTORE_FROM_WORKSTN'), class => 'action'
 | 
			
		||||
    </div>
 | 
			
		||||
    % end
 | 
			
		||||
</div>
 | 
			
		||||
% end
 | 
			
		||||
% end
 | 
			
		||||
@@ -3,7 +3,7 @@
 | 
			
		||||
% content_for 'module' => begin
 | 
			
		||||
 | 
			
		||||
<div id='module' class='module back_workstn_restore1-panel'>
 | 
			
		||||
    % if ($config->{debug} == 1) {
 | 
			
		||||
    % if (config->{debug} == 1) {
 | 
			
		||||
	<p>
 | 
			
		||||
	%= dumper $c->current_route
 | 
			
		||||
	%= dumper $bac_datas
 | 
			
		||||
@@ -29,9 +29,7 @@
 | 
			
		||||
	%=l 'bac_YOU_MUST_REBOOT'
 | 
			
		||||
	</p>
 | 
			
		||||
	%= hidden_field 'Function' => $bac_datas->{'function'}
 | 
			
		||||
    <div class='center'>
 | 
			
		||||
	%= submit_button $c->l('bac_REBOOT'), class => 'action'
 | 
			
		||||
    </div>
 | 
			
		||||
    % end
 | 
			
		||||
</div>
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -3,7 +3,7 @@
 | 
			
		||||
% content_for 'module' => begin
 | 
			
		||||
 | 
			
		||||
<div id='module' class='module back_workstn_sel_restore-panel'>
 | 
			
		||||
    % if ($config->{debug} == 1) {
 | 
			
		||||
    % if (config->{debug} == 1) {
 | 
			
		||||
	<p>
 | 
			
		||||
	%= dumper $c->current_route
 | 
			
		||||
	%= dumper $bac_datas
 | 
			
		||||
@@ -39,12 +39,10 @@
 | 
			
		||||
	</span><br>
 | 
			
		||||
	<br>
 | 
			
		||||
	%= hidden_field 'Function' => $bac_datas->{'function'}
 | 
			
		||||
    <div class='center'>
 | 
			
		||||
	%= submit_button $c->l('PERFORM'), class => 'action'
 | 
			
		||||
    </div>
 | 
			
		||||
 | 
			
		||||
    % end
 | 
			
		||||
 | 
			
		||||
</div>
 | 
			
		||||
 | 
			
		||||
% end
 | 
			
		||||
% end
 | 
			
		||||
@@ -3,7 +3,7 @@
 | 
			
		||||
% content_for 'module' => begin
 | 
			
		||||
 | 
			
		||||
<div id='module' class='module back_workstn_sel_restore1-panel'>
 | 
			
		||||
    % if ($config->{debug} == 1) {
 | 
			
		||||
    % if (config->{debug} == 1) {
 | 
			
		||||
	<p>
 | 
			
		||||
	%= dumper $c->current_route
 | 
			
		||||
	%= dumper $bac_datas
 | 
			
		||||
@@ -41,9 +41,7 @@
 | 
			
		||||
	%= hidden_field 'Backupset' => $bac_datas->{'backupset'}
 | 
			
		||||
	%= hidden_field 'Filterexp' => $bac_datas->{'filterexp'}
 | 
			
		||||
 | 
			
		||||
    <div class='center'>
 | 
			
		||||
	%= submit_button $c->l('PERFORM'), class => 'action'
 | 
			
		||||
    </div>
 | 
			
		||||
 | 
			
		||||
    % end
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -3,7 +3,7 @@
 | 
			
		||||
% content_for 'module' => begin
 | 
			
		||||
 | 
			
		||||
<div id='module' class='module back_workstn_sel_restore2-panel'>
 | 
			
		||||
    % if ($config->{debug} == 1) {
 | 
			
		||||
    % if (config->{debug} == 1) {
 | 
			
		||||
	<p>
 | 
			
		||||
	%= dumper $c->current_route
 | 
			
		||||
	%= dumper $bac_datas
 | 
			
		||||
@@ -24,9 +24,7 @@
 | 
			
		||||
 | 
			
		||||
    %= form_for '/backupd' => (method => 'POST') => begin
 | 
			
		||||
	%= hidden_field 'Function' => $bac_datas->{'function'}
 | 
			
		||||
    <div class='center'>
 | 
			
		||||
	%= submit_button $c->l('NEXT'), class => 'action'
 | 
			
		||||
    </div>
 | 
			
		||||
 | 
			
		||||
    % end
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -2,7 +2,7 @@
 | 
			
		||||
% content_for 'module' => begin
 | 
			
		||||
 | 
			
		||||
<div id='module' class='module back_workstn_verify-panel'>
 | 
			
		||||
    % if ($config->{debug} == 1) {
 | 
			
		||||
    % if (config->{debug} == 1) {
 | 
			
		||||
	<p>
 | 
			
		||||
	%= dumper $c->current_route
 | 
			
		||||
	%= dumper $bac_datas
 | 
			
		||||
@@ -44,10 +44,8 @@
 | 
			
		||||
 | 
			
		||||
	<br><br>
 | 
			
		||||
	%= hidden_field 'Function' => $bac_datas->{'function'} . '1'
 | 
			
		||||
    <div class='center'>
 | 
			
		||||
	%= submit_button $c->l('bac_VERIFY'), class => 'action'
 | 
			
		||||
    </div>
 | 
			
		||||
 | 
			
		||||
    % end
 | 
			
		||||
</div>
 | 
			
		||||
% end
 | 
			
		||||
% end
 | 
			
		||||
@@ -2,7 +2,7 @@
 | 
			
		||||
% content_for 'module' => begin
 | 
			
		||||
 | 
			
		||||
<div id='module' class='module back_workstn_verify1-panel'>
 | 
			
		||||
    % if ($config->{debug} == 1) {
 | 
			
		||||
    % if (config->{debug} == 1) {
 | 
			
		||||
	<p>
 | 
			
		||||
	%= dumper $c->current_route
 | 
			
		||||
	%= dumper $bac_datas->{function}
 | 
			
		||||
@@ -28,10 +28,8 @@
 | 
			
		||||
 | 
			
		||||
    %= hidden_field 'Function' => $bac_datas->{'function'}
 | 
			
		||||
 | 
			
		||||
    <div class='center'>
 | 
			
		||||
    %= submit_button $c->l('NEXT'), class => 'action'
 | 
			
		||||
    </div>
 | 
			
		||||
 | 
			
		||||
    % end
 | 
			
		||||
</div>
 | 
			
		||||
% end
 | 
			
		||||
% end
 | 
			
		||||
@@ -11,42 +11,52 @@
 | 
			
		||||
    # The events handle cases where mysqld is not enabled, and/or is not running.
 | 
			
		||||
    my $status = system("/sbin/e-smith/signal-event", "pre-backup", "desktop");
 | 
			
		||||
    if ($status) {
 | 
			
		||||
	desktopBackupRecordStatus($backup_rec, 'pre-backup', $status);
 | 
			
		||||
	return ($c->l('bac_OPERATION_STATUS_REPORT').
 | 
			
		||||
		$c->l('bac_ERR_PRE_BACKUP'));
 | 
			
		||||
		$c->desktopBackupRecordStatus($backup_rec, 'pre-backup', $status);
 | 
			
		||||
		return ($c->l('bac_OPERATION_STATUS_REPORT').$c->l('bac_ERR_PRE_BACKUP'));
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    my $clvl = $c->stash('compressionlevel');
 | 
			
		||||
    my $cmd = "/bin/tar --directory / --create @{$c->stash('directories')} --file=-"
 | 
			
		||||
        . "@{$c->stash('exclude')} | /usr/bin/gzip $clvl ";
 | 
			
		||||
    my $cmd = "/bin/tar --create --file=- --directory / @{$c->stash('exclude')}  "
 | 
			
		||||
        . "@{$c->stash('directories')} | /usr/bin/gzip $clvl ";
 | 
			
		||||
 | 
			
		||||
    my $success = open my $fh, '-|', $cmd;
 | 
			
		||||
    unless ($success) { return "Error dowload command."; };
 | 
			
		||||
 
 | 
			
		||||
  # Write chunk
 | 
			
		||||
  $c->res->headers->content_type('application/x-tar');
 | 
			
		||||
  $c->res->headers->content_disposition(qq/attachment; filename="smeserver.tgz"/);
 | 
			
		||||
 | 
			
		||||
  my $cb;
 | 
			
		||||
  $cb = sub {
 | 
			
		||||
    my $c = shift;
 | 
			
		||||
    my $size = 500 * 1024;
 | 
			
		||||
    my $length = sysread($fh, my $buffer, $size);
 | 
			
		||||
    unless ($length) {
 | 
			
		||||
      close $fh;
 | 
			
		||||
      undef $cb;
 | 
			
		||||
      $c->finish;
 | 
			
		||||
      return;
 | 
			
		||||
    }
 | 
			
		||||
    $c->write_chunk($buffer, $cb);
 | 
			
		||||
  };
 | 
			
		||||
  $c->$cb;
 | 
			
		||||
    #unless ($success) { return "Error download command."; };
 | 
			
		||||
    if ($success) {
 | 
			
		||||
		# Try with download plugin - seems to fail to complete download and also 
 | 
			
		||||
		# name of file deposited is not as required.
 | 
			
		||||
		#my $output = do { local $/; <$fh> };
 | 
			
		||||
		#close $fh;
 | 
			
		||||
		#$c->render_file(
 | 
			
		||||
			#data => $output,
 | 
			
		||||
			#filename => 'output.txt',
 | 
			
		||||
			#content_type => 'text/plain'
 | 
			
		||||
		#);
 | 
			
		||||
		# So organise it ourselves.
 | 
			
		||||
		$c->res->headers->content_type('application/x-tar');
 | 
			
		||||
		$c->res->headers->content_disposition(qq/attachment; filename="smeserver.tgz"/);
 | 
			
		||||
		my $cb;
 | 
			
		||||
		$cb = sub {
 | 
			
		||||
		my $c = shift;
 | 
			
		||||
		my $size = 500 * 1024;
 | 
			
		||||
		my $length = sysread($fh, my $buffer, $size);
 | 
			
		||||
		unless ($length) {
 | 
			
		||||
		  close $fh;
 | 
			
		||||
		  undef $cb;
 | 
			
		||||
		  $c->finish;
 | 
			
		||||
		  return;
 | 
			
		||||
		}
 | 
			
		||||
		$c->write_chunk($buffer, $cb);
 | 
			
		||||
		};
 | 
			
		||||
		$c->$cb;
 | 
			
		||||
	} else {
 | 
			
		||||
		$c->render(text => "Failed to execute command: $!", status => 500);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
    # Remove the dumped tables.
 | 
			
		||||
    $status = system("/sbin/e-smith/signal-event", "post-backup", "desktop");
 | 
			
		||||
    if ($status) {
 | 
			
		||||
	desktopBackupRecordStatus($backup_rec, 'post-backup', $status);
 | 
			
		||||
	die ($c->l('bac_ERR_POST_BACKUP'),"\n");
 | 
			
		||||
		$c->desktopBackupRecordStatus($backup_rec, 'post-backup', $status);
 | 
			
		||||
		die ($c->l('bac_ERR_POST_BACKUP'),"\n");
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    $now = time();
 | 
			
		||||
@@ -54,3 +64,4 @@
 | 
			
		||||
    $backup_rec->set_prop('Result', "0");
 | 
			
		||||
 | 
			
		||||
%>
 | 
			
		||||
1;
 | 
			
		||||
@@ -3,7 +3,7 @@
 | 
			
		||||
% content_for 'module' => begin
 | 
			
		||||
 | 
			
		||||
<div id='module' class='module backup-panel'>
 | 
			
		||||
    % if ($config->{debug} == 1) {
 | 
			
		||||
    % if (config->{debug} == 1) {
 | 
			
		||||
	<p>
 | 
			
		||||
	%= dumper $c->current_route
 | 
			
		||||
	%= dumper $bac_datas
 | 
			
		||||
@@ -70,12 +70,10 @@
 | 
			
		||||
	</span></p>
 | 
			
		||||
 | 
			
		||||
	<br>
 | 
			
		||||
    <div class='center'>
 | 
			
		||||
	%= submit_button $c->l('PERFORM'), class => 'action'
 | 
			
		||||
    </div>
 | 
			
		||||
 | 
			
		||||
 	%= submit_button $c->l('PERFORM'), class => 'action'
 | 
			
		||||
 
 | 
			
		||||
    % end
 | 
			
		||||
 | 
			
		||||
</div>
 | 
			
		||||
 | 
			
		||||
% end
 | 
			
		||||
% end
 | 
			
		||||
@@ -4,7 +4,7 @@
 | 
			
		||||
 | 
			
		||||
<div id='module' class='module bugreport-panel'>
 | 
			
		||||
 | 
			
		||||
    % if ($config->{debug} == 1) {
 | 
			
		||||
    % if (config->{debug} == 1) {
 | 
			
		||||
	<p>
 | 
			
		||||
	(DBG)route: <%= $c->current_route %><br>
 | 
			
		||||
	(DBG)trt: <%= $bugr_datas->{trt} %><br>
 | 
			
		||||
@@ -13,11 +13,10 @@
 | 
			
		||||
    
 | 
			
		||||
    <h1><%= $title %></h1>
 | 
			
		||||
    <!--br><%= $modul %><br-->
 | 
			
		||||
    <p>
 | 
			
		||||
 | 
			
		||||
    <p><b>
 | 
			
		||||
    <b>
 | 
			
		||||
    %=l ('bugr_DO_NOT_PANIC')
 | 
			
		||||
    </b></p>
 | 
			
		||||
    </b>
 | 
			
		||||
    <p>
 | 
			
		||||
    %=l ('bugr_SME_EXPERIENCE')
 | 
			
		||||
    </p><p>
 | 
			
		||||
@@ -49,7 +48,7 @@
 | 
			
		||||
    %=l ('bugr_YUM_REPOS')
 | 
			
		||||
    </li><br></ul>
 | 
			
		||||
    %=l ('bugr_PRIVACY')
 | 
			
		||||
    </p><p>
 | 
			
		||||
    </p>
 | 
			
		||||
 | 
			
		||||
    <% my $btn = l('bugr_CREATE_REPORT'); %>
 | 
			
		||||
 | 
			
		||||
@@ -57,7 +56,7 @@
 | 
			
		||||
        %= submit_button "$btn", class => 'action'
 | 
			
		||||
    % end    
 | 
			
		||||
 | 
			
		||||
    </p><p><b>
 | 
			
		||||
    <p><b>
 | 
			
		||||
    %=l ('bugr_DONATING')
 | 
			
		||||
    </b><br><br>
 | 
			
		||||
    %=l ('bugr_AWARE_SME')
 | 
			
		||||
@@ -66,6 +65,7 @@
 | 
			
		||||
    </b><br><br>
 | 
			
		||||
    %=l ('bugr_CONSIDER_DONATING')
 | 
			
		||||
    <br><br>
 | 
			
		||||
    </p>
 | 
			
		||||
 | 
			
		||||
    %= link_to 'https://wiki.koozali.org/Donate' => begin
 | 
			
		||||
	%= image '/images/btn_donateCC_LG.gif'
 | 
			
		||||
@@ -76,8 +76,7 @@
 | 
			
		||||
 | 
			
		||||
    <br>
 | 
			
		||||
    %=l ('bugr_THANK_YOU')
 | 
			
		||||
    </p>
 | 
			
		||||
 | 
			
		||||
</div>
 | 
			
		||||
 | 
			
		||||
%end
 | 
			
		||||
%end
 | 
			
		||||
@@ -4,7 +4,7 @@
 | 
			
		||||
 | 
			
		||||
<div id='module' class='module bugreport2-panel'>
 | 
			
		||||
 | 
			
		||||
    % if ($config->{debug} == 1) {
 | 
			
		||||
    % if (config->{debug} == 1) {
 | 
			
		||||
	<p>
 | 
			
		||||
	(DBG)route: <%= $c->current_route %><br>
 | 
			
		||||
	(DBG)trt: <%= $bugr_datas->{trt} %><br>
 | 
			
		||||
@@ -15,14 +15,20 @@
 | 
			
		||||
 | 
			
		||||
    <br><%= $modul %><br>
 | 
			
		||||
 | 
			
		||||
    <p>
 | 
			
		||||
    <% my $btn = l('bugr_Download this report'); %>
 | 
			
		||||
 | 
			
		||||
    %= form_for 'bugreportD' => (method => 'POST') => begin
 | 
			
		||||
	%= submit_button "$btn", class => 'action'
 | 
			
		||||
	%= hidden_field 'trt' => $bugr_datas->{trt}
 | 
			
		||||
    % end    
 | 
			
		||||
		%= submit_button "$btn", class => 'action'
 | 
			
		||||
		%= hidden_field 'trt' => $bugr_datas->{trt}
 | 
			
		||||
    % end   
 | 
			
		||||
    
 | 
			
		||||
    % my $out = "================== <br />";
 | 
			
		||||
    % $out .= "Boot anaysis image (right click and save image to download)<br />";
 | 
			
		||||
    % $out .= "================== <br />";
 | 
			
		||||
    % $out .= "<img src='images/boot.svg' alt='boot timing image' width=95% >";
 | 
			
		||||
    
 | 
			
		||||
   <br><%= $c->render_to_string(inline=>$out) %><br>
 | 
			
		||||
 | 
			
		||||
</div>
 | 
			
		||||
 | 
			
		||||
%end
 | 
			
		||||
%end
 | 
			
		||||
@@ -2,7 +2,7 @@
 | 
			
		||||
 | 
			
		||||
% content_for 'module' => begin
 | 
			
		||||
<div id='module' class='module clamav-panel'>
 | 
			
		||||
    %if ($config->{debug} == 1) {
 | 
			
		||||
    %if (config->{debug} == 1) {
 | 
			
		||||
	<p>(DBG)route: <%= $c->current_route %><br>
 | 
			
		||||
	(DBG)FsS stat: <%= $clm_datas->{FilesystemScan}%> <br>
 | 
			
		||||
	(DBG)Quar stat: <%=$clm_datas->{Quarantine} %>
 | 
			
		||||
 
 | 
			
		||||
@@ -3,7 +3,7 @@
 | 
			
		||||
% content_for 'module' => begin
 | 
			
		||||
<div id='module' class='module datetime-panel'>
 | 
			
		||||
 | 
			
		||||
    % if ($config->{debug} == 1) {
 | 
			
		||||
    % if (config->{debug} == 1) {
 | 
			
		||||
	<p>
 | 
			
		||||
	%= dumper $c->current_route
 | 
			
		||||
	%= dumper $dat_datas
 | 
			
		||||
@@ -45,6 +45,7 @@
 | 
			
		||||
		%= $dat_datas->{now_string}
 | 
			
		||||
		</b>
 | 
			
		||||
		</p>
 | 
			
		||||
		<p>
 | 
			
		||||
		<br>
 | 
			
		||||
		<span class=label>
 | 
			
		||||
		%=l 'dat_NTP_SERVER'
 | 
			
		||||
@@ -121,4 +122,4 @@
 | 
			
		||||
    % end    
 | 
			
		||||
 | 
			
		||||
</div>
 | 
			
		||||
%end
 | 
			
		||||
%end
 | 
			
		||||
@@ -3,7 +3,7 @@
 | 
			
		||||
% content_for 'module' => begin
 | 
			
		||||
<div id='module' class='module directory-panel'>
 | 
			
		||||
 | 
			
		||||
    %if ($config->{debug} == 1) {
 | 
			
		||||
    %if (config->{debug} == 1) {
 | 
			
		||||
	<p>
 | 
			
		||||
	(DBG)route: <%= $c->current_route %><br>
 | 
			
		||||
	(DBG)dir. access: <%= $dir_datas->{access}%><br>
 | 
			
		||||
@@ -44,25 +44,25 @@
 | 
			
		||||
	</span><span class=data>
 | 
			
		||||
	%= text_field 'department' =>  $dir_datas->{department}, class => 'input'
 | 
			
		||||
	</span>
 | 
			
		||||
	</p>
 | 
			
		||||
	</p><p>
 | 
			
		||||
	<span class=label>
 | 
			
		||||
	%=l 'dir_COMPANY', class => 'label'
 | 
			
		||||
	</span><span class=data>
 | 
			
		||||
	%= text_field 'company', $dir_datas->{company}, class => 'input'
 | 
			
		||||
	</span>
 | 
			
		||||
	</p>
 | 
			
		||||
	</p><p>
 | 
			
		||||
	<span class=label>
 | 
			
		||||
	%=l 'dir_STREET', class => 'label'
 | 
			
		||||
	</span><span class=data>
 | 
			
		||||
	%= text_field 'street' =>  $dir_datas->{street}, class => 'input'
 | 
			
		||||
	</span>
 | 
			
		||||
	</p>
 | 
			
		||||
	</p><p>
 | 
			
		||||
	<span class=label>
 | 
			
		||||
	%=l 'dir_CITY', class => 'label'
 | 
			
		||||
	</span><span class=data>
 | 
			
		||||
	%= text_field 'city', $dir_datas->{city}, class => 'input'
 | 
			
		||||
	</span>
 | 
			
		||||
	</p>
 | 
			
		||||
	</p><p>
 | 
			
		||||
	<span class=label>
 | 
			
		||||
	%=l 'dir_PHONENUMBER', class => 'label'
 | 
			
		||||
	</span><span class=data>
 | 
			
		||||
@@ -85,4 +85,4 @@
 | 
			
		||||
    % end    
 | 
			
		||||
 | 
			
		||||
</div>
 | 
			
		||||
%end
 | 
			
		||||
%end
 | 
			
		||||
Some files were not shown because too many files have changed in this diff Show More
		Reference in New Issue
	
	Block a user