Edit template for controller - Refine params copy and bring DB opens up to spec with UTF8

This commit is contained in:
2025-10-06 10:57:00 +01:00
parent 29f8de63fd
commit ecb846fc6c
119 changed files with 10059 additions and 36 deletions

View File

@@ -0,0 +1,106 @@
% layout "AdminLTE", title => "Sme server 2 - backup";
% content_for "module" => begin
<div class="card-body">
% if (config->{debug} == 1) {
<pre>
<%= dumper $c->current_route %>
<%= dumper $bac_datas %>
</pre>
% }
% if ( stash "error" ) {
<br>
<div class="text-danger">
<%= $c->render_to_string(inline => stash "error") %>
</div>
% }
<h1><%= $title%></h1>
<br>
<h2><%= l "bac_ENABLE_DISABLE_TAPE" %></h2>
<br>
<div>
<%= $c->render_to_string(inline => (l "bac_TAPE_CONFIG_DESC")) %>
</div>
<br>
<form action="/smanager/backupd" method="POST">
<div class="row g-3 align-items-center">
<div class="col-md-1">
<%= l "bac_ENABLE_TAPE_BACKUP" %>
</div>
<div class="col-auto">
% if ( $bac_datas->{status} eq "checked" ) {
<input type="checkbox" name="Tapebackup" aria-describedby="enabled" checked >
% } else {
<input type="checkbox" name="Tapebackup" aria-describedby="disabled">
% }
</div>
</div>
<br>
<div class="row g-3 align-items-center">
<div class="col-md-2">
<label for="inputBackupHour" class="col-form-label"><%= l "bac_TAPE_BACKUP_TIME" %></label>
<label for="inputBackupMin" class="col-form-label"></label>
</div>
<div class="col-auto">
% param "BackupHour" => $bac_datas->{backupHour} unless param "BackupHour";
<input type="text" name="BackupHour" id="inputBackupHour" class="form-control" maxlength="2" size="4" aria-describedby="Backup Hour" value="<%= $bac_datas->{backupHour} %>">
</div>
<div class="col-auto">
% param "BackupMin" => $bac_datas->{backupMin} unless param "BackupMin";
<input type="text" name="BackupMin" id="inputBackupMin" class="form-control" maxlength="2" size="4" aria-describedby="Backup Minute" value="<%= $bac_datas->{backupMin} %>">
</div>
<div class="col-auto">
% param "BackupAMPM" => $bac_datas->{backupAMPM} unless param "BackupAMPM";
<%= select_field "BackupAMPM" => ["AM", "PM"], class => "form-select" %>
</div>
</div>
<br>
<div class="row g-3 align-items-center">
<div class="col-md-2">
<label for="inputReminderMin" class="col-form-label"><%= l "bac_LOAD_TAPE_REMINDER_TIME" %></label>
<label for="inputReminderMin" class="col-form-label"></label>
</div>
<div class="col-auto">
% param "ReminderHour" => $bac_datas->{reminderHour} unless param "ReminderHour";
<input type="text" name="ReminderHour" id="inputReminderHour" class="form-control" maxlength="2" size="4" aria-describedby="Reminder Hour" value="<%= $bac_datas->{reminderHour} %>">
</div>
<div class="col-auto">
% param "ReminderMin" => $bac_datas->{reminderMin} unless param "ReminderMin";
<input type="text" name="ReminderMin" id="inputReminderMin" class="form-control" maxlength="2" size="4" aria-describedby="Reminder Minute" value="<%= $bac_datas->{reminderMin} %>">
</div>
<div class="col-auto">
% param "ReminderAMPM" => $bac_datas->{reminderAMPM} unless param "ReminderAMPM";
<%= select_field "ReminderAMPM" => ["AM", "PM"], class => "form-select" %>
</div>
</div>
<br>
<%= hidden_field "Function" => $bac_datas->{"function"} %>
% my $btn = l("Update");
<div class="row g-3 align-items-center">
<div class="col-md-2">
<button type="submit" class="btn btn-primary btn-sm" value="<%=$c->l("Update")%>"><%= $btn %></button>
</div>
</div>
</form>
</div>
% end

View File

@@ -0,0 +1,272 @@
% layout "AdminLTE", title => "Sme server 2 - backup - conf";
% content_for "module" => begin
<div class="card-body">
% if (config->{debug} == 1) {
<pre>
<%= dumper $c->current_route %>
<%= dumper $bac_datas %>
</pre>
% }
% if ( stash "error" ) {
<br>
<div class="text-danger">
<%= $c->render_to_string(inline => stash "error") %>
</div>
% }
<h1><%= $title%></h1>
<br>
<h2><%= l "bac_CONFIGURE_WORKSTN_BACKUP" %></h2>
<br>
<div>
<%= $c->render_to_string(inline => (l "bac_CONFIGURE_WORKSTN_BACKUP_DESC")) %>
<div>
<br>
<form action="/smanager/backupd" method="POST">
<div class="row g-3 align-items-center">
<div class="col-md-2">
<%= l "bac_ENABLE_WORKSTN_BACKUP" %>
</div>
<div class="col-auto">
% if ( $bac_datas->{status} eq "checked" ) {
<input type="checkbox" name="Workstnbackup" aria-describedby="enabled" checked >
% } else {
<input type="checkbox" name="Workstnbackup" aria-describedby="disabled">
% }
</div>
</div>
</p>
<p>
<h3>
%= l "bac_WORKSTATION_BACKUP_DEST"
</h3>
<br>
% if ( $bac_datas->{vfstype} =~ m/cifs|nfs/s ) {
<div class="row g-3 align-items-center">
<div class="col-md-2">
<label for="inputBackupWorkStationName" class="col-form-label"><%= l "bac_WORKSTN_NAME" %></label>
</div>
<div class="col-auto">
% param "BackupwkStation" => $bac_datas->{station} unless param "BackupwkStation";
<input type="text" name="BackupwkStation" id="inputBackupWorkStationName" class="form-control"
size="20" aria-describedby="Workstation Name" value="<%= $bac_datas->{station} %>">
</div>
</div>
<br>
% }
% if ( $bac_datas->{vfstype} eq "usb" ) {
<div class="row g-3 align-items-center">
<div class="col-md-2">
<%= l "bac_local removable disk" %>
</div>
<div class="col-auto">
% param "BackupwkFolder" => $bac_datas->{mount} unless param "BackupwkFolder";
<%= select_field "BackupwkFolder" => $c->get_BackupwkDest_options( $bac_datas->{vfstype}), class => "form-select" %>
</div>
</div>
<br>
% } elsif ( $bac_datas->{vfstype} eq "mnt") {
<div class="row g-3 align-items-center">
<div class="col-md-2">
<%= l "bac_Mounted disk" %>
</div>
<div class="col-auto">
% param "BackupwkFolder" => $bac_datas->{folder} unless param "BackupwkFolder";
<%= select_field "BackupwkFolder" => $c->get_BackupwkDest_options( $bac_datas->{vfstype}), class => "form-select" %>
</div>
</div>
<br>
% } else {
<div class="row g-3 align-items-center">
<div class="col-md-2">
<label for="inputBackupSharedFolderName" class="col-form-label"><%= l "bac_SHARED_FOLDER_NAME" %></label>
</div>
<div class="col-auto">
<input type="text" name="BackupwkFolder" id="inputBackupSharedFolderName" class="form-control"
size="20" aria-describedby="Backup Shared Folder Name" value="<%= $bac_datas->{folder} %>">
</div>
</div>
<br>
% }
% if ( $bac_datas->{vfstype} eq "cifs" ) {
<div class="row g-3 align-items-center">
<div class="col-md-2">
<label for="inputBackupWorkLogin" class="col-form-label"><%= l "bac_WORKSTN_LOGIN" %></label>
</div>
<div class="col-auto">
% param "BackupwkLogin" => $bac_datas->{login} unless param "BackupwkLogin";
<input type="text" name="BackupwkLogin" id="inputBackupWorkLogin" class="form-control"
size="12" aria-describedby="Backup Workstation Login" value="<%= $bac_datas->{login} %>">
</div>
</div>
<br>
<div class="row g-3 align-items-center">
<div class="col-md-2">
<label for="password" class="col-form-label"><%= l "bac_PASSWORD" %></label>
</div>
<div class="col-auto">
% param "BackupwkPassword" => $bac_datas->{password} unless param "BackupwkPassword";
<input type="password" name="BackupwkPassword" id="password" class="form-control" size="12" aria-describedby="Backup Workstation Password" value="<%= $bac_datas->{password} %>">
</div>
<div class="col-auto">
<span id="togglePassword" class="bi bi-eye"></span>
</div>
</div>
% }
<br>
<h3><%= l "bac_WORKSTN_BACKUP_SETTINGS" %></h3>
<br>
<div class="row g-3 align-items-center">
<div class="col-md-2">
<label for="inputNumberofSets" class="col-form-label"><%= l "bac_NUMBER_OF_SETS" %></label>
</div>
<div class="col-auto">
% param "SetsNumber" => $bac_datas->{setsNumber} unless param "SetsNumber";
<input type="text" name="SetsNumber" id="inputNumberofSets" class="form-control" maxlength="3" size="3" aria-describedby="Number of sets" value="<%= $bac_datas->{setsNumber} %>">
</div>
</div>
<br>
<div class="row g-3 align-items-center">
<div class="col-md-2">
<label for="inputFilesinSet" class="col-form-label"><%= l "bac_NUMBER_OF_FILES_IN_SET" %></label>
</div>
<div class="col-auto">
% param "Filesinset" => $bac_datas->{filesinset} unless param "Filesinset";
<input type="text" name="Filesinset" id="inputFilesinSet" class="form-control" maxlength="3" size="3" aria-describedby="Files in set" value="<%= $bac_datas->{filesinset} %>">
</div>
</div>
<br>
<div class="row g-3 align-items-center">
<div class="col-md-2">
<label for="inputWorkstationBackupHour" class="col-form-label"><%= l "bac_WORKSTN_BACKUP_TIME" %></label>
<label for="inputWorkstationBackupMin" class="col-form-label"></label>
</div>
<div class="col-auto">
% param "BackupwkHour" => $bac_datas->{hour} unless param "BackupwkHour";
<input type="text" name="BackupwkHour" id="inputWorkstationBackupHour" class="form-control" maxlength="2" size="4" aria-describedby="Backup Hour" value="<%= $bac_datas->{hour} %>">
</div>
<div class="col-auto">
% param "BackupwkMin" => $bac_datas->{min} unless param "BackupwkMin";
<input type="text" name="BackupwkMin" id="inputWorkstationBackupMin" class="form-control" maxlength="2" size="4" aria-describedby="Backup Minute" value="<%= $bac_datas->{min} %>">
</div>
<div class="col-auto">
<%= l "AM/PM:" %>
</div>
<div class="col-auto">
% param "BackupwkAMPM" => $bac_datas->{ampm} unless param "BackupwkAMPM";
<%= select_field "BackupwkAMPM" => ["AM", "PM"], class => "form-select" %>
</div>
</div>
<br>
<div class="row g-3 align-items-center">
<div class="col-md-2">
<label for="inputWorkstationTimeout" class="col-form-label"><%= l "bac_WORKSTN_TIMEOUT" %></label>
</div>
<div class="col-auto">
% param "BackupwkTimeout" => $bac_datas->{timeout} unless param "BackupwkTimeout";
<input type="text" name="BackupwkTimeout" id="inputWorkstationTimeout" class="form-control" maxlength="2" size="2" aria-describedby="Workstation Timeout" value="<%= $bac_datas->{timeout} %>">
</div>
</div>
<br>
<div class="row g-3 align-items-center">
<div class="col-md-2">
<%= l "bac_INC_ONLY_TIMEOUT" %>
</div>
<div class="col-auto">
% if ( $bac_datas->{incOnlyTimeout} eq "checked" ) {
<input type="checkbox" name="IncOnlyTimeout" aria-describedby="enabled" checked >
% } else {
<input type="checkbox" name="IncOnlyTimeout" aria-describedby="disabled">
% }
</div>
</div>
<br>
<div class="row g-3 align-items-center">
<div class="col-md-2">
<label for="inputBackupCompression" class="col-form-label"><%= l "bac_COMPRESSION_LEVEL" %></label>
</div>
<div class="col-auto">
% param "Compression" => $bac_datas->{compression} unless param "Compression";
<input type="text" name="Compression" id="inputBackupCompression" class="form-control" maxlength="1" size="1" aria-describedby="Compression level" value="<%= $bac_datas->{compression} %>">
</div>
</div>
<br>
<div class="row g-3 align-items-center">
<div class="col-md-2">
<%= l "bac_FULL_ONLY_ON" %>
</div>
<div class="col-auto">
% param "Dof" => $bac_datas->{dof} unless param "Dof";
%= select_field "Dof" => $c->get_dow_list(), class => "form-select"
</div>
</div>
<br>
%= hidden_field "Function" => $bac_datas->{function}
%= hidden_field "VFSType" => $bac_datas->{vfstype}
% my $btn = l("Update");
<div class="row g-3 align-items-center">
<div class="col-md-2">
<button type="submit" class="btn btn-primary btn-sm" value="<%=$c->l("NEXT")%>"><%= $btn %></button>
</div>
</div>
<br>
</form>
</div>
% end

View File

@@ -0,0 +1,53 @@
% layout "AdminLTE", title => "Sme server 2 - restore";
% content_for "module" => begin
<div class="card-body">
% if (config->{debug} == 1) {
<pre>
<%= dumper $c->current_route %>
<%= dumper $bac_datas %>
</pre>
% }
% if ( stash "error" ) {
<br>
<div class="text-danger">
<%= $c->render_to_string(inline => stash "error") %>
</div>
% }
<h1><%= $title%></h1>
<br>
<h2><%= l "bac_WORKSTN_RESTORE" %></h2>
<br>
<form action="/smanager/backupd" method="POST">
<div>
<%= $c->render_to_string(inline => $bac_datas->{restore_log}) %>
</div>
<br>
<div>
<%= l "bac_YOU_MUST_REBOOT" %>
</div>
<%= hidden_field "Function" => $bac_datas->{"function"} %>
% my $btn = l("Reboot");
<div class="row g-3 align-items-center">
<div class="col-md-2">
<button type="submit" class="btn btn-primary btn-sm"><%= $btn %></button>
</div>
</div>
</form>
</div>
% end

View File

@@ -0,0 +1,78 @@
% layout "AdminLTE", title => "Sme server 2 - backup - verify";
% content_for "module" => begin
<div class="card-body">
% if (config->{debug} == 1) {
<pre>
<%= dumper $c->current_route %>
<%= dumper $bac_datas %>
</pre>
% }
% if ( stash "error" ) {
<br><div class="text-danger">
<%= $c->render_to_string(inline => stash "error") %>
</div>
% }
<h1><%= $title%></h1>
<br>
<h2><%=l "Verify_WORKSTN_BACKUP_FILE" %></h2>
<form action="/smanager/backup" method="POST">
<br>
% if ($bac_datas->{status} ne "enabled") {
<div>
<%= $c->render_to_string(inline => (l "bac_CONFIGURATION_TO_BE_DONE")) %>
</div>
% } else {
<div>
<%= $c->render_to_string(inline => (l "Verify_WORKSTN_BACKUP_DESC") . " " . $c->get_shared_folder_to_verify()) %>
</div>
% }
<br><br>
<div class="row g-3 align-items-center">
<div class="col-md-1">
<%=l "bac_SELECT_BACKUP_FILE" %>
</div>
<div class="col-auto">
<%= select_field "Backupset" => $c->get_Backupset_options(), class => "form-select" %>
</div>
</div>
<br><br>
<div class="row g-3 align-items-center">
<div class="col-md-4">
<%=l "bac_CHECK_TO_VERIFY_FULL_RESTORE" %>
</div>
<div class="col-auto">
<input type="checkbox" name="Verifyall">
</div>
</div>
<br>
%=l "bac_CHECK_INTEGRITY_WARNING"
<br>
<br>
%= hidden_field "Function" => $bac_datas->{"function"} . "1"
% my $btn = l("Verify");
<div class="row g-3 align-items-center">
<div class="col-md-2">
<button type="submit" class="btn btn-primary btn-sm"><%= $btn %></button>
</div>
</div>
</form>
</div>
% end

View File

@@ -0,0 +1,71 @@
'bac_AM' => 'AM',
'bac_AM/PM' => 'AM/PM',
'bac_BACKUP_DESC' => '<P>The server provides two ways to back up and restore
your server: using your local desktop or a tape drive.</P>
<P>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
<b>[_1]</b>. 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.</P>
<P>The tape backup method uses a software package called <I>[_2]</I>
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 <b>[_3]</b> of data.</P>
<P>Both restore methods allow you to restore your configuration and user
data files. <b>Ideally, the restore should be performed on a freshly
installed server</b>.</P>',
'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. <B>The restore should be performed on a freshly installed server</B>.',
'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 <a href="/server-manager/cgi-bin/backup">here</a>.',
'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' => '
<p>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.</p> ',
'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',

View File

@@ -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' => '<P>The server provides two ways to back up and restore
your server: using your local desktop or a tape drive.</P>
<P>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
<b>[_1]</b>. 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.</P>
<P>The tape backup method uses a software package called <I>[_2]</I>
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 <b>[_3]</b> of data.</P>
<P>Both restore methods allow you to restore your configuration and user
data files. <b>Ideally, the restore should be performed on a freshly
installed server</b>.</P>',
'bac_BACKUP_DESC_DAR' => '<P>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.</P>
<P>Tape Backup. This method uses a software package called <I>[_1]</I>
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 <b>[_2]</b> of data.</P>
<P>Workstation backup. This method uses a software package called <I>dar</I>
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 <b>[_3]</b> uncompressed.
Twice the compressed data size must be available on the backup share.</P>
<P>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
<b>[_3]</b>. 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.</P>
<P>All backup methods allow you to restore your configuration and user
data files. Workstation backup provides individual file restore. <b>Ideally,
full restore should be performed on a freshly installed server</b>.</P>',
'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. <B>The restore should be performed on a freshly installed server</B>.',
'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 <b>full</b> others are <b>incrementals</b>',
'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 <a href="/server-manager/cgi-bin/backup">here</a>.',
'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). <br/> <b>Warning :</b> If you select a directory,
all contained files and directories will be restored.<p/>
By default the most recent version of selected files is restored, but if you specify a date
in the format <i>~[~[~[yyyy/~]mm/~]dd-~]hh:mm~[:ss~]</i> the process
will restore only the most recent version modified <b>before the given date</b>.',
'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' => '<P>This process will restore the configuration and user data files from a
server tape backup. <B>The restore should be performed on a freshly installed server</B>.</P>
<P>Ensure that you have loaded the desired backup tape into the tape drive
before proceeding.</P>
<P>After the restore completes you must reboot the server.</P>',
'bac_RESTORE_CONF_FROM_WORKSTN' => 'Restore server configuration from workstation backup',
'bac_RESTORE_CONF_FROM_WORKSTN_DESC' => '<p>This process will restore the configuration and user data files from a
Server workstation backup. <b>The restore
should be performed on a freshly installed Server</b>.</p>
<p>Ensure that choose the right backup to restore below
before proceeding.</p>
<p>After the restore completes you must reboot the server.</p>
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' => '<p>Select whether you wish to enable nightly backups. Then indicate the
desired times for the backup and the load tape reminder.</p> <p>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.</p>',
'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' => '
<p>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.</p> ',
'bac_VERIFY_COMPLETE' => 'Verification is complete',
'bac_VERIFY_WORKSTN_BACKUP_DESC' => '<p>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.<b>You must choose the backup you want to verify</b></p>
<p>Only files flagged with (Saved) are contained in the backup.</p>
<br/>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' => '<p>This panel displays the present workstation backup configuration. You can
change it in this panel and the next one.</p><p/>',
'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' => '<p>Presently, workstation backup is not configured. You can set this configuration
with this panel and the next one.</p><p/>',
'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. <br/><br/>
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.<br/><br/>
You have the responsibility not to restore files which could break the
functioning of your server.<br/> <br/>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',

