diff --git a/Targets/Mailstats/_mst_CONFIG.html.ep b/Targets/Mailstats/_mst_CONFIG.html.ep index 4d91510..5101cc7 100644 --- a/Targets/Mailstats/_mst_CONFIG.html.ep +++ b/Targets/Mailstats/_mst_CONFIG.html.ep @@ -99,7 +99,7 @@ %=number_field 'DBPort', class => 'numb11'

- +

%=l('mst_User_name_for_DB_sending') @@ -113,6 +113,7 @@ % param 'DBPassword' => $mst_data->{DBPassword} unless param 'DBPassword'; %=password_field 'DBPassword', class => 'pass13 sme-password', autocomplete => 'off'

+--> diff --git a/Templates/controller.pm.tem b/Templates/controller.pm.tem index 2fc2fce..a1a3bd4 100644 --- a/Templates/controller.pm.tem +++ b/Templates/controller.pm.tem @@ -39,16 +39,16 @@ use Data::Dumper; use esmith::util; use esmith::util::network; use esmith::ConfigDB::UTF8; -use esmith::AccountsDB; -use esmith::NetworksDB::UTF8; -use esmith::HostsDB; +use esmith::AccountsDB::UTF8; +use esmith::NetworksDB; +use esmith::HostsDB::UTF8; use esmith::DomainsDB::UTF8; -our $cdb; -our $adb; -our $ndb; -our $hdb; -our $ddb; +my $cdb; +my $adb; +my $ndb; +my $hdb; +my $ddb; our %${prefix}_data; @@ -133,15 +133,15 @@ sub do_update { my $title = $c->l('${prefix}_${MenuDescription}'); # Accessing all POST/GET parameters - my $params = $c->req->params->to_hash; + my $params = ${ $c->req->params->to_hash }; # Get number of POST parameters - #my $num_params = keys scaler %$params; + my $num_params = keys scaler %$params; #Params are available in the hash "params" - copy to the prefix_data hash - #while (my ($key, $value) = each %{$c->req->params->to_hash}) { - # $$${prefix}_data{$key} = $value; - #} + while (my ($key, $value) = each %{$c->req->params->to_hash}) { + $$${prefix}_data{$key} = $value; + } # the value of trt will tell you which panel has returned my $trt = $c->param('trt') || '${firstPanel}'; #hidden control on every form. diff --git a/json5/example1.json b/json5/example1.json new file mode 100644 index 0000000..a960d07 --- /dev/null +++ b/json5/example1.json @@ -0,0 +1,48 @@ +// Comment +{ + //and another comment + PackageName: 'Example1', //and yet another comment + prefix: 'ex1', + MenuHeading: 'Network', + MenuDescription: 'Example 1', + MenuNavigation: '2000 400', + firstPanel: 'TABLE', + signalEvent: 'smeserver-example1-update', + html: [ { + Name: 'params', + route: 'PARAMS', + Header: 'Example Contrib', + SubHeader: 'Manage Ibay settings:', + Paragraph1: 'These parameters will be effective only if the share is enabled. The share is in /home/e-smith/files/ibays//files', + Input1: { + Name: 'IbayName', + Type: 'Text', + Label: 'Information Bay name', + Value: 'stash("IbayName")', + }, + Input2: { + Name: 'ShareOwnerGrp', + Type: 'Select', + Label: 'Share owner Group', + Options: [ + { Value = "All', Text = 'Write = admin, Read = group'}, + { Value = "Read:All-Write:Grp', Text = 'Write = group, Read = everyone'}, + ], + } + }, + { + Name: 'select_ibay', + route:'TABLE', + Header: 'NFS Share Contrib', + SubHeader: 'Manage NFS Ibay settings:', + Nextpanel: 'PARAMS', + Table1: { + Type:'Table', + TableControl:"ibays", + TopHeadings: ['Name','Description','Status', 'Action'], + Columns: ['Name','Description','flag','Modify'] + }, + NextPanel:PARAMS + } + ] +} \ No newline at end of file diff --git a/lex-files-to-copy b/lex-files-to-copy new file mode 100644 index 0000000..6a5c65b --- /dev/null +++ b/lex-files-to-copy @@ -0,0 +1,37 @@ +/usr/share/smanager/lib/SrvMngr/I18N/Modules/General/general_en.lex +/usr/share/smanager/lib/SrvMngr/I18N/Modules/Viewlogfiles/viewlogfiles_en.lex +/usr/share/smanager/lib/SrvMngr/I18N/Modules/Userpassword/userpassword_en.lex +/usr/share/smanager/lib/SrvMngr/I18N/Modules/Useraccounts/useraccounts_en.lex +/usr/share/smanager/lib/SrvMngr/I18N/Modules/Swttheme/swttheme_en.lex +/usr/share/smanager/lib/SrvMngr/I18N/Modules/Support/support_en.lex +/usr/share/smanager/lib/SrvMngr/I18N/Modules/Review/review_en.lex +/usr/share/smanager/lib/SrvMngr/I18N/Modules/Remoteaccess/remoteaccess_en.lex +/usr/share/smanager/lib/SrvMngr/I18N/Modules/Reboot/reboot_en.lex +/usr/share/smanager/lib/SrvMngr/I18N/Modules/Quota/quota_en.lex +/usr/share/smanager/lib/SrvMngr/I18N/Modules/Qmailanalog/qmailanalog_en.lex +/usr/share/smanager/lib/SrvMngr/I18N/Modules/Pseudonyms/pseudonyms_en.lex +/usr/share/smanager/lib/SrvMngr/I18N/Modules/Proxy/proxy_en.lex +/usr/share/smanager/lib/SrvMngr/I18N/Modules/Printers/printers_en.lex +/usr/share/smanager/lib/SrvMngr/I18N/Modules/Portforwarding/portforwarding_en.lex +/usr/share/smanager/lib/SrvMngr/I18N/Modules/Manual/manual_en.lex +/usr/share/smanager/lib/SrvMngr/I18N/Modules/Login/login_en.lex +/usr/share/smanager/lib/SrvMngr/I18N/Modules/Localnetworks/localnetworks_en.lex +/usr/share/smanager/lib/SrvMngr/I18N/Modules/Initial/initial_en.lex +/usr/share/smanager/lib/SrvMngr/I18N/Modules/Ibays/ibays_en.lex +/usr/share/smanager/lib/SrvMngr/I18N/Modules/Hostentries/hostentries_en.lex +/usr/share/smanager/lib/SrvMngr/I18N/Modules/Groups/groups_en.lex +/usr/share/smanager/lib/SrvMngr/I18N/Modules/Emailsettings/emailsettings_en.lex +/usr/share/smanager/lib/SrvMngr/I18N/Modules/Domains/domains_en.lex +/usr/share/smanager/lib/SrvMngr/I18N/Modules/Directory/directory_en.lex +/usr/share/smanager/lib/SrvMngr/I18N/Modules/Datetime/datetime_en.lex +/usr/share/smanager/lib/SrvMngr/I18N/Modules/Clamav/clamav_en.lex +/usr/share/smanager/lib/SrvMngr/I18N/Modules/Bugreport/bugreport_en.lex +/usr/share/smanager/lib/SrvMngr/I18N/Modules/Backup/backup_en.lex +/usr/share/smanager/lib/SrvMngr/I18N/Modules/Yum/yum_en.lex +/usr/share/smanager/lib/SrvMngr/I18N/Modules/Workgroup/workgroup_en.lex +/usr/share/smanager/lib/SrvMngr/I18N/Modules/Letsencrypt/letsencrypt_en.lex +/usr/share/smanager/lib/SrvMngr/Controller/Swttheme.pm +/usr/share/smanager/lib/SrvMngr/Controller/Login.pm +/usr/share/smanager/lib/SrvMngr/Controller/Userpassword.pm +/usr/share/smanager/lib/SrvMngr/Controller/Datetime-Custom.pm +/usr/share/smanager/lib/SrvMngr/Controller/Emailsettings-Custom.pm diff --git a/output/Backup/AdminLTE/back_tape_configure.html.new.ep b/output/Backup/AdminLTE/back_tape_configure.html.new.ep new file mode 100644 index 0000000..abb4a8e --- /dev/null +++ b/output/Backup/AdminLTE/back_tape_configure.html.new.ep @@ -0,0 +1,106 @@ +% layout "AdminLTE", title => "Sme server 2 - backup"; + +% content_for "module" => begin + +
+ % if (config->{debug} == 1) { +
+            <%=  dumper $c->current_route %>
+            <%=  dumper $bac_datas %>
+        
+ % } + + % if ( stash "error" ) { +
+
+ <%= $c->render_to_string(inline => stash "error") %> +
+ % } + +

<%= $title%>

+ +
+ +

<%= l "bac_ENABLE_DISABLE_TAPE" %>

+ +
+ +
+ <%= $c->render_to_string(inline => (l "bac_TAPE_CONFIG_DESC")) %> +
+ +
+ +
+ +
+
+ <%= l "bac_ENABLE_TAPE_BACKUP" %> +
+
+ % if ( $bac_datas->{status} eq "checked" ) { + + % } else { + + % } +
+
+ +
+ +
+
+ + +
+
+ % param "BackupHour" => $bac_datas->{backupHour} unless param "BackupHour"; + +
+
+ % param "BackupMin" => $bac_datas->{backupMin} unless param "BackupMin"; + +
+
+ % param "BackupAMPM" => $bac_datas->{backupAMPM} unless param "BackupAMPM"; + <%= select_field "BackupAMPM" => ["AM", "PM"], class => "form-select" %> +
+
+ +
+ + +
+
+ + +
+
+ % param "ReminderHour" => $bac_datas->{reminderHour} unless param "ReminderHour"; + +
+
+ % param "ReminderMin" => $bac_datas->{reminderMin} unless param "ReminderMin"; + +
+
+ % param "ReminderAMPM" => $bac_datas->{reminderAMPM} unless param "ReminderAMPM"; + <%= select_field "ReminderAMPM" => ["AM", "PM"], class => "form-select" %> +
+
+ +
+ + <%= hidden_field "Function" => $bac_datas->{"function"} %> + + % my $btn = l("Update"); +
+
+ +
+
+ +
+ +
+% end \ No newline at end of file diff --git a/output/Backup/AdminLTE/back_workstn_configure1.html.new.ep b/output/Backup/AdminLTE/back_workstn_configure1.html.new.ep new file mode 100644 index 0000000..f82e9a1 --- /dev/null +++ b/output/Backup/AdminLTE/back_workstn_configure1.html.new.ep @@ -0,0 +1,272 @@ +% layout "AdminLTE", title => "Sme server 2 - backup - conf"; + +% content_for "module" => begin + +
+ + % if (config->{debug} == 1) { +
+             <%= dumper $c->current_route %>
+             <%= dumper $bac_datas %>
+        
+ % } + + % if ( stash "error" ) { +
+
+ <%= $c->render_to_string(inline => stash "error") %> +
+ % } + +

<%= $title%>

+ +
+ +

<%= l "bac_CONFIGURE_WORKSTN_BACKUP" %>

+ +
+ +
+ <%= $c->render_to_string(inline => (l "bac_CONFIGURE_WORKSTN_BACKUP_DESC")) %> +
+ +
+ +
+ +
+
+ <%= l "bac_ENABLE_WORKSTN_BACKUP" %> +
+
+ % if ( $bac_datas->{status} eq "checked" ) { + + % } else { + + % } +
+
+ +

+

+

+ %= l "bac_WORKSTATION_BACKUP_DEST" +

+
+ + % if ( $bac_datas->{vfstype} =~ m/cifs|nfs/s ) { +
+
+ +
+
+ % param "BackupwkStation" => $bac_datas->{station} unless param "BackupwkStation"; + +
+
+ +
+ + % } + + % if ( $bac_datas->{vfstype} eq "usb" ) { + +
+
+ <%= l "bac_local removable disk" %> +
+
+ % param "BackupwkFolder" => $bac_datas->{mount} unless param "BackupwkFolder"; + <%= select_field "BackupwkFolder" => $c->get_BackupwkDest_options( $bac_datas->{vfstype}), class => "form-select" %> +
+
+ +
+ + % } elsif ( $bac_datas->{vfstype} eq "mnt") { + +
+
+ <%= l "bac_Mounted disk" %> +
+
+ % param "BackupwkFolder" => $bac_datas->{folder} unless param "BackupwkFolder"; + <%= select_field "BackupwkFolder" => $c->get_BackupwkDest_options( $bac_datas->{vfstype}), class => "form-select" %> +
+
+ +
+ + % } else { + +
+
+ +
+
+ +
+
+ +
+ + % } + + % if ( $bac_datas->{vfstype} eq "cifs" ) { +
+
+ +
+
+ % param "BackupwkLogin" => $bac_datas->{login} unless param "BackupwkLogin"; + +
+
+ +
+ +
+
+ +
+
+ % param "BackupwkPassword" => $bac_datas->{password} unless param "BackupwkPassword"; + +
+
+ +
+
+ % } + +
+ +

<%= l "bac_WORKSTN_BACKUP_SETTINGS" %>

+ +
+ +
+
+ +
+
+ % param "SetsNumber" => $bac_datas->{setsNumber} unless param "SetsNumber"; + +
+
+ + + + +
+ +
+
+ +
+
+ % param "Filesinset" => $bac_datas->{filesinset} unless param "Filesinset"; + +
+
+ + + + +
+ +
+
+ + +
+
+ % param "BackupwkHour" => $bac_datas->{hour} unless param "BackupwkHour"; + +
+
+ % param "BackupwkMin" => $bac_datas->{min} unless param "BackupwkMin"; + +
+
+ <%= l "AM/PM:" %> +
+
+ % param "BackupwkAMPM" => $bac_datas->{ampm} unless param "BackupwkAMPM"; + <%= select_field "BackupwkAMPM" => ["AM", "PM"], class => "form-select" %> +
+
+ +
+ +
+
+ +
+
+ % param "BackupwkTimeout" => $bac_datas->{timeout} unless param "BackupwkTimeout"; + +
+
+ +
+ +
+
+ <%= l "bac_INC_ONLY_TIMEOUT" %> +
+
+ % if ( $bac_datas->{incOnlyTimeout} eq "checked" ) { + + % } else { + + % } +
+
+ +
+ +
+
+ +
+
+ % param "Compression" => $bac_datas->{compression} unless param "Compression"; + +
+
+ +
+ +
+
+ <%= l "bac_FULL_ONLY_ON" %> +
+
+ % param "Dof" => $bac_datas->{dof} unless param "Dof"; + %= select_field "Dof" => $c->get_dow_list(), class => "form-select" +
+
+ +
+ + %= hidden_field "Function" => $bac_datas->{function} + %= hidden_field "VFSType" => $bac_datas->{vfstype} + % my $btn = l("Update"); + +
+
+ +
+
+ +
+ +
+ +
+ +% end \ No newline at end of file diff --git a/output/Backup/AdminLTE/back_workstn_restore1.html.new.ep b/output/Backup/AdminLTE/back_workstn_restore1.html.new.ep new file mode 100644 index 0000000..0b72d85 --- /dev/null +++ b/output/Backup/AdminLTE/back_workstn_restore1.html.new.ep @@ -0,0 +1,53 @@ +% layout "AdminLTE", title => "Sme server 2 - restore"; + +% content_for "module" => begin + +
+ + % if (config->{debug} == 1) { +
+            <%= dumper $c->current_route %>
+            <%= dumper $bac_datas %>
+        
+ % } + + % if ( stash "error" ) { +
+
+ <%= $c->render_to_string(inline => stash "error") %> +
+ % } + +

<%= $title%>

+ +
+ +

<%= l "bac_WORKSTN_RESTORE" %>

+ +
+ +
+ +
+ <%= $c->render_to_string(inline => $bac_datas->{restore_log}) %> +
+ +
+ +
+ <%= l "bac_YOU_MUST_REBOOT" %> +
+ + <%= hidden_field "Function" => $bac_datas->{"function"} %> + + % my $btn = l("Reboot"); + +
+
+ +
+
+
+ +
+% end \ No newline at end of file diff --git a/output/Backup/AdminLTE/back_workstn_verify.html.new.ep b/output/Backup/AdminLTE/back_workstn_verify.html.new.ep new file mode 100644 index 0000000..fece6ba --- /dev/null +++ b/output/Backup/AdminLTE/back_workstn_verify.html.new.ep @@ -0,0 +1,78 @@ +% layout "AdminLTE", title => "Sme server 2 - backup - verify"; +% content_for "module" => begin + +
+ + % if (config->{debug} == 1) { +
+            <%= dumper $c->current_route %>
+            <%= dumper $bac_datas %>
+        
+ % } + + % if ( stash "error" ) { +
+ <%= $c->render_to_string(inline => stash "error") %> +
+ % } + +

<%= $title%>

+ +
+ +

<%=l "Verify_WORKSTN_BACKUP_FILE" %>

+ +
+ +
+ + % if ($bac_datas->{status} ne "enabled") { +
+ <%= $c->render_to_string(inline => (l "bac_CONFIGURATION_TO_BE_DONE")) %> +
+ % } else { +
+ <%= $c->render_to_string(inline => (l "Verify_WORKSTN_BACKUP_DESC") . " " . $c->get_shared_folder_to_verify()) %> +
+ % } + +

+ +
+
+ <%=l "bac_SELECT_BACKUP_FILE" %> +
+
+ <%= select_field "Backupset" => $c->get_Backupset_options(), class => "form-select" %> +
+
+ +

+ +
+
+ <%=l "bac_CHECK_TO_VERIFY_FULL_RESTORE" %> +
+
+ +
+
+ +
+ + %=l "bac_CHECK_INTEGRITY_WARNING" + +
+
+ %= hidden_field "Function" => $bac_datas->{"function"} . "1" + + % my $btn = l("Verify"); + +
+
+ +
+
+
+
+% end \ No newline at end of file diff --git a/output/Backup/backup_en.lex.diff b/output/Backup/backup_en.lex.diff new file mode 100644 index 0000000..ac0c7e1 --- /dev/null +++ b/output/Backup/backup_en.lex.diff @@ -0,0 +1,71 @@ +'bac_AM' => 'AM', +'bac_AM/PM' => 'AM/PM', +'bac_BACKUP_DESC' => '

The server provides two ways to back up and restore +your server: using your local desktop or a tape drive.

+

The first method creates a copy of your server configuration and user +data files, and downloads it to your local desktop via your web browser. +Currently your configuration and data files total approximately +[_1]. The backup file will be somewhat less than this, +depending on how compressible the data are. The \"Verify desktop backup +file\" option can be used to check the integrity of a desktop backup +file.

+

The tape backup method uses a software package called [_2] +to back up your entire hard disk to tape every night. This requires a +supported tape drive and a tape that is not write-protected. The backup +is performed automatically at the selected time every night (with a +reminder automatically e-mailed to the administrator during the day). +Currently your hard disk contains [_3] of data.

+

Both restore methods allow you to restore your configuration and user +data files. Ideally, the restore should be performed on a freshly +installed server.

', +'bac_cifs' => 'cifs', +'bac_CONFIGURE_TAPE_BACKUP' => 'Configure tape backup', +'bac_COULD_NOT_DECODE' => 'Could not decode backup file: ', +'bac_COULD_NOT_EXEC_PIPELINE' => 'Could not execute backup pipeline: ', +'bac_DESKTOP_RESTORE' => 'Restore from desktop', +'bac_DESKTOP_RESTORE_DESC' => 'This process will upload a server backup file from your local desktop to your server and restore the configuration and user data files. The restore should be performed on a freshly installed server.', +'bac_DESKTOP_VERIFY' => 'Verify desktop backup file', +'bac_ENABLE_DISABLE_WORKSTN' => 'Enable/Disable Daily Workstation Backup', +'bac_ERR_DAR_CATALOG' => 'Error when using Dar catalog', +'bac_ERR_INVALID_SETS_NUMBER' => 'Sets number must be 1 or greater', +'bac_ERR_READING_FILE' => 'There was an error in reading the backup file.', +'bac_ERR_RESTORING_FROM_WORKSTN' => 'Error occurred restoring files from workstation.', +'bac_ERR_UPDATING_CONF_AFTER_WORKSTN_RESTORE' => 'Error occurred while updating system configuration after workstation +restore.', +'bac_FILE_TO_RESTORE' => 'Backup file to restore from', +'bac_FINISHED_AT' => 'and finished at: ', +'bac_FREE_SPACE' => 'You have approximately [_1] free space on the server. +Check that desktop backup file is less than [_2] before +commencing the restore.', +'bac_MUST_REBOOT_AFTER_RESTORE' => 'After the restore completes you must reboot the server.', +'bac_nfs' => 'nfs', +'bac_NO_BACKUPS_TO_RESTORE' => 'There is no backup set on configured workstation shared folder. Verify your configuration settings.', +'bac_NOW_RESTORING_FROM_TAPE' => 'Your server configuration and user data +files are now being restored from tape.', +'bac_NOW_RESTORING_FROM_WORKSTN' => 'Your server configuration and user data +files are now being restored from workstation shared folder.', +'bac_PAGE_REFRESH_IN' => 'This page will refresh to the status display in [_1] seconds, or +click here.', +'bac_PM' => 'PM', +'bac_REFRESH_THIS_DISPLAY' => 'Refresh this display', +'bac_RESTORE_COMPLETED' => 'A system restore has completed', +'bac_RESTORE_CONF_FROM_WORKSTN' => 'Restore server configuration from workstation backup', +'bac_RESTORE_IN_PROGRESS' => 'Restore in progress', +'bac_RESTORE_IN_PROGRESS_BEGAN_AT' => 'A system restore is in progress. It began at: ', +'bac_RESTORE_IN_PROGRESS_DESC' => 'After the restore completes you must reboot the server. Your restore is +complete when the words "Restore complete" appear at the bottom of your screen. +', +'bac_RESTORE_SERVER_CONFIG' => 'Restore server configuration', +'bac_RESTORING_FROM_TAPE' => 'Restoring From Tape', +'bac_RESTORING_FROM_WORKSTN' => 'Restoring From Workstation', +'bac_STARTED_AT' => 'It began at: ', +'bac_UPDATING_TAPE_CONF' => 'Updating tape backup configuration', +'bac_UPDATING_WORKSTN_CONF' => 'Updating workstation backup configuration', +'bac_VERIFY_BACKUP_DESC' => ' +

This option will display the names of all files +in a previously created desktop backup file. You +can use this option to verify the contents of the +backup file.

', +'bac_WORKSTN_NOT_SET' => 'You must first correctly configure your workstation backup', +'bac_X_BACKUP_OR_RESTORE' => 'X Backup or restore server data', +'Backup or restore' => 'Backup or restore', diff --git a/output/Backup/backup_en.lex.new1 b/output/Backup/backup_en.lex.new1 new file mode 100644 index 0000000..75dec90 --- /dev/null +++ b/output/Backup/backup_en.lex.new1 @@ -0,0 +1,283 @@ +# +# Lex file for Backup generated on 2025-07-17 09:52:30 +# +'bac_ALL_BACKUPS' => 'All backups', +'bac_AM' => 'AM', +'bac_AM/PM' => 'AM/PM', +'bac_ANOTHER_RESTORE_IN_PROGRESS' => 'Another restore is in progress. Please try again later.', +'bac_BACKUP_CHOICE' => 'Selecting files to display', +'bac_BACKUP_CONFIG_STATUS' => 'Backup configuration and status', +'bac_BACKUP_DESC' => '

The server provides two ways to back up and restore +your server: using your local desktop or a tape drive.

+

The first method creates a copy of your server configuration and user +data files, and downloads it to your local desktop via your web browser. +Currently your configuration and data files total approximately +[_1]. The backup file will be somewhat less than this, +depending on how compressible the data are. The \"Verify desktop backup +file\" option can be used to check the integrity of a desktop backup +file.

+

The tape backup method uses a software package called [_2] +to back up your entire hard disk to tape every night. This requires a +supported tape drive and a tape that is not write-protected. The backup +is performed automatically at the selected time every night (with a +reminder automatically e-mailed to the administrator during the day). +Currently your hard disk contains [_3] of data.

+

Both restore methods allow you to restore your configuration and user +data files. Ideally, the restore should be performed on a freshly +installed server.

', +'bac_BACKUP_DESC_DAR' => '

Three ways are provided to back up and restore your +server: using a tape drive, using a network share or a local +removable disk, or using your local desktop.

+

Tape Backup. This method uses a software package called [_1] +to back up your entire hard disk to tape every night. This requires a +supported tape drive and a tape that is not write-protected. The backup +is performed automatically at the selected time every night (with a +reminder automatically e-mailed to the administrator during the day). +Currently your hard disk contains [_2] of data.

+

Workstation backup. This method uses a software package called dar +to back up your server configuration and data files to a network share +or a local removable disk such as a USB disk. +You can manage how many rotating sets of backups are kept, +and how many incremental backups to have in each set. +The backup is performed automatically at the selected time every day. Currently +configuration and data files total approximately [_3] uncompressed. +Twice the compressed data size must be available on the backup share.

+

Backup to Desktop. This method creates a copy of your server +configuration and user data files, and downloads it to your +local desktop via your web browser. +Currently your configuration and data files total approximately +[_3]. The backup file will be somewhat less than this, +depending on how much the data can be compressed. +This file can be used to restore the server from the console if you +copy it to a local removable disk such as a USB disk.

+

All backup methods allow you to restore your configuration and user +data files. Workstation backup provides individual file restore. Ideally, +full restore should be performed on a freshly installed server.

', +'bac_BACKUP_DESKTOP_TOO_BIG' => 'Your server has too much data for a reliable backup to desktop.', +'bac_BACKUP_FILE_INCOMPLETE' => 'The backup file was incomplete', +'bac_BACKUP_TITLE' => 'Backup or restore server data', +'bac_BACKUPS_RUN_AT' => 'Regular tape backups will run at: ', +'bac_BETWEEN_0_AND_12' => 'Please choose an hour between 0 and 12.', +'bac_BETWEEN_0_AND_59' => 'Please choose a minute between 0 and 59.', +'bac_CHECK_INTEGRITY_WARNING' => 'Warning : For large backups, checking integrity may be a long task and should be made with daily workstation backup disabled.', +'bac_CHECK_TO_VERIFY_FULL_RESTORE' => 'Check here to test integrity of all backups needed for a full restore with the selected backup ', +'bac_cifs' => 'cifs', +'bac_COMPRESSION_LEVEL' => 'Backup compression level ~[0-9~]', +'bac_CONFIGURATION_TO_BE_DONE' => 'Please configure the backup settings.', +'bac_CONFIGURE_TAPE_BACKUP' => 'Configure tape backup', +'bac_CONFIGURE_WORKSTN_BACKUP' => 'Configure Workstation Backup', +'bac_CONFIGURE_WORKSTN_BACKUP_DESC' => 'You can set the number of +successive backup sets to keep on the workstation, with automatic rotation. +Each set may contain saved data for several consecutive days. +In this case first backup of the set is full backup, others daily backups are +incremental. You can also set a time limit for each backup session or for incremental +backups only. When this limit occurs, backup is cleanly stopped and the next +incremental backup will safely continue with unsaved and modified datas.', +'bac_COULD_NOT_DECODE' => 'Could not decode backup file: ', +'bac_COULD_NOT_EXEC_PIPELINE' => 'Could not execute backup pipeline: ', +'bac_COULD_NOT_FORK' => 'Could not fork: ', +'bac_DESKTOP_BACKUP' => 'Backup to desktop', +'bac_DESKTOP_RESTORE' => 'Restore from desktop', +'bac_DESKTOP_RESTORE_DESC' => 'This process will upload a server backup file from your local desktop to your server and restore the configuration and user data files. The restore should be performed on a freshly installed server.', +'bac_DESKTOP_VERIFY' => 'Verify desktop backup file', +'bac_DOW' => 'Sunday Monday Tuesday Wednesday Thursday Friday Saturday Everyday', +'bac_ENABLE_DISABLE_TAPE' => 'Enable/Disable Nightly Tape Backup', +'bac_ENABLE_DISABLE_WORKSTN' => 'Enable/Disable Daily Workstation Backup', +'bac_ENABLE_TAPE_BACKUP' => 'Enable tape backup', +'bac_ENABLE_WORKSTN_BACKUP' => 'Enable Workstation Backup', +'bac_ERR_ALREADY_MOUNTED' => 'Backup directory is already mounted', +'bac_ERR_CONF_BACKUP' => 'Error occurred during conf-backup event.', +'bac_ERR_DAR_CATALOG' => 'Error when using Dar catalog', +'bac_ERR_EXTRACT' => 'Error when extracting with Dar', +'bac_ERR_INVALID_COMPRESSION' => 'Compression level must be set between 0 (no compression) and 9 (maximum compression)', +'bac_ERR_INVALID_FILES_IN_SET_NUMBER' => 'This number must be 1 or greater. First backup in set is full others are incrementals', +'bac_ERR_INVALID_FOLDER' => 'Invalid share name', +'bac_ERR_INVALID_HOUR' => 'Error: invalid backup hour: ', +'bac_ERR_INVALID_LOGIN' => 'Invalid Login', +'bac_ERR_INVALID_MINUTE' => 'Error: invalid backup minute: ', +'bac_ERR_INVALID_PASSWORD' => 'Invalid Password', +'bac_ERR_INVALID_REMINDER_HOUR' => 'Error: invalid reminder hour: ', +'bac_ERR_INVALID_REMINDER_MINUTE' => 'Error: invalid reminder minute: ', +'bac_ERR_INVALID_SELDATE' => 'Date format is invalid, must be ~[~[~[yyyy/~]mm/~]dd-~]hh:mm~[:ss~]. ie: 2005/12/31-08:23:32 or +10-08:32 or 08:32', +'bac_ERR_INVALID_SETS_NUMBER' => 'Sets number must be 1 or greater', +'bac_ERR_INVALID_TIMEOUT' => 'Maximum backup time must be set between 1 and 24 hours', +'bac_ERR_INVALID_WORKSTN' => 'Invalid Workstation IP or Hostname ', +'bac_ERR_MOUNTING_SMBSHARE' => 'Unable to mount workstation shared folder', +'bac_ERR_NO_FULL_BACKUP' => 'Aborting restore because needed full backup is missing or unreadable.', +'bac_ERR_NO_HOST_DIR' => 'No directory for your host in shared folder. Maybe your host name is different from backup ones', +'bac_ERR_NO_INC_BACKUP' => 'Aborting restore because the set has missing or unreadable incremental backup number', +'bac_ERR_NO_MOUNTED_DISK' => 'Error : No mounted disk available. Please mount a disk or select another type of workstation backup.', +'bac_ERR_NO_USB_DISK' => 'Error : No removable disk available. Please connect a removable disk or select another type of workstation backup.', +'bac_ERR_NOT_MOUNTED' => 'Backup directory is not mounted', +'bac_ERR_POST_BACKUP' => 'Error occurred during post-backup actions.', +'bac_ERR_PRE_BACKUP' => 'Error occurred during pre-backup actions.', +'bac_ERR_PRE_RESTORE' => 'Error occurred during pre-restore actions.', +'bac_ERR_READING_FILE' => 'There was an error in reading the backup file.', +'bac_ERR_RESTORING_FROM_TAPE' => 'Error occurred restoring files from tape.', +'bac_ERR_RESTORING_FROM_WORKSTN' => 'Error occurred restoring files from workstation.', +'bac_ERR_RESTORING_GID' => 'Error occurred while restoring gid of "www"', +'bac_ERR_RESTORING_INITIAL_GRP' => 'Error occurred while restoring initial group of "www".', +'bac_ERR_UPDATING_CONF_AFTER_TAPE_RESTORE' => 'Error occurred while updating system configuration after tape +restore.', +'bac_ERR_UPDATING_CONF_AFTER_WORKSTN_RESTORE' => 'Error occurred while updating system configuration after workstation +restore.', +'bac_ERR_WHILE_UNMOUNTING' => 'Error occurs when unmounting distant share', +'bac_ERROR_READING_FILE' => 'Error while reading files from', +'bac_ERROR_WHEN_TESTING_REMOTE_SERVER' => 'The parameters have been saved, however the remote host is not reachable, please check your settings.', +'bac_FILE_TO_RESTORE' => 'Backup file to restore from', +'bac_FILES_HAVE_BEEN_RESTORED' => 'The following files and directories have been restored:', +'bac_FILES_IN_BACKUP' => 'The following files are considered in the backup :', +'bac_FILTER_EXPRESSION' => 'Names filtered by', +'bac_FINISHED_AT' => 'and finished at: ', +'bac_FREE_SPACE' => 'You have approximately [_1] free space on the server. +Check that desktop backup file is less than [_2] before +commencing the restore.', +'bac_FULL_ONLY_ON' => 'Full backup is allowed on', +'bac_HOURS' => 'hours.', +'bac_INC_ONLY_TIMEOUT' => 'Don"t timeout full backup sessions', +'bac_LOAD_TAPE_REMINDER_TIME' => 'Load tape reminder time of day (hour/min)', +'bac_local removable disk' => 'Local removable disk', +'bac_LOGIN' => 'Login is ', +'bac_Mounted disk' => 'Mounted disk', +'bac_MUST_REBOOT_AFTER_RESTORE' => 'After the restore completes you must reboot the server.', +'bac_nfs' => 'nfs', +'bac_No suitable local devices found' => 'No suitable local devices found', +'bac_NO_BACKUPS_TO_RESTORE' => 'There is no backup set on configured workstation shared folder. Verify your configuration settings.', +'bac_NO_UID_FOR_NAME' => 'Could not get uid for user named: ', +'bac_NOW_RESTORING_FROM_TAPE' => 'Your server configuration and user data +files are now being restored from tape.', +'bac_NOW_RESTORING_FROM_WORKSTN' => 'Your server configuration and user data +files are now being restored from workstation shared folder.', +'bac_NUMBER_OF_FILES_IN_SET' => 'Daily backups in each set', +'bac_NUMBER_OF_SETS' => 'Number of rotating backup sets', +'bac_PAGE_REFRESH_IN' => 'This page will refresh to the status display in [_1] seconds, or +click here.', +'bac_PASSWORD' => 'Password is ', +'bac_PM' => 'PM', +'bac_READ_COMPLETE' => 'You can choose all the directories and files you want to restore in the displayed list +(use ctrl or shift for multiple selection).
Warning : If you select a directory, +all contained files and directories will be restored.

+By default the most recent version of selected files is restored, but if you specify a date +in the format ~[~[~[yyyy/~]mm/~]dd-~]hh:mm~[:ss~] the process +will restore only the most recent version modified before the given date.', +'bac_REFRESH_THIS_DISPLAY' => 'Refresh this display', +'bac_REMINDER_MESSAGE_AT' => 'Reminder messages will be sent at: ', +'bac_RESTORE_CANNOT_PROCEED' => 'Unable to proceed with restore of server configuration', +'bac_RESTORE_COMPLETE' => 'Restore complete', +'bac_RESTORE_COMPLETED' => 'A system restore has completed', +'bac_RESTORE_CONF_FROM_TAPE' => 'Restore server configuration from tape backup', +'bac_RESTORE_CONF_FROM_TAPE_DESC' => '

This process will restore the configuration and user data files from a +server tape backup. The restore should be performed on a freshly installed server.

+

Ensure that you have loaded the desired backup tape into the tape drive +before proceeding.

+

After the restore completes you must reboot the server.

', +'bac_RESTORE_CONF_FROM_WORKSTN' => 'Restore server configuration from workstation backup', +'bac_RESTORE_CONF_FROM_WORKSTN_DESC' => '

This process will restore the configuration and user data files from a +Server workstation backup. The restore +should be performed on a freshly installed Server.

+

Ensure that choose the right backup to restore below +before proceeding.

+

After the restore completes you must reboot the server.

+Backup will be restored from : ', +'bac_RESTORE_FAILED' => 'Restore failed! The backup file was incomplete.', +'bac_RESTORE_FAILED_MSG' => 'Restore failed! There was an error in reading the backup file.', +'bac_RESTORE_FROM_TAPE' => 'Restore From Tape', +'bac_RESTORE_FROM_WORKSTN' => 'Restore From Workstation', +'bac_RESTORE_IN_PROGRESS' => 'Restore in progress', +'bac_RESTORE_IN_PROGRESS_BEGAN_AT' => 'A system restore is in progress. It began at: ', +'bac_RESTORE_IN_PROGRESS_DESC' => 'After the restore completes you must reboot the server. Your restore is +complete when the words "Restore complete" appear at the bottom of your screen. +', +'bac_RESTORE_SERVER_CONFIG' => 'Restore server configuration', +'bac_RESTORE_VERIFY_FAILED' => 'Verify integrity failed', +'bac_RESTORING_FROM_TAPE' => 'Restoring From Tape', +'bac_RESTORING_FROM_WORKSTN' => 'Restoring From Workstation', +'bac_SELECT_AN_ACTION' => 'Select an action', +'bac_SELECT_BACKUP_FILE' => 'Select backup file', +'bac_SELECT_DATE_BEFORE' => 'Restore most recent before', +'bac_SELECT_FILES_TO_RESTORE' => 'Select files to restore', +'bac_SELECT_VFS_TYPE' => 'Select the type of share for backup destination', +'bac_SERVER_REBOOT' => 'Server reboot', +'bac_SERVER_WILL_REBOOT' => 'Your server will now reboot.', +'bac_SHARED_FOLDER_NAME' => 'Backup share', +'bac_STARTED_AT' => 'It began at: ', +'bac_SUCCESSFULLY_DISABLED' => 'Successfully disabled tape backups', +'bac_SUCCESSFULLY_DISABLED_WORKSTN' => 'Successfully disabled workstation backups', +'bac_SUCCESSFULLY_ENABLED_TAPE' => 'Successfully enabled tape backups', +'bac_SUCCESSFULLY_ENABLED_WORKSTN' => 'Successfully enabled workstation backups', +'bac_TAPE_BACKUP_TIME' => 'Tape backup time of day (hour/min)', +'bac_TAPE_BACKUPS' => 'Tape backups are ', +'bac_TAPE_CONFIG_DESC' => '

Select whether you wish to enable nightly backups. Then indicate the +desired times for the backup and the load tape reminder.

The tape +backup requires a supported tape drive. A warning message will be sent to +the administrator at the designated reminder time if the tape drive is +empty.

', +'bac_TAPE_CONFIGURE' => 'Configure tape backup', +'bac_TAPE_RESTORE' => 'Restore from tape', +'bac_TESTED_BACKUP' => 'Testing integrity of backup', +'bac_TESTING_NEEDED_BACKUPS_FOR_RESTORE' => 'Testing all backups needed for a full restore with selected backup', +'bac_UNABLE_TO_RESTORE_CONF' => 'Unable to restore server configuration', +'bac_UPDATING_TAPE_CONF' => 'Updating tape backup configuration', +'bac_UPDATING_WORKSTN_CONF' => 'Updating workstation backup configuration', +'bac_VERIFY_BACKUP_DESC' => ' +

This option will display the names of all files +in a previously created desktop backup file. You +can use this option to verify the contents of the +backup file.

', +'bac_VERIFY_COMPLETE' => 'Verification is complete', +'bac_VERIFY_WORKSTN_BACKUP_DESC' => '

This option will display the names of all files +in a previously created workstation daily backup. You +can use this option to verify the contents of the +backup.You must choose the backup you want to verify

+

Only files flagged with (Saved) are contained in the backup.

+
Backup files are verified from shared folder :', +'bac_VERIFY_WORKSTN_BACKUP_FILE' => 'Verify workstation backup', +'bac_WITH_BACKUP_TIME' => 'with backup time: ', +'bac_WITH_REMINDER_TIME' => 'and load tape reminder time: ', +'bac_WKBACKUPS_RUN_AT' => 'Regular workstation backups will run at: ', +'bac_WORKSTATION_BACKUP_DEST' => 'Backup workstation settings', +'bac_WORKSTATION_BACKUP_SETCONF' => 'Create or modify workstation backup configuration', +'bac_WORKSTN_BACKUP_COMPRESSION' => 'Compression level (0-9) of backup is ', +'bac_WORKSTN_BACKUP_DAYSINSET' => 'Number of daily backups contained in each set is ', +'bac_WORKSTN_BACKUP_DESC' => '

This panel displays the present workstation backup configuration. You can +change it in this panel and the next one.

', +'bac_WORKSTN_BACKUP_ENABLED' => 'Backup is ', +'bac_WORKSTN_BACKUP_HOST' => 'Backup is made on LAN workstation ', +'bac_WORKSTN_BACKUP_INCONLY_TIMEOUT' => 'except full backups which are cleanly timed out after 24 hours', +'bac_WORKSTN_BACKUP_MNT' => 'Backup is made on mounted disk', +'bac_WORKSTN_BACKUP_NOT_CONFIGURED' => '

Presently, workstation backup is not configured. You can set this configuration +with this panel and the next one.

', +'bac_WORKSTN_BACKUP_SETSNUM' => 'Number of rotating backup sets is ', +'bac_WORKSTN_BACKUP_SETTINGS' => 'Workstation Backup Settings', +'bac_WORKSTN_BACKUP_SHARE' => 'Destination backup share folder is ', +'bac_WORKSTN_BACKUP_TIME' => 'Workstation backup time of day (hour/min)', +'bac_WORKSTN_BACKUP_TIMEOUT' => 'Each daily backup session is cleanly timed out after ', +'bac_WORKSTN_BACKUP_TOD' => 'Daily backup occurs at ', +'bac_WORKSTN_BACKUP_USB' => 'Backup is made on local removable disk', +'bac_WORKSTN_BACKUP_VFSTYPE' => ' via ', +'bac_WORKSTN_BACKUPS' => 'Workstation backups are ', +'bac_WORKSTN_CONFIGURE' => 'Configure workstation backup', +'bac_WORKSTN_FULL_BACKUP_DAY' => 'Full backup session (new backup sets) is allowed only on', +'bac_WORKSTN_FULL_BACKUP_EVERYDAY' => 'Full backup sessions (new backup set) are allowed everyday', +'bac_WORKSTN_LOGIN' => 'Login name', +'bac_WORKSTN_NAME' => 'Workstation IP or hostname', +'bac_WORKSTN_NOT_SET' => 'You must first correctly configure your workstation backup', +'bac_WORKSTN_RESTORE' => 'Restore from workstation', +'bac_WORKSTN_SEL_REST_DESC' => 'This process will restore only specified files and directories. You must first choose +the backup from which the files will be restored. If you don"t know in which backup +are the required files, you can select "All backups" option.

+The next panel will display available files and directories, +so you can choose the ones to restore. To restrict the number of files and directories +displayed in this panel, you have the option to give now a filtering expression, +applied as a regular expression to the displayed names.

+You have the responsibility not to restore files which could break the +functioning of your server.

Currently, files will be restored from :', +'bac_WORKSTN_SEL_RESTORE' => 'Selective file restore from workstation', +'bac_WORKSTN_SELECTIVE_RESTORE' => 'Workstation selective file restore', +'bac_WORKSTN_TIMEOUT' => 'Optional backup session timeout (hours)', +'bac_WORKSTN_VERIFY' => 'Verify workstation backup', +'bac_X_BACKUP_OR_RESTORE' => 'X Backup or restore server data', +'bac_YOU_MUST_REBOOT' => 'You must reboot the server to activate any configuration changes that were +made as a result of this restore.', +'Backup or restore' => 'Backup or restore', diff --git a/output/Backup/default/back_tape_configure.html.new.ep b/output/Backup/default/back_tape_configure.html.new.ep new file mode 100644 index 0000000..404d592 --- /dev/null +++ b/output/Backup/default/back_tape_configure.html.new.ep @@ -0,0 +1,81 @@ +% layout "default", title => "Sme server 2 - backup"; + +% content_for "module" => begin + +

+ % if (config->{debug} == 1) { +

+ %= dumper $c->current_route + %= dumper $bac_datas +

+ % } + + % if ( stash "error" ) { +
+ %= $c->render_to_string(inline => stash "error") +
+ %} + +

<%= $title%>

+ +

+ %=l "bac_ENABLE_DISABLE_TAPE" +


+ + %= $c->render_to_string(inline => (l "bac_TAPE_CONFIG_DESC")) + + %= form_for "/backupd" => (method => "POST") => begin + +

+ + %=l "bac_ENABLE_TAPE_BACKUP" + + % if ( $bac_datas->{status} eq "checked" ) { + + %} else { + %= check_box "Tapebackup" + %} + +

+ + +

+ + %=l "bac_TAPE_BACKUP_TIME" + + % param "BackupHour" => $bac_datas->{backupHour} unless param "BackupHour"; + %= text_field "BackupHour", size => "2" + % param "BackupMin" => $bac_datas->{backupMin} unless param "BackupMin"; + %= text_field "BackupMin", size => "2" + + + %=l "AM/PM:" + + % param "BackupAMPM" => $bac_datas->{backupAMPM} unless param "BackupAMPM"; + %= select_field "BackupAMPM" => ["AM", "PM"], class => "input" + +

+ +

+ + %=l "bac_LOAD_TAPE_REMINDER_TIME" + + % param "ReminderHour" => $bac_datas->{reminderHour} unless param "ReminderHour"; + %= text_field "ReminderHour", size => "2" + % param "ReminderMin" => $bac_datas->{reminderMin} unless param "ReminderMin"; + %= text_field "ReminderMin", size => "2" + + + %=l "AM/PM:" + + % param "ReminderAMPM" => $bac_datas->{reminderAMPM} unless param "ReminderAMPM"; + %= select_field "ReminderAMPM" => ["AM", "PM"], class => "input" + +


+ + %= hidden_field "Function" => $bac_datas->{"function"} + %= submit_button $c->l("Update"), class => "action" + + % end +
+% end \ No newline at end of file diff --git a/output/Backup/default/back_workstn_configure1.html.new.ep b/output/Backup/default/back_workstn_configure1.html.new.ep new file mode 100644 index 0000000..eb8d9ab --- /dev/null +++ b/output/Backup/default/back_workstn_configure1.html.new.ep @@ -0,0 +1,154 @@ +% layout "default", title => "Sme server 2 - backup - conf"; + +% content_for "module" => begin + +
+ % if (config->{debug} == 1) { +

+ %= dumper $c->current_route + %= dumper $bac_datas +

+ % } + + % if ( stash "error" ) { +
+ %= $c->render_to_string(inline => stash "error") +
+ %} + +

<%= $title%>

+ +

+ %=l "bac_CONFIGURE_WORKSTN_BACKUP" +

+ + %= $c->render_to_string(inline => (l "bac_CONFIGURE_WORKSTN_BACKUP_DESC")) + + %= form_for "/backupd" => (method => "POST") => begin + +

+ + %=l "bac_ENABLE_WORKSTN_BACKUP" + + % if ( $bac_datas->{status} eq "checked" ) { + + %} else { + %= check_box "Workstnbackup" + %} + + +

+

+ %= l "bac_WORKSTATION_BACKUP_DEST" +


+ + % if ( $bac_datas->{vfstype} =~ m/cifs|nfs/s ) { + + %=l "bac_WORKSTN_NAME" + + % param "BackupwkStation" => $bac_datas->{station} unless param "BackupwkStation"; + %= text_field "BackupwkStation", size => 20, class => "input" +
+ %} + % if ( $bac_datas->{vfstype} eq "usb" ) { + + %=l "bac_local removable disk" + + % param "BackupwkFolder" => $bac_datas->{mount} unless param "BackupwkFolder"; + %= select_field "BackupwkFolder" => $c->get_BackupwkDest_options( $bac_datas->{vfstype}), class => "input" +
+ % } elsif ( $bac_datas->{vfstype} eq "mnt") { + + %=l "bac_Mounted disk" + + % param "BackupwkFolder" => $bac_datas->{folder} unless param "BackupwkFolder"; + %= select_field "BackupwkFolder" => $c->get_BackupwkDest_options( $bac_datas->{vfstype}), class => "input" +
+ % } else { + + %=l "bac_SHARED_FOLDER_NAME" + + % param "BackupwkFolder" => $bac_datas->{folder} unless param "BackupwkFolder"; + %= text_field "BackupwkFolder", size => 20, class => "input" +
+ %} + % if ( $bac_datas->{vfstype} eq "cifs" ) { + + %=l "bac_WORKSTN_LOGIN" + + % param "BackupwkLogin" => $bac_datas->{login} unless param "BackupwkLogin"; + %= text_field "BackupwkLogin", size => 12, class => "input" +
+ %=l "bac_PASSWORD" + + % param "BackupwkPassword" => $bac_datas->{password} unless param "BackupwkPassword"; + %= password_field "BackupwkPassword", size => 12, class => "input" + + %} +


+ %= l "bac_WORKSTN_BACKUP_SETTINGS" +


+ +

+ %=l "bac_NUMBER_OF_SETS" + + % param "SetsNumber" => $bac_datas->{setsNumber} unless param "SetsNumber"; + %= text_field "SetsNumber", size => "3" + + %=l "bac_NUMBER_OF_FILES_IN_SET" + + % param "Filesinset" => $bac_datas->{filesinset} unless param "Filesinset"; + %= text_field "Filesinset", size => "3" +

+ +

+ + %=l "bac_WORKSTN_BACKUP_TIME" + + % param "BackupwkHour" => $bac_datas->{hour} unless param "BackupwkHour"; + %= text_field "BackupwkHour", size => "2" + % param "BackupwkMin" => $bac_datas->{min} unless param "BackupwkMin"; + %= text_field "BackupwkMin", size => "2" + + %=l "AM/PM:" + + % param "BackupwkAMPM" => $bac_datas->{ampm} unless param "BackupwkAMPM"; + %= select_field "BackupwkAMPM" => ["AM", "PM"], class => "input" + +

+ +

+ %=l "bac_WORKSTN_TIMEOUT" + + % param "BackupwkTimeout" => $bac_datas->{timeout} unless param "BackupwkTimeout"; + %= text_field "BackupwkTimeout", size => "2" + + %=l "bac_INC_ONLY_TIMEOUT" + + % if ( $bac_datas->{incOnlyTimeout} eq "checked" ) { + + %} else { + %= check_box "IncOnlyTimeout" + %} +

+ +

+ + %=l "bac_COMPRESSION_LEVEL" + + % param "Compression" => $bac_datas->{compression} unless param "Compression"; + %= text_field "Compression", size => "1" + + %=l "bac_FULL_ONLY_ON" + + % param "Dof" => $bac_datas->{dof} unless param "Dof"; + %= select_field "Dof" => $c->get_dow_list(), class => "input" +


+ + + %= hidden_field "Function" => $bac_datas->{function} + %= hidden_field "VFSType" => $bac_datas->{vfstype} + %= submit_button $c->l("Update"), class => "action" + % end +
+% end \ No newline at end of file diff --git a/output/Backup/default/back_workstn_restore1.html.new.ep b/output/Backup/default/back_workstn_restore1.html.new.ep new file mode 100644 index 0000000..8886204 --- /dev/null +++ b/output/Backup/default/back_workstn_restore1.html.new.ep @@ -0,0 +1,36 @@ +% layout "default", title => "Sme server 2 - restore"; + +% content_for "module" => begin + +
+ % if (config->{debug} == 1) { +

+ %= dumper $c->current_route + %= dumper $bac_datas +

+ % } + + % if ( stash "error" ) { +
+ %= $c->render_to_string(inline => stash "error") +
+ %} + +

<%= $title%>

+ + %= form_for "/backupd" => (method => "POST") => begin + +

+ %=l "bac_WORKSTN_RESTORE" +

+

+ %= $c->render_to_string(inline => $bac_datas->{restore_log}) +

+ %=l "bac_YOU_MUST_REBOOT" +

+ %= hidden_field "Function" => $bac_datas->{"function"} + %= submit_button $c->l("Reboot"), class => "action" + % end +
+ +% end \ No newline at end of file diff --git a/output/Backup/default/back_workstn_verify.html.new.ep b/output/Backup/default/back_workstn_verify.html.new.ep new file mode 100644 index 0000000..31b3015 --- /dev/null +++ b/output/Backup/default/back_workstn_verify.html.new.ep @@ -0,0 +1,51 @@ +% layout "default", title => "Sme server 2 - backup - verify"; +% content_for "module" => begin + +
+ % if (config->{debug} == 1) { +

+ %= dumper $c->current_route + %= dumper $bac_datas +

+ % } + + % if ( stash "error" ) { +
+ %= $c->render_to_string(inline => stash "error") +
+ %} + +

<%= $title%>

+ +

+ %=l "Verify_WORKSTN_BACKUP_FILE" +

+ + %= form_for "/backup" => (method => "POST") => begin + + % if ($bac_datas->{status} ne "enabled") { + %= $c->render_to_string(inline => (l "bac_CONFIGURATION_TO_BE_DONE")) + % } else { + %= $c->render_to_string(inline => (l "Verify_WORKSTN_BACKUP_DESC") . " " . $c->get_shared_folder_to_verify()) + %} +

+ %=l "bac_SELECT_BACKUP_FILE" + + %= select_field "Backupset" => $c->get_Backupset_options(), class => "input" +
+ +

+ %=l "bac_CHECK_TO_VERIFY_FULL_RESTORE" + + %= check_box "Verifyall" +


+ + %=l "bac_CHECK_INTEGRITY_WARNING" + +

+ %= hidden_field "Function" => $bac_datas->{"function"} . "1" + %= submit_button $c->l("Verify"), class => "action" + + % end +
+% end \ No newline at end of file diff --git a/output/Bugreport/bugreport_en.lex.diff b/output/Bugreport/bugreport_en.lex.diff new file mode 100644 index 0000000..9f309c2 --- /dev/null +++ b/output/Bugreport/bugreport_en.lex.diff @@ -0,0 +1 @@ +'Report a bug' => 'Report a bug', diff --git a/output/Bugreport/bugreport_en.lex.new1 b/output/Bugreport/bugreport_en.lex.new1 new file mode 100644 index 0000000..7d52b10 --- /dev/null +++ b/output/Bugreport/bugreport_en.lex.new1 @@ -0,0 +1,27 @@ +# +# Lex file for Bugreport generated on 2025-07-17 09:52:30 +# +'bugr_ALTERED_EVENTS' => 'A list of SME events that have been altered on your server from a base install', +'bugr_ALTERED_TEMPLATES' => 'A list of SME templates that have been altered on your server from a base install', +'bugr_AWARE_SME' => 'You are probaly aware that SME server is developed and supported by a collaborative community of volunteers from all over the world. While SME server is free to download and use, maintaining the infrastructure behind the project (eg. hosting the forums and wiki, providing repositories and build servers etc.) costs real money in the real world.', +'bugr_CONSIDER_DONATING' => 'Please consider donating to the project by clicking on the image link below:', +'bugr_CREATE_REPORT' => 'Create configuration report', +'bugr_DO_NOT_PANIC' => 'Don"t Panic!', +'bugr_DONATING' => 'Have you considered donating?', +'bugr_Download this report' => 'Download this report !', +'bugr_FOLLOWING_REPORT_MIGHT_HELP' => 'It will also help if you provide some vital information on the configuration of your SME-server in your bug report. By clicking on the "Create configuration report" button below, you can create and download a text file containing this information. Please attach this file to your bug report as well.', +'bugr_FORM_TITLE' => 'Report a Bug', +'bugr_INSTALLED_RPMS' => 'A list of additional RPMs installed on your server', +'bugr_KERNEL_AND_ARCH' => 'Current running kernel version and architecture', +'bugr_PLEASE_REPORT_HERE' => 'In order to help developers to diagnose and fix your issue, please download one of the following text templates, fill it out and paste it into your bug report at', +'bugr_PREVIOUS_SERVER_MODE' => 'Previous server mode', +'bugr_PRIVACY' => 'No privacy related data (ie. users, passwords, IP addresses) will be included in the report.', +'bugr_REPORT_CONTENT' => 'The report will contain the following information', +'bugr_SERVER_MODE' => 'Server mode', +'bugr_SME_EXPERIENCE' => 'Unfortunately there is no software without bugs, and you probably came to this page because of an issue you are experiencing with your SME-server installation.', +'bugr_SME_VERSION' => 'Koozali SME Server version', +'bugr_THANK_YOU' => 'Thank you for your support!', +'bugr_USE_TEMPLATE' => 'Please refer to the following link on how to report efficiency a bug and use its template', +'bugr_YOUR_HELP' => 'In very much the same way you need us to address your current issue, we need YOUR help to keep this project alive!', +'bugr_YUM_REPOS' => 'A list of additional software repositories configured on your server', +'Report a bug' => 'Report a bug', diff --git a/output/Clamav/AdminLTE/clamav.html.new.ep b/output/Clamav/AdminLTE/clamav.html.new.ep new file mode 100644 index 0000000..22800f2 --- /dev/null +++ b/output/Clamav/AdminLTE/clamav.html.new.ep @@ -0,0 +1,68 @@ +% layout "AdminLTE", title => "Sme server 2 - clamav"; + +% content_for "module" => begin + +
+ + % if (config->{debug} == 1) { +
+        Route: <%= dumper $c->current_route %>
+ FsS stat: <%= dumper $clm_datas->{FilesystemScan}%>
+ Quar stat: <%= dumper $clm_datas->{Quarantine} %> +
+ % } + +

<%= $title %>

+ + <%= $modul %> + +

+ +
+ +
+
+ <%= l "clm_LABEL_FILESYSTEM_SCAN_PERIOD" %>: +
+
+ % param "FilesystemScan" => $clm_datas->{FilesystemScan} unless param "FilesystemScan"; + <%= select_field "FilesystemScan" => [[ (l "Daily") => "daily"], [ (l "Never") => "disabled"], [ (l "Weekly") => "weekly"]], class => "form-select" %> +
+
+ +
+ +
+
+ <%= l "clm_LABEL_QUARANTINE" %>: +
+
+ % param "Quarantine" => $clm_datas->{Quarantine} unless param "Quarantine"; + <%= select_field "Quarantine" => [[ (l "ENABLED") => "enabled"], [ (l "DISABLED") => "disabled"]], class => "form-select" %> +
+
+ +
+ +
+
+
<%= l "clm_LABEL_CLAM_VERSIONS" %>:
+
+
+ <%= $clm_datas->{clam_versions} %> +
+
+ +
+ + <% my $btn = l("SAVE"); %> + +
+
+ +
+
+ +
+
+%end diff --git a/output/Clamav/clamav_en.lex.diff b/output/Clamav/clamav_en.lex.diff new file mode 100644 index 0000000..e69de29 diff --git a/output/Clamav/clamav_en.lex.new1 b/output/Clamav/clamav_en.lex.new1 new file mode 100644 index 0000000..30f1208 --- /dev/null +++ b/output/Clamav/clamav_en.lex.new1 @@ -0,0 +1,12 @@ +# +# Lex file for Clamav generated on 2025-07-17 09:52:30 +# +'clm_DESC_FILESYSTEM_SCAN_PERIOD' => '

General Settings

+If this option is enabled then the filesystem will be +scanned for viruses. A report of any found viruses will be +emailed to the administrator.', +'clm_FORM_TITLE' => 'Antivirus settings', +'clm_LABEL_CLAM_VERSIONS' => 'ClamAV and db versions', +'clm_LABEL_FILESYSTEM_SCAN_PERIOD' => 'Scan filesystem', +'clm_LABEL_QUARANTINE' => 'Quarantine infected files', +'clm_SUCCESS' => 'The new clamav antivirus settings have been saved.', diff --git a/output/Clamav/default/clamav.html.new.ep b/output/Clamav/default/clamav.html.new.ep new file mode 100644 index 0000000..295dd7e --- /dev/null +++ b/output/Clamav/default/clamav.html.new.ep @@ -0,0 +1,45 @@ +% layout "default", title => "Sme server 2 - clamav"; + +% content_for "module" => begin +
+ %if (config->{debug} == 1) { +

(DBG)route: <%= $c->current_route %>
+ (DBG)FsS stat: <%= $clm_datas->{FilesystemScan}%>
+ (DBG)Quar stat: <%=$clm_datas->{Quarantine} %> +

+ %} +

<%= $title %>

+
+ <%= $modul %> + <% my $btn = l("SAVE"); %> + + %= form_for "clamav" => (method => "POST") => begin +

+ + %=l "clm_LABEL_FILESYSTEM_SCAN_PERIOD" + + % param "FilesystemScan" => $clm_datas->{FilesystemScan} unless param "FilesystemScan"; + %= select_field "FilesystemScan" => [[ (l "Daily") => "daily"], [ (l "Never") => "disabled"], [ (l "Weekly") => "weekly"]], class => "input" + +

+

+ + %=l "clm_LABEL_QUARANTINE" + + % param "Quarantine" => $clm_datas->{Quarantine} unless param "Quarantine"; + %= select_field "Quarantine" => [[ (l "ENABLED") => "enabled"], [ (l "DISABLED") => "disabled"]], class => "input" +
+
+

+

+ + %=l "clm_LABEL_CLAM_VERSIONS" + + %= $clm_datas->{clam_versions} +
+
+

+ %= submit_button "$btn", class => "action" + % end +
+%end diff --git a/output/Datetime/datetime_en.lex.diff b/output/Datetime/datetime_en.lex.diff new file mode 100644 index 0000000..93289a1 --- /dev/null +++ b/output/Datetime/datetime_en.lex.diff @@ -0,0 +1,41 @@ +'dat_APRIL' => 'April', +'dat_AUGUST' => 'August', +'dat_BETWEEN_1_AND_12' => 'Please choose an hour between 1 and 12.', +'dat_BETWEEN_1_AND_31' => 'Please choose a day between 1 and 31.', +'dat_COULD_NOT_OPEN_TZ_FILE' => 'Error: Could not open timezone file for reading: ', +'dat_CURRENT_SETTING' => 'Current setting', +'dat_DECEMBER' => 'December', +'dat_ERR_CHANGING_TS' => 'Error while changing network time server setting', +'dat_ERR_SETTING_CLOCK' => 'Error occurred while setting system time and hardware clock.', +'dat_FEBRUARY' => 'February', +'dat_FOUR_DIGIT_YEAR' => 'Please choose a four-digit year between 1900 and 2200.', +'dat_INVALID_DAY' => 'Error: invalid day of month: ', +'dat_INVALID_MONTH' => 'Error: invalid month', +'dat_INVALID_NTP_ADDR' => 'Invalid NTP server address: ', +'dat_INVALID_YEAR' => 'Error: invalid year: ', +'dat_JANUARY' => 'January', +'dat_JULY' => 'July', +'dat_JUNE' => 'June', +'dat_MARCH' => 'March', +'dat_MAY' => 'May', +'dat_MONTH_BETWEEN_1_AND_12' => 'Please choose a month value between 1 and 12.', +'dat_NETWORK_TIME_SERVER' => 'Network Time Server', +'dat_NEW_DATE_AND_TIME' => 'New date and time setting:', +'dat_NEW_H/M/S' => 'New hour/min/sec:', +'dat_NEW_M/D/Y' => 'New month/day/year:', +'dat_NOVEMBER' => 'November', +'dat_NTP_CONFIGURE_TITLE' => 'Configure Network Time Server', +'dat_NTP_DISABLE_TITLE' => 'Disable Network Time Server', +'dat_NTP_ENABLE_TITLE' => 'Enable Network Time Server', +'dat_NTP_SERVER' => 'NTP Server', +'dat_OCTOBER' => 'October', +'dat_SEPTEMBER' => 'September', +'dat_SERVER_DISABLED' => 'Network time server disabled successfully', +'dat_SERVER_DISABLED_DESC' => 'You have disabled this service: The server will rely on its internal +clock, and will not try to synchronize from a time server.', +'dat_SET_DATE_TITLE' => 'Set Date and Time', +'dat_SETTING_DATE_AND_TIME' => 'Setting date and time', +'dat_SYNC_WITH' => 'This server is now configured to synchronize periodically +(via the Internet) with:', +'dat_VERIFY_DATE_AND_TIME' => 'Verify date and time', +'Date and time' => 'Date and time', diff --git a/output/Datetime/datetime_en.lex.new1 b/output/Datetime/datetime_en.lex.new1 new file mode 100644 index 0000000..9ce2440 --- /dev/null +++ b/output/Datetime/datetime_en.lex.new1 @@ -0,0 +1,65 @@ +# +# Lex file for Datetime generated on 2025-07-17 09:52:31 +# +'dat_APRIL' => 'April', +'dat_AUGUST' => 'August', +'dat_BETWEEN_0_AND_59' => 'Please choose a minute between 0 and 59.', +'dat_BETWEEN_1_AND_12' => 'Please choose an hour between 1 and 12.', +'dat_BETWEEN_1_AND_31' => 'Please choose a day between 1 and 31.', +'dat_COULD_NOT_OPEN_TZ_FILE' => 'Error: Could not open timezone file for reading: ', +'dat_CURRENT_SETTING' => 'Current setting', +'dat_DECEMBER' => 'December', +'dat_ERR_CHANGING_TS' => 'Error while changing network time server setting', +'dat_ERR_SETTING_CLOCK' => 'Error occurred while setting system time and hardware clock.', +'dat_FEBRUARY' => 'February', +'dat_FORM_TITLE' => 'Date and time configuration', +'dat_FOUR_DIGIT_YEAR' => 'Please choose a four-digit year between 1900 and 2200.', +'dat_INITIAL_DESC' => 'This is where you configure the date and time of this server. You may use an existing network time server or +manually set the date and time for your time zone.', +'dat_Invalid_date' => 'Invalid date', +'dat_INVALID_DAY' => 'Error: invalid day of month: ', +'dat_INVALID_HOUR' => 'Error: invalid hour: ', +'dat_INVALID_MINUTE' => 'Error: invalid minute: ', +'dat_INVALID_MONTH' => 'Error: invalid month', +'dat_INVALID_NTP_ADDR' => 'Invalid NTP server address: ', +'dat_INVALID_NTP_SERVER' => 'Invalid NTP server, the server will not try to synchronize from a time server.', +'dat_INVALID_SECOND' => 'Error: invalid second', +'dat_INVALID_YEAR' => 'Error: invalid year: ', +'dat_JANUARY' => 'January', +'dat_JULY' => 'July', +'dat_JUNE' => 'June', +'dat_manually_set' => 'Set manually', +'dat_MARCH' => 'March', +'dat_MAY' => 'May', +'dat_MONTH_BETWEEN_1_AND_12' => 'Please choose a month value between 1 and 12.', +'dat_NETWORK_TIME_SERVER' => 'Network Time Server', +'dat_NEW_DATE_AND_TIME' => 'New date and time setting:', +'dat_NEW_H/M/S' => 'New hour/min/sec:', +'dat_NEW_M/D/Y' => 'New month/day/year:', +'dat_NOVEMBER' => 'November', +'dat_NTP_CONFIGURE_DESC' => 'The server is periodically synchronizing the system clock to the network time protocol (NTP) server specified below. To synchronize to a different NTP server, enter a different hostname or IP address in the field below.', +'dat_NTP_CONFIGURE_TITLE' => 'Configure Network Time Server', +'dat_NTP_DISABLE_DESC' => 'Choose this option to stop syncronizing the system clock to the NTP +server.When the NTP service is disabled, you can set the system date and time manually from this page.', +'dat_NTP_DISABLE_TITLE' => 'Disable Network Time Server', +'dat_NTP_ENABLE_DESC' => 'The server can periodically synchronize the system clock to a network time protocol (NTP) server. If you select this option, enter the hostname or IP address of the NTP server below.', +'dat_NTP_ENABLE_TITLE' => 'Enable Network Time Server', +'dat_NTP_SERVER' => 'NTP Server', +'dat_ntp_server' => 'NTP server', +'dat_NTP_Server_URL' => 'NTP Server URL:', +'dat_OCTOBER' => 'October', +'dat_SEPTEMBER' => 'September', +'dat_SERVER_DISABLED' => 'Network time server disabled successfully', +'dat_SERVER_DISABLED_DESC' => 'You have disabled this service: The server will rely on its internal +clock, and will not try to synchronize from a time server.', +'dat_SET_DATE_TITLE' => 'Set Date and Time', +'dat_set_manually' => 'Set Date and Time:', +'dat_SETTING_DATE_AND_TIME' => 'Setting date and time', +'dat_SETTINGS_CHANGED' => 'Network time server setting changed successfully', +'dat_SYNC_WITH' => 'This server is now configured to synchronize periodically +(via the Internet) with:', +'dat_The_time_is_currently' => 'The time is currently:', +'dat_TZ' => 'Time zone:', +'dat_UPDATING_CLOCK' => 'System clock is being updated', +'dat_VERIFY_DATE_AND_TIME' => 'Verify date and time', +'Date and time' => 'Date and time', diff --git a/output/Directory/directory_en.lex.diff b/output/Directory/directory_en.lex.diff new file mode 100644 index 0000000..0253476 --- /dev/null +++ b/output/Directory/directory_en.lex.diff @@ -0,0 +1 @@ +'Directory' => 'Directory', diff --git a/output/Directory/directory_en.lex.new1 b/output/Directory/directory_en.lex.new1 new file mode 100644 index 0000000..57085ac --- /dev/null +++ b/output/Directory/directory_en.lex.new1 @@ -0,0 +1,30 @@ +# +# Lex file for Directory generated on 2025-07-17 09:52:31 +# +'dir_CITY' => 'Default City', +'dir_COMPANY' => 'Default company', +'dir_DEPARTMENT' => 'Default department', +'dir_DESC_DEPARTMENT' => 'These fields are the LDAP defaults for your organization. +Whenever you create a new user account, you will be prompted +to enter all of these fields (they can be different for each +user) but the values you set here +will show up as defaults. This is a convenience to make it +faster to create user accounts.', +'dir_DESC_DIRECTORY_ACCESS' => ' You can control access to your LDAP directory: +the private setting allows access only from your local network, and the public setting allows access from anywhere on the Internet. ', +'dir_DESC_EXISTING' => 'You can either leave existing user accounts as they are, using the above defaults only for +new users, or you can apply the above defaults to all existing users as well.', +'dir_DESCRIPTION' => 'The LDAP server provides a network-available listing of the user accounts +and groups on your server, and can be accessed using an LDAP client such as the Address Book feature + in Netscape Communicator. Configure your LDAP client with the local IP address of your server, + port number 389, and the server root parameter shown below.', +'dir_DIRECTORY_ACCESS' => 'LDAP directory access', +'dir_EXISTING' => 'Existing users', +'dir_FORM_TITLE' => 'Change LDAP directory settings', +'dir_LABEL_ROOT' => 'Server root', +'dir_LEAVE' => 'Leave as they are', +'dir_PHONENUMBER' => 'Default Phone Number', +'dir_STREET' => 'Default Street address', +'dir_SUCCESS' => 'The new LDAP default settings have been saved.', +'dir_UPDATE' => 'Update with new defaults', +'Directory' => 'Directory', diff --git a/output/Domains/domains_en.lex.diff b/output/Domains/domains_en.lex.diff new file mode 100644 index 0000000..3f15799 --- /dev/null +++ b/output/Domains/domains_en.lex.diff @@ -0,0 +1,13 @@ +'dom_corporate' => 'Corporate DNS servers', +'dom_DOMAIN_DESCRIPTION_VALIDATION_ERROR' => 'Error: unexpected or missing characters in domain description +[_1]. Did not create new domain.', +'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.', +'dom_internet' => 'Internet DNS servers', +'dom_localhost' => 'Resolve locally', +'dom_NO_VIRTUAL_DOMAINS' => 'There are no domains in the system', +'dom_REMOVE_DESC' => 'You are about to remove the domain ', +'dom_REMOVE_DESC2' => ' Are you sure you wish to remove this 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.', diff --git a/output/Domains/domains_en.lex.new1 b/output/Domains/domains_en.lex.new1 new file mode 100644 index 0000000..a96ed2f --- /dev/null +++ b/output/Domains/domains_en.lex.new1 @@ -0,0 +1,60 @@ +# +# Lex file for Domains generated on 2025-07-17 09:52:31 +# +'dom_ABOUT_TO_REMOVE' => 'Are you sure you wish to remove this domain ?', +'dom_ADD_DOMAIN' => 'Add domain', +'dom_CONTENT' => '[_1] i-bay', +'dom_CONTENT_FIELD_DESCRIPTION' => 'For the web site, you may choose your primary web site or any +i-bay as the content.', +'dom_corporate' => 'Corporate DNS servers', +'dom_CREATE_TITLE' => 'Create a new domain', +'dom_CURRENT_DOMAINS' => 'Current list of domains', +'dom_DESC_CORPORATE_DNS' => 'If this server does not have access to the Internet, or +you have special requirements for DNS resolution, +enter the DNS server IP addresses here. +These fields should be left blank unless +you have a specific reason to configure other DNS servers. +You should not enter the address of your ISP"s DNS servers +here, as the server is capable of resolving all +Internet DNS names without this additional configuration.', +'dom_DESC_CORPORATE_DNS_CURRENT' => 'Corporate DNS Settings', +'dom_DESC_NAMESERVERS' => 'You can select whether this domain is resolved locally, +passed to the corporate DNS servers, or resolved by +the Internet DNS servers. The default will be correct +for most networks.', +'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 +new domain.', +'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.', +'dom_DOMAINS_PAGE_CORPORATE_DNS' => 'Modify corporate DNS settings', +'dom_ERROR_WHILE_REMOVING_DOMAIN' => 'Error: internal failure while removing domain [_1].', +'dom_FORM_DESCRIPTION' => 'When you create a domain, your server will be able to +receive e-mail for that domain and will also be able to host a +web site for that domain.', +'dom_FORM_TITLE' => 'Manage domains', +'dom_internet' => 'Internet DNS servers', +'dom_LABEL_CORPORATE_DNS_PRIMARY' => 'Primary corporate DNS server', +'dom_LABEL_CORPORATE_DNS_SECONDARY' => 'Secondary corporate DNS server', +'dom_LABEL_NAMESERVERS' => 'Domain DNS servers', +'dom_localhost' => 'Resolve locally', +'dom_MODIFY_TITLE' => 'Modify domain', +'dom_NO_VIRTUAL_DOMAINS' => 'There are no domains in the system', +'dom_NONEXISTENT_DOMAIN_ERROR' => 'Error: [_1] is not an existing domain.', +'dom_PRIMARY_SITE' => 'primary site', +'dom_REMOVE_DESC' => 'You are about to remove the domain ', +'dom_REMOVE_DESC2' => ' Are you sure you wish to remove this Domain ? ', +'dom_REMOVE_DESCRIPTION' => 'You are about to remove the domain "[_1]" ([_2]).', +'dom_REMOVE_TITLE' => 'Remove domain', +'dom_SUCCESSFULLY_CREATED' => 'Successfully created domain [_1].Your web +server is now being restarted. The links on this page will be +inactive until the web server restart is complete.', +'dom_SUCCESSFULLY_DELETED' => 'Successfully deleted domain [_1]. Your web server +is now being restarted. The links on this page will be inactive +until the web server restart is complete.', +'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.', +'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.', diff --git a/output/Emailsettings/AdminLTE/_mai_REC.html.new.ep b/output/Emailsettings/AdminLTE/_mai_REC.html.new.ep new file mode 100644 index 0000000..82d8317 --- /dev/null +++ b/output/Emailsettings/AdminLTE/_mai_REC.html.new.ep @@ -0,0 +1,272 @@ +%# layout "AdminLTE", title => "Sme server 2 - emailreceive"; + +%# content_for "module" => begin + +%# use constant FALSE => 0; +%# use constant TRUE => 1; + + + + % if (config->{debug} == 1) { +
+            <<%=  dumper $c->current_route %>
+            <<%=  dumper $mai_data %>
+            <<%=  dumper $c->param("SMTPAuth") %>
+        
+ % } + + % if ( stash "error" ) { +
+
+ <<%= $c->render_to_string(inline => stash "error") %> +
+ % } + + + +

<%= $c->l("mai_DESC_STATE_RECEPTION_BUTTON") %>

+ +
+ +
+ +
+ <%= l "mai_DESC_MODE" %> +
+ +
+ +
+
+ <%= l "mai_LABEL_MODE" %> +
+
+ % param "FetchmailMethod" => $mai_data->{fetchmailmethod} unless param "FetchmailMethod"; + <%= select_field "FetchmailMethod" => $c->get_retrieval_opt(), class =>"form-select" %> +
+
+ +
+ + +
+
+ Note - this first line was disabled? + +
+ <%= l "mai_DESC_SMTP_AUTH_CONTROL" %> +
+ /end +
+ +
+ +
+ <%= l "SMTP port (25) main purpose is to receive emails from another server, STARTTLS is always offered, but auth if offered is only if STARTTLS is also used by client." %> +
+ +
+ +
+ <%= l "SMTPS port (465) will require implicit SSL/TLS then authenticate to send." %> +
+ +
+ +
+ <%= l "SMTP Submission port (587) will require STARTTLS, then authenticate to send." %> +
+ +
+ +
+ + % my $smtp_mesg=l("SMTP port %u allow client to authenticate:"); + % param "SMTPAuth" => $c->get_current_smtp_auth( FALSE ) unless param "SMTPAuth"; + +
+
+ <%= sprintf($smtp_mesg,$c->get_db_prop("qpsmtpd","TCPPort",25)); %> +
+
+ <%= select_field "SMTPAuth" => $c->get_smtp_auth_opt(), class => "form-select" %> +
+
+ +
+ + % my $smtp_mesg=l("SMTPS SSL/TLS auth: port %u status:"); + % param "sSMTPAuth" => $c->get_current_smtp_ssl_auth(FALSE,"s", TRUE) unless param "sSMTPAuth"; + +
+
+ <%= sprintf($smtp_mesg,$c->get_db_prop("sqpsmtpd","TCPPort",465)); %> +
+
+ <%= select_field "sSMTPAuth" => $c->get_smtp_ssl_auth_opt(), class => "form-select" %> +
+
+ +
+ + % my $smtp_mesg=l("Submission port %u status:"); + % param "uSMTPAuth" => $c->get_current_smtp_ssl_auth(FALSE,"u", TRUE) unless param "uSMTPAuth"; + +
+
+ <%= sprintf($smtp_mesg,$c->get_db_prop("uqpsmtpd","TCPPort",587)); %> +
+
+ + <%= select_field "uSMTPAuth" => $c->get_smtp_ssl_auth_opt(), class => "form-select" %> +
+
+ +
+ +

<%= l "mai_TITLE_SECONDARY" %>

+ +
+ +
+ <%= l "mai_DESC_SECONDARY" %> +
+ +
+ + % param "SecondaryMailServer" => $mai_data->{secondarymailserver} unless param "SecondaryMailServer"; + +
+
+ +
+
+ +
+
+ +
+ +
+ <%= l "mai_DESC_FETCH_PERIOD" %> +
+ + % param "FreqOffice" => $mai_data->{freqoffice} unless param "FreqOffice"; + +
+
+ <%= l "mai_LABEL_FETCH_PERIOD" %> +
+
+ <%= select_field "FreqOffice" => $c->fetchmail_freq(), class => "form-select" %> +
+
+ +
+ + % param "FreqOutside" => $mai_data->{freqoutside} unless param "FreqOutside"; + +
+
+ <%= l "mai_LABEL_FETCH_PERIOD_NIGHTS" %> +
+
+ <%= select_field "FreqOutside" => $c->fetchmail_freq(), class => "form-select" %> +
+
+ +
+ + % param "FreqWeekend" => $mai_data->{freqweekend} unless param "FreqWeekend"; + +
+
+ <%= l "mai_LABEL_FETCH_PERIOD_WEEKENDS" %> +
+
+ <%= select_field "FreqWeekend" => $c->fetchmail_freq(), class => "form-select" %> +
+
+ +
+ + % param "SecondaryMailAccount" => $mai_data->{secondarymailaccount} unless param "SecondaryMailAccount"; + +
+
+ +
+
+ +
+
+ +
+ + % param "SecondaryMailPassword" => $mai_data->{secondarymailpassword} unless param "SecondaryMailPassword"; + +
+
+ +
+
+ +
+
+ +
+
+ + +
+ + % param "SpecifyHeader" => $mai_data->{specifyheader} unless param "SpecifyHeader"; + +
+
+ <%= l "mai_LABEL_SORT_METHOD" %> +
+
+ <%= select_field "SpecifyHeader" => [[(l "Default") => "off"], [(l "mai_SPECIFY_BELOW") => "on"]], class => "form-select" %> +
+
+ +
+ + % param "SecondaryMailEnvelope" => $mai_data->{secondarymailenvelope} unless param "SecondaryMailEnvelope"; + +
+
+ +
+
+ +
+
+ +
+ + % my $btn = l("SAVE"); + % param "trt" => $mai_data->{trt} unless param "trt"; + <%= hidden_field "trt" => "REC" %> + +
+
+ +
+
+ +
+ +
+ +%#end + diff --git a/output/Emailsettings/Emailsettings-Custom.new.pm b/output/Emailsettings/Emailsettings-Custom.new.pm new file mode 100644 index 0000000..02aaba8 --- /dev/null +++ b/output/Emailsettings/Emailsettings-Custom.new.pm @@ -0,0 +1,1171 @@ +# +# Generated by SM2Gen version:0.9(20Jan2025) Chameleon version:4.5.4 On Python:3.12.3 at 2025-06-29 08:53:20 +# +# +# 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::UTF8; +use esmith::AccountsDB; +use esmith::NetworksDB::UTF8; +use esmith::HostsDB; +use esmith::DomainsDB::UTF8; +use Data::Validate::IP qw(is_ipv4 is_ipv6); + +use constant FALSE => 0; +use constant TRUE => 1; + + +#The most common ones - open DB when required. +our $cdb; +my $adb; +my $ndb; +my $hdb; +my $ddb; + +#The most common ones - you might want to use these if you need to make sure that the DB is refreshed. +#$cdb = esmith::ConfigDB::UTF8->open() || die("Couldn"t open config db\"); +#$adb = esmith::AccountsDB->open() || die(\"Couldn"t open Accounts db"); +#$ndb = esmith::NetworksDB->open() || die("Couldn"t open Network db\"); +#$hdb = esmith::HostsDB::UTF8->open() || die(\"Couldn"t open Hosts db"); +#$ddb = esmith::DomainsDB::UTF8->open() || die("Couldn"t open Domains db\"); + + +# Validation routines - parameters for each panel + + sub validate_FRONT { + my $c = shift; + my $mai_data = shift; #Data hash as parameter + # Validation for each field + my $ret = ""; + + if ($ret eq "") {$ret = "ok";} + return $ret; + } + + sub validate_ACC { + my $c = shift; + my $mai_data = shift; #Data hash as parameter + # Validation for each field + my $ret = ""; + + if ($ret eq "") {$ret = "ok";} + return $ret; + } + + sub validate_FIL { + my $c = shift; + my $mai_data = shift; #Data hash as parameter + # Validation for each field + my $ret = ""; + + if ($ret eq "") {$ret = "ok";} + return $ret; + } + + sub validate_REC { + my $c = shift; + my $mai_data = shift; #Data hash as parameter + # Validation for each field + my $ret = ""; + + if ($ret eq "") {$ret = "ok";} + return $ret; + } + + sub validate_DEL { + my $c = shift; + my $mai_data = shift; #Data hash as parameter + # Validation for each field + my ($retult,$ret) = ""; + CHECKS: { + $ret = $c->validate_ip_or_blank($c->param("DelegateMailServer")); + $c->app->log->info(\"$c->param("DelegateMailServer") $ret\"); + if ($ret ne "ok") { + #$retult = $c->l($ret); + last CHECKS; + } + + $ret = $c->validate_smarthost($c->param("SMTPSmartHost")); + if ($ret ne "ok") { + #$retult = $c->l($ret); + last CHECKS; + } + + $ret = $c->nonblank_if_smtpauth($c->param("SMTPSmartHost")); + if ($ret ne "ok") { + #$retult = $c->l($ret); + last CHECKS; + } + + $ret = $c->nonblank_if_smtpauth($c->param("SMTPAUTHPROXY_Userid")); + if ($ret ne "ok") { + #$retult = $c->l($ret); + last CHECKS; + } + + $ret = $c->nonblank_if_smtpauth($c->param("SMTPAUTHPROXY_Passwd")); + if ($ret ne "ok") { + #$retult = $c->l($ret); + last CHECKS; + } + + $ret = $c->change_settings_delivery(); + if ($ret ne "ok") { + #$retult = $ret; + last CHECKS; + } + #$result = ""; + } + # $ret now contains the first error or the null (success) message + if ($ret eq "") {$ret = "ok";} + return $ret; + } + + +# Get singleton data for each panel + + sub get_data_for_panel_FRONT { + # Return a hash with the fields required which will be loaded into the shared data + my $c = shift; + my $cdb = esmith::ConfigDB::UTF8->open() || die(\"Couldn"t open config db"); + my %ret = ( + "Data1"=>"Data for FRONT", #Example + # fields from Inputs in FRONT $fields["FRONT"] + "fetchmailmethod" => $cdb->get_prop("fetchmail", "Method"), + + ); + return %ret; + } + + sub get_data_for_panel_ACC { + # Return a hash with the fields required which will be loaded into the shared data + my $c = shift; + my $cdb = esmith::ConfigDB::UTF8->open() || die("Couldn"t open config db\"); + my %ret = ( + # fields from Inputs in ACC $fields["ACC"] + "fetchmailmethod" => $cdb->get_prop("fetchmail", "Method"), + ); + return %ret; + } + + sub get_data_for_panel_FIL { + # Return a hash with the fields required which will be loaded into the shared data + my $c = shift; + my $cdb = esmith::ConfigDB::UTF8->open() || die(\"Couldn"t open config db"); + my %ret = ( + # fields from Inputs in FIL $fields["FIL"] + "virusstatus" => $c->get_virus_status(), + "spamstatus" => $cdb->get_prop("spamassassin", "status"), + "spamsensitivity" => $cdb->get_prop("spamassassin", "Sensitivity", "medium"), + "spamtaglevel" => $cdb->get_prop("spamassassin", "TagLevel") || "0", + "spamrejectlevel" => $cdb->get_prop("spamassassin", "RejectLevel") || "0", + "spamsortspam" => $cdb->get_prop("spamassassin", "SortSpam"), + "spamsubjecttag" => $cdb->get_prop("spamassassin", "SubjectTag"), + "spamsubject" => $cdb->get_prop("spamassassin", "Subject"), + ); + return %ret; + } + + sub get_data_for_panel_REC { + # Return a hash with the fields required which will be loaded into the shared data + my $c = shift; + my $cdb = esmith::ConfigDB::UTF8->open() || die("Couldn"t open config db\"); + my %ret = ( + "Data1"=>"Data for REC", #Example + # fields from Inputs in REC $fields["REC"] + "fetchmailmethod" => $cdb->get_prop("fetchmail", "Method"), + "freqoffice" => $cdb->get_prop("fetchmail", "FreqOffice"), + "freqoutside" => $cdb->get_prop("fetchmail", "FreqOutside"), + "freqweekend" => $cdb->get_prop("fetchmail", "FreqWeekend"), + "secondarymailserver" => $cdb->get_prop("fetchmail", "SecondaryMailServer"), + "secondarymailaccount" => $cdb->get_prop("fetchmail", "SecondaryMailAccount"), + "secondarymailpassword" => $cdb->get_prop("fetchmail", "SecondaryMailPassword"), + "specifyheader" => get_secondary_mail_use_envelope(), + "secondarymailenvelope" => $cdb->get_prop("fetchmail", "SecondaryMailEnvelope"), + ); + return %ret; + } + + sub get_data_for_panel_DEL { + # Return a hash with the fields required which will be loaded into the shared data + my $c = shift; + my $cdb = esmith::ConfigDB::UTF8->open() || die(\"Couldn"t open config db"); + my %ret = ( + # fields from Inputs in DEL $fields["DEL"] + "emailunknownuser" => $cdb->get_value("EmailUnknownUser") || "\"returntosender", + "delegatemailserver" => $cdb->get_value("DelegateMailServer"), + "smtpsmarthost" => $cdb->get_value("SMTPSmartHost"), + "smtpauthproxystatus" => $cdb->get_prop("smtp-auth-proxy", "status") || "disabled", + "smtpauthproxyuserid" => $cdb->get_prop("smtp-auth-proxy", "Userid") || "", + "smtpauthproxypassword" => $cdb->get_prop("smtp-auth-proxy", "Passwd") || "", + ); + return %ret; + } + +# Get control data for table(s) +# Return hash with values from row in which link clicked on table + + sub get_selected_FRONT { + my $c = shift; + my $selected = shift; #Parameter is name of selected row. + my $is_new_record = shift; #Indicates new record required (defaults) + my %ret = (); + #gather the values here + return %ret; + } + + sub get_selected_ACC { + my $c = shift; + my $selected = shift; #Parameter is name of selected row. + my $is_new_record = shift; #Indicates new record required (defaults) + my %ret = (); + #gather the values here + return %ret; + } + + sub get_selected_FIL { + my $c = shift; + my $selected = shift; #Parameter is name of selected row. + my $is_new_record = shift; #Indicates new record required (defaults) + my %ret = (); + #gather the values here + return %ret; + } + + sub get_selected_REC { + my $c = shift; + my $selected = shift; #Parameter is name of selected row. + my $is_new_record = shift; #Indicates new record required (defaults) + my %ret = (); + #gather the values here + return %ret; + } + + sub get_selected_DEL { + my $c = shift; + my $selected = shift; #Parameter is name of selected row. + my $is_new_record = shift; #Indicates new record required (defaults) + my %ret = (); + #gather the values here + return %ret; + } + + +#after sucessful modify or create or whatever and submit then perfom (if the params validate) + + sub perform_FRONT { + my $c = shift; + my $mai_data = shift; #Data hash as parameter + my $ret = ""; + my $db = $cdb; #maybe one of the others + my $dbkey = "ChangeThis"; + # 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 ($ret eq "") {$ret = "ok";} + return $ret; + } + + sub perform_ACC { + my $c = shift; + my $mai_data = shift; #Data hash as parameter + my $ret = ""; + my $db = $cdb; #maybe one of the others + my $dbkey = "ChangeThis"; + # To make it write to DB as comment, delete this (regex) string in each if statement "TRUE\) \#copy or perform with value: .* e.g." + $ret = $c->change_settings_access(); + if ($ret eq "") {$ret = "ok";} + return $ret; + } + + sub perform_FIL { + my $c = shift; + my $mai_data = shift; #Data hash as parameter + my $ret = ""; + my $db = $cdb; #maybe one of the others + my $dbkey = "ChangeThis"; + # To make it write to DB as comment, delete this (regex) string in each if statement "TRUE\) \#copy or perform with value: .* e.g." + $ret = $c->change_settings_filtering(); + if ($ret eq "") {$ret = "ok";} + return $ret; + } + + sub perform_REC { + my $c = shift; + my $mai_data = shift; #Data hash as parameter + my $ret = ""; + my $db = $cdb; #maybe one of the others + my $dbkey = "ChangeThis"; + # To make it write to DB as comment, delete this (regex) string in each if statement "TRUE\) \#copy or perform with value: .* e.g." + $ret = $c->change_settings_reception(); + if ($ret eq "") {$ret = "ok";} + return $ret; + } + + sub perform_DEL { + my $c = shift; + my $mai_data = shift; #Data hash as parameter + my $ret = ""; + my $db = $cdb; #maybe one of the others + my $dbkey = "ChangeThis"; + # To make it write to DB as comment, delete this (regex) string in each if statement "TRUE\) \#copy or perform with value: .* e.g." + $ret = $c->change_settings_delivery(); + if ($ret eq "") {$ret = "ok";} + return $ret; + } + + +sub create_link{ + # WIP + my ($c,$route, $panel, $index) = @_; + my $link = "$route?trt=$panel&Selected=$index"; + return $link; +} + +sub get_virus_status { + my ($c, $localise) = @_; + my $cdb = esmith::ConfigDB::UTF8->open() || die("Couldn"t open config db\"); + my $status = $cdb->get_prop(\"qpsmtpd\", "VirusScan") || "disabled"; + return $localise ? $c->localise_status($status) : $status; +} ## end sub get_virus_status + +sub get_spam_status { + my ($c, $localise) = @_; + my $cdb = esmith::ConfigDB::UTF8->open() || die(\"Couldn"t open config db"); + my $status = $cdb->get_prop("spamassassin", "status") || "disabled"; + return $localise ? $c->localise_status($status) : $status; +} ## end sub get_spam_status + +sub localise_status { + my ($c, $status) = @_; + return $c->l($status eq "enabled" ? $c->l("ENABLED") : $c->l("DISABLED")); +} + +sub get_db_prop { + my ($c, $item, $prop, $default) = @_; + my $cdb = esmith::ConfigDB::UTF8->open() || die("Couldn"t open config db\"); + return $cdb->get_prop($item, $prop) || $default; +} + +sub get_value { + my $c = shift; + my $item = shift; + my $cdb = esmith::ConfigDB::UTF8->open() || die(\"Couldn"t open config db"); + return $cdb->get_value($item) || ""; +} ## end sub get_value + +sub get_emailunknownuser_status { + my ($c, $localise) = @_; + my $options = $c->get_emailunknownuser_options(); + my $cdb = esmith::ConfigDB::UTF8->open() || die("Couldn"t open config db\"); + my $val = $cdb->get_value("EmailUnknownUser") || \"returntosender\"; + return $localise ? $c->l($options->{$val}) : $val; +} ## end sub get_emailunknownuser_status + +sub get_patterns_status { + my ($c, $localise) = @_; + my $cdb = esmith::ConfigDB::UTF8->open() || die(\"Couldn"t open config db"); + my $status = $cdb->get_prop("qpsmtpd", "PatternsScan") || "disabled"; + return $localise ? $c->localise_status($status) : $status; +} ## end sub get_patterns_status + +sub adjust_patterns { + my $c = shift; + my @selected = @{ $c->every_param("BlockExecutableContent") }; + $pattern_db = esmith::ConfigDB::UTF8->open("mailpatterns"); + foreach my $pattern ($pattern_db->get_all_by_prop(type => "pattern")) { + my $status + = (grep $pattern->key eq $_, @selected) + ? "enabled" + : "disabled"; + $pattern->set_prop("Status", $status); + } ## end foreach my $pattern ($pattern_db...) + $pattern_db->reload; + return scalar @selected; +} ## end sub adjust_patterns + +sub get_current_pop3_access { + my ($c, $localise) = @_; + my $cdb = esmith::ConfigDB::UTF8->open() || die("Couldn"t open config db\"); + my $pop3Status = $cdb->get_prop("pop3", "status") || "enabled"; + my $pop3Access = $cdb->get_prop("pop3", "access") || "private"; + my $pop3sStatus = $cdb->get_prop("pop3s", "status") || "enabled"; + my $pop3sAccess = $cdb->get_prop("pop3s", "access") || "private"; + my $options = get_pop_options(); + + if ($pop3Status ne "enabled" && $pop3sStatus ne "enabled") { + return $localise ? $c->l($options->{disabled}) : "disabled"; + } elsif ($pop3Status eq "enabled" && $pop3Access eq "public") { + return $localise ? $c->l($options->{public}) : "public"; + } elsif ($pop3sStatus eq "enabled" && $pop3sAccess eq "public") { + return $localise ? $c->l($options->{publicSSL}) : "publicSSL"; + } + return $localise ? $c->l($options->{private}) : "private"; +} ## end sub get_current_pop3_access + +sub get_current_imap_access { + my ($c, $localise) = @_; + my $cdb = esmith::ConfigDB::UTF8->open() || die(\"Couldn"t open config db"); + my $imapStatus = $cdb->get_prop("imap", "status") || "enabled"; + my $imapAccess = $cdb->get_prop("imap", "access") || "private"; + my $imapsStatus = $cdb->get_prop("imaps", "status") || "enabled"; + my $imapsAccess = $cdb->get_prop("imaps", "access") || "private"; + my $options = get_imap_options(); + + if (($imapStatus ne "enabled" || $imapAccess eq "localhost") && $imapsStatus ne "enabled") { + return $localise ? $c->l($options->{disabled}) : "disabled"; + } + + if ($imapStatus eq "enabled" && $imapAccess eq "public") { + return $localise ? $c->l($options->{public}) : "public"; + } elsif ($imapsStatus eq "enabled" && $imapsAccess eq "public") { + return $localise ? $c->l($options->{publicSSL}) : "publicSSL"; + } + return $localise ? $c->l($options->{private}) : "private"; +} ## end sub get_current_imap_access + +sub get_current_smtp_ssl_auth { + my ($c, $localise, $soru, $debug) = @_; + my $cdb = esmith::ConfigDB::UTF8->open() || die("Couldn"t open config db\"); + die \"Error: \$soru must be either "s" or "u":$soru.\n\" unless $soru eq "s" || $soru eq "u"; + $cdb = esmith::ConfigDB::UTF8->open || die \"Couldn"t open config db"; + + # Initialize variables with default values + my $smtpStatus = "none"; + my $smtpAccess = "none"; + my $smtpAuth = "disabled"; # assuming "disabled" as a default + + # Fetch SMTP settings based on the value of `$soru` + if ($soru eq "u") { + $smtpStatus = $cdb->get_prop("uqpsmtpd", "status") || "enabled"; # Fetch from uqpsmtpd + $smtpAccess = $cdb->get_prop("uqpsmtpd", "access") || "public"; + $smtpAuth = "enabled"; # Assuming authentication is enabled in this context + } else { + $smtpStatus = $cdb->get_prop("sqpsmtpd", "status") || "enabled"; # Fetch from sqpsmtpd + $smtpAccess = $cdb->get_prop("sqpsmtpd", "access") || "public"; + $smtpAuth = "enabled"; # Assuming authentication is enabled in this context + } + + # Retrieve SMTP SSL authentication options + my $options = $c->get_smtp_ssl_auth_options(); + + if ($soru eq "u" && $debug) { + $c->stash("smtp" => + [ $smtpStatus, $smtpAccess, $smtpAuth, $soru, $options->{$smtpAccess}, $c->l($options->{$smtpAccess}) ] + ); + + # die "Stop $soru in get_current_smtp_ssl_auth"; + } ## end if ($soru eq "u" && $debug) + + # Return appropriate message based on SMTP settings + if ($smtpStatus eq "enabled" && $smtpAuth eq "enabled") { + return $localise ? $c->l($options->{$smtpAccess}) : $smtpAccess; + } + return $localise ? $c->l($options->{disabled}) : "disabled"; +} ## end sub get_current_smtp_ssl_auth + +sub get_current_smtp_auth { + my ($c, $localise) = @_; + my $cdb = esmith::ConfigDB::UTF8->open() || die("Couldn"t open config db\"); + my $smtpStatus = $cdb->get_prop("qpsmtpd", "status") || "enabled"; + my $smtpAuth = $cdb->get_prop("qpsmtpd", "Authentication") || "enabled"; + my $options = get_smtp_auth_options(); + + if ($smtpStatus eq "enabled" && $smtpAuth eq "disabled") { + return $localise ? $c->l($options->{public}) : "public"; + } elsif ($smtpStatus eq "enabled" && $smtpAuth eq "enabled") { + return $localise ? $c->l($options->{publicSSL}) : "publicSSL"; + } + return $localise ? $c->l($options->{disabled}) : "disabled"; +} ## end sub get_current_smtp_auth + +sub get_current_webmail_status { + my ($c, $localise) = @_; + my $cdb = esmith::ConfigDB::UTF8->open() || die(\"Couldn"t open config db"); + + # determine status of webmail + my $WebmailStatus = "disabled"; + my $RoundcubeStatus = $cdb->get_prop("roundcube", "status") || "disabled"; + my $MysqlStatus = $cdb->get_prop("mariadb", "status") || "disabled"; + my $PHPStatus = $cdb->get_prop("php81-php-fpm", "status") || "disabled"; + my $Networkaccess = $cdb->get_prop("roundcube", "access") || "disabled"; + + # all 3 components must be on for webmail to be working + if ( ($RoundcubeStatus eq "enabled") + && ($MysqlStatus eq "enabled") + && ($PHPStatus eq "enabled") + && ($Networkaccess eq "public")) + { + $WebmailStatus = "enabledSSL"; + } elsif (($RoundcubeStatus eq "enabled") + && ($MysqlStatus eq "enabled") + && ($PHPStatus eq "enabled") + && ($Networkaccess eq "private")) + { + $WebmailStatus = "localnetworkSSL"; + } ## end elsif (($RoundcubeStatus ...)) + my $options = get_webmail_options(); + return $localise + ? $c->l($options->{$WebmailStatus}) + : $WebmailStatus; +} ## end sub get_current_webmail_status + +sub get_pop_opt { + my $c = shift; + return [ + [ $c->l("DISABLED") => "disabled" ], + [ $c->l("NETWORKS_ALLOW_LOCAL") => "private" ], + [ $c->l("mai_SECURE_POP3") => "publicSSL" ], + [ $c->l("mai_INSECURE_POP3") => "public" ] + ]; +} ## end sub get_pop_opt + +sub get_pop_options { + my $c = @_; + my %options = ( + disabled => "DISABLED", + private => "NETWORKS_ALLOW_LOCAL", + publicSSL => "mai_SECURE_POP3" + ); + my $cdb = esmith::ConfigDB::UTF8->open() || die("Couldn"t open config db\"); + my $access = $cdb->get_prop("pop3", "access") || "private"; + $options{public} = "mai_INSECURE_POP3" if ($access eq "public"); + \%options; +} ## end sub get_pop_options + +sub get_imap_opt { + my $c = shift; + return [ + [ $c->l("DISABLED") => "disabled" ], + [ $c->l("NETWORKS_ALLOW_LOCAL") => "private" ], + [ $c->l("mai_SECURE_IMAP") => "publicSSL" ], + [ $c->l("mai_INSECURE_IMAP") => "public" ] + ]; +} ## end sub get_imap_opt + +sub get_imap_options { + my $c = shift; + my $cdb = esmith::ConfigDB::UTF8->open() || die(\"Couldn"t open config db"); + my %options = ( + disabled => "DISABLED", + private => "NETWORKS_ALLOW_LOCAL", + publicSSL => "mai_SECURE_IMAP" + ); + my $access = $cdb->get_prop("imap", "access") || "private"; + $options{public} = "mai_INSECURE_IMAP" if ($access eq "public"); + \%options; +} ## end sub get_imap_options + +sub get_smtp_auth_opt { + my $c = shift; + return [ + [ $c->l("mai_SECURE_SMTP") => "publicSSL" ], + [ $c->l("Only allow insecure access") => "public" ], + [ $c->l("DISABLED") => "disabled" ] + ]; +} ## end sub get_smtp_auth_opt + +sub get_smtp_auth_options { + my $c = shift; + my %options = (publicSSL => "mai_SECURE_SMTP", public => "Only allow insecure access", disabled => "DISABLED"); + return \%options; +} ## end sub get_smtp_auth_options + +sub get_smtp_ssl_auth_options { + my $c = shift; + my %options = (public => "Allow public access", local => "Allow local access only", disabled => "DISABLED"); + return \%options; +} ## end sub get_smtp_ssl_auth_options + +sub get_smtp_ssl_auth_opt { + my $c = shift; + return [ + [ $c->l("Allow public access") => "public" ], + [ $c->l("Allow local access only") => "local" ], + [ $c->l("DISABLED") => "disabled" ] + ]; +} ## end sub get_smtp_ssl_auth_opt + +sub get_key_by_value { + my ($hash_ref, $target_value) = @_; + + # Iterate over the hash + while (my ($key, $value) = each %$hash_ref) { + return $key if $value eq $target_value; + } + return undef; # Return undef if no match is found +} ## end sub get_key_by_value + +sub get_value_by_key { + my ($hash_ref, $key) = @_; + return $hash_ref->{$key}; # Return the value associated with the key +} + +sub get_webmail_opt { + my $c = shift; + return [ + [ $c->l("DISABLED") => "disabled" ], + [ $c->l("mai_ENABLED_SECURE_ONLY") => "enabledSSL" ], + [ $c->l("mai_ONLY_LOCAL_NETWORK_SSL") => "localnetworkSSL" ] + ]; +} ## end sub get_webmail_opt + +sub get_webmail_options { + my $c = shift; + my %options = ( + disabled => "DISABLED", + enabledSSL => "mai_ENABLED_SECURE_ONLY", + localnetworkSSL => "mai_ONLY_LOCAL_NETWORK_SSL" + ); + return \%options; +} ## end sub get_webmail_options + +sub get_retrieval_opt { + my $c = shift; + my $cdb = esmith::ConfigDB::UTF8->open() || die("Couldn"t open config db\"); + return $cdb->get(\"SystemMode\")->value eq \"servergateway-private\" + ? [ $c->l("mai_MULTIDROP") => "multidrop" ] + : [ + [ $c->l("mai_STANDARD") => "standard" ], + [ $c->l("mai_ETRN") => "etrn" ], + [ $c->l("mai_MULTIDROP") => "multidrop" ] + ]; +} ## end sub get_retrieval_opt + +sub get_emailunknownuser_options { + my $c = shift; + my $accounts = esmith::AccountsDB::UTF8->open_ro(); + my %existingAccounts = ( + "admin" => $c->l(\"mai_FORWARD_TO_ADMIN\"), + "returntosender" => $c->l(\"Reject\") + ); + + foreach my $account ($accounts->get_all) { + next if $account->key eq "everyone"; + + if ($account->prop("type") =~ /(user|group|pseudonym)/) { + $existingAccounts{ $account->key } = $c->l(\"mai_FORWARD_TO\") . \" \" . $account->key; + } + } ## end foreach my $account ($accounts...) + return (\%existingAccounts); +} ## end sub get_emailunknownuser_options + +sub get_emailunknownuser_opt { + my $c = shift; + my $accounts = esmith::AccountsDB::UTF8->open_ro(); + my @existingAccounts + = ([ $c->l(\"mai_FORWARD_TO_ADMIN\") => "admin" ], [ $c->l(\"Reject\") => "returntosender" ]); + + foreach my $account ($accounts->get_all) { + next if $account->key eq "everyone"; + + if ($account->prop("type") =~ /(user|group|pseudonym)/) { + push @existingAccounts, [ $c->l(\"mai_FORWARD_TO\") . \" \" . $account->key => $account->key ]; + } + } ## end foreach my $account ($accounts...) + return (\@existingAccounts); +} ## end sub get_emailunknownuser_opt + +sub get_patterns_opt { + my $c = shift; + my $pattern_db = esmith::ConfigDB::UTF8->open(\"mailpatterns\"); + my @options; + + foreach my $pattern ($pattern_db->get_all_by_prop(type => \"pattern\")) { + my %props = $pattern->props; + push @options, [ $props{"Description"} => $pattern->key ]; + } + return \@options; +} ## end sub get_patterns_opt + +sub get_patterns_current_opt { + my $c = shift; + my @selected; + my $pattern_db = esmith::ConfigDB::UTF8->open(\"mailpatterns\"); + + + foreach my $pattern ($pattern_db->get_all_by_prop(type => \"pattern\")) { + my %props = $pattern->props; + push @selected, $pattern->key if ($props{"Status"} eq "enabled"); + } + return \@selected; +} ## end sub get_patterns_current_opt + +sub get_spam_level_options { + return [ 0 .. 20 ]; +} + +sub get_spam_sensitivity_opt { + my $c = shift; + return [ + [ $c->l("mai_VERYLOW") => "verylow" ], + [ $c->l("Low") => "low" ], + [ $c->l("Medium") => "medium" ], + [ $c->l("High") => "high" ], + [ $c->l("mai_VERYHIGH") => "veryhigh" ], + [ $c->l("Custom") => "custom" ] + ]; +} ## end sub get_spam_sensitivity_opt + +sub fetchmail_freq { + my $c = shift; + return [ + [ $c->l("mai_NEVER") => "never" ], + [ $c->l("mai_EVERY5MIN") => "every5min" ], + [ $c->l("mai_EVERY15MIN") => "every15min" ], + [ $c->l("mai_EVERY30MIN") => "every30min" ], + [ $c->l("mai_EVERYHOUR") => "everyhour" ], + [ $c->l("mai_EVERY2HRS") => "every2hrs" ] + ]; +} ## end sub fetchmail_freq + +sub display_multidrop { + my $status = $cdb->get_prop("fetchmail", "status") || "disabled"; + + # XXX FIXME - WIP + # Only display ETRN/multidrop settings if relevant + # To do this, we need an \"Show ETRN/multidrop settings\" button + # in standard mode. + # return ($status eq "enabled"); + return 1; +} ## end sub display_multidrop + +sub change_settings_reception { + my $c = shift; + $cdb = esmith::ConfigDB::UTF8->open || die \"Couldn"t open config db"; + my $FetchmailMethod = ($c->param("FetchmailMethod") || "standard"); + my $FetchmailFreqOffice = ($c->param("FreqOffice") || "every15min"); + my $FetchmailFreqOutside = ($c->param("FreqOutside") || "everyhour"); + my $FetchmailFreqWeekend = ($c->param("FreqWeekend") || "everyhour"); + my $SpecifyHeader = ($c->param("SpecifyHeader") || "off"); + my $fetchmail = $cdb->get("fetchmail") || $cdb->new_record("fetchmail", { type => "service", status => "disabled" }); + + if ($FetchmailMethod eq "standard") { + $fetchmail->set_prop("status", "disabled"); + $fetchmail->set_prop("Method", $FetchmailMethod); + } else { + $fetchmail->set_prop("status", "enabled"); + $fetchmail->set_prop("Method", $FetchmailMethod); + $fetchmail->set_prop("SecondaryMailServer", $c->param("SecondaryMailServer")) + unless ($c->param("SecondaryMailServer") eq ""); + $fetchmail->set_prop("FreqOffice", $FetchmailFreqOffice); + $fetchmail->set_prop("FreqOutside", $FetchmailFreqOutside); + $fetchmail->set_prop("FreqWeekend", $FetchmailFreqWeekend); + $fetchmail->set_prop("SecondaryMailAccount", $c->param("SecondaryMailAccount")) + unless ($c->param("SecondaryMailAccount") eq ""); + $fetchmail->set_prop("SecondaryMailPassword", $c->param("SecondaryMailPassword")) + unless ($c->param("SecondaryMailPassword") eq ""); + + if ($SpecifyHeader eq "on") { + $fetchmail->merge_props("SecondaryMailEnvelope" => $c->param("SecondaryMailEnvelope")); + } else { + $fetchmail->delete_prop("SecondaryMailEnvelope"); + } + } ## end else [ if ($FetchmailMethod eq...)] + + # Need code here for all 3 options - 25, 465 ad 587 + # Options for 25 are enabled and disabled + # for 465 and 587 are (access) public, local and (status) disabled + #my $smtpAuth = ($c->param("SMTPAuth") || "public"); + #if ($smtpAuth eq "public") { + #$cdb->set_prop("qpsmtpd", "Authentication", "enabled" ); + #$cdb->set_prop("sqpsmtpd", "Authentication", "enabled" ); + #} elsif ($smtpAuth eq "publicSSL") { + #$cdb->set_prop("qpsmtpd", "Authentication", "disabled" ); + #$cdb->set_prop("sqpsmtpd", "Authentication", "enabled" ); + #} else { + #$cdb->set_prop("qpsmtpd", "Authentication", "disabled" ); + #$cdb->set_prop("sqpsmtpd", "Authentication", "disabled" ); + #} + my @keys = qw(qpsmtpd uqpsmtpd sqpsmtpd); + + foreach my $key (@keys) { + my $param_name + = $key eq "qpsmtpd" ? "SMTPAuth" + : $key eq "uqpsmtpd" ? "uSMTPAuth" + : "sSMTPAuth"; # Defaults to "sSMTPAuth" for "sqpsmtpd" + my $SMTPAuth = $c->param($param_name); + + if ($SMTPAuth eq "disabled") { + $cdb->set_prop($key, "status", "disabled"); + $cdb->set_prop($key, "access", "disabled"); + } else { + $cdb->set_prop($key, "status", "enabled"); + + if ($key eq "qpsmtpd") { + my $auth_status = $SMTPAuth eq "publicSSL" ? "enabled" : "disabled"; + $cdb->set_prop($key, "Authentication", $auth_status); + $cdb->set_prop($key, "access", "public"); + } else { + $cdb->set_prop($key, "Authentication", "enabled"); + my $auth_key = ($key eq "uqpsmtpd") ? "uSMTPAuth" : "sSMTPAuth"; + my $access_value = $c->param($auth_key) eq "public" ? "public" : "local"; + $cdb->set_prop($key, "access", $access_value); + } ## end else [ if ($key eq "qpsmtpd")] + } ## end else [ if ($SMTPAuth eq "disabled")] + } ## end foreach my $key (@keys) + + unless (system("/sbin/e-smith/signal-event", "email-update") == 0) { + return $c->l("mai_ERROR_UPDATING_CONFIGURATION"); + } + return ""; +} ## end sub change_settings_reception + +sub change_settings_delivery { + my ($c) = shift; + $cdb = esmith::ConfigDB::UTF8->open || die "Couldn"t open config db\"; + my $EmailUnknownUser = ($c->param("EmailUnknownUser") || "returntosender"); + $cdb->set_value("SMTPSmartHost", $c->param("SMTPSmartHost")); + $cdb->set_value("DelegateMailServer", $c->param("DelegateMailServer")); + $cdb->set_value("EmailUnknownUser", $EmailUnknownUser); + my $proxy = $cdb->get("smtp-auth-proxy"); + my %props = $proxy->props; + + for (qw(Userid Passwd status)) { + $props{$_} = $c->param(\"SMTPAUTHPROXY_$_\"); + } + $proxy->merge_props(%props); + + unless (system(\"/sbin/e-smith/signal-event\", \"email-update\") == 0) { + return $c->l("mai_ERROR_UPDATING_CONFIGURATION"); + } + return ""; +} ## end sub change_settings_delivery + +sub change_settings_access { + my $c = shift; + $cdb = esmith::ConfigDB::UTF8->open || die \"Couldn"t open config db"; + my $pop3Access = ($c->param("POPAccess") || "private"); + + if ($pop3Access eq "disabled") { + $cdb->set_prop("pop3", "status", "disabled"); + $cdb->set_prop("pop3s", "status", "disabled"); + } else { + $cdb->set_prop("pop3", "status", "enabled"); + $cdb->set_prop("pop3s", "status", "enabled"); + } + + if ($pop3Access eq "public") { + $cdb->set_prop("pop3", "access", "public"); + $cdb->set_prop("pop3s", "access", "public"); + } elsif ($pop3Access eq "publicSSL") { + $cdb->set_prop("pop3", "access", "private"); + $cdb->set_prop("pop3s", "access", "public"); + } else { + $cdb->set_prop("pop3", "access", "private"); + $cdb->set_prop("pop3s", "access", "private"); + } + my $imapAccess = ($c->param("IMAPAccess") || "private"); + + if ($imapAccess eq "disabled") { + $cdb->set_prop("imap", "status", "enabled"); + $cdb->set_prop("imap", "access", "localhost"); + $cdb->set_prop("imaps", "status", "disabled"); + } elsif ($imapAccess eq "public") { + $cdb->set_prop("imap", "status", "enabled"); + $cdb->set_prop("imap", "access", "public"); + $cdb->set_prop("imaps", "status", "enabled"); + $cdb->set_prop("imaps", "access", "public"); + } elsif ($imapAccess eq "publicSSL") { + $cdb->set_prop("imap", "status", "enabled"); + $cdb->set_prop("imap", "access", "private"); + $cdb->set_prop("imaps", "status", "enabled"); + $cdb->set_prop("imaps", "access", "public"); + } else { + $cdb->set_prop("imap", "status", "enabled"); + $cdb->set_prop("imap", "access", "private"); + $cdb->set_prop("imaps", "status", "enabled"); + $cdb->set_prop("imaps", "access", "private"); + } ## end else [ if ($imapAccess eq "disabled")] + + #------------------------------------------------------------ + # Set webmail state in configuration database, and access + # type for SSL + # PHP and MySQL should always be on, and are enabled by default + # We don"t do anything with them here. + #------------------------------------------------------------ + my $webmail = ($c->param("WebMail") || "disabled"); + + if ($webmail eq \"enabledSSL\") { + $cdb->set_prop("php81-php-fpm", \"status\", \"enabled\"); + $cdb->set_prop("mariadb", \"status\", \"enabled\"); + $cdb->set_prop("roundcube", \"status\", "enabled"); + $cdb->set_prop("roundcube", \"access\", \"public\"); + } elsif ($webmail eq \"localnetworkSSL\") { + $cdb->set_prop("php81-php-fpm", \"status\", \"enabled\"); + $cdb->set_prop("mariadb", \"status\", \"enabled\"); + $cdb->set_prop("roundcube", \"status\", "enabled"); + $cdb->set_prop("roundcube", \"access\", \"private\"); + } else { + $cdb->set_prop("roundcube", \"status\", "disabled"); + } + + unless (system(\"/sbin/e-smith/signal-event\", \"email-update\") == 0) { + return $c->l("mai_ERROR_UPDATING_CONFIGURATION"); + } + return ""; +} ## end sub change_settings_access + +sub change_settings_filtering { + my $c = shift; + $cdb = esmith::ConfigDB::UTF8->open || die \"Couldn"t open config db"; + my $virus_status = ($c->param("VirusStatus") || "disabled"); + $cdb->set_prop("qpsmtpd", "VirusScan", $virus_status); + + for my $param ( + qw( + status + Sensitivity + TagLevel + RejectLevel + SortSpam + Subject + SubjectTag) + ) + { + $cdb->set_prop("spamassassin", $param, $c->param("Spam$param")); + } ## end for my $param (qw( status...)) + my $patterns_status = $c->adjust_patterns() ? "enabled" : "disabled"; + $cdb->set_prop("qpsmtpd", "PatternsScan", $patterns_status); + + unless (system("/sbin/e-smith/signal-event", "email-update") == 0) { + return $c->l("mai_ERROR_UPDATING_CONFIGURATION"); + } + return ""; +} ## end sub change_settings_filtering + +#sub blank_or_ip_number { +# my ($c, $value) = @_; +# return "OK" unless (defined $value); # undef is blank +# return "OK" if ($value =~ /^$/); # blank is blank +# return $c->call_fm_validation("ip_number",$value,""); # otherwise, validate the input +#} +sub nonblank_if_smtpauth { + my ($c, $value) = @_; + return "ok" unless ($c->param("SMTPAUTHPROXY_status") eq "enabled"); + return ($value =~ /\S+/) ? "ok" : $c->l("mai_VALIDATION_SMTPAUTH_NONBLANK"); +} + +sub get_secondary_mail_use_envelope { + $cdb = esmith::ConfigDB::UTF8->open || die "Couldn"t open config db\"; + my $use_envelope = $cdb->get_prop("fetchmail", "SecondaryMailEnvelope"); + if (defined $use_envelope) { + return ("on"); + } else { + return ("off"); + } +} ## end sub get_secondary_mail_use_envelope + +sub validate_smarthost { + my $c = shift; + my $smarthost = shift; + return ("ok") if ($smarthost =~ /^(\S+\.\S+)$/); + return ("ok") if ($smarthost eq ""); + return \"mai_INVALID_SMARTHOST\"; +} ## end sub validate_smarthost + + +sub validate_ip_or_blank { + my ($c,$ip) = @_; + + return "ok" if $ip eq ""; + + return "ok" if is_ipv4($ip) || is_ipv6($ip); + + return \"mai_INVALID_DELEGATE\"; +} + +# From earlier version - delete this once conversion is done. +#sub main { + #my $c = shift; + #$c->app->log->info($c->log_req); + #$pattern_db = esmith::ConfigDB::UTF8->open(\"mailpatterns\"); + #$cdb = esmith::ConfigDB::UTF8->open || die \"Couldn"t open config db"; + #my %mai_datas = (); + #my $title = $c->l("mai_FORM_TITLE"); + #$mai_datas{"trt"} = "LIST"; + #$mai_datas{fetchmailmethod} = $c->l($cdb->get_prop("fetchmail", "Method")); + #$c->stash(title => $title, notif => "", mai_datas => \%mai_datas); + #$c->render(template => "emailsettings"); +#} ## end sub main + +#sub do_display { + #my $c = shift; + #my $rt = $c->current_route; + #my $trt = ($c->param("trt") || "LIST"); + #my %mai_datas = (); + #my $title = $c->l("mai_FORM_TITLE"); + #my ($notif, $dest) = ""; + #$mai_datas{"trt"} = $trt; + #$cdb = esmith::ConfigDB::UTF8->open || die "Couldn"t open config db\"; + + #if ($trt eq "ACC") { + #$dest = "emailaccess"; + #$mai_datas{fetchmailmethod} = $cdb->get_prop("fetchmail", "Method"); + #} + + #if ($trt eq "FIL") { + #$dest = "emailfilter"; + #$mai_datas{"virusstatus"} = $c->get_virus_status(); + #$mai_datas{"spamstatus"} = $cdb->get_prop("spamassassin", "status"); + #$mai_datas{"spamsensitivity"} = $cdb->get_prop("spamassassin", "Sensitivity", "medium"); + #$mai_datas{"spamtaglevel"} = $cdb->get_prop("spamassassin", "TagLevel") || "0"; + #$mai_datas{"spamrejectlevel"} = $cdb->get_prop("spamassassin", "RejectLevel") || "0"; + #$mai_datas{spamsortspam} = $cdb->get_prop("spamassassin", "SortSpam"); + #$mai_datas{spamsubjecttag} = $cdb->get_prop("spamassassin", "SubjectTag"); + #$mai_datas{spamsubject} = $cdb->get_prop("spamassassin", "Subject"); + #} ## end if ($trt eq "FIL") + + #if ($trt eq "REC") { + #$dest = "emailreceive"; + #$mai_datas{fetchmailmethod} = $cdb->get_prop("fetchmail", "Method"); + #$mai_datas{freqoffice} = $cdb->get_prop("fetchmail", "FreqOffice"); + #$mai_datas{freqoutside} = $cdb->get_prop("fetchmail", "FreqOutside"); + #$mai_datas{freqweekend} = $cdb->get_prop("fetchmail", "FreqWeekend"); + #$mai_datas{secondarymailserver} = $cdb->get_prop("fetchmail", "SecondaryMailServer"); + #$mai_datas{secondarymailaccount} = $cdb->get_prop("fetchmail", "SecondaryMailAccount"); + #$mai_datas{secondarymailpassword} = $cdb->get_prop("fetchmail", "SecondaryMailPassword"); + #$mai_datas{specifyheader} = get_secondary_mail_use_envelope(); + #$mai_datas{secondarymailenvelope} = $cdb->get_prop("fetchmail", "SecondaryMailEnvelope"); + #} ## end if ($trt eq "REC") + + #if ($trt eq "DEL") { + #$dest = "emaildeliver"; + #$mai_datas{emailunknownuser} = $cdb->get_value("EmailUnknownUser") || ""returntosender"; + #$mai_datas{delegatemailserver} = $cdb->get_value("DelegateMailServer"); + #$mai_datas{smtpsmarthost} = $cdb->get_value("SMTPSmartHost"); + #$mai_datas{smtpauthproxystatus} = $cdb->get_prop("smtp-auth-proxy", "status") || "disabled"; + #$mai_datas{smtpauthproxyuserid} = $cdb->get_prop("smtp-auth-proxy", "Userid") || ""; + #$mai_datas{smtpauthproxypassword} = $cdb->get_prop("smtp-auth-proxy", "Passwd") || ""; + #} ## end if ($trt eq "DEL") + #$c->stash(title => $title, notif => $notif, mai_datas => \%mai_datas); + #return $c->render(template => $dest); +#} ## end sub do_display + +#sub do_update { + #my $c = shift; + #$c->app->log->info($c->log_req); + #my $rt = $c->current_route; + #my $trt = $c->param("trt"); + #my %mai_datas = (); + #$mai_datas{trt} = $trt; + #$cdb = esmith::ConfigDB::UTF8->open || die \"Couldn"t open config db"; + #my $title = $c->l("mai_FORM_TITLE"); + #my ($dest, $res, $result) = ""; + #$dest = "/emailsettings&trt=$trt"; + + #if ($trt eq "ACC") { + ##$dest = "emailaccess"; + + ## $mai_datas{xxx} = $c->param("XXX"); + ## controls + ## $res = xxxxxxx( $c ); + ## $result .= $res unless $res eq "OK"; + #if (!$result) { + #$res = $c->change_settings_access(); + #$result .= $res unless $res eq "OK"; + + #if (!$result) { + #$result = $c->l("mai_SUCCESS"); + #} + #} ## end if (!$result) + #} ## end if ($trt eq "ACC") + + #if ($trt eq "FIL") { + ##$dest = "emailfilter"; + + ## $mai_datas{xxx} = $c->param("XXX"); + ## controls + ## $res = zzzzzz( $c ); + ## $result .= $res unless $res eq "OK"; + #if (!$result) { + #$res = $c->change_settings_filtering(); + #$result .= $res unless $res eq "OK"; + + #if (!$result) { + #$result = $c->l("mai_SUCCESS"); + #} + #} ## end if (!$result) + #} ## end if ($trt eq "FIL") + + #if ($trt eq "REC") { + ##$dest = "emailreceive"; + + ## $mai_datas{xxx} = $c->param("XXX"); + ## controls + ## $res = yyyyyyyyy( $c ); + ## $result .= $res unless $res eq "OK"; + #if (!$result) { + #$res = $c->change_settings_reception(); + #$result .= $res unless $res eq "OK"; + + #if (!$result) { + #$result = $c->l("mai_SUCCESS"); + #} + #} ## end if (!$result) + #} ## end if ($trt eq "REC") + + #if ($trt eq "DEL") { + ##$dest = "emaildeliver"; + + #my ($result,$res) = ""; + + #CHECKS: { + #$res = $c->validate_ip_or_blank($c->param("DelegateMailServer")); + #if ($res ne "OK") { + #$result = $c->l($res); + #last CHECKS; + #} + + #$res = $c->validate_smarthost($c->param("SMTPSmartHost")); + #if ($res ne "OK") { + #$result = $c->l($res); + #last CHECKS; + #} + + #$res = $c->nonblank_if_smtpauth($c->param("SMTPSmartHost")); + #if ($res ne "OK") { + #$result = $c->l($res); + #last CHECKS; + #} + + #$res = $c->nonblank_if_smtpauth($c->param("SMTPAUTHPROXY_Userid")); + #if ($res ne "OK") { + #$result = $c->l($res); + #last CHECKS; + #} + + #$res = $c->nonblank_if_smtpauth($c->param("SMTPAUTHPROXY_Passwd")); + #if ($res ne "OK") { + #$result = $c->l($res); + #last CHECKS; + #} + + #$res = $c->change_settings_delivery(); + #if ($res ne "OK") { + #$result = $res; + #last CHECKS; + #} + + #$result = $c->l("mai_SUCCESS"); + #} + ## $result now contains the first error or the success message + #} ## end if ($trt eq "DEL") + + ## common part + #if ($res ne "OK") { + #$c->stash(error => $result); + #$c->stash(title => $title, mai_datas => \%mai_datas); + #return $c->redirect_to($dest); + #} else { + #my $message = "emailsettings updates $trt DONE"; + #$c->app->log->info($message); + #$c->flash(success => $result); + #} + #$c->redirect_to("/emailsettings"); +#} ## end sub do_update + + +1; \ No newline at end of file diff --git a/output/Emailsettings/default/_mai_REC.html.new.ep b/output/Emailsettings/default/_mai_REC.html.new.ep new file mode 100644 index 0000000..5a438be --- /dev/null +++ b/output/Emailsettings/default/_mai_REC.html.new.ep @@ -0,0 +1,159 @@ +%# +%# Generated by SM2Gen version:0.9(20Jan2025) Chameleon version:4.5.4 On Python:3.12.3 at 2025-06-29 08:53:20 +%# +
+%# + % if (config->{debug} == 1) { +
+			%= dumper $mai_data
+		
+ % } + % my $btn = l("SAVE"); + % $c->param(Selected => undef); #This may need deleting for a params panel - only needed for a table + +

<%= $c->l("mai_DESC_STATE_RECEPTION_BUTTON") %>


+ %= form_for "emailsettingsu" => (method => "POST") => begin + % param "trt" => $mai_data->{trt} unless param "trt"; + %= hidden_field "trt" => $mai_data->{trt} + %# Inputs etc in here. + %=l "mai_DESC_MODE" + +

+ %=l "mai_LABEL_MODE" + + % param "FetchmailMethod" => $mai_data->{fetchmailmethod} unless param "FetchmailMethod"; + + %= select_field "FetchmailMethod" => $c->get_retrieval_opt(), class => "input" +

+ + %#=l "mai_DESC_SMTP_AUTH_CONTROL" +
+ %= l "mai_SMTP_port_(25)" +
+ %= l "mai_SMTPS_port_(465)" +
+ %= l "mai_SMTP_Submission" +
+ + % my $smtp_mesg=l("mai_SMTP_port_authenticate"); +

+ %= sprintf($smtp_mesg,$c->get_db_prop("qpsmtpd","TCPPort",25)); + + % param "SMTPAuth" => $c->get_current_smtp_auth( FALSE ) unless param "SMTPAuth"; + + %= select_field "SMTPAuth" => $c->get_smtp_auth_opt(), class => "input" +

+ + % my $smtp_mesg=l("SMTPS SSL/TLS auth: port %u status:"); +

+ %= sprintf($smtp_mesg,$c->get_db_prop("sqpsmtpd","TCPPort",465)); + + % param "sSMTPAuth" => $c->get_current_smtp_ssl_auth(FALSE,"s", TRUE) unless param "sSMTPAuth"; + + %= select_field "sSMTPAuth" => $c->get_smtp_ssl_auth_opt(), class => "input" +

+ + %my $smtp_mesg=l("Submission port %u status:"); +

+ %= sprintf($smtp_mesg,$c->get_db_prop("uqpsmtpd","TCPPort",587)); + + % param "uSMTPAuth" => $c->get_current_smtp_ssl_auth(FALSE,"u", TRUE) unless param "uSMTPAuth"; + + %= select_field "uSMTPAuth" => $c->get_smtp_ssl_auth_opt(), class => "input" +

+ + +

+ %=l "mai_TITLE_SECONDARY" +


+ + %=l "mai_DESC_SECONDARY" + +

+ %=l "mai_LABEL_SECONDARY" + + % param "SecondaryMailServer" => $mai_data->{secondarymailserver} unless param "SecondaryMailServer"; + %= text_field "SecondaryMailServer", class => "input" +

+ + %=l "mai_DESC_FETCH_PERIOD" + +

+ %=l "mai_LABEL_FETCH_PERIOD" + + % param "FreqOffice" => $mai_data->{freqoffice} unless param "FreqOffice"; + %= select_field "FreqOffice" => $c->fetchmail_freq(), class => "input" +

+ +

+ %=l "mai_LABEL_FETCH_PERIOD_NIGHTS" + + % param "FreqOutside" => $mai_data->{freqoutside} unless param "FreqOutside"; + %= select_field "FreqOutside" => $c->fetchmail_freq(), class => "input" +

+ +

+ %=l "mai_LABEL_FETCH_PERIOD_WEEKENDS" + + % param "FreqWeekend" => $mai_data->{freqweekend} unless param "FreqWeekend"; + %= select_field "FreqWeekend" => $c->fetchmail_freq(), class => "input" +

+ +

+ %=l "mai_LABEL_POP_ACCOUNT" + + % param "SecondaryMailAccount" => $mai_data->{secondarymailaccount} unless param "SecondaryMailAccount"; + %= text_field "SecondaryMailAccount", class => "input" +

+ +

+ %=l "mai_LABEL_POP_PASS" + + % param "SecondaryMailPassword" => $mai_data->{secondarymailpassword} unless param "SecondaryMailPassword"; + %= password_field "SecondaryMailPassword", class => "input" +

+ +

+ %=l "mai_LABEL_SORT_METHOD" + + % param "SpecifyHeader" => $mai_data->{specifyheader} unless param "SpecifyHeader"; + %= select_field "SpecifyHeader" => [[(l "Default") => "off"], [(l "mai_SPECIFY_BELOW") => "on"]], class => "input" +

+ +

+ %=l "mai_LABEL_SORT_HEADER" + + % param "SecondaryMailEnvelope" => $mai_data->{secondarymailenvelope} unless param "SecondaryMailEnvelope"; + %= text_field "SecondaryMailEnvelope", class => "input" +

+ + %# .... + %# Probably finally by a submit. + %= submit_button $btn, class => "action" + %end +
\ No newline at end of file diff --git a/output/Emailsettings/emailsettings_en.lex.diff b/output/Emailsettings/emailsettings_en.lex.diff new file mode 100644 index 0000000..e278a0a --- /dev/null +++ b/output/Emailsettings/emailsettings_en.lex.diff @@ -0,0 +1,17 @@ +'mai_ALLOW_PRIVATE' => 'Allow private', +'mai_AUTO' => 'Automatic', +'mai_DESC_POP_ACCOUNT' => 'For multi-drop e-mail, specify the POP user account and password. +(If using standard or ETRN e-mail, these fields can be blank.) +Also, for multi-drop, you can either use the default mail sorting +method, or you can specify a particular message header to use for +mail sorting.', +'mai_DESC_STATE_ACCESS' => 'E-mail access', +'mai_DESC_STATE_DELIVERY' => 'E-mail delivery', +'mai_DESC_STATE_RECEPTION' => 'E-mail reception', +'mai_ENABLED_BOTH' => 'Allow both HTTP and HTTPS', +'mai_INSECURE_SMTP' => 'Allow both SMTP and SSMTP', +'mai_LABEL_FETCH_PROTO' => 'Protocol (for multi-drop)', +'mai_LABEL_FETCH_SECURE' => 'Tunnel over SSL (for multi-drop)', +'mai_LABEL_SMTP_AUTH_CONTROL' => 'SMTP authentication', +'mai_UNACCEPTABLE_CHARS' => 'This field requires a valid e-mail address, which must include +the @ symbol and a domain name.', diff --git a/output/Emailsettings/emailsettings_en.lex.new1 b/output/Emailsettings/emailsettings_en.lex.new1 new file mode 100644 index 0000000..d1f7ffb --- /dev/null +++ b/output/Emailsettings/emailsettings_en.lex.new1 @@ -0,0 +1,159 @@ +# +# Lex file for Emailsettings generated on 2025-07-17 09:52:31 +# +'mai_ACC_panel_action_was_successful' => 'Email access settings saved sucessfully', +'mai_ALLOW_PRIVATE' => 'Allow private', +'mai_AUTO' => 'Automatic', +'mai_DEL_panel_action_was_successful' => 'Email delivery settings saved sucessfully', +'mai_DESC_BLOCK_EXECUTABLE_CONTENT' => 'You can block executable content in e-mail attachments +by highlighting the executable attachment types you wish to +block. E-mail containing these attachment types will +be automatically returned to the sender.', +'mai_DESC_DELEGATE' => 'Your server includes a complete, full-featured e-mail server. However, +if for some reason you wish to delegate e-mail processing to +another system, specify the IP address of the delegate system +here. For normal operation, leave this field blank.', +'mai_DESC_FETCH_PERIOD' => 'For ETRN or multi-drop, you can control how frequently this server +contacts your secondary e-mail server to fetch e-mail. More +frequent connections mean that you receive your e-mail more +quickly, but also cause Internet requests to be sent more often, +possibly increasing your phone and Internet charges.', +'mai_DESC_IMAP_ACCESS_CONTROL' => 'You can control IMAP server access. The setting "Allow access +only from local networks" allows IMAP access only from your +local network(s). The IMAPS setting can be used to provide +encrypted external access to your IMAP server. We recommend +leaving this setting "Allow access only from local networks" +unless you have a specific reason to do otherwise.', +'mai_DESC_MODE' => 'The e-mail retrieval mode can be set to +standard (for dedicated Internet connections), ETRN (recommended +for dialup connections), or multi-drop (for dialup connections if +ETRN is not supported by your Internet provider). Note that +multi-drop mode is the only option available when the server is +configured in private server and gateway mode.', +'mai_DESC_POP_ACCESS_CONTROL' => 'You can control POP3 server access. The setting "Allow access +only from local networks" allows POP3 access only from your +local network(s). The POP3S setting can be used to provide +encrypted external access to your POP3 server. We recommend +leaving this setting "Allow access only from local networks" +unless you have a specific reason to do otherwise.', +'mai_DESC_POP_ACCOUNT' => 'For multi-drop e-mail, specify the POP user account and password. +(If using standard or ETRN e-mail, these fields can be blank.) +Also, for multi-drop, you can either use the default mail sorting +method, or you can specify a particular message header to use for +mail sorting.', +'mai_DESC_SECONDARY' => 'For ETRN or multi-drop, specify the hostname or IP address of your +secondary mail server. (If using the standard e-mail setup, this +field can be left blank.)', +'mai_DESC_SMARTHOST' => 'The server can deliver outgoing messages directly to their +destination (recommended in most cases) or can deliver them via +your Internet provider"s SMTP server (recommended if you have an +unreliable Internet connection or are using a residential Internet +service). If using your Internet provider"s SMTP server, specify +its hostname or IP address below. Otherwise leave this field blank.', +'mai_DESC_SMTP_AUTH_CONTROL' => 'You can provide authenticated access to your SMTP server, or +set it to Disabled. +The SSMTP setting requires all users to use SSL/TLS +authentication. The SMTP and SSMTP option additionally allows +STARTTLS to be used to ensure secure authentication.', +'mai_DESC_SPAM_SCAN' => 'You can scan e-mail for spam. If Spam filtering is +enabled, an X-Spam-Status: header is added to each +message, which can be used for filtering spam. +You can adjust the sensitivity of the Spam detection +process from the default of medium. For fine-grained +control, you can set the Spam sensitivity to Custom +and then choose a custom tagging level, and +optionally a level at which to reject the message.', +'mai_DESC_SPAM_SUBJECT' => 'You can enable to add a tag to the subject of each +message that is classified as SPAM. +The value for this tag can be defined below.', +'mai_DESC_STATE_ACCESS' => 'E-mail access', +'mai_DESC_STATE_ACCESS_BUTTON' => 'Change e-mail access settings', +'mai_DESC_STATE_DELIVERY' => 'E-mail delivery', +'mai_DESC_STATE_DELIVERY_BUTTON' => 'Change e-mail delivery settings', +'mai_DESC_STATE_FILTERING_BUTTON' => 'Change e-mail filtering settings', +'mai_DESC_STATE_RECEPTION' => 'E-mail reception', +'mai_DESC_STATE_RECEPTION_BUTTON' => 'Change e-mail reception settings', +'mai_DESC_UNKNOWN' => 'Selecting Reject (recommended setting) will configure the server to only +accept mail for valid email addresses (for example users, groups, pseudonyms). +Mail for other addresses will be rejected.', +'mai_DESC_VIRUS_SCAN' => 'You can scan incoming and outgoing e-mail for viruses. If scanning is enabled and a virus is detected, the e-mail will be rejected and returned to the +sender.', +'mai_DESC_WEBMAIL' => 'You can enable or disable webmail on this system. Webmail allows +users to access their mail through a regular web browser by +pointing the browser to https://[_1]/webmail,and + logging in to their account.', +'mai_E-Mail' => 'E-mail', +'mai_ENABLED_BOTH' => 'Allow both HTTP and HTTPS', +'mai_ENABLED_SECURE_ONLY' => 'Allow HTTPS (secure)', +'mai_ETRN' => 'ETRN (SMTP with client request)', +'mai_EVERY15MIN' => 'Every 15 minutes', +'mai_EVERY2HRS' => 'Every 2 hours', +'mai_EVERY30MIN' => 'Every 30 minutes', +'mai_EVERY5MIN' => 'Every 5 minutes', +'mai_EVERYHOUR' => 'Every hour', +'mai_FIL_panel_action_was_successful' => 'Email filtering settings saved sucessfully', +'mai_FORM_TITLE' => 'E-mail settings', +'mai_FORWARD_TO' => 'Send to', +'mai_FORWARD_TO_ADMIN' => 'Send to administrator', +'mai_INSECURE_IMAP' => 'Allow both IMAP and IMAPS', +'mai_INSECURE_POP3' => 'Allow both POP3 and POP3S', +'mai_INSECURE_SMTP' => 'Allow both SMTP and SSMTP', +'mai_INVALID_DELEGATE' => 'The delegate host name you entered is not a valid IP Address and is not blank', +'mai_INVALID_SMARTHOST' => 'The smarthost name you entered is not a valid internet domain name and is not blank', +'mai_LABEL_BLOCK_EXECUTABLE_CONTENT' => 'Executable content blocking', +'mai_LABEL_CONTENT_TO_BLOCK' => 'Content to block', +'mai_LABEL_DELEGATE' => 'IP Address of internal mail server', +'mai_LABEL_FETCH_PERIOD' => 'During office hours (8:00 AM to 6:00 PM) on weekdays', +'mai_LABEL_FETCH_PERIOD_NIGHTS' => 'Outside office hours (6:00 PM to 8:00 AM) on weekdays', +'mai_LABEL_FETCH_PERIOD_WEEKENDS' => 'During the weekend', +'mai_LABEL_FETCH_PROTO' => 'Protocol (for multi-drop)', +'mai_LABEL_FETCH_SECURE' => 'Tunnel over SSL (for multi-drop)', +'mai_LABEL_IMAP_ACCESS_CONTROL' => 'IMAP server access', +'mai_LABEL_MODE' => 'E-mail retrieval mode', +'mai_LABEL_POP_ACCESS_CONTROL' => 'POP3 server access', +'mai_LABEL_POP_ACCOUNT' => 'POP user account (for multi-drop)', +'mai_LABEL_POP_PASS' => 'POP user password (for multi-drop)', +'mai_LABEL_SECONDARY' => 'Secondary mail server', +'mai_LABEL_SMARTHOST' => 'Address of Internet provider"s mail server', +'mai_LABEL_SMARTHOST_SMTPAUTH_PASSWD' => 'Mail server password', +'mai_LABEL_SMARTHOST_SMTPAUTH_STATUS' => 'SMTP Authentication for Internet provider', +'mai_LABEL_SMARTHOST_SMTPAUTH_USERID' => 'Mail server user id', +'mai_LABEL_SMTP_AUTH_CONTROL' => 'SMTP authentication', +'mai_LABEL_SORT_HEADER' => 'Select sort header (for multi-drop)', +'mai_LABEL_SORT_METHOD' => 'Select sort method (for multi-drop)', +'mai_LABEL_SORTSPAM' => 'Sort spam into junkmail folder', +'mai_LABEL_SPAM_REJECTLEVEL' => 'Custom spam rejection level', +'mai_LABEL_SPAM_SCAN' => 'Spam filtering', +'mai_LABEL_SPAM_SENSITIVITY' => 'Spam sensitivity', +'mai_LABEL_SPAM_SUBJECT' => 'SPAM subject prefix', +'mai_LABEL_SPAM_SUBJECTTAG' => 'Modify subject of spam messages', +'mai_LABEL_SPAM_TAGLEVEL' => 'Custom spam tagging level', +'mai_LABEL_UNKNOWN' => 'E-mail to unknown users', +'mai_LABEL_VIRUS_SCAN' => 'Virus scanning', +'mai_LABEL_WEBMAIL' => 'Webmail access', +'mai_MULTIDROP' => 'multi-drop', +'mai_NEVER' => 'not at all', +'mai_ONLY_LOCAL_NETWORK_SSL' => 'Allow HTTPS (secure) from local networks', +'mai_REC_panel_action_was_successful' => 'Email receive settings saved sucessfully', +'mai_SECURE_IMAP' => 'Allow private and public (secure IMAPS)', +'mai_SECURE_POP3' => 'Allow private and public (secure POP3S)', +'mai_SECURE_SMTP' => 'Allow SSMTP (secure)', +'mai_SMTP_port_(25)' => 'Smtp port (25) main purpose is to receive emails from another server, starttls is always offered, but auth if offered is only if starttls is also used by client.', +'mai_SMTP_port_authenticate' => 'Smtp port %u allow client to authenticate:', +'mai_SMTP_Submission' => 'Smtp submission port (587) will require starttls, then authenticate to send.', +'mai_SMTPS_port_(465)' => 'Smtps port (465) will require implicit ssl/tls then authenticate to send.', +'mai_SMTPS_SSL/TLS' => 'Smtps ssl/tls auth: port %u status:', +'mai_SPECIFY_BELOW' => 'Specify below', +'mai_STANDARD' => 'Standard (SMTP)', +'mai_Submission_port' => 'Submission port %u status:', +'mai_SUCCESS' => 'The new e-mail settings have been saved.', +'mai_TITLE_DELEGATE' => 'Delegate mail servers', +'mai_TITLE_SECONDARY' => 'ETRN or multi-drop settings', +'mai_TITLE_SMARTHOST' => 'SMTP server', +'mai_TITLE_UNKNOWN' => 'Unknown Users', +'mai_UNACCEPTABLE_CHARS' => 'This field requires a valid e-mail address, which must include +the @ symbol and a domain name.', +'mai_VALIDATION_SMTPAUTH_NONBLANK' => 'The user id and password fields cannot be left blank if SMTP Authentication is +enabled.', +'mai_VERYHIGH' => 'Very high', +'mai_VERYLOW' => 'Very low', diff --git a/output/General/general_en.lex.new1 b/output/General/general_en.lex.new1 new file mode 100644 index 0000000..6989d9b --- /dev/null +++ b/output/General/general_en.lex.new1 @@ -0,0 +1,154 @@ +# +# Lex file for General generated on 2025-07-17 09:52:34 +# +'ACCOUNT' => 'Account', +'ACCOUNT_GROUP_NONE' => 'There are no user groups in the system.', +'ACCOUNT_LOCKED' => 'Account is locked', +'ACCOUNT_USER_NONE' => 'There are no user accounts in the system.', +'ACTION' => 'Action', +'ADD' => 'Add', +'ALL_BACKUPS' => 'All backups', +'Allow_local_access_only' => 'Allow local access only', +'Allow_public_access' => 'Allow public access', +'AM/PM:' => 'Am/pm:', +'Apply' => 'Apply', +'Back' => 'Back', +'Blocked' => 'Blocked', +'Check' => 'Check', +'Check_Domain' => 'Check domain', +'cifs' => 'Cifs', +'City' => 'City', +'COMMENT' => 'Comment', +'Company' => 'Company', +'Config' => 'Config', +'Content' => 'Content', +'COULD_NOT_GET_UID' => 'Could not get uid', +'COULD_NOT_OPEN_TZ_FILE' => 'Could not open tz file', +'CREATE_GROUP' => 'Create user group', +'Custom' => 'Custom', +'Daily' => 'Daily', +'Date' => 'Date', +'Day:' => 'Day:', +'Default' => 'Default', +'DELETE_ERROR' => 'Delete error', +'Department' => 'Department', +'DESCRIPTION' => 'Description', +'DESCRIPTION_BRIEF' => 'Brief description', +'DISABLED' => 'Disabled', +'DOMAIN' => 'Domain', +'DOMAIN_NAME' => 'Domain name', +'DOWNLOAD' => 'Download', +'Email' => 'Email', +'ENABLED' => 'Enabled', +'END_OF_REPORT' => 'End of Report', +'ENTIRE_INTERNET_NO_PASSWORD' => 'Entire internet no password', +'ENTIRE_INTERNET_PASSWORD' => 'Entire internet password', +'ENTIRE_INTERNET_PASSWORD_REMOTE' => 'Entire internet password remote', +'Error_occurred_while_modifying_password_for_admin.' => 'Error occurred while modifying password for admin.', +'ERROR_UPDATING' => 'Error updating', +'ERROR_UPDATING_CONFIGURATION' => 'Error occurred while updating system configuration.', +'EVERYONE' => 'Everyone', +'Everyone' => 'Everyone', +'Expiry' => 'Expiry', +'files' => 'files', +'firstname' => 'firstname', +'FM_ERR_UNEXPECTED_DESC' => 'Error: unexpected or missing characters in description', +'FM_IP_NUMBER1' => 'This field must contain a valid IP number and can not be left blank.', +'FM_IP_NUMBER2' => 'Invalid IP address format (expected X.X.X.X)', +'FM_MAC_ADDRESS1' => 'You must provide a MAC address.', +'FM_MAC_ADDRESS2' => 'The MAC address you provided was not valid.', +'FM_NONBLANK' => 'This field must not be left blank', +'Gateway' => 'Gateway', +'GROUP' => 'Group', +'GROUP_ADD' => 'Add group', +'GROUP_MEMBERS' => 'Group Members', +'GROUP_NAME' => 'Group Name', +'High' => 'High', +'Hostname' => 'Hostname', +'Hour:' => 'Hour:', +'Install' => 'Install', +'INVALID_REPORT_TYPE' => 'Invalid report type', +'INVALID_SERVERNAME' => 'Invalid servername', +'INVALID_WORKGROUP' => 'Invalid workgroup', +'INVALID_WORKGROUP_MATCHES_SERVERNAME' => 'Invalid workgroup matches servername', +'IP_ADDRESS_OR_FQDN' => 'IP Address or FQDN', +'Issuer' => 'Issuer', +'lastname' => 'lastname', +'LOCAL' => 'Local', +'LOCAL_NETWORK_NO_PASSWORD' => 'Local network no password', +'LOCAL_NETWORK_PASSWORD' => 'Local network password', +'local_removable_disk' => 'Local removable disk', +'LOCATION' => 'Location', +'Location' => 'Location', +'Lock' => 'Lock', +'Low' => 'Low', +'Medium' => 'Medium', +'megabytes' => 'megabytes', +'Minute:' => 'Minute:', +'MODIFY' => 'Modify', +'Modify' => 'Modify', +'MODIFY_USER_GROUP' => 'Modify user group', +'Month:' => 'Month:', +'Monthly' => 'Monthly', +'Mounted_disk' => 'Mounted disk', +'NAME' => 'Name', +'NETWORK' => 'Network', +'NETWORKS_ALLOW_LOCAL' => 'Allow access only from local networks', +'NETWORKS_ALLOW_PUBLIC' => 'Allow public access (entire Internet)', +'Never' => 'Never', +'NEXT' => 'Next', +'nfs' => 'Nfs', +'NO' => 'No', +'NONE' => 'None', +'NOT_A_PSEUDONYM' => 'Not a pseudonym', +'NUM_OF_HOSTS' => 'Num of hosts', +'Only_allow_insecure_access' => 'Only allow insecure access', +'Operation' => 'Operation', +'PASSWORD' => 'Password', +'PASSWORD_NEW' => 'New password:', +'PASSWORD_RESET' => 'Reset password', +'PASSWORD_VERIFY_ERROR' => 'The passwords you entered did not match.', +'PASSWORD_VERIFY_NEW' => 'New password (verify):', +'PERFORM' => 'Perform', +'PptpSessions' => 'Pptpsessions', +'Protocol' => 'Protocol', +'Pseudonym' => 'Pseudonym', +'Reboot' => 'Reboot', +'RECONFIGURE' => 'Reconfigure', +'Reject' => 'Reject', +'REMOTE' => 'Remote', +'REMOVE' => 'Remove', +'REMOVE_USER_GROUP' => 'Remove user group', +'REPORT_GENERATED' => 'Report generated', +'RESET_PASSWORD_TITLE' => 'Reset user password', +'ROUTER' => 'Router', +'SAVE' => 'Save', +'Save' => 'Save', +'Second:' => 'Second:', +'SELF' => 'Self', +'SHUTDOWN' => 'Shutdown', +'SMTP_port_%u_allow_client_to_authenticate:' => 'Smtp port %u allow client to authenticate:', +'SMTP_port_(25)_main_purpose_is_to_receive_emails_from_another_server,_STARTTLS_is_always_offered,_but_auth_if_offered_is_only_if_STARTTLS_is_also_used_by_client.' => 'Smtp port (25) main purpose is to receive emails from another server, starttls is always offered, but auth if offered is only if starttls is also used by client.', +'SMTP_Submission_port_(587)_will_require_STARTTLS,_then_authenticate_to_send.' => 'Smtp submission port (587) will require starttls, then authenticate to send.', +'SMTPS_port_(465)_will_require_implicit_SSL/TLS_then_authenticate_to_send.' => 'Smtps port (465) will require implicit ssl/tls then authenticate to send.', +'SMTPS_SSL/TLS_auth:_port_%u_status:' => 'Smtps ssl/tls auth: port %u status:', +'Submission_port_%u_status:' => 'Submission port %u status:', +'SUBNET_MASK' => 'Subnet mask', +'SUCCESS' => 'Success', +'Time' => 'Time', +'Time_Configuration' => 'Time configuration', +'Time_Setting_Mode:' => 'Time setting mode:', +'Update' => 'Update', +'USER_DIFFERENT' => 'User different', +'USER_NAME' => 'User Name', +'useraccount' => 'useraccount', +'ValidFromMask' => 'Validfrommask', +'ValidFromNetwork' => 'Validfromnetwork', +'Verify' => 'Verify', +'WARG' => 'Warg', +'Webmail' => 'Webmail', +'Weekly' => 'Weekly', +'WGRE' => 'Wgre', +'WGRG' => 'Wgrg', +'Year:' => 'Year:', +'YES' => 'Yes', diff --git a/output/General/general_en.lex.new11 b/output/General/general_en.lex.new11 new file mode 100644 index 0000000..3372982 --- /dev/null +++ b/output/General/general_en.lex.new11 @@ -0,0 +1,154 @@ +# +# Lex file for General generated on 2025-07-19 12:54:37 +# +'ACCOUNT' => 'Account', +'ACCOUNT_GROUP_NONE' => 'There are no user groups in the system.', +'ACCOUNT_LOCKED' => 'Account is locked', +'ACCOUNT_USER_NONE' => 'There are no user accounts in the system.', +'ACTION' => 'Action', +'ADD' => 'Add', +'ALL_BACKUPS' => 'All backups', +'Allow_local_access_only' => 'Allow local access only', +'Allow_public_access' => 'Allow public access', +'AM/PM:' => 'Am/pm:', +'Apply' => 'Apply', +'Back' => 'Back', +'Blocked' => 'Blocked', +'Check' => 'Check', +'Check_Domain' => 'Check domain', +'cifs' => 'Cifs', +'City' => 'City', +'COMMENT' => 'Comment', +'Company' => 'Company', +'Config' => 'Config', +'Content' => 'Content', +'COULD_NOT_GET_UID' => 'Could not get uid', +'COULD_NOT_OPEN_TZ_FILE' => 'Could not open tz file', +'CREATE_GROUP' => 'Create user group', +'Custom' => 'Custom', +'Daily' => 'Daily', +'Date' => 'Date', +'Day:' => 'Day:', +'Default' => 'Default', +'DELETE_ERROR' => 'Delete error', +'Department' => 'Department', +'DESCRIPTION' => 'Description', +'DESCRIPTION_BRIEF' => 'Brief description', +'DISABLED' => 'Disabled', +'DOMAIN' => 'Domain', +'DOMAIN_NAME' => 'Domain name', +'DOWNLOAD' => 'Download', +'Email' => 'Email', +'ENABLED' => 'Enabled', +'END_OF_REPORT' => 'End of Report', +'ENTIRE_INTERNET_NO_PASSWORD' => 'Entire internet no password', +'ENTIRE_INTERNET_PASSWORD' => 'Entire internet password', +'ENTIRE_INTERNET_PASSWORD_REMOTE' => 'Entire internet password remote', +'Error_occurred_while_modifying_password_for_admin.' => 'Error occurred while modifying password for admin.', +'ERROR_UPDATING' => 'Error updating', +'ERROR_UPDATING_CONFIGURATION' => 'Error occurred while updating system configuration.', +'EVERYONE' => 'Everyone', +'Everyone' => 'Everyone', +'Expiry' => 'Expiry', +'files' => 'files', +'firstname' => 'firstname', +'FM_ERR_UNEXPECTED_DESC' => 'Error: unexpected or missing characters in description', +'FM_IP_NUMBER1' => 'This field must contain a valid IP number and can not be left blank.', +'FM_IP_NUMBER2' => 'Invalid IP address format (expected X.X.X.X)', +'FM_MAC_ADDRESS1' => 'You must provide a MAC address.', +'FM_MAC_ADDRESS2' => 'The MAC address you provided was not valid.', +'FM_NONBLANK' => 'This field must not be left blank', +'Gateway' => 'Gateway', +'GROUP' => 'Group', +'GROUP_ADD' => 'Add group', +'GROUP_MEMBERS' => 'Group Members', +'GROUP_NAME' => 'Group Name', +'High' => 'High', +'Hostname' => 'Hostname', +'Hour:' => 'Hour:', +'Install' => 'Install', +'INVALID_REPORT_TYPE' => 'Invalid report type', +'INVALID_SERVERNAME' => 'Invalid servername', +'INVALID_WORKGROUP' => 'Invalid workgroup', +'INVALID_WORKGROUP_MATCHES_SERVERNAME' => 'Invalid workgroup matches servername', +'IP_ADDRESS_OR_FQDN' => 'IP Address or FQDN', +'Issuer' => 'Issuer', +'lastname' => 'lastname', +'LOCAL' => 'Local', +'LOCAL_NETWORK_NO_PASSWORD' => 'Local network no password', +'LOCAL_NETWORK_PASSWORD' => 'Local network password', +'local_removable_disk' => 'Local removable disk', +'LOCATION' => 'Location', +'Location' => 'Location', +'Lock' => 'Lock', +'Low' => 'Low', +'Medium' => 'Medium', +'megabytes' => 'megabytes', +'Minute:' => 'Minute:', +'MODIFY' => 'Modify', +'Modify' => 'Modify', +'MODIFY_USER_GROUP' => 'Modify user group', +'Month:' => 'Month:', +'Monthly' => 'Monthly', +'Mounted_disk' => 'Mounted disk', +'NAME' => 'Name', +'NETWORK' => 'Network', +'NETWORKS_ALLOW_LOCAL' => 'Allow access only from local networks', +'NETWORKS_ALLOW_PUBLIC' => 'Allow public access (entire Internet)', +'Never' => 'Never', +'NEXT' => 'Next', +'nfs' => 'Nfs', +'NO' => 'No', +'NONE' => 'None', +'NOT_A_PSEUDONYM' => 'Not a pseudonym', +'NUM_OF_HOSTS' => 'Num of hosts', +'Only_allow_insecure_access' => 'Only allow insecure access', +'Operation' => 'Operation', +'PASSWORD' => 'Password', +'PASSWORD_NEW' => 'New password:', +'PASSWORD_RESET' => 'Reset password', +'PASSWORD_VERIFY_ERROR' => 'The passwords you entered did not match.', +'PASSWORD_VERIFY_NEW' => 'New password (verify):', +'PERFORM' => 'Perform', +'PptpSessions' => 'Pptpsessions', +'Protocol' => 'Protocol', +'Pseudonym' => 'Pseudonym', +'Reboot' => 'Reboot', +'RECONFIGURE' => 'Reconfigure', +'Reject' => 'Reject', +'REMOTE' => 'Remote', +'REMOVE' => 'Remove', +'REMOVE_USER_GROUP' => 'Remove user group', +'REPORT_GENERATED' => 'Report generated', +'RESET_PASSWORD_TITLE' => 'Reset user password', +'ROUTER' => 'Router', +'SAVE' => 'Save', +'Save' => 'Save', +'Second:' => 'Second:', +'SELF' => 'Self', +'SHUTDOWN' => 'Shutdown', +'SMTP_port_%u_allow_client_to_authenticate:' => 'Smtp port %u allow client to authenticate:', +'SMTP_port_(25)_main_purpose_is_to_receive_emails_from_another_server,_STARTTLS_is_always_offered,_but_auth_if_offered_is_only_if_STARTTLS_is_also_used_by_client.' => 'Smtp port (25) main purpose is to receive emails from another server, starttls is always offered, but auth if offered is only if starttls is also used by client.', +'SMTP_Submission_port_(587)_will_require_STARTTLS,_then_authenticate_to_send.' => 'Smtp submission port (587) will require starttls, then authenticate to send.', +'SMTPS_port_(465)_will_require_implicit_SSL/TLS_then_authenticate_to_send.' => 'Smtps port (465) will require implicit ssl/tls then authenticate to send.', +'SMTPS_SSL/TLS_auth:_port_%u_status:' => 'Smtps ssl/tls auth: port %u status:', +'Submission_port_%u_status:' => 'Submission port %u status:', +'SUBNET_MASK' => 'Subnet mask', +'SUCCESS' => 'Success', +'Time' => 'Time', +'Time_Configuration' => 'Time configuration', +'Time_Setting_Mode:' => 'Time setting mode:', +'Update' => 'Update', +'USER_DIFFERENT' => 'User different', +'USER_NAME' => 'User Name', +'useraccount' => 'useraccount', +'ValidFromMask' => 'Validfrommask', +'ValidFromNetwork' => 'Validfromnetwork', +'Verify' => 'Verify', +'WARG' => 'Warg', +'Webmail' => 'Webmail', +'Weekly' => 'Weekly', +'WGRE' => 'Wgre', +'WGRG' => 'Wgrg', +'Year:' => 'Year:', +'YES' => 'Yes', diff --git a/output/General/general_en.lex.new2 b/output/General/general_en.lex.new2 new file mode 100644 index 0000000..38d47a8 --- /dev/null +++ b/output/General/general_en.lex.new2 @@ -0,0 +1,193 @@ +# +# Lex file for General generated on 2025-07-19 12:54:37 +# +'ACCOUNT' => 'Account', +'ACCOUNT_GROUP_NONE' => 'There are no user groups in the system.', +'ACCOUNT_LOCKED' => 'Account is locked', +'ACCOUNT_USER_NONE' => 'There are no user accounts in the system.', +'ACTION' => 'Action', +'ADD' => 'Add', +'ALL_BACKUPS' => 'All backups', +'Allow_local_access_only' => 'Allow local access only', +'Allow_public_access' => 'Allow public access', +'AM/PM:' => 'Am/pm:', +'Antivirus (ClamAV)' => 'Antivirus (ClamAV)', +'Apply' => 'Apply', +'Back' => 'Back', +'Backup or restore' => 'Backup or restore', +'Blocked' => 'Blocked', +'Change password' => 'Change password', +'Check' => 'Check', +'Check_Domain' => 'Check domain', +'cifs' => 'Cifs', +'City' => 'City', +'COMMENT' => 'Comment', +'Company' => 'Company', +'Config' => 'Config', +'Content' => 'Content', +'COULD_NOT_GET_UID' => 'Could not get uid', +'COULD_NOT_OPEN_TZ_FILE' => 'Could not open tz file', +'CREATE_GROUP' => 'Create user group', +'Current User' => 'Current User', +'Custom' => 'Custom', +'Daily' => 'Daily', +'Date' => 'Date', +'Date and time' => 'Date and time', +'Day:' => 'Day:', +'Default' => 'Default', +'DELETE_ERROR' => 'Delete error', +'Department' => 'Department', +'DESCRIPTION' => 'Description', +'DESCRIPTION_BRIEF' => 'Brief description', +'Directory' => 'Directory', +'DISABLED' => 'Disabled', +'DOMAIN' => 'Domain', +'DOMAIN_NAME' => 'Domain name', +'Domains' => 'Domains', +'DOWNLOAD' => 'Download', +'E-Mail' => 'E-Mail', +'Email' => 'Email', +'ENABLED' => 'Enabled', +'END_OF_REPORT' => 'End of Report', +'ENTIRE_INTERNET_NO_PASSWORD' => 'Entire internet no password', +'ENTIRE_INTERNET_PASSWORD' => 'Entire internet password', +'ENTIRE_INTERNET_PASSWORD_REMOTE' => 'Entire internet password remote', +'Error_occurred_while_modifying_password_for_admin.' => 'Error occurred while modifying password for admin.', +'ERROR_UPDATING' => 'Error updating', +'ERROR_UPDATING_CONFIGURATION' => 'Error occurred while updating system configuration.', +'EVERYONE' => 'Everyone', +'Everyone' => 'Everyone', +'Expiry' => 'Expiry', +'files' => 'files', +'firstname' => 'firstname', +'FM_ERR_UNEXPECTED_DESC' => 'Error: unexpected or missing characters in description', +'FM_IP_NUMBER1' => 'This field must contain a valid IP number and can not be left blank.', +'FM_IP_NUMBER2' => 'Invalid IP address format (expected X.X.X.X)', +'FM_MAC_ADDRESS1' => 'You must provide a MAC address.', +'FM_MAC_ADDRESS2' => 'The MAC address you provided was not valid.', +'FM_NONBLANK' => 'This field must not be left blank', +'Gateway' => 'Gateway', +'GROUP' => 'Group', +'GROUP_ADD' => 'Add group', +'GROUP_MEMBERS' => 'Group Members', +'GROUP_NAME' => 'Group Name', +'GROUPS' => 'GROUPS', +'High' => 'High', +'Home' => 'Home', +'Hostname' => 'Hostname', +'Hostnames and addresses' => 'Hostnames and addresses', +'Hour:' => 'Hour:', +'Ibays' => 'Ibays', +'Install' => 'Install', +'INVALID_REPORT_TYPE' => 'Invalid report type', +'INVALID_SERVERNAME' => 'Invalid servername', +'INVALID_WORKGROUP' => 'Invalid workgroup', +'INVALID_WORKGROUP_MATCHES_SERVERNAME' => 'Invalid workgroup matches servername', +'Investigation' => 'Investigation', +'IP_ADDRESS_OR_FQDN' => 'IP Address or FQDN', +'Issuer' => 'Issuer', +'lastname' => 'lastname', +'Legacy' => 'Legacy', +'Legacy panel' => 'Legacy panel', +'Letsencrypt certificate' => 'Letsencrypt certificate', +'LOCAL' => 'Local', +'Local networks' => 'Local networks', +'LOCAL_NETWORK_NO_PASSWORD' => 'Local network no password', +'LOCAL_NETWORK_PASSWORD' => 'Local network password', +'local_removable_disk' => 'Local removable disk', +'LOCATION' => 'Location', +'Location' => 'Location', +'Lock' => 'Lock', +'Logout' => 'Logout', +'Low' => 'Low', +'Mail log file analysis' => 'Mail log file analysis', +'Medium' => 'Medium', +'megabytes' => 'megabytes', +'Minute:' => 'Minute:', +'MODIFY' => 'Modify', +'Modify' => 'Modify', +'MODIFY_USER_GROUP' => 'Modify user group', +'Month:' => 'Month:', +'Monthly' => 'Monthly', +'Mounted_disk' => 'Mounted disk', +'NAME' => 'Name', +'NETWORK' => 'Network', +'Network' => 'Network', +'NETWORKS_ALLOW_LOCAL' => 'Allow access only from local networks', +'NETWORKS_ALLOW_PUBLIC' => 'Allow public access (entire Internet)', +'Never' => 'Never', +'NEXT' => 'Next', +'nfs' => 'Nfs', +'NO' => 'No', +'NONE' => 'None', +'NOT_A_PSEUDONYM' => 'Not a pseudonym', +'NUM_OF_HOSTS' => 'Num of hosts', +'NutUPS configuration' => 'NutUPS configuration', +'Online manual' => 'Online manual', +'Only_allow_insecure_access' => 'Only allow insecure access', +'Operation' => 'Operation', +'PASSWORD' => 'Password', +'PASSWORD_NEW' => 'New password:', +'PASSWORD_RESET' => 'Reset password', +'PASSWORD_VERIFY_ERROR' => 'The passwords you entered did not match.', +'PASSWORD_VERIFY_NEW' => 'New password (verify):', +'PERFORM' => 'Perform', +'Port forwarding' => 'Port forwarding', +'PptpSessions' => 'Pptpsessions', +'Printers' => 'Printers', +'Protocol' => 'Protocol', +'Proxy settings' => 'Proxy settings', +'Pseudonym' => 'Pseudonym', +'Pseudonyms' => 'Pseudonyms', +'Quotas' => 'Quotas', +'Reboot' => 'Reboot', +'Reboot or shutdown' => 'Reboot or shutdown', +'RECONFIGURE' => 'Reconfigure', +'Reject' => 'Reject', +'REMOTE' => 'Remote', +'Remote access' => 'Remote access', +'REMOVE' => 'Remove', +'REMOVE_USER_GROUP' => 'Remove user group', +'Report a bug' => 'Report a bug', +'REPORT_GENERATED' => 'Report generated', +'RESET_PASSWORD_TITLE' => 'Reset user password', +'Review configuration' => 'Review configuration', +'ROUTER' => 'Router', +'Samba workgroup' => 'Samba workgroup', +'SAVE' => 'Save', +'Save' => 'Save', +'Second:' => 'Second:', +'SELF' => 'Self', +'SHUTDOWN' => 'Shutdown', +'SMTP_port_%u_allow_client_to_authenticate:' => 'Smtp port %u allow client to authenticate:', +'SMTP_port_(25)_main_purpose_is_to_receive_emails_from_another_server,_STARTTLS_is_always_offered,_but_auth_if_offered_is_only_if_STARTTLS_is_also_used_by_client.' => 'Smtp port (25) main purpose is to receive emails from another server, starttls is always offered, but auth if offered is only if starttls is also used by client.', +'SMTP_Submission_port_(587)_will_require_STARTTLS,_then_authenticate_to_send.' => 'Smtp submission port (587) will require starttls, then authenticate to send.', +'SMTPS_port_(465)_will_require_implicit_SSL/TLS_then_authenticate_to_send.' => 'Smtps port (465) will require implicit ssl/tls then authenticate to send.', +'SMTPS_SSL/TLS_auth:_port_%u_status:' => 'Smtps ssl/tls auth: port %u status:', +'Software installer' => 'Software installer', +'Submission_port_%u_status:' => 'Submission port %u status:', +'SUBNET_MASK' => 'Subnet mask', +'SUCCESS' => 'Success', +'Support' => 'Support', +'Support and licensing' => 'Support and licensing', +'System' => 'System', +'Time' => 'Time', +'Time_Configuration' => 'Time configuration', +'Time_Setting_Mode:' => 'Time setting mode:', +'Update' => 'Update', +'User management' => 'User management', +'USER_DIFFERENT' => 'User different', +'USER_NAME' => 'User Name', +'useraccount' => 'useraccount', +'Users' => 'Users', +'ValidFromMask' => 'Validfrommask', +'ValidFromNetwork' => 'Validfromnetwork', +'Verify' => 'Verify', +'View log files' => 'View log files', +'WARG' => 'Warg', +'Webmail' => 'Webmail', +'Weekly' => 'Weekly', +'WGRE' => 'Wgre', +'WGRG' => 'Wgrg', +'Year:' => 'Year:', +'YES' => 'Yes', diff --git a/output/Groups/groups_en.lex.diff b/output/Groups/groups_en.lex.diff new file mode 100644 index 0000000..d0ab7a8 --- /dev/null +++ b/output/Groups/groups_en.lex.diff @@ -0,0 +1,3 @@ +'grp_CONFIRM_DELETE_GROUP' => 'Are you sure you wish to remove this group?', +'grp_DELETE_ERROR' => 'An error occurred while removing user group.', +'grp_INVALID_GROUP_DESCRIPTION' => 'Error: unexpected or missing characters in group description', diff --git a/output/Groups/groups_en.lex.new1 b/output/Groups/groups_en.lex.new1 new file mode 100644 index 0000000..6e67bae --- /dev/null +++ b/output/Groups/groups_en.lex.new1 @@ -0,0 +1,33 @@ +# +# Lex file for Groups generated on 2025-07-17 09:52:31 +# +'grp_ACCOUNT_CONFLICT' => 'Error: the group "[_1]" can"t be created because there is +already a [_2] account of that name.', +'grp_CONFIRM_DELETE_GROUP' => 'Are you sure you wish to remove this group?', +'grp_CREATE_ERROR' => 'An error occurred while creating user group.', +'grp_CREATED_GROUP' => 'Successfully created user group', +'grp_CURRENT_LIST' => 'Current list of User Groups', +'grp_DELETE_DESCRIPTION' => 'You are about to remove the user group "[_1]."', +'grp_DELETE_ERROR' => 'An error occurred while removing user group.', +'grp_DELETED_GROUP' => 'Successfully removed user group', +'grp_FORM_TITLE' => 'Create, modify, or remove user groups', +'grp_GROUP_DESC' => 'Brief Description/Windows Group Alias', +'grp_GROUP_DESC_EXPL' => 'Input a brief group description in the field below. + This field also designates the group name viewable by + Windows clients.', +'grp_GROUP_HAS_MEMBERS' => 'This group contains the following members:', +'grp_GROUP_NAMING' => 'The group name should contain only lower-case +letters, numbers, hyphens, periods, and underscores, +and should start with a lower-case letter. For +example "sales", "beta5", and "reseller_partners" are +all valid group names, but "3rd-event", "Marketing Team" +and "lost&found" are not.', +'grp_GROUP_TOO_LONG' => 'Error: group name is too long. The maximum is [_1] characters.', +'grp_IBAYS_WILL_BE_CHANGED' => 'The following information bays were assigned to this group and +will be changed to the Administrator group (you can change them to +something else afterward):', +'grp_INVALID_GROUP_DESCRIPTION' => 'Error: unexpected or missing characters in group description', +'grp_MODIFIED_GROUP' => 'Successfully modifed user group', +'grp_MODIFY_ERROR' => 'An error occurred while modifying user group.', +'grp_NO_MEMBERS' => 'Error: no members in group. Did not create new group.', +'grp_NOT_A_GROUP' => 'Error: That is not an existing group account.', diff --git a/output/Hostentries/AdminLTE/_hos_list.html.new.ep b/output/Hostentries/AdminLTE/_hos_list.html.new.ep new file mode 100644 index 0000000..a996fe2 --- /dev/null +++ b/output/Hostentries/AdminLTE/_hos_list.html.new.ep @@ -0,0 +1,74 @@ +
+ + % my $btn = l("hos_ADD_HOSTNAME"); + +
+
+
+ +
+
+ <%= hidden_field "trt" => $hos_datas->{trt} %> +
+ + % my %dom_hos = %{$dom_hosts}; + % foreach my $domain ( sort ( keys %dom_hos ) ) { + +
+ <%= $c->l("hos_CURRENT_HOSTNAMES_FOR_LOCAL_DOMAIN", $domain); %> +
+ + + + + + + + + + + + + + + % foreach (@{$dom_hos{$domain}{"HOSTS"}}) { + + + + + + + + % my ($actionModify, $actionRemove) = " "; + % my $static = $_->{"static"} || "no"; + % if ($static ne "yes") { + %my $modify_text = l("MODIFY"); # Localized text + %my $csrf_token = "TOKEN"; # CSRF token for security + %my $hostentries_name = $_->{"HostName"}; # hostentries name extracted from the data structure + %$actionModify = qq{ + % + % + % + %}; + %my $remove_text = l("REMOVE"); # Localized text + %$csrf_token = "TOKEN"; # CSRF token for security + %#my $hostentries_name = $_->{"HostName"}; # hostentries name extracted from the data structure + %$actionRemove = qq{ + % + % + % + %}; + % } + + + + + % } + +
<%= l "Hostname" %><%= l "Location" %><%= l "IP_ADDRESS_OR_FQDN" %><%= l "hos_ETHERNET_ADDRESS" %><%= l "COMMENT" %><%= l "ACTION" %>
<%= $_->{"HostName"}; %><%= $_->{"HostType"}; %><%= $_->{"IP"}; %><%= $_->{"MACAddress"}; %><%= $_->{"Comment"}; %><%= $c->render_to_string(inline => $actionModify) %><%= $c->render_to_string(inline => $actionRemove) %>
+ % } +
diff --git a/output/Hostentries/AdminLTE/_hos_upd.html.new.ep b/output/Hostentries/AdminLTE/_hos_upd.html.new.ep new file mode 100644 index 0000000..18b6420 --- /dev/null +++ b/output/Hostentries/AdminLTE/_hos_upd.html.new.ep @@ -0,0 +1,92 @@ +
+ + % my $btn = l("NEXT"); + +
+ + % if ( $hos_datas->{trt} eq "ADD" ) { +

<%=l "hos_CREATE_TITLE" %>

+ % } else { +

<%=l "hos_MODIFY_TITLE" %>

+ % $btn = l("MODIFY"); + % } + +
+ <%= l "Hostname_DESCRIPTION" %> +
+
+
+
+ <%=l "Hostname" %> +
+
+ % if ( $hos_datas->{trt} eq "ADD" ) { + % param "Name" => $hos_datas->{name} unless param "Name"; + <%= text_field "Name" %> + % } else { + <%= hidden_field "Name" => $hos_datas->{name} %> + <%= $hos_datas->{name} %> + % } +
+
+ +
+ +
+
+ <%= l "DOMAIN" %> +
+ +
+ % if ( $hos_datas->{trt} eq "ADD" ) { + % param "Domain" => $hos_datas->{domain} unless param "Domain"; + <%= select_field "Domain", $c->domains_list() %> + % } else { + <%= hidden_field "Domain" => $hos_datas->{domain} %> + <%= $hos_datas->{domain} %> + % } +
+
+ +
+ +
+
+ +
+
+ % param "Comment" => $hos_datas->{comment} unless param "Comment"; + + +
+
+ +
+ +
+
+ <%=l "LOCATION" %> +
+
+ % param "Hosttype" => $hos_datas->{hosttype} unless param "Hosttype"; + <%= select_field "Hosttype", $c->hosttype_list(), class => "form-select"; %> +
+
+ +
+ +
+
+ +
+
+ + <%= hidden_field "trt" => $hos_datas->{trt} %> + <%= hidden_field "Hostname" => $hos_datas->{hostname} %> + <%= hidden_field "Internalip" => $hos_datas->{internalip} %> + <%= hidden_field "Externalip" => $hos_datas->{externalip} %> + <%= hidden_field "Macaddress" => $hos_datas->{macaddress} %> + +
+ +
diff --git a/output/Hostentries/default/_hos_list.html.new.ep b/output/Hostentries/default/_hos_list.html.new.ep new file mode 100644 index 0000000..ed4e044 --- /dev/null +++ b/output/Hostentries/default/_hos_list.html.new.ep @@ -0,0 +1,84 @@ +
+ + % my $btn = l("hos_ADD_HOSTNAME"); + + %= form_for "/hostentries" => (method => "POST") => begin + +

+ %= submit_button "$btn", class => "action" +

+ + %= hidden_field "trt" => $hos_datas->{trt} + + % end + + % my %dom_hos = %{$dom_hosts}; + % foreach my $domain ( sort ( keys %dom_hos ) ) { + +


+ %= $c->l("hos_CURRENT_HOSTNAMES_FOR_LOCAL_DOMAIN", $domain); +

+ + + + + + + + + + + + + % foreach (@{$dom_hos{$domain}{"HOSTS"}}) { + + %= t td => (class => "sme-border") => $_->{"HostName"}; + %= t td => (class => "sme-border") => $_->{"HostType"}; + %= t td => (class => "sme-border") => $_->{"IP"}; + %= t td => (class => "sme-border") => $_->{"MACAddress"}; + %= t td => (class => "sme-border") => $_->{"Comment"}; + + + % } + +
+ %=l "Hostname" + + %=l "Location" + + %=l "IP_ADDRESS_OR_FQDN" + + %=l "hos_ETHERNET_ADDRESS" + + %=l "COMMENT" + + %=l "ACTION" +
+ %my ($actionModify, $actionRemove) = " "; + %my $static = $_->{"static"} || "no"; + %if ($static ne "yes") { + %my $modify_text = l("MODIFY"); # Localized text + %my $csrf_token = "TOKEN"; # CSRF token for security + %my $hostentries_name = $_->{"HostName"}; # hostentries name extracted from the data structure + %$actionModify = qq{ + % + % + % + %}; + %my $remove_text = l("REMOVE"); # Localized text + %$csrf_token = "TOKEN"; # CSRF token for security + %#my $hostentries_name = $_->{"HostName"}; # hostentries name extracted from the data structure + %$actionRemove = qq{ + % + % + % + %}; + %} + <%= $c->render_to_string(inline => $actionModify) %> <%= $c->render_to_string(inline => $actionRemove) %> +
+ % } +
diff --git a/output/Hostentries/default/_hos_upd.html.new.ep b/output/Hostentries/default/_hos_upd.html.new.ep new file mode 100644 index 0000000..fd4d51f --- /dev/null +++ b/output/Hostentries/default/_hos_upd.html.new.ep @@ -0,0 +1,77 @@ +
+ + % my $btn = l("NEXT"); + + %= form_for "/hostentriesd" => (method => "POST") => begin +

+ % if ( $hos_datas->{trt} eq "ADD" ) { + %=l "hos_CREATE_TITLE" + % } else { + %=l "hos_MODIFY_TITLE" + % $btn = l("MODIFY"); + % } +

+ +

+ %=l "Hostname_DESCRIPTION" +

+ +

+ + %=l "Hostname", class => "label" + + % if ( $hos_datas->{trt} eq "ADD" ) { + % param "Name" => $hos_datas->{name} unless param "Name"; + %= text_field "Name", class => "input" + % } else { + %= hidden_field "Name" => $hos_datas->{name} + %= $hos_datas->{name}, class => "data" + % } + +

+ +

+ + %=l "DOMAIN", class => "label" + + % if ( $hos_datas->{trt} eq "ADD" ) { + % param "Domain" => $hos_datas->{domain} unless param "Domain"; + %= select_field "Domain", $c->domains_list(), class => "input" + % } else { + %= hidden_field "Domain" => $hos_datas->{domain} + %= $hos_datas->{domain}, class => "data" + % } + +

+ +

+ + %= $c->l("COMMENT", ""); + + % param "Comment" => $hos_datas->{comment} unless param "Comment"; + %= text_field "Comment", class => "input" + +

+ +

+ + %=l "LOCATION", class => "label" + + % param "Hosttype" => $hos_datas->{hosttype} unless param "Hosttype"; + %= select_field "Hosttype", $c->hosttype_list(), class => "input" + +

+ +


+ %= submit_button "$btn", class => "action" +

+ + %= hidden_field "trt" => $hos_datas->{trt} + %= hidden_field "Hostname" => $hos_datas->{hostname} + %= hidden_field "Internalip" => $hos_datas->{internalip} + %= hidden_field "Externalip" => $hos_datas->{externalip} + %= hidden_field "Macaddress" => $hos_datas->{macaddress} + + %end + +
diff --git a/output/Hostentries/hostentries_en.lex.diff b/output/Hostentries/hostentries_en.lex.diff new file mode 100644 index 0000000..73867d0 --- /dev/null +++ b/output/Hostentries/hostentries_en.lex.diff @@ -0,0 +1,38 @@ +'hos_CONFIRM_DESCRIPTION' => 'Please confirm the following details.', +'hos_CREATE_LOCAL_HOST_TITLE' => 'Create a new hostname referring to a local host.', +'hos_CREATE_REMOTE_HOST_TITLE' => 'Create a new hostname referring to a remote host', +'hos_CURRENT_HOSTNAMES_FOR_DOMAIN' => 'Current list of hostnames for [_1].', +'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_DNS_FORWARDER_ENABLED' => 'A DNS forwarder has been configured. This means that all DNS +lookups will be handled by the DNS forwarder. Hostnames +and addresses cannot be modified on this server while +a DNS forwarder is configured.', +'hos_DOMAIN_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.', +'hos_HOSTNAME_LENGTH_ERROR' => 'Error: account name [_1] is too long. The +maximum is 32 characters.', +'hos_HOSTNAME_VALIDATION_ERROR' => 'Error: unexpected characters in host name: "[_1]". +The host name should contain only +letters, numbers, and hyphens and must start +with a letter or a number.', +'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 +form "AA:BB:CC:DD:EE:FF" and only contain the +numbers 0-9 and the letters A-F. Did not create +hostname.', +'hos_MUST_BE_VALID_HOSTNAME_OR_IP' => 'Must be a valid hostname or IP number', +'hos_NO_HOSTNAMES_FOR_LOCAL_DOMAIN' => 'There are no hostnames in the system for [_1].', +'hos_NO_HOSTNAMES_FOR_SERVICENAME' => 'There are no hostnames in the system for [_1].', +'hos_NO_HOSTS_FOR_THIS_DOMAIN' => 'There are no hosts for this domain.', +'hos_STATIC_HOST_MESSAGE' => '- This host represents your system name and cannot be modifiedor removed.', +'hos_SUCCESSFULLY_CREATED' => 'Successfully created hostname.', +'hos_SUCCESSFULLY_DELETED' => 'Successfully deleted host.', +'hos_SUCCESSFULLY_MODIFIED' => 'Successfully modified host.', +'hos_UNABLE_TO_OPEN_CONFIGDB' => 'Unable to open configuration database', +'Hostnames and addresses' => 'Hostnames and addresses', diff --git a/output/Hostentries/hostentries_en.lex.new1 b/output/Hostentries/hostentries_en.lex.new1 new file mode 100644 index 0000000..f8a6b21 --- /dev/null +++ b/output/Hostentries/hostentries_en.lex.new1 @@ -0,0 +1,73 @@ +# +# Lex file for Hostentries generated on 2025-07-17 09:52:32 +# +'hos_ABOUT_TO_REMOVE' => 'Are you sure you wish to remove this hostname?', +'hos_ADD_HOSTNAME' => 'Add hostname', +'hos_ADDR_IN_DHCP_RANGE' => 'Address is inside the DHCP assigned dynamic range', +'hos_CONFIRM_DESCRIPTION' => 'Please confirm the following details.', +'hos_CREATE_LOCAL_HOST_TITLE' => 'Create a new hostname referring to a local host.', +'hos_CREATE_REMOTE_HOST_TITLE' => 'Create a new hostname referring to a remote host', +'hos_CREATE_TITLE' => 'Create or modify hostname', +'hos_CURRENT_HOSTNAMES_FOR_DOMAIN' => 'Current list of hostnames for [_1].', +'hos_CURRENT_HOSTNAMES_FOR_LOCAL_DOMAIN' => 'Current list of hostnames for [_1]', +'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_DNS_FORWARDER_ENABLED' => 'A DNS forwarder has been configured. This means that all DNS +lookups will be handled by the DNS forwarder. Hostnames +and addresses cannot be modified on this server while +a DNS forwarder is configured.', +'hos_DOMAIN_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.', +'hos_ERR_IP_IS_LOCAL_OR_GATEWAY' => 'Error: IP cannot be server IP or Gateway IP.', +'hos_ERR_IP_NOT_LOCAL' => 'Error: This IP address is not on any of our local networks.', +'hos_ERROR_WHILE_CREATING_HOST' => 'Error occurred while creating hostname.', +'hos_ERROR_WHILE_DELETING_HOST' => 'Error occurred while deleting hostname.', +'hos_ERROR_WHILE_MODIFYING_HOST' => 'Error occurred while modifying hostname.', +'hos_ETHERNET_ADDRESS' => 'Ethernet address', +'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 +"AA:BB:CC:DD:EE:FF" and must contain only the numbers 0-9 and +the letters A-F.', +'hos_FORM_TITLE' => 'Hostnames and addresses', +'hos_HOSTNAME_COMMENT_ERROR' => 'Error: unexpected characters in the comment of "[_1]". +The comment must contain only letters, spaces, numbers, dots, commas, undescores, hyphens and must start with a letter or number.', +'hos_HOSTNAME_DESCRIPTION' => 'The hostname must contain only letters, numbers, and hyphens, and must start with a letter or number. ', +'hos_HOSTNAME_EXISTS_ERROR' => 'Error: account [_1] hostname.', +'hos_HOSTNAME_LENGTH_ERROR' => 'Error: account name [_1] is too long. The +maximum is 32 characters.', +'hos_HOSTNAME_VALIDATION_ERROR' => 'Error: unexpected characters in host name: "[_1]". +The host name should contain only +letters, numbers, and hyphens and must start +with a letter or a number.', +'hos_HOSTNAME_VALIDATOR_ERROR' => 'Error: unexpected characters in host name: "[_1]". The host name should contain only +letters, numbers, and hyphens and must start with a letter or a number. ', +'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_LOCAL_IP' => 'Local IP', +'hos_LOCAL_IP_DESCRIPTION' => 'The Local IP address is the IP address of another machine on +the local network. Please enter a valid IP address in the +format "aaa.bbb.ccc.ddd".', +'hos_LOCAL_PAGE_DESCRIPTION' => 'Please enter the following additional details for a localhost:', +'hos_MAC_ADDRESS_VALIDATION_ERROR' => 'Error: Ethernet address [_1] +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.', +'hos_MODIFY_TITLE' => 'Modify hostname', +'hos_MUST_BE_VALID_HOSTNAME_OR_IP' => 'Must be a valid hostname or IP number', +'hos_NO_HOSTNAMES_FOR_LOCAL_DOMAIN' => 'There are no hostnames in the system for [_1].', +'hos_NO_HOSTNAMES_FOR_SERVICENAME' => 'There are no hostnames in the system for [_1].', +'hos_NO_HOSTS_FOR_THIS_DOMAIN' => 'There are no hosts for this domain.', +'hos_REMOTE_PAGE_DESCRIPTION' => 'Please enter the following additional details for a remotehost:', +'hos_REMOVE_PAGE_DESCRIPTION' => 'You are about to remove the hostname "[_1]"', +'hos_REMOVE_TITLE' => 'Remove hostname', +'hos_STATIC_HOST_MESSAGE' => '- This host represents your system name and cannot be modifiedor removed.', +'hos_SUCCESSFULLY_CREATED' => 'Successfully created hostname.', +'hos_SUCCESSFULLY_DELETED' => 'Successfully deleted host.', +'hos_SUCCESSFULLY_MODIFIED' => 'Successfully modified host.', +'hos_UNABLE_TO_OPEN_CONFIGDB' => 'Unable to open configuration database', +'Hostnames and addresses' => 'Hostnames and addresses', diff --git a/output/Ibays/ibays_en.lex.diff b/output/Ibays/ibays_en.lex.diff new file mode 100644 index 0000000..4fdd4b6 --- /dev/null +++ b/output/Ibays/ibays_en.lex.diff @@ -0,0 +1,20 @@ +'ENTIRE_INTERNET_NO_PASSWORD' => 'Entire Internet (no password required)', +'ENTIRE_INTERNET_PASSWORD' => 'Entire Internet (password required)', +'ENTIRE_INTERNET_PASSWORD_REMOTE' => 'Entire Internet (password required outside local network)', +'iba_IBAY_PASSWD_VALIDATION_ERROR' => 'The password may contain only letters and numbers.', +'iba_PUBLIC_ACCESS_DESCRIPTION' => 'The public access mode "password required outside local +network" is not supported by the FTP server component. If +you select this mode, the FTP server will require a +password both inside and outside the local network for this +i-bay.', +'iba_VIRTUAL_HOST_MESSAGE' => 'The following virtual domains were using this information +bay as their content and will be changed to the primary web +site (you can change them to something else afterward).', +'Information bays' => 'Information bays', +'INVALID_IBAY_DESCRIPTION' => 'Error: unexpected or missing characters in i-bay description', +'LOCAL_NETWORK_NO_PASSWORD' => 'Local network (no password required)', +'LOCAL_NETWORK_PASSWORD' => 'Local network (password required)', +'NONE' => 'No access', +'WARG' => 'Write = admin, Read = group', +'WGRE' => 'Write = group, Read = everyone', +'WGRG' => 'Write = group, Read = group', diff --git a/output/Ibays/ibays_en.lex.new1 b/output/Ibays/ibays_en.lex.new1 new file mode 100644 index 0000000..05f824f --- /dev/null +++ b/output/Ibays/ibays_en.lex.new1 @@ -0,0 +1,73 @@ +# +# Lex file for Ibays generated on 2025-07-17 09:52:32 +# +'ENTIRE_INTERNET_NO_PASSWORD' => 'Entire Internet (no password required)', +'ENTIRE_INTERNET_PASSWORD' => 'Entire Internet (password required)', +'ENTIRE_INTERNET_PASSWORD_REMOTE' => 'Entire Internet (password required outside local network)', +'iba_ACCOUNT_EXISTS' => 'The account "[_1]" is an existing [_2] account.', +'iba_ACCT_CLASHES_WITH_PSEUDONYM' => 'The account "[_1]" clashes with pseudonym +details for [_2] account "[_3]". +

[_1] is a pseudonym for [_2].

', +'iba_ACCT_NAME_HAS_INVALID_CHARS' => 'The i-bay name "[_1]" contains invalid characters. +I-bay names must start with a lower case letter and contain +only lower case letters, numbers, and hyphens.', +'iba_ADD_IBAY' => 'Add ibay', +'iba_ADD_TITLE' => 'Create or modify an i-bay', +'iba_ALLOW_DYNAMIC_CONTENT' => 'Execution of dynamic content (CGI, PHP, SSI)', +'iba_CANT_CREATE_IBAY' => 'Can"t create new account for [_1] (does it already exist?)', +'iba_CANT_FIND_IBAY' => 'Can"t find account for [_1] (does it exist?)', +'iba_ERROR_WHILE_CREATING_IBAY' => 'An error occurred while creating the i-bay.', +'iba_ERROR_WHILE_DELETING_IBAY' => 'An error occurred while deleting the i-bay.', +'iba_ERROR_WHILE_MODIFYING_IBAY' => 'An error occurred while modifying the i-bay.', +'iba_ERROR_WHILE_RESETTING_PASSWORD' => 'Error while resetting password.', +'iba_FIRSTPAGE_DESC' => 'You can remove any information bay or reset its password by +clicking on the corresponding command +next to the information bay. If the information bay shows up +in red, that means that the password has not +yet been changed from the default, and should be changed +soon.', +'iba_FORM_TITLE' => 'Create, modify, or remove i-bays', +'iba_HTTPS_Only' => 'Force secure connections', +'iba_IBAY_PASSWD_VALIDATION_ERROR' => 'The password may contain only letters and numbers.', +'iba_IBAY_PASSWD_VERIFY_ERROR' => 'The passwords do not match.', +'iba_MAX_IBAY_NAME_LENGTH_ERROR' => 'The i-bay name "[_1]" is too long. The maximum is +[_2] characters.', +'iba_NAME_FIELD_DESC' => 'The information bay name should contain only lower-case +letters, numbers, periods, hyphens and underscores, and +should start with a lower-case letter. For example +"johnson", "intra", and "cust3.prj12" are all valid +names, but "3associates", "John Smith" and +"Bus!Partner" are not. The name is limited to [_1] characters.', +'iba_NAME_LABEL' => 'Information bay name', +'iba_NO_IBAYS' => 'There are no i-bays currently configured.', +'iba_PASSWORD_DESC' => 'You are about to change the password for the i-bay [_1].', +'iba_PUBLIC_ACCESS' => 'Public access via web or anonymous ftp', +'iba_PUBLIC_ACCESS_DESCRIPTION' => 'The public access mode "password required outside local +network" is not supported by the FTP server component. If +you select this mode, the FTP server will require a +password both inside and outside the local network for this +i-bay.', +'iba_REMOVE_DESC' => '

You are about to remove the information bay [_1] ([_2]). +

All files belonging to this information bay will be deleted. +

Are you sure you wish to remove this information bay? +

', +'iba_REMOVE_TITLE' => 'Remove information bay', +'iba_SUCCESSFULLY_CREATED_IBAY' => 'Successfully created i-bay.', +'iba_SUCCESSFULLY_DELETED_IBAY' => 'Successfully deleted i-bay.', +'iba_SUCCESSFULLY_MODIFIED_IBAY' => 'Successfully modified i-bay.', +'iba_SUCCESSFULLY_RESET_PASSWORD' => 'Successfully reset password.', +'iba_USER_ACCESS' => 'User access via file sharing or user ftp', +'iba_VHOST_MESSAGE' => '

The following virtual domains were using this information bay +as their content and will be changed to the primary web site +(you can change them to something else afterward):

', +'iba_VIRTUAL_HOST_MESSAGE' => 'The following virtual domains were using this information +bay as their content and will be changed to the primary web +site (you can change them to something else afterward).', +'Information bays' => 'Information bays', +'INVALID_IBAY_DESCRIPTION' => 'Error: unexpected or missing characters in i-bay description', +'LOCAL_NETWORK_NO_PASSWORD' => 'Local network (no password required)', +'LOCAL_NETWORK_PASSWORD' => 'Local network (password required)', +'NONE' => 'No access', +'WARG' => 'Write = admin, Read = group', +'WGRE' => 'Write = group, Read = everyone', +'WGRG' => 'Write = group, Read = group', diff --git a/output/Letsencrypt/AdminLTE/_lets_CHECKALLDOMAINS.html.new.ep b/output/Letsencrypt/AdminLTE/_lets_CHECKALLDOMAINS.html.new.ep new file mode 100644 index 0000000..9791991 --- /dev/null +++ b/output/Letsencrypt/AdminLTE/_lets_CHECKALLDOMAINS.html.new.ep @@ -0,0 +1,47 @@ +%# +%# Generated by SM2Gen version:0.8 Chameleon version:4.5.4 On Python:3.12.3 at 2024-12-01 15:22:43 +%# +
+ + + % if (config->{debug} == 1) { +
+            %= dumper $lets_data
+        
+ % } + + % my $btn = l("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. + +

<%=l("lets_Check_all_domains")%>

+ +

<%=l("lets_Loop_through_checking_the_letsencrypt")%>

+ + + %=l("lets_All_domains_check_result") + + + % param "AllDomainsCheck" => $lets_data->{AllDomainsCheck} unless param "AllDomainsCheck"; + %= text_area "AllDomainsCheck", cols=>40, rows=>10, Readonly=>"true" +
+ + + %my $back_text = l("Back"); # Localized text + %my $actionBack = qq{ + % + % + % + %}; + <%= $c->render_to_string(inline => $actionBack) %> + + + %# Probably finally by a submit. + %end +
diff --git a/output/Letsencrypt/AdminLTE/_lets_CHECKALLENABLEDDOMAINS.html.new.ep b/output/Letsencrypt/AdminLTE/_lets_CHECKALLENABLEDDOMAINS.html.new.ep new file mode 100644 index 0000000..275b9d3 --- /dev/null +++ b/output/Letsencrypt/AdminLTE/_lets_CHECKALLENABLEDDOMAINS.html.new.ep @@ -0,0 +1,68 @@ +%# +%# Generated by SM2Gen version:0.8 Chameleon version:4.5.4 On Python:3.12.3 at 2024-12-01 15:22:43 +%# +
+ + + + + % if (config->{debug} == 1) { +
+            <%= dumper $lets_data %>
+        
+ % } + + % my $btn = l("Apply"); + + + + + + %# Inputs etc in here. + +

<%= l ("lets_Check_all_enabled_domains")%>

+ +
+ +

<%= l ("lets_Loop_through_checking_the_letsencrypt")%>

+ +
+ + + +
+
+ <%= l ("lets_Enabled_domains_check_result") %> +
+
+ % param "EnabledDomainsCheck" => $lets_data->{EnabledDomainsCheck} unless param "EnabledDomainsCheck"; + %= text_area "EnabledDomainsCheck", cols=>40, rows=>10, Readonly=>"true" +
+
+ +
+ + + + % my $back_text = l("Back"); # Localized text + %# param "trt" => $lets_data->{trt} unless param "trt"; + %#= hidden_field "trt" => $lets_data->{trt} + +
+ +
+ + + +
diff --git a/output/Letsencrypt/AdminLTE/_lets_CHECKONEDOMAIN.html.new.ep b/output/Letsencrypt/AdminLTE/_lets_CHECKONEDOMAIN.html.new.ep new file mode 100644 index 0000000..6be227e --- /dev/null +++ b/output/Letsencrypt/AdminLTE/_lets_CHECKONEDOMAIN.html.new.ep @@ -0,0 +1,77 @@ +%# +%# Generated by SM2Gen version:0.8 Chameleon version:4.5.4 On Python:3.12.3 at 2024-12-01 15:22:43 +%# +
+ + + + % if (config->{debug} == 1) { +
+            %= dumper $lets_data
+        
+ % } + + % my $btn = l("Apply"); + + + + %# Inputs etc in here. + +

<%=l("lets_Check_just_one_domain")%>

+ +
+ +

<%=l("lets_Loop_through_and_check_the")%>

+ +
+ + + + +
+
+ <%= l ("lets_Domains_name") %> +
+
+ % param "OneDomainToCheck" => $lets_data->{OneDomainToCheck} unless param "OneDomainToCheck"; + %= text_field "OneDomainToCheck", size => "50", class => "" , pattern=>".*" , placeholder=>"OneDomainToCheck", Readonly=>"true" +
+
+ +
+ + + +
+
+ <%= l ("lets_One_domain_check_result") %> +
+
+ % param "OneDomainsCheck" => $lets_data->{OneDomainsCheck} unless param "OneDomainsCheck"; + %= text_area "OneDomainsCheck", cols=>40, rows=>10, Readonly=>"true" +
+
+ +
+ + + % my $back_text = l("Back"); # Localized text + %# param "trt" => $lets_data->{trt} unless param "trt"; + %#= hidden_field "trt" => $lets_data->{trt} + +
+ +
+ + + +
diff --git a/output/Letsencrypt/AdminLTE/_lets_LIST.html.new.ep b/output/Letsencrypt/AdminLTE/_lets_LIST.html.new.ep new file mode 100644 index 0000000..c9d86a3 --- /dev/null +++ b/output/Letsencrypt/AdminLTE/_lets_LIST.html.new.ep @@ -0,0 +1,208 @@ +%# +%# Generated by SM2Gen version:0.8 Chameleon version:4.5.4 On Python:3.12.3 at 2024-12-01 15:22:43 +%# +
+ + + + + % if (config->{debug} == 1) { +
+            <%= dumper $lets_data %>
+        
+ % } + + +
+ + + + + + %# my $btn = l("Apply"); + %# param "trt" => $lets_data->{trt} unless param "trt"; + %#= hidden_field "trt" => $lets_data->{trt} + + % my $linkbtn = l ("MODIFY"); + + %# Inputs etc in here. + %# reetp Needs some language translations? +
+
+ <%= l("Config") %> +
+ +
+ +
+ + %#= link_to l("Config"), "letsencryptd?trt=PARAMS" , class=> "link link2" + +
+
+ <%= l ("Check_ALL_DOMAINS") %> +
+ +
+ + %#= link_to l("Check_ALL_DOMAINS"), "letsencryptd?trt=CHECKALLDOMAINS" , class=> "link link3" + +
+ +
+
+ <%= l ("Check_ALL_ENABLED_DOMAINS") %> +
+ +
+ + %#= link_to l("Check_ALL_ENABLED_DOMAINS"), "letsencryptd?trt=CHECKALLENABLEDDOMAINS" , class=> "link link4" + + + + + +

+ +

<%=l("lets_For_this_Server") %>

+ +
+ +
+
+ <%= l ("lets_Internal_IP") %> +
+
+ % param "InternalIP" => $lets_data->{InternalIP} unless param "InternalIP"; + %= text_field "InternalIP", size => "50", class => "" , pattern=>".*" , placeholder=>"InternalIP", Readonly=>"true" +
+
+ +
+ +
+
+ <%= l ("lets_External_Interface_IP") %> +
+
+ % param "ExternalIP" => $lets_data->{ExternalIP} unless param "ExternalIP"; + %= text_field "ExternalIP", size => "50", class => "" , pattern=>".*" , placeholder=>"ExternalIP", Readonly=>"true" +
+
+ +
+ +
+
+ <%= l ("lets_Internet_IP") %> +
+
+ % param "InternetIP" => $lets_data->{InternetIP} unless param "InternetIP"; + %= text_field "InternetIP", size => "50", class => "" , pattern=>".*" , placeholder=>"InternetIP", Readonly=>"true" +
+
+ +

+ +

<%=l("lets_Current_certificate_details") %>

+ +
+ +
+
+ <%= l ("Issuer") %> +
+
+ % param "Issuer" => $lets_data->{Issuer} unless param "Issuer"; + %= text_field "Issuer", size => "50", class => "" , pattern=>".*" , placeholder=>"Issuer", Readonly=>"true" +
+
+ +
+ +
+
+ <%= l ("Expiry") %> +
+
+ % param "Expiry" => $lets_data->{Expiry} unless param "Expiry"; + %= text_field "Expiry", size => "50", class => "" , pattern=>".*" , placeholder=>"Expiry", Readonly=>"true" +
+
+ +
+ +
+
+ <%= l ("lets_Not_Before") %> +
+
+ % param "NotBefore" => $lets_data->{NotBefore} unless param "NotBefore"; + %= text_field "NotBefore", size => "50", class => "" , pattern=>".*" , placeholder=>"NotBefore", Readonly=>"true" +
+
+ +

+ +

<%=l("lets_List_of_Domains_and_Hosts") %>

+ +
+ + % $linkbtn = l "Check"; + + + + + + + + + + + + + + + + % my $control_data = $c->stash("DomainList"); + % foreach my $row (@$control_data) { + % my $link = $c->render_to_string(inline=>$row->{"Table1-CHECK"}); + % my $type = $c->render_to_string(inline=>$row->{"Table1-TYPE"}); + + % if ($type eq "Domain\n"){ + + % } + % if ($type eq "Host\n") { + + % } + + + + + + + + + % if ($link ne "") { + + % } else { + + % } + + % } + +
<%= l ("lets_Domain_name_/_HOSTNAME") %><%= l ("lets_Brief_description") %><%= l ("Content") %><%= l ("lets_LABEL_NAMESERVERS") %><%= l ("lets_LABEL_POINT") %><%= l ("lets_LABEL_LECERT") %><%= l ("lets_IS_IN_CERT") %><%= l ("Check") %>
<%=$c->render_to_string(inline=>$row->{"Table1-Domain name / HOSTNAME"}) %> <%=$c->render_to_string(inline=>$row->{"Table1-Domain name / HOSTNAME"}) %><%=$c->render_to_string(inline=>$row->{"Table1-Brief description"}) %><%=$c->render_to_string(inline=>$row->{"Table1-Content"}) %><%=$c->render_to_string(inline=>$row->{"Table1-LABEL_NAMESERVERS"}) %><%=$c->render_to_string(inline=>$row->{"Table1-LABEL_POINT"}) %><%=$c->render_to_string(inline=>$row->{"Table1-LABEL_LECERT"}) %><%=$c->render_to_string(inline=>$row->{"Table1-IS_IN_CERT"}) %> <%= $linkbtn %> 
+ +
diff --git a/output/Letsencrypt/AdminLTE/_lets_PARAMS.html.new.ep b/output/Letsencrypt/AdminLTE/_lets_PARAMS.html.new.ep new file mode 100644 index 0000000..ae8464f --- /dev/null +++ b/output/Letsencrypt/AdminLTE/_lets_PARAMS.html.new.ep @@ -0,0 +1,152 @@ +%# +%# Generated by SM2Gen version:0.8 Chameleon version:4.5.4 On Python:3.12.3 at 2024-12-01 15:22:43 +%# +
+ + + + % if (config->{debug} == 1) { +
+            <%= dumper $lets_data %>
+        
+ % } + +
+ + % param "trt" => $lets_data->{trt} unless param "trt"; + %= hidden_field "trt" => $lets_data->{trt} + %# Inputs etc in here. + +

<%=l("lets_Manage_letsencrypt-config_settings:") %>

+ +
+ +
+ <%= l ("lets_CONFIG_LETSENCRYPT") %> +
+ +
+
+ <%= l ("lets_SERVICE_STATUS") %> +
+
+ % my @status_options = selected_field([["Disabled" => "disabled"], ["Enabled" => "enabled"], ["TEST" => "test"]], $lets_data->{status}); + %= select_field "status" => @status_options, class => "form-select" +
+
+ +
+ + +
+
+ <%= l ("lets_HOOKSCRIPT_STATUS") %> +
+
+ % my @hookScript_options = [["Disabled" => "disabled"], ["Enabled" => "enabled"]]; + % param "hookScript" => $lets_data->{hookScript} unless param "hookScript"; + %= select_field "hookScript" => @hookScript_options, class => "form-select" +
+
+ +
+ + +
+
+ <%= l ("lets_HOSTOVERRIDE_STATUS") %> +
+
+ % my @hostOverride_options = [["Disabled" => "disabled"], ["Yes" => "yes"]]; + % param "hostOverride" => $lets_data->{hostOverride} unless param "hostOverride"; + %= select_field "hostOverride" => @hostOverride_options, class => "form-select" +
+
+ +
+ + +
+
+ <%= l ("lets_ACCEPT_TERMS_STATUS") %> +
+
+ % 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 => "form-select" +
+
+ +
+ + +
+
+ <%= l ("lets_API_STATUS") %> +
+
+ % my @API_options = [["2" => "2"]]; + % param "API" => $lets_data->{API} unless param "API"; + %= select_field "API" => @API_options, class => "form-select" +
+
+ +
+ + +
+
+ <%= l ("lets_KEYSIZE_STATUS") %> +
+
+ % my @keysize_options = [["2048" => "2048"], ["3072" => "3072"], ["4096" => "4096"]]; + % param "keysize" => $lets_data->{keysize} unless param "keysize"; + %= select_field "keysize" => @keysize_options, class => "form-select" +
+
+ +
+ + +
+
+ <%= l ("lets_CONFIGUREMODE_STATUS") %> +
+
+ % 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 => "form-select" +
+
+ +
+ + +
+
+ +
+
+ % param "email" => $lets_data->{email} unless param "email"; + +
+
+ +
+ + % my $btn = l("Apply"); + +
+
+ +
+
+ +
+
diff --git a/output/Letsencrypt/default/_lets_CHECKALLDOMAINS.html.new.ep b/output/Letsencrypt/default/_lets_CHECKALLDOMAINS.html.new.ep new file mode 100644 index 0000000..77087ad --- /dev/null +++ b/output/Letsencrypt/default/_lets_CHECKALLDOMAINS.html.new.ep @@ -0,0 +1,45 @@ +%# +%# Generated by SM2Gen version:0.8 Chameleon version:4.5.4 On Python:3.12.3 at 2024-12-01 15:22:43 +%# +
+ + % if (config->{debug} == 1) { +
+			%= dumper $lets_data
+		
+ % } + % my $btn = l("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. + +

<%=l("lets_Check_all_domains")%>

+ +

<%=l("lets_Loop_through_checking_the_letsencrypt")%>

+ + + %=l("lets_All_domains_check_result") + + % param "AllDomainsCheck" => $lets_data->{AllDomainsCheck} unless param "AllDomainsCheck"; + %= text_area "AllDomainsCheck", cols=>40, rows=>10, Readonly=>"true" +
+ + + %my $back_text = l("Back"); # Localized text + %my $actionBack = qq{ + % + % + % + %}; + <%= $c->render_to_string(inline => $actionBack) %> + + + + %# Probably finally by a submit. + %end +
diff --git a/output/Letsencrypt/default/_lets_CHECKALLENABLEDDOMAINS.html.new.ep b/output/Letsencrypt/default/_lets_CHECKALLENABLEDDOMAINS.html.new.ep new file mode 100644 index 0000000..26120d0 --- /dev/null +++ b/output/Letsencrypt/default/_lets_CHECKALLENABLEDDOMAINS.html.new.ep @@ -0,0 +1,45 @@ +%# +%# Generated by SM2Gen version:0.8 Chameleon version:4.5.4 On Python:3.12.3 at 2024-12-01 15:22:43 +%# +
+ + % if (config->{debug} == 1) { +
+			%= dumper $lets_data
+		
+ % } + % my $btn = l("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. + +

<%=l("lets_Check_all_enabled_domains")%>

+ +

<%=l("lets_Loop_through_checking_the_letsencrypt")%>

+ + + %=l("lets_Enabled_domains_check_result") + + % param "EnabledDomainsCheck" => $lets_data->{EnabledDomainsCheck} unless param "EnabledDomainsCheck"; + %= text_area "EnabledDomainsCheck", cols=>40, rows=>10, Readonly=>"true" +
+ + + %my $back_text = l("Back"); # Localized text + %my $actionBack = qq{ + % + % + % + %}; + <%= $c->render_to_string(inline => $actionBack) %> + + + + %# Probably finally by a submit. + %end +
diff --git a/output/Letsencrypt/default/_lets_CHECKONEDOMAIN.html.new.ep b/output/Letsencrypt/default/_lets_CHECKONEDOMAIN.html.new.ep new file mode 100644 index 0000000..a1c70b6 --- /dev/null +++ b/output/Letsencrypt/default/_lets_CHECKONEDOMAIN.html.new.ep @@ -0,0 +1,52 @@ +%# +%# Generated by SM2Gen version:0.8 Chameleon version:4.5.4 On Python:3.12.3 at 2024-12-01 15:22:43 +%# +
+ + % if (config->{debug} == 1) { +
+			%= dumper $lets_data
+		
+ % } + % my $btn = l("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. + +

<%=l("lets_Check_just_one_domain")%>

+ +

<%=l("lets_Loop_through_and_check_the")%>

+ +

+ %=l("lets_Domains_name") + + % param "OneDomainToCheck" => $lets_data->{OneDomainToCheck} unless param "OneDomainToCheck"; + %= text_field "OneDomainToCheck", size => "50", class => "textinput OneDomainToCheck" , pattern=>".*" , placeholder=>"OneDomainToCheck", Readonly=>"true" +

+ + + %=l("lets_One_domain_check_result") + + % param "OneDomainsCheck" => $lets_data->{OneDomainsCheck} unless param "OneDomainsCheck"; + %= text_area "OneDomainsCheck", cols=>40, rows=>10, Readonly=>"true" +
+ + + %my $back_text = l("Back"); # Localized text + %my $actionBack = qq{ + % + % + % + %}; + <%= $c->render_to_string(inline => $actionBack) %> + + + + %# Probably finally by a submit. + %end +
diff --git a/output/Letsencrypt/default/_lets_LIST.html.new.ep b/output/Letsencrypt/default/_lets_LIST.html.new.ep new file mode 100644 index 0000000..7c0262d --- /dev/null +++ b/output/Letsencrypt/default/_lets_LIST.html.new.ep @@ -0,0 +1,133 @@ +%# +%# Generated by SM2Gen version:0.8 Chameleon version:4.5.4 On Python:3.12.3 at 2024-12-01 15:22:43 +%# +
+ + % if (config->{debug} == 1) { +
+			%= dumper $lets_data
+		
+ % } + % my $btn = l("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. + +
+ + + + %= l("Config") + + %#= link_to l("Config"), "letsencryptd?trt=PARAMS" , class=>"link link2" + + + + %= l("Check_ALL_DOMAINS") + + %#= link_to l("Check_ALL_DOMAINS"), "letsencryptd?trt=CHECKALLDOMAINS" , class=>"link link3" + + + + %= l("Check_ALL_ENABLED_DOMAINS") + + %#= link_to l("Check_ALL_ENABLED_DOMAINS"), "letsencryptd?trt=CHECKALLENABLEDDOMAINS" , class=>"link link4" + + +
+ + +

<%=l("lets_For_this_Server")%>

+ +

+ %=l("lets_Internal_IP") + + % param "InternalIP" => $lets_data->{InternalIP} unless param "InternalIP"; + %= text_field "InternalIP", size => "50", class => "textinput InternalIP" , pattern=>".*" , placeholder=>"InternalIP", Readonly=>"true" +

+ +

+ %=l("lets_External_Interface_IP") + + % param "ExternalIP" => $lets_data->{ExternalIP} unless param "ExternalIP"; + %= text_field "ExternalIP", size => "50", class => "textinput ExternalIP" , pattern=>".*" , placeholder=>"ExternalIP", Readonly=>"true" +

+ +

+ %=l("lets_Internet_IP") + + % param "InternetIP" => $lets_data->{InternetIP} unless param "InternetIP"; + %= text_field "InternetIP", size => "50", class => "textinput InternetIP" , pattern=>".*" , placeholder=>"InternetIP", Readonly=>"true" +

+ +

<%=l("lets_Current_certificate_details")%>

+ +

+ %=l("Issuer") + + % param "Issuer" => $lets_data->{Issuer} unless param "Issuer"; + %= text_field "Issuer", size => "50", class => "textinput Issuer" , pattern=>".*" , placeholder=>"Issuer", Readonly=>"true" +

+ +

+ %=l("Expiry") + + % param "Expiry" => $lets_data->{Expiry} unless param "Expiry"; + %= text_field "Expiry", size => "50", class => "textinput Expiry" , pattern=>".*" , placeholder=>"Expiry", Readonly=>"true" +

+ +

+ %=l("lets_Not_Before") + + % param "NotBefore" => $lets_data->{NotBefore} unless param "NotBefore"; + %= text_field "NotBefore", size => "50", class => "textinput NotBefore" , pattern=>".*" , placeholder=>"NotBefore", Readonly=>"true" +

+ +

<%=l("lets_List_of_Domains_and_Hosts")%>

+ + % my $linkbtn = l "Check"; + +
+ + + + + + + + + + + + + + % my $control_data = $c->stash("DomainList"); + % foreach my $row (@$control_data) { + % my $link = $c->render_to_string(inline=>$row->{"Table1-CHECK"}); + + + + + + + + + % if ($link ne "") { + + % } else { + + % } + + %} + +
<%=l("lets_Domain_name_/_HOSTNAME")%><%=l("lets_Brief_description")%><%=l("Content")%><%=l("lets_LABEL_NAMESERVERS")%><%=l("lets_LABEL_POINT")%><%=l("lets_LABEL_LECERT")%><%=l("lets_IS_IN_CERT")%><%=l("Check")%>
<%=$c->render_to_string(inline=>$row->{"Table1-Domain name / HOSTNAME"})%><%=$c->render_to_string(inline=>$row->{"Table1-Brief description"})%><%=$c->render_to_string(inline=>$row->{"Table1-Content"})%><%=$c->render_to_string(inline=>$row->{"Table1-LABEL_NAMESERVERS"})%><%=$c->render_to_string(inline=>$row->{"Table1-LABEL_POINT"})%><%=$c->render_to_string(inline=>$row->{"Table1-LABEL_LECERT"})%><%=$c->render_to_string(inline=>$row->{"Table1-IS_IN_CERT"})%> <%= $linkbtn %> 
+ + + %# Probably finally by a submit. + %end +
\ No newline at end of file diff --git a/output/Letsencrypt/default/_lets_PARAMS.html.new.ep b/output/Letsencrypt/default/_lets_PARAMS.html.new.ep new file mode 100644 index 0000000..1c8e4a1 --- /dev/null +++ b/output/Letsencrypt/default/_lets_PARAMS.html.new.ep @@ -0,0 +1,98 @@ +%# +%# Generated by SM2Gen version:0.8 Chameleon version:4.5.4 On Python:3.12.3 at 2024-12-01 15:22:43 +%# +
+ + % if (config->{debug} == 1) { +
+			%= dumper $lets_data
+		
+ % } + % my $btn = l("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. + +

<%=l("lets_Manage_letsencrypt-config_settings:")%>

+ +

+ %=l("lets_CONFIG_LETSENCRYPT") +

+ +

+ %=l("lets_SERVICE_STATUS") + + %# my @status_options = [["Disabled" => "disabled"], ["Enabled" => "enabled"], ["TEST" => "test"]]; + % my @status_options = selected_field([["Disabled" => "disabled"], ["Enabled" => "enabled"], ["TEST" => "test"]], $lets_data->{status}); + %# param "status" => $lets_data->{status} unless param "status"; + %= select_field "status" => @status_options, class => "input" +

+ +

+ %=l("lets_HOOKSCRIPT_STATUS") + + % my @hookScript_options = [["Disabled" => "disabled"], ["Enabled" => "enabled"]]; + % param "hookScript" => $lets_data->{hookScript} unless param "hookScript"; + %= select_field "hookScript" => @hookScript_options, class => "input" +

+ +

+ %=l("lets_HOSTOVERRIDE_STATUS") + + % my @hostOverride_options = [["Disabled" => "disabled"], ["Yes" => "yes"]]; + % param "hostOverride" => $lets_data->{hostOverride} unless param "hostOverride"; + %= select_field "hostOverride" => @hostOverride_options, class => "input" +

+ +

+ %=l("lets_ACCEPT_TERMS_STATUS") + + % 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" +

+ +

+ %=l("lets_API_STATUS") + + % my @API_options = [["2" => "2"]]; + % param "API" => $lets_data->{API} unless param "API"; + %= select_field "API" => @API_options, class => "input" +

+ +

+ %=l("lets_KEYSIZE_STATUS") + + % my @keysize_options = [["2048" => "2048"], ["3072" => "3072"], ["4096" => "4096"]]; + % param "keysize" => $lets_data->{keysize} unless param "keysize"; + %= select_field "keysize" => @keysize_options, class => "input" +

+ +

+ %=l("lets_CONFIGUREMODE_STATUS") + + % 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" +

+ +

+ %=l("Email") + + % param "email" => $lets_data->{email} unless param "email"; + %=email_field "email", class => "emai8" +

+ + + + %= submit_button l("Save"), class => "action subm9" + + + %# Probably finally by a submit. + %end +
diff --git a/output/Letsencrypt/letsencrypt_en.lex.diff b/output/Letsencrypt/letsencrypt_en.lex.diff new file mode 100644 index 0000000..e69de29 diff --git a/output/Letsencrypt/letsencrypt_en.lex.new1 b/output/Letsencrypt/letsencrypt_en.lex.new1 new file mode 100644 index 0000000..3a063c6 --- /dev/null +++ b/output/Letsencrypt/letsencrypt_en.lex.new1 @@ -0,0 +1,44 @@ +# +# Lex file for Letsencrypt generated on 2025-07-17 09:52:29 +# +'lets_ACCEPT_TERMS_STATUS' => 'Accept Terms Status', +'lets_All_domains_check_result' => 'All domains check result', +'lets_API_STATUS' => 'API Status', +'lets_Brief_description' => 'Brief description', +'lets_Check_all_domains' => 'Check all domains', +'lets_CHECK_ALL_DOMAINS' => 'Check All Domains', +'lets_Check_all_enabled_domains' => 'Check all enabled domains', +'lets_CHECK_ALL_ENABLED_DOMAINS' => 'Check All Enabled Domains', +'lets_Check_just_one_domain' => 'Check just one domain', +'lets_CHECKALLDOMAINS_panel_action_was_successful' => 'Check all domains panel action was successful', +'lets_CHECKALLENABLEDDOMAINS_panel_action_was_successful' => 'Check all enabled domains panel action was successful', +'lets_CHECKONEDOMAIN_panel_action_was_successful' => 'Check one domain panel action was successful', +'lets_CONFIG_LETSENCRYPT' => 'Configure Letsencrypt', +'lets_CONFIGUREMODE_STATUS' => 'Configure mode Status', +'lets_Current_certificate_details' => 'Current certificate details', +'lets_Domain_name_/_HOSTNAME' => 'Domain name / HOSTNAME', +'lets_Domains_name' => 'Domains name', +'lets_Enabled_domains_check_result' => 'Enabled domains check result', +'lets_Error_Status_Report' => 'Error Status Report', +'lets_External_Interface_IP' => 'External Interface IP', +'lets_For_this_Server' => 'For this Server', +'lets_HOOKSCRIPT_STATUS' => 'Hookscript Status', +'lets_HOSTOVERRIDE_STATUS' => 'Hostoverride Status', +'lets_Internal_IP' => 'Internal IP', +'lets_Internet_IP' => 'Internet IP', +'lets_IS_IN_CERT' => 'Is in certificate', +'lets_KEYSIZE_STATUS' => 'Keysize Status', +'lets_LABEL_LECERT' => 'Label secret', +'lets_LABEL_NAMESERVERS' => 'Label timeservers', +'lets_LABEL_POINT' => 'Label Point', +'lets_Letsencrypt_certificate' => 'Letsencrypt certificate', +'lets_List_of_Domains_and_Hosts' => 'List of Domains and Hosts', +'lets_LIST_panel_action_was_successful' => 'List panel action was successful', +'lets_Loop_through_and_check_the' => 'Loop through and check the letsencrypt status for a specific domain', +'lets_Loop_through_checking_the_letsencrypt' => 'Loop through checking the letsencrypt status for each configured domain which is enabled', +'lets_Manage_letsencrypt-config_settings:' => 'Manage letsencrypt-config settings', +'lets_Not_Before' => 'Not Before', +'lets_One_domain_check_result' => 'One domain check result', +'lets_PARAMS_panel_action_was_successful' => 'Parameter panel action was successful', +'lets_SERVICE_STATUS' => 'Service Status', +'lets_Status_Report' => 'Status Report', diff --git a/output/Localnetworks/localnetworks_en.lex.diff b/output/Localnetworks/localnetworks_en.lex.diff new file mode 100644 index 0000000..03cf91e --- /dev/null +++ b/output/Localnetworks/localnetworks_en.lex.diff @@ -0,0 +1,7 @@ +'ln_DEFAULT' => 'default', +'ln_extra' => '[_1]/[_2] via router $networkRouter}.', +'ln_NETWORK_ADDRESS' => 'Network address', +'ln_NO_ADDITIONAL_NETWORKS' => 'No additional networks', +'ln_REMOVE_CONFIRM' => 'Are you sure you wish to remove this network?', +'ln_SUCCESS' => 'Successfully added network [_1]/[_2] via router [_3].', +'Local networks' => 'Local networks', diff --git a/output/Localnetworks/localnetworks_en.lex.new1 b/output/Localnetworks/localnetworks_en.lex.new1 new file mode 100644 index 0000000..af65f74 --- /dev/null +++ b/output/Localnetworks/localnetworks_en.lex.new1 @@ -0,0 +1,34 @@ +# +# Lex file for Localnetworks generated on 2025-07-17 09:52:32 +# +'ln_ADD_DESC' => 'Each parameter must be in the form #.#.#.# (each # is a number from 0 to 255). The server software will zero out the ending (host identifier) part of the network address according to the subnet mask, to ensure that the network address is valid.

"Router" should be the IP address of the router on your local network via which the additional network is reached.', +'ln_ADD_TITLE' => 'Add a local network ', +'ln_DEFAULT' => 'default', +'ln_ERROR_CREATING_NETWORK' => 'Error occurred while creating network.', +'ln_ERROR_DELETING_NETWORK' => 'Error occurred while deleting network.', +'ln_extra' => '[_1]/[_2] via router $networkRouter}.', +'ln_Failed to find network in Db' => 'Failed to find network in Db', +'ln_FIRSTPAGE_DESC' => 'For security reasons, several services on your server are available only to your local network. However you can grant these local access privileges to additional networks by listing them below. Most installations should leave this list empty.', +'ln_INVALID_IP_ADDRESS' => 'Invalid IP address - [_1]', +'ln_INVALID_SUBNET_MASK' => 'Invalid subnet mask', +'ln_LOCAL NETWORKS' => 'Local networks', +'ln_LOCALNETWORK_ADD' => 'Add network', +'ln_NETWORK_ADDRESS' => 'Network address', +'ln_NETWORK_ALREADY_ADDED' => 'Error: network [_1] (derived from network [_1] and subnet mask [_2]) has already been added. Did not add new network.', +'ln_NETWORK_ALREADY_LOCAL' => ' Error: network [_1] (derived from network [_1] and subnet mask [_2]) is already considered local. Did not add new network. ', +'ln_NO_ADDITIONAL_NETWORKS' => 'No additional networks', +'ln_NO_SUCH_NETWORK' => 'Network not found in network db', +'ln_NOT_ACCESSIBLE_FROM_LOCAL_NETWORK' => 'Error: router address [_3] is not accessible from local network. Did not add network.', +'ln_NUMBER_OF_HOSTS' => 'Number of hosts', +'ln_REMOVE_CONFIRM' => 'Are you sure you wish to remove this network?', +'ln_REMOVE_DESC' => 'You are about to remove the following local network.', +'ln_REMOVE_HOSTS_DESC' => 'Local hosts configured on the network you are about to remove have been detected. By default, they will also be removed. Uncheck this box if, for some reason, you do not wish this to happen. Note that they will not be treated as local, and may not even be reachable, after this network is removed. ', +'ln_REMOVE_HOSTS_LABEL' => 'Remove hosts on network', +'ln_REMOVE_TITLE' => 'Remove local network', +'ln_SUBNET_MASK' => 'Subnet mask', +'ln_SUCCESS' => 'Successfully added network [_1]/[_2] via router [_3].', +'ln_SUCCESS_NETWORK_RANGE' => 'Successfully added network [_1]/[_2] via router [_3]. Your server will grant local access privileges to [_4] IP addresses in the range [_5] to [_6]. ', +'ln_SUCCESS_NONSTANDARD_RANGE' => '

Successfully added network [_1]/[_2] via router [_3].

Your server will grant local access privileges to [_4] IP addresses in the range [_5] to [_6].

Warning: the ProFTPd FTP server cannot handle this nonstandard subnet mask. The simpler specification [_7] will be used instead.

', +'ln_SUCCESS_REMOVED_NETWORK' => 'Successfully removed network [_1]/[_2] via router [_3].', +'ln_SUCCESS_SINGLE_ADDRESS' => 'Successfully added network [_1]/[_2] via router [_3]. Your server will grant local access privileges to the single IP address [_1]. ', +'Local networks' => 'Local networks', diff --git a/output/Nutups/AdminLTE/_nut_CONFIG.html.new.ep b/output/Nutups/AdminLTE/_nut_CONFIG.html.new.ep new file mode 100644 index 0000000..b8aea01 --- /dev/null +++ b/output/Nutups/AdminLTE/_nut_CONFIG.html.new.ep @@ -0,0 +1,232 @@ +%# +%# Generated by SM2Gen version:0.9(20Jan2025) Chameleon version:4.5.4 On Python:3.12.3 at 2025-01-20 16:21:33 +%# +
+ + + + % if (config->{debug} == 1) { +
+            %= dumper $nut_data
+        
+ % } + + +
+ + %# Inputs etc in here. + + + +

<%=l("nut_Manage_Nutups-config_settings:")%>

+ +
+ +
+
+ <%= l ("nut_Nut_status") %> +
+
+ %# my @status_options = [["Disabled" => "disabled"], ["Enabled" => "enabled"]]; + %# param "status" => $nut_data->{status} unless param "status"; + + % my @status_options = selected_field([["Disabled" => "disabled"], ["Enabled" => "enabled"]], $nut_data->{status}); + <%= select_field "status" => @status_options, class => "form-select", id => "status_select" %> +
+
+ +
+ +
+
+ <%= l ("nut_Nut_mode") %> +
+
+ % my @Nutmode_options = [["Standalone" => "standalone"], ["Net Server" => "netserver"], ["Net Client " => "netclient"]]; + % param "Nutmode" => $nut_data->{Nutmode} unless param "Nutmode"; + <%= select_field "Nutmode" => @Nutmode_options, class => "input form-select", id => "Nutmode_select" %> +
+
+ +

+ +
+
+ +

<%=l("nut_if_Net_Server")%>

+ +
+ +
+
+ +
+
+ % param "MasterUPS_Name" => $nut_data->{MasterUPS_Name} unless param "MasterUPS_Name"; + <%= "ups@". $nut_data->{"localip"} %> +
+
+ +
+
+ <%= l ("nut_SlaveUPS_User") %> +
+
+ <%= "upssecondary" %> +
+
+ +
+
+ %=l("nut_SlaveUPS_Password") +
+
+ <%= $nut_data->{"SlaveUPS_Pass"}%> +
+
+ +
+ +
+ +
+ +
+ +

<%= l ("nut_UPS_Device") %>

+ +
+ +
+
+ +
+
+ % my @UPS_Model_options = $c->get_model_options(); + % param "UPS_Model" => $nut_data->{UPS_Model} unless param "UPS_Model"; + <%= select_field "UPS_Model" => \@UPS_Model_options, class => "form-select", id => "UPS_Model_select" %> +
+
+ +
+ +
+
+ +
+
+ % param "UPS_Device" => $nut_data->{UPS_Device} unless param "UPS_Device"; + +
+
+
+ +
+ +
+ +

<%=l("nut_if_Net_Client")%>

+ +
+ +
+
+ +
+
+ % param "ClientUPS_Name" => $nut_data->{ClientUPS_Name} unless param "ClientUPS_Name"; + +
+
+ +
+ +
+
+ +
+
+ % param "ClientUPS_User" => $nut_data->{ClientUPS_User} unless param "ClientUPS_User"; + +
+
+ +
+ +
+
+ +
+
+ % param "ClientUPS_Pass" => $nut_data->{ClientUPS_Pass} unless param "ClientUPS_Pass"; + +
+
+ +
+ +
+
+ +

+ +
+ +

<%=l("nut_if_genericups")%>

+ +

+ +
+
+ +
+
+ % param "UPS_gen_Type" => $nut_data->{UPS_gen_Type} unless param "UPS_gen_Type"; + +
+
+ +
+ +
+
+ +
+
+ % param "UPS_gen_Mfr" => $nut_data->{UPS_gen_Mfr} unless param "UPS_gen_Mfr"; + +
+
+ +
+ +
+
+ +
+
+ % param "UPS_gen_Model" => $nut_data->{UPS_gen_Model} unless param "UPS_gen_Model"; + +
+
+ +
+ +
+ + % param "trt" => $nut_data->{trt} unless param "trt"; + <%= hidden_field "trt" => $nut_data->{trt} %> + + % my $btn = l ("Save"); + +
+
+ +
+
+ +
+ +
+ +
\ No newline at end of file diff --git a/output/Nutups/AdminLTE/_nut_STATUS.html.new.ep b/output/Nutups/AdminLTE/_nut_STATUS.html.new.ep new file mode 100644 index 0000000..ad9b258 --- /dev/null +++ b/output/Nutups/AdminLTE/_nut_STATUS.html.new.ep @@ -0,0 +1,60 @@ +%# +%# Generated by SM2Gen version:0.9(20Jan2025) Chameleon version:4.5.4 On Python:3.12.3 at 2025-01-20 16:21:33 +%# +
+ + + + % if (config->{debug} == 1) { +
+            <%= dumper $nut_data %>
+        
+ % } + + % my $btn = l("Apply"); + +
+ % param "trt" => $nut_data->{trt} unless param "trt"; + <%= hidden_field "trt" => $nut_data->{trt} %> + + %# Inputs etc in here. + +
+ + <%= l ("nut_Configure_NutUPS") %> + +
+ +
+ +

<%= l ("nut_Status_of_the_controlled_UPS")%>

+ +
+ <%= l ("nut_Descriptive_paragraph") %> +
+ +
+ + + + <%= include "partials/_nut_UPS_STATUS" %> + + %# Probably finally by a submit. +
+ +
diff --git a/output/Nutups/default/_nut_CONFIG.html.new.ep b/output/Nutups/default/_nut_CONFIG.html.new.ep new file mode 100644 index 0000000..d97b57c --- /dev/null +++ b/output/Nutups/default/_nut_CONFIG.html.new.ep @@ -0,0 +1,136 @@ +%# +%# Generated by SM2Gen version:0.9(20Jan2025) Chameleon version:4.5.4 On Python:3.12.3 at 2025-01-20 16:21:33 +%# +
+ + % if (config->{debug} == 1) { +
+            %= dumper $nut_data
+        
+ % } + % my $btn = l("Apply"); + %= form_for "nutupsu" => (method => "POST") => (autocomplete => "off" ) => begin + % param "trt" => $nut_data->{trt} unless param "trt"; + %= hidden_field "trt" => $nut_data->{trt} + %# Inputs etc in here. + +

<%=l("nut_Manage_Nutups-config_settings:")%>

+ +

+ %=l("nut_Nut_status") + + %# my @status_options = [["Disabled" => "disabled"], ["Enabled" => "enabled"]]; + %# param "status" => $nut_data->{status} unless param "status"; + + % my @status_options = selected_field([["Disabled" => "disabled"], ["Enabled" => "enabled"]], $nut_data->{status}); + %= select_field "status" => @status_options, class => "input", id => "status_select" +

+ +

+ %=l("nut_Nut_mode") + + % my @Nutmode_options = [["Standalone" => "standalone"], ["Net Server" => "netserver"], ["Net Client " => "netclient"]]; + % param "Nutmode" => $nut_data->{Nutmode} unless param "Nutmode"; + %= select_field "Nutmode" => @Nutmode_options, class => "input", id => "Nutmode_select" +

+ +
+
+

<%=l("nut_if_Net_Server")%>

+

+ %=l("nut_MasterUPS_UPSNAME@IP") + + % param "MasterUPS_Name" => $nut_data->{MasterUPS_Name} unless param "MasterUPS_Name"; + %= "ups@". $nut_data->{"localip"} +

+ +

+ %=l("nut_SlaveUPS_User") + + %= "upssecondary" +

+ +

+ %=l("nut_SlaveUPS_Password") + + <%= $nut_data->{"SlaveUPS_Pass"}%> +

+
+
+

<%= l ("nut_UPS_Device") %>

+

+ %=l("nut_UPS_Model") + + % my @UPS_Model_options = $c->get_model_options(); + % param "UPS_Model" => $nut_data->{UPS_Model} unless param "UPS_Model"; + %= select_field "UPS_Model" => \@UPS_Model_options, class => "input", id => "UPS_Model_select" +

+ +

+ %=l("nut_UPS_Device") + + % param "UPS_Device" => $nut_data->{UPS_Device} unless param "UPS_Device"; + %= text_field "UPS_Device", size => "50", class => "textinput UPS_Device" , pattern=>".*" , placeholder=>"auto (for usb)" +

+
+
+ +
+

<%=l("nut_if_Net_Client")%>

+

+ %=l("nut_SlaveUPS_UPSNAME@IP") + + % param "ClientUPS_Name" => $nut_data->{ClientUPS_Name} unless param "ClientUPS_Name"; + %= text_field "ClientUPS_Name", size => "50", class => "textinput ClientUPS_Name" , pattern=>".*" , placeholder=>"upsname@IP[:port]" +

+ +

+ %=l("nut_ClientUPS_Username") + + % param "ClientUPS_User" => $nut_data->{ClientUPS_User} unless param "ClientUPS_User"; + %=text_field "ClientUPS_User", class => "textinput" +

+ +

+ %=l("nut_ClientUPS_Password") + + % param "ClientUPS_Pass" => $nut_data->{ClientUPS_Pass} unless param "ClientUPS_Pass"; + %=password_field "ClientUPS_Pass", class => "pass4 sme-password", autocomplete => "off" +

+
+ +
+

<%=l("nut_if_genericups")%>

+

+ %=l("nut_UPS_Generic_Type") + + % param "UPS_gen_Type" => $nut_data->{UPS_gen_Type} unless param "UPS_gen_Type"; + %= text_field "UPS_gen_Type", size => "50", class => "textinput UPS_gen_Type" , pattern=>".*" , placeholder=>"UPS_gen_Type" +

+ +

+ %=l("nut_UPS_Generic_Manufacturer") + + % param "UPS_gen_Mfr" => $nut_data->{UPS_gen_Mfr} unless param "UPS_gen_Mfr"; + %= text_field "UPS_gen_Mfr", size => "50", class => "textinput UPS_gen_Mfr" , pattern=>".*" , placeholder=>"UPS_gen_Mfr" +

+ +

+ %=l("nut_UPS_Generic_Model") + + % param "UPS_gen_Model" => $nut_data->{UPS_gen_Model} unless param "UPS_gen_Model"; + %= text_field "UPS_gen_Model", size => "50", class => "textinput UPS_gen_Model" , pattern=>".*" , placeholder=>"UPS_gen_Model" +

+
+ + + %= submit_button l("Save"), class => "action subm12" + + + %# Probably finally by a submit. + %end +
\ No newline at end of file diff --git a/output/Nutups/default/_nut_STATUS.html.new.ep b/output/Nutups/default/_nut_STATUS.html.new.ep new file mode 100644 index 0000000..95b7e45 --- /dev/null +++ b/output/Nutups/default/_nut_STATUS.html.new.ep @@ -0,0 +1,83 @@ +%# +%# Generated by SM2Gen version:0.9(20Jan2025) Chameleon version:4.5.4 On Python:3.12.3 at 2025-01-20 16:21:33 +%# +
+ + % if (config->{debug} == 1) { +
+			%= dumper $nut_data
+		
+ % } + % my $btn = l("Apply"); + %= form_for "nutupsu" => (method => "POST") => begin + % param "trt" => $nut_data->{trt} unless param "trt"; + %= hidden_field "trt" => $nut_data->{trt} + %# Inputs etc in here. + +
+ + + + %= l("nut_Configure_NutUPS") + + %#= link_to l("nut_Configure_NutUPS"), "nutupsd?trt=CONFIG" , class=>"link link1" + + +
+ + +

<%=l("nut_Status_of_the_controlled_UPS")%>

+ +

+ %=l("nut_Descriptive_paragraph") +

+
+ + + + + + %=l("nut_Nut_mode") + + %= $nut_data->{Nutmode} +
+ + % if ($nut_data->{Nutmode} eq "nutserver") { +
+

+ %=l("nut_MasterUPS_UPSNAME@IP") + + % param "MasterUPS_Name" => $nut_data->{MasterUPS_Name} unless param "MasterUPS_Name"; + %= "ups@". $nut_data->{"localip"} +

+ +

+ %=l("nut_SlaveUPS_User") + + %= "upssecondary" +

+ +

+ %=l("nut_SlaveUPS_Password") + + <%= $nut_data->{"SlaveUPS_Pass"}%> +

+
+ % } + + %= include "partials/_nut_UPS_STATUS" + + %# Probably finally by a submit. + %end +
\ No newline at end of file diff --git a/output/Nutups/nutups_en.lex.diff b/output/Nutups/nutups_en.lex.diff new file mode 100644 index 0000000..e69de29 diff --git a/output/Nutups/nutups_en.lex.new1 b/output/Nutups/nutups_en.lex.new1 new file mode 100644 index 0000000..04bf0e1 --- /dev/null +++ b/output/Nutups/nutups_en.lex.new1 @@ -0,0 +1,30 @@ +# +# Lex file for Nutups generated on 2025-07-17 09:52:27 +# +'nut_ClientUPS_Password' => 'Client UPS password', +'nut_ClientUPS_Username' => 'Client UPS username', +'nut_CONFIG_panel_action_was_successful' => 'CONFIG panel action was successful', +'nut_Configure_NutUPS' => 'Configure NutUPS', +'nut_Descriptive_paragraph' => 'You can use your UPS connected directly to your server in a standalone mode or you can act as a Primary whereby other servers can also react to the status of your connected UPS, or you can connect to another server as a Secondary and react to the status of the UPS connected to that server.', +'nut_Error_Status_Report' => 'Error Status Report', +'nut_if_genericups' => 'Generic UPS details', +'nut_if_Net_Client' => 'Net Client details', +'nut_if_Net_Server' => 'Net Server details', +'nut_Manage_Nutups-config_settings:' => 'Manage Nutups configuration settings', +'nut_MasterUPS_Password' => 'Local server password', +'nut_MasterUPS_UPSNAME@IP' => 'UPS name@localhost', +'nut_Nut_mode' => 'Nut mode', +'nut_Nut_status' => 'Nut status', +'nut_NutUPS_configuration' => 'NutUPS configuration', +'nut_SlaveUPS_Password' => 'Secondary->Primary ->Server', +'nut_SlaveUPS_UPSNAME@IP' => 'Secondary->Primary UPSNAME@IP', +'nut_SlaveUPS_User' => 'Secondary UPS user', +'nut_Status_(from_upsc)' => 'Status (from running upsc)', +'nut_Status_of_the_controlled_UPS' => 'Status of the controlled UPS', +'nut_STATUS_panel_action_was_successful' => 'STATUS panel action was successful', +'nut_Status_Report' => 'Status Report', +'nut_UPS_Device' => 'UPS Device', +'nut_UPS_Generic_Manufacturer' => 'UPS Generic Manufacturer', +'nut_UPS_Generic_Model' => 'UPS Generic Model', +'nut_UPS_Generic_Type' => 'UPS Generic Type', +'nut_UPS_Model' => 'UPS Model', diff --git a/output/Portforwarding/AdminLTE/_pf_add.html.new.ep b/output/Portforwarding/AdminLTE/_pf_add.html.new.ep new file mode 100644 index 0000000..9d46ceb --- /dev/null +++ b/output/Portforwarding/AdminLTE/_pf_add.html.new.ep @@ -0,0 +1,122 @@ +
+ + % my $retref = $c->stash("ret"); + % my %ret = $retref ? %$retref : (ret => ""); + % my @vars = split(/,/, $ret{vars} // ""); + % my ($var1, $var2, $var3, $var4, $var5, $var6, $var7) = @vars; + +
+ + % if (config->{debug} == 1) { +
+        <%= dumper $c->current_route %>
+        <%= dumper $c->stash("ret") %>
+    
+ % } + + % if ($ret{"ret"} eq "") { +
+ <%= $c->render_to_string(inline => l("pf_FIRST_PAGE_DESCRIPTION")); %> +
+ % } elsif (index($ret{ret},"SUCCESS") != -1) { +
+ + <%= $c->render_to_string(inline => l($ret{ret}, @vars[0..6])) %> +
+ % } else { +
+ + <%= $c->render_to_string(inline => l($ret{ret}, @vars[0..6])) %> +
+ % } + +
+ +

<%= l "pf_CREATE_RULE" %>

+ +
+ +
+
+ <%= l "pf_SUMMARY_ADD_DESC" %> +
+ +
+ +
+
+ <%= l "Protocol" %> +
+
+ <%=select_field "proto"=>["TCP","UDP"], class => "form-select" %> +
+
+ +
+ +
+
+ +
+
+ +
+
+ +
+ +
+
+ +
+
+ +
+
+ +
+ +
+
+ +
+
+ +
+
+ +
+ +
+
+ +
+
+ +
+
+ +
+ +
+
+ +
+
+ +
+
+ +
+ + % my $btn = l("ADD"); + + +
+
+ +
+
+
+ +
\ No newline at end of file diff --git a/output/Portforwarding/AdminLTE/_pf_del.html.new.ep b/output/Portforwarding/AdminLTE/_pf_del.html.new.ep new file mode 100644 index 0000000..bc4ce8f --- /dev/null +++ b/output/Portforwarding/AdminLTE/_pf_del.html.new.ep @@ -0,0 +1,98 @@ +
+ + % my $proto = $pf_datas->{proto}; + % my $sport = $pf_datas->{sport}; + % my $dport = $pf_datas->{dport}; + % my $dhost = $pf_datas->{dhost}; + % my $cmmnt = $pf_datas->{cmmnt}; + % my $allow = $pf_datas->{allow}; + + % if (config->{debug} == 1) { +
+            <%= dumper $c->current_route %>
+            <%= dumper $c->stash("ret") %>
+            <%= dumper %$pf_datas %>
+        
+ % } + +
+ +
+
+ <%= l "pf_SUMMARY_REMOVE_DESC" %> +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
  
+ <%= l "Protocol" %> + + <%= $proto %> +
+ <%= l "pf_LABEL_SOURCE_PORT" %> + + <%= $sport %> +
+ <%= l "pf_LABEL_DESTINATION_HOST" %> + + <%= $dport %> +
+ <%= l "pf_LABEL_DESTINATION_PORT" %> + + <%= $dhost %> +
+ <%= l "pf_RULE_COMMENT" %> + + <%= $cmmnt %> +
+ <%= l "pf_ALLOW_HOSTS" %> + + <%= $allow %> +
+ +
+ + <%= hidden_field sport=>$sport %> + <%= hidden_field proto=>$proto %> + + % my $btn = l("REMOVE"); + +
+
+ +
+
+
+ +
diff --git a/output/Portforwarding/AdminLTE/_pf_list.html.new.ep b/output/Portforwarding/AdminLTE/_pf_list.html.new.ep new file mode 100644 index 0000000..c02e192 --- /dev/null +++ b/output/Portforwarding/AdminLTE/_pf_list.html.new.ep @@ -0,0 +1,111 @@ +
+ + % my $retref = $c->stash("ret"); + % my %ret = $retref ? %$retref : (ret => ""); + % my @vars = split(/,/, $ret{vars} // ""); + % my ($var1, $var2, $var3, $var4, $var5, $var6, $var7) = @vars; + + % my $numtcpforwards = @$tcpforwards; + % my $numudpforwards = @$udpforwards; + + % if ($c->app->config->{debug}) { +
+            <%= dumper { ret_data => \%ret } %>
+        
+ % } + + % if ($ret{ret} eq "") { +
+ <%= $c->render_to_string(inline => l("pf_FIRST_PAGE_DESCRIPTION")); %> +
+ % } elsif (index($ret{ret},"SUCCESS") != -1) { + +
+

Operation Status Report

+ <%= $c->render_to_string(inline => l($ret{ret}, @vars[0..6])) %> +
+ % } else { +
+
+

Operation Status Report - Error

+ <%= $c->render_to_string(inline => l($ret{ret}, @vars[0..6])) %> +
+ % } + +
+ +
+ + % my $btn = l("pf_CREATE_RULE"); + +
+
+ +
+
+ +
+ +
+ + % if ($empty) { +
+ <%= l "pf_NO_FORWARDS" %> + % } else { +
+ <%= l "pf_SHOW_FORWARDS" %> +

+ + + + + + + + + + + + + + % my %forwards = (); + % $forwards{TCP} = $tcpforwards; + % $forwards{UDP} = $udpforwards; + + % foreach my $proto (sort keys %forwards) { + + % if (@{ $forwards{$proto} }) { + % foreach my $entry (@{ $forwards{$proto} }) { + + % my $sport = $entry->key; + % my $dhost = $entry->prop("DestHost"); + % my $dport = $entry->prop("DestPort") || ""; + % my $cmmnt = $entry->prop("Comment") || ""; + % my $allow = $entry->prop("AllowHosts") || ""; + + + + + + + % my $remove_text = l("REMOVE"); # Localized text + % my $csrf_token = "TOKEN"; # CSRF token for security + % my $actionRemove = qq{ + % + % + % + % }; + + + + % } + % } + % } + % } + +
<%= l "Protocol" %><%= l "pf_LABEL_SOURCE_PORT" %><%= l "pf_LABEL_DESTINATION_HOST" %><%= l "pf_LABEL_DESTINATION_PORT" %><%= l "pf_ALLOW_HOSTS" %><%= l "pf_RULE_COMMENT" %><%= l "ACTION" %>
<%= $proto %><%= $sport %><%= $dhost %><%= $dport %><%= $allow %><%= $cmmnt %><%= $c->render_to_string(inline => $actionRemove) %>
+ <%= hidden_field "trt" => $pf_datas->{trt} %> + +
diff --git a/output/Portforwarding/default/_pf_add.html.new.ep b/output/Portforwarding/default/_pf_add.html.new.ep new file mode 100644 index 0000000..0fa0e9c --- /dev/null +++ b/output/Portforwarding/default/_pf_add.html.new.ep @@ -0,0 +1,85 @@ +
+ + % my $retref= $c->stash("ret"); + % my %ret = $retref ? %$retref : (ret => ""); + % my @vars = split(/,/, $ret{vars} // ""); + % my ($var1, $var2, $var3, $var4, $var5, $var6, $var7) = @vars; + + % if ($c->app->config->{debug}) { +
+		%= dumper { ret_data => \%ret }
+	
+ % } + + % if ($ret{ret} eq "") { + + % } elsif (index($ret{ret},"SUCCESS") != -1) { +
+
+ %= $c->render_to_string(inline => l($ret{ret}, @vars[0..6])) +
+ % } else { +
+
+ %= $c->render_to_string(inline => l($ret{ret}, @vars[0..6])) +
+ % } +
+ % my $btn = l("ADD"); + + % if (config->{debug} == 1) { + + %= dumper $c->current_route + %= dumper $c->stash("ret") + + % } + + %= form_for "/portforwardingb" => (method => "POST") => begin +

+ %=l "pf_CREATE_RULE" +

+

+ %=l "pf_SUMMARY_ADD_DESC" +


+ + %=l "Protocol" + + %=select_field "proto"=>["TCP","UDP"] +

+ + %=l "pf_LABEL_SOURCE_PORT" + + %=text_field "sport" +

+ + %=l "pf_LABEL_DESTINATION_PORT" + + + %=text_field "dport" +

+ + %=l "pf_LABEL_DESTINATION_HOST" + + + %=text_field "dhost" +

+ + %=l "pf_ALLOW_HOSTS" + + + %=text_field "allow" +

+ + %=l "pf_RULE_COMMENT" + + + %=text_field "cmmnt" +

+

+
+ %= submit_button "$btn", class => "action" +

+ + %end + +
\ No newline at end of file diff --git a/output/Portforwarding/default/_pf_del.html.new.ep b/output/Portforwarding/default/_pf_del.html.new.ep new file mode 100644 index 0000000..439934f --- /dev/null +++ b/output/Portforwarding/default/_pf_del.html.new.ep @@ -0,0 +1,66 @@ +
+ + % my $btn = l("REMOVE"); + % my $proto = $pf_datas->{proto}; + % my $sport = $pf_datas->{sport}; + % my $dport = $pf_datas->{dport}; + % my $dhost = $pf_datas->{dhost}; + % my $cmmnt = $pf_datas->{cmmnt}; + % my $allow = $pf_datas->{allow}; + + % if (config->{debug} == 1) { +
+	%= dumper $c->current_route
+	%= dumper $c->stash("ret")
+    %= dumper %$pf_datas
+	
+ % } + + %= form_for "/portforwardinge" => (method => "POST") => begin +
+ %= l "pf_SUMMARY_REMOVE_DESC" +


+ + %=l "Protocol" + + %=$proto +

+ + %=l "pf_LABEL_SOURCE_PORT" + + %=$sport +

+ + %=l "pf_LABEL_DESTINATION_HOST" + + + %=$dport +

+ + %=l "pf_LABEL_DESTINATION_PORT" + + + %=$dhost +

+ + %=l "pf_RULE_COMMENT" + + + %=$cmmnt +

+ + %=l "pf_ALLOW_HOSTS" + + + %=$allow +

+ %#} + %= hidden_field sport=>$sport + %= hidden_field proto=>$proto +
+ %= submit_button "$btn", class => "action" +

+ + %end + +
\ No newline at end of file diff --git a/output/Portforwarding/default/_pf_list.html.new.ep b/output/Portforwarding/default/_pf_list.html.new.ep new file mode 100644 index 0000000..8c0011b --- /dev/null +++ b/output/Portforwarding/default/_pf_list.html.new.ep @@ -0,0 +1,116 @@ +
+ % my $btn = l("pf_CREATE_RULE"); + %= form_for "/portforwardinga" => (method => "POST") => begin + + % my $numtcpforwards = @$tcpforwards; + % my $numudpforwards = @$udpforwards; + + % my $retref= $c->stash("ret"); + % my %ret = $retref ? %$retref : (ret => ""); + % my @vars = split(/,/, $ret{vars} // ""); + % my ($var1, $var2, $var3, $var4, $var5, $var6, $var7) = @vars; + + % if ($c->app->config->{debug}) { +
+		%= dumper { ret_data => \%ret }
+	
+ % } + + % if ($ret{ret} eq "") { + %=l "pf_FIRST_PAGE_DESCRIPTION" + % } elsif (index($ret{ret},"SUCCESS") != -1) { +
+
+ %= $c->render_to_string(inline => l($ret{ret}, @vars[0..6])) +
+ % } else { +
+
+ %= $c->render_to_string(inline => l($ret{ret}, @vars[0..6])) +
+ % } +
+ + +

+
+ %= submit_button "$btn", class => "action" +

+ + + % end + + % if ($empty){ +
+ %=l "pf_NO_FORWARDS" + % } else { +
+ %=l "pf_SHOW_FORWARDS" +

+ + + + + + + + + + + + % my %forwards = (); + % $forwards{TCP} = $tcpforwards; + % $forwards{UDP} = $udpforwards; + + % foreach my $proto (sort keys %forwards) { + + % if (@{ $forwards{$proto} }) { + % foreach my $entry (@{ $forwards{$proto} }) { + + % my $sport = $entry->key; + % my $dhost = $entry->prop("DestHost"); + % my $dport = $entry->prop("DestPort") || ""; + % my $cmmnt = $entry->prop("Comment") || ""; + % my $allow = $entry->prop("AllowHosts") || ""; + %= t td => (class => "sme-border") => $proto + %= t td => (class => "sme-border") => $sport + %= t td => (class => "sme-border") => $dhost + %= t td => (class => "sme-border") => $dport + %= t td => (class => "sme-border") => $allow + %= t td => (class => "sme-border") => $cmmnt + + + % } + % } + %} + %} + +
+ %=l "Protocol" + + %=l "pf_LABEL_SOURCE_PORT" + + %=l "pf_LABEL_DESTINATION_HOST" + + %=l "pf_LABEL_DESTINATION_PORT" + + %=l "pf_ALLOW_HOSTS" + + %=l "pf_RULE_COMMENT" + + %=l "ACTION" +
+ %my $remove_text = l("REMOVE"); # Localized text + %my $csrf_token = "TOKEN"; # CSRF token for security + %my $actionRemove = qq{ + % + % + % + %}; + <%= $c->render_to_string(inline => $actionRemove) %> +
+ %= hidden_field "trt" => $pf_datas->{trt} + +
\ No newline at end of file diff --git a/output/Portforwarding/portforwarding_en.lex.diff b/output/Portforwarding/portforwarding_en.lex.diff new file mode 100644 index 0000000..450a333 --- /dev/null +++ b/output/Portforwarding/portforwarding_en.lex.diff @@ -0,0 +1,14 @@ +'pf_CREATE_PAGE_DESCRIPTION' => 'Select the protocol, the port you wish to forward, the + destination host, and the port on the destination host + that you wish to forward to. If you wish to specify a port + range, enter the lower and upper boundaries separated by a + hyphen. The destination port may be left blank, which will + instruct the firewall to leave the source port + unaltered', +'pf_ERR_CANNOT_REMOVE_NORULE' => 'Cannot remove non-existant rule.', +'pf_ERR_DUPRULE' => 'This rule has already been added, it cannot be added twice.', +'pf_ERR_NO_MASQ_RECORD' => 'Cannot retrieve masq record from the configuration database.', +'pf_ERR_UNSUPPORTED_MODE' => 'Unsupported mode.', +'pf_LABEL_ALLOW_HOSTS' => 'Allow Hosts', +'pf_LABEL_RULE_COMMENT' => 'Rule Comment', +'Port forwarding' => 'Port forwarding', diff --git a/output/Portforwarding/portforwarding_en.lex.new1 b/output/Portforwarding/portforwarding_en.lex.new1 new file mode 100644 index 0000000..6100641 --- /dev/null +++ b/output/Portforwarding/portforwarding_en.lex.new1 @@ -0,0 +1,55 @@ +# +# Lex file for Portforwarding generated on 2025-07-17 09:52:32 +# +'pf_ALLOW_HOSTS' => 'Allow Hosts', +'pf_CREATE_PAGE_DESCRIPTION' => 'Select the protocol, the port you wish to forward, the + destination host, and the port on the destination host + that you wish to forward to. If you wish to specify a port + range, enter the lower and upper boundaries separated by a + hyphen. The destination port may be left blank, which will + instruct the firewall to leave the source port + unaltered', +'pf_CREATE_RULE' => 'Create portforwarding rule', +'pf_ERR_BADAHOST' => 'This does not appear to be a valid IP address list. + ie: 192.168.0.1,192.168.1.1/24', +'pf_ERR_BADIP' => 'This does not appear to be an IP address. You must use + dotted-quad notation, and each of the four numbers should be less + than 256. ie: 192.168.0.5', +'pf_ERR_BADPORT' => 'The ports must be a positive integer less than 65536.', +'pf_ERR_CANNOT_REMOVE_NORULE' => 'Cannot remove non-existant rule.', +'pf_ERR_DUPRULE' => 'This rule has already been added, it cannot be added twice.', +'pf_ERR_NO_MASQ_RECORD' => 'Cannot retrieve masq record from the configuration database.', +'pf_ERR_NONZERO_RETURN_EVENT' => 'Event returned a non-zero return value.', +'pf_ERR_PORT_COLLISION' => 'ERROR: This port or port range conflicts with an existing + rule. Please modify this new rule, or remove the old rule.', +'pf_ERR_UNSUPPORTED_MODE' => 'Unsupported mode.', +'pf_FIRST_PAGE_DESCRIPTION' => 'You can use this panel to modify your firewall rules so + as to open a specific port on this server and forward it + to another port on another host. Doing so will permit + incoming traffic to directly access a private host on + your LAN. + WARNING: Misuse of this feature can seriously compromise the + security of your network. Do not use this feature + lightly, or without fully understanding the implications + of your actions.', +'pf_FORM_TITLE' => 'Configure Port Forwarding', +'pf_IN_SERVERONLY' => 'This server is currently in serveronly mode and portforwarding + is possible only to localhost.', +'pf_LABEL_ALLOW_HOSTS' => 'Allow Hosts', +'pf_LABEL_DESTINATION_HOST' => 'Destination Host IP Address', +'pf_LABEL_DESTINATION_PORT' => 'Destination Port(s)', +'pf_LABEL_RULE_COMMENT' => 'Rule Comment', +'pf_LABEL_SOURCE_PORT' => 'Source Port(s)', +'pf_NO_FORWARDS' => 'There are currently no forwarded ports on the system.', +'pf_RULE_COMMENT' => 'Rule Comment', +'pf_SHOW_FORWARDS' => 'Below you will find a table summarizing the current + port-forwarding rules installed on this server. Click on the + "Remove" link to remove the corresponding rule.', +'pf_SUCCESS' => 'Your change to the port forwarding rules has been successfully saved.', +'pf_SUMMARY_ADD_DESC' => 'The following summarizes the port-forwarding rule + that you are about to add. If you are satisfied with the rule, + click the "Add" button.', +'pf_SUMMARY_REMOVE_DESC' => 'The following summarizes the port-forwarding rule + that you are about to remove. If you are sure you want to + remove the rule, click the "Remove" button.', +'Port forwarding' => 'Port forwarding', diff --git a/output/Printers/printers_en.lex.diff b/output/Printers/printers_en.lex.diff new file mode 100644 index 0000000..a7c3d2e --- /dev/null +++ b/output/Printers/printers_en.lex.diff @@ -0,0 +1,5 @@ +'Printers' => 'Printers', +'prt_ERR_CREATING' => 'Error occurred while creating printer.', +'prt_ERR_DELETING' => 'Error occurred while deleting printer.', +'prt_ERR_OPENING_DB' => 'Error occurred while opening accounts database.', +'prt_INITIAL_DESC' => '

Add printer

', diff --git a/output/Printers/printers_en.lex.new1 b/output/Printers/printers_en.lex.new1 new file mode 100644 index 0000000..3e5164a --- /dev/null +++ b/output/Printers/printers_en.lex.new1 @@ -0,0 +1,54 @@ +# +# Lex file for Printers generated on 2025-07-17 09:52:33 +# +'Printers' => 'Printers', +'prt_ABOUT_TO_REMOVE' => 'You are about to remove the printer: ', +'prt_ARE_YOU_SURE' => 'Are you sure you wish to remove this printer?', +'prt_CREATE_NETWORK_DESC' => 'Please enter the address and name of the network printer', +'prt_CREATE_NETWORK_PRINTER' => 'Create a new network printer', +'prt_CREATE_NEW_DESC' => 'Please choose a unique name for the printer and enter a brief +description. The printer name should contain only lower-case +letters and numbers, and should start with a lower-case +letter. For example "hplaser", "epsonlp", and +"canonbj" are valid choices, but "HP Laser Jet", +"Canon BubbleJet", and +"HP JetDirect Printer" are not. +Avoid names and descriptions that contain these terms, +"offline", "disabled", "down", "off", "waiting", "jam", +"paper", "error" and "responding". ', +'prt_CREATE_NEW_PRINTER' => 'Create a new printer', +'prt_CREATED_SUCCESSFULLY' => 'Successfully created printer: ', +'prt_CURRENT_LIST' => 'Current List of printers', +'prt_DELETED_SUCCESSFULLY' => 'Successfully deleted printer: ', +'prt_ERR_CREATING' => 'Error occurred while creating printer.', +'prt_ERR_DELETING' => 'Error occurred while deleting printer.', +'prt_ERR_EXISTS' => 'Error: An account with the same name exists with type: ', +'prt_ERR_INTERNAL_FAILURE' => 'Error: internal failure while removing printer: ', +'prt_ERR_INVALID_ADDRESS' => 'Error: invalid network address. Did not create new printer.', +'prt_ERR_INVALID_REMOTE_NAME' => 'Error: invalid network printer name. Did not create new printer.', +'prt_ERR_OPENING_DB' => 'Error occurred while opening accounts database.', +'prt_ERR_UNEXPECTED_DESC' => 'Error: unexpected or missing characters in description. +Did not create new printer.', +'prt_ERR_UNEXPECTED_NAME' => '

Error: unexpected characters in printer name.

+

The printer name should contain only lower-case +letters and numbers, and should start with a lower-case +letter. For example "hplaser", "epsonlp", and +"canonbj" are valid names.

', +'prt_FIRST_USB_PRINTER' => 'First USB attached printer', +'prt_FORM_TITLE' => 'Add or remove printers', +'prt_HOSTNAME_OR_IP' => 'Hostname or IP address of the network printer', +'prt_INITIAL_BTN' => 'Add printer', +'prt_INITIAL_DESC' => '

Add printer

', +'prt_LOCAL_PRINTER_0' => 'Local printer port 0 (LPT1)', +'prt_LOCAL_PRINTER_1' => 'Local printer port 1 (LPT2)', +'prt_LOCAL_PRINTER_2' => 'Local printer port 2 (LPT3)', +'prt_MUST_BE_VALID_HOSTNAME_OR_IP' => 'Must be a valid hostname or IP number', +'prt_NET_PRINTER' => 'Network printer ...', +'prt_NO_PRINTERS' => 'There are no printers in the system.', +'prt_PRINTER_NAME' => 'Printer name', +'prt_REMOTE_ADDRESS' => 'Remote address', +'prt_REMOTE_NAME' => 'Remote name', +'prt_REMOTE_NAME_DESC' => 'Network printer name (enter raw if not sure)', +'prt_REMOVE_PRINTER' => 'Remove printer', +'prt_SECOND_USB_PRINTER' => 'Second USB attached printer', +'prt_SPOOL_FILE_WARNING' => 'All the spool files for this printer will be deleted.', diff --git a/output/Proxy/AdminLTE/proxy.html.new.ep b/output/Proxy/AdminLTE/proxy.html.new.ep new file mode 100644 index 0000000..189613a --- /dev/null +++ b/output/Proxy/AdminLTE/proxy.html.new.ep @@ -0,0 +1,78 @@ +% layout "AdminLTE", title => "Sme server 2 - proxy"; + +% content_for "module" => begin + +
+ + % if (config->{debug} == 1) { +
+            <%= dumper $c->current_route %>
+            <%= dumper $prx_datas->{http_proxy_status} %>
+            <%= dumper $prx_datas->{smtp_proxy_status} %>
+        
+ % } + + +

<%= $title %>

+ +
+ + <%= $modul %> + +
+ +
+ +
+ <%=l "prx_HTTP_PROXY_STATUS_DESCRIPTION" %> +
+ +
+ +
+
+ <%=l "prx_HTTP_PROXY_STATUS_LABEL" %> +
+
+ % param "http_proxy_status" => $prx_datas->{http_proxy_status} unless param "http_proxy_status"; + <%= select_field "http_proxy_status" => [[ (l "ENABLED") => "enabled"], [ (l "DISABLED") => "disabled"]], class => "form-select" %> +
+
+ + % if ( $prx_datas->{smtp_proxy_status} ) { + +
+ +
+ <%=l "prx_SMTP_PROXY_STATUS_DESCRIPTION" %> +
+ +
+ +
+
+ <%=l "prx_SMTP_PROXY_STATUS_LABEL" %> +
+
+ % param "smtp_proxy_status" => $prx_datas->{smtp_proxy_status} unless param "smtp_proxy_status"; + <%= select_field "smtp_proxy_status" => [[ (l "ENABLED") => "transparent"], [ (l "DISABLED") => "disabled"], [ (l "Blocked") => "blocked"]], default => $prx_datas->{smtp_proxy_status} , class => "form-select" %> +
+
+ % } + +
+ + % my $btn = l("SAVE"); + +
+
+ +
+
+ + +
+ +
+ +%end \ No newline at end of file diff --git a/output/Proxy/default/proxy.html.new.ep b/output/Proxy/default/proxy.html.new.ep new file mode 100644 index 0000000..cf26a7d --- /dev/null +++ b/output/Proxy/default/proxy.html.new.ep @@ -0,0 +1,43 @@ +% layout "default", title => "Sme server 2 - proxy"; + +% content_for "module" => begin +
+ %if (config->{debug} == 1) { +

(DBG)route: <%= $c->current_route %>
+ (DBG)ht stat: <%= $prx_datas->{http_proxy_status}%>
+ (DBG)sm stat: <%=$prx_datas->{smtp_proxy_status} %> +

+ %} +

<%= $title %>

+
+ <%= $modul %> + <% my $btn = l("SAVE"); %> + + %= form_for "proxy" => (method => "POST") => begin +

+ %=l "prx_HTTP_PROXY_STATUS_DESCRIPTION" +

+ + %=l "prx_HTTP_PROXY_STATUS_LABEL" + + % param "http_proxy_status" => $prx_datas->{http_proxy_status} unless param "http_proxy_status"; + %= select_field "http_proxy_status" => [[ (l "ENABLED") => "enabled"], [ (l "DISABLED") => "disabled"]], class => "input", id => "htproxstat" + +

+ %if ( $prx_datas->{smtp_proxy_status} ) { +

+ %=l "prx_SMTP_PROXY_STATUS_DESCRIPTION" +

+ + %=l "prx_SMTP_PROXY_STATUS_LABEL" + + % param "smtp_proxy_status" => $prx_datas->{smtp_proxy_status} unless param "smtp_proxy_status"; + %= select_field "smtp_proxy_status" => [[ (l "ENABLED") => "transparent"], [ (l "DISABLED") => "disabled"], [ (l "Blocked") => "blocked"]], class => "input", id => "smproxstat", default => $prx_datas->{smtp_proxy_status} +

+
+

+ %} + %= submit_button "$btn", class => "action" + % end +
+%end \ No newline at end of file diff --git a/output/Proxy/proxy_en.lex.diff b/output/Proxy/proxy_en.lex.diff new file mode 100644 index 0000000..f1a86cd --- /dev/null +++ b/output/Proxy/proxy_en.lex.diff @@ -0,0 +1 @@ +'Proxy settings' => 'Proxy settings', diff --git a/output/Proxy/proxy_en.lex.new1 b/output/Proxy/proxy_en.lex.new1 new file mode 100644 index 0000000..3592e0f --- /dev/null +++ b/output/Proxy/proxy_en.lex.new1 @@ -0,0 +1,30 @@ +# +# Lex file for Proxy generated on 2025-07-17 09:52:33 +# +'Proxy settings' => 'Proxy settings', +'prx_ERR_NO_SQUID_REC' => 'ERROR: There is no squid record in the configuration database.', +'prx_ERR_PROXY_UPDATE_FAILED' => 'ERROR: The proxy-update event returned an error.', +'prx_FIRST_PAGE_DESCRIPTION' => 'This page allows configuration of the server"s +proxy settings. +The server includes a transparent proxy and cache for +HTTP traffic. This is enabled by default, but not enforced +if the server is in "serveronly" mode. +If this server is acting as an e-mail server, connections +from local network clients to external SMTP servers +will default to being redirected to the local e-mail server.', +'prx_HTTP_PROXY_STATUS_DESCRIPTION' => 'The server"s HTTP proxy works to reduce overall uplink usage by +caching recently-visited pages. It is transparent to web browsers +using this server as their gateway. Enable or disable this proxy +with the following toggle.', +'prx_HTTP_PROXY_STATUS_LABEL' => 'HTTP proxy status', +'prx_SMTP_PROXY_STATUS_DESCRIPTION' => 'The server"s transparent SMTP proxy works to reduce virus traffic +from infected client hosts by forcing all outgoing SMTP traffic +through this server if set to "enabled". +If you wish to use an alternate SMTP server, and this server is +your gateway to it, set this proxy to "disabled". Setting the +proxy to "blocked" prevents all SMTP traffic to other servers, +this is the default. The proxy only intercepts/blocks normal smtp +(port 25) traffic.', +'prx_SMTP_PROXY_STATUS_LABEL' => 'SMTP proxy status', +'prx_SUCCESS' => 'The new proxy settings were applied successfully.', +'prx_TITLE' => 'Proxy settings', diff --git a/output/Pseudonyms/AdminLTE/_pse_list.html.new.ep b/output/Pseudonyms/AdminLTE/_pse_list.html.new.ep new file mode 100644 index 0000000..ea1e79f --- /dev/null +++ b/output/Pseudonyms/AdminLTE/_pse_list.html.new.ep @@ -0,0 +1,85 @@ +
+ + % my $btn = l("pse_CLICK_TO_CREATE"); + +
+ <%= $c->render_to_string(inline => l("pse_DESCRIPTION")); %> +
+
+ +
+
+ <%= hidden_field "trt" => "ADD" %> +
+ +
+

<%= l "pse_CURRENT_PSEUDONYMS" %>

+
+ % my $numPseudonyms = @$pseudonyms; + % if ($numPseudonyms == 0) { + <%= l "pse_ACCOUNT_PSEUDONYM_NONE" %> + % } else { + + + + + + + + + + + + % foreach my $pseudonym ( @$pseudonyms ) { + % my $modifiable = $pseudonym->prop("Changeable") || "yes"; + % my $removable = $pseudonym->prop("Removable") || "yes"; + + % my $account = $pseudonym->prop("Account"); + % $account = "Administrator" if ($account eq "admin"); + % $account = $c->l("Everyone") if ($account eq "shared"); + + % my $visible = $pseudonym->prop("Visible"); + % $account .= $c->l("pse_LOCAL_ONLY") + % if (defined $visible && $visible eq "internal"); + + + + + + % my ($actionModify, $actionRemove) = " "; + % if ($modifiable eq "yes") { + %my $modify_text = l("MODIFY"); # Localized text + %my $csrf_token = "TOKEN"; # CSRF token for security + %my $pseudonyms_entry_name = $pseudonym->key; # pseudonyms_entry name extracted from the data structure + %$actionModify = qq{ + % + % + % + % }; + % } + + % if ($removable eq "yes") { + %my $remove_text = l("REMOVE"); # Localized text + %my $csrf_token = "TOKEN"; # CSRF token for security + %my $pseudonyms_entry_name = $pseudonym->key; # pseudonyms_entry name extracted from the data structure + %$actionRemove = qq{ + % + % + % + % }; + % } + + + + + + % } + +
<%= l "Pseudonym" %><%= l "pse_USER_OR_GROUP" %><%= l "ACTION" %>
<%= $pseudonym->key%><%= $account%><%= $c->render_to_string(inline => $actionModify) %><%= $c->render_to_string(inline => $actionRemove) %>
+ % } + +
diff --git a/output/Pseudonyms/default/_pse_list.html.new.ep b/output/Pseudonyms/default/_pse_list.html.new.ep new file mode 100644 index 0000000..0e253c5 --- /dev/null +++ b/output/Pseudonyms/default/_pse_list.html.new.ep @@ -0,0 +1,96 @@ +
+ + % my $btn = l("pse_CLICK_TO_CREATE"); + + %= $c->render_to_string(inline => l("pse_DESCRIPTION")); + + %= form_for "/pseudonyms" => (method => "POST") => begin + + %= hidden_field "trt" => "ADD" + +


+ %= submit_button "$btn", class => "action" +

+ + % end + + +

+ %=l "pse_CURRENT_PSEUDONYMS" +


+ % my $numPseudonyms = @$pseudonyms; + % if ($numPseudonyms == 0){ + %=l "pse_ACCOUNT_PSEUDONYM_NONE" + % } else { + + + + + + + + + + % foreach my $pseudonym ( @$pseudonyms ) + % { + % my $modifiable = $pseudonym->prop("Changeable") || "yes"; + % my $removable = $pseudonym->prop("Removable") || "yes"; + + % my $account = $pseudonym->prop("Account"); + % $account = "Administrator" if ($account eq "admin"); + % $account = $c->l("Everyone") if ($account eq "shared"); + + % my $visible = $pseudonym->prop("Visible"); + % $account .= $c->l("pse_LOCAL_ONLY") + % if (defined $visible && $visible eq "internal"); + + + %= t td => (class => "sme-border") => $pseudonym->key + %= t td => (class => "sme-border") => $account + + + + % } + +
+ %=l "Pseudonym" + + %=l "pse_USER_OR_GROUP" + + %=l "ACTION" +
+ %my ($actionModify, $actionRemove) = " "; + %if ($modifiable eq "yes") { + %my $modify_text = l("MODIFY"); # Localized text + %my $csrf_token = "TOKEN"; # CSRF token for security + %my $pseudonyms_entry_name = $pseudonym->key; # pseudonyms_entry name extracted from the data structure + %$actionModify = qq{ + % + % + % + %}; + %} + + %if ($removable eq "yes") { + %my $remove_text = l("REMOVE"); # Localized text + %my $csrf_token = "TOKEN"; # CSRF token for security + %my $pseudonyms_entry_name = $pseudonym->key; # pseudonyms_entry name extracted from the data structure + %$actionRemove = qq{ + % + % + % + %}; + %} + <%= $c->render_to_string(inline => $actionModify) %> <%= $c->render_to_string(inline => $actionRemove) %> + +
+ <%} %> +

+ + + +
diff --git a/output/Pseudonyms/pseudonyms_en.lex.diff b/output/Pseudonyms/pseudonyms_en.lex.diff new file mode 100644 index 0000000..4fb40a2 --- /dev/null +++ b/output/Pseudonyms/pseudonyms_en.lex.diff @@ -0,0 +1,3 @@ +'pse_NO_PSEUDONYMS' => ' There are no pseudonyms in the system. ', +'pse_PSEUDONYM_INVALID_NOACCT' => 'That account is not hosted on this server', +'Pseudonyms' => 'Pseudonyms', diff --git a/output/Pseudonyms/pseudonyms_en.lex.new1 b/output/Pseudonyms/pseudonyms_en.lex.new1 new file mode 100644 index 0000000..d2d135b --- /dev/null +++ b/output/Pseudonyms/pseudonyms_en.lex.new1 @@ -0,0 +1,67 @@ +# +# Lex file for Pseudonyms generated on 2025-07-17 09:52:33 +# +'pse_ABOUT_TO_REMOVE' => 'You are about to remove the pseudonym: [_1]
+Are you sure you wish to continue?', +'pse_CLICK_TO_CREATE' => 'Add pseudonym', +'pse_CREATE_SUCCEEDED' => 'Successfully created pseudonym', +'pse_CURRENT_PSEUDONYMS' => 'Current List of Pseudonyms', +'pse_DESC_PSEUDONYM_NAME' => ' Please select an existing account or group for the pseudonym from the pulldown menu below', +'pse_DESCRIPTION' => '

The server automatically creates +an e-mail alias for each group. If you want to define an e-mail +alias for a list of users, simply create a group and the +list will automatically be maintained by the server.

+

Pseudonyms allow you to +create other names for existing users or groups. +For example, you may wish to create a pseudonym +"webmaster" for your "webdevelopers" group or a +pseudonym "joe" for the user "joseph".

+

The server automatically creates pseudonyms of the form +firstname. lastname and firstname_lastname for every user +on the system and a pseudonym "everyone" which contains +all users on the system.

+

Pseudonyms also allow you to create e-mail aliases for valid +(virtual) domains & users. For example you can forward +"sales@virtualdomain1.com" to user "mary" and +"sales@virtualdomain2.com" to user "john". +You must create the domains and user accounts before creating +the email aliases.

+

Pseudonyms can also forward to other pseudonyms, although this +is limited to one further level. For example the pseudonym +"webmaster" can forward to the pseudonym "techsupport" which +then forwards to a specified user "ray". This is useful where +one user is responsiblefor multiple roles and saves having +to change the pseudonym"s associated with that user many times +in the event that the user departs the organisation.

+

You can modify or remove a +pseudonym by clicking on the corresponding +command next to the pseudonym.

', +'pse_FORM_TITLE' => 'Create, modify, or remove pseudonyms', +'pse_LOCAL_ONLY' => '(local network only)', +'pse_MODIFY_PSEUDONYM' => 'Modify Pseudonym', +'pse_MODIFY_SUCCEEDED' => 'Successfully modified pseudonym', +'pse_NAME_IN_USE' => 'Error: That name is in use You cannot create a pseudonym with that name.', +'pse_NO_PSEUDONYMS' => ' There are no pseudonyms in the system. ', +'pse_NOT_A_PSEUDONYM' => 'That account is not a pseudonym', +'pse_PSEUDONYM_INVALID_DOMAIN' => 'That domain is not hosted on this server', +'pse_PSEUDONYM_INVALID_NOACCT' => 'That account is not hosted on this server', +'pse_PSEUDONYM_INVALID_SAMEACCT' => 'A pseudonym cannot point to the same account', +'pse_PSEUDONYM_NAME' => 'Pseudonym name', +'pse_REMOVE_PSEUDONYM' => 'Remove pseudonym', +'pse_REMOVE_SUCCEEDED' => 'Successfully removed pseudonym', +'pse_SELECT_ACCOUNT' => 'Select account or group', +'pse_SELECT_INTERNAL' => 'Local network only', +'pse_TITLE_CREATE' => 'Create a pseudonym', +'pse_USER_OR_GROUP' => 'User or group', +'pse_VALID_PSEUDONYM_NAMES' => ' The pseudonym + should contain only lower-case letters, numbers, period, + hyphen and underscore + and should start with a lower-case letter or + number. For example "sales", "john.holland", "123" + and "email-administrator" are all valid pseudonyms, + but "John Smith" and "Henry Miller" are not. +

You can also create email aliases for accounts and (virtual) +domains that are valid on this server. For example +"fred@virtualdomain.com" can be forwarded to "mary" +(or to another valid user account).

', +'Pseudonyms' => 'Pseudonyms', diff --git a/output/Qmailanalog/qmailanalog_en.lex.diff b/output/Qmailanalog/qmailanalog_en.lex.diff new file mode 100644 index 0000000..23d5539 --- /dev/null +++ b/output/Qmailanalog/qmailanalog_en.lex.diff @@ -0,0 +1,17 @@ +'Mail log file analysis' => 'Mail log file analysis', +'qma_BASIC_STATS' => 'Basic statistics', +'qma_END_OF_REPORT' => 'End of Report', +'qma_INVALID_REPORT_TYPE' => 'Invalid report type: ', +'qma_LIST_OUTGOING' => 'List outgoing messages and recipients', +'qma_REASONS_DEFERRAL' => 'Reasons for deferral', +'qma_REASONS_FAILURE' => 'Reasons for failure', +'qma_REASONS_SUCCESS' => 'Reasons for success', +'qma_RECIP_HOSTS' => 'Recipient hosts', +'qma_RECIP_ORDERED' => 'Recipients in best order for mailing lists', +'qma_RECIP_STATS' => 'Recipients statistics', +'qma_REPORT_GENERATED' => 'Report generated: ', +'qma_SENDER_STATS' => 'Sender statistics', +'qma_SENDER_UIDS' => 'Sender uids', +'qma_SENDMAIL_STYLE' => 'Sendmail style log', +'qma_SUCCESSFUL_DELIVERY_DELAY' => 'Successful delivery delay distribution', +'qma_SUMMARIZE_QUEUE' => 'Summarize status of mail queue', diff --git a/output/Qmailanalog/qmailanalog_en.lex.new1 b/output/Qmailanalog/qmailanalog_en.lex.new1 new file mode 100644 index 0000000..03fcd37 --- /dev/null +++ b/output/Qmailanalog/qmailanalog_en.lex.new1 @@ -0,0 +1,32 @@ +# +# Lex file for Qmailanalog generated on 2025-07-17 09:52:33 +# +'Mail log file analysis' => 'Mail log file analysis', +'qma_BASIC_STATS' => 'Basic statistics', +'qma_Daily_Summary_Report_all' => 'Summary report for all time up to now', +'qma_Daily_Summary_Report_today' => 'Summary report for today up to now', +'qma_Daily_Summary_Report_yesterday' => 'Summary report for yesterday', +'qma_END_OF_REPORT' => 'End of Report', +'qma_FORM_TITLE' => 'Mail Log File Analysis', +'qma_GENERATE_REPORT' => 'Generate report', +'qma_INITIAL_DESC' => '

Analysing the mail system log files can aid both in +understanding how your system is performing and in +diagnosing delivery problems. Several different +reports are available.

+

Please note that it may take several minutes to generate +these reports

', +'qma_INVALID_REPORT_TYPE' => 'Invalid report type: ', +'qma_LIST_OUTGOING' => 'List outgoing messages and recipients', +'qma_REASONS_DEFERRAL' => 'Reasons for deferral', +'qma_REASONS_FAILURE' => 'Reasons for failure', +'qma_REASONS_SUCCESS' => 'Reasons for success', +'qma_RECIP_HOSTS' => 'Recipient hosts', +'qma_RECIP_ORDERED' => 'Recipients in best order for mailing lists', +'qma_RECIP_STATS' => 'Recipients statistics', +'qma_REPORT_GENERATED' => 'Report generated: ', +'qma_REPORT_TYPE' => 'Choose a report type', +'qma_SENDER_STATS' => 'Sender statistics', +'qma_SENDER_UIDS' => 'Sender uids', +'qma_SENDMAIL_STYLE' => 'Sendmail style log', +'qma_SUCCESSFUL_DELIVERY_DELAY' => 'Successful delivery delay distribution', +'qma_SUMMARIZE_QUEUE' => 'Summarize status of mail queue', diff --git a/output/Quota/AdminLTE/_quo_upd.html.new.ep b/output/Quota/AdminLTE/_quo_upd.html.new.ep new file mode 100644 index 0000000..f3d0388 --- /dev/null +++ b/output/Quota/AdminLTE/_quo_upd.html.new.ep @@ -0,0 +1,97 @@ +
+ + % my $btn = l("SAVE"); + +
+ +

<%= l "quo_MODIFY_USER_TITLE" %>

+ + % my $userid = $quo_datas->{user}; + % my $user = $quo_datas->{userRec}; + + % my $uid = getpwnam($user->key); + % unless ($uid) { + % warn(l("COULD_NOT_GET_UID"),$user->key); + % next; + % } + + % my $name = $user->prop("FirstName") . " " . $user->prop("LastName"); + % my $dev = Quota::getqcarg("/home/e-smith/files"); + % my ($bc, $bs, $bh, $bt, $ic, $is, $ih, $it) = Quota::query($dev, $uid); + +
+ <%= l "quo_USER" %> <%= "$name (\"$userid\")" %> +   + <%= l "quo_CURRENTLY_HAS" %> <%= $ic %> + <%= l "files" %> +   + <%= l "quo_OCCUPYING" %> <%= $c->toMB($bc) %> <%= l "megabytes" %> +
+
+ +
+ <%= l "quo_INSTRUCTIONS" %> +
+
+ +
+
+ <%= l "quo_USER" %> +
+
+ <%= $name %> +
+
+ +
+ + % param "Soft" => $quo_datas->{softlim} unless param "Soft"; + +
+
+ +
+
+ + +
+
+ +
+ + % param "Hard" => $quo_datas->{hardlim} unless param "Hard"; + +
+
+ +
+
+ + + + +
+
+ +

+ +
+
+ +
+
+ + <%= hidden_field "trt" => $quo_datas->{trt} %> + <%= hidden_field "user" => $quo_datas->{user} %> + +
+ +
\ No newline at end of file diff --git a/output/Quota/default/_quo_upd.html.new.ep b/output/Quota/default/_quo_upd.html.new.ep new file mode 100644 index 0000000..afe7002 --- /dev/null +++ b/output/Quota/default/_quo_upd.html.new.ep @@ -0,0 +1,84 @@ +
+ + % my $btn = l("SAVE"); + + %= form_for "/quota2" => (method => "POST") => begin +

+

+ %=l "quo_MODIFY_USER_TITLE" +

+

+ + % my $userid = $quo_datas->{user}; + % my $user = $quo_datas->{userRec}; + + % my $uid = getpwnam($user->key); + % unless ($uid) { + % warn(l("COULD_NOT_GET_UID"),$user->key); + % next; + % } + + % my $name = $user->prop("FirstName") . " " . $user->prop("LastName"); + % my $dev = Quota::getqcarg("/home/e-smith/files"); + % my ($bc, $bs, $bh, $bt, $ic, $is, $ih, $it) = Quota::query($dev, $uid); + +

+ %=l "quo_USER" + %= "$name (\"$userid\")" + %=l "quo_CURRENTLY_HAS" + %= $ic + %=l "files" + %=l "quo_OCCUPYING" + %= $c->toMB($bc) + %=l "megabytes" +

+ +

+ %=l "quo_INSTRUCTIONS" +

+ +

+ + %=l "quo_USER", class => "label" + + %= $name, class => "input" + +

+ +

+ + %=l "quo_LIMIT_WITH_GRACE", class => "label" + + % param "Soft" => $quo_datas->{softlim} unless param "Soft"; + %= text_field "Soft", class => "input" + +

+ +

+ + %=l "quo_ABS_LIMIT", class => "label" + + % param "Hard" => $quo_datas->{hardlim} unless param "Hard"; + %= text_field "Hard", class => "input" + +

+ +

+

+ %= submit_button "$btn", class => "action" +

+ + %= hidden_field "trt" => $quo_datas->{trt} + %= hidden_field "user" => $quo_datas->{user} + + % end + +
\ No newline at end of file diff --git a/output/Quota/quota_en.lex.diff b/output/Quota/quota_en.lex.diff new file mode 100644 index 0000000..38a38ba --- /dev/null +++ b/output/Quota/quota_en.lex.diff @@ -0,0 +1,2 @@ +'quo_UNABLE_TO_OPEN_ACCOUNTS' => 'Unable to open accounts db', +'Quotas' => 'Quotas', diff --git a/output/Quota/quota_en.lex.new1 b/output/Quota/quota_en.lex.new1 new file mode 100644 index 0000000..ca3e1e6 --- /dev/null +++ b/output/Quota/quota_en.lex.new1 @@ -0,0 +1,39 @@ +# +# Lex file for Quota generated on 2025-07-17 09:52:33 +# +'quo_ABS_LIMIT' => 'Absolute limit', +'quo_ABS_LIMIT_MB' => 'Absolute limit (MB)', +'quo_ACCOUNT_IS_TYPE' => 'It is an account of type: ', +'quo_COULD_NOT_GET_UID' => 'Could not determine the uid for user: ', +'quo_CURRENT_USAGE' => 'Current usage (MB)', +'quo_CURRENT_USAGE_AND_SETTINGS' => 'Current Quota Usage and Settings', +'quo_CURRENTLY_HAS' => 'currently has: ', +'quo_ERR_HARD_LT_SOFT' => ' Error: absolute limit must be greater than limit with grace time. ', +'quo_ERR_MODIFYING' => 'Error occurred while modifying user.', +'quo_ERR_NO_SUCH_ACCT' => 'Error: there is no account named: ', +'quo_ERR_NOT_A_USER_ACCT' => 'Error: the account is not a user account: ', +'quo_FORM_TITLE' => 'Create, modify, or remove user account quotas', +'quo_HARD_VAL_MUST_BE_NUMBER' => 'Error: absolute limit must be a number, optionally followed by one of the unit suffixes K, M, G, or T.', +'quo_INSTRUCTIONS' => 'Enter the quota with optional unit suffix of "K" for kilobytes, "M" for megabytes, +"G" for gigabytes or "T" for terabytes. +Entries with no suffix are assumed to be in megabytes. A setting of "0" +for either limit disables that limit for the corresponding user.', +'quo_LIMIT_WITH_GRACE' => 'Limit with grace period', +'quo_LIMIT_WITH_GRACE_MB' => 'Limit with grace period (MB)', +'quo_MODIFY_USER_TITLE' => 'Modify user quota limits', +'quo_OCCUPYING' => 'occupying: ', +'quo_QUOTA_DESC' => '

You can set filesystem quotas for users on your system by clicking +the "Modify" button next to the user you wish to update. +

If the user exceeds the "Limit with grace period", warnings will be +generated. If this limit is exceeded for longer than a week or if the +"Absolute limit" is reached, the user will be unable to store any more +files or receive any more e-mail. +

A setting of "0" for either limit disables that limit for the +corresponding user. +

The disk space for each user includes the user"s home directory, +e-mail, and any files owned by the user in information bays.', +'quo_SOFT_VAL_MUST_BE_NUMBER' => 'Error: limit with grace period must be a number, optionally followed by one of the unit suffixes K, M, G, or T.', +'quo_SUCCESSFULLY_MODIFIED' => 'Successfully modified quota for user account: ', +'quo_UNABLE_TO_OPEN_ACCOUNTS' => 'Unable to open accounts db', +'quo_USER' => 'User: ', +'Quotas' => 'Quotas', diff --git a/output/Reboot/Reboot.new.pm b/output/Reboot/Reboot.new.pm new file mode 100644 index 0000000..ab02d49 --- /dev/null +++ b/output/Reboot/Reboot.new.pm @@ -0,0 +1,78 @@ +package SrvMngr::Controller::Reboot; + +#---------------------------------------------------------------------- +# heading : System +# description : Reboot or shutdown +# navigation : 4000 700 +# +# routes : end +#---------------------------------------------------------------------- +use strict; +use warnings; +use Mojo::Base "Mojolicious::Controller"; +use Locale::gettext; +use SrvMngr::I18N; +use SrvMngr qw(theme_list init_session); + +sub main { + my $c = shift; + $c->app->log->info($c->log_req); + my $title = $c->l("rbo_FORM_TITLE"); + my $modul = ""; + $c->stash(title => $title, modul => $modul); + $c->render(template => "reboot"); +} ## end sub main + +sub do_action { + my $c = shift; + $c->app->log->info($c->log_req); + my $title = $c->l("rbo_FORM_TITLE"); + my $result = ""; + my $function = $c->param("function"); + my $debug = $c->param("debug"); + + if ($function eq "reboot") { + $result = $c->l("Reboot_SUCCEEDED") . "
" . $c->l("rbo_DESC_REBOOT"); + + unless ($debug) { + esmith::util::backgroundCommand(1, "/sbin/e-smith/signal-event", "reboot"); + + # system( "/sbin/e-smith/signal-event", "reboot" ) == 0 + # or die ("Error occurred while rebooting.\n"); + } ## end unless ($debug) + } elsif ($function eq "shutdown") { + $result = $c->l("rbo_SHUTDOWN_SUCCEEDED") . "
" . $c->l("rbo_DESC_SHUTDOWN"); + + unless ($debug) { + esmith::util::backgroundCommand(1, "/sbin/e-smith/signal-event", "halt"); + + # system( "/sbin/e-smith/signal-event", "halt" ) == 0 + # or die ("Error occurred while halting.\n"); + } ## end unless ($debug) + } elsif ($function eq "reconfigure") { + $result = $c->l("rbo_RECONFIGURE_SUCCEEDED") . "
" . $c->l("rbo_DESC_RECONFIGURE"); + + unless ($debug) { + + # esmith::util::backgroundCommand( 1, "/sbin/e-smith/signal-event", "post-upgrade", + # "; ", "/sbin/e-smith/signal-event", "reboot" ); + esmith::util::backgroundCommand( 1, "/sbin/e-smith/signal-event", "post-upgrade-and-reboot"); + #system("/sbin/e-smith/signal-event", "post-upgrade") == 0 + #or die("Error occurred while running post-upgrade.\n"); + #system("/sbin/e-smith/signal-event", "reboot") == 0 + #or die("Error occurred while rebooting.\n"); + } ## end unless ($debug) + } ## end elsif ($function eq "reconfigure") + $c->stash(title => $title, modul => $result); + $c->render(template => "module"); +} ## end sub do_action + +sub rebootFunction_list { + my $c = shift; + return [ + [ $c->l("Reboot") => "reboot" ], + [ $c->l("RECONFIGURE") => "reconfigure" ], + [ $c->l("SHUTDOWN") => "shutdown" ] + ]; +} ## end sub rebootFunction_list +1; diff --git a/output/Reboot/reboot_en.lex.diff b/output/Reboot/reboot_en.lex.diff new file mode 100644 index 0000000..ae06870 --- /dev/null +++ b/output/Reboot/reboot_en.lex.diff @@ -0,0 +1 @@ +'Reboot or shutdown' => 'Reboot or shutdown', diff --git a/output/Reboot/reboot_en.lex.new1 b/output/Reboot/reboot_en.lex.new1 new file mode 100644 index 0000000..fc5e9cb --- /dev/null +++ b/output/Reboot/reboot_en.lex.new1 @@ -0,0 +1,19 @@ +# +# Lex file for Reboot generated on 2025-07-17 09:52:33 +# +'rbo_DESC_REBOOT' => 'Your server has initiated the reboot process.', +'rbo_DESC_RECONFIGURE' => 'Your server has initiated a full system reconfiguration and reboot.', +'rbo_DESC_SHUTDOWN' => 'Your server has initiated the shutdown process. +The process will take several minutes to complete, after which +you can switch off the power.', +'rbo_DESCRIPTION' => 'You can reboot, shut down your server or perform a full system +reconfiguration from this screen. You must perform a shutdown +before switching the power off. All of these functions take +several minutes to complete. +When you click perform the operation will be initiated immediately, so be ready!', +'rbo_FORM_TITLE' => 'Shutdown or reboot', +'rbo_LABEL_REBOOT' => 'Select Shutdown, Reboot or Reconfigure', +'rbo_REBOOT_SUCCEEDED' => 'Reboot request initiated successfully.', +'rbo_RECONFIGURE_SUCCEEDED' => 'Reconfiguration request initiated successfully.', +'rbo_SHUTDOWN_SUCCEEDED' => 'Shutdown request initiated successfully.', +'Reboot or shutdown' => 'Reboot or shutdown', diff --git a/output/Remoteaccess/remoteaccess_en.lex.diff b/output/Remoteaccess/remoteaccess_en.lex.diff new file mode 100644 index 0000000..77988de --- /dev/null +++ b/output/Remoteaccess/remoteaccess_en.lex.diff @@ -0,0 +1,16 @@ +'Remote access' => 'Remote access', +'rma_DESC_SERIAL_CONSOLE_ACCESS' => '


Serial console

+You can allow access to the server console from a terminal +connected to a server serial port.', +'rma_DESCRIPTION' => 'For each of the options below, the private setting allows anyone +from your local network to access your server. The +public setting allows access from anywhere on the Internet. The no +access setting disables access. To understand the security +implications of changing these options from the default settings, you +should read the user's guide section on remote access.', +'rma_ERR_NO_RECORD' => 'Unable to locate httpd-admin record in configuration db', +'rma_LABEL_PPTP_ACCESS' => 'PPTP default user access', +'rma_LABEL_SERIAL_CONSOLE_ACCESS' => 'Serial console', +'rma_PORT1_ENABLED' => 'Enabled on serial port 1', +'rma_PORT2_ENABLED' => 'Enabled on serial port 2', +'rma_VALUE_ZERO_OR_POSITIVE' => 'Value must be zero or a positive integer', diff --git a/output/Remoteaccess/remoteaccess_en.lex.new1 b/output/Remoteaccess/remoteaccess_en.lex.new1 new file mode 100644 index 0000000..da051a0 --- /dev/null +++ b/output/Remoteaccess/remoteaccess_en.lex.new1 @@ -0,0 +1,97 @@ +# +# Lex file for Remoteaccess generated on 2025-07-17 09:52:33 +# +'Remote access' => 'Remote access', +'rma_DESC_FTP_ACCESS' => 'You can also control FTP access to your server. We +recommend leaving this parameter set to "no access" unless you +have a specific reason to do otherwise. +

+Note: these settings limit access to the server and override other +settings, including those for individual information bays.

', +'rma_DESC_FTP_LOGIN' => 'You can also control authenticated FTP access to information +bays and user accounts. We strongly recommend leaving this +parameter set to private unless you have a specific reason to +do otherwise. +

+Note: a secure shell sftp client can also be used to access the +server, if remote access via the secure shell is enabled. +This method of access protects the +passwords and data of the FTP session, whereas standard FTP +provides no protection.

', +'rma_DESC_IPSECRW' => 'You can allow IPSEC client access to your server, authenticated by +digital certificates. You should leave this feature disabled by setting the value +to the number 0 unless you require IPSEC client access.', +'rma_DESC_IPSECRW_RESET' => 'If you wish to reset all digital certificates, you +can do so here.
Any old certificates will no longer +authenticate against the server, so all IPSEC clients will +need to import a new certificate!.', +'rma_DESC_PPTP' => 'You can allow PPTP access to your server. +You should leave this feature disabled by setting the value +to the number 0 unless you require PPTP access.', +'rma_DESC_SERIAL_CONSOLE_ACCESS' => '

Serial console

+You can allow access to the server console from a terminal +connected to a server serial port.', +'rma_DESC_SSH' => 'You can control Secure Shell access to your server. +The public setting should only be enabled by +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. +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_DESC_TELNET_ACCESS' => 'WARNING:Telnet is currently enabled, but this feature is +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 +screen. ', +'rma_DESC_VALID_FROM_ENTRIES' => 'To add a new remote management network, +enter the details below.', +'rma_DESCRIPTION' => 'For each of the options below, the private setting allows anyone +from your local network to access your server. The +public setting allows access from anywhere on the Internet. The no +access setting disables access. To understand the security +implications of changing these options from the default settings, you +should read the user"s guide section on remote access.', +'rma_ERR_INVALID_PARAMS' => 'Either provide both a network and subnet mask, or leave both +fields blank.', +'rma_ERR_NO_RECORD' => 'Unable to locate httpd-admin record in configuration db', +'rma_FORM_TITLE' => 'Change remote access settings', +'rma_INVALID_SUBNET_MASK' => 'Invalid subnet mask', +'rma_LABEL_FTP_ACCESS' => 'FTP access', +'rma_LABEL_FTP_LOGIN' => 'FTP password access', +'rma_LABEL_IPSECRW_RESET' => 'Reset digital certificates', +'rma_LABEL_IPSECRW_SESS' => 'Number of IPSEC clients', +'rma_LABEL_PPTP' => 'Number of PPTP clients', +'rma_LABEL_PPTP_ACCESS' => 'PPTP default user access', +'rma_LABEL_SERIAL_CONSOLE_ACCESS' => 'Serial console', +'rma_LABEL_SSH' => 'Secure shell access', +'rma_LABEL_SSH_ADMIN' => 'Allow administrative command line access over secure shell', +'rma_LABEL_SSH_PASSWORD_ACCESS' => 'Allow secure shell access using standard passwords', +'rma_LABEL_SSH_PORT' => 'TCP Port for secure shell access', +'rma_LABEL_TELNET_ACCESS' => 'Telnet access', +'rma_NO_ACCESS' => 'No Access', +'rma_NO_ENTRIES_YET' => 'There are no entries yet', +'rma_NUM_OF_HOSTS' => 'Number of hosts', +'rma_NUMBER_OF_PPTP_CLIENTS_MUST_BE_LESSER_THAN_NUMBER_OF_IP_IN_DHCP_RANGE' => 'The number of pptp clients is greater than the number of reserved IP for DHCP. You should take a smaller number.', +'rma_PASSWORD_LOGIN_PRIVATE' => 'Accept passwords only from local networks', +'rma_PASSWORD_LOGIN_PUBLIC' => 'Accept passwords from anywhere', +'rma_PORT1_ENABLED' => 'Enabled on serial port 1', +'rma_PORT2_ENABLED' => 'Enabled on serial port 2', +'rma_REMOTE_MANAGEMENT' => 'Remote Management', +'rma_SUBNET_MASK' => 'Subnet mask', +'rma_SUCCESS' => 'The new remote access settings have been saved.', +'rma_TITLE_FTP_ACCESS' => 'FTP Settings', +'rma_TITLE_IPSECRW' => 'IPSEC Client (Roadwarrior) Settings', +'rma_TITLE_PPTP' => 'PPTP Settings', +'rma_TITLE_SSH' => 'Secure Shell Settings', +'rma_TITLE_TELNET_ACCESS' => 'Telnet Settings', +'rma_VALIDFROM_DESC' => 'It is possible to allow hosts on remote networks to access the +server manager by entering those networks here. Use a subnet +mask of 255.255.255.255 to limit the access to the specified host. +Any hosts within the specified range will be able to access the +server manager using HTTPS.', +'rma_VALIDFROM_TITLE' => '[_1]', +'rma_VALUE_ZERO_OR_POSITIVE' => 'Value must be zero or a positive integer', diff --git a/output/Review/AdminLTE/_rvw_content.html.new.ep b/output/Review/AdminLTE/_rvw_content.html.new.ep new file mode 100644 index 0000000..7c41dab --- /dev/null +++ b/output/Review/AdminLTE/_rvw_content.html.new.ep @@ -0,0 +1,121 @@ +
+ + + + + + + + + + + + + + + + + + + % if ( $rvw_datas->{publicip} ) { + + + + + % } + + + + + + + + + + + + + + + + +
<%= l "rvw_NETWORKING_PARAMS" %> 
<%= l "rvw_SERVER_MODE" %><%= $rvw_datas->{servermode} %>
<%= l "rvw_LOCAL_IP_ADDRESS_SUBNET_MASK" %><%= $rvw_datas->{localip} %>
<%=l "rvw_INTERNET_VISIBLE_ADDRESS" %><%= $rvw_datas->{publicip} %>
<%= l "Gateway"%> + <%= $rvw_datas->{gateway} %> + <%= $rvw_datas->{serveronly} %> +
Local Networks (not translated?)<%= $c->render_to_string( inline => $rvw_datas->{addlocalnetworks} );%>
<%= l "rvw_DHCP_SERVER" %><%= $rvw_datas->{dhcpserver} %>
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
<%= l "rvw_SERVER_NAMES" %> 
<%= l "rvw_DNS_SERVER" %><%= $rvw_datas->{dnsserver} %>
<%= l "rvw_WEB_SERVER" %><%= $rvw_datas->{webserver} %>
<%= l "rvw_PROXY_SERVER" %><%= $rvw_datas->{proxyserver} %>
<%= l "rvw_FTP_SERVER" %><%= $rvw_datas->{ftpserver} %>
<%= l "rvw_SMTP_POP_AND_IMAP_MAIL_SERVERS" %><%= $rvw_datas->{smtpserver} %>
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
<%= l "rvw_DOMAIN_INFORMATION" %> 
<%= l "rvw_PRIMARY_DOMAIN" %><%= $rvw_datas->{domainname} %>
<%= l "rvw_VIRTUAL_DOMAINS" %><%= $rvw_datas->{virtualdomains} %>
<%= l "rvw_PRIMARY_WEB_SITE" %><%= $rvw_datas->{primarywebsite} %>
<%= l "rvw_SERVER_MANAGER" %><%= $rvw_datas->{servermanager} %>
<%= l "rvw_USER_PASSWORD_PANEL" %><%= $rvw_datas->{usermanager} %>
<%= l "rvw_EMAIL_ADDRESSES" %><%= $rvw_datas->{emailaddresses} %>
+
\ No newline at end of file diff --git a/output/Review/Review.new.pm b/output/Review/Review.new.pm new file mode 100644 index 0000000..7ff96ba --- /dev/null +++ b/output/Review/Review.new.pm @@ -0,0 +1,318 @@ +package SrvMngr::Controller::Review; + +#---------------------------------------------------------------------- +# heading : Investigation +# description : Review configuration +# navigation : 7000 400 +# routes : end +#---------------------------------------------------------------------- +use strict; +use warnings; +use Mojo::Base "Mojolicious::Controller"; +use Locale::gettext; +use SrvMngr::I18N; +use SrvMngr qw(theme_list init_session); +use SrvMngr qw(gen_locale_date_string); +use esmith::ConfigDB::UTF8; +use esmith::DomainsDB::UTF8; +use esmith::NetworksDB::UTF8; + +#use SrvMngr::Review_sub qw(print_page); +#use smeserver::Panel::review; +our $db; +our $domains ; +our $networks; + +sub main { + my $c = shift; + $c->app->log->info($c->log_req); + $db = esmith::ConfigDB::UTF8->open_ro || die "Couldn"t open config db\"; + my $title = $c->l("rvw_FORM_TITLE"); + my $modul = $c->render_to_string(inline => $c->l("rvw_DESCRIPTION")); + my %rvw_datas = (); + $rvw_datas{"servermode"} = (get_value("", "SystemMode") || ""); + $rvw_datas{"localip"} = get_value("$c", "LocalIP") . "/" . get_value("$c", "LocalNetmask"); + $rvw_datas{"publicip"} = $c->get_public_ip_address($c); + $rvw_datas{"gateway"} = $c->render_to_string(inline => print2_gateway_stanza($c)); + $rvw_datas{"serveronly"} = $c->render_to_string(inline => print2_serveronly_stanza($c)); + $rvw_datas{"addlocalnetworks"} = get_local_networks($c); + $rvw_datas{"dhcpserver"} = $c->render_to_string(inline => print2_dhcp_stanza($c)); + $rvw_datas{"dnsserver"} = (get_value("", "LocalIP") || ""); + $rvw_datas{"webserver"} = "www." . (get_local_domain()); + my $port = $db->get_prop(\"squid\", \"TransparentPort\") || 3128; + $rvw_datas{"proxyserver"} = "proxy." . get_local_domain() . \":$port\"; + $rvw_datas{"ftpserver"} = "ftp." . get_local_domain(); + $rvw_datas{"smtpserver"} = "mail." . get_local_domain(); + $rvw_datas{"domainname"} = (get_value("", "DomainName") || ""); + $rvw_datas{"virtualdomains"} = $c->render_to_string(inline => gen2_domains($c)); + $rvw_datas{"primarywebsite"} = "http://www." . get_value("", "DomainName"); + $rvw_datas{"servermanager"} = "https://" . (get_value("", "SystemName") || "localhost") . "/server-manager/"; + $rvw_datas{"usermanager"} = "https://" . (get_value("", "SystemName") || "localhost") . "/user-password/"; + $rvw_datas{"emailaddresses"} = $c->render_to_string(inline => gen2_email_addresses($c)); + + #$c->stash( releaseVersion => $c->session->{releaseVersion}, copyRight => $c->session->{copyRight}, + #PwdSet => $c->session->{PwdSet}, Unsafe => $c->session->{Unsafe}, + $c->stash( + title => $title, + modul => $modul, + rvw_datas => \%rvw_datas, + ); + $c->render(template => "review"); +} ## end sub main + +=head2 gen2_email_addresses + + Returns a string of the various forms of email addresses that work + on an SMEServer (mojo v.) + +=cut + +sub gen2_email_addresses { + my $c = shift; + my $domain = get_value($c, "DomainName"); + my $useraccount = $c->l(\"useraccount\"); + my $firstname = $c->l(\"firstname\"); + my $lastname = $c->l(\"lastname\"); + my $out + = \"\" + . $useraccount + . \"\@\" + . $domain . \"
\" . \"\" + . $firstname + . \".\" + . $lastname + . \"\@\" + . $domain . \"
\" . \"\" + . $firstname + . \"_\" + . $lastname + . \"\@\" + . $domain . \"
\"; + return $out; +} ## end sub gen2_email_addresses + +=head2 gen2_domains + + Returns a string of the domains this SME Server serves or a localized string + saying \"no domains defined\" (mojo ver) + +=cut + +sub gen2_domains { + my $c = shift; + $domains = esmith::DomainsDB::UTF8->open_ro || die \"Couldn"t open domains"; + my @virtual = $domains->get_all_by_prop(type => "domain"); + my $numvirtual = @virtual; + + if ($numvirtual == 0) { + $c->localise("NO_VIRTUAL_DOMAINS"); + } else { + my $out = ""; + my $domain; + + foreach $domain (sort @virtual) { + if ($out ne "") { + $out .= "
"; + } + $out .= $domain->key; + } ## end foreach $domain (sort @virtual) + return $out; + } ## end else [ if ($numvirtual == 0) ] +} ## end sub gen2_domains + +=head2 get2_local_networks + +Return a
delimited string of all the networks this SMEServer is +serving. (mojo ver) + +=cut + +sub get2_local_networks { + my $c = shift; + $networks = esmith::NetworksDB::UTF8->open_ro || die "Couldn"t open networks\"; + my @nets = $networks->get_all_by_prop("type" => "network"); + my $numNetworks = @nets; + + if ($numNetworks == 0) { + return $c->l("rvw_NO_NETWORKS"); + } else { + my $out = \"\"; + + foreach my $network (sort @nets) { + if ($out ne \"\") { + $out .= \"
\"; + } + $out .= $network->key . \"/\" . get_net_prop($c, $network->key, "Mask"); + + if (defined get_net_prop($c, $network->key, "Router")) { + $out .= \" via \" . get_net_prop($c, $network->key, "Router"); + } + } ## end foreach my $network (sort @nets) + return $out; + } ## end else [ if ($numNetworks == 0)] +} ## end sub get2_local_networks + +sub get_net_prop { + my $fm = shift; + my $item = shift; + my $prop = shift; + $networks = esmith::NetworksDB::UTF8->open_ro || die \"Couldn"t open networks"; + my $record = $networks->get($item); + if ($record) { + return $record->prop($prop); + } + else { + return ""; + } + +} + + +sub get_local_networks { + my $fm = shift; + $networks = esmith::NetworksDB::UTF8->open_ro || die "Couldn"t open networks\"; + 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 .= \"
\"; + } + + $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) + +=cut + +sub print2_gateway_stanza { + my $c = shift; + + if (get_value($c, "SystemMode") =~ /servergateway/) { + my $ip = get_value($c, "ExternalIP"); + my $static + = (get_value($c, "AccessType") eq "dedicated") + && (get_value($c, "ExternalDHCP") eq "off") + && (get_prop($c, "pppoe", "status") eq "disabled"); + + if ($static) { + $ip .= \"/\" . get_value($c, "ExternalNetmask"); + } + my $out = $c->l("rvw_EXTERNAL_IP_ADDRESS_SUBNET_MASK") . ":" . $ip; + + if ($static) { + $out .= $c->l("Gateway") . ":" . get_value($c, "GatewayIP"); + } + return $out; + } ## end if (get_value($c, "SystemMode"...)) +} ## end sub print2_gateway_stanza + +=head2 print2_serveronly_stanza + +If this system is a standalone server with net access, show the external +gateway IP (mojo ver) + +=cut + +sub print2_serveronly_stanza { + my $c = shift; + + if ( (get_value($c, "SystemMode") eq "serveronly") + && get_value($c, "AccessType") + && (get_value($c, "AccessType") ne \"off\")) + { + return (get_value($c, "GatewayIP")); + } ## end if ((get_value($c, "SystemMode"...))) +} ## end sub print2_serveronly_stanza + +=head2 print2_dhcp_stanza + +Prints out the current state of dhcp service (mojo ver) + + +=cut + +sub print2_dhcp_stanza { + my $c = shift; + my $out = (get_prop($c, "dhcpd", "status") || "disabled"); + + if (get_prop($c, "dhcpd", "status") eq "enabled") { + $out .= "
" . $c->l("rvw_BEGINNING_OF_DHCP_ADDRESS_RANGE") . ":"; + $out .= (get_prop($c, "dhcpd", "start") || "") . "
"; + $out .= $c->l("rvw_END_OF_DHCP_ADDRESS_RANGE") . ":"; + $out .= (get_prop($c, "dhcpd", "end") || ""); + } ## end if (get_prop($c, "dhcpd"...)) + return $out; +} ## end sub print2_dhcp_stanza + +sub get_value { + my $fm = shift; + my $item = shift; + $db = esmith::ConfigDB::UTF8->open_ro || die \"Couldn"t open config db"; + 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; + $db = esmith::ConfigDB::UTF8->open_ro || die "Couldn"t open config db\"; + my $record = $db->get($item); + if ($record) { + return $record->prop($prop); + } + else { + return ""; + } + +} + +sub get_public_ip_address +{ + my $self = shift; + $db = esmith::ConfigDB::UTF8->open_ro || die \"Couldn"t open config db"; + my $sysconfig = $db->get("sysconfig"); + if ($sysconfig) + { + my $publicIP = $sysconfig->prop("PublicIP"); + if ($publicIP) + { + return $publicIP; + } + } + return undef; +} + + +1; diff --git a/output/Review/default/review.html.new.ep b/output/Review/default/review.html.new.ep new file mode 100644 index 0000000..0bc8027 --- /dev/null +++ b/output/Review/default/review.html.new.ep @@ -0,0 +1,137 @@ +% layout "default", title => "Sme server 2 - Review"; + +% content_for "module" => begin +
+

<%= $title %>

+ <%= $modul %>

+ + %= form_for "review" => begin + + %=l "rvw_NETWORKING_PARAMS" +
+ +

+ %=l "rvw_SERVER_MODE" + + %= $rvw_datas->{servermode} +

+ +

+ %=l "rvw_LOCAL_IP_ADDRESS_SUBNET_MASK" + + %= $rvw_datas->{localip} +

+ + % if ( $rvw_datas->{publicip} ) { +

+ %=l "rvw_INTERNET_VISIBLE_ADDRESS" + + %= $rvw_datas->{publicip} +

+ % } + +

+ %=l "Gateway" + + %= $rvw_datas->{gateway} + %= $rvw_datas->{serveronly} +

+ +

+ %=l "rvw_ADDITIONAL_LOCAL_NETWORKS" + + %= $c->render_to_string( inline => $rvw_datas->{addlocalnetworks} ); +
+

+ +

+ + %=l "rvw_DHCP_SERVER" + + + %= $rvw_datas->{dhcpserver} + +

+ +

+ %=l "rvw_SERVER_NAMES" +
+ +

+ %=l "rvw_DNS_SERVER" + + %= $rvw_datas->{dnsserver} +

+ +

+ %=l "rvw_WEB_SERVER" + + %= $rvw_datas->{webserver} +

+ +

+ %=l "rvw_PROXY_SERVER" + + %= $rvw_datas->{proxyserver} +

+ +

+ %=l "rvw_FTP_SERVER" + + %= $rvw_datas->{ftpserver} +

+ +

+ %=l "rvw_SMTP_POP_AND_IMAP_MAIL_SERVERS" + + %= $rvw_datas->{smtpserver} +

+ +

+ %=l "rvw_DOMAIN_INFORMATION" +
+ +

+ %=l "rvw_PRIMARY_DOMAIN" + + %= $rvw_datas->{domainname} +

+ + +

+ %=l "rvw_VIRTUAL_DOMAINS" + + + %= $rvw_datas->{virtualdomains} +

+ + +

+ %=l "rvw_PRIMARY_WEB_SITE" + + %= $rvw_datas->{primarywebsite} +

+ +

+ %=l "rvw_SERVER_MANAGER" + + %= $rvw_datas->{servermanager} +

+ +

+ %=l "rvw_USER_PASSWORD_PANEL" + + %= $rvw_datas->{usermanager} +

+ +

+ %=l "rvw_EMAIL_ADDRESSES" + + %= $rvw_datas->{emailaddresses} +

+ + % end + +
+ +% end \ No newline at end of file diff --git a/output/Review/review_en.lex.diff b/output/Review/review_en.lex.diff new file mode 100644 index 0000000..7806abe --- /dev/null +++ b/output/Review/review_en.lex.diff @@ -0,0 +1,3 @@ +'Review configuration' => 'Review configuration', +'rvw_HOSTS' => 'Hosts', +'rvw_NO_VIRTUAL_DOMAINS' => 'No virtual domains defined', diff --git a/output/Review/review_en.lex.new1 b/output/Review/review_en.lex.new1 new file mode 100644 index 0000000..b842a7f --- /dev/null +++ b/output/Review/review_en.lex.new1 @@ -0,0 +1,34 @@ +# +# Lex file for Review generated on 2025-07-17 09:52:34 +# +'Review configuration' => 'Review configuration', +'rvw_ADDITIONAL_LOCAL_NETWORKS' => 'Additional local networks', +'rvw_BEGINNING_OF_DHCP_ADDRESS_RANGE' => 'Beginning of DHCP address range', +'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 +page and use it as a reference.', +'rvw_DHCP_SERVER' => 'DHCP server', +'rvw_DNS_SERVER' => 'DNS server', +'rvw_DOMAIN_INFORMATION' => 'Domain information', +'rvw_EMAIL_ADDRESSES' => 'Email Addresses', +'rvw_END_OF_DHCP_ADDRESS_RANGE' => 'End of DHCP address range', +'rvw_EXTERNAL_IP_ADDRESS_SUBNET_MASK' => 'External IP address / subnet mask', +'rvw_FORM_TITLE' => 'Review configuration', +'rvw_FTP_SERVER' => 'FTP server', +'rvw_HOSTS' => 'Hosts', +'rvw_INTERNET_VISIBLE_ADDRESS' => 'Internet Visible IP Address', +'rvw_LOCAL_IP_ADDRESS_SUBNET_MASK' => 'Local IP address / subnet mask', +'rvw_NETWORKING_PARAMS' => 'Networking Parameters', +'rvw_NO_NETWORKS' => 'No additional networks defined', +'rvw_NO_VIRTUAL_DOMAINS' => 'No virtual domains defined', +'rvw_PRIMARY_DOMAIN' => 'Primary domain', +'rvw_PRIMARY_WEB_SITE' => 'Primary web site', +'rvw_PROXY_SERVER' => 'Proxy server', +'rvw_SERVER_MANAGER' => 'Server manager', +'rvw_SERVER_MODE' => 'Server Mode', +'rvw_SERVER_NAMES' => 'Server names', +'rvw_SMTP_POP_AND_IMAP_MAIL_SERVERS' => 'SMTP, POP, and IMAP mail servers', +'rvw_USER_PASSWORD_PANEL' => 'User password panel', +'rvw_VIRTUAL_DOMAINS' => 'Virtual domains', +'rvw_WEB_SERVER' => 'Web server', diff --git a/output/Useraccounts/AdminLTE/_usr_list.html.new.ep b/output/Useraccounts/AdminLTE/_usr_list.html.new.ep new file mode 100644 index 0000000..7970e5f --- /dev/null +++ b/output/Useraccounts/AdminLTE/_usr_list.html.new.ep @@ -0,0 +1,161 @@ +
+ + % my $btn = l("usr_ADD_USER"); + +
+
+
+ +
+
+ +
+ <%= $c->render_to_string(inline => $c->l("usr_FIRSTPAGE_DESC")) %> +
+ + %#= dumper @$users + + % my $numUsers = @$users; + % if ($numUsers == 0) { + <%=l "usr_NO_USER_ACCOUNTS" %> + % } else { +
+ + + + + + + + + + + + + % foreach my $user (@$users) { + + % my $username = $user->key(); + % my $first = $user->prop("FirstName"); + % my $last = $user->prop("LastName"); + % my $lockable = $user->prop("Lockable") || "yes"; + % my $removable = $user->prop("Removable") || "yes"; + % my $fwd = (($user->prop("EmailForward") || "local") =~ m/^forward|both$/) ? + % $user->prop("ForwardAddress") : ""; + % my $vpnaccess = $user->prop("VPNClientAccess") || "no"; + % $vpnaccess = $vpnaccess eq "yes" ? $c->l("YES") : $c->l("NO"); + % my $password_set = $user->prop("PasswordSet"); + % my $useraccounts_user_name = $user->key; # useraccountss_entry name extracted from the data structure + % my $csrf_token = "TOKEN"; # CSRF token for security + % my $modify_text = l("MODIFY"); # Localized text + % my $remove_text = l("REMOVE"); # Localized text + % my $password_text = l("PASSWORD_RESET"); + % my $lock_text = l("Lock"); # Localized text + % my $roundcube_text = l("Webmail"); # Localized text + % my ($actionModify, $actionLock, $actionResetPw, $actionRemove,$actionroundcube) = " "; + % my $thisdomain = $c->req->url->to_abs->host; + + + + + + + + % if ($useraccounts_user_name eq "admin") { + %$actionModify = qq{ + % + % + % + %}; + %$actionResetPw = qq{ + % + % + % + %}; + % } else { + %$actionModify = qq{ + % + % + % + %}; + % } + + + % if ($password_set ne "yes") { + + + %#$actionLock = l("ACCOUNT_LOCKED"); + + %$actionLock = qq{ + % + % + % + %}; + %$actionResetPw = qq{ + % + % + % + %}; + + % } elsif ($useraccounts_user_name ne "admin") { + %$actionLock = qq{ + % + % + % + %}; + %$actionResetPw = qq{ + % + % + % + %}; + % } + + % if ( $removable eq "yes" ) { + %$actionRemove = qq{ + % + % + % + %}; + % } + + + % $actionroundcube = qq{ + % + % + % + %}; + + + + + + + + % } + +
<%= l "ACCOUNT" %><%= l "USER_NAME" %><%= l "usr_VPN_CLIENT_ACCESS" %><%= l "usr_FORWARDING_ADDRESS" %><%= l "ACTION" %>
<%= $username %><%= $first %> <%=$last %><%= $vpnaccess %><%= $fwd %><%= $c->render_to_string(inline => $actionModify) %><%= $c->render_to_string(inline => $actionResetPw) %><%= $c->render_to_string(inline => $actionLock) %><%= $c->render_to_string(inline => $actionRemove) %><%= $c->render_to_string(inline => $actionroundcube) %>
+
+ + % } + + <%= hidden_field "trt" => $usr_datas->{trt} %> + +
+ diff --git a/output/Useraccounts/AdminLTE/_usr_lock.html.new.ep b/output/Useraccounts/AdminLTE/_usr_lock.html.new.ep new file mode 100644 index 0000000..1ab5a01 --- /dev/null +++ b/output/Useraccounts/AdminLTE/_usr_lock.html.new.ep @@ -0,0 +1,57 @@ +
+ + % my $btn = l("Lock"); + +
+ + %#= form_for "/useraccountsd" => (method => "POST") => begin + +
+

<%= l "Lock_ACCOUNT_TITLE" %>

+
+
+
+ Needs a text change in the Lex files +
+ <%= $c->l("Lock_DESC", $usr_datas->{user}, $usr_datas->{name} ) %> +
+ +

+ + + + + + + + + + + + + + +
+ %=l "ACCOUNT" + + %=l "USER_NAME" +
<%= $usr_datas->{user} %><%= $usr_datas->{name} %>
+ +
+ %= $c->render_to_string(inline => $c->l("Lock_DESC2")) + +
+
+ +
+
+ + + %= hidden_field "trt" => $usr_datas->{trt} + %= hidden_field "user" => $usr_datas->{user} + %= hidden_field "name" => $usr_datas->{name} + +
+ %# end + +
diff --git a/output/Useraccounts/AdminLTE/_usr_upd.html.new.ep b/output/Useraccounts/AdminLTE/_usr_upd.html.new.ep new file mode 100644 index 0000000..b57d681 --- /dev/null +++ b/output/Useraccounts/AdminLTE/_usr_upd.html.new.ep @@ -0,0 +1,296 @@ + +
+
+

<%= l "usr_P2_TITLE" %>

+
+ <%= $c->render_to_string(inline => l ("usr_CREATE_MODIFY_DESC")) %> +

+ + % my $btn = l("ADD"); + +
+ %#= form_for "/useraccountsd" => (method => "POST") => begin + + % if ( $usr_datas->{trt} eq "ADD" ) { + + % param "user" => $usr_datas->{user} unless param "user"; + +
+
+ +
+
+ +
+
+ + User + +
+
+ + % } else { + + % $btn = l("SAVE"); + +
+
+ +
+
+ +
+ +
+ % } + +
+ +
+
+ +
+
+ +
+
+ + First Name + +
+
+
+ + % param "LastName" => $usr_datas->{lastname} unless param "LastName"; + +
+
+ +
+
+ +
+
+ + Last Name + +
+
+
+ + + % param "Dept" => $usr_datas->{dept} unless param "Dept"; + +
+
+ +
+
+ +
+
+ + Department + +
+
+
+ + + % param "Company" => $usr_datas->{company} unless param "Company"; + +
+
+ +
+
+ +
+
+ + Company + +
+
+
+ + + % param "Street" => $usr_datas->{street} unless param "Street"; + +
+
+ +
+
+ +
+
+ + Street + +
+
+
+ + % param "City" => $usr_datas->{city} unless param "City"; + +
+
+ +
+
+ +
+
+ + City + +
+
+
+ + % param "Phone" => $usr_datas->{phone} unless param "Phone"; + +
+
+ +
+
+ +
+
+ + Phone + +
+
+
+ + % param "EmailForward" => $usr_datas->{emailforward} unless param "EmailForward"; + +
+
+ +
+
+ %= select_field "EmailForward" => $c->emailForward_list(), class => "form-select" +
+
+
+ + % param "ForwardAddress" => $usr_datas->{forwardaddress} unless param "ForwardAddress"; + +
+
+ +
+
+ {forwardaddress} %>> +
+
+ + Email forwarding address + +
+
+
+ + + % param "VPNClientAccess" => $usr_datas->{vpnclientaccess} unless param "VPNClientAccess"; + +
+
+ +
+
+ %= select_field "VPNClientAccess" => [[ (l "NO") => "no"], [ (l "YES") => "yes"]], class => "form-select" +
+
+
+ + + + + + % if ( $usr_datas->{trt} eq "UPD" and $c->ipsec_for_acct eq "OK" ) { + % my $btn2 = $c->l("DOWNLOAD"); + %= form_for "/useraccountso" => (method => "POST") => begin + %= l "usr_LABEL_IPSECRW_DOWNLOAD" + %= submit_button $btn2, class => "" + %= hidden_field "trt" => "CRT" + %= hidden_field "user" => $usr_datas->{user} + % end + % } + + + + +
+ % my @groups = @{$c->get_groups()}; + + %#= dumper @groups + + % if ( @groups ) { + +

+ + %=l "usr_GROUP_MEMBERSHIPS" + +

+ + + + + + + + + + + + % foreach my $g ( @groups) { + % my $user = $usr_datas->{user}; + % my $groupname = $g->key(); + % my $description = $g->prop("Description"); + % my $checked = ""; + % if ( $user and $c->is_user_in_group($user, $groupname) ) { + % $checked = "checked"; + % } + + + + + + + % } + + +
<%= l "usr_MEMBER" %><%=l "GROUP" %><%=l "DESCRIPTION" %>
+ % if ( $checked eq "checked" ) { + + %} else { + %= check_box "groupMemberships" => $groupname + %} + <%= $groupname %><%= $description %>
+ + % } + +
+ +
+
+ +
+
+ + %= hidden_field "trt" => $usr_datas->{trt} + + % if ( $usr_datas->{trt} eq "UPD" ) { + %= hidden_field "user" => $usr_datas->{user} + % } + +
+ %#end +
+ + \ No newline at end of file diff --git a/output/Useraccounts/default/_usr_lock.html.new.ep b/output/Useraccounts/default/_usr_lock.html.new.ep new file mode 100644 index 0000000..ece73fe --- /dev/null +++ b/output/Useraccounts/default/_usr_lock.html.new.ep @@ -0,0 +1,28 @@ +
+ + % my $btn = l("Lock"); + + %= form_for "/useraccountsd" => (method => "POST") => begin +

+

+ %=l "Lock_ACCOUNT_TITLE" +

+ +
+ %= $c->l("Lock_DESC", $usr_datas->{user}, $usr_datas->{name} ); +
+ %= $c->render_to_string(inline => $c->l("Lock_DESC2")) +

+ +

+
+ %= submit_button "$btn", class => "action" +

+ + %= hidden_field "trt" => $usr_datas->{trt} + %= hidden_field "user" => $usr_datas->{user} + %= hidden_field "name" => $usr_datas->{name} + + % end + +
diff --git a/output/Useraccounts/default/_usr_upd.html.new.ep b/output/Useraccounts/default/_usr_upd.html.new.ep new file mode 100644 index 0000000..d86da0b --- /dev/null +++ b/output/Useraccounts/default/_usr_upd.html.new.ep @@ -0,0 +1,185 @@ +
+ + + % my $btn = l("ADD"); + + %= form_for "/useraccountsd" => (method => "POST") => begin +

+

+ %=l "usr_P2_TITLE" +

+
+ %= $c->render_to_string(inline => l ("usr_CREATE_MODIFY_DESC")) +

+ +

+ + %=l "usr_ACCOUNT_NAME" + + % if ( $usr_datas->{trt} eq "ADD" ) { + % param "user" => $usr_datas->{user} unless param "user"; + %= text_field "user", class => "input" + % } else { + % $btn = l("SAVE"); + %= $usr_datas->{user}, class => "data" + % } + +

+ +

+ + %=l "usr_FIRSTNAME" + + % param "FirstName" => $usr_datas->{firstname} unless param "FirstName"; + %= text_field "FirstName", class => "input" + +

+

+ + %=l "usr_LASTNAME" + + % param "LastName" => $usr_datas->{lastname} unless param "LastName"; + %= text_field "LastName", class => "input" + +

+ +

+ + %=l "Department" + + % param "Dept" => $usr_datas->{dept} unless param "Dept"; + %= text_field "Dept", class => "input" + +

+

+ + %=l "Company" + + % param "Company" => $usr_datas->{company} unless param "Company"; + %= text_field "Company", class => "input" + +

+

+ + %=l "usr_STREET_ADDRESS" + + % param "Street" => $usr_datas->{street} unless param "Street"; + %= text_field "Street", class => "input" + +

+

+ + %=l "City" + + % param "City" => $usr_datas->{city} unless param "City"; + %= text_field "City", class => "input" + +

+

+ + %=l "usr_PHONE_NUMBER" + + % param "Phone" => $usr_datas->{phone} unless param "Phone"; + %= text_field "Phone", class => "input" + +

+

+ + %=l "usr_EMAIL_DELIVERY" + + % param "EmailForward" => $usr_datas->{emailforward} unless param "EmailForward"; + %= select_field "EmailForward" => $c->emailForward_list(), class => "input" + +

+

+ + %=l "usr_FORWARDING_ADDRESS" + + % param "ForwardAddress" => $usr_datas->{forwardaddress} unless param "ForwardAddress"; + %= text_field "ForwardAddress", class => "input" + +

+ +

+ + %=l "usr_VPN_CLIENT_ACCESS" + + % param "VPNClientAccess" => $usr_datas->{vpnclientaccess} unless param "VPNClientAccess"; + %= select_field "VPNClientAccess" => [[ (l "NO") => "no"], [ (l "YES") => "yes"]], class => "input" + +

+ + % if ( $usr_datas->{trt} eq "UPD" and $c->ipsec_for_acct eq "OK" ) { + % my $btn2 = $c->l("DOWNLOAD"); + %= form_for "/useraccountso" => (method => "POST") => begin +

+ + %=l "usr_LABEL_IPSECRW_DOWNLOAD" + + %= submit_button $btn2, class => "action" + +

+ %= hidden_field "trt" => "CRT" + %= hidden_field "user" => $usr_datas->{user} + %end + % } + + % my @groups = @{$c->get_groups()}; + % if ( @groups ) { +

+ + %=l "usr_GROUP_MEMBERSHIPS" + + + + + + + % foreach my $g ( @groups) { + % my $user = $usr_datas->{user}; + % my $groupname = $g->key(); + % my $description = $g->prop("Description"); + % my $checked = ""; + % if ( $user and $c->is_user_in_group($user, $groupname) ) { + % $checked = "checked"; + % } + + + + + %= t td => (class => "sme-border") => $groupname + %= t td => (class => "sme-border") => "$description" + + % } + +
+ %=l "usr_MEMBER" + + %=l "GROUP" + + %=l "DESCRIPTION" +
+ % if ( $checked eq "checked" ) { + + + %} else { + %= check_box "groupMemberships" => $groupname + %} +
+
+

+ % } + +

+

+ %= submit_button $btn, class => "action" +

+ + %= hidden_field "trt" => $usr_datas->{trt} + % if ( $usr_datas->{trt} eq "UPD" ) { + %= hidden_field "user" => $usr_datas->{user} + % } + + % end + +
diff --git a/output/Useraccounts/useraccounts_en.lex.diff b/output/Useraccounts/useraccounts_en.lex.diff new file mode 100644 index 0000000..f630850 --- /dev/null +++ b/output/Useraccounts/useraccounts_en.lex.diff @@ -0,0 +1,4 @@ +'Users' => 'Users', +'usr_CANNOT_MODIFY_USER_GROUPS' => 'Error: an internal error occurred while attempting to modify the group "[_1]" for user "[_2]".', +'usr_LOCK_ACCOUNT' => 'Lock account', +'usr_SYSTEM_PASSWORD_FORM_TITLE' => 'Change system password', diff --git a/output/Useraccounts/useraccounts_en.lex.new1 b/output/Useraccounts/useraccounts_en.lex.new1 new file mode 100644 index 0000000..c989180 --- /dev/null +++ b/output/Useraccounts/useraccounts_en.lex.new1 @@ -0,0 +1,60 @@ +# +# Lex file for Useraccounts generated on 2025-07-17 09:52:29 +# +'Users' => 'Users', +'usr_ACCOUNT_CONFLICT' => 'Error: the account "[_1]" can"t be created because there is already a [_1] account of that name.', +'usr_ACCOUNT_NAME' => 'Account name', +'usr_ACCOUNT_TOO_LONG' => 'Error: account name is too long. The maximum is [_1] characters.', +'usr_ACCT_NAME_HAS_INVALID_CHARS' => 'The account name "[_1]" contains invalid characters. Account names must start with a lower case letter and contain only lower case letters, numbers, hyphens, periods and underscores.', +'usr_ADD_USER' => 'Add user account', +'usr_CANNOT_CONTAIN_WHITESPACE' => 'This field cannot contain white-space', +'usr_CANNOT_MODIFY_USER' => 'Error: an internal error occurred while attempting to modify the user "[_1]".', +'usr_CANNOT_MODIFY_USER_GROUPS' => 'Error: an internal error occurred while attempting to modify the group "[_1]" for user "[_2]".', +'usr_CREATE_MODIFY_DESC' => '

The account name should contain only lower-case letters, numbers, hyphens, periods, underscores and should start with a lower-case letter. For example "betty","hjohnson", and "mary-jane" are all valid account names, but "3friends", "John Smith", and "henry:miller" are not.

Note that two special pseudonyms will be created for each new account. These pseudonyms provide the ability to have alternative mail accounts for that user which include their first name and last name separated with a period (.) and underscore (_). So, for the account "betty" with first name "Betty" and last name "Rubble" two pseudonyms are created as betty.rubble and betty_rubble.

The directory information (department, company, etc.) can be changed from the defaults shown below. The changes will apply only to this user.

', +'usr_CURRENT_SYSTEM_PASSWORD' => 'Current system password', +'usr_DELIVER_AND_FORWARD' => 'Both deliver locally and forward', +'usr_DELIVER_EMAIL_LOCALLY' => 'Deliver email locally', +'usr_EMAIL_DELIVERY' => 'Email delivery', +'usr_ERR_OCCURRED_CREATING' => 'An error occurred creating the user.', +'usr_ERR_OCCURRED_DELETING' => 'An error occurred while trying to delete the user.', +'usr_ERR_OCCURRED_MODIFYING_PASSWORD' => 'An error occurred while updating the password', +'usr_FIRSTNAME' => 'First name', +'usr_FIRSTPAGE_DESC' => '

You can modify, lock or remove any account or reset the account"s password by clicking on the corresponding command next to the account.

If the account is marked as locked, that means that the user"s password needs to be reset. Please note that newly created accounts are automatically locked until the password is changed.

', +'usr_FORM_TITLE' => 'Create, modify, or remove user accounts', +'usr_FORWARD_EMAIL' => 'Forward email to address below', +'usr_FORWARDING_ADDRESS' => 'Forwarding address', +'usr_GROUP_MEMBERSHIPS' => 'Group memberships', +'usr_LABEL_IPSECRW_DOWNLOAD' => 'Download digital certificate to IPSec client', +'usr_LASTNAME' => 'Last name', +'usr_LOCK_ACCOUNT' => 'Lock account', +'usr_LOCK_ACCOUNT_TITLE' => 'Lock user account', +'usr_LOCK_DESC' => 'You are about to lock the user account "[_1]" ([_2])', +'usr_LOCK_DESC2' => 'This user account will be locked. This means that this user will not be able to log in, and will not be able to collect e-mail. Any e-mail arriving will still be stored and/or forwarded to an external e-mail address, as configured. The account may be activated in the future by setting a new password. The current password will not be retained.

Are you sure you wish to lock this account?', +'usr_LOCKED_ACCOUNT' => 'Successfully locked account for user "[_1]".', +'usr_MEMBER' => 'Member?', +'usr_MODIFY_ADMIN_TITLE' => 'Modify the admin account', +'usr_NEW_SYSTEM_PASSWORD' => 'New system password', +'usr_NEW_SYSTEM_PASSWORD_VERIFY' => 'New system password (verify)', +'usr_NO_SUCH_USER' => 'Error: the user account "[_1]" does not exist.', +'usr_NO_USER_ACCOUNTS' => 'There are no user accounts on this system.', +'usr_P2_TITLE' => 'Create or modify', +'usr_PASSWORD_CHANGE_SUCCEEDED' => 'Successfully changed password for user "[_1]".', +'usr_PHONE_NUMBER' => 'Phone number', +'usr_PSEUDONYM_CLASH' => 'Error: the pseudonym "[_1]" is already taken by the existing user account "[_1]".To differentiate, add initials to this field.', +'usr_REMOVE_ACCOUNT_TITLE' => 'Remove user account', +'usr_REMOVE_DESC' => 'You are about to remove the user account "[_1]" ([_2])', +'usr_REMOVE_DESC2' => 'All files belonging to this user account will be deleted. Also, any e-mail for this user account still remaining on the server (i.e. that has not yet been retrieved by the user) will be discarded.

Are you sure you wish to remove this account?', +'usr_RESET_DESC' => 'You are about to change the password for the user account "[_1]" ([_2])', +'usr_RESET_DESC2' => 'Enter the new password in the fields below', +'usr_STREET_ADDRESS' => 'Street address', +'usr_SYSTEM_PASSWORD_AUTH_ERROR' => 'The current password is incorrect.', +'usr_SYSTEM_PASSWORD_CHANGED' => 'The system password has been changed.', +'usr_SYSTEM_PASSWORD_DESCRIPTION' => 'Certain services on this server installation require a username and password (for example this web page for the server manager application). The username is always admin. You can change the system password using the fields below.', +'usr_SYSTEM_PASSWORD_FORM_TITLE' => 'Change system password', +'usr_SYSTEM_PASSWORD_UNPRINTABLES_IN_PASS' => 'Password must contain only printable characters', +'usr_SYSTEM_PASSWORD_VERIFY_ERROR' => 'The two passwords are not identical.', +'usr_TAINTED_USER' => 'The account name "[_1]" contains invalid characters.', +'usr_UNACCEPTABLE_CHARS' => 'This field must contain only letters, numbers, dots, hypens and underscores and start with a letter', +'usr_USER_CREATED' => 'Successfully created user account. ', +'usr_USER_MODIFIED' => 'Successfully modified user account. ', +'usr_VPN_CLIENT_ACCESS' => 'VPN Client Access', diff --git a/output/Userpassword/userpassword_en.lex.diff b/output/Userpassword/userpassword_en.lex.diff new file mode 100644 index 0000000..653711a --- /dev/null +++ b/output/Userpassword/userpassword_en.lex.diff @@ -0,0 +1,6 @@ +'pwd_ACCOUNT_GROUP_NONE' => 'There are no user groups in the system.', +'pwd_ACCOUNT_NAME_INVALID' => 'The account name entered is invalid.', +'pwd_ACCOUNT_NAME_INVALID_CHARS' => 'The account name you entered contained invalid characters.', +'pwd_ACCOUNT_USER_NONE' => 'There are no user accounts in the system.', +'pwd_RESET_PASSWORD_TITLE' => 'Reset user password', +'pwd_YOUR_ACCOUNT_INVALID' => 'The account name entered is invalid.', diff --git a/output/Userpassword/userpassword_en.lex.new1 b/output/Userpassword/userpassword_en.lex.new1 new file mode 100644 index 0000000..7467972 --- /dev/null +++ b/output/Userpassword/userpassword_en.lex.new1 @@ -0,0 +1,26 @@ +# +# Lex file for Userpassword generated on 2025-07-17 09:52:29 +# +'pwd_ACCOUNT_GROUP_NONE' => 'There are no user groups in the system.', +'pwd_ACCOUNT_NAME_INVALID' => 'The account name entered is invalid.', +'pwd_ACCOUNT_NAME_INVALID_CHARS' => 'The account name you entered contained invalid characters.', +'pwd_ACCOUNT_PASSWORD_CHANGE' => 'Change account password', +'pwd_ACCOUNT_USER_NONE' => 'There are no user accounts in the system.', +'pwd_DESCRIPTION' => '

To change your account password, please fill out the following form. You will need to provide the name of your account, your old password, and your desired new password. (You must type the new password twice.)

If you cannot change your password because you have forgotten the old one, your local system administrator can reset your password using the server manager.

', +'pwd_DESCRIPTION_RESET' => '

To reset your account password, please fill out the following form. You will need to provide your desired new password. (You must type it twice.)

In cas of problem, your local system administrator can reset your password using the server manager.

', +'pwd_ERROR_PASSWORD_CHANGE' => 'An error occurred while attempting to change your password. Please make sure that the old password entered is correct.', +'pwd_FIELDS_REQUIRED' => 'All fields are required', +'pwd_PASSWORD_CHANGE' => 'Change Password', +'pwd_PASSWORD_CHANGE_SUCCESS' => 'Your password has been successfully changed.', +'pwd_PASSWORD_DESCRIPTION' => 'The password must be composed of at least twelve characters with uppercase and lowercase letters, numbers and non-alphanumeric characters.', +'pwd_PASSWORD_INVALID_CHARS' => 'The password you entered contained invalid characters.', +'pwd_PASSWORD_NEW' => 'New password:', +'pwd_PASSWORD_OLD' => 'Old password:', +'pwd_PASSWORD_OLD_INVALID_CHARS' => 'The old password you entered contained invalid characters.', +'pwd_PASSWORD_RESET' => 'Reset password', +'pwd_PASSWORD_VERIFY_ERROR' => 'The new passwords you entered did not match.', +'pwd_PASSWORD_VERIFY_NEW' => 'New password (verify):', +'pwd_PASSWORD_WIKI' => 'If you want to know more about passwords, then please refer to the Wiki', +'pwd_RESET_PASSWORD_TITLE' => 'Reset user password', +'pwd_YOUR_ACCOUNT' => 'Your account:', +'pwd_YOUR_ACCOUNT_INVALID' => 'The account name entered is invalid.', diff --git a/output/Viewlogfiles/AdminLTE/viewlogfiles.html.new.ep b/output/Viewlogfiles/AdminLTE/viewlogfiles.html.new.ep new file mode 100644 index 0000000..899aa53 --- /dev/null +++ b/output/Viewlogfiles/AdminLTE/viewlogfiles.html.new.ep @@ -0,0 +1,112 @@ +% layout "AdminLTE", title => "Sme server 2 - viewlogfiles"; + +% content_for "module" => begin + +
+ + %if (config->{debug} == 1) { +
+ (DBG)route: <%= $c->current_route %>
+
+ % } + +

<%= $title %>

+ +
+ + <%= $notif %> + + <% my $btn = l("NEXT"); %> + + +
+ +
+ <%=l "log_FIRSTPAGE_DESC" %> +
+ +
+ +
+
+ +
+
+ % param "Filename" => "messages"; + + %= select_field "Filename" => $c->findlogFiles(), class => "form-select", id => "LogFileSelect" +
+
+ +
+ +
+ <%= l "log_FILTER_PATTERN_DESC" %> +
+ +
+ +
+
+ +
+
+ +
+
+ + +
+ +
+ <%= l "log_MATCH_PATTERN_DESC" %> +
+ +
+ +
+
+ +
+
+ +
+
+ +
+ +
+ <%= l "log_OP_DESC" %> +
+ +
+ +
+
+ +
+
+ %if ($log_datas->{"default_op"} eq "download") { + % param "Operation" => "download"; + % } + %= select_field "Operation" => [[(l "log_VIEW") => "view"],[(l "DOWNLOAD") => "download"]], class => "form-select", id => "LogOperation" +
+
+ +
+ +
+ <%= l "log_END_DESC" %> +
+ +
+
+ +
+
+ +
+ +
+ +%end diff --git a/output/Viewlogfiles/default/viewlogfiles.html.new.ep b/output/Viewlogfiles/default/viewlogfiles.html.new.ep new file mode 100644 index 0000000..b55ad07 --- /dev/null +++ b/output/Viewlogfiles/default/viewlogfiles.html.new.ep @@ -0,0 +1,68 @@ +% layout "default", title => "Sme server 2 - viewlogfiles"; + +% content_for "module" => begin +
+ %if (config->{debug} == 1) { +

+ (DBG)route: <%= $c->current_route %>
+

+ %} +

<%= $title %>

+
+ <%= $notif %> + <% my $btn = l("NEXT"); %> + + %= form_for "viewlogfiles" => (method => "POST") => begin +

+ %=l "log_FIRSTPAGE_DESC" +
+ + %=l "log_LOG_FILE_SELECT_DESC" + + % param "Filename" => "messages"; + + %= select_field "Filename" => $c->findlogFiles(), class => "input" + +

+ +

+ %=l "log_FILTER_PATTERN_DESC" +
+ + %=l "log_FILTER_PATTERN_LABEL" + + %= text_field "Matchpattern", class => "input" + +

+ +

+ %=l "log_MATCH_PATTERN_DESC" +
+ + %=l "log_MATCH_PATTERN_LABEL" + + %= text_field "Highlightpattern", class => "input" + +

+ +

+ %=l "log_OP_DESC" +
+ + %=l "Operation" + + %if ($log_datas->{"default_op"} eq "download") { + % param "Operation" => "download"; + %} + %= select_field "Operation" => [[(l "log_VIEW") => "view"],[(l "DOWNLOAD") => "download"]], class => "input" + +

+ +

+ %=l "log_END_DESC" +

+ + %= submit_button "$btn", class => "action" + % end +
+%end diff --git a/output/Viewlogfiles/viewlogfiles_en.lex.diff b/output/Viewlogfiles/viewlogfiles_en.lex.diff new file mode 100644 index 0000000..1a93fd1 --- /dev/null +++ b/output/Viewlogfiles/viewlogfiles_en.lex.diff @@ -0,0 +1,6 @@ +'log_DOWNLOAD_FILE' => 'Preparing to download the logfile [_1].', +'log_DOWNLOAD_PAGE_DESC' => 'Your logfile download is now prepared. It will proceed as soon +as you click on the "Next" button below, and instruct +your browser to accept the download via the pop-up window that +will appear.', +'log_REFRESH' => 'Refresh this logfile', diff --git a/output/Viewlogfiles/viewlogfiles_en.lex.new1 b/output/Viewlogfiles/viewlogfiles_en.lex.new1 new file mode 100644 index 0000000..115b04a --- /dev/null +++ b/output/Viewlogfiles/viewlogfiles_en.lex.new1 @@ -0,0 +1,40 @@ +# +# Lex file for Viewlogfiles generated on 2025-07-17 09:52:29 +# +'log_DOWNLOAD_FILE' => 'Preparing to download the logfile [_1].', +'log_DOWNLOAD_PAGE_DESC' => 'Your logfile download is now prepared. It will proceed as soon +as you click on the "Next" button below, and instruct +your browser to accept the download via the pop-up window that +will appear.', +'log_END_DESC' => 'Please note that it may take quite some time to generate these +reports.', +'log_FILENAME_ERROR' => '

Error while specifying log file name.

+

Invalid report type "[_1]".

', +'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 +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.', +'log_FILTER_PATTERN_LABEL' => 'Filter Pattern (optional)', +'log_FIRSTPAGE_DESC' => 'This panel allows you to view or download the log files generated +by the services running on your server.', +'log_FORM_TITLE' => 'View log files', +'log_HIGHLIGHT_HEADER' => 'Highlighting lines matching: "[_1]".', +'log_LOG_FILE_EMPTY' => 'Log file "[_1]" is empty!', +'log_LOG_FILE_SELECT_DESC' => 'Choose a log file to view', +'log_MATCH_HEADER' => 'Displaying lines matching: "[_1]".', +'log_MATCH_PATTERN_DESC' => 'You may also optionally specify a highlight pattern to mark in bold +any lines from the log file which match the highlight pattern. The +highlight pattern is applied to any lines which have already +matched the filter pattern. Note that this option is not used if +you download the logfile.', +'log_MATCH_PATTERN_LABEL' => 'Highlight Pattern (optional)', +'log_NO_MATCHING_LINES' => 'No matching lines displayed.', +'log_OP_DESC' => 'You must choose between viewing the logfile in your browser, or +downloading the logfile to your computer. If the logfile is +particularly large, you may wish to download it instead of +attempting to open it in your browser, as this is a problem for +some web browsers.', +'log_REFRESH' => 'Refresh this logfile', +'log_VIEW' => 'View log file', +'log_VIEWING_TIME' => 'Viewed at [_1].', diff --git a/output/Workgroup/workgroup_en.lex.diff b/output/Workgroup/workgroup_en.lex.diff new file mode 100644 index 0000000..b35b2ed --- /dev/null +++ b/output/Workgroup/workgroup_en.lex.diff @@ -0,0 +1,9 @@ +'wkg_INVALID_SERVERNAME' => 'The server name must begin with a letter (upper or lower case), +followed by any combination of letters, numbers, underscores and +hyphens.', +'wkg_INVALID_WORKGROUP' => 'The workgroup name must begin with a letter (upper or lower +case), followed by any combination of letters, numbers, +underscores, periods and hyphens.', +'wkg_INVALID_WORKGROUP_MATCHES_SERVERNAME' => 'The server and workgroup names match, when compared in lower case. +These values must be different in order for filesharing to be turned on. ', +'Workgroup' => 'Workgroup', diff --git a/output/Workgroup/workgroup_en.lex.new1 b/output/Workgroup/workgroup_en.lex.new1 new file mode 100644 index 0000000..2be9b84 --- /dev/null +++ b/output/Workgroup/workgroup_en.lex.new1 @@ -0,0 +1,29 @@ +# +# Lex file for Workgroup generated on 2025-07-17 09:52:29 +# +'wkg_DESC_PDC' => 'Should this server act as the workgroup +and domain controller on your Windows network? You should leave +this set to No if another server is already performing this +role on your network.', +'wkg_DESC_ROAM' => 'Should this server support roaming profiles? +You should leave this set to the default of No unless you have +experience administering server-based Windows roaming profiles and +know that this feature is required.', +'wkg_DESC_SERVERNAME' => 'Enter the name that this server should use for +Windows and Macintosh file sharing.', +'wkg_DESC_WORKGROUP' => 'Enter the name of the Windows workgroup that this server should appear in.', +'wkg_FORM_TITLE' => 'Change workgroup settings', +'wkg_INVALID_SERVERNAME' => 'The server name must begin with a letter (upper or lower case), +followed by any combination of letters, numbers, underscores and +hyphens.', +'wkg_INVALID_WORKGROUP' => 'The workgroup name must begin with a letter (upper or lower +case), followed by any combination of letters, numbers, +underscores, periods and hyphens.', +'wkg_INVALID_WORKGROUP_MATCHES_SERVERNAME' => 'The server and workgroup names match, when compared in lower case. +These values must be different in order for filesharing to be turned on. ', +'wkg_LABEL_PDC' => 'Workgroup and Domain Controller', +'wkg_LABEL_ROAM' => 'Roaming profiles', +'wkg_LABEL_SERVERNAME' => 'Server Name', +'wkg_LABEL_WORKGROUP' => 'Windows workgroup', +'wkg_SUCCESS' => 'The new workgroup settings have been saved', +'Workgroup' => 'Workgroup', diff --git a/output/Yum/AdminLTE/yuminstall.html.new.ep b/output/Yum/AdminLTE/yuminstall.html.new.ep new file mode 100644 index 0000000..76cbea3 --- /dev/null +++ b/output/Yum/AdminLTE/yuminstall.html.new.ep @@ -0,0 +1,84 @@ +% layout "AdminLTE", title => "Sme server 2 - yum_install"; + +% content_for "module" => begin + +
+ + % if (config->{debug} == 1) { +
+            <%= dumper $c->current_route %>
+            <%= dumper $yum_datas %>
+        
+ % } + +

<%= $title%>

+ + % if ( $notif ) { +
+
+ <%= $notif %> +
+
+ % } + +
+ + <%= l "yum_HEADER_AVAILABLE_SOFTWARE" %> + +

+ + % if ($c->non_empty("available","group")) { + + <%=l "yum_DESC_AVAILABLE_GROUPS" %> + +

+ +
+
+ <%= l "yum_LABEL_AVAILABLE_GROUPS" %> +
+
+ % param "SelectedGroups" => $c->get_names2("updates","group") unless param "SelectedGroups"; + <%= select_field "SelectedGroups" => $c->get_options2("available", "group"), class => "form-select", size => "10", multiple => "1" %> +
+
+ % } + +

+ + % if ($c->non_empty("available","packages")) { + + <%= l "yum_DESC_AVAILABLE_PACKAGES" %> + +

+ +
+
+ <%=l "yum_LABEL_AVAILABLE_PACKAGES" %> +
+
+ % param "SelectedPackages" => $c->get_names2("updates","package") unless param "SelectedPackages"; + %= select_field "SelectedPackages" => $c->get_options2("available", "package"), class => "form-select", size => "10", multiple => "1" +
+
+ + % } + + +
+ <%= hidden_field "trt" => "INST" %> + % my $btnSave = $c->l("Install"); + + +
+
+ +
+
+ +
+ + +
+ +% end diff --git a/output/Yum/Yum.new.pm b/output/Yum/Yum.new.pm new file mode 100644 index 0000000..3800135 --- /dev/null +++ b/output/Yum/Yum.new.pm @@ -0,0 +1,484 @@ +package SrvMngr::Controller::Yum; + +#---------------------------------------------------------------------- +# heading : System +# description : Software installer +# navigation : 4000 500 + + #$if_admin->get("/yum")->to("yum#main")->name("yum"); + #$if_admin->post("/yum")->to("yum#do_display")->name("yumd1"); + #$if_admin->get("/yumd")->to("yum#do_display")->name("yumd"); + #$if_admin->post("/yumd")->to("yum#do_update")->name("yumu"); + +# +# routes : end +#---------------------------------------------------------------------- +use strict; +use warnings; +use Mojo::Base "Mojolicious::Controller"; +use Locale::gettext; +use SrvMngr::I18N; +use SrvMngr qw(theme_list init_session ip_number_or_blank); +# dnf_* should remain ASCII; yum_repositories do not need to be UTF-8 +use esmith::ConfigDB::UTF8; +use esmith::util; +use File::Basename; +our $cdb; +my $dnf_status_file = "/var/cache/dnf/dnf.status"; + +#use File::stat; +our %dbs; + + +sub main { + my $c = shift; + $c->app->log->info($c->log_req); + $cdb = esmith::ConfigDB::UTF8->open || die "Couldn"t open config db\"; + for (qw(available installed updates)) { + $dbs{$_} = esmith::ConfigDB::UTF8->open_ro(\"dnf_$_\") + or die \"Couldn"t open dnf_$_ DB\n"; + } + + for (qw(repositories)) { + $dbs{$_} = esmith::ConfigDB::UTF8->open("yum_$_") + or die "Couldn"t open yum_$_ DB\n\"; + } + my %yum_datas = (); + my $title = $c->l("yum_FORM_TITLE"); + my $dest = "yum"; + my $notif = ""; + $yum_datas{"trt"} = "STAT"; + + if ($c->is_dnf_running()) { + $yum_datas{"trt"} = "LOGF"; + $dest = "yumlogfile"; + } elsif ($cdb->get_prop("dnf", "LogFile")) { + $yum_datas{"trt"} = "PSTU"; + $yum_datas{"reconf"} = $cdb->get_value("UnsavedChanges", "yes"); + $dest = "yumpostupg"; + } else { + + # normal other trt + } + $c->stash(title => $title, notif => $notif, yum_datas => \%yum_datas); + return $c->render(template => $dest); +} ## end sub main + +sub do_display { + my $c = shift; + my $rt = $c->current_route; + my $trt = ($c->param("trt") || "STAT"); + $cdb = esmith::ConfigDB::UTF8->open || die \"Couldn"t open config db"; + for (qw(available installed updates)) { + $dbs{$_} = esmith::ConfigDB::UTF8->open_ro("dnf_$_") + or die "Couldn"t open dnf_$_ DB\n\"; + } + + for (qw(repositories)) { + $dbs{$_} = esmith::ConfigDB::UTF8->open(\"yum_$_\") + or die \"Couldn"t open yum_$_ DB\n"; + } + my %yum_datas = (); + my $title = $c->l("yum_FORM_TITLE"); + my ($notif, $dest) = ""; + $yum_datas{"trt"} = $trt; + + # force $trt if current logfile + if ($c->is_dnf_running()) { + $trt = "LOGF"; + } elsif ($cdb->get_prop("dnf", "LogFile")) { + $trt = "PSTU"; + } + + if ($trt eq "UPDT") { + $dest = "yumupdate"; + } + + if ($trt eq "INST") { + $dest = "yuminstall"; + } + + if ($trt eq "REMO") { + $dest = "yumremove"; + } + + if ($trt eq "CONF") { + $dest = "yumconfig"; + } + + if ($trt eq "LOGF") { + if ($c->is_dnf_running()) { + $dest = "yumlogfile"; + } + } ## end if ($trt eq "LOGF") + + if ($trt eq "PSTU") { + if ($cdb->get_prop("dnf", "LogFile")) { + $dest = "yumpostupg"; + $yum_datas{"reconf"} = $cdb->get_value("UnsavedChanges", "yes"); + } + } ## end if ($trt eq "PSTU") + if (!$dest) { $dest = "yum"; } + $c->stash(title => $title, notif => $notif, yum_datas => \%yum_datas); + return $c->render(template => $dest); +} ## end sub do_display + +sub do_update { + my $c = shift; + $c->app->log->info($c->log_req); + my $rt = $c->current_route; + my $trt = $c->param("trt"); + $cdb = esmith::ConfigDB::UTF8->open || die "Couldn"t open config db\"; + for (qw(available installed updates)) { + $dbs{$_} = esmith::ConfigDB::UTF8->open_ro(\"dnf_$_\") + or die \"Couldn"t open dnf_$_ DB\n"; + } + + for (qw(repositories)) { + $dbs{$_} = esmith::ConfigDB::UTF8->open("yum_$_") + or die "Couldn"t open yum_$_ DB\n\"; + } + my %yum_datas = (); + $yum_datas{trt} = $trt; + my $title = $c->l("yum_FORM_TITLE"); + my ($dest, $res, $result) = ""; + + if ($trt eq "UPDT") { + $dest = "yumupdate"; + + if (!$result) { + $res = $c->do_yum("update"); + $result .= $res unless $res eq "OK"; + + if (!$result) { + $yum_datas{trt} = "SUC"; + + #$result = $c->l("yum_SUCCESS"); + } ## end if (!$result) + } ## end if (!$result) + } ## end if ($trt eq "UPDT") + + if ($trt eq "INST") { + $dest = "yuminstall"; + + if (!$result) { + $res = $c->do_yum("install"); + $result .= $res unless $res eq "OK"; + + if (!$result) { + $yum_datas{trt} = "SUC"; + + #$result = $c->l("yum_SUCCESS"); + } ## end if (!$result) + } ## end if (!$result) + } ## end if ($trt eq "INST") + + if ($trt eq "REMO") { + $dest = "yumremove"; + + if (!$result) { + $res = $c->do_yum("remove"); + $result .= $res unless $res eq "OK"; + + if (!$result) { + $yum_datas{trt} = "SUC"; + + #$result = $c->l("yum_SUCCESS"); + } ## end if (!$result) + } ## end if (!$result) + } ## end if ($trt eq "REMO") + + if ($trt eq "CONF") { + $dest = "yumconfig"; + + if (!$result) { + $res = $c->change_settings(); + $result .= $res unless $res eq "OK"; + + if (!$result) { + $yum_datas{trt} = "SUC"; + $result = $c->l("yum_SUCCESS"); + } + } ## end if (!$result) + } ## end if ($trt eq "CONF") + + if ($trt eq "PSTU") { + my $reconf = $c->param("reconf") || "yes"; + $dest = "yumpostupg"; + + # effective reconfigure and reboot required + if ($reconf eq "yes") { + $res = $c->post_upgrade_reboot(); + $result .= $res unless $res eq "OK"; + + if (!$result) { + $yum_datas{trt} = "SUC"; + $result = $c->l("yum_SYSTEM_BEING_RECONFIGURED"); + } + } else { + $yum_datas{trt} = "SUC"; + $result = $c->l("yum_UPDATE_SUCCESS"); + } + } ## end if ($trt eq "PSTU") + + if ($trt eq "LOGF") { + $dest = "yumlogfile"; + + if (!$c->is_dnf_running()) { + $yum_datas{trt} = "SUC"; + $result = $c->l("yum_SUCCESS"); + } + } ## end if ($trt eq "LOGF") + + # do_yum ended (no message) --> forced to LOGFile + if (!$result) { + $dest = "yumlogfile"; + $yum_datas{trt} = "LOGF"; + } + $c->stash(title => $title, notif => $result, yum_datas => \%yum_datas); + + if ($yum_datas{trt} ne "SUC") { + return $c->render(template => $dest); + } + my $message = \""Yum" $trt update DONE\"; + $c->app->log->info($message); + $c->flash(success => $result) if $result; + $c->redirect_to(\"/yum\"); +} ## end sub do_update + +sub get_dnf_status { + + #interrogate status file created and maintained by smeserver.py plugin for dnf. + my ($c) = @_; + my $file_name = $dnf_status_file; + my $content = \"resolved\"; + + if (-e \"$file_name\") { + open my $fh, "<", $file_name or die \"Can"t open file: $!"; + $content = <$fh>; + close $fh; + } ## end if (-e "$file_name") + return $content; +} ## end sub get_dnf_status + +sub is_dnf_running { + my ($c) = @_; + my $dnf_status = $c->get_dnf_status(); + return $dnf_status ne "resolved" && $dnf_status ne "config" && $dnf_status ne "sack"; +} ## end sub is_dnf_running + +sub is_empty { + my ($c, $yumdb) = @_; + my $groups = $dbs{$yumdb}->get_all_by_prop(type => "group") || "none"; + my $packages = $dbs{$yumdb}->get_all_by_prop(type => "package") || "none"; + + #Show no updates if both = none + return 1 if ($packages eq $groups); + + #else return here + return; +} ## end sub is_empty + +sub non_empty { + my ($c, $yumdb, $type) = @_; + $type ||= "both"; + return 0 unless (exists $dbs{$yumdb}); + my $groups = scalar $dbs{$yumdb}->get_all_by_prop(type => "group"); + return $groups if ($type eq "group"); + my $packages = scalar $dbs{$yumdb}->get_all_by_prop(type => "package"); + + if ($type eq "package") { + return $c->package_functions_enabled ? $packages : 0; + } + return ($c->package_functions_enabled or $yumdb eq "updates") ? ($groups || $packages) : $groups; +} ## end sub non_empty + +sub package_functions_enabled { + my ($c) = @_; + return ($cdb->get_prop("dnf", "PackageFunctions") eq "enabled"); +} + +sub get_status { + my ($c, $prop, $localise) = @_; + my $status = $cdb->get_prop("dnf", $prop) || "disabled"; + return $status unless $localise; + return $c->l($status eq "enabled" ? "ENABLED" : "DISABLED"); +} ## end sub get_status + +sub get_options { + my ($c, $yumdb, $type) = @_; + my %options; + + for ($dbs{$yumdb}->get_all_by_prop(type => $type)) { + $options{ $_->key } = $_->key . " " . $_->prop("Version") . " - " . $_->prop("Repo"); + } + return \%options; +} ## end sub get_options + +sub get_options2 { + my ($c, $yumdb, $type) = @_; + my @options; + + for ($dbs{$yumdb}->get_all_by_prop(type => $type)) { + push @options, [ $_->key . " " . $_->prop("Version") . " - " . $_->prop("Repo") => $_->key ]; + } + return \@options; +} ## end sub get_options2 + +sub get_names { + return [ keys %{ get_options(@_) } ]; +} + +sub get_names2 { + my ($c, $yumdb, $type) = @_; + my @selected; + + for ($dbs{$yumdb}->get_all_by_prop(type => $type)) { + push @selected, $_->key; + } + return \@selected; + + # return [ values @{get_options2(@_)} ]; +} ## end sub get_names2 + +sub get_repository_options2 { + my $c = shift; + my @options; + + foreach my $repos ($dbs{repositories}->get_all_by_prop(type => "repository")) { + next unless ($repos->prop("Visible") eq "yes" + or $repos->prop("status") eq "enabled"); + push @options, [ $repos->prop("Name") => $repos->key ]; + } ## end foreach my $repos ($dbs{repositories...}) + my @opts = sort { $a->[0] cmp $b->[0] } @options; + return \@opts; +} ## end sub get_repository_options2 + +sub get_repository_current_options { + my $c = shift; + my @selected; + + foreach my $repos ($dbs{repositories}->get_all_by_prop(type => "repository")) { + next unless ($repos->prop("Visible") eq "yes" + or $repos->prop("status") eq "enabled"); + push @selected, $repos->key if ($repos->prop("status") eq "enabled"); + } ## end foreach my $repos ($dbs{repositories...}) + return \@selected; +} ## end sub get_repository_current_options + +sub get_avail2 { + my ($c, $yumdb, $type) = @_; + return $c->get_options2("available", "package"); +} + +sub get_check_freq_opt { + my ($c) = @_; + return [ + [ $c->l("DISABLED") => "disabled" ], + [ $c->l("Daily") => "daily" ], + [ $c->l("Weekly") => "weekly" ], + [ $c->l("Monthly") => "monthly" ] + ]; +} ## end sub get_check_freq_opt + +sub print_skip_header { + my ($c) = shift; + return "\n"; +} + +sub change_settings { + my ($c) = @_; + + for my $param ( + qw( + PackageFunctions + ) + ) + { + $cdb->set_prop("dnf", $param, $c->param("yum_$param")); + } ## end for my $param (qw( PackageFunctions...)) + my $check4updates = $c->param("yum_check4updates"); + my $status = "disabled"; + if ($check4updates ne "disabled") { $status = "enabled"; } + $cdb->set_prop("dnf", "check4updates", $check4updates); + my $deltarpm = $c->param("yum_DeltaRpmProcess"); + $cdb->set_prop("dnf", "DeltaRpmProcess", $deltarpm); + my $downloadonly = $c->param("yum_DownloadOnly"); + if ($downloadonly ne "disabled") { $status = "enabled"; } + $cdb->set_prop("dnf", "DownloadOnly", $downloadonly); + my $AutoInstallUpdates = $c->param("yum_AutoInstallUpdates"); + if ($AutoInstallUpdates ne "disabled") { $status = "enabled"; } + $cdb->set_prop("dnf", "AutoInstallUpdates", $AutoInstallUpdates); + $cdb->set_prop("dnf", "status", $status); + my %selected = map { $_ => 1 } @{ $c->every_param("SelectedRepositories") }; + + foreach my $repos ($dbs{repositories}->get_all_by_prop(type => "repository")) { + $repos->set_prop("status", exists $selected{ $repos->key } ? "enabled" : "disabled"); + } + $dbs{repositories}->reload; + + unless (system("/sbin/e-smith/signal-event", "dnf-modify") == 0) { + return $c->l("yum_ERROR_UPDATING_CONFIGURATION"); + } + return "OK"; +} ## end sub change_settings + +sub do_yum { + my ($c, $function) = @_; + + for (qw(SelectedGroups SelectedPackages)) { + $cdb->set_prop("dnf", $_, join(",", (@{ $c->every_param($_) }))); + } + esmith::util::backgroundCommand(0, "/sbin/e-smith/signal-event", "dnf-$function"); + + for (qw(available installed updates)) { + $dbs{$_}->reload; + } + return "OK"; +} ## end sub do_yum + +sub get_yum_status_page { + my ($c) = @_; + my $yum_status; + open(YUM_STATUS, "; + close(YUM_STATUS); + return $yum_status; +} ## end sub get_yum_status_page + +sub format_yum_log { + my $c = shift; + $cdb->reload; + my $filepage = $cdb->get_prop("dnf", "LogFile"); + return "" unless $filepage and (-e "$filepage"); + my $out = sprintf "
";
+    open(FILE, "$filepage");
+
+    while () {
+        $out .= sprintf("%s", $_);
+    }
+    close FILE;
+    $out .= sprintf "
"; + undef $filepage; + return $out; +} ## end sub format_yum_log + +sub post_upgrade_reboot { + my $c = shift; + $cdb->get_prop_and_delete("dnf", "LogFile"); + $cdb->reload; + + if (fork == 0) { + exec "/sbin/e-smith/signal-event post-upgrade; /sbin/e-smith/signal-event reboot"; + die "Exec failed"; + } + return "OK"; +} ## end sub post_upgrade_reboot + +sub show_yum_log { + my $c = shift; + my $out = $c->format_yum_log(); + my $yum_log = $cdb->get_prop_and_delete("dnf", "LogFile"); + return $out; +} ## end sub show_yum_log +1; \ No newline at end of file diff --git a/output/Yum/default/yuminstall.html.new.ep b/output/Yum/default/yuminstall.html.new.ep new file mode 100644 index 0000000..396767a --- /dev/null +++ b/output/Yum/default/yuminstall.html.new.ep @@ -0,0 +1,58 @@ +% layout "default", title => "Sme server 2 - yum_install"; + +% content_for "module" => begin + +
+ % if (config->{debug} == 1) { +

+ %= dumper $c->current_route + %= dumper $yum_datas +

+ % } + +

<%= $title%>

+ + % if ( $notif ) { +
+ %= $notif +
+ %} +
+ + %= form_for "yumd" => (method => "POST") => begin + + %=l "yum_HEADER_AVAILABLE_SOFTWARE" +

+ % if ($c->non_empty("available","group")) { + %=l "yum_DESC_AVAILABLE_GROUPS" +

+ %=l "yum_LABEL_AVAILABLE_GROUPS" + + % param "SelectedGroups" => $c->get_names2("updates","group") unless param "SelectedGroups"; + %= select_field "SelectedGroups" => $c->get_options2("available", "group"), class => "input", multiple => "1" +

+ %} +
+ % if ($c->non_empty("available","packages")) { + %=l "yum_DESC_AVAILABLE_PACKAGES" +

+ %=l "yum_LABEL_AVAILABLE_PACKAGES" + + % param "SelectedPackages" => $c->get_names2("updates","package") unless param "SelectedPackages"; + %= select_field "SelectedPackages" => $c->get_options2("available", "package"), class => "input", multiple => "1" +

+ %} + + + + %= hidden_field "trt" => "INST" +

+ + %= submit_button $c->l("Install"), class => "action" + + + % end + +
+ +% end diff --git a/output/Yum/yum_en.lex.diff b/output/Yum/yum_en.lex.diff new file mode 100644 index 0000000..e69de29 diff --git a/output/Yum/yum_en.lex.new1 b/output/Yum/yum_en.lex.new1 new file mode 100644 index 0000000..8a59bd9 --- /dev/null +++ b/output/Yum/yum_en.lex.new1 @@ -0,0 +1,77 @@ +# +# Lex file for Yum generated on 2025-07-17 09:52:30 +# +'yum_BUTTON_CONFIGURATION' => 'Change software installer settings', +'yum_BUTTON_INSTALL_AVAILABLE' => 'Install additional software', +'yum_BUTTON_INSTALL_UPDATES' => 'List available updates', +'yum_BUTTON_REMOVE' => 'Remove installed software', +'yum_DESC_AVAILABLE_GROUPS' => 'You can select software groups +to install from the list below.', +'yum_DESC_AVAILABLE_PACKAGES' => 'You can also select individual packages +to install from the list below.', +'yum_DESC_AVAILABLE_UPDATES' => 'The following updates are available for your system. +You should normally install all available updates. +If there are updates you do not wish to install, de-select +them from the list below.', +'yum_DESC_ENABLED_REPOSITORIES' => 'The software installer can install software +from any of enabled repositories. To enable +a repository, select it from the list. +To disable a repository, de-select it from the list. +By default, only stable, tested software is available +for installation.', +'yum_DESC_INSTALLED_GROUPS' => 'You can select software groups +to remove from the list below.', +'yum_DESC_INSTALLED_PACKAGES' => 'You can also select individual packages +you wish to remove from the list below.', +'yum_DESC_UPDATES_AVAILABLE' => 'There are updates available for your system. These updates +should be installed as soon as possible.', +'yum_DESC_UPTODATE' => 'All updates have been installed.', +'yum_DESC_YUM_AUTOINSTALLUPDATES' => 'If enabled this will take precedence over the simple check for updates notification and predownload features. Instead it will install the available updates from enabled repositories. For more information refer to yum and yum-cron manual page.', +'yum_DESC_YUM_DELTARPMPROCESS' => 'A deltarpm contains the difference between an old and a new version of a rpm, + which can save bandwith. The drawback is that update + operations consume considerably more CPU cycles', +'yum_DESC_YUM_DOWNLOADONLY' => 'The rpm updates can be downloaded during the night, + this will ease and give faster the yum update process + (only enabled repositories will be used).', +'yum_DESC_YUM_PACKAGEFUNCTIONS' => 'The software installer can manage groups of +related package or individual packages. By +default, only groups of packages are presented. +If you wish to manage individual packages, +enable this option. This should only be done +by experienced administrators.', +'yum_FORM_TITLE' => 'Software installer', +'yum_HEADER_AVAILABLE_SOFTWARE' => 'The following software is available to be installed +onto your system. You should only install additional +software onto this system if you are aware +of the consequences of doing so.', +'yum_HEADER_INSTALLED_SOFTWARE' => 'The following software is installed +on this system. You should only remove +software from this system if you are aware +of the consequences of doing so.', +'yum_HEADER_POSTUPGRADE_REQUIRED' => ' The system needs to be reconfigured + after adding or removing software, + or applying updates. +

+Please click on the Reconfigure button at the bottom of +this page to start the reconfiguration process. + An automatic reboot will be + initiated as part of this reconfiguration process +

', +'yum_INSTALL_UPDATES' => 'Install selected updates', +'yum_LABEL_AVAILABLE_GROUPS' => 'Available groups', +'yum_LABEL_AVAILABLE_PACKAGES' => 'Available packages', +'yum_LABEL_AVAILABLE_UPDATES' => 'Updates available', +'yum_LABEL_ENABLED_REPOSITORIES' => 'Enabled repositories', +'yum_LABEL_INSTALLED_GROUPS' => 'Installed groups', +'yum_LABEL_INSTALLED_PACKAGES' => 'Installed packages', +'yum_LABEL_YUM_AUTOINSTALLUPDATES' => 'Automatically install updates', +'yum_LABEL_YUM_DELTARPMPROCESS' => 'Delta Rpm Update', +'yum_LABEL_YUM_DOWNLOADONLY' => 'Predownload updates', +'yum_LABEL_YUM_PACKAGEFUNCTIONS' => 'Manage individual packages', +'yum_LABEL_YUM_STATUS' => 'Check for updates', +'yum_SUCCESS' => 'The new settings have been saved.', +'yum_SYSTEM_BEING_RECONFIGURED' => 'Your system is being automatically rebooted to +complete the reconfiguraton process.', +'yum_TITLE_UPDATES_AVAILABLE' => 'Updates Available', +'yum_TITLE_UPTODATE' => 'This system is up to date.', +'yum_UPDATE_SUCCESS' => 'The requested changes have been successfully implemented.', diff --git a/snapshot.json b/snapshot.json deleted file mode 100644 index a857c4d..0000000 --- a/snapshot.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "timestamp": 1744101733.740629, - "devices": [ - { - "id": "bf6d349c2d491149a8od3f", - "ip": "192.168.1.157", - "active": 2, - "encrypt": true, - "productKey": "qar5l7m9uda7tfa7", - "token": true, - "wf_cfg": true, - "clientLink": 3, - "name": "", - "key": "", - "mac": "", - "ability": 0, - "dev_type": "default", - "origin": "broadcast", - "ver": "3.4" - } - ] -} \ No newline at end of file