Compare commits
	
		
			30 Commits
		
	
	
		
			11_0_0-44_
			...
			11_0_0-66_
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 63973f2bb4 | |||
| 82ff48e641 | |||
| c5d863b3a0 | |||
| 4f00dfbdb1 | |||
| f9bf8cf064 | |||
| 4f0617f6c3 | |||
| 4c94d768e2 | |||
| 1731f75cba | |||
| 5fe285f9f2 | |||
| 1c93be6e8a | |||
| ce96f72726 | |||
| 0fd7137edd | |||
| d179b06f69 | |||
| c2427189d5 | |||
| 887af04bfe | |||
| 34b85b1cde | |||
| a5758b4431 | |||
| 58aa423089 | |||
| c0b4d1f90e | |||
| a979d472e8 | |||
| d776f20736 | |||
| a4668da720 | |||
| 7ad224998c | |||
| 3070e0656c | |||
| 642d013437 | |||
| a62968d2d9 | |||
| 0e777fd51a | |||
| eee68afa2b | |||
| c2d677594b | |||
| f6fe2216a0 | 
@@ -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");
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										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
 | 
			
		||||
}
 | 
			
		||||
}
 | 
			
		||||
@@ -275,7 +275,19 @@ 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
 | 
			
		||||
}
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										9
									
								
								root/usr/lib/systemd/system/bootsequence.service
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										9
									
								
								root/usr/lib/systemd/system/bootsequence.service
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,9 @@
 | 
			
		||||
[Unit]
 | 
			
		||||
Description=Koozali SME Server boot diagnostic tool
 | 
			
		||||
After=sme-server.target
 | 
			
		||||
PartOf=sme-server.target
 | 
			
		||||
 | 
			
		||||
[Service]
 | 
			
		||||
Type=oneshot
 | 
			
		||||
ExecStart=/bin/sh -c "/usr/bin/systemd-analyze plot > /usr/share/smanager/themes/default/public/images/boot.svg"
 | 
			
		||||
RemainAfterExit=yes
 | 
			
		||||
@@ -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
 | 
			
		||||
@@ -40,9 +43,10 @@ $VERSION = eval $VERSION;
 | 
			
		||||
use Exporter 'import';
 | 
			
		||||
our @EXPORT_OK = qw( 
 | 
			
		||||
	init_session get_mod_url theme_list
 | 
			
		||||
	getNavigation ip_number is_normal_password email_simple
 | 
			
		||||
	getNavigation ip_number validate_password is_normal_password email_simple
 | 
			
		||||
	mac_address_or_blank mac_address ip_number_or_blank
 | 
			
		||||
	lang_space get_routes_list subnet_mask get_reg_mask
 | 
			
		||||
	gen_locale_date_string get_public_ip_address
 | 
			
		||||
	);
 | 
			
		||||
 | 
			
		||||