View File

@@ -0,0 +1,81 @@
% layout "default", title => "Sme server 2 - backup";
% content_for "module" => begin
<div id="module" class="module back_tape_configure-panel">
% if (config->{debug} == 1) {
<p>
%= dumper $c->current_route
%= dumper $bac_datas
</p>
% }
% if ( stash "error" ) {
<br><div class=sme-error>
%= $c->render_to_string(inline => stash "error")
</div>
%}
<h1><%= $title%></h1>
<h2>
%=l "bac_ENABLE_DISABLE_TAPE"
</h2><br>
%= $c->render_to_string(inline => (l "bac_TAPE_CONFIG_DESC"))
%= form_for "/backupd" => (method => "POST") => begin
<p>
<span class=label>
%=l "bac_ENABLE_TAPE_BACKUP"
</span><span class=data>
% if ( $bac_datas->{status} eq "checked" ) {
<input type="checkbox" name="Tapebackup" checked >
%} else {
%= check_box "Tapebackup"
%}
</span>
</p>
<p>
<span class=label>
%=l "bac_TAPE_BACKUP_TIME"
</span><span class=data>
% 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"
</span>
<!--span class=label-->
%=l "AM/PM:"
<!--/span--><span class=data>
% param "BackupAMPM" => $bac_datas->{backupAMPM} unless param "BackupAMPM";
%= select_field "BackupAMPM" => ["AM", "PM"], class => "input"
</span>
</p>
<p>
<span class=label>
%=l "bac_LOAD_TAPE_REMINDER_TIME"
</span><span class=data>
% 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"
</span>
<!--span class=label-->
%=l "AM/PM:"
<!--/span--><span class=data>
% param "ReminderAMPM" => $bac_datas->{reminderAMPM} unless param "ReminderAMPM";
%= select_field "ReminderAMPM" => ["AM", "PM"], class => "input"
</span>
</p><br>
%= hidden_field "Function" => $bac_datas->{"function"}
%= submit_button $c->l("Update"), class => "action"
% end
</div>
% end

View File

@@ -0,0 +1,154 @@
% layout "default", title => "Sme server 2 - backup - conf";
% content_for "module" => begin
<div id="module" class="module back_workstn_configure1-panel">
% if (config->{debug} == 1) {
<p>
%= dumper $c->current_route
%= dumper $bac_datas
</p>
% }
% if ( stash "error" ) {
<br><div class=sme-error>
%= $c->render_to_string(inline => stash "error")
</div>
%}
<h1><%= $title%></h1>
<h2>
%=l "bac_CONFIGURE_WORKSTN_BACKUP"
</h2>
%= $c->render_to_string(inline => (l "bac_CONFIGURE_WORKSTN_BACKUP_DESC"))
%= form_for "/backupd" => (method => "POST") => begin
<p>
<span class=label>
%=l "bac_ENABLE_WORKSTN_BACKUP"
</span><span class=data>
% if ( $bac_datas->{status} eq "checked" ) {
<input type="checkbox" name="Workstnbackup" checked >
%} else {
%= check_box "Workstnbackup"
%}
</span>
</p>
<p><h3>
%= l "bac_WORKSTATION_BACKUP_DEST"
</h3><br>
% if ( $bac_datas->{vfstype} =~ m/cifs|nfs/s ) {
<span class=label>
%=l "bac_WORKSTN_NAME"
</span><span class=data>
% param "BackupwkStation" => $bac_datas->{station} unless param "BackupwkStation";
%= text_field "BackupwkStation", size => 20, class => "input"
</span><br>
%}
% if ( $bac_datas->{vfstype} eq "usb" ) {
<span class=label>
%=l "bac_local removable disk"
</span><span class=data>
% param "BackupwkFolder" => $bac_datas->{mount} unless param "BackupwkFolder";
%= select_field "BackupwkFolder" => $c->get_BackupwkDest_options( $bac_datas->{vfstype}), class => "input"
</span><br>
% } elsif ( $bac_datas->{vfstype} eq "mnt") {
<span class=label>
%=l "bac_Mounted disk"
</span><span class=data>
% param "BackupwkFolder" => $bac_datas->{folder} unless param "BackupwkFolder";
%= select_field "BackupwkFolder" => $c->get_BackupwkDest_options( $bac_datas->{vfstype}), class => "input"
</span><br>
% } else {
<span class=label>
%=l "bac_SHARED_FOLDER_NAME"
</span><span class=data>
% param "BackupwkFolder" => $bac_datas->{folder} unless param "BackupwkFolder";
%= text_field "BackupwkFolder", size => 20, class => "input"
</span><br>
%}
% if ( $bac_datas->{vfstype} eq "cifs" ) {
<span class=label>
%=l "bac_WORKSTN_LOGIN"
</span><span class=data>
% param "BackupwkLogin" => $bac_datas->{login} unless param "BackupwkLogin";
%= text_field "BackupwkLogin", size => 12, class => "input"
</span><br><span class=label>
%=l "bac_PASSWORD"
</span><span class=data>
% param "BackupwkPassword" => $bac_datas->{password} unless param "BackupwkPassword";
%= password_field "BackupwkPassword", size => 12, class => "input"
</span>
%}
</p><br><h3>
%= l "bac_WORKSTN_BACKUP_SETTINGS"
</h3><br>
<p><span class=label>
%=l "bac_NUMBER_OF_SETS"
</span><span class=data>
% param "SetsNumber" => $bac_datas->{setsNumber} unless param "SetsNumber";
%= text_field "SetsNumber", size => "3"
</span>
%=l "bac_NUMBER_OF_FILES_IN_SET"
<span class=data>
% param "Filesinset" => $bac_datas->{filesinset} unless param "Filesinset";
%= text_field "Filesinset", size => "3"
</span></p>
<p>
<span class=label>
%=l "bac_WORKSTN_BACKUP_TIME"
</span><span class=data>
% 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"
</span>
%=l "AM/PM:"
<span class=data>
% param "BackupwkAMPM" => $bac_datas->{ampm} unless param "BackupwkAMPM";
%= select_field "BackupwkAMPM" => ["AM", "PM"], class => "input"
</span>
</p>
<p><span class=label>
%=l "bac_WORKSTN_TIMEOUT"
</span><span class=data>
% param "BackupwkTimeout" => $bac_datas->{timeout} unless param "BackupwkTimeout";
%= text_field "BackupwkTimeout", size => "2"
</span>
%=l "bac_INC_ONLY_TIMEOUT"
<span class=data>
% if ( $bac_datas->{incOnlyTimeout} eq "checked" ) {
<input type="checkbox" name="IncOnlyTimeout" checked >
%} else {
%= check_box "IncOnlyTimeout"
%}
</span></p>
<p>
<span class=label>
%=l "bac_COMPRESSION_LEVEL"
</span><span class=data>
% param "Compression" => $bac_datas->{compression} unless param "Compression";
%= text_field "Compression", size => "1"
</span>
%=l "bac_FULL_ONLY_ON"
<span class=data>
% param "Dof" => $bac_datas->{dof} unless param "Dof";
%= select_field "Dof" => $c->get_dow_list(), class => "input"
</p><br>
%= hidden_field "Function" => $bac_datas->{function}
%= hidden_field "VFSType" => $bac_datas->{vfstype}
%= submit_button $c->l("Update"), class => "action"
% end
</div>
% end

View File

@@ -0,0 +1,36 @@
% layout "default", title => "Sme server 2 - restore";
% content_for "module" => begin
<div id="module" class="module back_workstn_restore1-panel">
% if (config->{debug} == 1) {
<p>
%= dumper $c->current_route
%= dumper $bac_datas
</p>
% }
% if ( stash "error" ) {
<br><div class=sme-error>
%= $c->render_to_string(inline => stash "error")
</div>
%}
<h1><%= $title%></h1>
%= form_for "/backupd" => (method => "POST") => begin
<h2>
%=l "bac_WORKSTN_RESTORE"
</h2>
<p>
%= $c->render_to_string(inline => $bac_datas->{restore_log})
</p><p>
%=l "bac_YOU_MUST_REBOOT"
</p>
%= hidden_field "Function" => $bac_datas->{"function"}
%= submit_button $c->l("Reboot"), class => "action"
% end
</div>
% end

View File

@@ -0,0 +1,51 @@
% layout "default", title => "Sme server 2 - backup - verify";
% content_for "module" => begin
<div id="module" class="module back_workstn_verify-panel">
% if (config->{debug} == 1) {
<p>
%= dumper $c->current_route
%= dumper $bac_datas
</p>
% }
% if ( stash "error" ) {
<br><div class=sme-error>
%= $c->render_to_string(inline => stash "error")
</div>
%}
<h1><%= $title%></h1>
<h2>
%=l "Verify_WORKSTN_BACKUP_FILE"
</h2>
%= 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())
%}
<br><br><span class=label>
%=l "bac_SELECT_BACKUP_FILE"
</span><span class=data>
%= select_field "Backupset" => $c->get_Backupset_options(), class => "input"
</span><br>
<p><span class=label>
%=l "bac_CHECK_TO_VERIFY_FULL_RESTORE"
</span><span class=data>
%= check_box "Verifyall"
</span></p><br>
%=l "bac_CHECK_INTEGRITY_WARNING"
<br><br>
%= hidden_field "Function" => $bac_datas->{"function"} . "1"
%= submit_button $c->l("Verify"), class => "action"
% end
</div>
% end

View File

@@ -0,0 +1 @@
'Report a bug' => 'Report a bug',

View File

@@ -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',

View File

@@ -0,0 +1,68 @@
% layout "AdminLTE", title => "Sme server 2 - clamav";
% content_for "module" => begin
<div class="card-body">
% if (config->{debug} == 1) {
<pre>
Route: <%= dumper $c->current_route %><br>
FsS stat: <%= dumper $clm_datas->{FilesystemScan}%> <br>
Quar stat: <%= dumper $clm_datas->{Quarantine} %>
</pre>
% }
<h1><%= $title %></h1>
<!-- reetp This $module should be split ijto two lines -->
<%= $modul %>
<br><br>
<form action="/smanager/clamav" method="POST">
<div class="row g-3 align-items-center">
<div class="col-md-2">
<%= l "clm_LABEL_FILESYSTEM_SCAN_PERIOD" %>:
</div>
<div class="col-md-2">
% param "FilesystemScan" => $clm_datas->{FilesystemScan} unless param "FilesystemScan";
<%= select_field "FilesystemScan" => [[ (l "Daily") => "daily"], [ (l "Never") => "disabled"], [ (l "Weekly") => "weekly"]], class => "form-select" %>
</div>
</div>
<br>
<div class="row g-3 align-items-center">
<div class="col-md-2">
<%= l "clm_LABEL_QUARANTINE" %>:
</div>
<div class="col-md-2">
% param "Quarantine" => $clm_datas->{Quarantine} unless param "Quarantine";
<%= select_field "Quarantine" => [[ (l "ENABLED") => "enabled"], [ (l "DISABLED") => "disabled"]], class => "form-select" %>
</div>
</div>
<br>
<div>
<div>
<h6><%= l "clm_LABEL_CLAM_VERSIONS" %>:</h6>
</div>
<div>
<%= $clm_datas->{clam_versions} %>
</div>
</div>
<br>
<% my $btn = l("SAVE"); %>
<div class="row g-3 align-items-center">
<div class="col-md-2">
<button type="submit" class="btn btn-primary btn-sm"><%= $btn %></button>
</div>
</div>
</form>
</div>
%end

View File

View File

@@ -0,0 +1,12 @@
#
# Lex file for Clamav generated on 2025-07-17 09:52:30
#
'clm_DESC_FILESYSTEM_SCAN_PERIOD' => '<h2>General Settings</h2>
If this option is enabled then the filesystem will be
scanned for viruses. A report of any found viruses will be
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.',

View File

@@ -0,0 +1,45 @@
% layout "default", title => "Sme server 2 - clamav";
% content_for "module" => begin
<div id="module" class="module clamav-panel">
%if (config->{debug} == 1) {
<p>(DBG)route: <%= $c->current_route %><br>
(DBG)FsS stat: <%= $clm_datas->{FilesystemScan}%> <br>
(DBG)Quar stat: <%=$clm_datas->{Quarantine} %>
</p>
%}
<h1><%= $title %></h1>
<br>
<%= $modul %>
<% my $btn = l("SAVE"); %>
%= form_for "clamav" => (method => "POST") => begin
<p>
<span class=label>
%=l "clm_LABEL_FILESYSTEM_SCAN_PERIOD"
</span><span class=data>
% param "FilesystemScan" => $clm_datas->{FilesystemScan} unless param "FilesystemScan";
%= select_field "FilesystemScan" => [[ (l "Daily") => "daily"], [ (l "Never") => "disabled"], [ (l "Weekly") => "weekly"]], class => "input"
</span>
</p>
<p>
<span class=label>
%=l "clm_LABEL_QUARANTINE"
</span><span class=data>
% param "Quarantine" => $clm_datas->{Quarantine} unless param "Quarantine";
%= select_field "Quarantine" => [[ (l "ENABLED") => "enabled"], [ (l "DISABLED") => "disabled"]], class => "input"
<br>
</span>
</p>
<p>
<span class=label>
%=l "clm_LABEL_CLAM_VERSIONS"
</span><span class=data>
%= $clm_datas->{clam_versions}
<br>
</span>
</p>
%= submit_button "$btn", class => "action"
% end
</div>
%end

View File

@@ -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 <b>will not</b> 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',

View File

@@ -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 <b>will not</b> 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 <b>will not</b> 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',

View File

@@ -0,0 +1 @@
'Directory' => 'Directory',

View File

@@ -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',

View File

@@ -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.',

View File

@@ -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.',

View File

@@ -0,0 +1,272 @@
%# layout "AdminLTE", title => "Sme server 2 - emailreceive";
%# content_for "module" => begin
%# use constant FALSE => 0;
%# use constant TRUE => 1;
<!-- <div class="card-body"> -->
% if (config->{debug} == 1) {
<pre>
<<%= dumper $c->current_route %>
<<%= dumper $mai_data %>
<<%= dumper $c->param("SMTPAuth") %>
</pre>
% }
% if ( stash "error" ) {
<br>
<div class="text-danger">
<<%= $c->render_to_string(inline => stash "error") %>
</div>
% }
<!--<h1><%#= $title %></h1> -->
<h2><%= $c->l("mai_DESC_STATE_RECEPTION_BUTTON") %></h2>
<br>
<form action="/smanager/emailsettingsu" method="POST">
<div>
<%= l "mai_DESC_MODE" %>
</div>
<br>
<div class="row g-3 align-items-center">
<div class="col-md-2">
<%= l "mai_LABEL_MODE" %>
</div>
<div class="col-auto">
% param "FetchmailMethod" => $mai_data->{fetchmailmethod} unless param "FetchmailMethod";
<%= select_field "FetchmailMethod" => $c->get_retrieval_opt(), class =>"form-select" %>
</div>
</div>
<br>
<div>
<div>
<b><i>Note - this first line was disabled?</b></i>
<br>
<%= l "mai_DESC_SMTP_AUTH_CONTROL" %>
<br>
<b><i>/end</b></i>
</div>
<br>
<div>
<%= 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." %>
</div>
<br>
<div>
<%= l "SMTPS port (465) will require implicit SSL/TLS then authenticate to send." %>
</div>
<br>
<div>
<%= l "SMTP Submission port (587) will require STARTTLS, then authenticate to send." %>
</div>
</div>
<br>
% my $smtp_mesg=l("SMTP port %u allow client to authenticate:");
% param "SMTPAuth" => $c->get_current_smtp_auth( FALSE ) unless param "SMTPAuth";
<div class="row g-3 align-items-center">
<div class="col-md-2">
<%= sprintf($smtp_mesg,$c->get_db_prop("qpsmtpd","TCPPort",25)); %>
</div>
<div class="col-auto">
<%= select_field "SMTPAuth" => $c->get_smtp_auth_opt(), class => "form-select" %>
</div>
</div>
<br>
% 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";
<div class="row g-3 align-items-center">
<div class="col-md-2">
<%= sprintf($smtp_mesg,$c->get_db_prop("sqpsmtpd","TCPPort",465)); %>
</div>
<div class="col-auto">
<%= select_field "sSMTPAuth" => $c->get_smtp_ssl_auth_opt(), class => "form-select" %>
</div>
</div>
<br>
% my $smtp_mesg=l("Submission port %u status:");
% param "uSMTPAuth" => $c->get_current_smtp_ssl_auth(FALSE,"u", TRUE) unless param "uSMTPAuth";
<div class="row g-3 align-items-center">
<div class="col-md-2">
<%= sprintf($smtp_mesg,$c->get_db_prop("uqpsmtpd","TCPPort",587)); %>
</div>
<div class="col-auto">
<!--
<pre>
<%= dumper $c->get_smtp_ssl_auth_opt() %>
<%= dumper $c->get_current_smtp_ssl_auth(FALSE,"s", TRUE) %>
<%= dumper $c->get_current_smtp_ssl_auth(FALSE,"u", TRUE) %>
<%= dumper $c->get_db_prop("uqpsmtpd","access") %>
<%= param "uSMTPAuth" %>
</pre>
-->
<%= select_field "uSMTPAuth" => $c->get_smtp_ssl_auth_opt(), class => "form-select" %>
</div>
</div>
<br>
<h2><%= l "mai_TITLE_SECONDARY" %></h2>
<br>
<div>
<%= l "mai_DESC_SECONDARY" %>
</div>
<br>
% param "SecondaryMailServer" => $mai_data->{secondarymailserver} unless param "SecondaryMailServer";
<div class="row g-3 align-items-center">
<div class="col-md-2">
<label for="inputSecondaryMailServer" class="col-form-label"><%= l "mai_LABEL_SECONDARY" %></label>
</div>
<div class="col-auto">
<input type="text" name="SecondaryMailServer" id="inputSecondaryMailServer" class="form-control" aria-describedby="SecondaryMailServer" value="<%= $mai_data->{secondarymailserver} %>">
</div>
</div>
<br>
<div>
<%= l "mai_DESC_FETCH_PERIOD" %>
</div>
% param "FreqOffice" => $mai_data->{freqoffice} unless param "FreqOffice";
<div class="row g-3 align-items-center">
<div class="col-md-2">
<%= l "mai_LABEL_FETCH_PERIOD" %>
</div>
<div class="col-auto">
<%= select_field "FreqOffice" => $c->fetchmail_freq(), class => "form-select" %>
</div>
</div>
<br>
% param "FreqOutside" => $mai_data->{freqoutside} unless param "FreqOutside";
<div class="row g-3 align-items-center">
<div class="col-md-2">
<%= l "mai_LABEL_FETCH_PERIOD_NIGHTS" %>
</div>
<div class="col-auto">
<%= select_field "FreqOutside" => $c->fetchmail_freq(), class => "form-select" %>
</div>
</div>
<br>
% param "FreqWeekend" => $mai_data->{freqweekend} unless param "FreqWeekend";
<div class="row g-3 align-items-center">
<div class="col-md-2">
<%= l "mai_LABEL_FETCH_PERIOD_WEEKENDS" %>
</div>
<div class="col-auto">
<%= select_field "FreqWeekend" => $c->fetchmail_freq(), class => "form-select" %>
</div>
</div>
<br>
% param "SecondaryMailAccount" => $mai_data->{secondarymailaccount} unless param "SecondaryMailAccount";
<div class="row g-3 align-items-center">
<div class="col-md-2">
<label for="inputSecondaryMailAccount" class="col-form-label"><%= l "mai_LABEL_POP_ACCOUNT" %></label>
</div>
<div class="col-auto">
<input type="text" name="SecondaryMailAccount" id="inputSecondaryMailAccount" class="form-control" aria-describedby="SecondaryMailAccount" value="<%= $mai_data->{secondarymailaccount} %>">
</div>
</div>
<br>
% param "SecondaryMailPassword" => $mai_data->{secondarymailpassword} unless param "SecondaryMailPassword";
<div class="row g-3 align-items-center">
<div class="col-md-2">
<label for="password" class="col-form-label"><%= l "mai_LABEL_POP_PASS" %></label>
</div>
<div class="col-auto">
<input type="password" name="SecondaryMailPassword" id="password" class="form-control" aria-describedby="SecondaryMailPassword" value="<%= $mai_data->{secondarymailpassword} %>">
</div>
<div class="col-auto">
<span id="togglePassword" class="bi bi-eye"></span>
</div>
</div>
<br>
% param "SpecifyHeader" => $mai_data->{specifyheader} unless param "SpecifyHeader";
<div class="row g-3 align-items-center">
<div class="col-md-2">
<%= l "mai_LABEL_SORT_METHOD" %>
</div>
<div class="col-auto">
<%= select_field "SpecifyHeader" => [[(l "Default") => "off"], [(l "mai_SPECIFY_BELOW") => "on"]], class => "form-select" %>
</div>
</div>
<br>
% param "SecondaryMailEnvelope" => $mai_data->{secondarymailenvelope} unless param "SecondaryMailEnvelope";
<div class="row g-3 align-items-center">
<div class="col-md-2">
<label for="inputSecondaryMailEnvelope" class="col-form-label"><%= l "mai_LABEL_SORT_HEADER" %></label>
</div>
<div class="col-auto">
<input type="text" name="SecondaryMailEnvelope" id="inputSecondaryEnvelope" class="form-control" aria-describedby="SecondaryMailEnvelope" value="<%= $mai_data->{secondarymailenvelope} %>">
</div>
</div>
<br>
% my $btn = l("SAVE");
% param "trt" => $mai_data->{trt} unless param "trt";
<%= hidden_field "trt" => "REC" %>
<div class="row g-3 align-items-center">
<div class="col-md-2">
<button type="submit" class="btn btn-primary btn-sm"><%= $btn %></button>
</div>
</div>
</form>
</div>
%#end

