Compare commits
	
		
			23 Commits
		
	
	
		
			11_0_0-39_
			...
			11_0_0-53_
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| c0b4d1f90e | |||
| a979d472e8 | |||
| d776f20736 | |||
| a4668da720 | |||
| 7ad224998c | |||
| 3070e0656c | |||
| 642d013437 | |||
| a62968d2d9 | |||
| 0e777fd51a | |||
| eee68afa2b | |||
| c2d677594b | |||
| f6fe2216a0 | |||
| 6d3f8f48c2 | |||
| f8d9ec34e3 | |||
| 835d439e42 | |||
| 4797a1b189 | |||
| 1e4ec809b5 | |||
| d1197f55cf | |||
| b5d6de3bcf | |||
| ec4f515012 | |||
| 9b03d377e2 | |||
| 957d2ada21 | |||
| be49419eba | 
| @@ -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 | ||||
| @@ -68,9 +68,18 @@ color: #8ebe43; | ||||
| background-color: #8ebe43; | ||||
|     } | ||||
|        | ||||
| /* flag container no flag */ | ||||
| /* flag container*/ | ||||
| #flag-container span { | ||||
|   font-size: 24px; | ||||
| 	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 { | ||||
| @@ -84,4 +93,4 @@ background-color: #8ebe43; | ||||
| } | ||||
|  | ||||
| HERE | ||||
| } | ||||
| } | ||||
| @@ -80,6 +80,7 @@ a:active { color: #606060; text-decoration: none; } | ||||
|  | ||||
| .sme-error { | ||||
|     color: red; | ||||
|     display:block; | ||||
|     background-color: #ffffff; | ||||
|     border-width: 1px; | ||||
|     border-style: solid; | ||||
| @@ -93,6 +94,7 @@ a:active { color: #606060; text-decoration: none; } | ||||
|  | ||||
| .sme-warning { | ||||
|     color: orange; | ||||
|     display:block;   | ||||
|     background-color: #ffffff; | ||||
|     border-width: 1px; | ||||
|     border-style: solid; | ||||
| @@ -273,6 +275,18 @@ a.menu-title { | ||||
|     left: 2px; | ||||
| } | ||||
|  | ||||
| .roundcube div { | ||||
| 	height:462px; | ||||
| 	width:85%; | ||||
| 	margin-bottom:1%; | ||||
| } | ||||
|  | ||||
| .roundcube object { | ||||
| 	margin-top:1%; | ||||
| 	height:95%; | ||||
| 	width:100%; | ||||
| } | ||||
|  | ||||
|  | ||||
| /*end*/ | ||||
| EOF | ||||
|   | ||||
| @@ -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 = '51.el8.sme';  | ||||
| #Extract the release value | ||||
| if ($VERSION =~ /^(\d+)/) { | ||||
|     $VERSION = $1;  # $1 contains the matched numeric digits | ||||
| @@ -43,6 +46,7 @@ our @EXPORT_OK = qw( | ||||
| 	getNavigation ip_number 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,21 @@ 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 +243,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'}); | ||||
|  | ||||
| @@ -784,6 +803,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) = @_; | ||||
|   | ||||
| @@ -14,7 +14,7 @@ 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"; | ||||
|  | ||||
| # Get some basic info on the current SME install | ||||
|   | ||||
| @@ -12,8 +12,8 @@ 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 { | ||||
| @@ -41,7 +41,7 @@ sub main { | ||||
|  | ||||
|     # get rid of trailing carriage return on last field | ||||
|     chop($dat_datas{ampm}); | ||||
|     $dat_datas{'now_string'} = esmith::FormMagick->gen_locale_date_string(); | ||||
|     $dat_datas{'now_string'} = gen_locale_date_string; | ||||
|     $c->stash(title => $title, modul => $modul, dat_datas => \%dat_datas); | ||||
|     $c->render('datetime'); | ||||
| } ## end sub main | ||||
|   | ||||
| @@ -14,8 +14,6 @@ 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 { | ||||
| @@ -75,4 +73,21 @@ sub do_update { | ||||
|     $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; | ||||
|   | ||||
| @@ -20,9 +20,9 @@ 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 { | ||||
| @@ -30,6 +30,9 @@ sub main { | ||||
|     $c->app->log->info($c->log_req); | ||||
|     my %dom_datas = (); | ||||
|     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; | ||||
|  | ||||
| @@ -54,6 +57,9 @@ sub do_display { | ||||
|     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' ); | ||||
| @@ -121,6 +127,9 @@ sub do_update { | ||||
|     $c->app->log->info($c->log_req); | ||||
|     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) = ''; | ||||
|  | ||||
|   | ||||
| @@ -18,14 +18,17 @@ 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'); | ||||
| 	$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; | ||||
|  | ||||
| @@ -44,6 +47,8 @@ sub do_display { | ||||
|     my $group     = $c->param('group'); | ||||
|     my %grp_datas = (); | ||||
|     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') { | ||||
| @@ -99,6 +104,8 @@ sub do_update { | ||||
|     my $title     = $c->l('grp_FORM_TITLE'); | ||||
|     my ($res, $result) = ''; | ||||
|     my %grp_datas = (); | ||||
| 	$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 = (); | ||||
|   | ||||
| @@ -25,10 +25,11 @@ 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; | ||||
| @@ -36,6 +37,10 @@ sub main { | ||||
|     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 = (); | ||||
|  | ||||
| @@ -68,6 +73,9 @@ sub do_display { | ||||
|     $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; | ||||
|  | ||||
| @@ -112,6 +120,9 @@ sub do_update { | ||||
|     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'); | ||||
|   | ||||
| @@ -18,16 +18,18 @@ 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'; | ||||
|     $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) { | ||||
| @@ -42,6 +44,8 @@ sub do_display { | ||||
|     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' ); | ||||
| @@ -116,6 +120,8 @@ sub do_update { | ||||
|     $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') { | ||||
|         my $name = ($c->param('ibay') || ''); | ||||
|   | ||||
| @@ -1,566 +0,0 @@ | ||||
| # | ||||
| # Generated by SM2Gen version:0.8 Chameleon version:4.5.4 On Python:3.12.3 at 2024-11-16 10:30:16 | ||||
| # | ||||
| # | ||||
| # Routines to be edited by the developer to provide content and validation for parameters | ||||
| # and provison of the control data for table(s) | ||||
| # | ||||
| use esmith::util; | ||||
| use esmith::util::network; | ||||
| use esmith::ConfigDB; | ||||
| use esmith::HostsDB; | ||||
| use esmith::AccountsDB; | ||||
| use esmith::NetworksDB; | ||||
| use esmith::DomainsDB; | ||||
| use constant FALSE => 0; | ||||
| use constant TRUE  => 1; | ||||
|  | ||||
| #The most common ones | ||||
| our $cdb = esmith::ConfigDB->open()   || die("Couldn't open config db"); | ||||
| our $adb = esmith::AccountsDB->open() || die("Couldn't open Accounts db"); | ||||
| our $ndb = esmith::NetworksDB->open() || die("Couldn't open Network db"); | ||||
| our $hdb = esmith::HostsDB->open()    || die("Couldn't open Hosts db"); | ||||
| our $ddb = esmith::DomainsDB->open()  || die("Couldn't open Domains db"); | ||||
|  | ||||
| # Validation routines - parameters for each panel | ||||
| sub validate_LIST { | ||||
|     my $c           = shift; | ||||
|     my $prefix_data = shift;    #Data hash as parameter | ||||
|                                 # Validation for each field | ||||
|     my $ret         = ""; | ||||
|  | ||||
|     if (!TRUE)                  #validate $c->param('InternalIP') | ||||
|     { | ||||
|         $ret .= 'Validation for InternalIP failed'; | ||||
|     } | ||||
|  | ||||
|     if (!TRUE)                  #validate $c->param('ExternalIP') | ||||
|     { | ||||
|         $ret .= 'Validation for ExternalIP failed'; | ||||
|     } | ||||
|  | ||||
|     if (!TRUE)                  #validate $c->param('InternetIP') | ||||
|     { | ||||
|         $ret .= 'Validation for InternetIP failed'; | ||||
|     } | ||||
|  | ||||
|     if (!TRUE)                  #validate $c->param('Issuer') | ||||
|     { | ||||
|         $ret .= 'Validation for Issuer failed'; | ||||
|     } | ||||
|  | ||||
|     if (!TRUE)                  #validate $c->param('Expiry') | ||||
|     { | ||||
|         $ret .= 'Validation for Expiry failed'; | ||||
|     } | ||||
|  | ||||
|     if (!TRUE)                  #validate $c->param('NotBefore') | ||||
|     { | ||||
|         $ret .= 'Validation for NotBefore failed'; | ||||
|     } | ||||
|     if ($ret eq "") { $ret = 'ok'; } | ||||
|     return $ret; | ||||
| } ## end sub validate_LIST | ||||
|  | ||||
| sub validate_PARAMS { | ||||
|     my $c           = shift; | ||||
|     my $prefix_data = shift;    #Data hash as parameter | ||||
|                                 # Validation for each field | ||||
|     my $ret         = ""; | ||||
|  | ||||
|     if (!TRUE)                  #validate $c->param('status') | ||||
|     { | ||||
|         $ret .= 'Validation for status failed'; | ||||
|     } | ||||
|  | ||||
|     if (!TRUE)                  #validate $c->param('hookScript') | ||||
|     { | ||||
|         $ret .= 'Validation for hookScript failed'; | ||||
|     } | ||||
|  | ||||
|     if (!TRUE)                  #validate $c->param('hostOverride') | ||||
|     { | ||||
|         $ret .= 'Validation for hostOverride failed'; | ||||
|     } | ||||
|  | ||||
|     if (!TRUE)                  #validate $c->param('ACCEPT_TERMS') | ||||
|     { | ||||
|         $ret .= 'Validation for ACCEPT_TERMS failed'; | ||||
|     } | ||||
|  | ||||
|     if (!TRUE)                  #validate $c->param('API') | ||||
|     { | ||||
|         $ret .= 'Validation for API failed'; | ||||
|     } | ||||
|  | ||||
|     if (!TRUE)                  #validate $c->param('keysize') | ||||
|     { | ||||
|         $ret .= 'Validation for keysize failed'; | ||||
|     } | ||||
|  | ||||
|     if (!TRUE)                  #validate $c->param('configure') | ||||
|     { | ||||
|         $ret .= 'Validation for configure failed'; | ||||
|     } | ||||
|  | ||||
|     if (!TRUE)                  #validate $c->param('Email') | ||||
|     { | ||||
|         $ret .= 'Validation for Email failed'; | ||||
|     } | ||||
|     if ($ret eq "") { $ret = 'ok'; } | ||||
|     return $ret; | ||||
| } ## end sub validate_PARAMS | ||||
|  | ||||
| sub validate_CHECKALLDOMAINS { | ||||
|     my $c           = shift; | ||||
|     my $prefix_data = shift;    #Data hash as parameter | ||||
|                                 # Validation for each field | ||||
|     my $ret         = ""; | ||||
|  | ||||
|     if (!TRUE)                  #validate $c->param('AllDomainsCheck') | ||||
|     { | ||||
|         $ret .= 'Validation for AllDomainsCheck failed'; | ||||
|     } | ||||
|     if ($ret eq "") { $ret = 'ok'; } | ||||
|     return $ret; | ||||
| } ## end sub validate_CHECKALLDOMAINS | ||||
|  | ||||
| sub validate_CHECKALLENABLEDDOMAINS { | ||||
|     my $c           = shift; | ||||
|     my $prefix_data = shift;    #Data hash as parameter | ||||
|                                 # Validation for each field | ||||
|     my $ret         = ""; | ||||
|  | ||||
|     if (!TRUE)                  #validate $c->param('EnabledDomainsCheck') | ||||
|     { | ||||
|         $ret .= 'Validation for EnabledDomainsCheck failed'; | ||||
|     } | ||||
|     if ($ret eq "") { $ret = 'ok'; } | ||||
|     return $ret; | ||||
| } ## end sub validate_CHECKALLENABLEDDOMAINS | ||||
|  | ||||
| sub validate_CHECKONEDOMAIN { | ||||
|     my $c           = shift; | ||||
|     my $prefix_data = shift;    #Data hash as parameter | ||||
|                                 # Validation for each field | ||||
|     my $ret         = ""; | ||||
|  | ||||
|     if (!TRUE)                  #validate $c->param('OneDomainToCheck') | ||||
|     { | ||||
|         $ret .= 'Validation for OneDomainToCheck failed'; | ||||
|     } | ||||
|  | ||||
|     if (!TRUE)                  #validate $c->param('OneDomainsCheck') | ||||
|     { | ||||
|         $ret .= 'Validation for OneDomainsCheck failed'; | ||||
|     } | ||||
|     if ($ret eq "") { $ret = 'ok'; } | ||||
|     return $ret; | ||||
| } ## end sub validate_CHECKONEDOMAIN | ||||
|  | ||||
| # Get singleton data for each panel | ||||
| sub get_data_for_panel_LIST { | ||||
|  | ||||
|     # Return a hash with the fields required which will be loaded into the shared data | ||||
|     my $c = shift; | ||||
|  | ||||
|     #		my ($reply, $err, $server_cert) = Net::SSLeay::sslcat('localhost', 443, '/'); | ||||
|     #		my $issuer = Net::SSLeay::X509_NAME_oneline(Net::SSLeay::X509_get_issuer_name($server_cert)); | ||||
|     #		my $before = Net::SSLeay::P_ASN1_TIME_get_isotime(Net::SSLeay::X509_get_notBefore($server_cert)); | ||||
|     #		my $expiry = Net::SSLeay::P_ASN1_TIME_get_isotime(Net::SSLeay::X509_get_notAfter($server_cert)); | ||||
|     my %ret = ( | ||||
|         'Data1'      => 'Data for LIST',                                    #Example | ||||
|                                                                             # fields from Inputs in LIST $fields['LIST'] | ||||
|         'InternalIP' => $cdb->get_prop('InternalInterface', 'IPAddress'), | ||||
|         'ExternalIP' => $cdb->get_prop('ExternalInterface', 'IPAddress'), | ||||
|         'InternetIP' => $c->get_my_ip(), | ||||
|         'Issuer'     => '$issuer', | ||||
|         'Expiry'     => '$expiry', | ||||
|         'NotBefore'  => '$before', | ||||
|     ); | ||||
|     return %ret; | ||||
| } ## end sub get_data_for_panel_LIST | ||||
|  | ||||
| sub get_data_for_panel_PARAMS { | ||||
|  | ||||
|     # Return a hash with the fields required which will be loaded into the shared data | ||||
|     my $c   = shift; | ||||
|     my %ret = ( | ||||
|         'Data1'  => 'Data for PARAMS',                                  #Example | ||||
|                                                                         # fields from Inputs in PARAMS $fields['PARAMS'] | ||||
|         'status' => $cdb->get_prop('letsencrypt', 'status', 'disabled'), | ||||
|         'hookScript'   => $cdb->get_prop('letsencrypt', 'hookScript', 'disabled'), | ||||
|         'hostOverride' => $cdb->get_prop('letsencrypt', 'hostOverride', 'disabled'), | ||||
|         'ACCEPT_TERMS' => $cdb->get_prop('letsencrypt', 'ACCEPT_TERMS', ''), | ||||
|         'API'          => $cdb->get_prop('letsencrypt', 'API', '2'), | ||||
|         'keysize'      => $cdb->get_prop('letsencrypt', 'keysize', '4096'), | ||||
|         'configure'    => $cdb->get_prop('letsencrypt', 'configure', 'none'), | ||||
|         'email'        => $cdb->get_prop('letsencrypt', 'email') | ||||
|     ); | ||||
|     return %ret; | ||||
| } ## end sub get_data_for_panel_PARAMS | ||||
|  | ||||
| sub get_data_for_panel_CHECKALLDOMAINS { | ||||
|  | ||||
|     # Return a hash with the fields required which will be loaded into the shared data | ||||
|     my $c   = shift; | ||||
|     my %ret = ( | ||||
|         'Data1' => 'Data for CHECKALLDOMAINS',    #Example | ||||
|                                                   # fields from Inputs in CHECKALLDOMAINS $fields['CHECKALLDOMAINS'] | ||||
|         'AllDomainsCheck' => $c->update_all_domains(), | ||||
|     ); | ||||
|     return %ret; | ||||
| } ## end sub get_data_for_panel_CHECKALLDOMAINS | ||||
|  | ||||
| sub get_data_for_panel_CHECKALLENABLEDDOMAINS { | ||||
|  | ||||
|     # Return a hash with the fields required which will be loaded into the shared data | ||||
|     my $c   = shift; | ||||
|     my %ret = ( | ||||
|         'Data1' => 'Data for CHECKALLENABLEDDOMAINS',    #Example | ||||
|              # fields from Inputs in CHECKALLENABLEDDOMAINS $fields['CHECKALLENABLEDDOMAINS'] | ||||
|         'EnabledDomainsCheck' => $c->update_enabled_domains(), | ||||
|     ); | ||||
|     return %ret; | ||||
| } ## end sub get_data_for_panel_CHECKALLENABLEDDOMAINS | ||||
|  | ||||
| sub get_data_for_panel_CHECKONEDOMAIN { | ||||
|  | ||||
|     # Return a hash with the fields required which will be loaded into the shared data | ||||
|     my $c   = shift; | ||||
|     my %ret = ( | ||||
|         'Data1' => 'Data for CHECKONEDOMAIN',    #Example | ||||
|                                                  # fields from Inputs in CHECKONEDOMAIN $fields['CHECKONEDOMAIN'] | ||||
|         'OneDomainToCheck' => $c->param("CHECKONEDOMAIN"), | ||||
|         'OneDomainsCheck'  => $c->update_one_domain($c->param("CHECKONEDOMAIN")) | ||||
|     ); | ||||
|     return %ret; | ||||
| } ## end sub get_data_for_panel_CHECKONEDOMAIN | ||||
|  | ||||
| # Get control data for table(s) | ||||
| # Define a constant hash for field name mapping | ||||
| use constant DomainList_FIELD_MAPPING => ( | ||||
|     'Table1-Domain name / HOSTNAME' => 'Domain', | ||||
|     'Table1-Brief description'      => 'Description', | ||||
|     'Table1-Content'                => 'Content', | ||||
|     'Table1-LABEL_NAMESERVERS'      => 'Nameservers', | ||||
|     'Table1-LABEL_POINT'            => 'Source-for-Table1-LABEL_POINT', | ||||
|     'Table1-LABEL_LECERT'           => 'letsencryptSSLcert', | ||||
|     'Table1-IS_IN_CERT'             => 'isincert', | ||||
|     'Table1-CHECK'                  => 'Check' | ||||
|  | ||||
|         #'target_field2' => 'source_field2', | ||||
|         # Add more mappings as needed | ||||
| ); | ||||
| use constant TEST_DOMAIN_LIST => ( | ||||
|     { "domain" => "Domain1", "fred" => "fred1", "description" => "Description1" }, | ||||
|     { "domain" => "Domain2", "fred" => "fred2", "description" => "Description2" }, | ||||
|     { "domain" => "Domain3", "fred" => "fred3", "description" => "Description3" }, | ||||
|  | ||||
|     # Add more test entries as needed | ||||
| ); | ||||
|  | ||||
| sub actual_DomainList { | ||||
|     my $c = shift; | ||||
|  | ||||
|     # Actual code for extracting DomainList | ||||
|     my @list = (); | ||||
|  | ||||
|     #	my @rv = Net::SSLeay::X509_get_subjectAltNames($server_cert); | ||||
|     #	foreach my $element (@rv) { | ||||
|     #		 next if $element  =~ /^\d+$/; ; | ||||
|     #		 #print $element . "\n"; | ||||
|     #		 push @list, $element; | ||||
|     #	} | ||||
|     my @data  = (); | ||||
|     my $check = $c->l('Check Domain'); | ||||
|  | ||||
|     for ($ddb->domains) { | ||||
|         my $ns = $_->prop('Nameservers')        || 'internet'; | ||||
|         my $le = $_->prop('letsencryptSSLcert') || 'disabled';    #letsencrypt configure all | ||||
|         my $dname     = $_->key; | ||||
|         my $isincert  = "N"; | ||||
|         my $link      = $c->create_link("letsencryptd", "CHECKONEDOMAIN", ""); | ||||
|         my $checklink = "<a href='" . $link . "&CHECKONEDOMAIN=" . $_->key . "'>" . $check . "</a>"; | ||||
|  | ||||
|         #my $checklink = "<a href=''>check</a>"; | ||||
|         $isincert = "Y" if ($dname ~~ @list); | ||||
|  | ||||
|         # domain | ||||
|         push @data, | ||||
|             { | ||||
|             Domain => $_->key, | ||||
|             $_->props, | ||||
|             letsencryptSSLcert => $le, | ||||
|             isincert           => $isincert, | ||||
|             Check              => $checklink, | ||||
|             Nameservers        => $ns, | ||||
|             }; | ||||
|  | ||||
|         #and hosts | ||||
|         for my $h ($hdb->get_hosts_by_domain($dname)) { | ||||
|             next if $ddb->get($h->key); | ||||
|             next unless ($h->prop('HostType') eq "Self" || $h->prop('HostType') eq "Local"); | ||||
|             $le       = $h->prop('letsencryptSSLcert') || 'disabled';    #letsencrypt configure all | ||||
|             $isincert = "N"; | ||||
|             $isincert = "Y" if ($h->key ~~ @list); | ||||
|             push @data, { | ||||
|                 Domain => "--> " . $h->key, | ||||
|                 $h->props, | ||||
|                 Description => $h->prop('ExternalIP') || $h->prop('InternalIP') || "", | ||||
|                 Content     => $h->prop('HostType'), | ||||
|                 isincert    => $isincert, | ||||
|                 Check       => "",                                                       #$checklink | ||||
|                 Nameservers => $c->l($ns), | ||||
|             }; | ||||
|         } ## end for my $h ($hdb->get_hosts_by_domain...) | ||||
|     } ## end for ($ddb->domains) | ||||
|     return @data; | ||||
| } ## end sub actual_DomainList | ||||
|  | ||||
| sub get_DomainList { | ||||
|  | ||||
|     # Return an array of hashes of the contents for each row and column for DomainList | ||||
|     my $c = shift; | ||||
|     my @source_records | ||||
|         = $c->actual_DomainList();    #TEST_DOMAIN_LIST #Replace by code or call to produce contents of table; | ||||
|     my @transformed_records; | ||||
|     my %Field_Mapping = DomainList_FIELD_MAPPING; | ||||
|  | ||||
|     # Iterate over each record in the source array | ||||
|     for my $source_record (@source_records) { | ||||
|         my %transformed_record; | ||||
|  | ||||
|         # Iterate over each key-value pair in the $Field_Mapping constant | ||||
|         while (my ($target, $source) = each %Field_Mapping) { | ||||
|  | ||||
|             # Check if the source field exists in the source record | ||||
|             if (exists $source_record->{$source}) { | ||||
|  | ||||
|                 # Assign the source field value to the target field in the transformed record | ||||
|                 $transformed_record{$target} = $source_record->{$source}; | ||||
|             } | ||||
|         } ## end while (my ($target, $source...)) | ||||
|  | ||||
|         # Add transformed record to the array if it's not empty | ||||
|         push @transformed_records, \%transformed_record if %transformed_record; | ||||
|     } ## end for my $source_record (...) | ||||
|     return \@transformed_records; | ||||
| } ## end sub get_DomainList | ||||
|  | ||||
| # Return hash with values from row in which link clicked on table | ||||
| sub get_selected_LIST { | ||||
|     my $c             = shift; | ||||
|     my $selected      = shift;    #Parameter is name of selected row. | ||||
|     my $is_new_record = shift;    #Indicates new record required (defaults) | ||||
|     my %ret           = {}; | ||||
|     return $ret; | ||||
| } ## end sub get_selected_LIST | ||||
|  | ||||
| sub get_selected_PARAMS { | ||||
|     my $c             = shift; | ||||
|     my $selected      = shift;    #Parameter is name of selected row. | ||||
|     my $is_new_record = shift;    #Indicates new record required (defaults) | ||||
|     my %ret           = {}; | ||||
|     return $ret; | ||||
| } ## end sub get_selected_PARAMS | ||||
|  | ||||
| sub get_selected_CHECKALLDOMAINS { | ||||
|     my $c             = shift; | ||||
|     my $selected      = shift;    #Parameter is name of selected row. | ||||
|     my $is_new_record = shift;    #Indicates new record required (defaults) | ||||
|     my %ret           = {}; | ||||
|     return $ret; | ||||
| } ## end sub get_selected_CHECKALLDOMAINS | ||||
|  | ||||
| sub get_selected_CHECKALLENABLEDDOMAINS { | ||||
|     my $c             = shift; | ||||
|     my $selected      = shift;    #Parameter is name of selected row. | ||||
|     my $is_new_record = shift;    #Indicates new record required (defaults) | ||||
|     my %ret           = {}; | ||||
|     return $ret; | ||||
| } ## end sub get_selected_CHECKALLENABLEDDOMAINS | ||||
|  | ||||
| sub get_selected_CHECKONEDOMAIN { | ||||
|     my $c             = shift; | ||||
|     my $selected      = shift;    #Parameter is name of selected row. | ||||
|     my $is_new_record = shift;    #Indicates new record required (defaults) | ||||
|     my %ret           = {}; | ||||
|     return $ret; | ||||
| } ## end sub get_selected_CHECKONEDOMAIN | ||||
|  | ||||
| #after sucessful modify or create or whatever and submit then perfom (if the params validate) | ||||
| sub perform_LIST { | ||||
|     my $c           = shift; | ||||
|     my $prefix_data = shift;          #Data hash as parameter | ||||
|     my $ret         = ""; | ||||
|     my $db          = $cdb;           #maybe one of the others | ||||
|     my $dbkey       = 'ChangeThis'; | ||||
|  | ||||
|     if (!TRUE | ||||
|         ) #copy or perform with value: InternalIP e.g. $db->set_prop($dbkey,'InternalIP',$c->param('InternalIP'),type=>'service')) | ||||
|     { | ||||
|         $ret .= 'Perform/save failed for InternalIP'; | ||||
|     } ## end if (!TRUE) | ||||
|  | ||||
|     if (!TRUE | ||||
|         ) #copy or perform with value: ExternalIP e.g. $db->set_prop($dbkey,'ExternalIP',$c->param('ExternalIP'),type=>'service')) | ||||
|     { | ||||
|         $ret .= 'Perform/save failed for ExternalIP'; | ||||
|     } ## end if (!TRUE) | ||||
|  | ||||
|     if (!TRUE | ||||
|         ) #copy or perform with value: InternetIP e.g. $db->set_prop($dbkey,'InternetIP',$c->param('InternetIP'),type=>'service')) | ||||
|     { | ||||
|         $ret .= 'Perform/save failed for InternetIP'; | ||||
|     } ## end if (!TRUE) | ||||
|  | ||||
|     if (!TRUE | ||||
|         )   #copy or perform with value: Issuer e.g. $db->set_prop($dbkey,'Issuer',$c->param('Issuer'),type=>'service')) | ||||
|     { | ||||
|         $ret .= 'Perform/save failed for Issuer'; | ||||
|     } ## end if (!TRUE) | ||||
|  | ||||
|     if (!TRUE | ||||
|         )   #copy or perform with value: Expiry e.g. $db->set_prop($dbkey,'Expiry',$c->param('Expiry'),type=>'service')) | ||||
|     { | ||||
|         $ret .= 'Perform/save failed for Expiry'; | ||||
|     } ## end if (!TRUE) | ||||
|  | ||||
|     if (!TRUE | ||||
|         ) #copy or perform with value: NotBefore e.g. $db->set_prop($dbkey,'NotBefore',$c->param('NotBefore'),type=>'service')) | ||||
|     { | ||||
|         $ret .= 'Perform/save failed for NotBefore'; | ||||
|     } ## end if (!TRUE) | ||||
|     if ($ret eq "") { $ret = 'ok'; } | ||||
|     return $ret; | ||||
| } ## end sub perform_LIST | ||||
|  | ||||
| sub perform_PARAMS { | ||||
|     my $c           = shift; | ||||
|     my $prefix_data = shift;           #Data hash as parameter | ||||
|     my $ret         = ""; | ||||
|     my $db          = $cdb;            #maybe one of the others | ||||
|     my $dbkey       = 'letsencrypt'; | ||||
|  | ||||
| # To make it write to DB as comment, delete this (regex) string in each if statement "TRUE\) \#copy or perform with value: .* e.g." | ||||
|     if (!$db->set_prop($dbkey, 'status', $c->param('status'), type => 'service')) { | ||||
|         $ret .= 'Perform/save failed for status'; | ||||
|     } | ||||
|  | ||||
|     if (!$db->set_prop($dbkey, 'hookScript', $c->param('hookScript'), type => 'service')) { | ||||
|         $ret .= 'Perform/save failed for hookScript'; | ||||
|     } | ||||
|  | ||||
|     if (!$db->set_prop($dbkey, 'hostOverride', $c->param('hostOverride'), type => 'service')) { | ||||
|         $ret .= 'Perform/save failed for hostOverride'; | ||||
|     } | ||||
|  | ||||
|     if (!$db->set_prop($dbkey, 'ACCEPT_TERMS', $c->param('ACCEPT_TERMS'), type => 'service')) { | ||||
|         $ret .= 'Perform/save failed for ACCEPT_TERMS'; | ||||
|     } | ||||
|     if (!$db->set_prop($dbkey, 'API', $c->param('API'), type => 'service')) { $ret .= 'Perform/save failed for API'; } | ||||
|  | ||||
|     if (!$db->set_prop($dbkey, 'keysize', $c->param('keysize'), type => 'service')) { | ||||
|         $ret .= 'Perform/save failed for keysize'; | ||||
|     } | ||||
|  | ||||
|     if (!$db->set_prop($dbkey, 'configure', $c->param('configure'), type => 'service')) { | ||||
|         $ret .= 'Perform/save failed for configure'; | ||||
|     } | ||||
|  | ||||
|     if (!$db->set_prop($dbkey, 'email', $c->param('email'), type => 'service')) { | ||||
|         $ret .= 'Perform/save failed for email'; | ||||
|     } | ||||
|     if ($ret eq "") { $ret = 'ok'; } | ||||
|     return $ret; | ||||
| } ## end sub perform_PARAMS | ||||
|  | ||||
| sub perform_CHECKALLDOMAINS { | ||||
|     my $c           = shift; | ||||
|     my $prefix_data = shift;          #Data hash as parameter | ||||
|     my $ret         = ""; | ||||
|     my $db          = $cdb;           #maybe one of the others | ||||
|     my $dbkey       = 'ChangeThis'; | ||||
|  | ||||
|     if (!TRUE | ||||
|         ) #copy or perform with value: AllDomainsCheck e.g. $db->set_prop($dbkey,'AllDomainsCheck',$c->param('AllDomainsCheck'),type=>'service')) | ||||
|     { | ||||
|         $ret .= 'Perform/save failed for AllDomainsCheck'; | ||||
|     } ## end if (!TRUE) | ||||
|     if ($ret eq "") { $ret = 'ok'; } | ||||
|     return $ret; | ||||
| } ## end sub perform_CHECKALLDOMAINS | ||||
|  | ||||
| sub perform_CHECKALLENABLEDDOMAINS { | ||||
|     my $c           = shift; | ||||
|     my $prefix_data = shift;          #Data hash as parameter | ||||
|     my $ret         = ""; | ||||
|     my $db          = $cdb;           #maybe one of the others | ||||
|     my $dbkey       = 'ChangeThis'; | ||||
|  | ||||
|     if (!TRUE | ||||
|         ) #copy or perform with value: EnabledDomainsCheck e.g. $db->set_prop($dbkey,'EnabledDomainsCheck',$c->param('EnabledDomainsCheck'),type=>'service')) | ||||
|     { | ||||
|         $ret .= 'Perform/save failed for EnabledDomainsCheck'; | ||||
|     } ## end if (!TRUE) | ||||
|     if ($ret eq "") { $ret = 'ok'; } | ||||
|     return $ret; | ||||
| } ## end sub perform_CHECKALLENABLEDDOMAINS | ||||
|  | ||||
| sub perform_CHECKONEDOMAIN { | ||||
|     my $c           = shift; | ||||
|     my $prefix_data = shift;          #Data hash as parameter | ||||
|     my $ret         = ""; | ||||
|     my $db          = $cdb;           #maybe one of the others | ||||
|     my $dbkey       = 'ChangeThis'; | ||||
|  | ||||
|     if (!TRUE | ||||
|         ) #copy or perform with value: OneDomainToCheck e.g. $db->set_prop($dbkey,'OneDomainToCheck',$c->param('OneDomainToCheck'),type=>'service')) | ||||
|     { | ||||
|         $ret .= 'Perform/save failed for OneDomainToCheck'; | ||||
|     } ## end if (!TRUE) | ||||
|  | ||||
|     if (!TRUE | ||||
|         ) #copy or perform with value: OneDomainsCheck e.g. $db->set_prop($dbkey,'OneDomainsCheck',$c->param('OneDomainsCheck'),type=>'service')) | ||||
|     { | ||||
|         $ret .= 'Perform/save failed for OneDomainsCheck'; | ||||
|     } ## end if (!TRUE) | ||||
|     if ($ret eq "") { $ret = 'ok'; } | ||||
|     return $ret; | ||||
| } ## end sub perform_CHECKONEDOMAIN | ||||
|  | ||||
| sub create_link { | ||||
|  | ||||
|     # WIP | ||||
|     my ($c, $route, $panel, $index) = @_; | ||||
|     my $link = "$route?trt=$panel&Selected=$index"; | ||||
|     return $link; | ||||
| } ## end sub create_link | ||||
|  | ||||
| sub get_my_ip { | ||||
|     my ($self, $item, $prop, $default) = @_; | ||||
|     my $output = `/usr/sbin/e-smith/getmyip`; | ||||
|     return $output || "IP"; | ||||
| } ## end sub get_my_ip | ||||
|  | ||||
| sub update_one_domain { | ||||
|     my ($self, $domain) = @_; | ||||
|     return "$domain not domain" unless ($ddb->get($domain) || $hdb->get($domain)); | ||||
|     ($domain) = ($domain =~ /([\w\p{L}.]+)/); | ||||
|     my $output = `/etc/e-smith/events/actions/letsencrypt-setdomains " " $domain `; | ||||
|     return $output || "-empty-"; | ||||
| } ## end sub update_one_domain | ||||
|  | ||||
| sub update_all_domains { | ||||
|     my $self   = shift; | ||||
|     my $output = `/etc/e-smith/events/actions/letsencrypt-setdomains "" "" all `; | ||||
|     return $output || "-empty-"; | ||||
| } ## end sub update_all_domains | ||||
|  | ||||
| sub update_enabled_domains { | ||||
|     my $self   = shift; | ||||
|     my $output = `/etc/e-smith/events/actions/letsencrypt-setdomains "" "" enabled `; | ||||
|     return $output || "-empty-"; | ||||
| } ## end sub update_enabled_domains | ||||
| 1; | ||||
| @@ -1,448 +0,0 @@ | ||||
| package SrvMngr::Controller::Letsencrypt; | ||||
| # | ||||
| # Generated by SM2Gen version:0.8 Chameleon version:4.5.4 On Python:3.12.3 at 2024-12-01 15:22:43 | ||||
| # | ||||
| #---------------------------------------------------------------------- | ||||
| # heading     : Network | ||||
| # description : Letsencrypt certificate | ||||
| # navigation  : 6000 6600 | ||||
| # | ||||
| # name : letsencrypt,    method : get,   url : /letsencrypt,   ctlact : Letsencrypt#main | ||||
| # name : letsencryptu,   method : post,  url : /letsencryptu,  ctlact : Letsencrypt#do_update | ||||
| # name : letsencryptd,   method : get,   url : /letsencryptd,  ctlact : Letsencrypt#do_display | ||||
| # | ||||
| # routes : end | ||||
| # | ||||
| # Documentation: https://wiki.contribs.org/Letsencrypt | ||||
| #---------------------------------------------------------------------- | ||||
| # | ||||
| # Scheme of things: | ||||
| # | ||||
| # TBA!! | ||||
| use strict; | ||||
| use warnings; | ||||
| use Mojo::Base 'Mojolicious::Controller'; | ||||
| use constant FALSE => 0; | ||||
| use constant TRUE  => 1; | ||||
| use Locale::gettext; | ||||
| use SrvMngr::I18N; | ||||
| use SrvMngr qw(theme_list init_session); | ||||
| use Data::Dumper; | ||||
| use esmith::util; | ||||
| use esmith::util::network; | ||||
| use esmith::ConfigDB; | ||||
| use esmith::AccountsDB; | ||||
| use esmith::NetworksDB; | ||||
| use esmith::HostsDB; | ||||
| use esmith::DomainsDB; | ||||
| require | ||||
|     '/usr/share/smanager/lib/SrvMngr/Controller/Letsencrypt-Custom.pm';   #The code that is to be added by the developer | ||||
|  | ||||
| sub main { | ||||
|     # | ||||
|     # Initial entry - route is "/<whatever>" | ||||
|     # | ||||
|     #set initial panel | ||||
|     #for initial panel: | ||||
|     #Specifiy panel to enter | ||||
|     #load up _data hash with DB fields | ||||
|     #load up stash with pointer(s) to control fields hash(= get-)) | ||||
|     #and a pointer to the prefix_data hash | ||||
|     #render initial panel | ||||
|     my $c = shift; | ||||
|     $c->app->log->info($c->log_req); | ||||
|  | ||||
|     #The most common ones | ||||
|     my $cdb = esmith::ConfigDB->open()   || die("Couldn't open config db"); | ||||
|     my $adb = esmith::AccountsDB->open() || die("Couldn't open Accounts db"); | ||||
|     my $ndb = esmith::NetworksDB->open() || die("Couldn't open Network db"); | ||||
|     my $hdb = esmith::HostsDB->open()    || die("Couldn't open Hosts db"); | ||||
|     my $ddb = esmith::DomainsDB->open()  || die("Couldn't open Domains db"); | ||||
|     my %lets_data = (); | ||||
|     my $title     = $c->l('lets_Letsencrypt_certificate'); | ||||
|     my $modul     = ''; | ||||
|     $lets_data{'trt'} = 'LIST'; | ||||
|  | ||||
|     #Load any DB entries into the <prefix>_data area so as they are preset in the form | ||||
|     # which DB - this only really works if the initial panel is a PARAMS type panel and not a TABLE | ||||
|     my $db = $cdb;    #pickup local or global db or Default to config | ||||
|     $c->do_display($lets_data{'trt'}); | ||||
| } ## end sub main | ||||
|  | ||||
| # Post request with params - submit from the form | ||||
| sub do_update { | ||||
|     # | ||||
|     # Return after submit pushed on panel (this is a post) - route is "/<whatever>u" | ||||
|     # parameters in the params hash. | ||||
|     # | ||||
|     #load up all params into prefix_data hash: | ||||
|     #By panel (series of if statements - only one executed): | ||||
|     #call validate-PANEL() - return ret = ok or error message | ||||
|     #if validation not ok: | ||||
|     #render back to current panel with error message in stash | ||||
|     #otherwise: | ||||
|     #By panel (series of if statements - only one executed): | ||||
|     #do whatever is required: call perform-PANEL() - return "ok" or Error Message | ||||
|     #call signal-event for any global actions specified (check it exists - error and continue?) | ||||
|     #if action smeserver-<whatever>-update exists | ||||
|     #signal_event smeserver-<whatever>-update | ||||
|     #call signal-event for any specific actions for thids panel (check it exists first - error and continue) | ||||
|     #set success in stash | ||||
|     #if no "nextpanel" entry: | ||||
|     #set firstpanel | ||||
|     #else | ||||
|     #set nextpanel | ||||
|     #call render | ||||
|     my $c = shift; | ||||
|     $c->app->log->info($c->log_req); | ||||
|     my $modul = ''; | ||||
|  | ||||
|     #The most common ones - you might want to comment out any not used. | ||||
|     my $cdb = esmith::ConfigDB->open()   || die("Couldn't open config db"); | ||||
|     my $adb = esmith::AccountsDB->open() || die("Couldn't open Accounts db"); | ||||
|     my $ndb = esmith::NetworksDB->open() || die("Couldn't open Network db"); | ||||
|     my $hdb = esmith::HostsDB->open()    || die("Couldn't open Hosts db"); | ||||
|     my $ddb = esmith::DomainsDB->open()  || die("Couldn't open Domains db"); | ||||
|     my %lets_data = (); | ||||
|     my $title     = $c->l('lets_Letsencrypt_certificate'); | ||||
|  | ||||
|     # Accessing all POST parameters | ||||
|     my %params = $c->req->params->to_hash; | ||||
|  | ||||
|     # Get number of POST parameters | ||||
|     my $num_params = keys %params; | ||||
|  | ||||
|     #Params are available in the hash "params" - copy to the prefix_data hash | ||||
|     #while (my ($key, $value) = each %{$c->req->params->to_hash}) { | ||||
|     #    $lets_data{$key} = $value; | ||||
|     #} | ||||
|     # the value of trt will tell you which panel has returned | ||||
|     my $trt = $c->param('trt') || 'LIST';    #hidden control on every form. | ||||
|     my $ret = 'ok'; | ||||
|  | ||||
|     #Validate the parameters in a custom sub one for each panel (although only one of these will be executed) | ||||
|     my $thispanel; | ||||
|  | ||||
|     if ($trt eq 'LIST') { | ||||
|  | ||||
|         #Validate form parameters for panel LIST | ||||
|         $ret       = $c->validate_LIST(\%lets_data); | ||||
|         $thispanel = 'LIST'; | ||||
|     } ## end if ($trt eq 'LIST') | ||||
|  | ||||
|     if ($trt eq 'PARAMS') { | ||||
|  | ||||
|         #Validate form parameters for panel PARAMS | ||||
|         $ret       = $c->validate_PARAMS(\%lets_data); | ||||
|         $thispanel = 'PARAMS'; | ||||
|     } ## end if ($trt eq 'PARAMS') | ||||
|  | ||||
|     if ($trt eq 'CHECKALLDOMAINS') { | ||||
|  | ||||
|         #Validate form parameters for panel CHECKALLDOMAINS | ||||
|         $ret       = $c->validate_CHECKALLDOMAINS(\%lets_data); | ||||
|         $thispanel = 'CHECKALLDOMAINS'; | ||||
|     } ## end if ($trt eq 'CHECKALLDOMAINS') | ||||
|  | ||||
|     if ($trt eq 'CHECKALLENABLEDDOMAINS') { | ||||
|  | ||||
|         #Validate form parameters for panel CHECKALLENABLEDDOMAINS | ||||
|         $ret       = $c->validate_CHECKALLENABLEDDOMAINS(\%lets_data); | ||||
|         $thispanel = 'CHECKALLENABLEDDOMAINS'; | ||||
|     } ## end if ($trt eq 'CHECKALLENABLEDDOMAINS') | ||||
|  | ||||
|     if ($trt eq 'CHECKONEDOMAIN') { | ||||
|  | ||||
|         #Validate form parameters for panel CHECKONEDOMAIN | ||||
|         $ret       = $c->validate_CHECKONEDOMAIN(\%lets_data); | ||||
|         $thispanel = 'CHECKONEDOMAIN'; | ||||
|     } ## end if ($trt eq 'CHECKONEDOMAIN') | ||||
|  | ||||
|     if ($ret ne "ok") { | ||||
|         $c->do_display($thispanel); | ||||
|     } else { | ||||
|  | ||||
|         #Do whatever is needed, including writing values to the DB | ||||
|         if ($trt eq 'LIST') { | ||||
|  | ||||
|             #do whatever is required ... | ||||
|             $ret = $c->perform_LIST(\%lets_data); | ||||
|  | ||||
|             if ($ret ne "ok") { | ||||
|  | ||||
|                 # return to the panel with error message | ||||
|                 $c->stash(error => $c->l($ret)); | ||||
|                 $c->stash( | ||||
|                     title     => $title, | ||||
|                     modul     => $modul, | ||||
|                     lets_data => \%lets_data | ||||
|                 ); | ||||
|                 $c->render(template => "letsencrypt"); | ||||
|             } else { | ||||
|                 $c->stash(success => $c->l('lets_LIST_panel_action_was_successful')) | ||||
|                     ;    #A bit bland - edit it in the lex file | ||||
|             } | ||||
|         } ## end if ($trt eq 'LIST') | ||||
|  | ||||
|         if ($trt eq 'PARAMS') { | ||||
|  | ||||
|             #do whatever is required ... | ||||
|             $ret = $c->perform_PARAMS(\%lets_data); | ||||
|  | ||||
|             if ($ret ne "ok") { | ||||
|  | ||||
|                 # return to the panel with error message | ||||
|                 $c->stash(error => $c->l($ret)); | ||||
|                 $c->stash( | ||||
|                     title     => $title, | ||||
|                     modul     => $modul, | ||||
|                     lets_data => \%lets_data | ||||
|                 ); | ||||
|                 $c->render(template => "letsencrypt"); | ||||
|             } else { | ||||
|                 $c->stash(success => $c->l('lets_PARAMS_panel_action_was_successful')) | ||||
|                     ;    #A bit bland - edit it in the lex file | ||||
|             } | ||||
|         } ## end if ($trt eq 'PARAMS') | ||||
|  | ||||
|         if ($trt eq 'CHECKALLDOMAINS') { | ||||
|  | ||||
|             #do whatever is required ... | ||||
|             $ret = $c->perform_CHECKALLDOMAINS(\%lets_data); | ||||
|  | ||||
|             if ($ret ne "ok") { | ||||
|  | ||||
|                 # return to the panel with error message | ||||
|                 $c->stash(error => $c->l($ret)); | ||||
|                 $c->stash( | ||||
|                     title     => $title, | ||||
|                     modul     => $modul, | ||||
|                     lets_data => \%lets_data | ||||
|                 ); | ||||
|                 $c->render(template => "letsencrypt"); | ||||
|             } else { | ||||
|                 $c->stash(success => $c->l('lets_CHECKALLDOMAINS_panel_action_was_successful')) | ||||
|                     ;    #A bit bland - edit it in the lex file | ||||
|             } | ||||
|         } ## end if ($trt eq 'CHECKALLDOMAINS') | ||||
|  | ||||
|         if ($trt eq 'CHECKALLENABLEDDOMAINS') { | ||||
|  | ||||
|             #do whatever is required ... | ||||
|             $ret = $c->perform_CHECKALLENABLEDDOMAINS(\%lets_data); | ||||
|  | ||||
|             if ($ret ne "ok") { | ||||
|  | ||||
|                 # return to the panel with error message | ||||
|                 $c->stash(error => $c->l($ret)); | ||||
|                 $c->stash( | ||||
|                     title     => $title, | ||||
|                     modul     => $modul, | ||||
|                     lets_data => \%lets_data | ||||
|                 ); | ||||
|                 $c->render(template => "letsencrypt"); | ||||
|             } else { | ||||
|                 $c->stash(success => $c->l('lets_CHECKALLENABLEDDOMAINS_panel_action_was_successful')) | ||||
|                     ;    #A bit bland - edit it in the lex file | ||||
|             } | ||||
|         } ## end if ($trt eq 'CHECKALLENABLEDDOMAINS') | ||||
|  | ||||
|         if ($trt eq 'CHECKONEDOMAIN') { | ||||
|  | ||||
|             #do whatever is required ... | ||||
|             $ret = $c->perform_CHECKONEDOMAIN(\%lets_data); | ||||
|  | ||||
|             if ($ret ne "ok") { | ||||
|  | ||||
|                 # return to the panel with error message | ||||
|                 $c->stash(error => $c->l($ret)); | ||||
|                 $c->stash( | ||||
|                     title     => $title, | ||||
|                     modul     => $modul, | ||||
|                     lets_data => \%lets_data | ||||
|                 ); | ||||
|                 $c->render(template => "letsencrypt"); | ||||
|             } else { | ||||
|                 $c->stash(success => $c->l('lets_CHECKONEDOMAIN_panel_action_was_successful')) | ||||
|                     ;    #A bit bland - edit it in the lex file | ||||
|             } | ||||
|         } ## end if ($trt eq 'CHECKONEDOMAIN') | ||||
|  | ||||
|         # and call any signal-events needed | ||||
|         #TBD | ||||
|         # Setup shared data and call panel | ||||
|         if ('none' eq 'none') { | ||||
|             $lets_data{'trt'} = 'LIST'; | ||||
|         } else { | ||||
|             $lets_data{'trt'} = 'none'; | ||||
|         } | ||||
|         $c->do_display($lets_data{'trt'}); | ||||
|     } ## end else [ if ($ret ne "ok") ] | ||||
| } ## end sub do_update | ||||
|  | ||||
| sub do_display { | ||||
|     # | ||||
|     # Return after link clicked in table (this is a get) - route is "/<whatever>d" | ||||
|     # Expects ?trt=PANEL&selected="TableRowName" plus any other required | ||||
|     # | ||||
|     # OR it maybe a post from the main panel to add a new record | ||||
|     # | ||||
|     #load up all supplied params into prefix_data hash | ||||
|     #call get-selected-PANEL() - returns hash of all relevent parameters | ||||
|     #load up returned hash into prefix_data | ||||
|     #render - to called panel | ||||
|     my ($c, $trt) = @_; | ||||
|     $c->app->log->info($c->log_req); | ||||
|  | ||||
|     #The most common ones - you might want to comment out any not used. | ||||
|     my $cdb = esmith::ConfigDB->open()   || die("Couldn't open config db"); | ||||
|     my $adb = esmith::AccountsDB->open() || die("Couldn't open Accounts db"); | ||||
|     my $ndb = esmith::NetworksDB->open() || die("Couldn't open Network db"); | ||||
|     my $hdb = esmith::HostsDB->open()    || die("Couldn't open Hosts db"); | ||||
|     my $ddb = esmith::DomainsDB->open()  || die("Couldn't open Domains db"); | ||||
|     my %lets_data = (); | ||||
|     my $title     = $c->l('lets_Letsencrypt_certificate'); | ||||
|     my $modul     = ""; | ||||
|  | ||||
|     # Accessing all parameters | ||||
|     my %params = $c->req->params->to_hash; | ||||
|  | ||||
|     # Get number of parameters | ||||
|     my $num_params = keys %params; | ||||
|  | ||||
|     #Tag as Post or Get (ie. create new entry or edit existing one | ||||
|     my $is_new_record = ($c->req->method() eq 'POST'); | ||||
|  | ||||
|     #Params are available in the hash "params" - copy to the prefix_data hash | ||||
|     #while (my ($key, $value) = each %{$c->req->params->to_hash}) { | ||||
|     #    $lets_data{$key} = $value; | ||||
|     #} | ||||
|     # the value of trt will tell you which panel has returned | ||||
|     if (!$trt) { | ||||
|         $trt = $c->param('trt') || 'LIST';    #Indicates where to go now | ||||
|     } | ||||
|  | ||||
|     # Now add in the params from the selected row from the table | ||||
|     my %selectedrow; | ||||
|  | ||||
|     if ($trt eq 'LIST') { | ||||
|  | ||||
|         #Validate Get selected row (if applicable)  LIST | ||||
|         %selectedrow = $c->get_selected_LIST($lets_data{'Selected'}, $is_new_record); | ||||
|     } ## end if ($trt eq 'LIST') | ||||
|  | ||||
|     if ($trt eq 'PARAMS') { | ||||
|  | ||||
|         #Validate Get selected row (if applicable)  PARAMS | ||||
|         %selectedrow = $c->get_selected_PARAMS($lets_data{'Selected'}, $is_new_record); | ||||
|     } ## end if ($trt eq 'PARAMS') | ||||
|  | ||||
|     if ($trt eq 'CHECKALLDOMAINS') { | ||||
|  | ||||
|         #Validate Get selected row (if applicable)  CHECKALLDOMAINS | ||||
|         %selectedrow = $c->get_selected_CHECKALLDOMAINS($lets_data{'Selected'}, $is_new_record); | ||||
|     } ## end if ($trt eq 'CHECKALLDOMAINS') | ||||
|  | ||||
|     if ($trt eq 'CHECKALLENABLEDDOMAINS') { | ||||
|  | ||||
|         #Validate Get selected row (if applicable)  CHECKALLENABLEDDOMAINS | ||||
|         %selectedrow = $c->get_selected_CHECKALLENABLEDDOMAINS($lets_data{'Selected'}, $is_new_record); | ||||
|     } ## end if ($trt eq 'CHECKALLENABLEDDOMAINS') | ||||
|  | ||||
|     if ($trt eq 'CHECKONEDOMAIN') { | ||||
|  | ||||
|         #Validate Get selected row (if applicable)  CHECKONEDOMAIN | ||||
|         %selectedrow = $c->get_selected_CHECKONEDOMAIN($lets_data{'Selected'}, $is_new_record); | ||||
|     } ## end if ($trt eq 'CHECKONEDOMAIN') | ||||
|  | ||||
|     #Copy in the selected row params to the prefix_data hash to pass to the panel | ||||
|     while (my ($key, $value) = each %selectedrow) { | ||||
|         $lets_data{$key} = $value; | ||||
|     } | ||||
|  | ||||
|     # Where to go now | ||||
|     $lets_data{'trt'} = $trt; | ||||
|  | ||||
|     # Set up other shared data according to the panel to go to | ||||
|     if ($trt eq 'LIST') { | ||||
|  | ||||
|         # pickup any other contents needed and load them into hash shared with panel | ||||
|         my %returned_hash; | ||||
|  | ||||
|         # subroutine returns a hash directly | ||||
|         %returned_hash = $c->get_data_for_panel_LIST(); | ||||
|  | ||||
|         # Copy each key-value pair from the returned hash to the prefix data hash | ||||
|         while (my ($key, $value) = each %returned_hash) { | ||||
|             $lets_data{$key} = $value; | ||||
|         } | ||||
|     } ## end if ($trt eq 'LIST') | ||||
|  | ||||
|     if ($trt eq 'PARAMS') { | ||||
|  | ||||
|         # pickup any other contents needed and load them into hash shared with panel | ||||
|         my %returned_hash; | ||||
|  | ||||
|         # subroutine returns a hash directly | ||||
|         %returned_hash = $c->get_data_for_panel_PARAMS(); | ||||
|  | ||||
|         # Copy each key-value pair from the returned hash to the prefix data hash | ||||
|         while (my ($key, $value) = each %returned_hash) { | ||||
|             $lets_data{$key} = $value; | ||||
|         } | ||||
|     } ## end if ($trt eq 'PARAMS') | ||||
|  | ||||
|     if ($trt eq 'CHECKALLDOMAINS') { | ||||
|  | ||||
|         # pickup any other contents needed and load them into hash shared with panel | ||||
|         my %returned_hash; | ||||
|  | ||||
|         # subroutine returns a hash directly | ||||
|         %returned_hash = $c->get_data_for_panel_CHECKALLDOMAINS(); | ||||
|  | ||||
|         # Copy each key-value pair from the returned hash to the prefix data hash | ||||
|         while (my ($key, $value) = each %returned_hash) { | ||||
|             $lets_data{$key} = $value; | ||||
|         } | ||||
|     } ## end if ($trt eq 'CHECKALLDOMAINS') | ||||
|  | ||||
|     if ($trt eq 'CHECKALLENABLEDDOMAINS') { | ||||
|  | ||||
|         # pickup any other contents needed and load them into hash shared with panel | ||||
|         my %returned_hash; | ||||
|  | ||||
|         # subroutine returns a hash directly | ||||
|         %returned_hash = $c->get_data_for_panel_CHECKALLENABLEDDOMAINS(); | ||||
|  | ||||
|         # Copy each key-value pair from the returned hash to the prefix data hash | ||||
|         while (my ($key, $value) = each %returned_hash) { | ||||
|             $lets_data{$key} = $value; | ||||
|         } | ||||
|     } ## end if ($trt eq 'CHECKALLENABLEDDOMAINS') | ||||
|  | ||||
|     if ($trt eq 'CHECKONEDOMAIN') { | ||||
|  | ||||
|         # pickup any other contents needed and load them into hash shared with panel | ||||
|         my %returned_hash; | ||||
|  | ||||
|         # subroutine returns a hash directly | ||||
|         %returned_hash = $c->get_data_for_panel_CHECKONEDOMAIN(); | ||||
|  | ||||
|         # Copy each key-value pair from the returned hash to the prefix data hash | ||||
|         while (my ($key, $value) = each %returned_hash) { | ||||
|             $lets_data{$key} = $value; | ||||
|         } | ||||
|     } ## end if ($trt eq 'CHECKONEDOMAIN') | ||||
|  | ||||
|     # and table control fields | ||||
|     $c->stash(DomainList => $c->get_DomainList()); | ||||
|  | ||||
|     # Data for panel | ||||
|     $c->stash( | ||||
|         title     => $title, | ||||
|         modul     => $modul, | ||||
|         lets_data => \%lets_data | ||||
|     ); | ||||
|     $c->render(template => "letsencrypt"); | ||||
| } ## end sub do_display | ||||
| 1; | ||||
| @@ -17,8 +17,9 @@ 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; | ||||
| @@ -26,6 +27,7 @@ sub main { | ||||
|     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; | ||||
| @@ -47,6 +49,7 @@ sub do_display { | ||||
|     $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'); | ||||
| @@ -81,7 +84,7 @@ sub do_display { | ||||
|     if ($trt eq 'DEL1') { | ||||
|  | ||||
|         #After Remove clicked on Delete network panel | ||||
|         my $network_db   = esmith::NetworksDB->open() || die("Failed to open Networkdb-1"); | ||||
|         $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"); | ||||
| @@ -135,7 +138,7 @@ sub do_display { | ||||
|  | ||||
| sub remove_network { | ||||
|     my $network      = shift; | ||||
|     my $network_db   = esmith::NetworksDB->open(); | ||||
|     $network_db   = esmith::NetworksDB->open(); | ||||
|     my $record       = $network_db->get($network); | ||||
|     my $delete_hosts = shift; | ||||
|  | ||||
| @@ -265,3 +268,4 @@ sub add_network { | ||||
|         ); | ||||
|     } ## end else [ if ($totalHosts == 1) ] | ||||
| } ## end sub add_network | ||||
| 1; | ||||
|   | ||||
| @@ -18,12 +18,11 @@ use SrvMngr qw(theme_list init_session); | ||||
| #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; | ||||
| @@ -35,6 +34,9 @@ sub main { | ||||
|     $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; | ||||
| @@ -55,6 +57,9 @@ sub do_display { | ||||
|     $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'); | ||||
| @@ -207,8 +212,8 @@ 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; | ||||
|     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) { | ||||
|  | ||||
| @@ -354,8 +359,8 @@ sub validate_destination_host { | ||||
|     my $c     = shift; | ||||
|     my $dhost = $c->param('dhost'); | ||||
|     $dhost =~ s/^\s+|\s+$//g; | ||||
|     my $localip = $db->get_prop('InternalInterface', 'IPAddress'); | ||||
|     my $external_ip = $db->get_prop('ExternalInterface', 'IPAddress') || $localip; | ||||
|     my $localip = $cdb->get_prop('InternalInterface', 'IPAddress'); | ||||
|     my $external_ip = $cdb->get_prop('ExternalInterface', 'IPAddress') || $localip; | ||||
|  | ||||
|     if ($dhost =~ /^(localhost|127.0.0.1|$localip|$external_ip)$/i) { | ||||
|  | ||||
| @@ -363,7 +368,7 @@ sub validate_destination_host { | ||||
|         $c->param(-name => 'dhost', -value => 'localhost'); | ||||
|         return (ret => 'pf_SUCCESS'); | ||||
|     } ## end if ($dhost =~ /^(localhost|127.0.0.1|$localip|$external_ip)$/i) | ||||
|     my $systemmode = $db->get_value('SystemMode'); | ||||
|     my $systemmode = $cdb->get_value('SystemMode'); | ||||
|  | ||||
|     if ($systemmode eq 'serveronly') { | ||||
|         return (ret => 'pf_IN_SERVERONLY'); | ||||
|   | ||||
| @@ -14,14 +14,15 @@ 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'); | ||||
| 	$adb = esmith::AccountsDB->open || die "Couldn't open accounts db"; | ||||
|     $prt_datas{'trt'} = 'LIST'; | ||||
|     my @printerDrivers; | ||||
|  | ||||
| @@ -37,6 +38,7 @@ sub do_display { | ||||
|     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' ); | ||||
| @@ -77,6 +79,7 @@ sub do_update { | ||||
|     my $trt       = ($c->param('trt') || 'LIST'); | ||||
|     my %prt_datas = (); | ||||
|     my $title     = $c->l('prt_FORM_TITLE'); | ||||
|    	$adb = esmith::AccountsDB->open || die "Couldn't open accounts db"; | ||||
|     $prt_datas{'trt'} = $trt; | ||||
|     my ($res, $result) = ''; | ||||
|  | ||||
|   | ||||
| @@ -20,8 +20,9 @@ use SrvMngr qw(theme_list init_session); | ||||
| 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; | ||||
| @@ -31,6 +32,8 @@ sub main { | ||||
|     my $notif     = ''; | ||||
|     $pse_datas{trt} = 'LST'; | ||||
|     my @pseudonyms; | ||||
| 	#$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(); | ||||
| @@ -47,7 +50,9 @@ sub do_display { | ||||
|     my $pseudonym = $c->param('pseudonym') || ''; | ||||
|     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') { | ||||
|  | ||||
| @@ -92,6 +97,8 @@ sub do_update { | ||||
|     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) = ''; | ||||
|   | ||||
| @@ -10,7 +10,7 @@ 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); | ||||
|   | ||||
| @@ -11,22 +11,21 @@ package SrvMngr::Controller::Quota; | ||||
| 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'); | ||||
| 	$adb = esmith::AccountsDB->open || die "Couldn't open accounts db"; | ||||
|     $quo_datas{'trt'} = 'LIST'; | ||||
|     my @userAccounts; | ||||
|  | ||||
| @@ -45,6 +44,7 @@ sub do_display { | ||||
|     $trt = 'UPD' if ($user); | ||||
|     my %quo_datas = (); | ||||
|     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') { | ||||
| @@ -53,9 +53,9 @@ sub do_display { | ||||
|         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')); | ||||
|             my $max = $c->toBestUnit($rec->prop('MaxBlocks')); | ||||
|             $quo_datas{hardlim} = $max; | ||||
|             $max                = esmith::FormMagick::Panel::quota->toBestUnit($rec->prop('MaxBlocksSoftLim')); | ||||
|             $max                = $c->toBestUnit($rec->prop('MaxBlocksSoftLim')); | ||||
|             $quo_datas{softlim} = $max; | ||||
|         } ## end if ($rec and $rec->prop...) | ||||
|     } ## end if ($trt eq 'UPD') | ||||
| @@ -73,6 +73,7 @@ sub do_update { | ||||
|     $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') || ''); | ||||
| @@ -156,4 +157,54 @@ sub validate_quota { | ||||
|         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 | ||||
|   | ||||
| @@ -56,10 +56,11 @@ sub do_action { | ||||
|  | ||||
|             #    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"); | ||||
|             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); | ||||
|   | ||||
| @@ -17,10 +17,11 @@ 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 $networks = esmith::NetworksDB->open_ro || die "Couldn't open networks"; | ||||
| @@ -33,7 +34,7 @@ sub main { | ||||
|     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{'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); | ||||
| @@ -151,6 +152,55 @@ sub get2_local_networks { | ||||
|     } ## 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  $fm->localise('NO_NETWORKS'); | ||||
|     } | ||||
|     else { | ||||
|         my $out = ""; | ||||
|         foreach my $network (sort @nets) { | ||||
|             if ($out ne "") { | ||||
|                 $out .= "<BR>"; | ||||
|             } | ||||
|  | ||||
|             $out .= $network->key."/" . get_net_prop($fm, $network->key, 'Mask'); | ||||
|  | ||||
|             if ( defined get_net_prop($fm, $network->key, 'Router') ) { | ||||
|                 $out .= " via " . get_net_prop ($fm, $network->key, 'Router');  | ||||
|             } | ||||
|         } | ||||
|         return $out; | ||||
|     } | ||||
|  | ||||
| } | ||||
|  | ||||
| sub get_local_domain | ||||
| { | ||||
|     return (get_value('','DomainName')); | ||||
| } | ||||
|  | ||||
|  | ||||
| =head2 print2_gateway_stanza | ||||
|  | ||||
| If this system is a server gateway, show the external ip and gateway ip (mojo ver) | ||||
| @@ -216,4 +266,51 @@ sub print2_dhcp_stanza { | ||||
|     } ## 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; | ||||
|   | ||||
| @@ -2,7 +2,7 @@ package SrvMngr::Controller::Roundcubepanel; | ||||
|  | ||||
| #---------------------------------------------------------------------- | ||||
| # heading     : System | ||||
| # description : Roundcube webmail | ||||
| # description : Webmail | ||||
| # navigation  : 99999 9999 | ||||
| #---------------------------------------------------------------------- | ||||
| #---------------------------------------------------------------------- | ||||
| @@ -21,10 +21,9 @@ use SrvMngr qw(theme_list init_session); | ||||
| sub main { | ||||
|     my $c = shift; | ||||
|     $c->app->log->info($c->log_req); | ||||
|     my $title            = $c->l('Roundcube Webmail'); | ||||
|     my $title            = $c->l('Webmail'); | ||||
|     my $roundcube_url    = $c->param('url'); | ||||
|     my $roundcube_height = $c->param('height') | 600; | ||||
|     $c->stash(title => $title, modul => $roundcube_url, height => $roundcube_height); | ||||
|     $c->stash(title => $title, modul => $roundcube_url); | ||||
|     $c->render(template => 'roundcube'); | ||||
| } ## end sub main | ||||
|  | ||||
|   | ||||
| @@ -28,12 +28,15 @@ use esmith::util; | ||||
| #use Exporter; | ||||
| #use Carp qw(verbose); | ||||
| #use esmith::FormMagick::Panel::useraccounts; | ||||
| 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 ($cdb,$adb); | ||||
|  | ||||
| sub main { | ||||
|     my $c = shift; | ||||
|     $c->app->log->info($c->log_req); | ||||
| 	$cdb = esmith::ConfigDB->open() || die "Couldn't open config db"; | ||||
| 	$adb = esmith::AccountsDB->open || die "Couldn't open accounts db"; | ||||
|     my $notif     = ''; | ||||
|     my %usr_datas = (); | ||||
|     my $title     = $c->l('usr_FORM_TITLE'); | ||||
| @@ -52,6 +55,8 @@ sub do_display { | ||||
|     my %usr_datas = (); | ||||
|     my $title     = $c->l('usr_FORM_TITLE'); | ||||
|     my ($notif, $modul) = ''; | ||||
| 	$cdb = esmith::ConfigDB->open() || die "Couldn't open config db"; | ||||
| 	$adb = esmith::AccountsDB->open || die "Couldn't open accounts db"; | ||||
|     $usr_datas{'trt'} = $trt; | ||||
|  | ||||
|     if ($trt eq 'ADD') { | ||||
| @@ -138,6 +143,8 @@ sub do_update { | ||||
|     $usr_datas{trt} = $trt; | ||||
|     my $title = $c->l('usr_FORM_TITLE'); | ||||
|     my ($res, $result) = ''; | ||||
| 	$cdb = esmith::ConfigDB->open() || die "Couldn't open config db"; | ||||
| 	$adb = esmith::AccountsDB->open || die "Couldn't open accounts db"; | ||||
|  | ||||
|     if ($trt eq 'ADD') { | ||||
|  | ||||
| @@ -394,10 +401,12 @@ sub remove_account { | ||||
| sub reset_password { | ||||
|     my ($c, $user, $passw1) = @_; | ||||
|  | ||||
|  | ||||
|     unless (($user) = ($user =~ /^(\w[\-\w_\.]*)$/)) { | ||||
|         return $c->l('usr_TAINTED_USER'); | ||||
|     } | ||||
|     $user = $1; | ||||
| 	my $adb = esmith::AccountsDB->open || die "Couldn't open accounts db"; | ||||
|     my $acct = $adb->get($user); | ||||
|  | ||||
|     if ($acct->prop('type') eq "user") { | ||||
| @@ -445,10 +454,9 @@ sub validate_password { | ||||
|     } | ||||
|     $reason ||= "Software error: password check failed"; | ||||
|     return "OK" if ($reason eq "ok"); | ||||
|     return | ||||
|           $c->l("Bad Password Choice") . ": " | ||||
|     return $c->l("Bad Password Choice") . ": " | ||||
|         . $c->l("The password you have chosen is not a good choice, because") . " " | ||||
|         . $c->($reason) . "."; | ||||
|         . $c->l($reason) . "."; | ||||
| } ## end sub validate_password | ||||
|  | ||||
| sub emailForward_list { | ||||
|   | ||||
| @@ -17,7 +17,7 @@ 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"; | ||||
| #our $cdb = esmith::ConfigDB->open_ro || die "Couldn't open configuration db"; | ||||
|  | ||||
| sub main { | ||||
|     my $c         = shift; | ||||
| @@ -194,6 +194,7 @@ sub check_password { | ||||
|     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); | ||||
|   | ||||
| @@ -12,15 +12,13 @@ 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; | ||||
| @@ -104,10 +102,11 @@ sub do_action { | ||||
| 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 | ||||
| @@ -128,6 +127,7 @@ sub findlogFiles { | ||||
|             # or not log files | ||||
|             foreach ( | ||||
|                 qw( | ||||
|                 journal | ||||
|                 lastlog | ||||
|                 btmp$ | ||||
|                 wtmp | ||||
|   | ||||
| @@ -13,7 +13,6 @@ 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 { | ||||
|   | ||||
| @@ -1,72 +0,0 @@ | ||||
| package SrvMngr::I18N::Modules::Letsencrypt::en; | ||||
| use strict; | ||||
| use warnings; | ||||
| use utf8; | ||||
| use Mojo::Base 'SrvMngr::I18N'; | ||||
|  | ||||
| use SrvMngr::I18N::Modules::General::en; | ||||
|  | ||||
| my %lexicon = ( | ||||
| # | ||||
| # Generated by SM2Gen version: SM2Gen version:0.8 Chameleon version:4.5.4 On Python:3.12.3 at 2024-12-01 15:22:43 | ||||
| # | ||||
| 'lets_Manage_letsencrypt-config_settings:' => 'Manage letsencrypt-config settings', | ||||
| 'lets_HOOKSCRIPT_STATUS' => 'Hookscript Status', | ||||
| 'lets_SERVICE_STATUS' => 'Service Status', | ||||
| 'lets_EMAIL' => 'Email', | ||||
| 'lets_Back' => 'Back', | ||||
| 'lets_Internal_IP' => 'Internal IP', | ||||
| 'lets_Save' => 'Save', | ||||
| 'lets_Issuer' => 'Issuer', | ||||
| 'lets_IS_IN_CERT' => 'Is In cart', | ||||
| 'lets_For_this_Server' => 'For this Server', | ||||
| 'lets_Loop_through_checking_the_letsencrypt' => 'Loop through checking the letsencrypt status for each configured domain', | ||||
| 'lets_Loop_through_checking_the_letsencrypt' => 'Loop through checking the letsencrypt status for each configured domain which is enabled', | ||||
| 'lets_Check_just_one_domain' => 'Check just one domain', | ||||
| 'lets_PARAMS_panel_action_was_successful' => 'PARAMS panel action was successful', | ||||
| 'lets_Check_all_domains' => 'Check all domains', | ||||
| 'lets_LIST_panel_action_was_successful' => 'LIST panel action was successful', | ||||
| 'lets_Status_Report' => 'Status Report', | ||||
| 'lets_LABEL_NAMESERVERS' => 'Label timeservers', | ||||
| 'lets_Loop_through_and_check_the' => 'Loop through and check the letsencrypt status for a specific domain', | ||||
| 'lets_Letsencrypt_certificate' => 'Letsencrypt certificate', | ||||
| 'lets_Error_Status_Report' => 'Error Status Report', | ||||
| 'lets_Not_Before' => 'Not Before', | ||||
| 'lets_Content' => 'Content', | ||||
| 'lets_CONFIG_LETSENCRYPT' => 'confirm Letsencrypt', | ||||
| 'lets_API_STATUS' => 'ape Status', | ||||
| 'lets_ACCEPT_TERMS_STATUS' => 'Accept Terms Status', | ||||
| 'lets_Check_all_enabled_domains' => 'Check all enabled domains', | ||||
| 'lets_All_domains_check_result' => 'All domains check result', | ||||
| 'lets_CHECKALLDOMAINS_panel_action_was_successful' => 'CHECKALLDOMAINS panel action was successful', | ||||
| 'lets_Domains_name' => 'Domains name', | ||||
| 'lets_HOSTOVERRIDE_STATUS' => 'Hostoverride Status', | ||||
| 'lets_List_of_Domains_and_Hosts' => 'List of Domains and Hosts', | ||||
| 'lets_Brief_description' => 'Brief description', | ||||
| 'lets_KEYSIZE_STATUS' => 'Keysize Status', | ||||
| 'lets_Domain_name_/_HOSTNAME' => 'Domain name / HOSTNAME', | ||||
| 'lets_Enabled_domains_check_result' => 'Enabled domains check result', | ||||
| 'lets_CHECKALLENABLEDDOMAINS_panel_action_was_successful' => 'CHECKALLENABLEDDOMAINS panel action was successful', | ||||
| 'lets_Internet_IP' => 'Internet IP', | ||||
| 'lets_Expiry' => 'Expiry', | ||||
| 'lets_CHECK_ALL_DOMAINS' => 'Check All Domains', | ||||
| 'lets_LABEL_POINT' => 'Label Point', | ||||
| 'lets_CHECK' => 'Check', | ||||
| 'lets_CONFIG' => 'Config', | ||||
| 'lets_Current_certificate_details' => 'Current certificate details', | ||||
| 'lets_LABEL_LECERT' => 'Label secret', | ||||
| 'lets_One_domain_check_result' => 'One domain check result', | ||||
| 'lets_CHECKONEDOMAIN_panel_action_was_successful' => 'CHECKONEDOMAIN panel action was successful', | ||||
| 'lets_CONFIGUREMODE_STATUS' => 'Configuremode Status', | ||||
| 'lets_CHECK_ALL_ENABLED_DOMAINS' => 'Check All Enabled Domains', | ||||
| 'lets_External_Interface_IP' => 'External Interface IP', | ||||
| 'lets_APPLY' => 'Apply', | ||||
| ); | ||||
|  | ||||
| our %Lexicon = ( | ||||
| 	%{ SrvMngr::I18N::Modules::General::en::Lexicon }, | ||||
| 	%lexicon | ||||
| ); | ||||
|  | ||||
|  | ||||
| 1; | ||||
| @@ -1,55 +0,0 @@ | ||||
| # | ||||
| # Generated by SM2Gen version: SM2Gen version:0.8 Chameleon version:4.5.4 On Python:3.12.3 at 2024-12-01 15:22:43 | ||||
| # edited by bjr 09Jan2025 | ||||
| # | ||||
| 'lets_Manage_letsencrypt-config_settings:' => 'Manage letsencrypt-config settings', | ||||
| 'lets_HOOKSCRIPT_STATUS' => 'Hookscript Status', | ||||
| 'lets_SERVICE_STATUS' => 'Service Status', | ||||
| 'lets_EMAIL' => 'Email', | ||||
| 'lets_Back' => 'Back', | ||||
| 'lets_Internal_IP' => 'Internal IP', | ||||
| 'lets_Save' => 'Save', | ||||
| 'lets_Issuer' => 'Issuer', | ||||
| 'lets_IS_IN_CERT' => 'Is in certificate', | ||||
| 'lets_For_this_Server' => 'For this Server', | ||||
| 'lets_Loop_through_checking_the_letsencrypt' => 'Loop through checking the letsencrypt status for each configured domain', | ||||
| 'lets_Loop_through_checking_the_letsencrypt' => 'Loop through checking the letsencrypt status for each configured domain which is enabled', | ||||
| 'lets_Check_just_one_domain' => 'Check just one domain', | ||||
| 'lets_PARAMS_panel_action_was_successful' => 'Parameter panel action was successful', | ||||
| 'lets_Check_all_domains' => 'Check all domains', | ||||
| 'lets_LIST_panel_action_was_successful' => 'List panel action was successful', | ||||
| 'lets_Status_Report' => 'Status Report', | ||||
| 'lets_LABEL_NAMESERVERS' => 'Label timeservers', | ||||
| 'lets_Loop_through_and_check_the' => 'Loop through and check the letsencrypt status for a specific domain', | ||||
| 'lets_Letsencrypt_certificate' => 'Letsencrypt certificate', | ||||
| 'lets_Error_Status_Report' => 'Error Status Report', | ||||
| 'lets_Not_Before' => 'Not Before', | ||||
| 'lets_Content' => 'Content', | ||||
| 'lets_CONFIG_LETSENCRYPT' => 'Configure Letsencrypt', | ||||
| 'lets_API_STATUS' => 'API Status', | ||||
| 'lets_ACCEPT_TERMS_STATUS' => 'Accept Terms Status', | ||||
| 'lets_Check_all_enabled_domains' => 'Check all enabled domains', | ||||
| 'lets_All_domains_check_result' => 'All domains check result', | ||||
| 'lets_CHECKALLDOMAINS_panel_action_was_successful' => 'Check all domains panel action was successful', | ||||
| 'lets_Domains_name' => 'Domains name', | ||||
| 'lets_HOSTOVERRIDE_STATUS' => 'Hostoverride Status', | ||||
| 'lets_List_of_Domains_and_Hosts' => 'List of Domains and Hosts', | ||||
| 'lets_Brief_description' => 'Brief description', | ||||
| 'lets_KEYSIZE_STATUS' => 'Keysize Status', | ||||
| 'lets_Domain_name_/_HOSTNAME' => 'Domain name / HOSTNAME', | ||||
| 'lets_Enabled_domains_check_result' => 'Enabled domains check result', | ||||
| 'lets_CHECKALLENABLEDDOMAINS_panel_action_was_successful' => 'Check all enabled domains panel action was successful', | ||||
| 'lets_Internet_IP' => 'Internet IP', | ||||
| 'lets_Expiry' => 'Expiry', | ||||
| 'lets_CHECK_ALL_DOMAINS' => 'Check All Domains', | ||||
| 'lets_LABEL_POINT' => 'Label Point', | ||||
| 'lets_CHECK' => 'Check', | ||||
| 'lets_CONFIG' => 'Config', | ||||
| 'lets_Current_certificate_details' => 'Current certificate details', | ||||
| 'lets_LABEL_LECERT' => 'Label secret', | ||||
| 'lets_One_domain_check_result' => 'One domain check result', | ||||
| 'lets_CHECKONEDOMAIN_panel_action_was_successful' => 'Check one domain panel action was successful', | ||||
| 'lets_CONFIGUREMODE_STATUS' => 'Configure mode Status', | ||||
| 'lets_CHECK_ALL_ENABLED_DOMAINS' => 'Check All Enabled Domains', | ||||
| 'lets_External_Interface_IP' => 'External Interface IP', | ||||
| 'lets_APPLY' => 'Apply', | ||||
| @@ -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; | ||||
| @@ -1,90 +0,0 @@ | ||||
| /* | ||||
| Generated by SM2Gen version: SM2Gen version:0.8 Chameleon version:4.5.4 On Python:3.12.3 at 2024-12-01 15:22:43 | ||||
| */ | ||||
| .Letsencrypt-panel {} | ||||
| .name {} | ||||
| .rout {} | ||||
| .grou {} | ||||
| .link2 {} | ||||
| .link3 {} | ||||
| .link4 {} | ||||
| .endg {} | ||||
| .subh2 {} | ||||
| .read4 {} | ||||
| .read5 {} | ||||
| .read6 {} | ||||
| .subh3 {} | ||||
| .read1 {} | ||||
| .read2 {} | ||||
| .read3 {} | ||||
| .subh4 {} | ||||
| .tabl1 {} | ||||
| thead .tabl1 {} | ||||
| tbody .tabl1 {} | ||||
| .name {} | ||||
| .rout {} | ||||
| .subh {} | ||||
| .para1 {} | ||||
| .sele1 {} | ||||
| .sele2 {} | ||||
| .sele3 {} | ||||
| .sele4 {} | ||||
| .sele5 {} | ||||
| .sele6 {} | ||||
| .sele7 {} | ||||
| .emai8 {} | ||||
| .subm9 {} | ||||
| .name {} | ||||
| .rout {} | ||||
| .head {} | ||||
| .subh {} | ||||
| .text1 {} | ||||
| .back2 {} | ||||
| .name {} | ||||
| .rout {} | ||||
| .head {} | ||||
| .subh {} | ||||
| .text1 {} | ||||
| .back2 {} | ||||
| .name {} | ||||
| .rout {} | ||||
| .head {} | ||||
| .subh {} | ||||
| .read1 {} | ||||
| .text2 {} | ||||
| .back3 {} | ||||
|  .inline-buttons { | ||||
|     display: flex; /* Use flexbox to arrange items horizontally */ | ||||
|     gap: 10px;     /* Optional: Add space between buttons */ | ||||
|   } | ||||
|  | ||||
|   .inline-buttons .link { | ||||
|     /* Additional styling can be added here if needed */ | ||||
|   } | ||||
|    | ||||
|    | ||||
|   .inline-buttons .link { | ||||
|     display: inline-block; /* Keep links as inline-block for button shape */ | ||||
|     padding: 7px 14px;     /* Adjusted padding to approximate 70% of the original */ | ||||
|     margin: 0;             /* Remove margin */ | ||||
|     background-color: #efefef; /* Light gray background color */ | ||||
|     color: black;          /* Text color */ | ||||
|     text-decoration: none; /* Remove underline */ | ||||
|     border: 2px solid #bbb; /* Thin, light gray border */ | ||||
|     border-radius: 3px;    /* Slightly rounded corners */ | ||||
|     font-size: 11.2px;     /* Adjusted font size to approximate 70% of the original */ | ||||
|     text-align: center;    /* Center the text */ | ||||
|     cursor: pointer;       /* Pointer cursor on hover */  } | ||||
|  | ||||
|   /* Hover and active effects for better interaction */ | ||||
|   .inline-buttons .link:hover { | ||||
|     background-color: #d9d9d9; /* Darker shade on hover */ | ||||
|   } | ||||
|  | ||||
|   .inline-buttons .link:active { | ||||
|     background-color: #c0c0c0; /* Even darker shade on click */ | ||||
|   } | ||||
|    | ||||
|   span .label { | ||||
| 	padding-top:13em; | ||||
|   } | ||||
| @@ -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: 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,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 | ||||
|   | ||||
| @@ -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 | ||||
|   | ||||
| @@ -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 | ||||
|   | ||||
| @@ -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 | ||||
|   | ||||
| @@ -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 | ||||
|   | ||||
| @@ -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 | ||||
|   | ||||
| @@ -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 | ||||
|   | ||||
| @@ -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 | ||||
|   | ||||
| @@ -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 | ||||
|   | ||||
| @@ -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 | ||||
|   | ||||
| @@ -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} | ||||
|   | ||||
| @@ -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 | ||||
|   | ||||
| @@ -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> | ||||
|   | ||||
| @@ -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> | ||||
|   | ||||
| @@ -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 | ||||
|   | ||||
| @@ -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> | ||||
|   | ||||
| @@ -3,7 +3,7 @@ | ||||
| % content_for 'module' => begin | ||||
| <div id='module' class='module domains-panel'> | ||||
|  | ||||
|     % if ($config->{debug} == 1) { | ||||
|     % if (config->{debug} == 1) { | ||||
| 	<p> | ||||
| 	%= dumper $c->current_route | ||||
| 	%= dumper $dom_datas | ||||
|   | ||||
| @@ -3,7 +3,7 @@ | ||||
| % content_for 'module' => begin | ||||
| <div id='module' class='module emailaccess-panel'> | ||||
|  | ||||
|     % if ($config->{debug} == 1) { | ||||
|     % if (config->{debug} == 1) { | ||||
| 	<p> | ||||
| 	%= dumper $c->current_route | ||||
| 	%= dumper $mai_datas | ||||
|   | ||||
| @@ -3,7 +3,7 @@ | ||||
| % content_for 'module' => begin | ||||
| <div id='module' class='module emaildeliver-panel'> | ||||
|  | ||||
|     % if ($config->{debug} == 1) { | ||||
|     % if (config->{debug} == 1) { | ||||
| 	<p> | ||||
| 	%= dumper $c->current_route | ||||
| 	%= dumper $mai_datas | ||||
|   | ||||
| @@ -3,7 +3,7 @@ | ||||
| % content_for 'module' => begin | ||||
| <div id='module' class='module emailfilter-panel'> | ||||
|  | ||||
|     % if ($config->{debug} == 1) { | ||||
|     % if (config->{debug} == 1) { | ||||
| 	<p> | ||||
| 	%= dumper $c->current_route | ||||
| 	%= dumper $mai_datas | ||||
|   | ||||
| @@ -7,7 +7,7 @@ | ||||
|  | ||||
| <div id='module' class='module emailreceive-panel'> | ||||
|  | ||||
|     % if ($config->{debug} == 1) { | ||||
|     % if (config->{debug} == 1) { | ||||
| 	<p> | ||||
| 	%= dumper $c->current_route | ||||
| 	%= dumper $mai_datas | ||||
|   | ||||
| @@ -7,7 +7,7 @@ | ||||
|  | ||||
| <div id='module' class='module emailsettings-panel'> | ||||
|  | ||||
|     % if ($config->{debug} == TRUE) { | ||||
|     % if (config->{debug} == TRUE) { | ||||
| 	<p> | ||||
| 	%= dumper $c->current_route | ||||
| 	%= dumper $mai_datas | ||||
|   | ||||
| @@ -3,7 +3,7 @@ | ||||
| % content_for 'module' => begin | ||||
|  | ||||
| <div id='module' class='module module-panel'> | ||||
|     % if ($config->{debug} == 1) { | ||||
|     % if (config->{debug} == 1) { | ||||
| 		<p> | ||||
| 			%= dumper $c->current_route | ||||
| 		</p> | ||||
|   | ||||
| @@ -3,7 +3,7 @@ | ||||
| % content_for 'module' => begin | ||||
| <div id='module' class='module groups-panel'> | ||||
|  | ||||
|     % if ($config->{debug} == 1) { | ||||
|     % if (config->{debug} == 1) { | ||||
| 	<p> | ||||
| 	%= dumper $c->current_route | ||||
| 	%= dumper $grp_datas | ||||
|   | ||||
| @@ -3,7 +3,7 @@ | ||||
| % content_for 'module' => begin | ||||
| <div id='module' class='module hostentries-panel'> | ||||
|  | ||||
|     % if ($config->{debug} == 1) { | ||||
|     % if (config->{debug} == 1) { | ||||
| 	<p> | ||||
| 	%= dumper $c->current_route | ||||
| 	%= dumper $hos_datas | ||||
|   | ||||
| @@ -3,7 +3,7 @@ | ||||
| % content_for 'module' => begin | ||||
| <div id='module' class='module ibays-panel'> | ||||
|  | ||||
|     % if ($config->{debug} == 1) { | ||||
|     % if (config->{debug} == 1) { | ||||
| 	<p> | ||||
| 	%= dumper $c->current_route | ||||
| 	%= dumper $iba_datas | ||||
|   | ||||
| @@ -2,7 +2,7 @@ | ||||
|  | ||||
| % content_for 'module' => begin | ||||
|  | ||||
|     % if ($config->{debug} == 1) { | ||||
|     % if (config->{debug} == 1) { | ||||
| 	<p> | ||||
| 	%= dumper $c->current_route | ||||
| 	</p> | ||||
| @@ -25,4 +25,4 @@ | ||||
|     </p> | ||||
| </div> | ||||
|  | ||||
| % end | ||||
| % end | ||||
| @@ -11,6 +11,7 @@ | ||||
|     %= stylesheet '/css/sme_main.css' | ||||
|     %= stylesheet '/css/sme_menu.css' | ||||
|     %= stylesheet '/css/styles.css' | ||||
|     %= stylesheet '/css/sme-password.css' | ||||
|     %= content_for 'head_contrib' | ||||
|     % if (config 'hasJquery') { | ||||
| 	%= include 'partials/_js_imports' | ||||
| @@ -32,6 +33,7 @@ | ||||
| 	%= javascript '/js/buttons.html5.min.js' | ||||
| 	%= javascript '/js/buttons.print.min.js' | ||||
| 	%= javascript '/js/flag-by-locale.js' | ||||
| 	%= javascript '/js/sme-password.js' | ||||
|  | ||||
| 	<link rel="stylesheet" href="/smanager/css/flag-icon.min.css"> | ||||
| 	%= stylesheet '/css/sme-jquery-overrides.css' | ||||
| @@ -125,4 +127,4 @@ | ||||
|  | ||||
|    | ||||
| </body> | ||||
| </html> | ||||
| </html> | ||||
| @@ -1,69 +0,0 @@ | ||||
| %# | ||||
| %# Generated by SM2Gen version:0.8 Chameleon version:4.5.4 On Python:3.12.3 at 2024-12-01 15:22:43  | ||||
| %# | ||||
| % layout 'default', title => "Sme server 2 - Letsencrypt certificate", share_dir => './'; | ||||
| %# css specific to this panel: | ||||
| % content_for 'module' => begin | ||||
| %= stylesheet '/css/letsencrypt.css' | ||||
| <div id="module" class="module Letsencrypt-panel"> | ||||
|  | ||||
|     % if ($config->{debug} == 1) { | ||||
| 	<pre> | ||||
| 		%= dumper $c->current_route | ||||
| 		%= dumper $lets_data->{trt} | ||||
| 	</pre> | ||||
|     % } | ||||
|      | ||||
|     <h1><%=$title%></h1> | ||||
|  | ||||
|     % if ( stash('modul')) { | ||||
| 	%= $c->render_to_string(inline => stash('modul') ); | ||||
|     % } | ||||
|  | ||||
|    	%if ($c->stash('first')) { | ||||
| 	    <br><p> | ||||
| 		%=$c->render_to_string(inline =>$c->l($c->stash('first'))) | ||||
| 		</p> | ||||
|  | ||||
| 	%} elsif ($c->stash('success')) { | ||||
| 		<div class='success '> | ||||
| 	       <h2><%=$c->l('lets_Status_Report') %></h2><p> | ||||
| 			%= $c->l($c->stash('success')); | ||||
| 			</p> | ||||
| 		</div> | ||||
|  | ||||
| 	%} elsif ($c->stash('error')) {  | ||||
| 	   <div class='sme-error'> | ||||
| 	       <h2><%=$c->l('lets_Error_Status_Report') %></h2><p> | ||||
| 			%= $c->l($c->stash('error')); | ||||
| 			</p> | ||||
|     	</div> | ||||
| 	%} | ||||
|  | ||||
| 	%#Routing to partials according to trt parameter. | ||||
| 	%#This ought to be cascading if/then/elsif, but is easier to just stack the if/then's rather like a case statement' | ||||
| 	 | ||||
| 	% if ($lets_data->{trt} eq "LIST") { | ||||
| 		%= include 'partials/_lets_LIST' | ||||
| 	%} | ||||
| 	 | ||||
| 	% if ($lets_data->{trt} eq "PARAMS") { | ||||
| 		%= include 'partials/_lets_PARAMS' | ||||
| 	%} | ||||
| 	 | ||||
| 	% if ($lets_data->{trt} eq "CHECKALLDOMAINS") { | ||||
| 		%= include 'partials/_lets_CHECKALLDOMAINS' | ||||
| 	%} | ||||
| 	 | ||||
| 	% if ($lets_data->{trt} eq "CHECKALLENABLEDDOMAINS") { | ||||
| 		%= include 'partials/_lets_CHECKALLENABLEDDOMAINS' | ||||
| 	%} | ||||
| 	 | ||||
| 	% if ($lets_data->{trt} eq "CHECKONEDOMAIN") { | ||||
| 		%= include 'partials/_lets_CHECKONEDOMAIN' | ||||
| 	%} | ||||
| 	 | ||||
|  | ||||
|  | ||||
| </div> | ||||
| %end | ||||
| @@ -3,7 +3,7 @@ | ||||
| % content_for 'module' => begin | ||||
| <div id='module' class='module localnetworks-panel'> | ||||
|  | ||||
|     % if ($config->{debug} == 1) { | ||||
|     % if (config->{debug} == 1) { | ||||
| 	<p> | ||||
| 	%= dumper $c->current_route | ||||
| 	%= dumper $c->stash("ret") | ||||
|   | ||||
| @@ -43,9 +43,9 @@ | ||||
|     <p><span class=label> | ||||
|     %=l 'PASSWORD' | ||||
|     </span><span class=input> | ||||
|     %= password_field 'Password', id => 'id_password', autocomplete => 'current-password' | ||||
|     %= password_field 'Password', id => 'id_password', autocomplete => 'current-password', class=>'sme-password' | ||||
|     % if (config 'hasJquery') { | ||||
| 	<a href='#' id='togglePassword' class='toggle-password tg-icon'> <img src="images/visible.png" height="16" alt="Visible"></a> | ||||
| 	%#<a href='#' id='togglePassword' class='toggle-password tg-icon'> <img src="images/visible.png" height="16" alt="Visible"></a> | ||||
|     % } | ||||
|     </span></p> | ||||
| %} | ||||
| @@ -66,4 +66,4 @@ | ||||
|   % end | ||||
|  | ||||
| </div> | ||||
| %end | ||||
| %end | ||||
| @@ -3,7 +3,7 @@ | ||||
| % content_for 'module' => begin | ||||
|  | ||||
| <div id='module' class='module module-panel'> | ||||
|     % if ($config->{debug} == 1) { | ||||
|     % if (config->{debug} == 1) { | ||||
| 	<p> | ||||
| 	%= dumper $c->current_route | ||||
| 	</p> | ||||
|   | ||||
| @@ -4,6 +4,9 @@ | ||||
| <font class="sme-copyright"> | ||||
| %	if ( $c->is_logged_in ) { | ||||
| 	SME Server <%= session 'releaseVersion' %>-<%= $c->app->VERSION %> Manager II | ||||
| 	% my $mode; | ||||
| 	% if (config->{mode} eq 'development'){ $mode = '-dev';} else { $mode = '';} | ||||
| 	(Mojo:<%= Mojolicious->VERSION %><%= $mode %>) | ||||
| % } | ||||
| <br>Copyright 1999-2006 Mitel Corporation<br> | ||||
| %= session 'copyRight' | ||||
|   | ||||
| @@ -64,7 +64,7 @@ | ||||
|                                         %       </a> | ||||
| 					%}; | ||||
| 					%my $remove_text = l('REMOVE');  # Localized text | ||||
| 					%my $csrf_token = "TOKEN";  # CSRF token for security | ||||
| 					%$csrf_token = "TOKEN";  # CSRF token for security | ||||
| 					%#my $hostentries_name = $_->{'HostName'};  # hostentries name extracted from the data structure | ||||
| 					%$actionRemove = qq{ | ||||
|                                         %       <a href="hostentriesd?CsrfDef=$csrf_token&trt=DEL&Hostname=$hostentries_name"> | ||||
|   | ||||
| @@ -90,7 +90,7 @@ | ||||
| 					%my $csrf_token = "TOKEN";  # CSRF token for security | ||||
| 					%my $ibays_entry_name = $ibay->key;  # ibays_entry name extracted from the data structure | ||||
| 					%$actionRemove = qq{ | ||||
|                                         %       <a href="ibaysd?CsrfDef=$csrf_token&trt=DEL&ibays=$ibays_entry_name"> | ||||
|                                         %       <a href="ibaysd?CsrfDef=$csrf_token&trt=DEL&ibay=$ibays_entry_name"> | ||||
| 					%	<button type='button' class='sme-remove-button' title='$remove_text' > | ||||
| 					%		$remove_text | ||||
| 					%	</button> | ||||
|   | ||||
| @@ -17,7 +17,7 @@ | ||||
| 	<span class=label> | ||||
| 	%=l 'PASSWORD_NEW', class => 'label' | ||||
| 	</span><span class=data> | ||||
| 	%= password_field 'newPass', class => 'input' | ||||
| 	%= password_field 'newPass', class => 'input' , class=>'sme-password' | ||||
| 	</span> | ||||
| 	</p> | ||||
|  | ||||
| @@ -25,7 +25,7 @@ | ||||
| 	<span class=label> | ||||
| 	%=l 'PASSWORD_VERIFY_NEW', class => 'label' | ||||
| 	</span><span class=data> | ||||
| 	%= password_field 'newPassVerify', class => 'input' | ||||
| 	%= password_field 'newPassVerify', class => 'input', class=>'sme-password' | ||||
| 	</span> | ||||
| 	</p> | ||||
|  | ||||
| @@ -39,4 +39,4 @@ | ||||
| 	 | ||||
|     % end     | ||||
|  | ||||
| </div> | ||||
| </div> | ||||
| @@ -8,9 +8,9 @@ | ||||
|         Warning: a reconfigure and reboot is required before proceeding! Failure to do so now | ||||
|         may leave your system in an unknown state!</h5></div> | ||||
|     <% } %> | ||||
|     <% if ( $c->session->{Access} eq 'public' && (($config->{debug} ne '0') || ($config->{mode} ne 'production')) ) { %> | ||||
|     <% if ( $c->session->{Access} eq 'public' && ((config->{debug} ne '0') || (config->{mode} ne 'production')) ) { %> | ||||
| 	<div class="sme-error"><h5> | ||||
|         Warning: Development or debug mode enabled AND public access is offered ! | ||||
|         </h5></div> | ||||
|     <% } %> | ||||
| </div> | ||||
| </div> | ||||
| @@ -1,5 +1,5 @@ | ||||
|  | ||||
| <!--*** toggle hide/unhide password field in login panel ***--> | ||||
| <!--*** toggle hide/unhide password field in login panel *** | ||||
|  | ||||
| % content_for 'js_togglePassword' => begin | ||||
|   %= javascript begin | ||||
| @@ -22,7 +22,7 @@ | ||||
|  | ||||
|   % end | ||||
| % end | ||||
|  | ||||
| --> | ||||
|  | ||||
| <!--*** toggle hide/unhide menu contents navigation menu ***--> | ||||
|  | ||||
| @@ -98,4 +98,4 @@ | ||||
|  | ||||
| 	}); | ||||
|   % end | ||||
| % end | ||||
| % end | ||||
| @@ -1,45 +0,0 @@ | ||||
| %# | ||||
| %# Generated by SM2Gen version:0.8 Chameleon version:4.5.4 On Python:3.12.3 at 2024-12-01 15:22:43  | ||||
| %# | ||||
| <div id="Letsencrypt-CHECKALLDOMAINS" class="partial Letsencrypt-CHECKALLDOMAINS"> | ||||
| 	<script> | ||||
| 		window.onload = function() { | ||||
| 		SelectInput(); | ||||
| 	}; | ||||
| 	</script> | ||||
| 	% if ($config->{debug} == 1) { | ||||
| 		<pre> | ||||
| 			%= dumper $lets_data | ||||
| 		</pre> | ||||
| 	% } | ||||
| 	% my $btn = l('lets_APPLY'); | ||||
| 	%= form_for "letsencryptu" => (method => 'POST') => begin | ||||
| 		% param 'trt' => $lets_data->{trt} unless param 'trt'; | ||||
| 		%= hidden_field 'trt' => $lets_data->{trt} | ||||
| 		%# Inputs etc in here. | ||||
|  | ||||
| 		<h1 class='head'><%=l('lets_Check_all_domains')%></h1> | ||||
| 	 | ||||
| 		<h2 class='subh'><%=l('lets_Loop_through_checking_the_letsencrypt')%></h2> | ||||
| 	 | ||||
| 		<span class=label> | ||||
| 			%=l('lets_All_domains_check_result') | ||||
| 		</span><span class=data> | ||||
| 			% param 'AllDomainsCheck' => $lets_data->{AllDomainsCheck} unless param 'AllDomainsCheck'; | ||||
| 			%= text_area 'AllDomainsCheck', cols=>40, rows=>10, Readonly=>'true' | ||||
| 		</span><br> | ||||
| 	 | ||||
| 		<span class='data'> | ||||
|                         %my $back_text = l('lets_Back');  # Localized text | ||||
|                         %my $actionBack = qq{ | ||||
|                         %       <a href="letsencryptd"> | ||||
|                         %       <input class='action back' type='submit'  value='$back_text'> | ||||
|                         %       </a> | ||||
|                         %}; | ||||
|                       <%= $c->render_to_string(inline => $actionBack) %> | ||||
| 		</span> | ||||
| 		 | ||||
| 	 | ||||
| 		%# Probably finally by a submit. | ||||
| 	%end     | ||||
| </div> | ||||
| @@ -1,45 +0,0 @@ | ||||
| %# | ||||
| %# Generated by SM2Gen version:0.8 Chameleon version:4.5.4 On Python:3.12.3 at 2024-12-01 15:22:43  | ||||
| %# | ||||
| <div id="Letsencrypt-CHECKALLENABLEDDOMAINS" class="partial Letsencrypt-CHECKALLENABLEDDOMAINS"> | ||||
| 	<script> | ||||
| 		window.onload = function() { | ||||
| 		SelectInput(); | ||||
| 	}; | ||||
| 	</script> | ||||
| 	% if ($config->{debug} == 1) { | ||||
| 		<pre> | ||||
| 			%= dumper $lets_data | ||||
| 		</pre> | ||||
| 	% } | ||||
| 	% my $btn = l('lets_APPLY'); | ||||
| 	%= form_for "letsencryptu" => (method => 'POST') => begin | ||||
| 		% param 'trt' => $lets_data->{trt} unless param 'trt'; | ||||
| 		%= hidden_field 'trt' => $lets_data->{trt} | ||||
| 		%# Inputs etc in here. | ||||
|  | ||||
| 		<h1 class='head'><%=l('lets_Check_all_enabled_domains')%></h1> | ||||
| 	 | ||||
| 		<h2 class='subh'><%=l('lets_Loop_through_checking_the_letsencrypt')%></h2> | ||||
| 	 | ||||
| 		<span class=label> | ||||
| 			%=l('lets_Enabled_domains_check_result') | ||||
| 		</span><span class=data> | ||||
| 			% param 'EnabledDomainsCheck' => $lets_data->{EnabledDomainsCheck} unless param 'EnabledDomainsCheck'; | ||||
| 			%= text_area 'EnabledDomainsCheck', cols=>40, rows=>10, Readonly=>'true' | ||||
| 		</span><br> | ||||
| 	 | ||||
| 		<span class='data'> | ||||
|                         %my $back_text = l('lets_Back');  # Localized text | ||||
|                         %my $actionBack = qq{ | ||||
|                         %       <a href="letsencryptd"> | ||||
|                         %       <input class='action back' type='submit'  value='$back_text'> | ||||
|                         %       </a> | ||||
|                         %}; | ||||
|                       <%= $c->render_to_string(inline => $actionBack) %> | ||||
| 		</span> | ||||
| 		 | ||||
| 	 | ||||
| 		%# Probably finally by a submit. | ||||
| 	%end     | ||||
| </div> | ||||
| @@ -1,52 +0,0 @@ | ||||
| %# | ||||
| %# Generated by SM2Gen version:0.8 Chameleon version:4.5.4 On Python:3.12.3 at 2024-12-01 15:22:43  | ||||
| %# | ||||
| <div id="Letsencrypt-CHECKONEDOMAIN" class="partial Letsencrypt-CHECKONEDOMAIN"> | ||||
| 	<script> | ||||
| 		window.onload = function() { | ||||
| 		SelectInput(); | ||||
| 	}; | ||||
| 	</script> | ||||
| 	% if ($config->{debug} == 1) { | ||||
| 		<pre> | ||||
| 			%= dumper $lets_data | ||||
| 		</pre> | ||||
| 	% } | ||||
| 	% my $btn = l('lets_APPLY'); | ||||
| 	%= form_for "letsencryptu" => (method => 'POST') => begin | ||||
| 		% param 'trt' => $lets_data->{trt} unless param 'trt'; | ||||
| 		%= hidden_field 'trt' => $lets_data->{trt} | ||||
| 		%# Inputs etc in here. | ||||
|  | ||||
| 		<h1 class='head'><%=l('lets_Check_just_one_domain')%></h1> | ||||
| 	 | ||||
| 		<h2 class='subh'><%=l('lets_Loop_through_and_check_the')%></h2> | ||||
| 	 | ||||
| 		<p><span class=label> | ||||
| 			%=l('lets_Domains_name') | ||||
| 		</span><span class=data> | ||||
| 			% param 'OneDomainToCheck' => $lets_data->{OneDomainToCheck} unless param 'OneDomainToCheck'; | ||||
| 			%= text_field 'OneDomainToCheck', size => '50', class => 'textinput OneDomainToCheck' , pattern=>'.*' , placeholder=>'OneDomainToCheck', Readonly=>'true' | ||||
| 		<br></span></p> | ||||
| 	 | ||||
| 		<span class=label> | ||||
| 			%=l('lets_One_domain_check_result') | ||||
| 		</span><span class=data> | ||||
| 			% param 'OneDomainsCheck' => $lets_data->{OneDomainsCheck} unless param 'OneDomainsCheck'; | ||||
| 			%= text_area 'OneDomainsCheck', cols=>40, rows=>10, Readonly=>'true' | ||||
| 		</span><br> | ||||
| 	 | ||||
| 		<span class='data'> | ||||
|                         %my $back_text = l('lets_Back');  # Localized text | ||||
|                         %my $actionBack = qq{ | ||||
|                         %       <a href="letsencryptd"> | ||||
|                         %       <input class='action back' type='submit'  value='$back_text'> | ||||
|                         %       </a> | ||||
|                         %}; | ||||
|                       <%= $c->render_to_string(inline => $actionBack) %> | ||||
| 		</span> | ||||
| 		 | ||||
| 	 | ||||
| 		%# Probably finally by a submit. | ||||
| 	%end     | ||||
| </div> | ||||
| @@ -1,126 +0,0 @@ | ||||
| %# | ||||
| %# Generated by SM2Gen version:0.8 Chameleon version:4.5.4 On Python:3.12.3 at 2024-12-01 15:22:43  | ||||
| %# | ||||
| <div id="Letsencrypt-LIST" class="partial Letsencrypt-LIST"> | ||||
| 	<script> | ||||
| 		window.onload = function() { | ||||
| 		SelectInput(); | ||||
| 	}; | ||||
| 	</script> | ||||
| 	% if ($config->{debug} == 1) { | ||||
| 		<pre> | ||||
| 			%= dumper $lets_data | ||||
| 		</pre> | ||||
| 	% } | ||||
| 	% my $btn = l('lets_APPLY'); | ||||
| 	%= form_for "letsencryptu" => (method => 'POST') => begin | ||||
| 		% param 'trt' => $lets_data->{trt} unless param 'trt'; | ||||
| 		%= hidden_field 'trt' => $lets_data->{trt} | ||||
| 		%# Inputs etc in here. | ||||
|  | ||||
| 		<div class=inline-buttons> | ||||
| 		 | ||||
| 	 | ||||
| 		<a href='letsencryptd?trt=PARAMS' class='link link2'> | ||||
| 			%= l('lets_CONFIG') | ||||
| 		</a> | ||||
| 		%#= link_to l('lets_CONFIG'), 'letsencryptd?trt=PARAMS' , class=>'link link2' | ||||
| 	 | ||||
| 	 | ||||
| 		<a href='letsencryptd?trt=CHECKALLDOMAINS' class='link link3'> | ||||
| 			%= l('lets_CHECK_ALL_DOMAINS') | ||||
| 		</a> | ||||
| 		%#= link_to l('lets_CHECK_ALL_DOMAINS'), 'letsencryptd?trt=CHECKALLDOMAINS' , class=>'link link3' | ||||
| 	 | ||||
| 	 | ||||
| 		<a href='letsencryptd?trt=CHECKALLENABLEDDOMAINS' class='link link4'> | ||||
| 			%= l('lets_CHECK_ALL_ENABLED_DOMAINS') | ||||
| 		</a> | ||||
| 		%#= link_to l('lets_CHECK_ALL_ENABLED_DOMAINS'), 'letsencryptd?trt=CHECKALLENABLEDDOMAINS' , class=>'link link4' | ||||
| 	 | ||||
| 	 | ||||
| 		</div> | ||||
| 		 | ||||
| 	 | ||||
| 		<h2 class='subh2'><%=l('lets_For_this_Server')%></h2> | ||||
| 	 | ||||
| 		<p><span class=label> | ||||
| 			%=l('lets_Internal_IP') | ||||
| 		</span><span class=data> | ||||
| 			% param 'InternalIP' => $lets_data->{InternalIP} unless param 'InternalIP'; | ||||
| 			%= text_field 'InternalIP', size => '50', class => 'textinput InternalIP' , pattern=>'.*' , placeholder=>'InternalIP', Readonly=>'true' | ||||
| 		<br></span></p> | ||||
| 	 | ||||
| 		<p><span class=label> | ||||
| 			%=l('lets_External_Interface_IP') | ||||
| 		</span><span class=data> | ||||
| 			% param 'ExternalIP' => $lets_data->{ExternalIP} unless param 'ExternalIP'; | ||||
| 			%= text_field 'ExternalIP', size => '50', class => 'textinput ExternalIP' , pattern=>'.*' , placeholder=>'ExternalIP', Readonly=>'true' | ||||
| 		<br></span></p> | ||||
| 	 | ||||
| 		<p><span class=label> | ||||
| 			%=l('lets_Internet_IP') | ||||
| 		</span><span class=data> | ||||
| 			% param 'InternetIP' => $lets_data->{InternetIP} unless param 'InternetIP'; | ||||
| 			%= text_field 'InternetIP', size => '50', class => 'textinput InternetIP' , pattern=>'.*' , placeholder=>'InternetIP', Readonly=>'true' | ||||
| 		<br></span></p> | ||||
| 	 | ||||
| 		<h2 class='subh3'><%=l('lets_Current_certificate_details')%></h2> | ||||
| 	 | ||||
| 		<p><span class=label> | ||||
| 			%=l('lets_Issuer') | ||||
| 		</span><span class=data> | ||||
| 			% param 'Issuer' => $lets_data->{Issuer} unless param 'Issuer'; | ||||
| 			%= text_field 'Issuer', size => '50', class => 'textinput Issuer' , pattern=>'.*' , placeholder=>'Issuer', Readonly=>'true' | ||||
| 		<br></span></p> | ||||
| 	 | ||||
| 		<p><span class=label> | ||||
| 			%=l('lets_Expiry') | ||||
| 		</span><span class=data> | ||||
| 			% param 'Expiry' => $lets_data->{Expiry} unless param 'Expiry'; | ||||
| 			%= text_field 'Expiry', size => '50', class => 'textinput Expiry' , pattern=>'.*' , placeholder=>'Expiry', Readonly=>'true' | ||||
| 		<br></span></p> | ||||
| 	 | ||||
| 		<p><span class=label> | ||||
| 			%=l('lets_Not_Before') | ||||
| 		</span><span class=data> | ||||
| 			% param 'NotBefore' => $lets_data->{NotBefore} unless param 'NotBefore'; | ||||
| 			%= text_field 'NotBefore', size => '50', class => 'textinput NotBefore' , pattern=>'.*' , placeholder=>'NotBefore', Readonly=>'true' | ||||
| 		<br></span></p> | ||||
| 	 | ||||
| 		<h2 class='subh4'><%=l('lets_List_of_Domains_and_Hosts')%></h2> | ||||
| 	 | ||||
| 		<br /><table class="sme-border TableSort sme-table tabl1 "> | ||||
| 			<thead class='tabl1'> | ||||
| 				<tr table-head-row> | ||||
| 					<th class='sme-border table-head-col table-head-col-Domain name / HOSTNAME '><%=l('lets_Domain_name_/_HOSTNAME')%></th> | ||||
| 					<th class='sme-border table-head-col table-head-col-Brief description '><%=l('lets_Brief_description')%></th> | ||||
| 					<th class='sme-border table-head-col table-head-col-Content '><%=l('lets_Content')%></th> | ||||
| 					<th class='sme-border table-head-col table-head-col-LABEL_NAMESERVERS '><%=l('lets_LABEL_NAMESERVERS')%></th> | ||||
| 					<th class='sme-border table-head-col table-head-col-LABEL_POINT '><%=l('lets_LABEL_POINT')%></th> | ||||
| 					<th class='sme-border table-head-col table-head-col-LABEL_LECERT '><%=l('lets_LABEL_LECERT')%></th> | ||||
| 					<th class='sme-border table-head-col table-head-col-IS_IN_CERT '><%=l('lets_IS_IN_CERT')%></th> | ||||
| 					<th class='sme-border table-head-col table-head-col-CHECK '><%=l('lets_CHECK')%></th> | ||||
| 				</tr> | ||||
| 			</thead> | ||||
| 			<tbody class='tabl1'> | ||||
| 				% my $control_data = $c->stash('DomainList'); | ||||
| 				% foreach my $row (@$control_data) { | ||||
| 				<tr class='table-row'> | ||||
| 					<td class='sme-border table-col table-col-Table1-Domain name / HOSTNAME'><%=$c->render_to_string(inline=>$row->{'Table1-Domain name / HOSTNAME'})%></td> | ||||
| 					<td class='sme-border table-col table-col-Table1-Brief description'><%=$c->render_to_string(inline=>$row->{'Table1-Brief description'})%></td> | ||||
| 					<td class='sme-border table-col table-col-Table1-Content'><%=$c->render_to_string(inline=>$row->{'Table1-Content'})%></td> | ||||
| 					<td class='sme-border table-col table-col-Table1-LABEL_NAMESERVERS'><%=$c->render_to_string(inline=>$row->{'Table1-LABEL_NAMESERVERS'})%></td> | ||||
| 					<td class='sme-border table-col table-col-Table1-LABEL_POINT'><%=$c->render_to_string(inline=>$row->{'Table1-LABEL_POINT'})%></td> | ||||
| 					<td class='sme-border table-col table-col-Table1-LABEL_LECERT'><%=$c->render_to_string(inline=>$row->{'Table1-LABEL_LECERT'})%></td> | ||||
| 					<td class='sme-border table-col table-col-Table1-IS_IN_CERT'><%=$c->render_to_string(inline=>$row->{'Table1-IS_IN_CERT'})%></td> | ||||
| 					<td class='sme-border table-col table-col-Table1-CHECK'><%=$c->render_to_string(inline=>$row->{'Table1-CHECK'})%></td>		 | ||||
| 				</tr> | ||||
| 				%} | ||||
| 			</tbody> | ||||
| 		</table> | ||||
| 		 | ||||
| 	 | ||||
| 		%# Probably finally by a submit. | ||||
| 	%end     | ||||
| </div> | ||||
| @@ -1,97 +0,0 @@ | ||||
| %# | ||||
| %# Generated by SM2Gen version:0.8 Chameleon version:4.5.4 On Python:3.12.3 at 2024-12-01 15:22:43  | ||||
| %# | ||||
| <div id="Letsencrypt-PARAMS" class="partial Letsencrypt-PARAMS"> | ||||
| 	<script> | ||||
| 		window.onload = function() { | ||||
| 		SelectInput(); | ||||
| 	}; | ||||
| 	</script> | ||||
| 	% if ($config->{debug} == 1) { | ||||
| 		<pre> | ||||
| 			%= dumper $lets_data | ||||
| 		</pre> | ||||
| 	% } | ||||
| 	% my $btn = l('lets_APPLY'); | ||||
| 	%= form_for "letsencryptu" => (method => 'POST') => begin | ||||
| 		% param 'trt' => $lets_data->{trt} unless param 'trt'; | ||||
| 		%= hidden_field 'trt' => $lets_data->{trt} | ||||
| 		%# Inputs etc in here. | ||||
|  | ||||
| 		<h2 class='subh'><%=l('lets_Manage_letsencrypt-config_settings:')%></h2> | ||||
| 	 | ||||
| 		<p class='paragraph para1'> | ||||
| 			%=l('lets_CONFIG_LETSENCRYPT') | ||||
| 		</p> | ||||
| 	 | ||||
| 		<p><span class=label> | ||||
| 			%=l('lets_SERVICE_STATUS') | ||||
| 		</span><span class=data> | ||||
| 			% my @status_options = [['Disabled' => 'disabled'], ['Enabled' => 'enabled'], ['TEST' => 'test']]; | ||||
| 			% param 'status' => $lets_data->{status} unless param 'status'; | ||||
| 			%= select_field 'status' => @status_options, class => 'input' | ||||
| 		<br></span>	</p> | ||||
| 	 | ||||
| 		<p><span class=label> | ||||
| 			%=l('lets_HOOKSCRIPT_STATUS') | ||||
| 		</span><span class=data> | ||||
| 			% my @hookScript_options = [['Disabled' => 'disabled'], ['Enabled' => 'enabled']]; | ||||
| 			% param 'hookScript' => $lets_data->{hookScript} unless param 'hookScript'; | ||||
| 			%= select_field 'hookScript' => @hookScript_options, class => 'input' | ||||
| 		<br></span>	</p> | ||||
| 	 | ||||
| 		<p><span class=label> | ||||
| 			%=l('lets_HOSTOVERRIDE_STATUS') | ||||
| 		</span><span class=data> | ||||
| 			% my @hostOverride_options = [['Disabled' => 'disabled'], ['Yes' => 'yes']]; | ||||
| 			% param 'hostOverride' => $lets_data->{hostOverride} unless param 'hostOverride'; | ||||
| 			%= select_field 'hostOverride' => @hostOverride_options, class => 'input' | ||||
| 		<br></span>	</p> | ||||
| 	 | ||||
| 		<p><span class=label> | ||||
| 			%=l('lets_ACCEPT_TERMS_STATUS') | ||||
| 		</span><span class=data> | ||||
| 			% my @ACCEPT_TERMS_options = [['Disabled' => 'disabled'], ['Yes' => 'yes']]; | ||||
| 			% param 'ACCEPT_TERMS' => $lets_data->{ACCEPT_TERMS} unless param 'ACCEPT_TERMS'; | ||||
| 			%= select_field 'ACCEPT_TERMS' => @ACCEPT_TERMS_options, class => 'input' | ||||
| 		<br></span>	</p> | ||||
| 	 | ||||
| 		<p><span class=label> | ||||
| 			%=l('lets_API_STATUS') | ||||
| 		</span><span class=data> | ||||
| 			% my @API_options = [['2' => '2']]; | ||||
| 			% param 'API' => $lets_data->{API} unless param 'API'; | ||||
| 			%= select_field 'API' => @API_options, class => 'input' | ||||
| 		<br></span>	</p> | ||||
| 	 | ||||
| 		<p><span class=label> | ||||
| 			%=l('lets_KEYSIZE_STATUS') | ||||
| 		</span><span class=data> | ||||
| 			% my @keysize_options = [['2048' => '2048'], ['3072' => '3072'], ['4096' => '4096']]; | ||||
| 			% param 'keysize' => $lets_data->{keysize} unless param 'keysize'; | ||||
| 			%= select_field 'keysize' => @keysize_options, class => 'input' | ||||
| 		<br></span>	</p> | ||||
| 	 | ||||
| 		<p><span class=label> | ||||
| 			%=l('lets_CONFIGUREMODE_STATUS') | ||||
| 		</span><span class=data> | ||||
| 			% my @configure_options = [['ALL' => 'all'], ['Domains' => 'domains'], ['HOSTS' => 'hosts'], ['NONE' => 'none']]; | ||||
| 			% param 'configure' => $lets_data->{configure} unless param 'configure'; | ||||
| 			%= select_field 'configure' => @configure_options, class => 'input' | ||||
| 		<br></span>	</p> | ||||
| 	 | ||||
| 		<p><span class=label> | ||||
| 			%=l('lets_EMAIL') | ||||
| 		</span><span class=data> | ||||
| 			% param 'email' => $lets_data->{email} unless param 'email'; | ||||
| 			%=email_field 'email', class => 'emai8' | ||||
| 		</span></p> | ||||
| 		 | ||||
| 	 | ||||
| 		<span class='data'> | ||||
| 			%= submit_button l('lets_Save'), class => 'action subm9' | ||||
| 		</span> | ||||
| 	 | ||||
| 		%# Probably finally by a submit. | ||||
| 	%end     | ||||
| </div> | ||||
| @@ -30,7 +30,7 @@ | ||||
|     % my $btn = l('ADD'); | ||||
|     % my $network_db = esmith::NetworksDB->open(); | ||||
|      | ||||
|    % if ($config->{debug} == 1) { | ||||
|    % if (config->{debug} == 1) { | ||||
| 	<p> | ||||
| 	%= dumper $c->current_route | ||||
| 	%= dumper $c->stash("ret") | ||||
|   | ||||
| @@ -5,7 +5,7 @@ | ||||
|     % my $subnet = $ln_datas->{subnet}; | ||||
|     % my $router = $ln_datas->{router}; | ||||
|      | ||||
|    % if ($config->{debug} == 1) { | ||||
|    % if (config->{debug} == 1) { | ||||
| 	<p> | ||||
| 	%= dumper $c->current_route | ||||
| 	%= dumper $c->stash("ret") | ||||
|   | ||||
| @@ -7,7 +7,7 @@ | ||||
| 	% unless (length($retref)) {%ret = (ret=>"");} | ||||
| 	% else {%ret = %$retref;} | ||||
|  | ||||
|     % if ($config->{debug} == 1) { | ||||
|     % if (config->{debug} == 1) { | ||||
| 	<p> | ||||
| 		%= dumper "Ret:".$ret{ret}; | ||||
| 	</p>	 | ||||
|   | ||||
| @@ -29,7 +29,7 @@ | ||||
| 	<br /> | ||||
|     % my $btn = l('ADD'); | ||||
|      | ||||
|    % if ($config->{debug} == 1) { | ||||
|    % if (config->{debug} == 1) { | ||||
| 	<p> | ||||
| 	%= dumper $c->current_route | ||||
| 	%= dumper $c->stash("ret") | ||||
|   | ||||
| @@ -8,7 +8,7 @@ | ||||
|     % my $cmmnt = $pf_datas->{cmmnt}; | ||||
|     % my $allow = $pf_datas->{allow}; | ||||
|      | ||||
|    % if ($config->{debug} == 1) { | ||||
|    % if (config->{debug} == 1) { | ||||
| 	<p> | ||||
| 	%= dumper $c->current_route | ||||
| 	%= dumper $c->stash("ret") | ||||
|   | ||||
| @@ -59,11 +59,11 @@ | ||||
|             %= t td => (class => 'sme-border') => "$first  $last" | ||||
|             %= t td => (class => 'sme-border') => $vpnaccess | ||||
|             %= t td => (class => 'sme-border') => $fwd | ||||
| 			%my ($actionModify, $actionLock, $actionResetPw, $actionRemove,$actionroundcube) = ' '; | ||||
| 			%my $modify_text = l('MODIFY');  # Localized text | ||||
| 			%my $csrf_token = "TOKEN";  # CSRF token for security | ||||
| 			%my $useraccounts_user_name = $user->key;  # useraccountss_entry name extracted from the data structure | ||||
| 			%my $password_text = l("PASSWORD_RESET"); | ||||
| 			% my ($actionModify, $actionLock, $actionResetPw, $actionRemove,$actionroundcube) = ' '; | ||||
| 			% my $modify_text = l('MODIFY');  # Localized text | ||||
| 			% my $csrf_token = "TOKEN";  # CSRF token for security | ||||
| 			% my $useraccounts_user_name = $user->key;  # useraccountss_entry name extracted from the data structure | ||||
| 			% my $password_text = l("PASSWORD_RESET"); | ||||
| 			%if ($useraccounts_user_name eq 'admin')  {  | ||||
| 				%$actionModify = qq{ | ||||
| 					%<a href="useraccountsd?CsrfDef=$csrf_token&trt=UPS&user=$useraccounts_user_name"> | ||||
| @@ -98,9 +98,9 @@ | ||||
| 					%</a> | ||||
| 				%}; | ||||
| 			%} elsif ($useraccounts_user_name ne 'admin') { | ||||
| 				%my $lock_text = l('ACCOUNT LOCKED');  # Localized text | ||||
| 				%my $csrf_token = "TOKEN";  # CSRF token for security | ||||
| 				%my $useraccounts_user_name = $user->key;  # useraccountss_entry name extracted from the data structure | ||||
| 				% my $lock_text = l('ACCOUNT LOCKED');  # Localized text | ||||
| 				% my $csrf_token = "TOKEN";  # CSRF token for security | ||||
| 				% my $useraccounts_user_name = $user->key;  # useraccountss_entry name extracted from the data structure | ||||
| 				%$actionLock = qq{ | ||||
| 					%<a href="useraccountsd?CsrfDef=$csrf_token&trt=LCK&user=$useraccounts_user_name"> | ||||
| 						%	<button type='button' class='sme-lock-button' title='$lock_text' > | ||||
| @@ -117,8 +117,8 @@ | ||||
| 					%}; | ||||
| 			%} | ||||
| 			%if ( $removable eq 'yes' )  {  | ||||
| 				%my $remove_text = l('REMOVE');  # Localized text | ||||
| 				%my $csrf_token = "TOKEN";  # CSRF token for security | ||||
| 				% my $remove_text = l('REMOVE');  # Localized text | ||||
| 				% my $csrf_token = "TOKEN";  # CSRF token for security | ||||
| 				%$actionRemove = qq{ | ||||
| 					%<a href="useraccountsd?CsrfDef=$csrf_token&trt=DEL&user=$useraccounts_user_name"> | ||||
| 					%	<button type='button' class='sme-remove-button' title='$remove_text' > | ||||
| @@ -128,13 +128,12 @@ | ||||
| 				%}; | ||||
| 			%} | ||||
| 			 | ||||
| 			%my $thisdomain = session 'SystemName'; | ||||
| 			%$thisdomain .= ".".session 'DomainName'; | ||||
| 			%my $roundcube_text = l('Webmail');  # Localized text | ||||
| 			%my $csrf_token = "TOKEN";  # CSRF token for security | ||||
| 			%my $useraccounts_user_name = $user->key;  # useraccountss_entry name extracted from the data structure | ||||
| 			%$actionroundcube = qq{ | ||||
| 				%<a href="roundcubepanel?CsrfDef=$csrf_token&url=https://$thisdomain/roundcube?_user=$useraccounts_user_name"> | ||||
| 		    % my $thisdomain = $c->req->url->to_abs->host; | ||||
| 			% my $roundcube_text = l('Webmail');  # Localized text | ||||
| 			% $csrf_token = "TOKEN";  # CSRF token for security | ||||
| 			% $useraccounts_user_name = $user->key;  # useraccountss_entry name extracted from the data structure | ||||
| 			% $actionroundcube = qq{ | ||||
| 				%<a href="roundcubepanel?CsrfDef=$csrf_token&url=https://$thisdomain/roundcube?_user=$useraccounts_user_name&height=600px"> | ||||
| 				%	<button type='button' class='sme-email-button' title='$roundcube_text' > | ||||
| 				%		$roundcube_text | ||||
| 				%	</button> | ||||
| @@ -156,4 +155,4 @@ | ||||
|  | ||||
|         %= hidden_field 'trt' => $usr_datas->{trt} | ||||
|  | ||||
| </div> | ||||
| </div> | ||||
|   | ||||
| @@ -18,7 +18,7 @@ | ||||
| 	<span class=label> | ||||
| 	%=l 'PASSWORD_NEW', class => 'label' | ||||
| 	</span><span class=data> | ||||
| 	%= password_field 'newPass', class => 'input' | ||||
| 	%= password_field 'newPass', class => 'input', class=>'sme-password' | ||||
| 	</span> | ||||
| 	</p> | ||||
|  | ||||
| @@ -26,7 +26,7 @@ | ||||
| 	<span class=label> | ||||
| 	%=l 'PASSWORD_VERIFY_NEW', class => 'label' | ||||
| 	</span><span class=data> | ||||
| 	%= password_field 'newPassVerify', class => 'input' | ||||
| 	%= password_field 'newPassVerify', class => 'input', class=>'sme-password' | ||||
| 	</span> | ||||
| 	</p> | ||||
|  | ||||
| @@ -41,4 +41,4 @@ | ||||
| 	 | ||||
|     % end     | ||||
|  | ||||
| </div> | ||||
| </div> | ||||
| @@ -11,7 +11,7 @@ | ||||
| 	<span class=label> | ||||
| 	%=l 'usr_CURRENT_SYSTEM_PASSWORD', class => 'label' | ||||
| 	</span><span class=data> | ||||
| 	%= password_field 'CurPass', class => 'input' | ||||
| 	%= password_field 'CurPass', class => 'input', class=>'sme-password' | ||||
| 	</span> | ||||
| 	</p> | ||||
|  | ||||
| @@ -19,7 +19,7 @@ | ||||
| 	<span class=label> | ||||
| 	%=l 'usr_NEW_SYSTEM_PASSWORD', class => 'label' | ||||
| 	</span><span class=data> | ||||
| 	%= password_field 'Pass', class => 'input' | ||||
| 	%= password_field 'Pass', class => 'input', class=>'sme-password' | ||||
| 	</span> | ||||
| 	</p> | ||||
|  | ||||
| @@ -27,7 +27,7 @@ | ||||
| 	<span class=label> | ||||
| 	%=l 'usr_NEW_SYSTEM_PASSWORD_VERIFY', class => 'label' | ||||
| 	</span><span class=data> | ||||
| 	%= password_field 'PassVerify', class => 'input' | ||||
| 	%= password_field 'PassVerify', class => 'input', class=>'sme-password' | ||||
| 	</span> | ||||
| 	</p> | ||||
|  | ||||
| @@ -42,4 +42,4 @@ | ||||
| 	 | ||||
|     % end | ||||
|  | ||||
| </div> | ||||
| </div> | ||||
| @@ -3,7 +3,7 @@ | ||||
| % content_for 'module' => begin | ||||
| <div id='module' class='module portforwarding-panel'> | ||||
|  | ||||
|     % if ($config->{debug} == 1) { | ||||
|     % if (config->{debug} == 1) { | ||||
| 	<p> | ||||
| 		%= dumper "<pf>".$c->current_route | ||||
| 		%= dumper $c->stash("ret") | ||||
|   | ||||
| @@ -3,7 +3,7 @@ | ||||
| % content_for 'module' => begin | ||||
| <div id='module' class='module printers-panel'> | ||||
|  | ||||
|     %if ($config->{debug} == 1) { | ||||
|     %if (config->{debug} == 1) { | ||||
| 	<p> | ||||
| 	%= dumper $c->current_route | ||||
| 	%= dumper $prt_datas | ||||
|   | ||||
| @@ -2,7 +2,7 @@ | ||||
|  | ||||
| % content_for 'module' => begin | ||||
| <div id='module' class='module proxy-panel'> | ||||
|     %if ($config->{debug} == 1) { | ||||
|     %if (config->{debug} == 1) { | ||||
| 	<p>(DBG)route: <%= $c->current_route %><br> | ||||
| 	(DBG)ht stat: <%= $prx_datas->{http_proxy_status}%> <br> | ||||
| 	(DBG)sm stat: <%=$prx_datas->{smtp_proxy_status} %> | ||||
|   | ||||
| @@ -3,7 +3,7 @@ | ||||
| % content_for 'module' => begin | ||||
| <div id='module' class='module pseudonyms-panel'> | ||||
|  | ||||
|     % if ($config->{debug} == 1) { | ||||
|     % if (config->{debug} == 1) { | ||||
| 	<p> | ||||
| 	%= dumper $c->current_route | ||||
| 	%= dumper $pse_datas | ||||
|   | ||||
| @@ -2,7 +2,7 @@ | ||||
|  | ||||
| % content_for 'module' => begin | ||||
| <div id='module' class='module qmailanalog-panel'> | ||||
|     %if ($config->{debug} == 1) { | ||||
|     %if (config->{debug} == 1) { | ||||
| 	<p> | ||||
| 	(DBG)route: <%= $c->current_route %><br> | ||||
| 	</p> | ||||
|   | ||||
| @@ -3,7 +3,7 @@ | ||||
| % content_for 'module' => begin | ||||
| <div id='module' class='module quota-panel'> | ||||
|  | ||||
|     % if ($config->{debug} == 1) { | ||||
|     % if (config->{debug} == 1) { | ||||
| 	<p> | ||||
| 	%= dumper $c->current_route | ||||
| 	%= dumper $quo_datas | ||||
|   | ||||
| @@ -4,7 +4,7 @@ | ||||
|  | ||||
| <div id='module' class='module reboot-panel'> | ||||
|  | ||||
|     %if ($config->{debug} == 1) { | ||||
|     %if (config->{debug} == 1) { | ||||
| 	<p> | ||||
| 	(DBG)route: <%= $c->current_route %><br> | ||||
| 	</p> | ||||
| @@ -20,16 +20,15 @@ | ||||
|  | ||||
| 	<p> | ||||
|     %= $c->render_to_string(inline => $c->l('rbo_DESCRIPTION')) | ||||
|     <br> | ||||
|     <br><br> | ||||
|  | ||||
| 	<span class=label> | ||||
| 	%=l 'rbo_LABEL_REBOOT' | ||||
| 	</span> | ||||
|  | ||||
| 	<span class=data> | ||||
| 	%= select_field 'function' => $c->rebootFunction_list() | ||||
| 	</span> | ||||
| 	</p> | ||||
| 	</p><br> | ||||
|  | ||||
| 	%= submit_button "$btn", class => 'action' | ||||
|  | ||||
| @@ -38,4 +37,4 @@ | ||||
|     %= hidden_field 'debug' => '1' | ||||
|  | ||||
| </div> | ||||
| %end | ||||
| %end | ||||
| @@ -3,7 +3,7 @@ | ||||
| % content_for 'module' => begin | ||||
| <div id='module' class='module remoteaccess-panel'> | ||||
|  | ||||
|     % if ($config->{debug} == 1) { | ||||
|     % if (config->{debug} == 1) { | ||||
| 	<p> | ||||
| 	%= dumper $c->current_route | ||||
| 	%= dumper $rma_datas | ||||
|   | ||||
| @@ -4,7 +4,7 @@ | ||||
|  | ||||
|  | ||||
| <div id='roundcube' class='roundcube roundcube-panel'> | ||||
|     % if ($config->{debug} == 1) { | ||||
|     % if (config->{debug} == 1) { | ||||
| 		<p> | ||||
| 			%= dumper $c->current_route | ||||
| 		</p> | ||||
| @@ -14,25 +14,26 @@ | ||||
| 			%= $c->render_to_string(inline => stash 'error')  | ||||
| 		</div> | ||||
|     %} | ||||
|     <h1> roundcube - <%=$title %></h1><br> | ||||
|     <p>If the roundcube panel does not appear after logging in, then please check your password.</p><br /> | ||||
|     <h1><%=$title %></h1><br> | ||||
|     <p>If the Webmail panel does not appear after logging in, then please check your password.</p><br /> | ||||
|  | ||||
|     % my $thisdomain = session 'SystemName'; | ||||
|     % $thisdomain .= ".".session 'DomainName'; | ||||
|     % my $thisdomain = $c->req->url->to_abs->host; | ||||
|     % my $url = $c->stash('modul'); | ||||
|     % if (!$url) { | ||||
| 	%	$url = $thisdomain."/roundcube"; | ||||
| 	%} | ||||
|     % my $username = 'admin'; | ||||
|     % if ($url =~ /[?&]_user=([^&]+)/) { | ||||
| 	%	$username = $1; | ||||
| 	%} | ||||
| 	 | ||||
| 	<a href="<%= "https://".$thisdomain."/" %>roundcube?_user=<%= $username %>"><button class="sme-fullwindow1-button" width=20em title="<%= l('Full Window') %>"><%= l('Full Window') %></button></a> | ||||
|  | ||||
|     % my $height = $c->stash('height') | '600px'; | ||||
|     % if ($height !~ /px$/) { $height = $height.'px';} | ||||
|     % if ($url eq "") { | ||||
| 	%	$url = "https://".$thisdomain."/roundcube"; | ||||
| 	% if (!($url =~ /https:/)) { | ||||
|     % $url = 'https://' . $url; | ||||
| 	%} | ||||
| 	<object id="roundcube" class="roundcube" data="<%=$url %>" style="width:99%;height:<%= $height %>;" title="<%= $c->stash('title') %>"  type="text/html" ><%= $c->stash('title') %> not found</object> | ||||
|  | ||||
|     <div class='roundcube'> | ||||
| 		<a href="<%= "https://".$thisdomain."/" %>roundcube?_user=<%= $username %>"><button class="sme-fullwindow1-button" width=20em title="<%= l('Full Window') %>"><%= l('Full Window') %></button></a> | ||||
| 		<object id="roundcube" data="<%=$url %>" title="<%= $c->stash('title') %>"  type="text/html" ><%= $c->stash('title') %> not found</object> | ||||
| 	</div> | ||||
| </div> | ||||
|  | ||||
|  | ||||
|   | ||||
Some files were not shown because too many files have changed in this diff Show More
		Reference in New Issue
	
	Block a user