has home => sub {
 | 
			
		||||
@@ -208,6 +212,22 @@ sub setup_helpers {
 | 
			
		||||
	Mojo::JWT->new(secret => shift->app->secrets->[0] || die)
 | 
			
		||||
    });
 | 
			
		||||
 | 
			
		||||
    $self->helper( selected_field => sub {
 | 
			
		||||
                    my $self = shift;
 | 
			
		||||
                    my @options = shift;
 | 
			
		||||
                    my $selected = shift;
 | 
			
		||||
                    my $count = 0;
 | 
			
		||||
                    # search for occurence of value $selected in arrays; if found add selected => 'selected'
 | 
			
		||||
                    for  (my $i = 0; $i <= $#{$options[0]} ; $i++){
 | 
			
		||||
                      if (grep /^$selected$/,  @{$options[0][$i]}) {
 | 
			
		||||
                        push( @{$options[0][$i]} ,'selected', 'selected' );
 | 
			
		||||
                        $count++;last;
 | 
			
		||||
                      }
 | 
			
		||||
                    }
 | 
			
		||||
                    push ( @{$options[0]} ,[ ucfirst( $selected), $selected, 'selected', 'selected'] ) if ($count <1);
 | 
			
		||||
                    return @options;
 | 
			
		||||
    });
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@@ -224,12 +244,12 @@ sub setup_plugins {
 | 
			
		||||
    # CSRF protection if production mode
 | 
			
		||||
#    $self->plugin('Mojolicious::Plugin::CSRFDefender' => {
 | 
			
		||||
#   Adapted plugin for use with GET method
 | 
			
		||||
    $self->plugin('SrvMngr::Plugin::CSRFDefender' => {
 | 
			
		||||
	onetime => 1,
 | 
			
		||||
	error_status => 400,
 | 
			
		||||
	error_content => 'Error: CSRF token is invalid or outdated'
 | 
			
		||||
    #$self->plugin('SrvMngr::Plugin::CSRFDefender' => {
 | 
			
		||||
	#onetime => 1,
 | 
			
		||||
	#error_status => 400,
 | 
			
		||||
	#error_content => 'Error: CSRF token is invalid or outdated'
 | 
			
		||||
    	#error_template => 'csrf_400'
 | 
			
		||||
	}) if ( $self->mode eq 'production' );
 | 
			
		||||
	#}) if ( $self->mode eq 'production' );
 | 
			
		||||
 | 
			
		||||
    $self->plugin('SrvMngr::Plugin::I18N' => {namespace => 'SrvMngr::I18N', default => 'en'});
 | 
			
		||||
 | 
			
		||||
@@ -768,7 +788,23 @@ sub ip_number {
 | 
			
		||||
    return 'OK';
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub validate_password {
 | 
			
		||||
    my ($c, $strength, $pass) = @_;
 | 
			
		||||
    use esmith::util;
 | 
			
		||||
    use POSIX qw(locale_h);
 | 
			
		||||
    use locale;
 | 
			
		||||
    my $old_locale = setlocale(LC_ALL);
 | 
			
		||||
    setlocale(LC_ALL, "en_US");
 | 
			
		||||
    my $reason = esmith::util::validatePassword($pass,$strength);
 | 
			
		||||
    return "OK" if ($reason eq "ok");
 | 
			
		||||
    setlocale(LC_ALL, $old_locale);
 | 
			
		||||
    return
 | 
			
		||||
          $c->l("Bad Password Choice") . ": "
 | 
			
		||||
        . $c->l("The password you have chosen is not a good choice, because") . " "
 | 
			
		||||
        . $c->l($reason). ".";
 | 
			
		||||
} ## end sub validate_password
 | 
			
		||||
 | 
			
		||||
# to deprecate : this is not anymore a way to validate our passwords
 | 
			
		||||
sub is_normal_password {
 | 
			
		||||
 | 
			
		||||
#  from CGI::FormMagick::Validator qw( password );
 | 
			
		||||
@@ -784,6 +820,29 @@ sub is_normal_password {
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub gen_locale_date_string
 | 
			
		||||
{
 | 
			
		||||
    my $self = shift;
 | 
			
		||||
    my $i18n = esmith::I18N->new();
 | 
			
		||||
    $i18n->setLocale('formmagick', $i18n->preferredLanguage());
 | 
			
		||||
    return strftime "%c", localtime;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub get_public_ip_address
 | 
			
		||||
{
 | 
			
		||||
    my $self = shift;
 | 
			
		||||
	my $cdb = esmith::ConfigDB->open() || die "Couldn't open config db";
 | 
			
		||||
    my $sysconfig = $cdb->get('sysconfig');
 | 
			
		||||
    if ($sysconfig)
 | 
			
		||||
    {
 | 
			
		||||
        my $publicIP = $sysconfig->prop('PublicIP');
 | 
			
		||||
        if ($publicIP)
 | 
			
		||||
        {
 | 
			
		||||
            return $publicIP;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    return undef;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub email_simple {
 | 
			
		||||
    my ($c, $data) = @_;
 | 
			
		||||
 
 | 
			
		||||
@@ -32,10 +32,10 @@ use esmith::util;
 | 
			
		||||
use esmith::lockfile;
 | 
			
		||||
use esmith::BlockDevices;
 | 
			
		||||
use constant DEBUG => $ENV{MOJO_SMANAGER_DEBUG} || 0;
 | 
			
		||||
our $cdb = esmith::ConfigDB->open   || die "Couldn't open config db";
 | 
			
		||||
our $adb = esmith::AccountsDB->open || die "Couldn't open accounts db";
 | 
			
		||||
our $rdb = esmith::ConfigDB->open('/etc/e-smith/restore')
 | 
			
		||||
    || die "Couldn't open restore db";
 | 
			
		||||
#our $cdb = esmith::ConfigDB->open   || die "Couldn't open config db"; #remove as cached gives problems
 | 
			
		||||
#our $adb = esmith::AccountsDB->open || die "Couldn't open accounts db";
 | 
			
		||||
#our $rdb = esmith::ConfigDB->open('/etc/e-smith/restore') || die "Couldn't open restore db";
 | 
			
		||||
my ($cdb,$adb,$rdb);
 | 
			
		||||
my $es_backup = new esmith::Backup or die "Couldn't create Backup object\n";
 | 
			
		||||
my @directories = $es_backup->restore_list;
 | 
			
		||||
@directories = grep { -e "/$_" } @directories;
 | 
			
		||||
@@ -52,6 +52,9 @@ sub main {
 | 
			
		||||
    my $c = shift;
 | 
			
		||||
    $c->app->log->info($c->log_req);
 | 
			
		||||
    my %bac_datas = ();
 | 
			
		||||
	$cdb = esmith::ConfigDB->open   || die "Couldn't open config db";
 | 
			
		||||
	$adb = esmith::AccountsDB->open || die "Couldn't open accounts db";
 | 
			
		||||
	$rdb = esmith::ConfigDB->open('/etc/e-smith/restore');
 | 
			
		||||
    my $title     = $c->l('bac_BACKUP_TITLE');
 | 
			
		||||
    my $notif;
 | 
			
		||||
    $bac_datas{'function'} = 'desktop_backup';
 | 
			
		||||
@@ -108,6 +111,9 @@ sub do_display {
 | 
			
		||||
    my $rt = $c->current_route;
 | 
			
		||||
    my ($res, $result) = '';
 | 
			
		||||
    my $function = $c->param('Function');
 | 
			
		||||
	$cdb = esmith::ConfigDB->open   || die "Couldn't open config db";
 | 
			
		||||
	$adb = esmith::AccountsDB->open || die "Couldn't open accounts db";
 | 
			
		||||
	$rdb = esmith::ConfigDB->open('/etc/e-smith/restore');
 | 
			
		||||
 | 
			
		||||
    if ($function =~ /^(\S+)$/) {
 | 
			
		||||
        $function = $1;
 | 
			
		||||
@@ -129,7 +135,11 @@ sub do_display {
 | 
			
		||||
        $c->stash(compressionlevel => $CompressionLevel, exclude => \@exclude, directories => \@directories);
 | 
			
		||||
 | 
			
		||||
        # streaming download in template
 | 
			
		||||
        return $c->render("/backdown");
 | 
			
		||||
        $c->render(template=>"backdown");
 | 
			
		||||
        #sleep(30);
 | 
			
		||||
        # Redirect to the front page
 | 
			
		||||
		#$c->redirect_to('/backup');
 | 
			
		||||
        return ""
 | 
			
		||||
    } ## end if ($function eq 'desktop_backup')
 | 
			
		||||
 | 
			
		||||
    if ($function eq 'tape_configure') {
 | 
			
		||||
@@ -265,6 +275,9 @@ sub do_update {
 | 
			
		||||
    my $c = shift;
 | 
			
		||||
    $c->app->log->info($c->log_req);
 | 
			
		||||
    my $rt       = $c->current_route;
 | 
			
		||||
	$cdb = esmith::ConfigDB->open   || die "Couldn't open config db";
 | 
			
		||||
	$adb = esmith::AccountsDB->open || die "Couldn't open accounts db";
 | 
			
		||||
	$rdb = esmith::ConfigDB->open('/etc/e-smith/restore');
 | 
			
		||||
    my $function = $c->param('Function');
 | 
			
		||||
    DEBUG && warn("do_update $function");
 | 
			
		||||
    my %bac_datas = ();
 | 
			
		||||
@@ -513,13 +526,13 @@ sub do_update {
 | 
			
		||||
 | 
			
		||||
    # common part for all functions
 | 
			
		||||
    if ($res ne 'OK') {
 | 
			
		||||
 | 
			
		||||
        if ($res eq 'NEXT') {
 | 
			
		||||
            $dest = 'back_' . $bac_datas{"function"};
 | 
			
		||||
        } else {
 | 
			
		||||
            $c->stash(error => $result);
 | 
			
		||||
            $dest = "back_$function";
 | 
			
		||||
        }
 | 
			
		||||
        $bac_datas{vfstype}        = $c->param('VFSType');
 | 
			
		||||
        $c->stash(title => $title, bac_datas => \%bac_datas);
 | 
			
		||||
        return $c->render($dest);
 | 
			
		||||
    } ## end if ($res ne 'OK')
 | 
			
		||||
@@ -1847,7 +1860,7 @@ sub showSize {
 | 
			
		||||
} ## end sub showSize
 | 
			
		||||
 | 
			
		||||
sub desktopBackupRecordStatus {
 | 
			
		||||
    my ($backup, $phase, $status) = @_;
 | 
			
		||||
    my ($c,$backup, $phase, $status) = @_;
 | 
			
		||||
    my $now = time();
 | 
			
		||||
    warn("Backup terminated: $phase failed - status: $status\n");
 | 
			
		||||
    $backup->set_prop('EndEpochTime', "$now");
 | 
			
		||||
@@ -2011,4 +2024,4 @@ sub vmount {
 | 
			
		||||
        return (qx(/bin/mount -t nfs -o nolock,timeo=30,retrans=1,retry=0 "$host:/$share" $mountdir 2>&1));
 | 
			
		||||
    }
 | 
			
		||||
} ## end sub vmount
 | 
			
		||||
1;
 | 
			
		||||
1;
 | 
			
		||||
@@ -14,9 +14,12 @@ use SrvMngr::I18N;
 | 
			
		||||
use SrvMngr qw(theme_list init_session);
 | 
			
		||||
use Text::Template;
 | 
			
		||||
use File::Basename;
 | 
			
		||||
use esmith::FormMagick qw( gen_locale_date_string );
 | 
			
		||||
use SrvMngr qw( gen_locale_date_string );
 | 
			
		||||
our $cdb = esmith::ConfigDB->open or die "Couldn't open ConfigDB\n";
 | 
			
		||||
 | 
			
		||||
use constant FALSE => 0;
 | 
			
		||||
use constant TRUE  => 1;
 | 
			
		||||
 | 
			
		||||
# Get some basic info on the current SME install
 | 
			
		||||
our $sysconfig          = $cdb->get('sysconfig');
 | 
			
		||||
our $systemmode         = $cdb->get('SystemMode')->value;
 | 
			
		||||
@@ -78,7 +81,7 @@ sub create_configuration_report {
 | 
			
		||||
    # create the reporting template
 | 
			
		||||
    my $configreport_template = Text::Template->new(
 | 
			
		||||
        TYPE    => 'FILE',
 | 
			
		||||
        SOURCE  => '/etc/e-smith/web/common/configuration_report.tmpl',
 | 
			
		||||
        SOURCE  => '/usr/share/smanager/themes/default/public/configuration_report.tmpl',
 | 
			
		||||
        UNTAINT => 1
 | 
			
		||||
    );
 | 
			
		||||
    my $report_creation_time = gen_locale_date_string;
 | 
			
		||||
@@ -114,13 +117,40 @@ sub create_configuration_report {
 | 
			
		||||
 | 
			
		||||
    # prcess template
 | 
			
		||||
    my $result = $configreport_template->fill_in(HASH => \%vars);
 | 
			
		||||
    
 | 
			
		||||
    #take out any multiple blank lines
 | 
			
		||||
    #$result =~ s/\n{3,}/\n/g;
 | 
			
		||||
    
 | 
			
		||||
 | 
			
		||||
    # write processed template to file
 | 
			
		||||
    open(my $cfgrep, '>', $configreportfile) or die "Could not create temporary file for config report!";
 | 
			
		||||
    print $cfgrep $result;
 | 
			
		||||
    close $cfgrep;
 | 
			
		||||
    
 | 
			
		||||
    #check if boot phase has completed.
 | 
			
		||||
	if (wait_for_boot_completion()) {
 | 
			
		||||
		#And create boot analysis image - now run externally following boot.
 | 
			
		||||
		$result = `/usr/bin/systemctl start bootsequence.service`;
 | 
			
		||||
		if (!$? == 0) {
 | 
			
		||||
			warn "/usr/bin/systemd-analyze plot Command failed \n";
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
  
 | 
			
		||||
} ## end sub create_configuration_report
 | 
			
		||||
 | 
			
		||||
sub wait_for_boot_completion {
 | 
			
		||||
    my $timeout = 60;  # 1-minute timeout
 | 
			
		||||
    my $end_time = time() + $timeout;
 | 
			
		||||
    while (time() < $end_time) {
 | 
			
		||||
        if (`systemctl list-jobs 2>&1` =~ /No jobs running/) {
 | 
			
		||||
            return TRUE;  # Success
 | 
			
		||||
        }
 | 
			
		||||
        sleep 5;
 | 
			
		||||
    }
 | 
			
		||||
    warn "Boot did not complete within $timeout seconds.\n";
 | 
			
		||||
    return FALSE;  # Failure
 | 
			
		||||
} ## end wait_for_boot_completion
 | 
			
		||||
 | 
			
		||||
sub show_config_report {
 | 
			
		||||
    my $c   = shift;
 | 
			
		||||
    my $out = '';
 | 
			
		||||
@@ -143,4 +173,4 @@ sub download_config_report {
 | 
			
		||||
        'cleanup'             => 1,
 | 
			
		||||
    );
 | 
			
		||||
} ## end sub download_config_report
 | 
			
		||||
1;
 | 
			
		||||
1;
 | 
			
		||||
@@ -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');
 | 
			
		||||
 
 | 
			
		||||
@@ -13,21 +13,23 @@ use warnings;
 | 
			
		||||
use Mojo::Base 'Mojolicious::Controller';
 | 
			
		||||
use Locale::gettext;
 | 
			
		||||
use SrvMngr::I18N;
 | 
			
		||||
use SrvMngr qw( theme_list init_session is_normal_password );
 | 
			
		||||
use SrvMngr qw( theme_list init_session validate_password );
 | 
			
		||||
use esmith::AccountsDB;
 | 
			
		||||
use esmith::ConfigDB;
 | 
			
		||||
use esmith::DomainsDB;
 | 
			
		||||
 | 
			
		||||
#use esmith::FormMagick::Panel::ibays;
 | 
			
		||||
our $adb = esmith::AccountsDB->open || die "Couldn't open accounts db";
 | 
			
		||||
our $cdb = esmith::ConfigDB->open() || die "Couldn't open config db";
 | 
			
		||||
#our $adb = esmith::AccountsDB->open || die "Couldn't open accounts db";
 | 
			
		||||
#our $cdb = esmith::ConfigDB->open() || die "Couldn't open config db";
 | 
			
		||||
my ($adb,$cdb);
 | 
			
		||||
 | 
			
		||||
sub main {
 | 
			
		||||
    my $c = shift;
 | 
			
		||||
    $c->app->log->info($c->log_req);
 | 
			
		||||
    my %iba_datas = ();
 | 
			
		||||
    my $title     = $c->l('iba_FORM_TITLE');
 | 
			
		||||
    $iba_datas{'trt'} = 'LIST';
 | 
			
		||||
    $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') || '');
 | 
			
		||||
@@ -379,31 +385,6 @@ sub check_password {
 | 
			
		||||
    return validate_password($c, $strength, $password);
 | 
			
		||||
} ## end sub check_password
 | 
			
		||||
 | 
			
		||||
sub validate_password {
 | 
			
		||||
    my ($c, $strength, $pass) = @_;
 | 
			
		||||
    use Crypt::Cracklib;
 | 
			
		||||
    my $reason;
 | 
			
		||||
 | 
			
		||||
    if ($strength eq "none") {
 | 
			
		||||
        return $c->l("Passwords must be at least 7 characters long") unless (length($pass) > 6);
 | 
			
		||||
        return "OK";
 | 
			
		||||
    }
 | 
			
		||||
    $reason = is_normal_password($c, $pass, undef);
 | 
			
		||||
    return $reason unless ($reason eq "OK");
 | 
			
		||||
    return "OK" unless ($strength eq "strong");
 | 
			
		||||
 | 
			
		||||
    if (-f '/usr/lib64/cracklib_dict.pwd') {
 | 
			
		||||
        $reason = fascist_check($pass, '/usr/lib64/cracklib_dict');
 | 
			
		||||
    } else {
 | 
			
		||||
        $reason = fascist_check($pass, '/usr/lib/cracklib_dict');
 | 
			
		||||
    }
 | 
			
		||||
    $reason ||= "Software error: password check failed";
 | 
			
		||||
    return "OK" if ($reason eq "ok");
 | 
			
		||||
    return
 | 
			
		||||
          $c->l("Bad Password Choice") . ": "
 | 
			
		||||
        . $c->l("The password you have chosen is not a good choice, because") . " "
 | 
			
		||||
        . $c->($reason) . ".";
 | 
			
		||||
} ## end sub validate_password
 | 
			
		||||
 | 
			
		||||
=head2 group_list()
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -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 = scalar 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);
 | 
			
		||||
 
 | 
			
		||||
@@ -134,7 +134,7 @@ sub networkAccess_list {
 | 
			
		||||
    return [
 | 
			
		||||
        [ $c->l('rma_NO_ACCESS')         => 'off' ],
 | 
			
		||||
        [ $c->l('NETWORKS_ALLOW_LOCAL')  => 'private' ],
 | 
			
		||||
        [ $c->l('NETWORKS_ALLOW_PUBLIC') => 'public' ]
 | 
			
		||||
        [ $c->l('NETWORKS_ALLOW_PUBLIC') => 'normal' ]
 | 
			
		||||
    ];
 | 
			
		||||
} ## end sub networkAccess_list
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -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
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -14,7 +14,7 @@ use Mojo::Base 'Mojolicious::Controller';
 | 
			
		||||
use Locale::gettext;
 | 
			
		||||
use SrvMngr::I18N;
 | 
			
		||||
use SrvMngr qw(theme_list init_session
 | 
			
		||||
    is_normal_password email_simple);
 | 
			
		||||
    validate_password email_simple);
 | 
			
		||||
 | 
			
		||||
#use esmith::FormMagick qw( validate_password );
 | 
			
		||||
#use CGI::FormMagick::Validator qw( call_fm_validation );
 | 
			
		||||
@@ -28,13 +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);
 | 
			
		||||
	my $adb = esmith::AccountsDB->open || die "Couldn't open accounts db";
 | 
			
		||||
	$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');
 | 
			
		||||
@@ -53,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') {
 | 
			
		||||
@@ -139,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') {
 | 
			
		||||
 | 
			
		||||
@@ -428,31 +434,6 @@ sub check_password {
 | 
			
		||||
    return validate_password($c, $check_type, $pass1);
 | 
			
		||||
} ## end sub check_password
 | 
			
		||||
 | 
			
		||||
sub validate_password {
 | 
			
		||||
    my ($c, $strength, $pass) = @_;
 | 
			
		||||
    use Crypt::Cracklib;
 | 
			
		||||
    my $reason;
 | 
			
		||||
 | 
			
		||||
    if ($strength eq "none") {
 | 
			
		||||
        return $c->l("Passwords must be at least 7 characters long") unless (length($pass) > 6);
 | 
			
		||||
        return "OK";
 | 
			
		||||
    }
 | 
			
		||||
    $reason = is_normal_password($c, $pass, undef);
 | 
			
		||||
    return $reason unless ($reason eq "OK");
 | 
			
		||||
    return "OK" unless ($strength eq "strong");
 | 
			
		||||
 | 
			
		||||
    if (-f '/usr/lib64/cracklib_dict.pwd') {
 | 
			
		||||
        $reason = fascist_check($pass, '/usr/lib64/cracklib_dict');
 | 
			
		||||
    } else {
 | 
			
		||||
        $reason = fascist_check($pass, '/usr/lib/cracklib_dict');
 | 
			
		||||
    }
 | 
			
		||||
    $reason ||= "Software error: password check failed";
 | 
			
		||||
    return "OK" if ($reason eq "ok");
 | 
			
		||||
    return $c->l("Bad Password Choice") . ": "
 | 
			
		||||
        . $c->l("The password you have chosen is not a good choice, because") . " "
 | 
			
		||||
        . $c->l($reason) . ".";
 | 
			
		||||
} ## end sub validate_password
 | 
			
		||||
 | 
			
		||||
sub emailForward_list {
 | 
			
		||||
    my $c = shift;
 | 
			
		||||
    return [
 | 
			
		||||
@@ -819,4 +800,4 @@ sub system_change_password {
 | 
			
		||||
        return $c->l("Error occurred while modifying password for admin.", 'First');
 | 
			
		||||
    }
 | 
			
		||||
} ## end sub system_change_password
 | 
			
		||||
1
 | 
			
		||||
1
 | 
			
		||||
 
 | 
			
		||||
@@ -16,8 +16,8 @@ use esmith::ConfigDB;
 | 
			
		||||
use esmith::AccountsDB;
 | 
			
		||||
use Locale::gettext;
 | 
			
		||||
use SrvMngr::I18N;
 | 
			
		||||
use SrvMngr qw( theme_list init_session is_normal_password );
 | 
			
		||||
our $cdb = esmith::ConfigDB->open_ro || die "Couldn't open configuration db";
 | 
			
		||||
use SrvMngr qw( theme_list init_session validate_password );
 | 
			
		||||
#our $cdb = esmith::ConfigDB->open_ro || die "Couldn't open configuration db";
 | 
			
		||||
 | 
			
		||||
sub main {
 | 
			
		||||
    my $c         = shift;
 | 
			
		||||
@@ -194,33 +194,10 @@ 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);
 | 
			
		||||
} ## end sub check_password
 | 
			
		||||
 | 
			
		||||
sub validate_password {
 | 
			
		||||
    my ($c, $strength, $pass) = @_;
 | 
			
		||||
    use Crypt::Cracklib;
 | 
			
		||||
 | 
			
		||||
    if ($strength eq "none") {
 | 
			
		||||
        return $c->l("Passwords must be at least 7 characters long") unless (length($pass) > 6);
 | 
			
		||||
        return "OK";
 | 
			
		||||
    }
 | 
			
		||||
    my $reason = is_normal_password($c, $pass, undef);
 | 
			
		||||
    return $reason unless ($reason eq "OK");
 | 
			
		||||
    return "OK" unless ($strength eq "strong");
 | 
			
		||||
 | 
			
		||||
    if (-f '/usr/lib64/cracklib_dict.pwd') {
 | 
			
		||||
        $reason = fascist_check($pass, '/usr/lib64/cracklib_dict');
 | 
			
		||||
    } else {
 | 
			
		||||
        $reason = fascist_check($pass, '/usr/lib/cracklib_dict');
 | 
			
		||||
    }
 | 
			
		||||
    $reason ||= "Software error: password check failed";
 | 
			
		||||
    return "OK" if ($reason eq "ok");
 | 
			
		||||
    return
 | 
			
		||||
          $c->l("Bad Password Choice") . ": "
 | 
			
		||||
        . $c->l("The password you have chosen is not a good choice, because") . " "
 | 
			
		||||
        . $c->($reason) . ".";
 | 
			
		||||
} ## end sub validate_password
 | 
			
		||||
1;
 | 
			
		||||
 
 | 
			
		||||
@@ -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
 | 
			
		||||
@@ -294,4 +293,4 @@ sub download_logFile {
 | 
			
		||||
    );
 | 
			
		||||
    return undef;
 | 
			
		||||
} ## end sub download_logFile
 | 
			
		||||
1;
 | 
			
		||||
1;
 | 
			
		||||
 
 | 
			
		||||
@@ -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 {
 | 
			
		||||
 
 | 
			
		||||
@@ -2,7 +2,7 @@
 | 
			
		||||
'clm_LABEL_FILESYSTEM_SCAN_PERIOD' => 'Scan filesystem',
 | 
			
		||||
'clm_DESC_FILESYSTEM_SCAN_PERIOD' => '<h2>General Settings</h2>
 | 
			
		||||
If this option is enabled then the filesystem will be 
 | 
			
		||||
scanned for viruses.A report of any found viruses will be
 | 
			
		||||
scanned for viruses. A report of any found viruses will be
 | 
			
		||||
emailed to the administrator.',
 | 
			
		||||
'clm_LABEL_QUARANTINE' => 'Quarantine infected files',
 | 
			
		||||
'clm_LABEL_CLAM_VERSIONS' => 'ClamAV and db versions',
 | 
			
		||||
 
 | 
			
		||||
@@ -14,26 +14,26 @@ web site for that domain.',
 | 
			
		||||
i-bay as the content.',
 | 
			
		||||
'dom_DOMAIN_NAME_VALIDATION_ERROR' => 'Error: unexpected or missing characters in domain name
 | 
			
		||||
[_1].The domain name should contain one or more
 | 
			
		||||
letters, numbers, periods and minus signs.Did not create new domain.',
 | 
			
		||||
letters, numbers, periods and minus signs. Did not create new domain.',
 | 
			
		||||
'dom_DOMAIN_DESCRIPTION_VALIDATION_ERROR' => 'Error: unexpected or missing characters in domain description
 | 
			
		||||
[_1]. Did not create new domain.',
 | 
			
		||||
'dom_DOMAIN_IN_USE_ERROR' => 'Error: domain [_1] is already in use.Did not create
 | 
			
		||||
'dom_DOMAIN_IN_USE_ERROR' => 'Error: domain [_1] is already in use. Did not create
 | 
			
		||||
new domain.',
 | 
			
		||||
'dom_SYSTEM_DOMAIN_ERROR' => 'Error: domain [_1] is your system domain name.You
 | 
			
		||||
cannot have a domain with the same name.Did not create new domain.',
 | 
			
		||||
'dom_SYSTEM_DOMAIN_ERROR' => 'Error: domain [_1] is your system domain name. You
 | 
			
		||||
cannot have a domain with the same name. Did not create new domain.',
 | 
			
		||||
'dom_SUCCESSFULLY_CREATED' => 'Successfully created domain [_1].Your web
 | 
			
		||||
server is now being restarted.The links on this page will be
 | 
			
		||||
server is now being restarted. The links on this page will be
 | 
			
		||||
inactive until the web server restart is complete.',
 | 
			
		||||
'dom_MODIFY_TITLE' => 'Modify domain',
 | 
			
		||||
'dom_NONEXISTENT_DOMAIN_ERROR' => 'Error: [_1] is not an existing domain.',
 | 
			
		||||
'dom_SUCCESSFULLY_MODIFIED' => 'Successfully modified domain [_1].Your web
 | 
			
		||||
server is now being restarted.The links on this page will be inactive until the web server restart is complete.',
 | 
			
		||||
server is now being restarted. The links on this page will be inactive until the web server restart is complete.',
 | 
			
		||||
'dom_REMOVE_TITLE' => 'Remove domain',
 | 
			
		||||
'dom_REMOVE_DESCRIPTION' => 'You are about to remove the domain "[_1]" ([_2]).',
 | 
			
		||||
'dom_ABOUT_TO_REMOVE' => 'Are you sure you wish to remove this domain ?',
 | 
			
		||||
'dom_ERROR_WHILE_REMOVING_DOMAIN' => 'Error: internal failure while removing domain [_1].',
 | 
			
		||||
'dom_SUCCESSFULLY_DELETED' => 'Successfully deleted domain [_1]. Your web server
 | 
			
		||||
is now being restarted.The links on this page will be inactive
 | 
			
		||||
is now being restarted. The links on this page will be inactive
 | 
			
		||||
until the web server restart is complete.',
 | 
			
		||||
'dom_DESC_CORPORATE_DNS_CURRENT' => 'Corporate DNS Settings',
 | 
			
		||||
'dom_DOMAINS_PAGE_CORPORATE_DNS' => 'Modify corporate DNS settings',
 | 
			
		||||
 
 | 
			
		||||
@@ -128,7 +128,7 @@
 | 
			
		||||
'FM_IP_NUMBER3' => '[_1] is more than 255',
 | 
			
		||||
'FM_USERNAME' => 'This field must look like a valid username (3 to 8 letters and numbers)',
 | 
			
		||||
'FM_PASSWORD1' => 'You must provide a password.',
 | 
			
		||||
'FM_PASSWORD2' => 'The password you provided was not a good password.A good password must contain all of the following: upper case letter, lower case letter, number, non-alphanumeric character, be at least 7 characters long.',
 | 
			
		||||
'FM_PASSWORD2' => 'The password you provided was not a good password. A good password must contain all of the following: upper case letter, lower case letter, number, non-alphanumeric character, be at least 7 characters long.',
 | 
			
		||||
'FM_MAC_ADDRESS1' => 'You must provide a MAC address.',
 | 
			
		||||
'FM_MAC_ADDRESS2' => 'The MAC address you provided was not valid.',
 | 
			
		||||
'FM_ERR_UNEXPECTED_DESC' => 'Error: unexpected or missing characters in description',
 | 
			
		||||
 
 | 
			
		||||
@@ -4,7 +4,7 @@
 | 
			
		||||
'grp_ACCOUNT_CONFLICT' => 'Error: the group "[_1]" can\'t be created because there is
 | 
			
		||||
already a [_2] account of that name.',
 | 
			
		||||
'grp_INVALID_GROUP_DESCRIPTION' => 'Error: unexpected or missing characters in group description',
 | 
			
		||||
'grp_NO_MEMBERS' => 'Error: no members in group.Did not create new group.',
 | 
			
		||||
'grp_NO_MEMBERS' => 'Error: no members in group. Did not create new group.',
 | 
			
		||||
'grp_CREATED_GROUP' => 'Successfully created user group',
 | 
			
		||||
'grp_DELETED_GROUP' => 'Successfully removed user group',
 | 
			
		||||
'grp_MODIFIED_GROUP' => 'Successfully modifed user group',
 | 
			
		||||
 
 | 
			
		||||
@@ -34,17 +34,17 @@ the local network. Please enter a valid IP address in the
 | 
			
		||||
format "aaa.bbb.ccc.ddd".',
 | 
			
		||||
'hos_ETHERNET_ADDRESS_DESCRIPTION' => 'The ethernet address is optional and causes the DHCP server to
 | 
			
		||||
statically bind the local IP address to the computer with this
 | 
			
		||||
ethernet address.If specified, it must be of the form
 | 
			
		||||
ethernet address. If specified, it must be of the form
 | 
			
		||||
"AA:BB:CC:DD:EE:FF" and must contain only the numbers 0-9 and
 | 
			
		||||
the letters A-F.',
 | 
			
		||||
'hos_CREATE_LOCAL_HOST_TITLE' => 'Create a new hostname referring to a local host.',
 | 
			
		||||
'hos_DIDNT_ENTER_LOCAL_IP' => 'Error: You did not specify a Local IP address.IP
 | 
			
		||||
'hos_DIDNT_ENTER_LOCAL_IP' => 'Error: You did not specify a Local IP address. IP
 | 
			
		||||
addresses must contain only numbers and periods and
 | 
			
		||||
be in the form "aaa.bbb.ccc.ddd".Did not create hostname.',
 | 
			
		||||
'hos_IP_VALIDATION_ERROR' => 'Error: IP Address [_1] is
 | 
			
		||||
invalid. IP Addresses must contain only numbers and periodsand be in the form "aaa.bbb.ccc.ddd". Did not create hostname.',
 | 
			
		||||
'hos_MAC_ADDRESS_VALIDATION_ERROR' => 'Error: Ethernet address [_1]
 | 
			
		||||
is invalid.Ethernet addresses must be in the
 | 
			
		||||
is invalid. Ethernet addresses must be in the
 | 
			
		||||
form "AA:BB:CC:DD:EE:FF" and only contain the
 | 
			
		||||
numbers 0-9 and the letters A-F. Did not create
 | 
			
		||||
hostname.',
 | 
			
		||||
 
 | 
			
		||||
@@ -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',
 | 
			
		||||
@@ -14,7 +14,7 @@ For example, you may wish to create a pseudonym
 | 
			
		||||
"webmaster" for your "webdevelopers" group or a
 | 
			
		||||
pseudonym "joe" for the user "joseph".</p>
 | 
			
		||||
<p>The server automatically creates pseudonyms of the form
 | 
			
		||||
firstname.lastname and firstname_lastname for every user
 | 
			
		||||
firstname. lastname and firstname_lastname for every user
 | 
			
		||||
on the system and a pseudonym "everyone" which contains
 | 
			
		||||
all users on the system.</p>
 | 
			
		||||
<p>Pseudonyms also allow you to create e-mail aliases for valid
 | 
			
		||||
 
 | 
			
		||||
@@ -26,7 +26,9 @@ experienced administrators
 | 
			
		||||
for remote problem diagnosis and resolution. 
 | 
			
		||||
We recommend leaving this
 | 
			
		||||
parameter set to "No Access"
 | 
			
		||||
unless you have a specific reason to do otherwise.',
 | 
			
		||||
unless you have a specific reason to do otherwise.
 | 
			
		||||
Note that an "Autoblock" feature is enabled by default when public access is enabled; to disable or tune this feature, refer to the manual at https://wiki.koozali.org/AutoBlock
 | 
			
		||||
',
 | 
			
		||||
'rma_TITLE_FTP_ACCESS' => 'FTP Settings',
 | 
			
		||||
'rma_DESC_FTP_ACCESS' => 'You can also control <b>FTP</b> access to your server. We
 | 
			
		||||
recommend leaving this parameter set to \'no access\' unless you
 | 
			
		||||
@@ -75,11 +77,11 @@ connected to a server serial port.',
 | 
			
		||||
'rma_LABEL_PPTP_ACCESS' => 'PPTP default user access',
 | 
			
		||||
'rma_TITLE_TELNET_ACCESS' => 'Telnet Settings',
 | 
			
		||||
'rma_DESC_TELNET_ACCESS' => 'WARNING:Telnet is currently enabled, but this feature is
 | 
			
		||||
no longer supported.Telnet is inherently insecure and should only
 | 
			
		||||
no longer supported. Telnet is inherently insecure and should only
 | 
			
		||||
be used in circumstances where no practical alternative exists. You
 | 
			
		||||
should change option to [_1] and use
 | 
			
		||||
secure shell if remote access is
 | 
			
		||||
required.Once disabled, telnet will no longer appear on this 
 | 
			
		||||
required. Once disabled, telnet will no longer appear on this 
 | 
			
		||||
screen. ',
 | 
			
		||||
'rma_TITLE_IPSECRW' => 'IPSEC Client (Roadwarrior) Settings',
 | 
			
		||||
'rma_DESC_IPSECRW' => 'You can allow IPSEC client access to your server, authenticated by
 | 
			
		||||
@@ -90,4 +92,4 @@ to the number 0 unless you require IPSEC client access.',
 | 
			
		||||
can do so here.<br>Any old certificates will no longer
 | 
			
		||||
authenticate against the server, so <b><i>all IPSEC clients will
 | 
			
		||||
need to import a new certificate!</i></b>.',
 | 
			
		||||
'rma_LABEL_IPSECRW_RESET' => 'Reset digital certificates',
 | 
			
		||||
'rma_LABEL_IPSECRW_RESET' => 'Reset digital certificates',
 | 
			
		||||
@@ -2,7 +2,7 @@
 | 
			
		||||
'rvw_FORM_TITLE' => 'Review configuration',
 | 
			
		||||
'rvw_DESCRIPTION' => 'This report summarizes the networking, server, and domain
 | 
			
		||||
parameters on this server relevant to configuring
 | 
			
		||||
the client computers on your network.You may wish to print this
 | 
			
		||||
the client computers on your network. You may wish to print this
 | 
			
		||||
page and use it as a reference.',
 | 
			
		||||
'rvw_NETWORKING_PARAMS' => 'Networking Parameters',
 | 
			
		||||
'rvw_SERVER_MODE' => 'Server Mode',
 | 
			
		||||
 
 | 
			
		||||
@@ -4,7 +4,7 @@
 | 
			
		||||
by the services running on your server.',
 | 
			
		||||
'log_LOG_FILE_SELECT_DESC' => 'Choose a log file to view',
 | 
			
		||||
'log_FILTER_PATTERN_DESC' => 'You may optionally specify a filter pattern to display only the
 | 
			
		||||
lines from the log file which match this pattern.If you leave
 | 
			
		||||
lines from the log file which match this pattern. If you leave
 | 
			
		||||
this field blank, all available lines of the log file will be
 | 
			
		||||
displayed. Note that this option is not used if you download the
 | 
			
		||||
logfile.',
 | 
			
		||||
 
 | 
			
		||||
@@ -43,8 +43,9 @@ sub init_data {
 | 
			
		||||
sub reconf_needed {
 | 
			
		||||
 | 
			
		||||
    my $cdb = esmith::ConfigDB->open_ro() or die("can't open Config DB");
 | 
			
		||||
    my $unsafe = ($cdb->get('bootstrap-console') and $cdb->get('bootstrap-console')->prop('Run') eq 'yes') ||
 | 
			
		||||
         ($cdb->get('UnsavedChanges') and $cdb->get('UnsavedChanges')->value eq 'yes') || '0';
 | 
			
		||||
    #my $unsafe = ($cdb->get('bootstrap-console') and $cdb->get('bootstrap-console')->prop('Run') eq 'yes') ||
 | 
			
		||||
    #     ($cdb->get('UnsavedChanges') and $cdb->get('UnsavedChanges')->value eq 'yes') || '0';
 | 
			
		||||
	my $unsafe = ($cdb->get('UnsavedChanges') and $cdb->get('UnsavedChanges')->value eq 'yes') || '0';   
 | 
			
		||||
    return $unsafe;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@@ -104,5 +105,4 @@ sub check_adminalias {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
1;
 | 
			
		||||
 | 
			
		||||
1;
 | 
			
		||||
@@ -0,0 +1,38 @@
 | 
			
		||||
Configuration report created {$report_creation_time}
 | 
			
		||||
 | 
			
		||||
==================
 | 
			
		||||
Base configuration
 | 
			
		||||
==================
 | 
			
		||||
SME server version: 	  {$releaseversion}
 | 
			
		||||
SME server mode:    	  {$systemmode}
 | 
			
		||||
SME server previous mode: {$previoussystemmode }
 | 
			
		||||
Running Kernel:     	  {$curkernel}
 | 
			
		||||
===========================
 | 
			
		||||
New RPMs not in base system
 | 
			
		||||
===========================     
 | 
			
		||||
{ foreach $i (@newrpms) {
 | 
			
		||||
            $OUT .= "$i";
 | 
			
		||||
          }    
 | 
			
		||||
} 
 | 
			
		||||
===========================
 | 
			
		||||
Custom and modified templates
 | 
			
		||||
===========================
 | 
			
		||||
{ foreach $i (@templates) {
 | 
			
		||||
            $OUT .= "$i";
 | 
			
		||||
          }
 | 
			
		||||
}
 | 
			
		||||
===========================
 | 
			
		||||
Modified events
 | 
			
		||||
===========================
 | 
			
		||||
{ foreach $i (@events) {
 | 
			
		||||
            $OUT .= "$i";
 | 
			
		||||
          }
 | 
			
		||||
}
 | 
			
		||||
=======================
 | 
			
		||||
Additional repositories
 | 
			
		||||
=======================
 | 
			
		||||
{ foreach $r (@repositories) {
 | 
			
		||||
            $OUT .= "$r";
 | 
			
		||||
          }
 | 
			
		||||
}   		
 | 
			
		||||
DONE!
 | 
			
		||||
@@ -1,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;
 | 
			
		||||
  }
 | 
			
		||||
@@ -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();
 | 
			
		||||
	});
 | 
			
		||||
@@ -74,10 +74,8 @@
 | 
			
		||||
	</p><br>
 | 
			
		||||
 | 
			
		||||
	%= hidden_field 'Function' => $bac_datas->{'function'}
 | 
			
		||||
    <div class='center'>
 | 
			
		||||
	%= submit_button $c->l('bac_UPDATE_CONF'), class => 'action'
 | 
			
		||||
    </div>
 | 
			
		||||
 | 
			
		||||
    % end
 | 
			
		||||
</div>
 | 
			
		||||
% end
 | 
			
		||||
% end
 | 
			
		||||
@@ -30,10 +30,8 @@
 | 
			
		||||
 | 
			
		||||
	%= hidden_field 'Function' => $bac_datas->{'function'}
 | 
			
		||||
 | 
			
		||||
    <div class='center'>
 | 
			
		||||
	%= submit_button $c->l('bac_RESTORE_FROM_TAPE'), class => 'action'
 | 
			
		||||
    </div>
 | 
			
		||||
 | 
			
		||||
    % end
 | 
			
		||||
</div>
 | 
			
		||||
% end
 | 
			
		||||
% end
 | 
			
		||||
@@ -44,12 +44,10 @@
 | 
			
		||||
	</span></p>
 | 
			
		||||
 | 
			
		||||
	%= hidden_field 'Function' => $bac_datas->{'function'} . '1'
 | 
			
		||||
    <div class='center'>
 | 
			
		||||
	%= submit_button $c->l('NEXT'), class => 'action'
 | 
			
		||||
    </div>
 | 
			
		||||
 | 
			
		||||
    % end
 | 
			
		||||
 | 
			
		||||
</div>
 | 
			
		||||
 | 
			
		||||
% end
 | 
			
		||||
% end
 | 
			
		||||
@@ -148,9 +148,7 @@
 | 
			
		||||
 | 
			
		||||
	%= hidden_field 'Function' => $bac_datas->{function}
 | 
			
		||||
	%= hidden_field 'VFSType' => $bac_datas->{vfstype}
 | 
			
		||||
    <div class='center'>
 | 
			
		||||
	%= submit_button $c->l('bac_UPDATE_CONF'), class => 'action'
 | 
			
		||||
    </div>
 | 
			
		||||
    % end
 | 
			
		||||
</div>
 | 
			
		||||
% end
 | 
			
		||||
% end
 | 
			
		||||
@@ -38,9 +38,7 @@
 | 
			
		||||
	</span><br><br>
 | 
			
		||||
 | 
			
		||||
	%= hidden_field 'Function' => $bac_datas->{'function'}
 | 
			
		||||
    <div class='center'>
 | 
			
		||||
	%= submit_button $c->l('bac_RESTORE_FROM_WORKSTN'), class => 'action'
 | 
			
		||||
    </div>
 | 
			
		||||
    % end
 | 
			
		||||
</div>
 | 
			
		||||
% end
 | 
			
		||||
% end
 | 
			
		||||
@@ -29,9 +29,7 @@
 | 
			
		||||
	%=l 'bac_YOU_MUST_REBOOT'
 | 
			
		||||
	</p>
 | 
			
		||||
	%= hidden_field 'Function' => $bac_datas->{'function'}
 | 
			
		||||
    <div class='center'>
 | 
			
		||||
	%= submit_button $c->l('bac_REBOOT'), class => 'action'
 | 
			
		||||
    </div>
 | 
			
		||||
    % end
 | 
			
		||||
</div>
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -39,12 +39,10 @@
 | 
			
		||||
	</span><br>
 | 
			
		||||
	<br>
 | 
			
		||||
	%= hidden_field 'Function' => $bac_datas->{'function'}
 | 
			
		||||
    <div class='center'>
 | 
			
		||||
	%= submit_button $c->l('PERFORM'), class => 'action'
 | 
			
		||||
    </div>
 | 
			
		||||
 | 
			
		||||
    % end
 | 
			
		||||
 | 
			
		||||
</div>
 | 
			
		||||
 | 
			
		||||
% end
 | 
			
		||||
% end
 | 
			
		||||
@@ -41,9 +41,7 @@
 | 
			
		||||
	%= hidden_field 'Backupset' => $bac_datas->{'backupset'}
 | 
			
		||||
	%= hidden_field 'Filterexp' => $bac_datas->{'filterexp'}
 | 
			
		||||
 | 
			
		||||
    <div class='center'>
 | 
			
		||||
	%= submit_button $c->l('PERFORM'), class => 'action'
 | 
			
		||||
    </div>
 | 
			
		||||
 | 
			
		||||
    % end
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -24,9 +24,7 @@
 | 
			
		||||
 | 
			
		||||
    %= form_for '/backupd' => (method => 'POST') => begin
 | 
			
		||||
	%= hidden_field 'Function' => $bac_datas->{'function'}
 | 
			
		||||
    <div class='center'>
 | 
			
		||||
	%= submit_button $c->l('NEXT'), class => 'action'
 | 
			
		||||
    </div>
 | 
			
		||||
 | 
			
		||||
    % end
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -44,10 +44,8 @@
 | 
			
		||||
 | 
			
		||||
	<br><br>
 | 
			
		||||
	%= hidden_field 'Function' => $bac_datas->{'function'} . '1'
 | 
			
		||||
    <div class='center'>
 | 
			
		||||
	%= submit_button $c->l('bac_VERIFY'), class => 'action'
 | 
			
		||||
    </div>
 | 
			
		||||
 | 
			
		||||
    % end
 | 
			
		||||
</div>
 | 
			
		||||
% end
 | 
			
		||||
% end
 | 
			
		||||
@@ -28,10 +28,8 @@
 | 
			
		||||
 | 
			
		||||
    %= hidden_field 'Function' => $bac_datas->{'function'}
 | 
			
		||||
 | 
			
		||||
    <div class='center'>
 | 
			
		||||
    %= submit_button $c->l('NEXT'), class => 'action'
 | 
			
		||||
    </div>
 | 
			
		||||
 | 
			
		||||
    % end
 | 
			
		||||
</div>
 | 
			
		||||
% end
 | 
			
		||||
% end
 | 
			
		||||
@@ -11,42 +11,52 @@
 | 
			
		||||
    # The events handle cases where mysqld is not enabled, and/or is not running.
 | 
			
		||||
    my $status = system("/sbin/e-smith/signal-event", "pre-backup", "desktop");
 | 
			
		||||
    if ($status) {
 | 
			
		||||
	desktopBackupRecordStatus($backup_rec, 'pre-backup', $status);
 | 
			
		||||
	return ($c->l('bac_OPERATION_STATUS_REPORT').
 | 
			
		||||
		$c->l('bac_ERR_PRE_BACKUP'));
 | 
			
		||||
		$c->desktopBackupRecordStatus($backup_rec, 'pre-backup', $status);
 | 
			
		||||
		return ($c->l('bac_OPERATION_STATUS_REPORT').$c->l('bac_ERR_PRE_BACKUP'));
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    my $clvl = $c->stash('compressionlevel');
 | 
			
		||||
    my $cmd = "/bin/tar --directory / --create @{$c->stash('directories')} --file=-"
 | 
			
		||||
        . "@{$c->stash('exclude')} | /usr/bin/gzip $clvl ";
 | 
			
		||||
    my $cmd = "/bin/tar --create --file=- --directory / @{$c->stash('exclude')}  "
 | 
			
		||||
        . "@{$c->stash('directories')} | /usr/bin/gzip $clvl ";
 | 
			
		||||
 | 
			
		||||
    my $success = open my $fh, '-|', $cmd;
 | 
			
		||||
    unless ($success) { return "Error dowload command."; };
 | 
			
		||||
 
 | 
			
		||||
  # Write chunk
 | 
			
		||||
  $c->res->headers->content_type('application/x-tar');
 | 
			
		||||
  $c->res->headers->content_disposition(qq/attachment; filename="smeserver.tgz"/);
 | 
			
		||||
 | 
			
		||||
  my $cb;
 | 
			
		||||
  $cb = sub {
 | 
			
		||||
    my $c = shift;
 | 
			
		||||
    my $size = 500 * 1024;
 | 
			
		||||
    my $length = sysread($fh, my $buffer, $size);
 | 
			
		||||
    unless ($length) {
 | 
			
		||||
      close $fh;
 | 
			
		||||
      undef $cb;
 | 
			
		||||
      $c->finish;
 | 
			
		||||
      return;
 | 
			
		||||
    }
 | 
			
		||||
    $c->write_chunk($buffer, $cb);
 | 
			
		||||
  };
 | 
			
		||||
  $c->$cb;
 | 
			
		||||
    #unless ($success) { return "Error download command."; };
 | 
			
		||||
    if ($success) {
 | 
			
		||||
		# Try with download plugin - seems to fail to complete download and also 
 | 
			
		||||
		# name of file deposited is not as required.
 | 
			
		||||
		#my $output = do { local $/; <$fh> };
 | 
			
		||||
		#close $fh;
 | 
			
		||||
		#$c->render_file(
 | 
			
		||||
			#data => $output,
 | 
			
		||||
			#filename => 'output.txt',
 | 
			
		||||
			#content_type => 'text/plain'
 | 
			
		||||
		#);
 | 
			
		||||
		# So organise it ourselves.
 | 
			
		||||
		$c->res->headers->content_type('application/x-tar');
 | 
			
		||||
		$c->res->headers->content_disposition(qq/attachment; filename="smeserver.tgz"/);
 | 
			
		||||
		my $cb;
 | 
			
		||||
		$cb = sub {
 | 
			
		||||
		my $c = shift;
 | 
			
		||||
		my $size = 500 * 1024;
 | 
			
		||||
		my $length = sysread($fh, my $buffer, $size);
 | 
			
		||||
		unless ($length) {
 | 
			
		||||
		  close $fh;
 | 
			
		||||
		  undef $cb;
 | 
			
		||||
		  $c->finish;
 | 
			
		||||
		  return;
 | 
			
		||||
		}
 | 
			
		||||
		$c->write_chunk($buffer, $cb);
 | 
			
		||||
		};
 | 
			
		||||
		$c->$cb;
 | 
			
		||||
	} else {
 | 
			
		||||
		$c->render(text => "Failed to execute command: $!", status => 500);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
    # Remove the dumped tables.
 | 
			
		||||
    $status = system("/sbin/e-smith/signal-event", "post-backup", "desktop");
 | 
			
		||||
    if ($status) {
 | 
			
		||||
	desktopBackupRecordStatus($backup_rec, 'post-backup', $status);
 | 
			
		||||
	die ($c->l('bac_ERR_POST_BACKUP'),"\n");
 | 
			
		||||
		$c->desktopBackupRecordStatus($backup_rec, 'post-backup', $status);
 | 
			
		||||
		die ($c->l('bac_ERR_POST_BACKUP'),"\n");
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    $now = time();
 | 
			
		||||
@@ -54,3 +64,4 @@
 | 
			
		||||
    $backup_rec->set_prop('Result', "0");
 | 
			
		||||
 | 
			
		||||
%>
 | 
			
		||||
1;
 | 
			
		||||
@@ -70,12 +70,10 @@
 | 
			
		||||
	</span></p>
 | 
			
		||||
 | 
			
		||||
	<br>
 | 
			
		||||
    <div class='center'>
 | 
			
		||||
	%= submit_button $c->l('PERFORM'), class => 'action'
 | 
			
		||||
    </div>
 | 
			
		||||
 | 
			
		||||
 	%= submit_button $c->l('PERFORM'), class => 'action'
 | 
			
		||||
 
 | 
			
		||||
    % end
 | 
			
		||||
 | 
			
		||||
</div>
 | 
			
		||||
 | 
			
		||||
% end
 | 
			
		||||
% end
 | 
			
		||||
@@ -18,9 +18,16 @@
 | 
			
		||||
    <% my $btn = l('bugr_Download this report'); %>
 | 
			
		||||
 | 
			
		||||
    %= form_for 'bugreportD' => (method => 'POST') => begin
 | 
			
		||||
	%= submit_button "$btn", class => 'action'
 | 
			
		||||
	%= hidden_field 'trt' => $bugr_datas->{trt}
 | 
			
		||||
    % end    
 | 
			
		||||
		%= submit_button "$btn", class => 'action'
 | 
			
		||||
		%= hidden_field 'trt' => $bugr_datas->{trt}
 | 
			
		||||
    % end   
 | 
			
		||||
    
 | 
			
		||||
    % my $out = "================== <br />";
 | 
			
		||||
    % $out .= "Boot anaysis image (right click and save image to download)<br />";
 | 
			
		||||
    % $out .= "================== <br />";
 | 
			
		||||
    % $out .= "<img src='images/boot.svg' alt='boot timing image' width=95% >";
 | 
			
		||||
    
 | 
			
		||||
   <br><%= $c->render_to_string(inline=>$out) %><br>
 | 
			
		||||
 | 
			
		||||
</div>
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -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
 | 
			
		||||
@@ -2,11 +2,13 @@
 | 
			
		||||
<HR class="sme-copyrightbar">
 | 
			
		||||
<a href="https://mojolicious.org" target="_blank"><img src="images/sme-mojo-logo-white.png" style="position:relative;"></a>
 | 
			
		||||
<font class="sme-copyright">
 | 
			
		||||
%	if ( $c->is_logged_in ) {
 | 
			
		||||
%	if ( $c->is_logged_in && $c->is_admin) {
 | 
			
		||||
	SME Server <%= session 'releaseVersion' %>-<%= $c->app->VERSION %> Manager II
 | 
			
		||||
	(Mojo:<%= Mojolicious->VERSION %>)
 | 
			
		||||
	% my $mode;
 | 
			
		||||
	% if (config->{mode} eq 'development'){ $mode = '-dev';} else { $mode = '';}
 | 
			
		||||
	(Mojo:<%= Mojolicious->VERSION %><%= $mode %>)
 | 
			
		||||
% }
 | 
			
		||||
<br>Copyright 1999-2006 Mitel Corporation<br>
 | 
			
		||||
%= session 'copyRight'
 | 
			
		||||
<br>Copyright (c) 2013-2024 Koozali Foundation Inc.<br>
 | 
			
		||||
</font>
 | 
			
		||||
</font>
 | 
			
		||||
@@ -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>
 | 
			
		||||
 
 | 
			
		||||
@@ -1,3 +1,4 @@
 | 
			
		||||
<%     use POSIX qw(strftime); %>
 | 
			
		||||
<div id="info">
 | 
			
		||||
    <% if (! $c->session->{PwdSet} ) { %>
 | 
			
		||||
	<div class="sme-error"><h5>
 | 
			
		||||
@@ -13,4 +14,12 @@
 | 
			
		||||
        Warning: Development or debug mode enabled AND public access is offered !
 | 
			
		||||
        </h5></div>
 | 
			
		||||
    <% } %>
 | 
			
		||||
    <% my $curdate = strftime '%Y%m%d', localtime; %>
 | 
			
		||||
    <% if ( "$curdate"  >= "20290531" ) { %>
 | 
			
		||||
	<div class="sme-error"><h5>
 | 
			
		||||
      URGENT NOTICE: As per May 31st 2029, SME Server 11 is obsolete, and potentially INSECURE. NO support will be offered for any issue found with this installed version.
 | 
			
		||||
      Please migrate IMMEDIATELY to Koozali SME Server 12 or higher version. Failure to upgrade may lead to the compromise of this server.
 | 
			
		||||
      </br>Please, consult <a href="https://wiki.koozali.org/SME_Server:Download" target="_blank">https://wiki.koozali.org/SME_Server:Download</a> to get the latest version
 | 
			
		||||
     </h5></div>
 | 
			
		||||
    <% } %>
 | 
			
		||||
</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-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>
 | 
			
		||||
@@ -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>
 | 
			
		||||
 
 | 
			
		||||
@@ -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
 | 
			
		||||
@@ -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>
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -24,7 +24,7 @@
 | 
			
		||||
	<span class=label>
 | 
			
		||||
	%=l 'wkg_LABEL_WORKGROUP', class => 'label'
 | 
			
		||||
	</span><span class=data>
 | 
			
		||||
	%= text_field 'Workgroup' =>  $wkg_datas->{Workgroup}, class => 'input'
 | 
			
		||||
	%= text_field 'Workgroup' =>  $wkg_datas->{Workgroup}, class => 'input' , pattern=>".{1,15}", title=>"Limited to 15 characters by the NETBIOS"
 | 
			
		||||
	</span>
 | 
			
		||||
	</p>
 | 
			
		||||
	<p>
 | 
			
		||||
@@ -63,4 +63,4 @@
 | 
			
		||||
    % end    
 | 
			
		||||
 | 
			
		||||
</div>
 | 
			
		||||
%end
 | 
			
		||||
%end
 | 
			
		||||
@@ -2,7 +2,7 @@ Summary: Sme server  navigation module : manager 2
 | 
			
		||||
%define name smeserver-manager
 | 
			
		||||
Name: %{name}
 | 
			
		||||
%define version 11.0.0
 | 
			
		||||
%define release 44
 | 
			
		||||
%define release 66
 | 
			
		||||
Version: %{version}
 | 
			
		||||
Release: %{release}%{?dist}
 | 
			
		||||
License: GPL
 | 
			
		||||
@@ -26,19 +26,47 @@ Requires: smeserver-lib >= 1.18.0-26
 | 
			
		||||
Requires: smeserver-manager >= 2.4.0-22
 | 
			
		||||
Requires: smeserver-apache >= 2.6.0-19
 | 
			
		||||
Requires: smeserver-php >= 3.0.0-43
 | 
			
		||||
Requires: perl(Mojolicious) >= 7.56
 | 
			
		||||
#Requires: smeserver-manager-locale >= 11.0.0
 | 
			
		||||
Requires: perl(Mojolicious) >= 8.42
 | 
			
		||||
Requires: perl(Mojolicious::Plugin::I18N) >= 1.6
 | 
			
		||||
Requires: perl(Mojolicious::Plugin::RenderFile) >= 0.12
 | 
			
		||||
Requires: perl(Mojolicious::Plugin::CSRFDefender) >= 0.0.8
 | 
			
		||||
Requires: perl(Net::Netmask) >= 1.9
 | 
			
		||||
Requires: perl(DBM::Deep) >= 2.0011-1
 | 
			
		||||
Requires: perl(Mojo::JWT) >= 0.08-1
 | 
			
		||||
#Requires: perl(Time::TAI64) >= 2.11
 | 
			
		||||
Requires: mutt >= 1.5.21
 | 
			
		||||
Requires: smeserver-manager-jsquery >= 1.0
 | 
			
		||||
Requires: smeserver-lib >= 11.0
 | 
			
		||||
Requires: smeserver-certificates >= 11.0
 | 
			
		||||
#Requires: js-jquery > 2.2.4-3 (optional)
 | 
			
		||||
 | 
			
		||||
Requires: smeserver-manager-locale-bg
 | 
			
		||||
Requires: smeserver-manager-locale-da
 | 
			
		||||
Requires: smeserver-manager-locale-de
 | 
			
		||||
Requires: smeserver-manager-locale-el
 | 
			
		||||
Requires: smeserver-manager-locale-es
 | 
			
		||||
Requires: smeserver-manager-locale-et
 | 
			
		||||
Requires: smeserver-manager-locale-fr
 | 
			
		||||
Requires: smeserver-manager-locale-he
 | 
			
		||||
Requires: smeserver-manager-locale-hu
 | 
			
		||||
Requires: smeserver-manager-locale-id
 | 
			
		||||
Requires: smeserver-manager-locale-it
 | 
			
		||||
Requires: smeserver-manager-locale-ja
 | 
			
		||||
Requires: smeserver-manager-locale-nb
 | 
			
		||||
Requires: smeserver-manager-locale-nl
 | 
			
		||||
Requires: smeserver-manager-locale-pl
 | 
			
		||||
Requires: smeserver-manager-locale-pt
 | 
			
		||||
Requires: smeserver-manager-locale-pt_BR
 | 
			
		||||
Requires: smeserver-manager-locale-ro
 | 
			
		||||
Requires: smeserver-manager-locale-ru
 | 
			
		||||
Requires: smeserver-manager-locale-sl
 | 
			
		||||
Requires: smeserver-manager-locale-sv
 | 
			
		||||
Requires: smeserver-manager-locale-th
 | 
			
		||||
Requires: smeserver-manager-locale-tr
 | 
			
		||||
Requires: smeserver-manager-locale-zh_CN
 | 
			
		||||
Requires: smeserver-manager-locale-zh_TW
 | 
			
		||||
 | 
			
		||||
Provides: server-manager
 | 
			
		||||
AutoReqProv: no
 | 
			
		||||
 | 
			
		||||
@@ -115,6 +143,85 @@ true
 | 
			
		||||
%defattr(-,root,root)
 | 
			
		||||
 | 
			
		||||
%changelog
 | 
			
		||||
* Tue Mar 11 2025 Brian Read <brianr@koozali.org> 11.0.0-66.sme
 | 
			
		||||
- Move the button for each backup panel to the left to conform to all the other panels.
 | 
			
		||||
 | 
			
		||||
* Sun Mar 09 2025 Brian Read <brianr@koozali.org> 11.0.0-65.sme
 | 
			
		||||
- Sort out missing hostname on nfs and cifs workstation backup on error [SME: 12948]
 | 
			
		||||
 | 
			
		||||
* Sat Mar 08 2025 Brian Read <brianr@koozali.org> 11.0.0-64.sme
 | 
			
		||||
- Add code to check for boot phase completion [SME: 12953]
 | 
			
		||||
 | 
			
		||||
* Thu Mar 06 2025 Brian Read <brianr@koozali.org> 11.0.0-63.sme
 | 
			
		||||
- Add boot.svg image to Bug Report panel [SME: 12953]
 | 
			
		||||
- Move report template to inside smanager tree
 | 
			
		||||
- Add one-off systemd task to create boot.svg run from panel
 | 
			
		||||
 | 
			
		||||
* Tue Mar 04 2025 Brian Read <brianr@koozali.org> 11.0.0-62.sme
 | 
			
		||||
- Update *_en.lex files to conform to standard english punctuation  [SME: 11809]
 | 
			
		||||
 | 
			
		||||
* Tue Mar 04 2025 Brian Read <brianr@koozali.org> 11.0.0-61.sme
 | 
			
		||||
- Arrange for the version in the footer to be suppressed if non admin login  [SME: 12887]
 | 
			
		||||
 | 
			
		||||
* Thu Feb 27 2025 Brian Read <brianr@koozali.org> 11.0.0-60.sme
 | 
			
		||||
- Enhance ssh security wording to mention autoblock in remoteaccess panel  [SME: 8309]
 | 
			
		||||
 | 
			
		||||
* Thu Feb 27 2025 Brian Read <brianr@koozali.org> 11.0.0-59.sme
 | 
			
		||||
- Arrange for Urgent notice to be displayed if date is past Rocky 8 EOL [SME: 12918]
 | 
			
		||||
 | 
			
		||||
* Tue Feb 25 2025 Brian Read <brianr@koozali.org> 11.0.0-58.sme
 | 
			
		||||
- re-organise open db placement [SME: 12695]
 | 
			
		||||
- Re-arrange parameters to tar to avoid warning message in logs [SME: 12943]
 | 
			
		||||
 | 
			
		||||
* Fri Feb 21 2025 Jean-Philippe Pialasse <jpp@koozali.org> 11.0.0-57.sme
 | 
			
		||||
- upgrade validate_password sub to use esmith::util [SME: 12937]
 | 
			
		||||
  and deduplicate code
 | 
			
		||||
 | 
			
		||||
* Thu Feb 20 2025 Brian Read <brianr@koozali.org> 11.0.0-56.sme
 | 
			
		||||
- open db in routes for backup controller file  [SME: 12933]
 | 
			
		||||
- Fix error handling for pre-backup fail [SME: 12934]
 | 
			
		||||
 | 
			
		||||
* Tue Feb 18 2025 Brian Read <brianr@koozali.org> 11.0.0-55.sme
 | 
			
		||||
- fix public ftp access not showing on panel [SME: 12927]
 | 
			
		||||
 | 
			
		||||
* Sat Feb 15 2025 Jean-Philippe Pialasse <jpp@koozali.org> 11.0.0-54.sme
 | 
			
		||||
- helper to set default value of select field using protected value [SME: 12923]
 | 
			
		||||
 | 
			
		||||
* Wed Feb 12 2025 Jean-Philippe Pialasse <jpp@koozali.org> 11.0.0-52.sme
 | 
			
		||||
- move letsencrypt panel to smeserver-certificates [SME: 12916]
 | 
			
		||||
 | 
			
		||||
* Mon Feb 10 2025 Brian Read <brianr@koozali.org> 11.0.0-51.sme
 | 
			
		||||
- Replace url in call to webmail by browser url rather than system host and domain [SME: 12910]
 | 
			
		||||
- Fix up CSS so not inline
 | 
			
		||||
- Sort out reveiw panel missing routines from FormMagic [SME: 12907].
 | 
			
		||||
 | 
			
		||||
* Sun Feb 09 2025 Brian Read <brianr@koozali.org> 11.0.0-50.sme
 | 
			
		||||
- Move all routines from FormMagic still called by SM2 panels to SM2 [SME: 12906]
 | 
			
		||||
- delete all references to FormMagic 
 | 
			
		||||
 | 
			
		||||
* Fri Feb 07 2025 Brian Read <brianr@koozali.org> 11.0.0-49.sme
 | 
			
		||||
- Fix delete of ibay - typo in link
 | 
			
		||||
- Move across toMB() sub from formmagick to quota.pm
 | 
			
		||||
- Recast DB opening so it is specific to the route rather than global [SME: 12905]
 | 
			
		||||
 | 
			
		||||
* Wed Jan 29 2025 Brian Read <brianr@koozali.org> 11.0.0-48.sme
 | 
			
		||||
- Make Country flag display independant of the internet. [SME: 12893]
 | 
			
		||||
 | 
			
		||||
* Tue Jan 28 2025 Brian Read <brianr@koozali.org> 11.0.0-47.sme
 | 
			
		||||
- Temp (we hope) remove CSRF protection plugin  [SME: ]
 | 
			
		||||
- Fix comparison in footer with config->mode 
 | 
			
		||||
 | 
			
		||||
* Tue Jan 28 2025 Brian Read <brianr@koozali.org> 11.0.0-46.sme
 | 
			
		||||
- Adjust conditions for showing "Reconfigure required" to only check UnSavedChanges DB entry [SME: 12891]
 | 
			
		||||
- Add indication of development mode in footer
 | 
			
		||||
 | 
			
		||||
* Sat Jan 25 2025 Brian Read <brianr@koozali.org> 11.0.0-45.sme
 | 
			
		||||
- Add some space in the reboot/reconf/shutdown panel [SME: ]
 | 
			
		||||
- Add check for 15 characters netbios name in workgroup panel [SME: ]
 | 
			
		||||
- Add action for post-upgrade-and-reboot for reconfigure panel [SME: 12865]
 | 
			
		||||
- Remove call to TAI64 in viewlogfiles as qmail specific format [SME: 12889]
 | 
			
		||||
- Add requires to pull in all the locale translation [SME: 12757]
 | 
			
		||||
 | 
			
		||||
* Fri Jan 24 2025 Brian Read <brianr@koozali.org> 11.0.0-44.sme
 | 
			
		||||
- Change to network-online for systemd startup to make sure network is up [SME: 12758]
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user