File diff suppressed because it is too large Load Diff

View File

@@ -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
%#
<div id="Emailsettings-REC" class="partial Emailsettings-REC">
%# <script>
%# window.onload = function() {
%# SelectInput();
%# };
%# </script>
% if (config->{debug} == 1) {
<pre>
%= dumper $mai_data
</pre>
% }
% my $btn = l("SAVE");
% $c->param(Selected => undef); #This may need deleting for a params panel - only needed for a table
<h2><%= $c->l("mai_DESC_STATE_RECEPTION_BUTTON") %></h2><br>
%= 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"
<p><span class=label>
%=l "mai_LABEL_MODE"
</span><span class=input>
% param "FetchmailMethod" => $mai_data->{fetchmailmethod} unless param "FetchmailMethod";
<!--
<pre>
%= dumper $mai_data->{fetchmailmethod}
%= dumper $c->get_retrieval_opt()
%= param "FetchmailMethod"
</pre>
-->
%= select_field "FetchmailMethod" => $c->get_retrieval_opt(), class => "input"
</span></p>
%#=l "mai_DESC_SMTP_AUTH_CONTROL"
<br />
%= l "mai_SMTP_port_(25)"
<br />
%= l "mai_SMTPS_port_(465)"
<br />
%= l "mai_SMTP_Submission"
<br />
% my $smtp_mesg=l("mai_SMTP_port_authenticate");
<p><span class=label>
%= sprintf($smtp_mesg,$c->get_db_prop("qpsmtpd","TCPPort",25));
</span><span class=input>
% param "SMTPAuth" => $c->get_current_smtp_auth( FALSE ) unless param "SMTPAuth";
<!--
<pre>
%= dumper $c->get_smtp_auth_opt()
%= dumper $c->get_current_smtp_auth(FALSE)
%= dumper $c->get_db_prop("qpsmtpd","Authentication")
%= param "SMTPAuth"
</pre>
-->
%= select_field "SMTPAuth" => $c->get_smtp_auth_opt(), class => "input"
</span></p>
% my $smtp_mesg=l("SMTPS SSL/TLS auth: port %u status:");
<p><span class=label>
%= sprintf($smtp_mesg,$c->get_db_prop("sqpsmtpd","TCPPort",465));
</span><span class=input>
% 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"
</span></p>
%my $smtp_mesg=l("Submission port %u status:");
<p><span class=label>
%= sprintf($smtp_mesg,$c->get_db_prop("uqpsmtpd","TCPPort",587));
</span><span class=input>
% param "uSMTPAuth" => $c->get_current_smtp_ssl_auth(FALSE,"u", TRUE) unless param "uSMTPAuth";
<!--
<pre>
%= dumper $c->get_smtp_ssl_auth_opt()
%= dumper $c->get_current_smtp_ssl_auth(FALSE,"s", TRUE)
%= dumper $c->get_current_smtp_ssl_auth(FALSE,"u", TRUE)
%= dumper $c->get_db_prop("uqpsmtpd","access")
%= param "uSMTPAuth"
</pre>
-->
%= select_field "uSMTPAuth" => $c->get_smtp_ssl_auth_opt(), class => "input"
</span></p>
<!--<hr class="sectionbar" />-->
<h2>
%=l "mai_TITLE_SECONDARY"
</h2><br>
%=l "mai_DESC_SECONDARY"
<p><span class=label>
%=l "mai_LABEL_SECONDARY"
</span><span class=input>
% param "SecondaryMailServer" => $mai_data->{secondarymailserver} unless param "SecondaryMailServer";
%= text_field "SecondaryMailServer", class => "input"
</span></p>
%=l "mai_DESC_FETCH_PERIOD"
<p><span class=label>
%=l "mai_LABEL_FETCH_PERIOD"
</span><span class=input>
% param "FreqOffice" => $mai_data->{freqoffice} unless param "FreqOffice";
%= select_field "FreqOffice" => $c->fetchmail_freq(), class => "input"
</span></p>
<p><span class=label>
%=l "mai_LABEL_FETCH_PERIOD_NIGHTS"
</span><span class=input>
% param "FreqOutside" => $mai_data->{freqoutside} unless param "FreqOutside";
%= select_field "FreqOutside" => $c->fetchmail_freq(), class => "input"
</span></p>
<p><span class=label>
%=l "mai_LABEL_FETCH_PERIOD_WEEKENDS"
</span><span class=input>
% param "FreqWeekend" => $mai_data->{freqweekend} unless param "FreqWeekend";
%= select_field "FreqWeekend" => $c->fetchmail_freq(), class => "input"
</span></p>
<p><span class=label>
%=l "mai_LABEL_POP_ACCOUNT"
</span><span class=input>
% param "SecondaryMailAccount" => $mai_data->{secondarymailaccount} unless param "SecondaryMailAccount";
%= text_field "SecondaryMailAccount", class => "input"
</span></p>
<p><span class=label>
%=l "mai_LABEL_POP_PASS"
</span><span class=input>
% param "SecondaryMailPassword" => $mai_data->{secondarymailpassword} unless param "SecondaryMailPassword";
%= password_field "SecondaryMailPassword", class => "input"
</span></p>
<p><span class=label>
%=l "mai_LABEL_SORT_METHOD"
</span><span class=input>
% param "SpecifyHeader" => $mai_data->{specifyheader} unless param "SpecifyHeader";
%= select_field "SpecifyHeader" => [[(l "Default") => "off"], [(l "mai_SPECIFY_BELOW") => "on"]], class => "input"
</span></p>
<p><span class=label>
%=l "mai_LABEL_SORT_HEADER"
</span><span class=input>
% param "SecondaryMailEnvelope" => $mai_data->{secondarymailenvelope} unless param "SecondaryMailEnvelope";
%= text_field "SecondaryMailEnvelope", class => "input"
</span></p>
%# ....
%# Probably finally by a submit.
%= submit_button $btn, class => "action"
%end
</div>

View File

@@ -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.',

View File

@@ -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 <b>all</b> 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',

View File

@@ -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',

View File

@@ -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',

View File

@@ -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',

View File

@@ -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',

View File

@@ -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.',

View File

@@ -0,0 +1,74 @@
<div>
% my $btn = l("hos_ADD_HOSTNAME");
<form action="/smanager/hostentriesd" method="POST">
<div class="row g-3 align-items-center">
<div class="col-md-2">
<button type="submit" class="btn btn-primary btn-sm"><%= $btn %></button>
</div>
</div>
<%= hidden_field "trt" => $hos_datas->{trt} %>
</form>
% my %dom_hos = %{$dom_hosts};
% foreach my $domain ( sort ( keys %dom_hos ) ) {
<br>
<%= $c->l("hos_CURRENT_HOSTNAMES_FOR_LOCAL_DOMAIN", $domain); %>
<br>
<table class="table table-bordered">
<thead>
<tr class="">
<th class="col-sm"><%= l "Hostname" %></th>
<th class="col-auto"><%= l "Location" %></th>
<th class="col-auto"><%= l "IP_ADDRESS_OR_FQDN" %></th>
<th class="col-auto"><%= l "hos_ETHERNET_ADDRESS" %></th>
<th class="col-auto"><%= l "COMMENT" %></th>
<th class="align-middle" colspan="2"><%= l "ACTION" %></th>
</tr>
</thead>
<tbody>
% foreach (@{$dom_hos{$domain}{"HOSTS"}}) {
<tr>
<td><%= $_->{"HostName"}; %></td>
<td><%= $_->{"HostType"}; %></td>
<td><%= $_->{"IP"}; %></td>
<td><%= $_->{"MACAddress"}; %></td>
<td><%= $_->{"Comment"}; %></td>
% my ($actionModify, $actionRemove) = "&nbsp;";
% 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{
% <a href="hostentriesd?CsrfDef=$csrf_token&trt=UPD&Hostname=$hostentries_name">
% <button type="button" class="btn btn-primary btn-sm" title="$modify_text" >
% $modify_text
% </button>
% </a>
%};
%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{
% <a href="hostentriesd?CsrfDef=$csrf_token&trt=DEL&Hostname=$hostentries_name">
% <button type="button" class="btn btn-primary btn-sm" title="$remove_text" >
% $remove_text
% </button>
% </a>
%};
% }
<td class="align-middle"><%= $c->render_to_string(inline => $actionModify) %></td>
<td class="align-middle"><%= $c->render_to_string(inline => $actionRemove) %></td>
</tr>
% }
</tbody>
</table>
% }
</div>

View File

@@ -0,0 +1,92 @@
<div>
% my $btn = l("NEXT");
<form action="/smanager/hostentriesd" method="POST">
% if ( $hos_datas->{trt} eq "ADD" ) {
<h2><%=l "hos_CREATE_TITLE" %></h2>
% } else {
<h2><%=l "hos_MODIFY_TITLE" %></h2>
% $btn = l("MODIFY");
% }
<div>
<%= l "Hostname_DESCRIPTION" %>
</div>
<br>
<div class="row g-3 align-items-center">
<div class="col-md-2">
<%=l "Hostname" %>
</div>
<div class="col-auto">
% 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} %>
% }
</div>
</div>
<br>
<div class="row g-3 align-items-center">
<div class="col-md-2">
<%= l "DOMAIN" %>
</div>
<div class="col-auto">
% 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} %>
% }
</div>
</div>
<br>
<div class="row g-3 align-items-center">
<div class="col-md-2">
<label for="inputHostComment" class="col-form-label"><%= $c->l("COMMENT", ""); %></label>
</div>
<div class="col-auto">
% param "Comment" => $hos_datas->{comment} unless param "Comment";
<input type="text" name="Comment" id="inputHostComment" class="form-control" aria-describedby="inputHostComment" value="<%= $hos_datas->{comment} %>">
</div>
</div>
<br>
<div class="row g-3 align-items-center">
<div class="col-md-2">
<%=l "LOCATION" %>
</div>
<div class="col-auto">
% param "Hosttype" => $hos_datas->{hosttype} unless param "Hosttype";
<%= select_field "Hosttype", $c->hosttype_list(), class => "form-select"; %>
</div>
</div>
<br>
<div class="row g-3 align-items-center">
<div class="col-md-2">
<button type="submit" class="btn btn-primary btn-sm"><%= $btn %></button>
</div>
</div>
<%= 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} %>
</form>
</div>

View File

@@ -0,0 +1,84 @@
<div id="hos_list">
% my $btn = l("hos_ADD_HOSTNAME");
%= form_for "/hostentries" => (method => "POST") => begin
<p>
%= submit_button "$btn", class => "action"
<br></p>
%= hidden_field "trt" => $hos_datas->{trt}
% end
% my %dom_hos = %{$dom_hosts};
% foreach my $domain ( sort ( keys %dom_hos ) ) {
<p><br><b>
%= $c->l("hos_CURRENT_HOSTNAMES_FOR_LOCAL_DOMAIN", $domain);
</b><br></p>
<table class="sme-border TableSort"><thead>
<tr>
<th class="sme-border">
%=l "Hostname"
</th>
<th class="sme-border">
%=l "Location"
</th>
<th class="sme-border">
%=l "IP_ADDRESS_OR_FQDN"
</th>
<th class="sme-border">
%=l "hos_ETHERNET_ADDRESS"
</th>
<th class="sme-border">
%=l "COMMENT"
</th>
<th class="sme-border">
%=l "ACTION"
</th>
</tr>
</thead><tbody>
% foreach (@{$dom_hos{$domain}{"HOSTS"}}) {
<tr>
%= 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"};
<td class="sme-border" style="min-width:15em">
%my ($actionModify, $actionRemove) = "&nbsp;";
%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{
% <a href="hostentriesd?CsrfDef=$csrf_token&trt=UPD&Hostname=$hostentries_name">
% <button type="button" class="sme-modify-button" title="$modify_text" >
% $modify_text
% </button>
% </a>
%};
%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{
% <a href="hostentriesd?CsrfDef=$csrf_token&trt=DEL&Hostname=$hostentries_name">
% <button type="button" class="sme-remove-button" title="$remove_text" >
% $remove_text
% </button>
% </a>
%};
%}
<%= $c->render_to_string(inline => $actionModify) %> <%= $c->render_to_string(inline => $actionRemove) %>
</td>
</tr>
% }
</tbody>
</table>
% }
</div>

View File

@@ -0,0 +1,77 @@
<div id="hos_upd">
% my $btn = l("NEXT");
%= form_for "/hostentriesd" => (method => "POST") => begin
<p><h2>
% if ( $hos_datas->{trt} eq "ADD" ) {
%=l "hos_CREATE_TITLE"
% } else {
%=l "hos_MODIFY_TITLE"
% $btn = l("MODIFY");
% }
</h2></p>
<p>
%=l "Hostname_DESCRIPTION"
</p>
<p>
<span class=label>
%=l "Hostname", class => "label"
</span><span class=data>
% 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"
% }
</span>
</p>
<p>
<span class=label>
%=l "DOMAIN", class => "label"
</span><span class=data>
% 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"
% }
</span>
</p>
<p>
<span class=label>
%= $c->l("COMMENT", "");
</span><span class=data>
% param "Comment" => $hos_datas->{comment} unless param "Comment";
%= text_field "Comment", class => "input"
</span>
</p>
<p>
<span class=label>
%=l "LOCATION", class => "label"
</span><span class=data>
% param "Hosttype" => $hos_datas->{hosttype} unless param "Hosttype";
%= select_field "Hosttype", $c->hosttype_list(), class => "input"
</span>
</p>
<p><br>
%= submit_button "$btn", class => "action"
</p>
%= 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
</div>

View File

@@ -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',

View File

@@ -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',

View File

@@ -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',

View File

@@ -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]".
<p>[_1] is a pseudonym for [_2].</p>',
'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' => '<p>You are about to remove the information bay [_1] ([_2]).
</p><p>All files belonging to this information bay will be deleted.
</p><p>Are you sure you wish to remove this information bay?
</p>',
'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' => '<P>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):</P>',
'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',

View File

@@ -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
%#
<div>
<script>
window.onload = function() {
SelectInput();
};
</script>
% if (config->{debug} == 1) {
<pre>
%= dumper $lets_data
</pre>
% }
% 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.
<h1 class=""><%=l("lets_Check_all_domains")%></h1>
<h2 class=""><%=l("lets_Loop_through_checking_the_letsencrypt")%></h2>
<span class="">
%=l("lets_All_domains_check_result")
</span>
<span class="">
% param "AllDomainsCheck" => $lets_data->{AllDomainsCheck} unless param "AllDomainsCheck";
%= text_area "AllDomainsCheck", cols=>40, rows=>10, Readonly=>"true"
</span><br>
<span class="">
%my $back_text = l("Back"); # Localized text
%my $actionBack = qq{
% <a href="letsencryptd">
% <input class="" type="submit" value="$back_text">
% </a>
%};
<%= $c->render_to_string(inline => $actionBack) %>
</span>
%# Probably finally by a submit.
%end
</div>

View File

@@ -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
%#
<div>
<!-- reetp Move to JS file -->
<!--
<script>
window.onload = function() {
SelectInput();
};
</script>
-->
% if (config->{debug} == 1) {
<pre>
<%= dumper $lets_data %>
</pre>
% }
% my $btn = l("Apply");
<!-- reetp could change this to a form -->
<!-- <form action="/smanager/letsencryptu" method="POST"> -->
%# Inputs etc in here.
<h1><%= l ("lets_Check_all_enabled_domains")%></h1>
<br>
<h2><%= l ("lets_Loop_through_checking_the_letsencrypt")%></h2>
<br>
<!-- Domains being checked -->
<div class="row g-3 align-items-center">
<div class="col-md-1">
<%= l ("lets_Enabled_domains_check_result") %>
</div>
<div class="col-auto">
% param "EnabledDomainsCheck" => $lets_data->{EnabledDomainsCheck} unless param "EnabledDomainsCheck";
%= text_area "EnabledDomainsCheck", cols=>40, rows=>10, Readonly=>"true"
</div>
</div>
<br>
<!-- results box-->
% my $back_text = l("Back"); # Localized text
%# param "trt" => $lets_data->{trt} unless param "trt";
%#= hidden_field "trt" => $lets_data->{trt}
<div class="row g-3 align-items-center">
<div class="col-md-2">
<a href="letsencryptd" class="btn btn-primary btn-sm btn-sm" role="button"><%= $back_text %></a>
</div>
</div>
<!--
</form>
-->
</div>

View File

@@ -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
%#
<div>
<!--
<script>
window.onload = function() {
SelectInput();
};
</script>
-->
% if (config->{debug} == 1) {
<pre>
%= dumper $lets_data
</pre>
% }
% my $btn = l("Apply");
<!-- <form action="/smanager/letsencrypt" method="POST"> -->
%# Inputs etc in here.
<h1><%=l("lets_Check_just_one_domain")%></h1>
<br>
<h2><%=l("lets_Loop_through_and_check_the")%></h2>
<br>
<!-- Domain being checked -->
<div class="row g-3 align-items-center">
<div class="col-md-1">
<%= l ("lets_Domains_name") %>
</div>
<div class="col-auto">
% param "OneDomainToCheck" => $lets_data->{OneDomainToCheck} unless param "OneDomainToCheck";
%= text_field "OneDomainToCheck", size => "50", class => "" , pattern=>".*" , placeholder=>"OneDomainToCheck", Readonly=>"true"
</div>
</div>
<br>
<!-- results box-->
<div class="row g-3 align-items-center">
<div class="col-md-1">
<%= l ("lets_One_domain_check_result") %>
</div>
<div class="col-auto">
% param "OneDomainsCheck" => $lets_data->{OneDomainsCheck} unless param "OneDomainsCheck";
%= text_area "OneDomainsCheck", cols=>40, rows=>10, Readonly=>"true"
</div>
</div>
<br>
% my $back_text = l("Back"); # Localized text
%# param "trt" => $lets_data->{trt} unless param "trt";
%#= hidden_field "trt" => $lets_data->{trt}
<div class="row g-3 align-items-center">
<div class="col-md-2">
<a href="letsencryptd" class="btn btn-primary btn-sm btn-sm" role="button"><%= $back_text %></a>
</div>
</div>
<!-- </form> -->
</div>

View File

@@ -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
%#
<div>
<!-- reetp Move to JS file -->
<!--
<script>
window.onload = function() {
SelectInput();
};
</script>
-->
% if (config->{debug} == 1) {
<pre>
<%= dumper $lets_data %>
</pre>
% }
<br>
<!-- reetp could change this to a form -->
<!-- <form action="/smanager/letsencryptu" method="POST"> -->
%# 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?
<div class="row g-3 align-items-center">
<div class="col-md-1">
<%= l("Config") %>
</div>
<div class="col-auto">
<a href="letsencryptd?trt=PARAMS" class="btn btn-outline-primary btn-sm" role="button"><%= $linkbtn %></a>
</div>
</div>
<br>
%#= link_to l("Config"), "letsencryptd?trt=PARAMS" , class=> "link link2"
<div class="row g-3 align-items-center">
<div class="col-md-1">
<%= l ("Check_ALL_DOMAINS") %>
</div>
<div class="col-auto">
<a href="letsencryptd?trt=CHECKALLDOMAINS" class="btn btn-outline-primary btn-sm" role="button"><%= $linkbtn %></a>
</div>
</div>
%#= link_to l("Check_ALL_DOMAINS"), "letsencryptd?trt=CHECKALLDOMAINS" , class=> "link link3"
<br>
<div class="row g-3 align-items-center">
<div class="col-md-1">
<%= l ("Check_ALL_ENABLED_DOMAINS") %>
</div>
<div class="col-auto">
<a href="letsencryptd?trt=CHECKALLENABLEDDOMAINS" class="btn btn-outline-primary btn-sm" role="button"><%= $linkbtn %></a>
</div>
</div>
%#= link_to l("Check_ALL_ENABLED_DOMAINS"), "letsencryptd?trt=CHECKALLENABLEDDOMAINS" , class=> "link link4"
<!-- </form> -->
<br><br>
<h2><%=l("lets_For_this_Server") %></h2>
<br>
<div class="row g-3 align-items-center">
<div class="col-md-1">
<%= l ("lets_Internal_IP") %>
</div>
<div class="col-auto">
% param "InternalIP" => $lets_data->{InternalIP} unless param "InternalIP";
%= text_field "InternalIP", size => "50", class => "" , pattern=>".*" , placeholder=>"InternalIP", Readonly=>"true"
</div>
</div>
<br>
<div class="row g-3 align-items-center">
<div class="col-md-1">
<%= l ("lets_External_Interface_IP") %>
</div>
<div class="col-auto">
% param "ExternalIP" => $lets_data->{ExternalIP} unless param "ExternalIP";
%= text_field "ExternalIP", size => "50", class => "" , pattern=>".*" , placeholder=>"ExternalIP", Readonly=>"true"
</div>
</div>
<br>
<div class="row g-3 align-items-center">
<div class="col-md-1">
<%= l ("lets_Internet_IP") %>
</div>
<div class="col-auto">
% param "InternetIP" => $lets_data->{InternetIP} unless param "InternetIP";
%= text_field "InternetIP", size => "50", class => "" , pattern=>".*" , placeholder=>"InternetIP", Readonly=>"true"
</div>
</div>
<br><br>
<h2><%=l("lets_Current_certificate_details") %></h2>
<br>
<div class="row g-3 align-items-center">
<div class="col-md-1">
<%= l ("Issuer") %>
</div>
<div class="col-auto">
% param "Issuer" => $lets_data->{Issuer} unless param "Issuer";
%= text_field "Issuer", size => "50", class => "" , pattern=>".*" , placeholder=>"Issuer", Readonly=>"true"
</div>
</div>
<br>
<div class="row g-3 align-items-center">
<div class="col-md-1">
<%= l ("Expiry") %>
</div>
<div class="col-auto">
% param "Expiry" => $lets_data->{Expiry} unless param "Expiry";
%= text_field "Expiry", size => "50", class => "" , pattern=>".*" , placeholder=>"Expiry", Readonly=>"true"
</div>
</div>
<br>
<div class="row g-3 align-items-center">
<div class="col-md-1">
<%= l ("lets_Not_Before") %>
</div>
<div class="col-auto">
% param "NotBefore" => $lets_data->{NotBefore} unless param "NotBefore";
%= text_field "NotBefore", size => "50", class => "" , pattern=>".*" , placeholder=>"NotBefore", Readonly=>"true"
</div>
</div>
<br><br>
<h2 class=""><%=l("lets_List_of_Domains_and_Hosts") %></h2>
<br>
% $linkbtn = l "Check";
<table class="table table-bordered">
<thead>
<tr table-head-row>
<th><%= l ("lets_Domain_name_/_HOSTNAME") %></th>
<th><%= l ("lets_Brief_description") %></th>
<th><%= l ("Content") %></th>
<th><%= l ("lets_LABEL_NAMESERVERS") %></th>
<th><%= l ("lets_LABEL_POINT") %></th>
<th><%= l ("lets_LABEL_LECERT") %></th>
<th><%= l ("lets_IS_IN_CERT") %></th>
<th><%= l ("Check") %></th>
</tr>
</thead>
<tbody>
% 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"});
<tr>
% if ($type eq "Domain\n"){
<td><%=$c->render_to_string(inline=>$row->{"Table1-Domain name / HOSTNAME"}) %></td>
% }
% if ($type eq "Host\n") {
<td><i class="bi bi-arrow-return-right"> </i><%=$c->render_to_string(inline=>$row->{"Table1-Domain name / HOSTNAME"}) %></td>
% }
<td><%=$c->render_to_string(inline=>$row->{"Table1-Brief description"}) %></td>
<td><%=$c->render_to_string(inline=>$row->{"Table1-Content"}) %></td>
<td><%=$c->render_to_string(inline=>$row->{"Table1-LABEL_NAMESERVERS"}) %></td>
<td><%=$c->render_to_string(inline=>$row->{"Table1-LABEL_POINT"}) %></td>
<td><%=$c->render_to_string(inline=>$row->{"Table1-LABEL_LECERT"}) %></td>
<td><%=$c->render_to_string(inline=>$row->{"Table1-IS_IN_CERT"}) %></td>
% if ($link ne "") {
<td><a href= "<%= $link %>" class="btn btn-outline-primary btn-sm" role="button" > <%= $linkbtn %></a></td>
% } else {
<td>&nbsp</td>
% }
</tr>
% }
</tbody>
</table>
</div>

View File

@@ -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
%#
<div>
<!-- reetp This needs fixing -->
<!--
<script>
window.onload = function() {
SelectInput();
};
</script>
-->
% if (config->{debug} == 1) {
<pre>
<%= dumper $lets_data %>
</pre>
% }
<form action="/smanager/letsencryptu" method="POST">
% param "trt" => $lets_data->{trt} unless param "trt";
%= hidden_field "trt" => $lets_data->{trt}
%# Inputs etc in here.
<h2 class=""><%=l("lets_Manage_letsencrypt-config_settings:") %></h2>
<br>
<div>
<%= l ("lets_CONFIG_LETSENCRYPT") %>
</div>
<div class="row g-3 align-items-center">
<div class="col-md-1">
<%= l ("lets_SERVICE_STATUS") %>
</div>
<div class="col-auto">
% my @status_options = selected_field([["Disabled" => "disabled"], ["Enabled" => "enabled"], ["TEST" => "test"]], $lets_data->{status});
%= select_field "status" => @status_options, class => "form-select"
</div>
</div>
<br>
<div class="row g-3 align-items-center">
<div class="col-md-1">
<%= l ("lets_HOOKSCRIPT_STATUS") %>
</div>
<div class="col-auto">
% my @hookScript_options = [["Disabled" => "disabled"], ["Enabled" => "enabled"]];
% param "hookScript" => $lets_data->{hookScript} unless param "hookScript";
%= select_field "hookScript" => @hookScript_options, class => "form-select"
</div>
</div>
<br>
<div class="row g-3 align-items-center">
<div class="col-md-1">
<%= l ("lets_HOSTOVERRIDE_STATUS") %>
</div>
<div class="col-auto">
% my @hostOverride_options = [["Disabled" => "disabled"], ["Yes" => "yes"]];
% param "hostOverride" => $lets_data->{hostOverride} unless param "hostOverride";
%= select_field "hostOverride" => @hostOverride_options, class => "form-select"
</div>
</div>
<br>
<div class="row g-3 align-items-center">
<div class="col-md-1">
<%= l ("lets_ACCEPT_TERMS_STATUS") %>
</div>
<div class="col-auto">
% 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"
</div>
</div>
<br>
<div class="row g-3 align-items-center">
<div class="col-md-1">
<%= l ("lets_API_STATUS") %>
</div>
<div class="col-auto">
% my @API_options = [["2" => "2"]];
% param "API" => $lets_data->{API} unless param "API";
%= select_field "API" => @API_options, class => "form-select"
</div>
</div>
<br>
<div class="row g-3 align-items-center">
<div class="col-md-1">
<%= l ("lets_KEYSIZE_STATUS") %>
</div>
<div class="col-auto">
% 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"
</div>
</div>
<br>
<div class="row g-3 align-items-center">
<div class="col-md-1">
<%= l ("lets_CONFIGUREMODE_STATUS") %>
</div>
<div class="col-auto">
% 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"
</div>
</div>
<br>
<div class="row g-3 align-items-center">
<div class="col-md-1">
<label for="email_address" class="col-form-label"><%= l ("Email") %></label>
</div>
<div class="col-auto">
% param "email" => $lets_data->{email} unless param "email";
<input type="email" name="email" id="email_address" class="form-control" aria-describedby="Email Address" value="<%= $lets_data->{email} %>">
</div>
</div>
<br>
% my $btn = l("Apply");
<div class="row g-3 align-items-center">
<div class="col-md-1">
<button type="submit" class="btn btn-primary btn-sm"><%= $btn %></button>
</div>
</div>
</form>
</div>

View File

@@ -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
%#
<div id="Letsencrypt-CHECKALLDOMAINS" class="partial Letsencrypt-CHECKALLDOMAINS">
<script>
window.onload = function() {
SelectInput();
};
</script>
% if (config->{debug} == 1) {
<pre>
%= dumper $lets_data
</pre>
% }
% my $btn = l("Apply");
%= form_for "letsencryptu" => (method => "POST") => begin
% param "trt" => $lets_data->{trt} unless param "trt";
%= hidden_field "trt" => $lets_data->{trt}
%# Inputs etc in here.
<h1 class="head"><%=l("lets_Check_all_domains")%></h1>
<h2 class="subh"><%=l("lets_Loop_through_checking_the_letsencrypt")%></h2>
<span class=label>
%=l("lets_All_domains_check_result")
</span><span class=data>
% param "AllDomainsCheck" => $lets_data->{AllDomainsCheck} unless param "AllDomainsCheck";
%= text_area "AllDomainsCheck", cols=>40, rows=>10, Readonly=>"true"
</span><br>
<span class="data">
%my $back_text = l("Back"); # Localized text
%my $actionBack = qq{
% <a href="letsencryptd">
% <input class="action back" type="submit" value="$back_text">
% </a>
%};
<%= $c->render_to_string(inline => $actionBack) %>
</span>
%# Probably finally by a submit.
%end
</div>

View File

@@ -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
%#
<div id="Letsencrypt-CHECKALLENABLEDDOMAINS" class="partial Letsencrypt-CHECKALLENABLEDDOMAINS">
<script>
window.onload = function() {
SelectInput();
};
</script>
% if (config->{debug} == 1) {
<pre>
%= dumper $lets_data
</pre>
% }
% my $btn = l("Apply");
%= form_for "letsencryptu" => (method => "POST") => begin
% param "trt" => $lets_data->{trt} unless param "trt";
%= hidden_field "trt" => $lets_data->{trt}
%# Inputs etc in here.
<h1 class="head"><%=l("lets_Check_all_enabled_domains")%></h1>
<h2 class="subh"><%=l("lets_Loop_through_checking_the_letsencrypt")%></h2>
<span class=label>
%=l("lets_Enabled_domains_check_result")
</span><span class=data>
% param "EnabledDomainsCheck" => $lets_data->{EnabledDomainsCheck} unless param "EnabledDomainsCheck";
%= text_area "EnabledDomainsCheck", cols=>40, rows=>10, Readonly=>"true"
</span><br>
<span class="data">
%my $back_text = l("Back"); # Localized text
%my $actionBack = qq{
% <a href="letsencryptd">
% <input class="action back" type="submit" value="$back_text">
% </a>
%};
<%= $c->render_to_string(inline => $actionBack) %>
</span>
%# Probably finally by a submit.
%end
</div>

View File

@@ -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
%#
<div id="Letsencrypt-CHECKONEDOMAIN" class="partial Letsencrypt-CHECKONEDOMAIN">
<script>
window.onload = function() {
SelectInput();
};
</script>
% if (config->{debug} == 1) {
<pre>
%= dumper $lets_data
</pre>
% }
% my $btn = l("Apply");
%= form_for "letsencryptu" => (method => "POST") => begin
% param "trt" => $lets_data->{trt} unless param "trt";
%= hidden_field "trt" => $lets_data->{trt}
%# Inputs etc in here.
<h1 class="head"><%=l("lets_Check_just_one_domain")%></h1>
<h2 class="subh"><%=l("lets_Loop_through_and_check_the")%></h2>
<p><span class=label>
%=l("lets_Domains_name")
</span><span class=data>
% param "OneDomainToCheck" => $lets_data->{OneDomainToCheck} unless param "OneDomainToCheck";
%= text_field "OneDomainToCheck", size => "50", class => "textinput OneDomainToCheck" , pattern=>".*" , placeholder=>"OneDomainToCheck", Readonly=>"true"
<br></span></p>
<span class=label>
%=l("lets_One_domain_check_result")
</span><span class=data>
% param "OneDomainsCheck" => $lets_data->{OneDomainsCheck} unless param "OneDomainsCheck";
%= text_area "OneDomainsCheck", cols=>40, rows=>10, Readonly=>"true"
</span><br>
<span class="data">
%my $back_text = l("Back"); # Localized text
%my $actionBack = qq{
% <a href="letsencryptd">
% <input class="action back" type="submit" value="$back_text">
% </a>
%};
<%= $c->render_to_string(inline => $actionBack) %>
</span>
%# Probably finally by a submit.
%end
</div>

View File

@@ -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
%#
<div id="Letsencrypt-LIST" class="partial Letsencrypt-LIST">
<script>
window.onload = function() {
SelectInput();
};
</script>
% if (config->{debug} == 1) {
<pre>
%= dumper $lets_data
</pre>
% }
% my $btn = l("Apply");
%= form_for "letsencryptu" => (method => "POST") => begin
% param "trt" => $lets_data->{trt} unless param "trt";
%= hidden_field "trt" => $lets_data->{trt}
%# Inputs etc in here.
<div class=inline-buttons>
<a href="letsencryptd?trt=PARAMS" class="link link2">
%= l("Config")
</a>
%#= link_to l("Config"), "letsencryptd?trt=PARAMS" , class=>"link link2"
<a href="letsencryptd?trt=CHECKALLDOMAINS" class="link link3">
%= l("Check_ALL_DOMAINS")
</a>
%#= link_to l("Check_ALL_DOMAINS"), "letsencryptd?trt=CHECKALLDOMAINS" , class=>"link link3"
<a href="letsencryptd?trt=CHECKALLENABLEDDOMAINS" class="link link4">
%= l("Check_ALL_ENABLED_DOMAINS")
</a>
%#= link_to l("Check_ALL_ENABLED_DOMAINS"), "letsencryptd?trt=CHECKALLENABLEDDOMAINS" , class=>"link link4"
</div>
<h2 class="subh2"><%=l("lets_For_this_Server")%></h2>
<p><span class=label>
%=l("lets_Internal_IP")
</span><span class=data>
% param "InternalIP" => $lets_data->{InternalIP} unless param "InternalIP";
%= text_field "InternalIP", size => "50", class => "textinput InternalIP" , pattern=>".*" , placeholder=>"InternalIP", Readonly=>"true"
<br></span></p>
<p><span class=label>
%=l("lets_External_Interface_IP")
</span><span class=data>
% param "ExternalIP" => $lets_data->{ExternalIP} unless param "ExternalIP";
%= text_field "ExternalIP", size => "50", class => "textinput ExternalIP" , pattern=>".*" , placeholder=>"ExternalIP", Readonly=>"true"
<br></span></p>
<p><span class=label>
%=l("lets_Internet_IP")
</span><span class=data>
% param "InternetIP" => $lets_data->{InternetIP} unless param "InternetIP";
%= text_field "InternetIP", size => "50", class => "textinput InternetIP" , pattern=>".*" , placeholder=>"InternetIP", Readonly=>"true"
<br></span></p>
<h2 class="subh3"><%=l("lets_Current_certificate_details")%></h2>
<p><span class=label>
%=l("Issuer")
</span><span class=data>
% param "Issuer" => $lets_data->{Issuer} unless param "Issuer";
%= text_field "Issuer", size => "50", class => "textinput Issuer" , pattern=>".*" , placeholder=>"Issuer", Readonly=>"true"
<br></span></p>
<p><span class=label>
%=l("Expiry")
</span><span class=data>
% param "Expiry" => $lets_data->{Expiry} unless param "Expiry";
%= text_field "Expiry", size => "50", class => "textinput Expiry" , pattern=>".*" , placeholder=>"Expiry", Readonly=>"true"
<br></span></p>
<p><span class=label>
%=l("lets_Not_Before")
</span><span class=data>
% param "NotBefore" => $lets_data->{NotBefore} unless param "NotBefore";
%= text_field "NotBefore", size => "50", class => "textinput NotBefore" , pattern=>".*" , placeholder=>"NotBefore", Readonly=>"true"
<br></span></p>
<h2 class="subh4"><%=l("lets_List_of_Domains_and_Hosts")%></h2>
% my $linkbtn = l "Check";
<br /><table class="sme-border TableSort sme-table tabl1 ">
<thead class="tabl1">
<tr table-head-row>
<th class="sme-border table-head-col table-head-col-Domain name / HOSTNAME "><%=l("lets_Domain_name_/_HOSTNAME")%></th>
<th class="sme-border table-head-col table-head-col-Brief description "><%=l("lets_Brief_description")%></th>
<th class="sme-border table-head-col table-head-col-Content "><%=l("Content")%></th>
<th class="sme-border table-head-col table-head-col-LABEL_NAMESERVERS "><%=l("lets_LABEL_NAMESERVERS")%></th>
<th class="sme-border table-head-col table-head-col-LABEL_POINT "><%=l("lets_LABEL_POINT")%></th>
<th class="sme-border table-head-col table-head-col-LABEL_LECERT "><%=l("lets_LABEL_LECERT")%></th>
<th class="sme-border table-head-col table-head-col-IS_IN_CERT "><%=l("lets_IS_IN_CERT")%></th>
<th class="sme-border table-head-col table-head-col-CHECK "><%=l("Check")%></th>
</tr>
</thead>
<tbody class="tabl1">
% my $control_data = $c->stash("DomainList");
% foreach my $row (@$control_data) {
% my $link = $c->render_to_string(inline=>$row->{"Table1-CHECK"});
<tr class="table-row">
<td class="sme-border table-col table-col-Table1-Domain name / HOSTNAME"><%=$c->render_to_string(inline=>$row->{"Table1-Domain name / HOSTNAME"})%></td>
<td class="sme-border table-col table-col-Table1-Brief description"><%=$c->render_to_string(inline=>$row->{"Table1-Brief description"})%></td>
<td class="sme-border table-col table-col-Table1-Content"><%=$c->render_to_string(inline=>$row->{"Table1-Content"})%></td>
<td class="sme-border table-col table-col-Table1-LABEL_NAMESERVERS"><%=$c->render_to_string(inline=>$row->{"Table1-LABEL_NAMESERVERS"})%></td>
<td class="sme-border table-col table-col-Table1-LABEL_POINT"><%=$c->render_to_string(inline=>$row->{"Table1-LABEL_POINT"})%></td>
<td class="sme-border table-col table-col-Table1-LABEL_LECERT"><%=$c->render_to_string(inline=>$row->{"Table1-LABEL_LECERT"})%></td>
<td class="sme-border table-col table-col-Table1-IS_IN_CERT"><%=$c->render_to_string(inline=>$row->{"Table1-IS_IN_CERT"})%></td>
% if ($link ne "") {
<td><a href= "<%= $link %>" class="btn btn-outline-primary btn-sm" role="button" > <%= $linkbtn %></a></td>
% } else {
<td>&nbsp</td>
% }
</tr>
%}
</tbody>
</table>
%# Probably finally by a submit.
%end
</div>

View File

@@ -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
%#
<div id="Letsencrypt-PARAMS" class="partial Letsencrypt-PARAMS">
<script>
window.onload = function() {
SelectInput();
};
</script>
% if (config->{debug} == 1) {
<pre>
%= dumper $lets_data
</pre>
% }
% my $btn = l("Apply");
%= form_for "letsencryptu" => (method => "POST") => begin
% param "trt" => $lets_data->{trt} unless param "trt";
%= hidden_field "trt" => $lets_data->{trt}
%# Inputs etc in here.
<h2 class="subh"><%=l("lets_Manage_letsencrypt-config_settings:")%></h2>
<p class="paragraph para1">
%=l("lets_CONFIG_LETSENCRYPT")
</p>
<p><span class=label>
%=l("lets_SERVICE_STATUS")
</span><span class=data>
%# my @status_options = [["Disabled" => "disabled"], ["Enabled" => "enabled"], ["TEST" => "test"]];
% 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"
<br></span> </p>
<p><span class=label>
%=l("lets_HOOKSCRIPT_STATUS")
</span><span class=data>
% my @hookScript_options = [["Disabled" => "disabled"], ["Enabled" => "enabled"]];
% param "hookScript" => $lets_data->{hookScript} unless param "hookScript";
%= select_field "hookScript" => @hookScript_options, class => "input"
<br></span> </p>
<p><span class=label>
%=l("lets_HOSTOVERRIDE_STATUS")
</span><span class=data>
% my @hostOverride_options = [["Disabled" => "disabled"], ["Yes" => "yes"]];
% param "hostOverride" => $lets_data->{hostOverride} unless param "hostOverride";
%= select_field "hostOverride" => @hostOverride_options, class => "input"
<br></span> </p>
<p><span class=label>
%=l("lets_ACCEPT_TERMS_STATUS")
</span><span class=data>
% my @ACCEPT_TERMS_options = [["Disabled" => "disabled"], ["Yes" => "yes"]];
% param "ACCEPT_TERMS" => $lets_data->{ACCEPT_TERMS} unless param "ACCEPT_TERMS";
%= select_field "ACCEPT_TERMS" => @ACCEPT_TERMS_options, class => "input"
<br></span> </p>
<p><span class=label>
%=l("lets_API_STATUS")
</span><span class=data>
% my @API_options = [["2" => "2"]];
% param "API" => $lets_data->{API} unless param "API";
%= select_field "API" => @API_options, class => "input"
<br></span> </p>
<p><span class=label>
%=l("lets_KEYSIZE_STATUS")
</span><span class=data>
% my @keysize_options = [["2048" => "2048"], ["3072" => "3072"], ["4096" => "4096"]];
% param "keysize" => $lets_data->{keysize} unless param "keysize";
%= select_field "keysize" => @keysize_options, class => "input"
<br></span> </p>
<p><span class=label>
%=l("lets_CONFIGUREMODE_STATUS")
</span><span class=data>
% my @configure_options = [["ALL" => "all"], ["Domains" => "domains"], ["HOSTS" => "hosts"], ["NONE" => "none"]];
% param "configure" => $lets_data->{configure} unless param "configure";
%= select_field "configure" => @configure_options, class => "input"
<br></span> </p>
<p><span class=label>
%=l("Email")
</span><span class=data>
% param "email" => $lets_data->{email} unless param "email";
%=email_field "email", class => "emai8"
</span></p>
<span class="data">
%= submit_button l("Save"), class => "action subm9"
</span>
%# Probably finally by a submit.
%end
</div>

View File

@@ -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',

View File

@@ -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',

View File

@@ -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. </P><P> "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' => '<p>Successfully added network [_1]/[_2] via router [_3].</p><p> Your server will grant local access privileges to [_4] IP addresses in the range [_5] to [_6].</p><p> Warning: the ProFTPd FTP server cannot handle this nonstandard subnet mask. The simpler specification <b>[_7]</b> will be used instead.</p>',
'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',

View File

@@ -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
%#
<div>
% if (config->{debug} == 1) {
<pre>
%= dumper $nut_data
</pre>
% }
<form action="/smanager/nutupsu" method="POST">
%# Inputs etc in here.
<!-- reetp - autocomplete="off" ? -->
<h2><%=l("nut_Manage_Nutups-config_settings:")%></h2>
<br>
<div class="row g-3 align-items-center">
<div class="col-md-1">
<%= l ("nut_Nut_status") %>
</div>
<div class="col-auto">
%# 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" %>
</div>
</div>
<br>
<div class="row g-3 align-items-center">
<div class="col-md-1">
<%= l ("nut_Nut_mode") %>
</div>
<div class="col-auto">
% 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" %>
</div>
</div>
<br><br>
<div class="masterups">
<div class="secondaryups">
<h2><%=l("nut_if_Net_Server")%></h2>
<br>
<div class="row g-3 align-items-center">
<div class="col-md-1">
<label for="inputMasterUPSName" class="col-form-label"><%= l ("nut_MasterUPS_UPSNAME@IP") %></label>
</div>
<div class="col-auto">
% param "MasterUPS_Name" => $nut_data->{MasterUPS_Name} unless param "MasterUPS_Name";
<%= "ups@". $nut_data->{"localip"} %>
</div>
</div>
<div class="row g-3 align-items-center">
<div class="col-md-1">
<%= l ("nut_SlaveUPS_User") %>
</div>
<div class="col-auto">
<%= "upssecondary" %>
</div>
</div>
<div class="row g-3 align-items-center">
<div class="col-md-1">
%=l("nut_SlaveUPS_Password")
</div>
<div class="col-auto">
<%= $nut_data->{"SlaveUPS_Pass"}%>
</div>
</div>
<br>
</div>
<br>
<div>
<h2><%= l ("nut_UPS_Device") %></h2>
<br>
<div class="row g-3 align-items-center">
<div class="col-md-1">
<label for="UPS_Model_select" class="col-form-label"><%= l ("nut_UPS_Model") %></label>
</div>
<div class="col-auto">
% 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" %>
</div>
</div>
<br>
<div class="row g-3 align-items-center">
<div class="col-md-1">
<label for="inputUPSDevice" class="col-form-label"><%= l ("nut_UPS_Device") %></label>
</div>
<div class="col-auto">
% param "UPS_Device" => $nut_data->{UPS_Device} unless param "UPS_Device";
<input type="text" name="UPS_Device" pattern=".*" size="50" id="inputUPSDevice" class="form-control" aria-describedby="UPS Device" placeholder="auto (for usb)" value="<%= $nut_data->{UPS_Device} %>" >
</div>
</div>
</div>
</div>
<div class="slaveups">
<h2><%=l("nut_if_Net_Client")%></h2>
<br>
<div class="row g-3 align-items-center">
<div class="col-md-1">
<label for="inputClientUPSDevice" class="col-form-label"><%= l ("nut_SlaveUPS_UPSNAME@IP") %></label>
</div>
<div class="col-auto">
% param "ClientUPS_Name" => $nut_data->{ClientUPS_Name} unless param "ClientUPS_Name";
<input type="text" name="ClientUPS_Name" pattern=".*" size="50" id="inputClientUPSDevice" class="form-control" aria-describedby="Client UPS Name" placeholder="upsname@IP[:port]" value="<%= $nut_data->{ClientUPS_Name} %>" >
</div>
</div>
<br>
<div class="row g-3 align-items-center">
<div class="col-md-1">
<label for="ClientUPSUsername" class="col-form-label"><%= l ("nut_ClientUPS_Username") %></label>
</div>
<div class="col-auto">
% param "ClientUPS_User" => $nut_data->{ClientUPS_User} unless param "ClientUPS_User";
<input type="text" name="ClientUPS_User" id="ClientUPSUsername" class="form-control" aria-describedby="Client UPS Username" placeholder="Client username" value="<%= $nut_data->{ClientUPS_User} %>" >
</div>
</div>
<br>
<div class="row g-3 align-items-center">
<div class="col-md-1">
<label for="password" class="col-form-label"><%= l ("nut_ClientUPS_Password") %></label>
</div>
<div class="col-auto">
% param "ClientUPS_Pass" => $nut_data->{ClientUPS_Pass} unless param "ClientUPS_Pass";
<input type="password" name="ClientUPS_Pass" id="password" class="form-control" aria-describedby="Client UPS Password" placeholder="Client password" value="<%= $nut_data->{ClientUPS_Pass} %>" >
</div>
<div class="col-auto">
<span id="togglePassword" class="bi bi-eye"></span>
</div>
</div>
</div>
<br><br>
<div class="generics">
<h2><%=l("nut_if_genericups")%></h2>
<br><br>
<div class="row g-3 align-items-center">
<div class="col-md-1">
<label for="inputUPSGenericType" class="col-form-label"><%= l ("nut_UPS_Generic_Type") %></label>
</div>
<div class="col-auto">
% param "UPS_gen_Type" => $nut_data->{UPS_gen_Type} unless param "UPS_gen_Type";
<input type="text" name="UPS_gen_Type" pattern=".*" size="50" id="inputUPSGenericType" class="form-control" aria-describedby="UPS Generic Type" placeholder="UPS_Gen_Type" value="<%= $nut_data->{UPS_gen_Type} %>" >
</div>
</div>
<br>
<div class="row g-3 align-items-center">
<div class="col-md-1">
<label for="inputUPSManufacturer" class="col-form-label"><%= l ("nut_UPS_Generic_Manufacturer") %></label>
</div>
<div class="col-auto">
% param "UPS_gen_Mfr" => $nut_data->{UPS_gen_Mfr} unless param "UPS_gen_Mfr";
<input type="text" name="UPS_gen_Mfr" pattern=".*" size="50" id="inputUPSManufacturer" class="form-control" aria-describedby="UPS Generic Manufacturer" placeholder="UPS_sen_Mfr" value="<%= $nut_data->{UPS_gen_Mfr} %>" >
</div>
</div>
<br>
<div class="row g-3 align-items-center">
<div class="col-md-1">
<label for="inputUPSModel" class="col-form-label"><%= l ("nut_UPS_Generic_Model") %></label>
</div>
<div class="col-auto">
% param "UPS_gen_Model" => $nut_data->{UPS_gen_Model} unless param "UPS_gen_Model";
<input type="text" name="UPS_gen_Model" pattern=".*" size="50" id="inputUPSModel" class="form-control" aria-describedby="UPS Generic Model" placeholder="UPS_gen_Model" value="<%= $nut_data->{UPS_gen_Model} %>" >
</div>
</div>
</div>
<br>
% param "trt" => $nut_data->{trt} unless param "trt";
<%= hidden_field "trt" => $nut_data->{trt} %>
% my $btn = l ("Save");
<div class="row g-3 align-items-center">
<div class="col-md-1">
<button type="submit" class="btn btn-primary btn-sm"><%= $btn %></button>
</div>
</div>
</form>
<br>
</div>

View File

@@ -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
%#
<div>
<!--
<script>
window.onload = function() {
SelectInput();
};
</script>
-->
% if (config->{debug} == 1) {
<pre>
<%= dumper $nut_data %>
</pre>
% }
% my $btn = l("Apply");
<form action="/smanager/nutupsu" method="POST">
% param "trt" => $nut_data->{trt} unless param "trt";
<%= hidden_field "trt" => $nut_data->{trt} %>
%# Inputs etc in here.
<div>
<a href="nutupsd?trt=CONFIG" class = "btn btn-sm btn-primary">
<%= l ("nut_Configure_NutUPS") %>
</a>
</div>
<br>
<h2><%= l ("nut_Status_of_the_controlled_UPS")%></h2>
<div >
<%= l ("nut_Descriptive_paragraph") %>
</div>
<br>
<!--
<span class="">
%=l("nut_Status_(from_upsc)")
</span>
<span class="">
% param "UPSStatus" => $nut_data->{UPSStatus} unless param "UPSStatus";
%= text_area "UPSStatus", cols=>55, rows=>35, Readonly=>"true"
</span>
<br>
-->
<%= include "partials/_nut_UPS_STATUS" %>
%# Probably finally by a submit.
</form>
</div>

View File

@@ -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
%#
<div id="Nutups-CONFIG" class="partial Nutups-CONFIG">
<script>
window.onload = function() {
SelectInput();
};
</script>
% if (config->{debug} == 1) {
<pre>
%= dumper $nut_data
</pre>
% }
% 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.
<h2 class="subh2"><%=l("nut_Manage_Nutups-config_settings:")%></h2>
<p><span class=label>
%=l("nut_Nut_status")
</span><span class=data>
%# 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"
<br></span> </p>
<p><span class=label>
%=l("nut_Nut_mode")
</span><span class=data>
% 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"
<br></span> </p>
<div class=masterups>
<div class=secondaryups>
<h2 class="subh3"><%=l("nut_if_Net_Server")%></h2>
<p><span class=label>
%=l("nut_MasterUPS_UPSNAME@IP")
</span><span class=data>
% param "MasterUPS_Name" => $nut_data->{MasterUPS_Name} unless param "MasterUPS_Name";
%= "ups@". $nut_data->{"localip"}
<br></span></p>
<p><span class="label">
%=l("nut_SlaveUPS_User")
</span><span class=data>
%= "upssecondary"
</span></p>
<p><span class="label">
%=l("nut_SlaveUPS_Password")
</span><span class=data>
<%= $nut_data->{"SlaveUPS_Pass"}%>
</span></p>
</div>
<div>
<h2><%= l ("nut_UPS_Device") %></h2>
<p><span class=label>
%=l("nut_UPS_Model")
</span><span class=data>
% 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"
<br></span> </p>
<p><span class=label>
%=l("nut_UPS_Device")
</span><span class=data>
% 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)"
<br></span></p>
</div>
</div>
<div class=slaveups>
<h2 class="subh4"><%=l("nut_if_Net_Client")%></h2>
<p><span class=label>
%=l("nut_SlaveUPS_UPSNAME@IP")
</span><span class=data>
% 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]"
<br></span></p>
<p><span class="label">
%=l("nut_ClientUPS_Username")
</span><span class=data>
% param "ClientUPS_User" => $nut_data->{ClientUPS_User} unless param "ClientUPS_User";
%=text_field "ClientUPS_User", class => "textinput"
</span></p>
<p><span class="label">
%=l("nut_ClientUPS_Password")
</span><span class=data>
% param "ClientUPS_Pass" => $nut_data->{ClientUPS_Pass} unless param "ClientUPS_Pass";
%=password_field "ClientUPS_Pass", class => "pass4 sme-password", autocomplete => "off"
</span></p>
</div>
<div class=generics>
<h2 class="subh5"><%=l("nut_if_genericups")%></h2>
<p><span class=label>
%=l("nut_UPS_Generic_Type")
</span><span class=data>
% 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"
<br></span></p>
<p><span class=label>
%=l("nut_UPS_Generic_Manufacturer")
</span><span class=data>
% 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"
<br></span></p>
<p><span class=label>
%=l("nut_UPS_Generic_Model")
</span><span class=data>
% 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"
<br></span></p>
</div>
<span class="data">
%= submit_button l("Save"), class => "action subm12"
</span>
%# Probably finally by a submit.
%end
</div>

View File

@@ -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
%#
<div id="Nutups-STATUS" class="partial Nutups-STATUS">
<script>
window.onload = function() {
SelectInput();
};
</script>
% if (config->{debug} == 1) {
<pre>
%= dumper $nut_data
</pre>
% }
% 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.
<div class=inline-buttons>
<a href="nutupsd?trt=CONFIG" class="link link1">
%= l("nut_Configure_NutUPS")
</a>
%#= link_to l("nut_Configure_NutUPS"), "nutupsd?trt=CONFIG" , class=>"link link1"
</div>
<h2 class="subh1"><%=l("nut_Status_of_the_controlled_UPS")%></h2>
<p class="paragraph para1">
%=l("nut_Descriptive_paragraph")
</p>
<br />
<!--
<span class=label>
%=l("nut_Status_(from_upsc)")
</span><span class=data>
% param "UPSStatus" => $nut_data->{UPSStatus} unless param "UPSStatus";
%= text_area "UPSStatus", cols=>55, rows=>35, Readonly=>"true"
</span><br>
-->
<span class=label>
%=l("nut_Nut_mode")
</span><span class=data>
%= $nut_data->{Nutmode}
</span><br>
% if ($nut_data->{Nutmode} eq "nutserver") {
<div class=secondaryups>
<p><span class=label>
%=l("nut_MasterUPS_UPSNAME@IP")
</span><span class=data>
% param "MasterUPS_Name" => $nut_data->{MasterUPS_Name} unless param "MasterUPS_Name";
%= "ups@". $nut_data->{"localip"}
<br></span></p>
<p><span class="label">
%=l("nut_SlaveUPS_User")
</span><span class=data>
%= "upssecondary"
</span></p>
<p><span class="label">
%=l("nut_SlaveUPS_Password")
</span><span class=data>
<%= $nut_data->{"SlaveUPS_Pass"}%>
</span></p>
</div>
% }
%= include "partials/_nut_UPS_STATUS"
%# Probably finally by a submit.
%end
</div>

View File

View File

@@ -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',

View File

@@ -0,0 +1,122 @@
<div>
% my $retref = $c->stash("ret");
% my %ret = $retref ? %$retref : (ret => "");
% my @vars = split(/,/, $ret{vars} // "");
% my ($var1, $var2, $var3, $var4, $var5, $var6, $var7) = @vars;
<br>
% if (config->{debug} == 1) {
<pre>
<%= dumper $c->current_route %>
<%= dumper $c->stash("ret") %>
</pre>
% }
% if ($ret{"ret"} eq "") {
<div>
<%= $c->render_to_string(inline => l("pf_FIRST_PAGE_DESCRIPTION")); %>
</div>
% } elsif (index($ret{ret},"SUCCESS") != -1) {
<div>
<!--<h2> Operation Status Report</h2>-->
<%= $c->render_to_string(inline => l($ret{ret}, @vars[0..6])) %>
</div>
% } else {
<div class="text-danger">
<!--<h2> Operation Status Report - Error</h2>-->
<%= $c->render_to_string(inline => l($ret{ret}, @vars[0..6])) %>
</div>
% }
<br>
<h2><%= l "pf_CREATE_RULE" %></h2>
<form action="/smanager/portforwardingb" method="POST">
<br>
<div>
<%= l "pf_SUMMARY_ADD_DESC" %>
</div>
<br>
<div class="row g-3 align-items-center">
<div class="col-md-1">
<%= l "Protocol" %>
</div>
<div class="col-auto">
<%=select_field "proto"=>["TCP","UDP"], class => "form-select" %>
</div>
</div>
<br>
<div class="row g-3 align-items-center">
<div class="col-md-1">
<label for="inputSourcePort" class="col-form-label"><%= l "pf_LABEL_SOURCE_PORT" %></label>
</div>
<div class="col-auto">
<input type="text" name="sport" id="inputSourcePort" class="form-control" aria-describedby="Source Port">
</div>
</div>
<br>
<div class="row g-3 align-items-center">
<div class="col-md-1">
<label for="inputDestinationPort" class="col-form-label"><%= l "pf_LABEL_DESTINATION_PORT" %></label>
</div>
<div class="col-auto">
<input type="text" name="port" id="inputDestinationPort" class="form-control" aria-describedby="Destination Port">
</div>
</div>
<br>
<div class="row g-3 align-items-center">
<div class="col-md-1">
<label for="inputDestinationHost" class="col-form-label"><%= l "pf_LABEL_DESTINATION_HOST" %></label>
</div>
<div class="col-auto">
<input type="text" name="dhost" id="inputDestinationHost" class="form-control" aria-describedby="Destination Host">
</div>
</div>
<br>
<div class="row g-3 align-items-center">
<div class="col-md-1">
<label for="inputAllowHosts" class="col-form-label"><%= l "pf_ALLOW_HOSTS" %></label>
</div>
<div class="col-auto">
<input type="text" name="allow" id="inputAllowHosts" class="form-control" aria-describedby="Allow Hosts">
</div>
</div>
<br>
<div class="row g-3 align-items-center">
<div class="col-md-1">
<label for="inputRuleComment" class="col-form-label"><%= l "pf_RULE_COMMENT" %></label>
</div>
<div class="col-auto">
<input type="text" name="cmmnt" id="inputRuleComment" class="form-control" aria-describedby="Comment">
</div>
</div>
<br>
% my $btn = l("ADD");
<div class="row g-3 align-items-center">
<div class="col-md-1">
<button type="submit" class="btn btn-primary btn-sm"><%= $btn %></button>
</div>
</div>
</form>
</div>

View File

@@ -0,0 +1,98 @@
<div>
% 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) {
<pre>
<%= dumper $c->current_route %>
<%= dumper $c->stash("ret") %>
<%= dumper %$pf_datas %>
</pre>
% }
<form action="/smanager/portforwardinge" method="POST">
<br>
<div>
<%= l "pf_SUMMARY_REMOVE_DESC" %>
</div>
<br>
<table>
<thead>
<th class="col-md-4">&nbsp</th>
<th class="col-md-4">&nbsp</th>
</thead>
<tbody>
<tr >
<td>
<%= l "Protocol" %>
</td>
<td>
<%= $proto %>
</td>
</tr>
<tr>
<td>
<%= l "pf_LABEL_SOURCE_PORT" %>
</td>
<td>
<%= $sport %>
</td>
<tr>
<tr>
<td>
<%= l "pf_LABEL_DESTINATION_HOST" %>
</td>
<td>
<%= $dport %>
</td>
</tr>
<tr>
<td>
<%= l "pf_LABEL_DESTINATION_PORT" %>
</td>
<td>
<%= $dhost %>
</td>
</tr>
<tr>
<td>
<%= l "pf_RULE_COMMENT" %>
</td>
<td>
<%= $cmmnt %>
</td>
</tr>
<tr>
<td>
<%= l "pf_ALLOW_HOSTS" %>
</td>
<td>
<%= $allow %>
</td>
</tr>
</tbody>
</table>
<br>
<%= hidden_field sport=>$sport %>
<%= hidden_field proto=>$proto %>
% my $btn = l("REMOVE");
<div class="row g-3 align-items-center">
<div class="col-md-1">
<button type="submit" class="btn btn-primary btn-sm"><%= $btn %></button>
</div>
</div>
</form>
</div>

View File

@@ -0,0 +1,111 @@
<div>
% 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}) {
<pre>
<%= dumper { ret_data => \%ret } %>
</pre>
% }
% if ($ret{ret} eq "") {
<div>
<%= $c->render_to_string(inline => l("pf_FIRST_PAGE_DESCRIPTION")); %>
</div>
% } elsif (index($ret{ret},"SUCCESS") != -1) {
<div>
<h2> Operation Status Report</h2>
<%= $c->render_to_string(inline => l($ret{ret}, @vars[0..6])) %>
</div>
% } else {
<br>
<div class="text-danger">
<h2> Operation Status Report - Error</h2>
<%= $c->render_to_string(inline => l($ret{ret}, @vars[0..6])) %>
</div>
% }
<br>
<form action="/smanager/portforwardinga" method="POST">
% my $btn = l("pf_CREATE_RULE");
<div class="row g-3 align-items-center">
<div class="col-md-2">
<button type="submit" class="btn btn-primary btn-sm"><%= $btn %></button>
</div>
</div>
</form>
<br>
% if ($empty) {
<br>
<%= l "pf_NO_FORWARDS" %>
% } else {
<br>
<%= l "pf_SHOW_FORWARDS" %>
<br><br>
<table class="table table-bordered">
<thead>
<tr>
<th><%= l "Protocol" %></th>
<th><%= l "pf_LABEL_SOURCE_PORT" %></th>
<th><%= l "pf_LABEL_DESTINATION_HOST" %></th>
<th><%= l "pf_LABEL_DESTINATION_PORT" %></th>
<th><%= l "pf_ALLOW_HOSTS" %></th>
<th><%= l "pf_RULE_COMMENT" %></th>
<th class="text-center"><%= l "ACTION" %></th>
</tr>
</thead>
<tbody>
% my %forwards = ();
% $forwards{TCP} = $tcpforwards;
% $forwards{UDP} = $udpforwards;
% foreach my $proto (sort keys %forwards) {
% if (@{ $forwards{$proto} }) {
% foreach my $entry (@{ $forwards{$proto} }) {
<tr class="align-middle">
% my $sport = $entry->key;
% my $dhost = $entry->prop("DestHost");
% my $dport = $entry->prop("DestPort") || "";
% my $cmmnt = $entry->prop("Comment") || "";
% my $allow = $entry->prop("AllowHosts") || "";
<td><%= $proto %></td>
<td><%= $sport %></td>
<td><%= $dhost %></td>
<td><%= $dport %></td>
<td><%= $allow %></td>
<td><%= $cmmnt %></td>
% my $remove_text = l("REMOVE"); # Localized text
% my $csrf_token = "TOKEN"; # CSRF token for security
% my $actionRemove = qq{
% <a href="portforwardingd?CsrfDef=$csrf_token&trt=DEL&sport=$sport&proto=$proto">
% <button type="button" class="btn btn-primary btn-sm" title="$remove_text" >
% $remove_text
% </button>
% </a>
% };
<td class="text-center"><%= $c->render_to_string(inline => $actionRemove) %></td>
</tr>
% }
% }
% }
% }
</tbody>
</table>
<%= hidden_field "trt" => $pf_datas->{trt} %>
</div>

View File

@@ -0,0 +1,85 @@
<div id="pf_add">
% 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}) {
<pre>
%= dumper { ret_data => \%ret }
</pre>
% }
% if ($ret{ret} eq "") {
% } elsif (index($ret{ret},"SUCCESS") != -1) {
<br>
<div class="success">
%= $c->render_to_string(inline => l($ret{ret}, @vars[0..6]))
</div>
% } else {
<br>
<div class="sme-error">
%= $c->render_to_string(inline => l($ret{ret}, @vars[0..6]))
</div>
% }
<br />
% my $btn = l("ADD");
% if (config->{debug} == 1) {
</pre>
%= dumper $c->current_route
%= dumper $c->stash("ret")
</pre>
% }
%= form_for "/portforwardingb" => (method => "POST") => begin
<h2>
%=l "pf_CREATE_RULE"
</h2>
<p>
%=l "pf_SUMMARY_ADD_DESC"
</p><br>
<span class=label>
%=l "Protocol"
</span><span class=data>
%=select_field "proto"=>["TCP","UDP"]
</span><br><br>
<span class=label>
%=l "pf_LABEL_SOURCE_PORT"
</span><span class=data>
%=text_field "sport"
</span><br><br>
<span class=label>
%=l "pf_LABEL_DESTINATION_PORT"
</span>
<span class=data>
%=text_field "dport"
</span><br><br>
<span class=label>
%=l "pf_LABEL_DESTINATION_HOST"
</span>
<span class=data>
%=text_field "dhost"
</span><br><br>
<span class=label>
%=l "pf_ALLOW_HOSTS"
</span>
<span class=data>
%=text_field "allow"
</span><br><br>
<span class=label>
%=l "pf_RULE_COMMENT"
</span>
<span class=data>
%=text_field "cmmnt"
</span><br><br>
<p>
<br>
%= submit_button "$btn", class => "action"
</p>
%end
</div>

View File

@@ -0,0 +1,66 @@
<div id="ln_del">
% 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) {
<pre>
%= dumper $c->current_route
%= dumper $c->stash("ret")
%= dumper %$pf_datas
</pre>
% }
%= form_for "/portforwardinge" => (method => "POST") => begin
<br>
%= l "pf_SUMMARY_REMOVE_DESC"
</p><br>
<span class=label>
%=l "Protocol"
</span><span class=data>
%=$proto
</span><br><br>
<span class=label>
%=l "pf_LABEL_SOURCE_PORT"
</span><span class=data>
%=$sport
</span><br><br>
<span class=label>
%=l "pf_LABEL_DESTINATION_HOST"
</span>
<span class=data>
%=$dport
</span><br><br>
<span class=label>
%=l "pf_LABEL_DESTINATION_PORT"
</span>
<span class=data>
%=$dhost
</span><br><br>
<span class=label>
%=l "pf_RULE_COMMENT"
</span>
<span class=data>
%=$cmmnt
</span><br><br>
<span class=label>
%=l "pf_ALLOW_HOSTS"
</span>
<span class=data>
%=$allow
</span><br><br>
%#}
%= hidden_field sport=>$sport
%= hidden_field proto=>$proto
<br>
%= submit_button "$btn", class => "action"
</p>
%end
</div>

View File

@@ -0,0 +1,116 @@
<div id="pf_list">
% 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}) {
<pre>
%= dumper { ret_data => \%ret }
</pre>
% }
% if ($ret{ret} eq "") {
%=l "pf_FIRST_PAGE_DESCRIPTION"
% } elsif (index($ret{ret},"SUCCESS") != -1) {
<br>
<div class="success">
%= $c->render_to_string(inline => l($ret{ret}, @vars[0..6]))
</div>
% } else {
<br>
<div class="sme-error">
%= $c->render_to_string(inline => l($ret{ret}, @vars[0..6]))
</div>
% }
<br />
<p>
<br>
%= submit_button "$btn", class => "action"
</p>
% end
% if ($empty){
<br>
%=l "pf_NO_FORWARDS"
% } else {
<br>
%=l "pf_SHOW_FORWARDS"
<br><br />
<table class="sme-border TableSort"><thead>
<tr>
<th class="sme-border">
%=l "Protocol"
</th>
<th class="sme-border">
%=l "pf_LABEL_SOURCE_PORT"
</th>
<th class="sme-border">
%=l "pf_LABEL_DESTINATION_HOST"
</th>
<th class="sme-border">
%=l "pf_LABEL_DESTINATION_PORT"
</th>
<th class="sme-border">
%=l "pf_ALLOW_HOSTS"
</th>
<th class="sme-border">
%=l "pf_RULE_COMMENT"
</th>
<th class="sme-border">
%=l "ACTION"
</th>
</tr>
</thead><tbody>
% my %forwards = ();
% $forwards{TCP} = $tcpforwards;
% $forwards{UDP} = $udpforwards;
% foreach my $proto (sort keys %forwards) {
% if (@{ $forwards{$proto} }) {
% foreach my $entry (@{ $forwards{$proto} }) {
<tr>
% 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
<td class="sme-border">
%my $remove_text = l("REMOVE"); # Localized text
%my $csrf_token = "TOKEN"; # CSRF token for security
%my $actionRemove = qq{
% <a href="portforwardingd?CsrfDef=$csrf_token&trt=DEL&sport=$sport&proto=$proto">
% <button type="button" class="sme-remove-button" title="$remove_text" >
% $remove_text
% </button>
% </a>
%};
<%= $c->render_to_string(inline => $actionRemove) %>
</td>
</tr>
% }
% }
%}
%}
</tbody>
</table>
%= hidden_field "trt" => $pf_datas->{trt}
</div>

View File

@@ -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',

View File

@@ -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',

View File

@@ -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' => '<P><A class="button-like" HREF="printers?page=0&Next=Add">Add printer</A></P>',

View File

@@ -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' => '<P>Error: unexpected characters in printer name.</P>
<P>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.</P>',
'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' => '<P><A class="button-like" HREF="printers?page=0&Next=Add">Add printer</A></P>',
'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.',

View File

@@ -0,0 +1,78 @@
% layout "AdminLTE", title => "Sme server 2 - proxy";
% content_for "module" => begin
<div class="card-body">
% if (config->{debug} == 1) {
<pre>
<%= dumper $c->current_route %>
<%= dumper $prx_datas->{http_proxy_status} %>
<%= dumper $prx_datas->{smtp_proxy_status} %>
</pre>
% }
<h1><%= $title %></h1>
<br>
<%= $modul %>
<form action="/smanager/hostentriesd" method="POST">
<br>
<div>
<%=l "prx_HTTP_PROXY_STATUS_DESCRIPTION" %>
</div>
<br>
<div class="row g-3 align-items-center">
<div class="col-md-2">
<%=l "prx_HTTP_PROXY_STATUS_LABEL" %>
</div>
<div class="col-auto">
% 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" %>
</div>
</div>
% if ( $prx_datas->{smtp_proxy_status} ) {
<br>
<div>
<%=l "prx_SMTP_PROXY_STATUS_DESCRIPTION" %>
</div>
<br>
<div class="row g-3 align-items-center">
<div class="col-md-2">
<%=l "prx_SMTP_PROXY_STATUS_LABEL" %>
</div>
<div class="col-auto">
% 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" %>
</div>
</div>
% }
<br>
% my $btn = l("SAVE");
<div class="row g-3 align-items-center">
<div class="col-md-2">
<button type="submit" class="btn btn-primary btn-sm"><%= $btn %></button>
</div>
</div>
</form>
</div>
%end

View File

@@ -0,0 +1,43 @@
% layout "default", title => "Sme server 2 - proxy";
% content_for "module" => begin
<div id="module" class="module proxy-panel">
%if (config->{debug} == 1) {
<p>(DBG)route: <%= $c->current_route %><br>
(DBG)ht stat: <%= $prx_datas->{http_proxy_status}%> <br>
(DBG)sm stat: <%=$prx_datas->{smtp_proxy_status} %>
</p>
%}
<h1><%= $title %></h1>
<br>
<%= $modul %>
<% my $btn = l("SAVE"); %>
%= form_for "proxy" => (method => "POST") => begin
<p>
%=l "prx_HTTP_PROXY_STATUS_DESCRIPTION"
<br><br>
<span class=label>
%=l "prx_HTTP_PROXY_STATUS_LABEL"
</span><span class=data>
% 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"
</span>
</p>
%if ( $prx_datas->{smtp_proxy_status} ) {
<p>
%=l "prx_SMTP_PROXY_STATUS_DESCRIPTION"
<br><br>
<span class=label>
%=l "prx_SMTP_PROXY_STATUS_LABEL"
</span><span class=data>
% 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}
<br><br>
</span>
</p>
%}
%= submit_button "$btn", class => "action"
% end
</div>
%end

View File

@@ -0,0 +1 @@
'Proxy settings' => 'Proxy settings',

View File

@@ -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 &quot;serveronly&quot; 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',

View File

@@ -0,0 +1,85 @@
<div>
% my $btn = l("pse_CLICK_TO_CREATE");
<form action="/smanager/pseudonyms" method="POST">
<%= $c->render_to_string(inline => l("pse_DESCRIPTION")); %>
<div class="row g-3 align-items-center">
<div class="col-md-2">
<button type="submit" class="btn btn-primary btn-sm"><%= $btn %></button>
</div>
</div>
<%= hidden_field "trt" => "ADD" %>
</form>
<br>
<h2><%= l "pse_CURRENT_PSEUDONYMS" %></h2>
<br>
% my $numPseudonyms = @$pseudonyms;
% if ($numPseudonyms == 0) {
<%= l "pse_ACCOUNT_PSEUDONYM_NONE" %>
% } else {
<table class="table table-bordered user-table-max-width">
<thead>
<tr>
<th class="col-sm"><%= l "Pseudonym" %></th>
<th class="col-sm"><%= l "pse_USER_OR_GROUP" %></th>
<th class="col-sm align-middle" colspan="2"><%= l "ACTION" %></th>
<!-- <th class="" style="display: normal;"></th> -->
</tr>
</thead>
<tbody>
% 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");
<tr>
<td><%= $pseudonym->key%></td>
<td><%= $account%></td>
% my ($actionModify, $actionRemove) = "&nbsp;";
% 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{
% <a href="pseudonyms2?CsrfDef=$csrf_token&trt=UPD&pseudonym=$pseudonyms_entry_name">
% <button type="button" class="btn btn-primary btn-sm" title="$modify_text" >
% $modify_text
% </button>
% </a>
% };
% }
% 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{
% <a href="pseudonyms2?CsrfDef=$csrf_token&trt=DEL&pseudonym=$pseudonyms_entry_name">
% <button type="button" class="btn btn-primary btn-sm" title="$remove_text" >
% $remove_text
% </button>
% </a>
% };
% }
<td class="align-middle"><%= $c->render_to_string(inline => $actionModify) %></td>
<td class="align-middle"><%= $c->render_to_string(inline => $actionRemove) %></td>
</tr>
% }
</tbody>
</table>
% }
</div>

View File

@@ -0,0 +1,96 @@
<div id="pse_list">
% 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"
<p><br>
%= submit_button "$btn", class => "action"
</p>
% end
<p><h2>
%=l "pse_CURRENT_PSEUDONYMS"
</h2><br>
% my $numPseudonyms = @$pseudonyms;
% if ($numPseudonyms == 0){
%=l "pse_ACCOUNT_PSEUDONYM_NONE"
% } else {
<table class="sme-border TableSort"><thead>
<tr>
<th class="sme-border">
%=l "Pseudonym"
</th>
<th class="sme-border">
%=l "pse_USER_OR_GROUP"
</th>
<th class="sme-border">
%=l "ACTION"
</th>
<!-- <th class="sme-border" style="display: normal;"></th> -->
</tr></thead>
<tbody>
% 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");
<tr>
%= t td => (class => "sme-border") => $pseudonym->key
%= t td => (class => "sme-border") => $account
<td class="sme-border">
%my ($actionModify, $actionRemove) = "&nbsp;";
%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{
% <a href="pseudonyms2?CsrfDef=$csrf_token&trt=UPD&pseudonym=$pseudonyms_entry_name">
% <button type="button" class="sme-modify-button" title="$modify_text" >
% $modify_text
% </button>
% </a>
%};
%}
%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{
% <a href="pseudonyms2?CsrfDef=$csrf_token&trt=DEL&pseudonym=$pseudonyms_entry_name">
% <button type="button" class="sme-remove-button" title="$remove_text" >
% $remove_text
% </button>
% </a>
%};
%}
<%= $c->render_to_string(inline => $actionModify) %> <%= $c->render_to_string(inline => $actionRemove) %>
</td>
</tr>
% }
</tbody>
</table>
<%} %>
</p>
</div>

View File

@@ -0,0 +1,3 @@
'pse_NO_PSEUDONYMS' => ' <b>There are no pseudonyms in the system.</b> ',
'pse_PSEUDONYM_INVALID_NOACCT' => 'That account is not hosted on this server',
'Pseudonyms' => 'Pseudonyms',

View File

@@ -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]<br>
<b>Are you sure you wish to continue?</b>',
'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' => '<p>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.</p>
<p>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".</p>
<p>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.</p>
<p>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.</p>
<p>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.</p>
<p>You can modify or remove a
pseudonym by clicking on the corresponding
command next to the pseudonym.</p>',
'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' => ' <b>There are no pseudonyms in the system.</b> ',
'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.
<p>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).</p> ',
'Pseudonyms' => 'Pseudonyms',

View File

@@ -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',

View File

@@ -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' => '<P>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.</P>
<P>Please note that it may take several minutes to generate
these reports</P>',
'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',

View File

@@ -0,0 +1,97 @@
<div>
% my $btn = l("SAVE");
<form action="/smanager/quota2" method="POST">
<h2><%= l "quo_MODIFY_USER_TITLE" %></h2>
% my $userid = $quo_datas->{user};
% my $user = $quo_datas->{userRec};
<!--
for my $user @$userAccounts
{
unless ( $user->key eq $userid) {
warn(l("USER_DIFFERENT"),$user->key);
next;
}
}
-->
% 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);
<div>
<%= l "quo_USER" %>&nbsp<%= "$name (\"$userid\")" %>
&nbsp
<%= l "quo_CURRENTLY_HAS" %>&nbsp<%= $ic %>
<%= l "files" %>
&nbsp
<%= l "quo_OCCUPYING" %>&nbsp<%= $c->toMB($bc) %>&nbsp<%= l "megabytes" %>
</div>
<br>
<div>
<%= l "quo_INSTRUCTIONS" %>
</div>
<br>
<div class="row g-3 align-items-center">
<div class="col-md-2">
<%= l "quo_USER" %>
</div>
<div class="col-auto">
<%= $name %>
</div>
</div>
<br>
% param "Soft" => $quo_datas->{softlim} unless param "Soft";
<div class="row g-3 align-items-center">
<div class="col-md-2">
<label for="inputQuotaDesc" class="col-form-label"><%=l "quo_LIMIT_WITH_GRACE" %></label>
</div>
<div class="col-auto">
<!-- text_field "Soft" -->
<input type="text" name="Soft" id="inputQuotaDesc" class="form-control" aria-describedby="QuotaDesc" value="<%= $quo_datas->{softlim} %>">
</div>
</div>
<br>
% param "Hard" => $quo_datas->{hardlim} unless param "Hard";
<div class="row g-3 align-items-center">
<div class="col-md-2">
<label for="inputQuotaABS" class="col-form-label"><%= l "quo_ABS_LIMIT" %></label>
</div>
<div class="col-auto">
<!-- text_field "Hard" -->
<input type="text" name="Hard" id="inputQuotaABS" class="form-control" aria-describedby="QuotaABS" value="<%= $quo_datas->{hardlim} %>">
</div>
</div>
<br><br>
<div class="row g-3 align-items-center">
<div class="col-md-2">
<button type="submit" class="btn btn-primary btn-sm"><%= $btn %></button>
</div>
</div>
<%= hidden_field "trt" => $quo_datas->{trt} %>
<%= hidden_field "user" => $quo_datas->{user} %>
</form>
</div>

View File

@@ -0,0 +1,84 @@
<div id="quo_upd">
% my $btn = l("SAVE");
%= form_for "/quota2" => (method => "POST") => begin
<p>
<h2>
%=l "quo_MODIFY_USER_TITLE"
</h2>
</p>
% my $userid = $quo_datas->{user};
% my $user = $quo_datas->{userRec};
<!--
for my $user @$userAccounts
{
unless ( $user->key eq $userid) {
warn(l("USER_DIFFERENT"),$user->key);
next;
}
}
-->
% 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);
<p>
%=l "quo_USER"
%= "$name (\"$userid\")"
%=l "quo_CURRENTLY_HAS"
%= $ic
%=l "files"
%=l "quo_OCCUPYING"
%= $c->toMB($bc)
%=l "megabytes"
</p>
<p>
%=l "quo_INSTRUCTIONS"
</p>
<p>
<span class=label>
%=l "quo_USER", class => "label"
</span><span class=data>
%= $name, class => "input"
</span>
</p>
<p>
<span class=label>
%=l "quo_LIMIT_WITH_GRACE", class => "label"
</span><span class=data>
% param "Soft" => $quo_datas->{softlim} unless param "Soft";
%= text_field "Soft", class => "input"
</span>
</p>
<p>
<span class=label>
%=l "quo_ABS_LIMIT", class => "label"
</span><span class=data>
% param "Hard" => $quo_datas->{hardlim} unless param "Hard";
%= text_field "Hard", class => "input"
</span>
</p>
<p>
<br><br>
%= submit_button "$btn", class => "action"
</p>
%= hidden_field "trt" => $quo_datas->{trt}
%= hidden_field "user" => $quo_datas->{user}
% end
</div>

View File

@@ -0,0 +1,2 @@
'quo_UNABLE_TO_OPEN_ACCOUNTS' => 'Unable to open accounts db',
'Quotas' => 'Quotas',

View File

@@ -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' => '<p>You can set filesystem quotas for users on your system by clicking
the "Modify" button next to the user you wish to update.
<p>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.
<p>A setting of "0" for either limit disables that limit for the
corresponding user.
<p>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',

View File

@@ -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") . "<br>" . $c->l("rbo_DESC_REBOOT");
unless ($debug) {
esmith::util::backgroundCommand(1, "/sbin/e-smith/signal-event", "reboot");
# system( "/sbin/e-smith/signal-event", "reboot" ) == 0
# or die ("Error occurred while rebooting.\n");
} ## end unless ($debug)
} elsif ($function eq "shutdown") {
$result = $c->l("rbo_SHUTDOWN_SUCCEEDED") . "<br>" . $c->l("rbo_DESC_SHUTDOWN");
unless ($debug) {
esmith::util::backgroundCommand(1, "/sbin/e-smith/signal-event", "halt");
# system( "/sbin/e-smith/signal-event", "halt" ) == 0
# or die ("Error occurred while halting.\n");
} ## end unless ($debug)
} elsif ($function eq "reconfigure") {
$result = $c->l("rbo_RECONFIGURE_SUCCEEDED") . "<br>" . $c->l("rbo_DESC_RECONFIGURE");
unless ($debug) {
# esmith::util::backgroundCommand( 1, "/sbin/e-smith/signal-event", "post-upgrade",
# "; ", "/sbin/e-smith/signal-event", "reboot" );
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;

View File

@@ -0,0 +1 @@
'Reboot or shutdown' => 'Reboot or shutdown',

View File

@@ -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 <b>perform</b> 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',

View File

@@ -0,0 +1,16 @@
'Remote access' => 'Remote access',
'rma_DESC_SERIAL_CONSOLE_ACCESS' => ' <hr class="sectionbar" /><h2>Serial console</h2>
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',

View File

@@ -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 <b>FTP</b> access to your server. We
recommend leaving this parameter set to "no access" unless you
have a specific reason to do otherwise.
<p>
Note: these settings limit access to the server and override other
settings, including those for individual information bays.</p>',
'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.
<p>
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.</p>',
'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.<br>Any old certificates will no longer
authenticate against the server, so <b><i>all IPSEC clients will
need to import a new certificate!</i></b>.',
'rma_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' => ' <hr class="sectionbar" /><h2>Serial console</h2>
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',

View File

@@ -0,0 +1,121 @@
<div>
<table class="table table-bordered">
<thead>
<tr>
<th class="col-md-2"><%= l "rvw_NETWORKING_PARAMS" %></th>
<th class="col-auto">&nbsp</th>
</tr>
</thead>
<tbody>
<tr>
<td><%= l "rvw_SERVER_MODE" %></td>
<td><%= $rvw_datas->{servermode} %></td>
</tr>
<tr>
<td><%= l "rvw_LOCAL_IP_ADDRESS_SUBNET_MASK" %></td>
<td><%= $rvw_datas->{localip} %></td>
</tr>
% if ( $rvw_datas->{publicip} ) {
<tr>
<td><%=l "rvw_INTERNET_VISIBLE_ADDRESS" %></td>
<td><%= $rvw_datas->{publicip} %></td>
</tr>
% }
<tr>
<td><%= l "Gateway"%></td>
<td>
<%= $rvw_datas->{gateway} %>
<%= $rvw_datas->{serveronly} %>
</td>
</tr>
<tr>
<td>Local Networks (not translated?)</td>
<td><%= $c->render_to_string( inline => $rvw_datas->{addlocalnetworks} );%> </td>
<tr>
<tr>
<td><%= l "rvw_DHCP_SERVER" %></td>
<td><%= $rvw_datas->{dhcpserver} %></td>
</tr>
</tbody>
</table>
<table class="table table-bordered">
<thead>
<tr>
<th class="col-md-2"><%= l "rvw_SERVER_NAMES" %></th>
<th class="col-auto">&nbsp</th>
</tr>
</thead>
<tbody>
<tr>
<td><%= l "rvw_DNS_SERVER" %></td>
<td><%= $rvw_datas->{dnsserver} %></td>
</tr>
<tr>
<td><%= l "rvw_WEB_SERVER" %></td>
<td><%= $rvw_datas->{webserver} %></tr>
</tr>
<tr>
<td><%= l "rvw_PROXY_SERVER" %></td>
<td><%= $rvw_datas->{proxyserver} %></tr>
</tr>
<tr>
<td><%= l "rvw_FTP_SERVER" %></td>
<td><%= $rvw_datas->{ftpserver} %></tr>
</tr>
<tr>
<td><%= l "rvw_SMTP_POP_AND_IMAP_MAIL_SERVERS" %></td>
<td><%= $rvw_datas->{smtpserver} %></tr>
</tr>
</tbody>
</table>
<table class="table table-bordered">
<thead>
<tr>
<th class="col-md-2"><%= l "rvw_DOMAIN_INFORMATION" %></th>
<th class="col-auto">&nbsp</th>
</tr>
</thead>
<tbody>
<tr>
<td><%= l "rvw_PRIMARY_DOMAIN" %></td>
<td><%= $rvw_datas->{domainname} %></td>
</tr>
<tr>
<td><%= l "rvw_VIRTUAL_DOMAINS" %></td>
<td><%= $rvw_datas->{virtualdomains} %></td>
</tr>
<tr>
<td><%= l "rvw_PRIMARY_WEB_SITE" %></td>
<td><%= $rvw_datas->{primarywebsite} %></td>
</tr>
<tr>
<td><%= l "rvw_SERVER_MANAGER" %></td>
<td><%= $rvw_datas->{servermanager} %></td>
</tr>
<tr>
<td><%= l "rvw_USER_PASSWORD_PANEL" %></td>
<td><%= $rvw_datas->{usermanager} %></td>
</tr>
<tr>
<td><%= l "rvw_EMAIL_ADDRESSES" %></td>
<td><%= $rvw_datas->{emailaddresses} %></td>
</tr>
</tbody>
</table>
</div>

318
output/Review/Review.new.pm Normal file
View File

@@ -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
= \"<I>\"
. $useraccount
. \"</I>\@\"
. $domain . \"<BR>\" . \"<I>\"
. $firstname
. \"</I>.<I>\"
. $lastname
. \"</I>\@\"
. $domain . \"<BR>\" . \"<I>\"
. $firstname
. \"</I>_<I>\"
. $lastname
. \"</I>\@\"
. $domain . \"<BR>\";
return $out;
} ## end sub gen2_email_addresses
=head2 gen2_domains
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 .= "<BR>";
}
$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 <br> 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 .= \"<BR>\";
}
$out .= $network->key . \"/\" . get_net_prop($c, $network->key, "Mask");
if (defined get_net_prop($c, $network->key, "Router")) {
$out .= \" via \" . get_net_prop($c, $network->key, "Router");
}
} ## end foreach my $network (sort @nets)
return $out;
} ## end else [ if ($numNetworks == 0)]
} ## end sub get2_local_networks
sub get_net_prop {
my $fm = shift;
my $item = shift;
my $prop = shift;
$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 .= \"<BR>\";
}
$out .= $network->key.\"/\" . get_net_prop($fm, $network->key, "Mask");
if ( defined get_net_prop($fm, $network->key, "Router") ) {
$out .= \" via \" . get_net_prop ($fm, $network->key, "Router");
}
}
return $out;
}
}
sub get_local_domain
{
return (get_value("","DomainName"));
}
=head2 print2_gateway_stanza
If this system is a server gateway, show the external ip and gateway ip (mojo ver)
=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 .= "<br>" . $c->l("rvw_BEGINNING_OF_DHCP_ADDRESS_RANGE") . ":";
$out .= (get_prop($c, "dhcpd", "start") || "") . "<br>";
$out .= $c->l("rvw_END_OF_DHCP_ADDRESS_RANGE") . ":";
$out .= (get_prop($c, "dhcpd", "end") || "");
} ## end if (get_prop($c, "dhcpd"...))
return $out;
} ## end sub print2_dhcp_stanza
sub get_value {
my $fm = shift;
my $item = shift;
$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;

View File

@@ -0,0 +1,137 @@
% layout "default", title => "Sme server 2 - Review";
% content_for "module" => begin
<div id="central" class="central review-panel module">
<h1> <%= $title %> </h1>
<%= $modul %><br><br>
%= form_for "review" => begin
<b>
%=l "rvw_NETWORKING_PARAMS"
</b><br>
<p><span class=label>
%=l "rvw_SERVER_MODE"
</span>
%= $rvw_datas->{servermode}
</p>
<p><span class=label>
%=l "rvw_LOCAL_IP_ADDRESS_SUBNET_MASK"
</span>
%= $rvw_datas->{localip}
</p>
% if ( $rvw_datas->{publicip} ) {
<p><span class=label>
%=l "rvw_INTERNET_VISIBLE_ADDRESS"
</span>
%= $rvw_datas->{publicip}
</p>
% }
<p><span class=label>
%=l "Gateway"
</span>
%= $rvw_datas->{gateway}
%= $rvw_datas->{serveronly}
</p>
<p><table width="100%"><tr><td class=label><!--span class=label-->
%=l "rvw_ADDITIONAL_LOCAL_NETWORKS"
<!--/span--></td><td>
%= $c->render_to_string( inline => $rvw_datas->{addlocalnetworks} );
</td></tr></table>
</p>
<p><table width="100%"><tr><td class=label>
<!--<p><span class=label>-->
%=l "rvw_DHCP_SERVER"
<!--</span>-->
</td><td>
%= $rvw_datas->{dhcpserver}
<!--</p>-->
</td></tr></table></p>
<br><br><b>
%=l "rvw_SERVER_NAMES"
</b><br>
<p><span class=label>
%=l "rvw_DNS_SERVER"
</span>
%= $rvw_datas->{dnsserver}
</p>
<p><span class=label>
%=l "rvw_WEB_SERVER"
</span>
%= $rvw_datas->{webserver}
</p>
<p><span class=label>
%=l "rvw_PROXY_SERVER"
</span>
%= $rvw_datas->{proxyserver}
</p>
<p><span class=label>
%=l "rvw_FTP_SERVER"
</span>
%= $rvw_datas->{ftpserver}
</p>
<p><span class=label>
%=l "rvw_SMTP_POP_AND_IMAP_MAIL_SERVERS"
</span>
%= $rvw_datas->{smtpserver}
</p>
<br><br><b>
%=l "rvw_DOMAIN_INFORMATION"
</b><br>
<p><span class=label>
%=l "rvw_PRIMARY_DOMAIN"
</span>
%= $rvw_datas->{domainname}
</p>
<!---<p><span class=label>-->
<p><table width="100%"><tr><td class=label>
%=l "rvw_VIRTUAL_DOMAINS"
</td><td>
<!--</span>-->
%= $rvw_datas->{virtualdomains}
</td></tr></table></p>
<!--</p>-->
<p><span class=label>
%=l "rvw_PRIMARY_WEB_SITE"
</span>
%= $rvw_datas->{primarywebsite}
</p>
<p><span class=label>
%=l "rvw_SERVER_MANAGER"
</span>
%= $rvw_datas->{servermanager}
</p>
<p><span class=label>
%=l "rvw_USER_PASSWORD_PANEL"
</span>
%= $rvw_datas->{usermanager}
</p>
<p><table width="100%"><tr><td class=label>
%=l "rvw_EMAIL_ADDRESSES"
</td><td>
%= $rvw_datas->{emailaddresses}
</td></tr></table></p>
% end
</div>
% end

View File

@@ -0,0 +1,3 @@
'Review configuration' => 'Review configuration',
'rvw_HOSTS' => 'Hosts',
'rvw_NO_VIRTUAL_DOMAINS' => 'No virtual domains defined',

View File

@@ -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',

View File

@@ -0,0 +1,161 @@
<div>
% my $btn = l("usr_ADD_USER");
<form action="/smanager/useraccounts" method="POST">
<br>
<div>
<button type="submit" class="btn btn-primary btn-sm"><%= $btn %> </button>
</div>
</form>
<br>
<%= $c->render_to_string(inline => $c->l("usr_FIRSTPAGE_DESC")) %>
<br>
%#= dumper @$users
% my $numUsers = @$users;
% if ($numUsers == 0) {
<%=l "usr_NO_USER_ACCOUNTS" %>
% } else {
<div class="table-responsive">
<table class="table table-bordered">
<thead>
<tr>
<th><%= l "ACCOUNT" %></th>
<th><%= l "USER_NAME" %></th>
<th><%= l "usr_VPN_CLIENT_ACCESS" %></th>
<th><%= l "usr_FORWARDING_ADDRESS" %></th>
<th class="text-center text-center" colspan="5"><%= l "ACTION" %></th>
</tr>
</thead>
<tbody>
% 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) = "&nbsp;";
% my $thisdomain = $c->req->url->to_abs->host;
<tr class="align-middle">
<td><%= $username %></td>
<td><%= $first %>&nbsp<%=$last %></td>
<td><%= $vpnaccess %></td>
<td><%= $fwd %></td>
% if ($useraccounts_user_name eq "admin") {
%$actionModify = qq{
%<a href="useraccountsd?CsrfDef=$csrf_token&trt=UPS&user=$useraccounts_user_name">
% <button type="button" class="btn btn-primary btn-sm" title="$modify_text">
% $modify_text
% </button>
%</a>
%};
%$actionResetPw = qq{
%<a href="useraccountsd?CsrfDef=$csrf_token&trt=PWS&user=$useraccounts_user_name">
% <button type="button" class="btn btn-primary btn-sm" title="$password_text" >
% $password_text
% </button>
%</a>
%};
% } else {
%$actionModify = qq{
%<a href="useraccountsd?CsrfDef=$csrf_token&trt=UPD&user=$useraccounts_user_name">
% <button type="button" class="btn btn-primary btn-sm" title="$modify_text" >
% $modify_text
% </button>
%</a>
%};
% }
% if ($password_set ne "yes") {
<!-- Needs a fix here -->
%#$actionLock = l("ACCOUNT_LOCKED");
<!-- Sets BOTH columns - possibly leave out Reset Password here?-->
%$actionLock = qq{
%<a href="useraccountsd?CsrfDef=$csrf_token&trt=PWD&user=$useraccounts_user_name">
% <button type="button" class="btn btn-danger btn-sm" title="$password_text - currently unset">
% Unlock
% </button>
%</a>
%};
%$actionResetPw = qq{
%<a href="useraccountsd?CsrfDef=$csrf_token&trt=PWD&user=$useraccounts_user_name">
% <button type="button" class="btn btn-primary btn-sm" title="$password_text - currently unset">
% $password_text
% </button>
%</a>
%};
% } elsif ($useraccounts_user_name ne "admin") {
%$actionLock = qq{
%<a href="useraccountsd?CsrfDef=$csrf_token&trt=LCK&user=$useraccounts_user_name">
% <button type="button" class="btn btn-primary btn-sm" title="$lock_text" >
% $lock_text
% </button>
%</a>
%};
%$actionResetPw = qq{
%<a href="useraccountsd?CsrfDef=$csrf_token&trt=PWD&user=$useraccounts_user_name">
% <button type="button" class="btn btn-primary btn-sm" title="$password_text" >
% $password_text
% </button>
%</a>
%};
% }
% if ( $removable eq "yes" ) {
%$actionRemove = qq{
%<a href="useraccountsd?CsrfDef=$csrf_token&trt=DEL&user=$useraccounts_user_name">
% <button type="button" class="btn btn-primary btn-sm" title="$remove_text" >
% $remove_text
% </button>
%</a>
%};
% }
<!-- If webmail disabled??? -->
% $actionroundcube = qq{
%<a href="roundcubepanel?CsrfDef=$csrf_token&url=https://$thisdomain/roundcube?_user=$useraccounts_user_name&height=600px">
% <button type="button" class="btn btn-primary btn-sm" title="$roundcube_text" >
% $roundcube_text
% </button>
%</a>
%};
<td class="text-center"><%= $c->render_to_string(inline => $actionModify) %></td>
<td class="text-center"><%= $c->render_to_string(inline => $actionResetPw) %></td>
<td class="text-center"><%= $c->render_to_string(inline => $actionLock) %></td>
<td class="text-center"><%= $c->render_to_string(inline => $actionRemove) %></td>
<td class="text-center"><%= $c->render_to_string(inline => $actionroundcube) %></td>
</tr>
% }
</tbody>
</table>
</div>
% }
<%= hidden_field "trt" => $usr_datas->{trt} %>
</div>

View File

@@ -0,0 +1,57 @@
<div>
% my $btn = l("Lock");
<form action="/smanager/useraccountsd" method="POST">
%#= form_for "/useraccountsd" => (method => "POST") => begin
<div>
<h2><%= l "Lock_ACCOUNT_TITLE" %></h2>
</div>
<br>
<div>
Needs a text change in the Lex files
<br>
<%= $c->l("Lock_DESC", $usr_datas->{user}, $usr_datas->{name} ) %>
</div>
<br><br>
<table class="table table-bordered user-table-max-wdith">
<thead>
<tr>
<th class="col-sm">
%=l "ACCOUNT"
</th>
<th class="col-sm">
%=l "USER_NAME"
</th>
</tr>
</thead>
<tbody>
<tr>
<td><%= $usr_datas->{user} %></td>
<td><%= $usr_datas->{name} %></td>
</tr>
</tbody>
</table>
<br>
%= $c->render_to_string(inline => $c->l("Lock_DESC2"))
<div class="row g-3 align-items-center">
<div class="col-md-2">
<button type="submit" class="btn btn-primary btn-sm"><%= $btn %></button>
</div>
</div>
%= hidden_field "trt" => $usr_datas->{trt}
%= hidden_field "user" => $usr_datas->{user}
%= hidden_field "name" => $usr_datas->{name}
</form>
%# end
</div>

View File

@@ -0,0 +1,296 @@
<div>
<br>
<h2><%= l "usr_P2_TITLE" %></h2>
<br>
<%= $c->render_to_string(inline => l ("usr_CREATE_MODIFY_DESC")) %>
<br><br>
% my $btn = l("ADD");
<form action="/smanager/useraccountsd" method="POST">
%#= form_for "/useraccountsd" => (method => "POST") => begin
% if ( $usr_datas->{trt} eq "ADD" ) {
% param "user" => $usr_datas->{user} unless param "user";
<div class="row g-3 align-items-center">
<div class="col-md-2">
<label for="inputAccountName" class="col-form-label"><%= l "usr_ACCOUNT_NAME" %></label>
</div>
<div class="col-auto">
<input type="text" name="user" id="inputAccountName" class="form-control" aria-describedby="AccountName" value="<%= $usr_datas->{user} %>" >
</div>
<div class="col-auto">
<span id="passwordHelpInline" class="form-text">
User
</span>
</div>
</div>
% } else {
<!-- If not user set Button Save not Add -->
% $btn = l("SAVE");
<div class="row g-3 align-items-center">
<div class="col-md-2">
<label for="inputLastNAme" class="col-form-label"><%= l "usr_ACCOUNT_NAME" %></label>
</div>
<div class="col-auto">
<input disabled type="text" id="disabledTextInput" class="form-control" placeholder="<%= $usr_datas->{user} %>">
</div>
</div>
% }
<br>
<div class="row g-3 align-items-center">
<div class="col-md-2">
<label for="inputFirstName" class="col-form-label"><%= l "usr_FIRSTNAME" %></label>
</div>
<div class="col-auto">
<input type="text" name="FirstName" id="inputFirstName" class="form-control" aria-describedby="FirstName" value="<%= $usr_datas->{firstname} %>" >
</div>
<div class="col-auto">
<span id="passwordHelpInline" class="form-text">
First Name
</span>
</div>
</div>
<br>
% param "LastName" => $usr_datas->{lastname} unless param "LastName";
<div class="row g-3 align-items-center">
<div class="col-md-2">
<label for="inputLastNAme" class="col-form-label"><%= l "usr_LASTNAME" %></label>
</div>
<div class="col-auto">
<input type="text" name="LastName" id="inputLastName" class="form-control" aria-describedby="LastName" value="<%= $usr_datas->{lastname} %>" >
</div>
<div class="col-auto">
<span id="passwordHelpInline" class="form-text">
Last Name
</span>
</div>
</div>
<br>
% param "Dept" => $usr_datas->{dept} unless param "Dept";
<div class="row g-3 align-items-center">
<div class="col-md-2">
<label for="inputDepartment" class="col-form-label"><%= l "Department" %></label>
</div>
<div class="col-auto">
<input type="text" name="Dept" id="inputEmail" class="form-control" aria-describedby="Dept" value="<%= $usr_datas->{dept} %>" >
</div>
<div class="col-auto">
<span id="passwordHelpInline" class="form-text">
Department
</span>
</div>
</div>
<br>
% param "Company" => $usr_datas->{company} unless param "Company";
<div class="row g-3 align-items-center">
<div class="col-md-2">
<label for="inputCompany" class="col-form-label"><%= l "Company" %></label>
</div>
<div class="col-auto">
<input type="text" name="Company" id="inputCompany" class="form-control" aria-describedby="Company" value="<%= $usr_datas->{company} %>" >
</div>
<div class="col-auto">
<span id="passwordHelpInline" class="form-text">
Company
</span>
</div>
</div>
<br>
% param "Street" => $usr_datas->{street} unless param "Street";
<div class="row g-3 align-items-center">
<div class="col-md-2">
<label for="inputStreet" class="col-form-label"><%= l "usr_STREET_ADDRESS" %></label>
</div>
<div class="col-auto">
<input type="text" name="Street" id="inputCompany" class="form-control" aria-describedby="Street" value="<%= $usr_datas->{street} %>" >
</div>
<div class="col-auto">
<span id="passwordHelpInline" class="form-text">
Street
</span>
</div>
</div>
<br>
% param "City" => $usr_datas->{city} unless param "City";
<div class="row g-3 align-items-center">
<div class="col-md-2">
<label for="inputCity" class="col-form-label"><%= l "City" %></label>
</div>
<div class="col-auto">
<input type="text" name="City" id="inputCity" class="form-control" aria-describedby="City" value="<%= $usr_datas->{city} %>" >
</div>
<div class="col-auto">
<span id="passwordHelpInline" class="form-text">
City
</span>
</div>
</div>
<br>
% param "Phone" => $usr_datas->{phone} unless param "Phone";
<div class="row g-3 align-items-center">
<div class="col-md-2">
<label for="inputPhone" class="col-form-label"><%= l "usr_PHONE_NUMBER" %></label>
</div>
<div class="col-auto">
<input type="text" name="Phone" id="inputPhone" class="form-control" aria-describedby="City" value="<%= $usr_datas->{phone} %>" >
</div>
<div class="col-auto">
<span id="passwordHelpInline" class="form-text">
Phone
</span>
</div>
</div>
<br>
% param "EmailForward" => $usr_datas->{emailforward} unless param "EmailForward";
<div class="row g-3 align-items-center">
<div class="col-md-2">
<label for="inputEmailDelivery" class="col-form-label"><%= l "usr_EMAIL_DELIVERY" %></label>
</div>
<div class="col-auto">
%= select_field "EmailForward" => $c->emailForward_list(), class => "form-select"
</div>
</div>
<br>
% param "ForwardAddress" => $usr_datas->{forwardaddress} unless param "ForwardAddress";
<div class="row g-3 align-items-center">
<div class="col-md-2">
<label for="inputEmail" class="col-form-label"><%= l "usr_FORWARDING_ADDRESS" %></label>
</div>
<div class="col-auto">
<input type="email" name="ForwardAddresss" id="inputEmail" class="form-control" aria-describedby="Email" value=<%= $usr_datas->{forwardaddress} %>>
</div>
<div class="col-auto">
<span id="passwordHelpInline" class="form-text">
Email forwarding address
</span>
</div>
</div>
<br>
% param "VPNClientAccess" => $usr_datas->{vpnclientaccess} unless param "VPNClientAccess";
<div class="row g-3 align-items-center">
<div class="col-md-2">
<label for="inputVPNClientAccess" class="col-form-label"><%= l "usr_VPN_CLIENT_ACCESS" %></label>
</div>
<div class="col-auto">
%= select_field "VPNClientAccess" => [[ (l "NO") => "no"], [ (l "YES") => "yes"]], class => "form-select"
</div>
</div>
<br>
<!-- fix from here -->
<!-- Begin if ipsec needs fixing -->
% 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
% }
<!-- End if ipsec -->
<!-- Groups begin -->
<div>
% my @groups = @{$c->get_groups()};
%#= dumper @groups
% if ( @groups ) {
<br><br>
%=l "usr_GROUP_MEMBERSHIPS"
<br><br>
<table class="table table-bordered user-table-max-wdith">
<thead>
<tr>
<th class="col-sm-1"><%= l "usr_MEMBER" %></th>
<th class="col-sm-1"><%=l "GROUP" %></th>
<th class="col-sm-1"><%=l "DESCRIPTION" %></th>
</tr>
</thead>
<tbody>
% 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";
% }
<tr>
<td>
% if ( $checked eq "checked" ) {
<input type="checkbox" name="groupMemberships" checked value="<%= $groupname %>">
%} else {
%= check_box "groupMemberships" => $groupname
%}
</td>
<td><%= $groupname %></td>
<td><%= $description %></td>
</tr>
% }
</tbody>
</table>
% }
<!-- Groups End -->
</div>
<div class="row g-3 align-items-center">
<div class="col-md-2">
<button type="submit" class="btn btn-primary btn-sm"><%= $btn %></button>
</div>
</div>
%= hidden_field "trt" => $usr_datas->{trt}
% if ( $usr_datas->{trt} eq "UPD" ) {
%= hidden_field "user" => $usr_datas->{user}
% }
</form>
%#end
</div>
<!-- End of containers-sm -->

View File

@@ -0,0 +1,28 @@
<div id="usr_lock">
% my $btn = l("Lock");
%= form_for "/useraccountsd" => (method => "POST") => begin
<p>
<h2>
%=l "Lock_ACCOUNT_TITLE"
</h2>
<br>
%= $c->l("Lock_DESC", $usr_datas->{user}, $usr_datas->{name} );
<br>
%= $c->render_to_string(inline => $c->l("Lock_DESC2"))
</p>
<p>
<br>
%= submit_button "$btn", class => "action"
</p>
%= hidden_field "trt" => $usr_datas->{trt}
%= hidden_field "user" => $usr_datas->{user}
%= hidden_field "name" => $usr_datas->{name}
% end
</div>

View File

@@ -0,0 +1,185 @@
<div id="usr_upd">
% my $btn = l("ADD");
%= form_for "/useraccountsd" => (method => "POST") => begin
<p>
<h2>
%=l "usr_P2_TITLE"
</h2>
<br>
%= $c->render_to_string(inline => l ("usr_CREATE_MODIFY_DESC"))
</p>
<p>
<span class=label>
%=l "usr_ACCOUNT_NAME"
</span><span class=data>
% 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"
% }
</span>
</p>
<p>
<span class=label>
%=l "usr_FIRSTNAME"
</span><span class=data>
% param "FirstName" => $usr_datas->{firstname} unless param "FirstName";
%= text_field "FirstName", class => "input"
</span>
</p>
<p>
<span class=label>
%=l "usr_LASTNAME"
</span><span class=data>
% param "LastName" => $usr_datas->{lastname} unless param "LastName";
%= text_field "LastName", class => "input"
</span>
</p>
<p>
<span class=label>
%=l "Department"
</span><span class=data>
% param "Dept" => $usr_datas->{dept} unless param "Dept";
%= text_field "Dept", class => "input"
</span>
</p>
<p>
<span class=label>
%=l "Company"
</span><span class=data>
% param "Company" => $usr_datas->{company} unless param "Company";
%= text_field "Company", class => "input"
</span>
</p>
<p>
<span class=label>
%=l "usr_STREET_ADDRESS"
</span><span class=data>
% param "Street" => $usr_datas->{street} unless param "Street";
%= text_field "Street", class => "input"
</span>
</p>
<p>
<span class=label>
%=l "City"
</span><span class=data>
% param "City" => $usr_datas->{city} unless param "City";
%= text_field "City", class => "input"
</span>
</p>
<p>
<span class=label>
%=l "usr_PHONE_NUMBER"
</span><span class=data>
% param "Phone" => $usr_datas->{phone} unless param "Phone";
%= text_field "Phone", class => "input"
</span>
</p>
<p>
<span class=label>
%=l "usr_EMAIL_DELIVERY"
</span><span class=data>
% param "EmailForward" => $usr_datas->{emailforward} unless param "EmailForward";
%= select_field "EmailForward" => $c->emailForward_list(), class => "input"
</span>
</p>
<p>
<span class=label>
%=l "usr_FORWARDING_ADDRESS"
</span><span class=data>
% param "ForwardAddress" => $usr_datas->{forwardaddress} unless param "ForwardAddress";
%= text_field "ForwardAddress", class => "input"
</span>
</p>
<p>
<span class=label>
%=l "usr_VPN_CLIENT_ACCESS"
</span><span class=data>
% param "VPNClientAccess" => $usr_datas->{vpnclientaccess} unless param "VPNClientAccess";
%= select_field "VPNClientAccess" => [[ (l "NO") => "no"], [ (l "YES") => "yes"]], class => "input"
</span>
</p>
% if ( $usr_datas->{trt} eq "UPD" and $c->ipsec_for_acct eq "OK" ) {
% my $btn2 = $c->l("DOWNLOAD");
%= form_for "/useraccountso" => (method => "POST") => begin
<p>
<span class=label>
%=l "usr_LABEL_IPSECRW_DOWNLOAD"
</span><span class=data>
%= submit_button $btn2, class => "action"
</span>
</p>
%= hidden_field "trt" => "CRT"
%= hidden_field "user" => $usr_datas->{user}
%end
% }
% my @groups = @{$c->get_groups()};
% if ( @groups ) {
<p>
<span class=label>
%=l "usr_GROUP_MEMBERSHIPS"
</span>
<span class=data>
<table class="sme-border "><thead>
<tr><th class="sme-border">
%=l "usr_MEMBER"
</th><th class="sme-border">
%=l "GROUP"
</th><th class="sme-border">
%=l "DESCRIPTION"
</th></tr>
</thead><tbody>
% 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";
% }
<tr>
<td>
% if ( $checked eq "checked" ) {
<!-- % = check_box "groupMemberships", value => $groupname, checked => $checked -->
<input type="checkbox" name="groupMemberships" checked value="<%= $groupname %>">
%} else {
%= check_box "groupMemberships" => $groupname
%}
</td>
<!-- t td => (class => "sme-border") => (check_box " groupMemberships" => $groupname $checked) -->
%= t td => (class => "sme-border") => $groupname
%= t td => (class => "sme-border") => "$description"
</tr>
% }
</tbody>
</table>
</span>
</p>
% }
<p>
<br><br>
%= submit_button $btn, class => "action"
</p>
%= hidden_field "trt" => $usr_datas->{trt}
% if ( $usr_datas->{trt} eq "UPD" ) {
%= hidden_field "user" => $usr_datas->{user}
% }
% end
</div>

View File

@@ -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',

Some files were not shown because too many files have changed in this diff Show More