Compare commits

...

35 Commits

Author SHA1 Message Date
fa286e966d * Thu Apr 17 2025 Brian Read <brianr@koozali.org> 11.0.0-78.sme
- typo in remoteaccess panel
- Fix crash in veiwlogfiles if viewlogfiles key not in DB
2025-04-17 12:16:38 +01:00
9bb2128891 Typo in name for remoteaccess panel 2025-04-16 17:48:37 +01:00
accf96df0d * Sat Apr 12 2025 Brian Read <brianr@koozali.org> 11.0.0-77.sme
- Sort out local and pulic access setting in remote panel  [SME: 12988]
- caching problem, plus confusion between normal and public setting in sshd / access in DB
2025-04-12 09:08:12 +01:00
1c601f0ace * Fri Apr 11 2025 Brian Read <brianr@koozali.org> 11.0.0-76.sme
- Restore css for roundcube embedded  [SME: 12987]
2025-04-11 07:09:03 +01:00
cffbe53fb4 * Wed Apr 09 2025 Brian Read <brianr@koozali.org> 11.0.0-75.sme
- Move review configuration to behind login [SME: 12984]
- Fix crash in port forwarding [SME: 12985]
2025-04-09 10:43:14 +01:00
aad1a458f4 * Wed Mar 26 2025 Brian Read <brianr@koozali.org> 11.0.0-74.sme
- Fix error message and success message format in Local Networking panel [SME: 12969]
2025-03-26 08:58:32 +00:00
252bf20410 * Tue Mar 25 2025 Brian Read <brianr@koozali.org> 11.0.0-73.sme
- Some changes to error message format in css.
- Fix DB Cache problem with port forwarding panel [SME: 12970]
- Fix error and success message display for port forwarding panel [SME: 12969]
2025-03-25 15:05:34 +00:00
ebbe7af9a7 * Mon Mar 24 2025 Brian Read <brianr@koozali.org> 11.0.0-72.sme
- Remove css files from template structure [SME: 12967]
- Rationalise and merge css files
- Adjust some gaps around panels
- Remove HR lines
2025-03-24 17:23:02 +00:00
36de44fcef * Thu Mar 20 2025 Brian Read <brianr@koozali.org> 11.0.0-71.sme
- Sort out navigation menu error on startup [SME: 12946]
- More places where floating panel needed
- Adjust floating panel to make space around it the same
- clean up some css
2025-03-20 12:15:50 +00:00
750ab7dd11 * Wed Mar 19 2025 Brian Read <brianr@koozali.org> 11.0.0-70.sme
- Re-cast the default theme - use proper koozali logo image, unwind multiple divs
- Enhance responsiveness
- Revert Ibay menu name to Ibays
- Remove legacy SM1 button on header
- Remove "?" access to wiki help on header
2025-03-19 13:45:03 +00:00
77ca17c851 * Mon Mar 17 2025 Brian Read <brianr@koozali.org> 11.0.0-69.sme
- Add a total summary report across all existing logs [SME: 12951]
2025-03-17 15:27:16 +00:00
535d78eacb * Mon Mar 17 2025 Brian Read <brianr@koozali.org> 11.0.0-68.sme
- re-write qmailanalog for postfix [SME: 12951]
- Clean up backup.pm
- Enhance module panel - used by mail log analysis and Licence display
2025-03-17 12:22:38 +00:00
88ee369253 * Mon Mar 17 2025 Brian Read <brianr@koozali.org> 11.0.0-67.sme
- re-write qmailanalog for postfix [SME: 12951]
- Clean up backup.pm
- Enhance module panel - used by mail log analysis and Licence display
2025-03-17 12:20:55 +00:00
5be2152e89 * Mon Mar 17 2025 Brian Read <brianr@koozali.org> 11.0.0-67.sme
- re-write qmailanalog for postfix [SME: 12951]
- Clean up backup.pm
- Enhance module panel - used by mail log analysis and Licence display
2025-03-17 12:08:40 +00:00
63973f2bb4 * Tue Mar 11 2025 Brian Read <brianr@koozali.org> 11.0.0-66.sme
- Move the button for each backup panel to the left to conform to all the other panels.
2025-03-11 17:37:44 +00:00
82ff48e641 * Sun Mar 09 2025 Brian Read <brianr@koozali.org> 11.0.0-65.sme
- Sort out missing hostname on nfs and cifs workstation backup on error [SME: 12948]
2025-03-09 15:38:39 +00:00
c5d863b3a0 * Sat Mar 08 2025 Brian Read <brianr@koozali.org> 11.0.0-64.sme
- Add code to check for boot phase completion [SME: 12953]
2025-03-08 10:45:00 +00:00
4f00dfbdb1 * Thu Mar 06 2025 Brian Read <brianr@koozali.org> 11.0.0-63.sme
- Add boot.svg image to Bug Report panel [SME: 12953]
- Move report template to inside smanager tree
- Add one-off systemd task to create boot.svg run from panel
2025-03-07 15:41:55 +00:00
f9bf8cf064 refine spec comment 2025-03-04 14:36:14 +00:00
4f0617f6c3 * Tue Mar 04 2025 Brian Read <brianr@koozali.org> 11.0.0-62.sme
- Update .lex files to conform to standard english punctuation  [SME: 11809]
2025-03-04 14:18:38 +00:00
4c94d768e2 * Tue Mar 04 2025 Brian Read <brianr@koozali.org> 11.0.0-61.sme
- Arrange for the version in the footer to be suppressed if non admin login  [SME: 12887]
2025-03-04 10:11:38 +00:00
1731f75cba * Thu Feb 27 2025 Brian Read <brianr@koozali.org> 11.0.0-60.sme
- Enhance ssh security wording to mention autoblock in remoteaccess panel  [SME: 8309]
2025-02-27 15:54:27 +00:00
5fe285f9f2 * Thu Feb 27 2025 Brian Read <brianr@koozali.org> 11.0.0-59.sme
- Arrange for Urgent notice to be displayed if date is past Rocky 8 EOL [SME: 12918]
2025-02-27 15:02:05 +00:00
1c93be6e8a * Tue Feb 25 2025 Brian Read <brianr@koozali.org> 11.0.0-58.sme
- re-organise open db placement [SME: 12695]
- Re-arrange parameters to tar to avoid warning message in logs [SME: 12943]
2025-02-26 11:57:22 +00:00
ce96f72726 Finally - re-arrange tar params to avoid warning in logs 2025-02-25 12:25:46 +00:00
0fd7137edd sort out open db placements in routes and re-arrange tar params to avoid warning in logs 2025-02-25 12:22:52 +00:00
d179b06f69 Sort out opendb placement and re-arrange tar parameters to avoid warning in logs 2025-02-25 12:14:12 +00:00
c2427189d5 * Fri Feb 21 2025 Jean-Philippe Pialasse <jpp@koozali.org> 11.0.0-57.sme
- upgrade validate_password sub to use esmith::util [SME: 12937]
  and deduplicate code
2025-02-21 01:35:33 -05:00
887af04bfe Add in buzilla number to changelog line 2025-02-20 15:45:48 +01:00
34b85b1cde * Thu Feb 20 2025 Brian Read <brianr@koozali.org> 11.0.0-56.sme
- open db in routes for backup controller file  [SME: 12933]
- Fix error handling for pre-backup fail [SME:
2025-02-20 14:35:09 +00:00
a5758b4431 * Tue Feb 18 2025 Brian Read <brianr@koozali.org> 11.0.0-55.sme
- fix public ftp access not showing on panel [SME: 12927]
2025-02-18 16:16:36 +00:00
58aa423089 * Sat Feb 15 2025 Jean-Philippe Pialasse <jpp@koozali.org> 11.0.0-54.sme
- helper to set default value of select field using protected value [SME: 12923]
2025-02-16 02:28:01 -05:00
c0b4d1f90e * Sat Feb 15 2025 Jean-Philippe Pialasse <jpp@koozali.org> 11.0.0-53.sme
- helper to set default value of select field using protected value [SME: 12923]
2025-02-15 15:19:04 -05:00
a979d472e8 * Wed Feb 12 2025 Jean-Philippe Pialasse <jpp@koozali.org> 11.0.0-52.sme
- move letsencrypt panel to smeserver-certificates [SME: 12916]
2025-02-12 23:14:38 -05:00
d776f20736 * Mon Feb 10 2025 Brian Read <brianr@koozali.org> 11.0.0-51.sme
- Replace url in call to webmail by browser url rather than system host and domain [SME: 12910]
- Fix up CSS so not inline
- Sort out reveiw panel missing routines from FormMagic [SME: 12907].
2025-02-12 16:31:17 +00:00
91 changed files with 1906 additions and 3522 deletions

View File

@@ -1,250 +0,0 @@
{
$OUT = <<'EOF';
/* from e-smith-manager to smanager (smeserver_manager2) */
/*----------------------------------------------------------------------
* copyright (C) 1999-2003 Mitel Networks Corporation
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
* Technical support for this program is available from Mitel Networks
* Please visit our web site www.mitel.com for details.
*----------------------------------------------------------------------
*/
/* This is the stylesheet used as the basis for older broswers.
Note that you CANNOT simly add styles here and hope they work. ONLY CSS
level 1 styles should be in this file. Everyting else goes into the other 3
files.
These basic styles ensire that browsers that don't understand the @import
method will still be usable. All modern browsers will use the styles in
sme_main.css, sme_menu.css or sme_header.css depending on the frame in which
the page is found.
*/
/* Default HTML styles */
body {
background: #ffffff;
color: #000000;
font-family: Verdana, Arial, Helvetica, sans-serif;
font-size: 11px;
border-width: 0;
}
table, tr, td, div, p, form {
color: #000000;
font-family: Verdana, Arial, Helvetica, sans-serif;
font-size: 11px;
}
p {
margin-top: 8px;
margin-bottom: 2px;
}
form {
margin-top: 2px;
margin-bottom: 2px;
}
span {
font-family: Verdana, Arial, Helvetica, sans-serif;
font-size: 11px;
}
.notsmall {
font-family: Verdana, Arial, Helvetica, sans-serif;
font-size: 11px;
}
h1, .h1 {
font-family: Verdana, Arial, Helvetica, sans-serif;
color: #333333;
font-size: 18px;
margin-bottom: 4px;
margin-top: 12px;
}
h2, .h2 {
font-family: Verdana, Arial, Helvetica, sans-serif;
color: #333333;
font-size: 14px;
margin-bottom: 3px;
margin-top: 12px;
}
h3, .h3 {
font-family: Verdana, Arial, Helvetica, sans-serif;
color: #333333;
font-size: 12px;
margin-bottom: 2px;
margin-top: 12px;
}
h4, .h4 {
font-family: Verdana, Arial, Helvetica, sans-serif;
font-style: italic;
color: #333333;
font-size: 12px;
margin-bottom: 2px;
margin-top: 10px;
}
ol, ul, li {
font-family: Verdana, Arial, Helvetica, sans-serif;
font-size: 10px;
font-weight: normal;
color: black;
}
ul {
list-style-type: circle;
}
/* Core styles for use with sme_header.css*/
body.header {
font-family: Verdana, Arial, Helvetica, sans-serif;
font-size: 11px;
background: #cccccc;
margin-top: 0px;
margin-right: 0px;
margin-bottom: 0px;
margin-left: 0px;
}
.hilightbar {
background-color: #ffc50a;
font-size: 4px;
}
.infobar {
font-family: Verdana, Arial, Helvetica, sans-serif;
font-size: 11px;
background-color: #cccccc;
}
.darkergrey {
color: #666666;
}
td.darkgrey {
background-color: #888888;
}
a.update {
color: red;
font-family: Verdana, Arial, Helvetica, sans-serif;
font-size: 11px;
background: #cccccc;
}
/* Core styles for use with sme_menu.css */
body.menu {
font-family: Verdana, Arial, Helvetica, sans-serif;
font-size: 11px;
background-color: #e8f3e1;
}
td.section {
padding-bottom: 2px;
padding-top: 8px;
}
.section {
font-family: Verdana, Arial, Helvetica, sans-serif;
font-size: 11px;
font-weight: bold;
background-color: #e8f3e1;
}
a.item {
color: #00008b;
font-family: Verdana, Arial, Helvetica, sans-serif;
font-size: 11px;
background: #e8f3e1;
}
a.sl {
color: green;
font-family: Verdana, Arial, Helvetica, sans-serif;
font-size: 11px;
background: #e8f3e1;
}
a.alert {
color: red;
font-family: Verdana, Arial, Helvetica, sans-serif;
font-size: 11px;
background: #e8f3e1;
}
/* Core styles for use with sme_main.css */
body.main {
font-family: Verdana, Arial, Helvetica, sans-serif;
font-size: 11px;
background-color: #ffffff;
color: #000000;
}
td.sme-noborders-label {
font-weight: bold;
width: 33%;
text-align: right;
}
hr.sectionbar {
color: #666666;
background-color: #666666;
height: 1px;
width: 80%;
border: 0;
}
hr.sme-copyrightbar {
color: #dddddd;
background-color: #dddddd;
height: 1px;
width: 100%;
border: 0;
}
.sme-copyright {
color: #777777;
font-family: Verdana, Arial, Helvetica, sans-serif;
font-size: 10px;
}
/*These style definitions were found int he old css file (manager.css)
but don't seem to ever be referenced in the code. They're here
for reference.
.centerit {
text-align: center;
}
.highlight {
background: #ffc61e;
}
.subheading {
background: #ffffff;
color: #1e385b;
}
*/
EOF
}

View File

@@ -1,96 +0,0 @@
{
$OUT =<<'HERE';
/* from e-smith-manager to smanager (smeserver_manager2) */
/*----------------------------------------------------------------------
* copyright (C) 1999-2003 Mitel Networks Corporation
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
* Technical support for this program is available from Mitel Networks
* Please visit our web site www.mitel.com for details.
*----------------------------------------------------------------------
*/
/*contribs.org styling
*/
body.header {
background: #bee6a2;
}
.hilightbar {
background-color: #ffffff;
}
.infobar {
background-color: #98d36e;
}
a.update {
font-size: 11px;
background: #98d36e;
}
/* Core styles for use with sme_menu.css */
body.menu {
background-color: #e8f3e1;
}
td.section {
background-color: #e8f3e1;
}
a.item {
background: #e8f3e1;
}
a.sl {
background: #e8f3e1;
}
a.alert {
background: #e8f3e1;
}
/* Core Styles for use with sme_main.css */
hr.sectionbar {
color: #8ebe43;
background-color: #8ebe43;
}
hr.sme-copyrightbar {
color: #8ebe43;
background-color: #8ebe43;
}
/* flag container*/
#flag-container span {
font-size: 24px;
display: flex; /* Allows for easy centering */
justify-content: center; /* Center horizontally */
align-items: center; /* Center vertically */
width: 100%; /* Full width of parent */
height: 24px; /* Set a fixed height */
border: 1px solid #ccc; /* Light gray border */
border-radius: 5px; /* Rounded corners */
cursor: default; /* Prevent text cursor */
}
.fallback-box {
display: inline-block; /* Make it inline-block to fit around the content */
border: 2px solid gray; /* Change the border color as desired */
padding: 10px; /* Add some padding */
border-radius: 10px; /* Round the corners of the box */
font-size: 60px; /* Adjust size if needed */
margin-top: 10px; /* Add some margin */
text-align: center; /* Center text inside the box */
}
HERE
}

View File

@@ -1 +0,0 @@
/* DO NOT MODIFY THIS FILE! It is updated automatically */

View File

@@ -1,440 +0,0 @@
{
$OUT = <<'EOF';
/* from e-smith-manager to smanager (smeserver_manager2) */
/*----------------------------------------------------------------------
* copyright (C) 1999-2003 Mitel Networks Corporation
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
* Technical support for this program is available from Mitel Networks
* Please visit our web site www.mitel.com for details.
*----------------------------------------------------------------------
*/
/* This is the stylesheet used in the main panels only.
This file inherits the styles use in sme_core in the "header" section, and
as noted in the code below. Note that some of the styles here are empty.
This is because the style definition has moved safely to sme_core.css
and the placeholder is left here for reference or future use.
There are a lot of styles in here, so read carefully. Each one is documented.
Styles that were in the old stylesheets, but are not used in the UI are at the
bottom, commented out. These can be removed at the end of the 6.0 cycle */
/* general page properties */
body, body.main {
margin-top: 5px;
margin-right: 20px;
margin-bottom: 5px;
margin-left: 5px;
}
/* Table properties ****************************************/
/* There are THREE types of tables
1. *.sme-layout* is used for layout purposes. It is the "master
container" on a page. It controls the top-level table
inside of which everything else is put.
2. *.sme-noborders* is used for layout, and defines a borderless table and
cells used within it.
2. *.sme-border* is used for tabular data, and defines a header row and borders
for tables that need borders
*/
/*First, some defaults */
td {
text-align: left;
}
/*
sme-layout* : Used for top-level layout
*/
table.sme-layout {
border-collapse: collapse;
margin-bottom: 2px;
margin-top: 2px;
}
tr.sme-layout {
border: 1px solid #dddddd;
}
td.sme-layout {
border: 1px solid #dddddd;
}
/*This special style is actually used only for the button row along the bottom of each page*/
th.sme-layout {
border: 1px solid #dddddd;
background-color: #e8f3e1;
font-family: Verdana, Arial, Helvetica, sans-serif;
font-size: 9pt;
font-weight: bold;
color: #000000;
text-align: right;
padding: 4px;
}
/*
sme-noborders* : Used for mid-level layout
*/
table.sme-noborders {
padding: 0px;
margin-top: 0px;
margin-bottom: 20px;
margin-left: 0px;
margin-right: 0px;
font-family: Verdana, Arial, Helvetica, sans-serif;
font-size: 11px;
}
td.sme-noborders-label {
font-weight: bold;
/*width: 250px;*/
text-align: right;
/*vertical-align: top;*/
background-color: #e8f3e1;
font-family: Verdana, Arial, Helvetica, sans-serif;
font-size: 11px;
}
td.sme-noborders-content {
text-align: left;
vertical-align: top;
font-family: Verdana, Arial, Helvetica, sans-serif;
font-size: 11px;
}
td.sme-noborders-info, div.sme-noborders-info {
text-align: left;
vertical-align: top;
}
/* Used for a left-most column of radio buttons (see date/time panel) */
td.sme-radiobutton {
width: 30px;
}
/*
sme-border* : Used for tabular data
*/
table.sme-border {
border-collapse: collapse;
border: 2px solid #cccccc;
empty-cells: show;
margin: 5px 5px 5px 2px;
}
td.sme-border,
td.sme-border-warning,
td.sme-border-right,
td.sme-border-center {
border: 1px solid #cccccc;
font-family: Verdana, Arial, Helvetica, sans-serif;
font-size: 10px;
font-weight: normal;
color: #000000;
text-align: left;
padding-left: 2px;
padding-right: 2px;
padding-top: 3px;
padding-bottom: 3px;
}
td.sme-border-warning {
color: red;
}
td.sme-border-right {text-align: right;}
td.sme-border-center {text-align: center;}
th.sme-border {
border: 1px solid #cccccc;
background-color: #bee6a2;
font-family: Verdana, Arial, Helvetica, sans-serif;
font-size: 10px;
font-weight: bold;
color: #000000;
text-align: center;
vertical-align: bottom;
padding-left: 2px;
padding-right: 2px;
padding-left: 3px;
padding-right: 3px;
padding-top: 3px;
padding-bottom: 3px;
/*border-width: 1px;
border-style: solid;
border-color: #F2F0EE #75736E #75736E #F2F0EE ;*/
}
td.sme-border a, td.sme-border-right a, td.sme-border-center a {
font-size: 10px;
}
/* misc layout stuff*/
/* these two are for any error messages that pop up*/
div.error, div.sme-error, span.error, span.sme-error {
color: red;
background-color: #ffffff;
border-width: 1px;
border-style: solid;
border-color: red ;
padding: 2px;
margin-left: 20px;
margin-right: 20px;
margin-top:0px;
margin-bottom:0px;
}
div.error-noborders, div.sme-error-noborders,
span.error-noborders, span.sme-error-noborders
{
color: red;
background-color: #ffffff;
border-width: 0px;
}
div.error h2, span.error h2,
div.error p, span.error p
{
color: red;
}
/* These are for the special case of a link being inside an error message */
div.sme-error a, div.error a, span.error a, span.sme-error a,
div.error-noborders a, div.sme-error-noborders a,
span.error-noborders a, span.sme-error-noborders a
{
color: #ff0000;
font-weight: bold;
text-decoration: underline;
}
/* For when a link is the error message */
a.error:link, a.error:visited, a.error:hover, a.error:active {
color: #ff0000;
font-weight: normal;
text-decoration: underline;
}
/* these two are for any success messages that pop up*/
div.success, span.success {
color: #006400;
background-color: #ffffff;
border-width: 1px;
border-style: solid;
border-color: #006400 ;
padding: 2px;
margin-left: 20px;
margin-right: 20px;
margin-top:0px;
margin-bottom:0px;
}
/* These two are for the special case of a link being inside a success message */
div.success a, span.success a
{
color: #006400;
font-weight: bold;
text-decoration: underline;
}
div.success h2, span.success h2,
div.success p, span.success p
{
color: green;
}
/*These two define the copyright footer styles, one for the line and one for the text*/
hr.sme-copyrightbar {
}
.sme-copyright {
}
/* These ones define styles for the links that are made to look like
standard form submit buttons */
a.button-like:link,
a.button-like:visited,
a.button-like:hover,
a.button-like:active,
a.button-like-small:link,
a.button-like-small:visited,
a.button-like-small:hover,
a.button-like-small:active {
font-family: sans-serif;
font-size: 13px;
color: black;
background: #D4D0C8;
text-decoration: none;
text-align: left;
border-color: #F2F0EE #75736E #75736E #F2F0EE ;
margin-top: 10px;
margin-right: 2px;
margin-bottom: 10px;
margin-left: 2px;
border-style: solid;
border-top-width: 2px;
border-right-width: 2px;
border-bottom-width: 2px;
border-left-width: 2px;
padding-top: 2px;
padding-bottom: 2px;
padding-left: 6px;
padding-right: 6px;
}
a.button-like-small:link,
a.button-like-small:visited,
a.button-like-small:hover,
a.button-like-small:active {
border-top-width: 1px;
border-right-width: 1px;
border-bottom-width: 1px;
border-left-width: 1px;
font-size: 10px;
padding-top: 0px;
padding-bottom: 0px;
padding-left: 1px;
padding-right: 1px;
}
a.button-like:active,
a.button-like-small:active {
border-color: #75736E #F2F0EE #F2F0EE #75736E ;
}
/* EXPERIMENTAL SECTION */
/* These are styles used to experiment with. */
/* class for links, similar to the class in sme_menu.css, but for a red button */
a.button-like-red:link,
a.button-like-red:visited,
a.button-like-red:hover,
a.button-like-red:active {
border-left: #F1726C 2px solid;
border-right: #B42025 2px solid;
border-top: #F1726C 2px solid;
border-bottom: #B42025 2px solid;
}
a.button-like-red:active {
border-color: #75736E #F2F0EE #F2F0EE #75736E ;
}
/*These are style definitions found in the UI but not defined in any file I
could locate. They're listed here for historical purposes, but have been
removed from the UI
pagedescription (used in the first paragraph of text on a page) [HTML.pm]
label (used in forms) [HTML.pm]
field (used in forms) [HTML.pm]
fielddescription (used ???)[HTML.pm]
buttons (used in forms) [HTML.pm]
*/
/*td.sme-submitbutton {
text-align: right;
}
*/
/*These style definitions were found int he old css file (manager.css)
but don't seem to ever be referenced in the code. They're here
for reference.
.banner {
background: #000000;
color: #ffffff;
}
.banner-right {
font-family: Verdana, Arial, Helvetica, sans-serif;
background: #e17200;
color: #ffffff;
}
.border {
background: #000000;
color: #000000;
border-color: #000000;
}
.sidebar {
width: 200px;
background: #ffffff;
font-size: smaller;
font-family: Verdana, Arial, Helvetica, sans-serif;
font-weight: normal;
}
.sidebar-title {
background: #1e385b;
color: #ffffff;
font-family: Verdana, Arial, Helvetica, sans-serif;
font-weight: bold;
}
.newsitem {
background: #ffffff;
color: #000000;
font-family: Verdana, Arial, Helvetica, sans-serif;
margin-left: 5px;
margin-right: 5px;
margin-top: 5px;
margin-bottom: 5px;
}
.newsitem-title {
background: #cccccc;
color: #ffffff;
font-family: Verdana, Arial, Helvetica, sans-serif;
font-weight: bold;
}
.newsitem-footer {
background: #cccccc;
color: #000000;
font-family: Verdana, Arial, Helvetica, sans-serif;
font-size: smaller;
text-align: right;
}
.newsitem-detail {
font-size: smaller;
font-weight: normal;
}
.formlabel {
background: #c0c0c0;
color: #000000;
font-family: Verdana, Arial, Helvetica, sans-serif;
font-size: small;
font-weight: bold;
text-align: right;
}
.welcome-link {
background: #ffffff;
color: #1e385b;
}
.littlelink {
font-family: Verdana, Arial, Helvetica, sans-serif;
}
#textlayer {
position: absolute;
visibility: inherit;
top: 160px;
left: 50px;
z-index: 2;
}
#para {
font-family: Verdana, Arial, Helvetica, sans-serif;
font-weight: bold;
color: #000000;
}
#title {
font-family: Verdana, Arial, Helvetica, sans-serif;
font-weight: bold;
padding: 7px 7px 7px 7px;
color: #ffffff;
}
*/
EOF
}

View File

@@ -1,50 +0,0 @@
{
$OUT =<<'HERE';
/* from e-smith-manager to smanager (smeserver_manager2) */
/*----------------------------------------------------------------------
* copyright (C) 1999-2003 Mitel Networks Corporation
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
* Technical support for this program is available from Mitel Networks
* Please visit our web site www.mitel.com for details.
*----------------------------------------------------------------------
*/
/*contribs.org styling */
/* This special style is actually used only for the button row along the bottom of each page */
th.sme-layout {
border: 1px solid #8ebe43;
background-color: #bee6a2;
}
table.sme-border {
border: 2px solid #dddddd;
}
td.sme-border-warning,
td.sme-border-right,
td.sme-border-center {
border: 1px solid #dddddd;
}
td.sme-border-right {text-align: right;}
td.sme-border-center {text-align: center;}
th.sme-border {
border: 1px solid #dddddd;
background-color: #e8f3e1;
}
HERE
}

View File

@@ -1 +0,0 @@
/* DO NOT MODIFY THIS FILE! It is updated automatically */

View File

@@ -1,229 +0,0 @@
{
$OUT = <<'EOF';
/* from e-smith-manager to smanager (smeserver_manager2) */
/*----------------------------------------------------------------------
* copyright (C) 1999-2003 Mitel Networks Corporation
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
* Technical support for this program is available from Mitel Networks
* Please visit our web site www.mitel.com for details.
*----------------------------------------------------------------------
*/
/* This is the stylesheet used in the navigation panel only
This file inherits the styles use in sme_core in the "navigation" section,
and as noted in the code below. Note that some of the styles here are empty.
This is because the style definition has moved safely to sme_core.css and
the placeholder is left here for reference or future use.
There are a lot of styles in here, so read carefully. Each one is
documented.
Styles that were in the old stylesheets, but are not used in the UI are at
the bottom, commented out. These can be removed at the end of the 6.0
cycle */
/* Sets the general page properties */
body, body.menu {
margin-top: 0px;
margin-right: 0px;
margin-bottom: 0px;
margin-left: 2px;
}
/* This is the section heading style */
.section {
}
td.menu-cell {
margin-top: 0px;
margin-right: 0px;
margin-bottom: 0px;
margin-left: 0px;
padding-left: 0px;
padding-right: 0px;
padding-top: 0px;
padding-bottom: 0px;
}
/*
All the a links use pseudoclasses to control the two visual link styles.
For example:
a.item:link the general link item
a.item-current:link: the active link item
The switch from item to item-current is done with a javascript script in the head of the
navigation page, using the onClick event.
We are making heavy use of the cascade with these.
*/
/* a:link controls the look of a link when the mouse is nowhere near it */
a.item:link, a.item-current:link,
a.warn:link, a.warn-current:link {
display: block;
font-family: Verdana, Arial, Helvetica, sans-serif;
font-size: 10px;
color: black;
background: #e8f3e1;
text-decoration: none;
text-align: left;
border-color: #e8f3e1;
margin-top: 0px;
margin-right: 0px;
margin-bottom: 0px;
margin-left: 0px;
border-style: solid;
border-top-width: 1px;
border-right-width: 1px;
border-bottom-width: 1px;
border-left-width: 1px;
padding-right: 10px;
padding-left: 10px;
padding-top: 0px;
padding-bottom: 2px;
}
/* a:visited controls the look of a visited link (one that has been clicked) */
a.item:visited, a.item-current:visited,
a.warn:visited, a.warn-current:visited {
display: block;
font-family: Verdana, Arial, Helvetica, sans-serif;
font-size: 10px;
color: black;
background: #e8f3e1;
text-decoration: none;
border-color: #e8f3e1;
margin-top: 0px;
margin-right: 0px;
margin-bottom: 0px;
margin-left: 0px;
border-style: solid;
border-top-width: 1px;
border-right-width: 1px;
border-bottom-width: 1px;
border-left-width: 1px;
padding-right: 10px;
padding-left: 10px;
padding-bottom: 2px;
text-align: left;
}
/* a:hover controls the look of a link under the curser*/
a.item:hover, a.item-current:hover,
a.warn:hover, a.warn-current:hover {
display: block;
font-family: Verdana, Arial, Helvetica, sans-serif;
font-size: 10px;
color: black;
text-decoration: none;
background: #cccccc;
border-color: #888888;
margin-top: 0px;
margin-right: 0px;
margin-bottom: 0px;
margin-left: 0px;
border-style: solid;
border-top-width: 1px;
border-right-width: 1px;
border-bottom-width: 1px;
border-left-width: 1px;
padding-right: 10px;
padding-left: 10px;
padding-bottom: 2px;
text-align: left;
}
/* a:active controls the look of a link as it is selected*/
a.item:active, a.item-current:active,
a.warn:active, a.warn-current:active {
display: block;
font-family: Verdana, Arial, Helvetica, sans-serif;
font-size: 10px;
color: white;
background: black;
text-decoration: none ;
border-color: #000000;
margin-top: 0px;
margin-right: 0px;
margin-bottom: 0px;
margin-left: 0px;
border-style: solid;
border-top-width: 1px;
border-right-width: 1px;
border-bottom-width: 1px;
border-left-width: 1px;
padding-right: 10px;
padding-left: 10px;
padding-bottom: 2px;
text-align: left;
}
/*
These styles are to ensure that a selected link appears selected, even if the link
opens in another frame. This uses a javascript chunk in the head of the navigation
frame to change the style using the onClick event.
*/
a.item-current:link, a.warn-current:link,
a.item-current:visited, a.warn-current:visited,
a.item-current:active, a.warn-current:active,
a.item-current:hover, a.warn-current:hover {
display: block;
font-family: Verdana, Arial, Helvetica, sans-serif;
font-size: 10px;
color: black;
text-decoration: none;
background: #ffffff;
border-color: #888888;
margin-top: 0px;
margin-right: 0px;
margin-bottom: 0px;
margin-left: 0px;
border-style: solid;
border-top-width: 1px;
border-right-width: 1px;
border-bottom-width: 1px;
border-left-width: 1px;
padding-right: 10px;
padding-left: 10px;
padding-bottom: 2px;
text-align: left;
}
/* these two add a border on the styles defined directly above when
the mouse is hovering over them */
a.item-current:hover, a.warn-current:hover {
border-color: #888888;
}
/* These redefine a few elements to make room for the icon to the left of the warn class*/
a.warn:link, a.warn-current:link,
a.warn:visited, a.warn-current:visited,
a.warn:active, a.warn-current:active,
a.warn:hover, a.warn-current:hover {
background-image: url(/server-common/warn.gif);
background-repeat: no-repeat;
background-position: 10px;
padding-left: 25px;
}
/*end*/
EOF
}

View File

@@ -1 +0,0 @@
/* DO NOT MODIFY THIS FILE! It is updated automatically */

View File

@@ -1,281 +0,0 @@
{
$OUT = <<'EOF';
/* smeserver_manager2 */
/*----------------------------------------------------------------------
* copyright (C) 1999-2003 Mitel Networks Corporation
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
* Technical support for this program is available from Mitel Networks
* Please visit our web site www.mitel.com for details.
*----------------------------------------------------------------------
*/
/* This is the basic stylesheet originally used in the mojo version.
*/
body{
background-color: #FFF;
}
#container{
max-width: 100%;
position: relative;
margin: auto;
}
#navigation{
width: 190px;
position: absolute;
margin-left: 0px;
padding: 5px;
background-color: #E8F3E1;
/* height: 600px; */
overflow: auto;
}
#main{
margin-left: 195px;
padding: 10px;
}
#central{
margin-left: 0px;
padding: 5px;
}
#footer{
margin-left: 0px;
padding: 5px;
}
#header {
background: #bee6a2;
}
#header h1, a:link, a:visited {
color: black;
text-decoration: none;
/* contribs.org styling */
}
a:link { color: #006921; text-decoration: none; }
a:visited { color: #063; text-decoration: none; }
a:hover { color: #F00; text-decoration: none; }
a:active { color: #606060; text-decoration: none; }
.sme-error {
color: red;
display:block;
background-color: #ffffff;
border-width: 1px;
border-style: solid;
border-color: red ;
padding: 2px;
margin-left: 10px;
margin-right: 10px;
margin-top:0px;
margin-bottom:0px;
}
.sme-warning {
color: orange;
display:block;
background-color: #ffffff;
border-width: 1px;
border-style: solid;
border-color: orange ;
padding: 4px;
margin-left: 20px;
margin-right: 20px;
margin-top:2px;
margin-bottom:2px;
}
#footer img {
float: right;
position: fixed;
margin-left: 40%;
}
label.field-with-error {
color: #dd7e5e
}
input.field-with-error {
background-color: #fd9e7e
}
span.label {
display: inline-block;
font-weight: bold;
background-color: #e8f3e1; /*lightgreen;*/
width: 30%;
text-align: right;
}
td.label {
font-weight: bold;
background-color: #e8f3e1; /*lightgreen;*/
width: 30%;
text-align: right;
}
span.label2 {
display: inline-block;
font-weight: bold;
background-color: #e8f3e1; /*lightgreen;*/
text-align: right;
}
span.data {
padding: 2px;
font-weight: bold;
margin-left: 0%;
/* background-color: lightblue;*/
}
span.data2 {
padding: 2px;
/* background-color: lightblue; */
}
input.action {
margin-left: 0px;
background-color: #bee6a2; /*lightgreen;*/
color: darkgreen;
border-radius: 8px;
border: 2px solid #4CAF50; /* Green */
display: flex;
justify-content: center;
align-items: center;
}
input.action:hover {background-color: #3e8e41; color:white;}
input.action:active {
background-color: #3e8e41;
transform: translate(-2px,2px);
}
.center {
display: flex;
justify-content: center;
}
input.action2 {
margin-left: 0px;
color: black;
background-color: #d4d0c8;
display: flex;
justify-content: center;
}
#modul.desc {
padding: 3px;
background-color: grey;
}
[type = 'text'] {
margin-left: 0px;
/*background-color: lightblue;*/
}
.a, .return {
color: #661866;
font-weight: bold;
}
a.section {
}
.a, .item {
line-height: 12px;
}
a.section-title {
display: inline-block;
color: #6CA345; /*#888;*/
padding-left: 5px;
padding-right: 5px;
line-height: 18px;
font-weight: bold;
}
a.menu-title {
display: inline-block;
color: #1A6D1A; /*#666;*/
padding-left: 1px;
padding-right: 1px;
font-weight: bold;
}
#module {
/* height: 600px; */
overflow: auto;
}
#h2l1 {
height: 40px;
width: 100%;
}
#h2e11 {
width: 50%;
float: left;
}
#h2e12 {
background-color: #C0E7A6;
float: left;
text-align: right;
}
#h2l2 {
/* background-color: #A8F9E7;*/
border-top: solid white 3px;
border-bottom: solid white 2px;
height: 14px;
width: 100%;
padding: 1px;
}
#h2e21 {
float: left;
width: 70%;
}
#h2e22,#h2e23,#h2e12 {
float: left;
width: 14em;
text-align: center;
}
.toggle-password {
margin-left: -30px;
}
.tg-icon {
position: relative;
top: 5px;
left: 2px;
}
/*end*/
EOF
}

View File

@@ -1 +0,0 @@
/* DO NOT MODIFY THIS FILE! It is updated automatically */

View File

@@ -0,0 +1,9 @@
[Unit]
Description=Koozali SME Server boot diagnostic tool
After=sme-server.target
PartOf=sme-server.target
[Service]
Type=oneshot
ExecStart=/bin/sh -c "/usr/bin/systemd-analyze plot > /usr/share/smanager/themes/default/public/images/boot.svg"
RemainAfterExit=yes

View File

@@ -31,7 +31,7 @@ use SrvMngr::Plugin::WithoutCache;
use esmith::I18N;
#this is overwrittrn with the "release" by the spec file - release can be "99.el8.sme"
our $VERSION = '50.el8.sme';
our $VERSION = '70.el8.sme';
#Extract the release value
if ($VERSION =~ /^(\d+)/) {
$VERSION = $1; # $1 contains the matched numeric digits
@@ -43,7 +43,7 @@ $VERSION = eval $VERSION;
use Exporter 'import';
our @EXPORT_OK = qw(
init_session get_mod_url theme_list
getNavigation ip_number is_normal_password email_simple
getNavigation ip_number validate_password is_normal_password email_simple
mac_address_or_blank mac_address ip_number_or_blank
lang_space get_routes_list subnet_mask get_reg_mask
gen_locale_date_string get_public_ip_address
@@ -212,6 +212,22 @@ sub setup_helpers {
Mojo::JWT->new(secret => shift->app->secrets->[0] || die)
});
$self->helper( selected_field => sub {
my $self = shift;
my @options = shift;
my $selected = shift;
my $count = 0;
# search for occurence of value $selected in arrays; if found add selected => 'selected'
for (my $i = 0; $i <= $#{$options[0]} ; $i++){
if (grep /^$selected$/, @{$options[0][$i]}) {
push( @{$options[0][$i]} ,'selected', 'selected' );
$count++;last;
}
}
push ( @{$options[0]} ,[ ucfirst( $selected), $selected, 'selected', 'selected'] ) if ($count <1);
return @options;
});
}
@@ -549,8 +565,8 @@ sub getNavigation {
# Determine the directory where the functions are kept
#-----------------------------------------------------
my $navigation_ctlr_ignore =
"(\.\.?|Swttheme\.pm|Login\.pm|Request\.pm|Modules\.pm|Legacypanel\.pm(-.*)?)";
# "(\.\.?|Initial\.pm|Manual\.pm|Swttheme\.pm|Request\.pm|Modules\.pm(-.*)?)";
"(\.\.?|.*\-Custom\.pm|Swttheme\.pm|Login\.pm|Request\.pm|Modules\.pm|Legacypanel\.pm(-.*)?)";
# "(\.\.?|Initial\.pm|.*Manual\.pm|Swttheme\.pm|Request\.pm|Modules\.pm(-.*)?)";
my $navigation_cgi_ignore =
"(\.\.?|navigation|noframes|online-manual|(internal|pleasewait)(-.*)?)";
@@ -772,7 +788,23 @@ sub ip_number {
return 'OK';
}
sub validate_password {
my ($c, $strength, $pass) = @_;
use esmith::util;
use POSIX qw(locale_h);
use locale;
my $old_locale = setlocale(LC_ALL);
setlocale(LC_ALL, "en_US");
my $reason = esmith::util::validatePassword($pass,$strength);
return "OK" if ($reason eq "ok");
setlocale(LC_ALL, $old_locale);
return
$c->l("Bad Password Choice") . ": "
. $c->l("The password you have chosen is not a good choice, because") . " "
. $c->l($reason). ".";
} ## end sub validate_password
# to deprecate : this is not anymore a way to validate our passwords
sub is_normal_password {
# from CGI::FormMagick::Validator qw( password );
@@ -812,7 +844,6 @@ sub get_public_ip_address
return undef;
}
sub email_simple {
my ($c, $data) = @_;
@@ -894,4 +925,4 @@ sub get_reg_mask {
}
1;
1;

View File

@@ -32,10 +32,14 @@ use esmith::util;
use esmith::lockfile;
use esmith::BlockDevices;
use constant DEBUG => $ENV{MOJO_SMANAGER_DEBUG} || 0;
our $cdb = esmith::ConfigDB->open || die "Couldn't open config db";
our $adb = esmith::AccountsDB->open || die "Couldn't open accounts db";
our $rdb = esmith::ConfigDB->open('/etc/e-smith/restore')
|| die "Couldn't open restore db";
use constant FALSE => 0;
use constant TRUE => 1;
#our $cdb = esmith::ConfigDB->open || die "Couldn't open config db"; #remove as cached gives problems
#our $adb = esmith::AccountsDB->open || die "Couldn't open accounts db";
#our $rdb = esmith::ConfigDB->open('/etc/e-smith/restore') || die "Couldn't open restore db";
my ($cdb,$adb,$rdb);
my $es_backup = new esmith::Backup or die "Couldn't create Backup object\n";
my @directories = $es_backup->restore_list;
@directories = grep { -e "/$_" } @directories;
@@ -52,6 +56,9 @@ sub main {
my $c = shift;
$c->app->log->info($c->log_req);
my %bac_datas = ();
$cdb = esmith::ConfigDB->open || die "Couldn't open config db";
$adb = esmith::AccountsDB->open || die "Couldn't open accounts db";
$rdb = esmith::ConfigDB->open('/etc/e-smith/restore');
my $title = $c->l('bac_BACKUP_TITLE');
my $notif;
$bac_datas{'function'} = 'desktop_backup';
@@ -108,6 +115,9 @@ sub do_display {
my $rt = $c->current_route;
my ($res, $result) = '';
my $function = $c->param('Function');
$cdb = esmith::ConfigDB->open || die "Couldn't open config db";
$adb = esmith::AccountsDB->open || die "Couldn't open accounts db";
$rdb = esmith::ConfigDB->open('/etc/e-smith/restore');
if ($function =~ /^(\S+)$/) {
$function = $1;
@@ -129,7 +139,11 @@ sub do_display {
$c->stash(compressionlevel => $CompressionLevel, exclude => \@exclude, directories => \@directories);
# streaming download in template
return $c->render("/backdown");
$c->render(template=>"backdown");
#sleep(30);
# Redirect to the front page
#$c->redirect_to('/backup');
return ""
} ## end if ($function eq 'desktop_backup')
if ($function eq 'tape_configure') {
@@ -265,6 +279,9 @@ sub do_update {
my $c = shift;
$c->app->log->info($c->log_req);
my $rt = $c->current_route;
$cdb = esmith::ConfigDB->open || die "Couldn't open config db";
$adb = esmith::AccountsDB->open || die "Couldn't open accounts db";
$rdb = esmith::ConfigDB->open('/etc/e-smith/restore');
my $function = $c->param('Function');
DEBUG && warn("do_update $function");
my %bac_datas = ();
@@ -513,13 +530,13 @@ sub do_update {
# common part for all functions
if ($res ne 'OK') {
if ($res eq 'NEXT') {
$dest = 'back_' . $bac_datas{"function"};
} else {
$c->stash(error => $result);
$dest = "back_$function";
}
$bac_datas{vfstype} = $c->param('VFSType');
$c->stash(title => $title, bac_datas => \%bac_datas);
return $c->render($dest);
} ## end if ($res ne 'OK')
@@ -919,7 +936,7 @@ sub workstnVerify {
sub workstnRestore {
my ($c) = @_;
my $out;
my $out = '';
my $restoreref = $c->param('Backupset');
my $set = $restoreref;
$set =~ s/\/[^\/]*$//;
@@ -1002,6 +1019,7 @@ sub workstnRestore {
return "$c->l('bac_OPERATION_STATUS_REPORT') $c->l('bac_ERR_PRE_RESTORE')";
}
$| = 1;
my $RD;
if (open(RD, "-|")) {
@@ -1034,8 +1052,8 @@ sub workstnRestore {
or warn($c->l('bac_ERR_RESTORING_INITIAL_GRP') . "\n");
esmith::util::backgroundCommand(0, "/sbin/e-smith/signal-event", "post-upgrade");
# system("/sbin/e-smith/signal-event", "post-upgrade") == 0
# or die ($c->l('bac_ERROR_UPDATING_CONFIGURATION')."\n");
#system("/sbin/e-smith/signal-event", "post-upgrade") == 0
# or die ($c->l('bac_ERROR_UPDATING_CONFIGURATION')."\n");
} else {
$message = $c->l('bac_RESTORE_FAILED');
}
@@ -1063,9 +1081,111 @@ sub workstnRestore {
die($error_message) if $error_message;
exit(0);
} ## end else [ if (open(RD, "-|")) ]
$rdb->reload;
$error_message .= $c->bunmount($mntdir, $VFSType);
return '#OK#' . $out;
#my $RD;
## Fork-safe open with explicit error handling
#unless (open($RD, "-|")) {
## Child process
#local $SIG{__DIE__} = sub { exit 255 };
#$| = 1; # Autoflush
#eval {
#foreach my $file (@restorefiles) {
## Security: strict filename validation
#unless ($file =~ m{^[\w\/.-]+$}) {
#die "Invalid filename: $file";
#}
## Check file existence
#unless (-e $file) {
#die "Backup file $file does not exist";
#}
## Execute dar with error checking
#system("/usr/bin/dar", "-Q", "-x", $file, "-v", "-N", "-R", "/", "-wa");
#if ($? == -1) {
#die "Failed to execute dar: $!";
#} elsif ($? & 127) {
#die sprintf("dar died with signal %d, %s coredump",
#($? & 127), ($? & 128) ? 'with' : 'without');
#} elsif ($? >> 8 != 0) {
#die "dar exited with error code " . ($? >> 8);
#}
#}
## Unmount with error checking
#if (my $unmount_err = $c->bunmount($mntdir, $VFSType)) {
#die "Unmount failed: $unmount_err";
#}
#};
#if (my $child_err = $@) {
#print STDERR "CHILD ERROR: $child_err";
#exit 254;
#}
#exit 0;
#}
#else {
## Parent process
#eval {
## Verify fork succeeded
#unless (defined $RD) {
#die "Fork failed: $!";
#}
#$out .= $c->l('bac_FILES_HAVE_BEEN_RESTORED') . "\n<UL>";
#my $complete = 0;
## Read from child process
#while (<$RD>) {
#$complete++ if /etc\/samba\/smbpasswd$/;
#$out .= "<li>$_</li>\n";
#}
#$out .= "</UL>";
## Close pipe and check status
#unless (close $RD) {
#die "Pipe close failed: $!";
#}
#my $child_status = $?;
#if ($child_status != 0) {
#die "Child process failed with status " . ($child_status >> 8);
#}
## Post-restore actions
#if ($complete) {
#system("/usr/sbin/groupmod", "-g", $www_gid, "www");
#if ($? != 0) {
#die $c->l('bac_ERR_RESTORING_GID') . ": $! (status $?)";
#}
#system("/usr/sbin/usermod", "-g", $www_gid, "www");
#if ($? != 0) {
#die $c->l('bac_ERR_RESTORING_INITIAL_GRP') . ": $! (status $?)";
#}
#my $bg_result = esmith::util::backgroundCommand(0, "/sbin/e-smith/signal-event", "post-upgrade");
#unless ($bg_result) {
#die "Failed to schedule post-upgrade event";
#}
#} else {
#die $c->l('bac_RESTORE_FAILED');
#}
#};
## Error handling
#if (my $err = $@) {
#$rec->set_prop('state', 'failed');
#$rec->set_prop('error', "$err");
#esmith::lockfile::UnlockFile($file_handle);
#return $c->l('bac_RESTORE_FAILED_MSG') . ": $err";
#}
#}
$rdb->reload;
$error_message .= $c->bunmount($mntdir, $VFSType);
return '#OK#' . $out;
} ## end sub workstnRestore
sub workstnSelRestore() {
@@ -1442,6 +1562,7 @@ sub performReboot {
#print "$c->l('bac_SERVER_REBOOT')";
#print "$c->l('bac_SERVER_WILL_REBOOT')";
warn "reboot coming";
esmith::util::backgroundCommand(2, "/sbin/e-smith/signal-event", "reboot");
return "#OK#" . $c->l('bac_SERVER_WILL_REBOOT');
} ## end sub performReboot
@@ -1847,7 +1968,7 @@ sub showSize {
} ## end sub showSize
sub desktopBackupRecordStatus {
my ($backup, $phase, $status) = @_;
my ($c,$backup, $phase, $status) = @_;
my $now = time();
warn("Backup terminated: $phase failed - status: $status\n");
$backup->set_prop('EndEpochTime', "$now");
@@ -1972,7 +2093,7 @@ sub bunmount {
system('/bin/umount', '-f', $mount) == 0
or return ($c->l('bac_ERR_WHILE_UNMOUNTING'));
}
return;
return "";
} ## end sub bunmount
sub findmnt {
@@ -2011,4 +2132,4 @@ sub vmount {
return (qx(/bin/mount -t nfs -o nolock,timeo=30,retrans=1,retry=0 "$host:/$share" $mountdir 2>&1));
}
} ## end sub vmount
1;
1;

View File

@@ -17,6 +17,9 @@ use File::Basename;
use SrvMngr qw( gen_locale_date_string );
our $cdb = esmith::ConfigDB->open or die "Couldn't open ConfigDB\n";
use constant FALSE => 0;
use constant TRUE => 1;
# Get some basic info on the current SME install
our $sysconfig = $cdb->get('sysconfig');
our $systemmode = $cdb->get('SystemMode')->value;
@@ -78,7 +81,7 @@ sub create_configuration_report {
# create the reporting template
my $configreport_template = Text::Template->new(
TYPE => 'FILE',
SOURCE => '/etc/e-smith/web/common/configuration_report.tmpl',
SOURCE => '/usr/share/smanager/themes/default/public/configuration_report.tmpl',
UNTAINT => 1
);
my $report_creation_time = gen_locale_date_string;
@@ -114,13 +117,40 @@ sub create_configuration_report {
# prcess template
my $result = $configreport_template->fill_in(HASH => \%vars);
#take out any multiple blank lines
#$result =~ s/\n{3,}/\n/g;
# write processed template to file
open(my $cfgrep, '>', $configreportfile) or die "Could not create temporary file for config report!";
print $cfgrep $result;
close $cfgrep;
#check if boot phase has completed.
if (wait_for_boot_completion()) {
#And create boot analysis image - now run externally following boot.
$result = `/usr/bin/systemctl start bootsequence.service`;
if (!$? == 0) {
warn "/usr/bin/systemd-analyze plot Command failed \n";
}
}
} ## end sub create_configuration_report
sub wait_for_boot_completion {
my $timeout = 60; # 1-minute timeout
my $end_time = time() + $timeout;
while (time() < $end_time) {
if (`systemctl list-jobs 2>&1` =~ /No jobs running/) {
return TRUE; # Success
}
sleep 5;
}
warn "Boot did not complete within $timeout seconds.\n";
return FALSE; # Failure
} ## end wait_for_boot_completion
sub show_config_report {
my $c = shift;
my $out = '';
@@ -143,4 +173,4 @@ sub download_config_report {
'cleanup' => 1,
);
} ## end sub download_config_report
1;
1;

View File

@@ -2,7 +2,7 @@ package SrvMngr::Controller::Ibays;
#----------------------------------------------------------------------
# heading : Network
# description : Shared areas (was ibays)
# description : Ibays
# navigation : 6000 100
#
#
@@ -13,7 +13,7 @@ use warnings;
use Mojo::Base 'Mojolicious::Controller';
use Locale::gettext;
use SrvMngr::I18N;
use SrvMngr qw( theme_list init_session is_normal_password );
use SrvMngr qw( theme_list init_session validate_password );
use esmith::AccountsDB;
use esmith::ConfigDB;
use esmith::DomainsDB;
@@ -385,31 +385,6 @@ sub check_password {
return validate_password($c, $strength, $password);
} ## end sub check_password
sub validate_password {
my ($c, $strength, $pass) = @_;
use Crypt::Cracklib;
my $reason;
if ($strength eq "none") {
return $c->l("Passwords must be at least 7 characters long") unless (length($pass) > 6);
return "OK";
}
$reason = is_normal_password($c, $pass, undef);
return $reason unless ($reason eq "OK");
return "OK" unless ($strength eq "strong");
if (-f '/usr/lib64/cracklib_dict.pwd') {
$reason = fascist_check($pass, '/usr/lib64/cracklib_dict');
} else {
$reason = fascist_check($pass, '/usr/lib/cracklib_dict');
}
$reason ||= "Software error: password check failed";
return "OK" if ($reason eq "ok");
return
$c->l("Bad Password Choice") . ": "
. $c->l("The password you have chosen is not a good choice, because") . " "
. $c->($reason) . ".";
} ## end sub validate_password
=head2 group_list()

View File

@@ -1,566 +0,0 @@
#
# Generated by SM2Gen version:0.8 Chameleon version:4.5.4 On Python:3.12.3 at 2024-11-16 10:30:16
#
#
# Routines to be edited by the developer to provide content and validation for parameters
# and provison of the control data for table(s)
#
use esmith::util;
use esmith::util::network;
use esmith::ConfigDB;
use esmith::HostsDB;
use esmith::AccountsDB;
use esmith::NetworksDB;
use esmith::DomainsDB;
use constant FALSE => 0;
use constant TRUE => 1;
#The most common ones
our $cdb = esmith::ConfigDB->open() || die("Couldn't open config db");
our $adb = esmith::AccountsDB->open() || die("Couldn't open Accounts db");
our $ndb = esmith::NetworksDB->open() || die("Couldn't open Network db");
our $hdb = esmith::HostsDB->open() || die("Couldn't open Hosts db");
our $ddb = esmith::DomainsDB->open() || die("Couldn't open Domains db");
# Validation routines - parameters for each panel
sub validate_LIST {
my $c = shift;
my $prefix_data = shift; #Data hash as parameter
# Validation for each field
my $ret = "";
if (!TRUE) #validate $c->param('InternalIP')
{
$ret .= 'Validation for InternalIP failed';
}
if (!TRUE) #validate $c->param('ExternalIP')
{
$ret .= 'Validation for ExternalIP failed';
}
if (!TRUE) #validate $c->param('InternetIP')
{
$ret .= 'Validation for InternetIP failed';
}
if (!TRUE) #validate $c->param('Issuer')
{
$ret .= 'Validation for Issuer failed';
}
if (!TRUE) #validate $c->param('Expiry')
{
$ret .= 'Validation for Expiry failed';
}
if (!TRUE) #validate $c->param('NotBefore')
{
$ret .= 'Validation for NotBefore failed';
}
if ($ret eq "") { $ret = 'ok'; }
return $ret;
} ## end sub validate_LIST
sub validate_PARAMS {
my $c = shift;
my $prefix_data = shift; #Data hash as parameter
# Validation for each field
my $ret = "";
if (!TRUE) #validate $c->param('status')
{
$ret .= 'Validation for status failed';
}
if (!TRUE) #validate $c->param('hookScript')
{
$ret .= 'Validation for hookScript failed';
}
if (!TRUE) #validate $c->param('hostOverride')
{
$ret .= 'Validation for hostOverride failed';
}
if (!TRUE) #validate $c->param('ACCEPT_TERMS')
{
$ret .= 'Validation for ACCEPT_TERMS failed';
}
if (!TRUE) #validate $c->param('API')
{
$ret .= 'Validation for API failed';
}
if (!TRUE) #validate $c->param('keysize')
{
$ret .= 'Validation for keysize failed';
}
if (!TRUE) #validate $c->param('configure')
{
$ret .= 'Validation for configure failed';
}
if (!TRUE) #validate $c->param('Email')
{
$ret .= 'Validation for Email failed';
}
if ($ret eq "") { $ret = 'ok'; }
return $ret;
} ## end sub validate_PARAMS
sub validate_CHECKALLDOMAINS {
my $c = shift;
my $prefix_data = shift; #Data hash as parameter
# Validation for each field
my $ret = "";
if (!TRUE) #validate $c->param('AllDomainsCheck')
{
$ret .= 'Validation for AllDomainsCheck failed';
}
if ($ret eq "") { $ret = 'ok'; }
return $ret;
} ## end sub validate_CHECKALLDOMAINS
sub validate_CHECKALLENABLEDDOMAINS {
my $c = shift;
my $prefix_data = shift; #Data hash as parameter
# Validation for each field
my $ret = "";
if (!TRUE) #validate $c->param('EnabledDomainsCheck')
{
$ret .= 'Validation for EnabledDomainsCheck failed';
}
if ($ret eq "") { $ret = 'ok'; }
return $ret;
} ## end sub validate_CHECKALLENABLEDDOMAINS
sub validate_CHECKONEDOMAIN {
my $c = shift;
my $prefix_data = shift; #Data hash as parameter
# Validation for each field
my $ret = "";
if (!TRUE) #validate $c->param('OneDomainToCheck')
{
$ret .= 'Validation for OneDomainToCheck failed';
}
if (!TRUE) #validate $c->param('OneDomainsCheck')
{
$ret .= 'Validation for OneDomainsCheck failed';
}
if ($ret eq "") { $ret = 'ok'; }
return $ret;
} ## end sub validate_CHECKONEDOMAIN
# Get singleton data for each panel
sub get_data_for_panel_LIST {
# Return a hash with the fields required which will be loaded into the shared data
my $c = shift;
# my ($reply, $err, $server_cert) = Net::SSLeay::sslcat('localhost', 443, '/');
# my $issuer = Net::SSLeay::X509_NAME_oneline(Net::SSLeay::X509_get_issuer_name($server_cert));
# my $before = Net::SSLeay::P_ASN1_TIME_get_isotime(Net::SSLeay::X509_get_notBefore($server_cert));
# my $expiry = Net::SSLeay::P_ASN1_TIME_get_isotime(Net::SSLeay::X509_get_notAfter($server_cert));
my %ret = (
'Data1' => 'Data for LIST', #Example
# fields from Inputs in LIST $fields['LIST']
'InternalIP' => $cdb->get_prop('InternalInterface', 'IPAddress'),
'ExternalIP' => $cdb->get_prop('ExternalInterface', 'IPAddress'),
'InternetIP' => $c->get_my_ip(),
'Issuer' => '$issuer',
'Expiry' => '$expiry',
'NotBefore' => '$before',
);
return %ret;
} ## end sub get_data_for_panel_LIST
sub get_data_for_panel_PARAMS {
# Return a hash with the fields required which will be loaded into the shared data
my $c = shift;
my %ret = (
'Data1' => 'Data for PARAMS', #Example
# fields from Inputs in PARAMS $fields['PARAMS']
'status' => $cdb->get_prop('letsencrypt', 'status', 'disabled'),
'hookScript' => $cdb->get_prop('letsencrypt', 'hookScript', 'disabled'),
'hostOverride' => $cdb->get_prop('letsencrypt', 'hostOverride', 'disabled'),
'ACCEPT_TERMS' => $cdb->get_prop('letsencrypt', 'ACCEPT_TERMS', ''),
'API' => $cdb->get_prop('letsencrypt', 'API', '2'),
'keysize' => $cdb->get_prop('letsencrypt', 'keysize', '4096'),
'configure' => $cdb->get_prop('letsencrypt', 'configure', 'none'),
'email' => $cdb->get_prop('letsencrypt', 'email')
);
return %ret;
} ## end sub get_data_for_panel_PARAMS
sub get_data_for_panel_CHECKALLDOMAINS {
# Return a hash with the fields required which will be loaded into the shared data
my $c = shift;
my %ret = (
'Data1' => 'Data for CHECKALLDOMAINS', #Example
# fields from Inputs in CHECKALLDOMAINS $fields['CHECKALLDOMAINS']
'AllDomainsCheck' => $c->update_all_domains(),
);
return %ret;
} ## end sub get_data_for_panel_CHECKALLDOMAINS
sub get_data_for_panel_CHECKALLENABLEDDOMAINS {
# Return a hash with the fields required which will be loaded into the shared data
my $c = shift;
my %ret = (
'Data1' => 'Data for CHECKALLENABLEDDOMAINS', #Example
# fields from Inputs in CHECKALLENABLEDDOMAINS $fields['CHECKALLENABLEDDOMAINS']
'EnabledDomainsCheck' => $c->update_enabled_domains(),
);
return %ret;
} ## end sub get_data_for_panel_CHECKALLENABLEDDOMAINS
sub get_data_for_panel_CHECKONEDOMAIN {
# Return a hash with the fields required which will be loaded into the shared data
my $c = shift;
my %ret = (
'Data1' => 'Data for CHECKONEDOMAIN', #Example
# fields from Inputs in CHECKONEDOMAIN $fields['CHECKONEDOMAIN']
'OneDomainToCheck' => $c->param("CHECKONEDOMAIN"),
'OneDomainsCheck' => $c->update_one_domain($c->param("CHECKONEDOMAIN"))
);
return %ret;
} ## end sub get_data_for_panel_CHECKONEDOMAIN
# Get control data for table(s)
# Define a constant hash for field name mapping
use constant DomainList_FIELD_MAPPING => (
'Table1-Domain name / HOSTNAME' => 'Domain',
'Table1-Brief description' => 'Description',
'Table1-Content' => 'Content',
'Table1-LABEL_NAMESERVERS' => 'Nameservers',
'Table1-LABEL_POINT' => 'Source-for-Table1-LABEL_POINT',
'Table1-LABEL_LECERT' => 'letsencryptSSLcert',
'Table1-IS_IN_CERT' => 'isincert',
'Table1-CHECK' => 'Check'
#'target_field2' => 'source_field2',
# Add more mappings as needed
);
use constant TEST_DOMAIN_LIST => (
{ "domain" => "Domain1", "fred" => "fred1", "description" => "Description1" },
{ "domain" => "Domain2", "fred" => "fred2", "description" => "Description2" },
{ "domain" => "Domain3", "fred" => "fred3", "description" => "Description3" },
# Add more test entries as needed
);
sub actual_DomainList {
my $c = shift;
# Actual code for extracting DomainList
my @list = ();
# my @rv = Net::SSLeay::X509_get_subjectAltNames($server_cert);
# foreach my $element (@rv) {
# next if $element =~ /^\d+$/; ;
# #print $element . "\n";
# push @list, $element;
# }
my @data = ();
my $check = $c->l('Check Domain');
for ($ddb->domains) {
my $ns = $_->prop('Nameservers') || 'internet';
my $le = $_->prop('letsencryptSSLcert') || 'disabled'; #letsencrypt configure all
my $dname = $_->key;
my $isincert = "N";
my $link = $c->create_link("letsencryptd", "CHECKONEDOMAIN", "");
my $checklink = "<a href='" . $link . "&CHECKONEDOMAIN=" . $_->key . "'>" . $check . "</a>";
#my $checklink = "<a href=''>check</a>";
$isincert = "Y" if ($dname ~~ @list);
# domain
push @data,
{
Domain => $_->key,
$_->props,
letsencryptSSLcert => $le,
isincert => $isincert,
Check => $checklink,
Nameservers => $ns,
};
#and hosts
for my $h ($hdb->get_hosts_by_domain($dname)) {
next if $ddb->get($h->key);
next unless ($h->prop('HostType') eq "Self" || $h->prop('HostType') eq "Local");
$le = $h->prop('letsencryptSSLcert') || 'disabled'; #letsencrypt configure all
$isincert = "N";
$isincert = "Y" if ($h->key ~~ @list);
push @data, {
Domain => "--> " . $h->key,
$h->props,
Description => $h->prop('ExternalIP') || $h->prop('InternalIP') || "",
Content => $h->prop('HostType'),
isincert => $isincert,
Check => "", #$checklink
Nameservers => $c->l($ns),
};
} ## end for my $h ($hdb->get_hosts_by_domain...)
} ## end for ($ddb->domains)
return @data;
} ## end sub actual_DomainList
sub get_DomainList {
# Return an array of hashes of the contents for each row and column for DomainList
my $c = shift;
my @source_records
= $c->actual_DomainList(); #TEST_DOMAIN_LIST #Replace by code or call to produce contents of table;
my @transformed_records;
my %Field_Mapping = DomainList_FIELD_MAPPING;
# Iterate over each record in the source array
for my $source_record (@source_records) {
my %transformed_record;
# Iterate over each key-value pair in the $Field_Mapping constant
while (my ($target, $source) = each %Field_Mapping) {
# Check if the source field exists in the source record
if (exists $source_record->{$source}) {
# Assign the source field value to the target field in the transformed record
$transformed_record{$target} = $source_record->{$source};
}
} ## end while (my ($target, $source...))
# Add transformed record to the array if it's not empty
push @transformed_records, \%transformed_record if %transformed_record;
} ## end for my $source_record (...)
return \@transformed_records;
} ## end sub get_DomainList
# Return hash with values from row in which link clicked on table
sub get_selected_LIST {
my $c = shift;
my $selected = shift; #Parameter is name of selected row.
my $is_new_record = shift; #Indicates new record required (defaults)
my %ret = {};
return %ret;
} ## end sub get_selected_LIST
sub get_selected_PARAMS {
my $c = shift;
my $selected = shift; #Parameter is name of selected row.
my $is_new_record = shift; #Indicates new record required (defaults)
my %ret = {};
return %ret;
} ## end sub get_selected_PARAMS
sub get_selected_CHECKALLDOMAINS {
my $c = shift;
my $selected = shift; #Parameter is name of selected row.
my $is_new_record = shift; #Indicates new record required (defaults)
my %ret = {};
return %ret;
} ## end sub get_selected_CHECKALLDOMAINS
sub get_selected_CHECKALLENABLEDDOMAINS {
my $c = shift;
my $selected = shift; #Parameter is name of selected row.
my $is_new_record = shift; #Indicates new record required (defaults)
my %ret = {};
return %ret;
} ## end sub get_selected_CHECKALLENABLEDDOMAINS
sub get_selected_CHECKONEDOMAIN {
my $c = shift;
my $selected = shift; #Parameter is name of selected row.
my $is_new_record = shift; #Indicates new record required (defaults)
my %ret = {};
return %ret;
} ## end sub get_selected_CHECKONEDOMAIN
#after sucessful modify or create or whatever and submit then perfom (if the params validate)
sub perform_LIST {
my $c = shift;
my $prefix_data = shift; #Data hash as parameter
my $ret = "";
my $db = $cdb; #maybe one of the others
my $dbkey = 'ChangeThis';
if (!TRUE
) #copy or perform with value: InternalIP e.g. $db->set_prop($dbkey,'InternalIP',$c->param('InternalIP'),type=>'service'))
{
$ret .= 'Perform/save failed for InternalIP';
} ## end if (!TRUE)
if (!TRUE
) #copy or perform with value: ExternalIP e.g. $db->set_prop($dbkey,'ExternalIP',$c->param('ExternalIP'),type=>'service'))
{
$ret .= 'Perform/save failed for ExternalIP';
} ## end if (!TRUE)
if (!TRUE
) #copy or perform with value: InternetIP e.g. $db->set_prop($dbkey,'InternetIP',$c->param('InternetIP'),type=>'service'))
{
$ret .= 'Perform/save failed for InternetIP';
} ## end if (!TRUE)
if (!TRUE
) #copy or perform with value: Issuer e.g. $db->set_prop($dbkey,'Issuer',$c->param('Issuer'),type=>'service'))
{
$ret .= 'Perform/save failed for Issuer';
} ## end if (!TRUE)
if (!TRUE
) #copy or perform with value: Expiry e.g. $db->set_prop($dbkey,'Expiry',$c->param('Expiry'),type=>'service'))
{
$ret .= 'Perform/save failed for Expiry';
} ## end if (!TRUE)
if (!TRUE
) #copy or perform with value: NotBefore e.g. $db->set_prop($dbkey,'NotBefore',$c->param('NotBefore'),type=>'service'))
{
$ret .= 'Perform/save failed for NotBefore';
} ## end if (!TRUE)
if ($ret eq "") { $ret = 'ok'; }
return $ret;
} ## end sub perform_LIST
sub perform_PARAMS {
my $c = shift;
my $prefix_data = shift; #Data hash as parameter
my $ret = "";
my $db = $cdb; #maybe one of the others
my $dbkey = 'letsencrypt';
# To make it write to DB as comment, delete this (regex) string in each if statement "TRUE\) \#copy or perform with value: .* e.g."
if (!$db->set_prop($dbkey, 'status', $c->param('status'), type => 'service')) {
$ret .= 'Perform/save failed for status';
}
if (!$db->set_prop($dbkey, 'hookScript', $c->param('hookScript'), type => 'service')) {
$ret .= 'Perform/save failed for hookScript';
}
if (!$db->set_prop($dbkey, 'hostOverride', $c->param('hostOverride'), type => 'service')) {
$ret .= 'Perform/save failed for hostOverride';
}
if (!$db->set_prop($dbkey, 'ACCEPT_TERMS', $c->param('ACCEPT_TERMS'), type => 'service')) {
$ret .= 'Perform/save failed for ACCEPT_TERMS';
}
if (!$db->set_prop($dbkey, 'API', $c->param('API'), type => 'service')) { $ret .= 'Perform/save failed for API'; }
if (!$db->set_prop($dbkey, 'keysize', $c->param('keysize'), type => 'service')) {
$ret .= 'Perform/save failed for keysize';
}
if (!$db->set_prop($dbkey, 'configure', $c->param('configure'), type => 'service')) {
$ret .= 'Perform/save failed for configure';
}
if (!$db->set_prop($dbkey, 'email', $c->param('email'), type => 'service')) {
$ret .= 'Perform/save failed for email';
}
if ($ret eq "") { $ret = 'ok'; }
return $ret;
} ## end sub perform_PARAMS
sub perform_CHECKALLDOMAINS {
my $c = shift;
my $prefix_data = shift; #Data hash as parameter
my $ret = "";
my $db = $cdb; #maybe one of the others
my $dbkey = 'ChangeThis';
if (!TRUE
) #copy or perform with value: AllDomainsCheck e.g. $db->set_prop($dbkey,'AllDomainsCheck',$c->param('AllDomainsCheck'),type=>'service'))
{
$ret .= 'Perform/save failed for AllDomainsCheck';
} ## end if (!TRUE)
if ($ret eq "") { $ret = 'ok'; }
return $ret;
} ## end sub perform_CHECKALLDOMAINS
sub perform_CHECKALLENABLEDDOMAINS {
my $c = shift;
my $prefix_data = shift; #Data hash as parameter
my $ret = "";
my $db = $cdb; #maybe one of the others
my $dbkey = 'ChangeThis';
if (!TRUE
) #copy or perform with value: EnabledDomainsCheck e.g. $db->set_prop($dbkey,'EnabledDomainsCheck',$c->param('EnabledDomainsCheck'),type=>'service'))
{
$ret .= 'Perform/save failed for EnabledDomainsCheck';
} ## end if (!TRUE)
if ($ret eq "") { $ret = 'ok'; }
return $ret;
} ## end sub perform_CHECKALLENABLEDDOMAINS
sub perform_CHECKONEDOMAIN {
my $c = shift;
my $prefix_data = shift; #Data hash as parameter
my $ret = "";
my $db = $cdb; #maybe one of the others
my $dbkey = 'ChangeThis';
if (!TRUE
) #copy or perform with value: OneDomainToCheck e.g. $db->set_prop($dbkey,'OneDomainToCheck',$c->param('OneDomainToCheck'),type=>'service'))
{
$ret .= 'Perform/save failed for OneDomainToCheck';
} ## end if (!TRUE)
if (!TRUE
) #copy or perform with value: OneDomainsCheck e.g. $db->set_prop($dbkey,'OneDomainsCheck',$c->param('OneDomainsCheck'),type=>'service'))
{
$ret .= 'Perform/save failed for OneDomainsCheck';
} ## end if (!TRUE)
if ($ret eq "") { $ret = 'ok'; }
return $ret;
} ## end sub perform_CHECKONEDOMAIN
sub create_link {
# WIP
my ($c, $route, $panel, $index) = @_;
my $link = "$route?trt=$panel&Selected=$index";
return $link;
} ## end sub create_link
sub get_my_ip {
my ($self, $item, $prop, $default) = @_;
my $output = `/usr/sbin/e-smith/getmyip`;
return $output || "IP";
} ## end sub get_my_ip
sub update_one_domain {
my ($self, $domain) = @_;
return "$domain not domain" unless ($ddb->get($domain) || $hdb->get($domain));
($domain) = ($domain =~ /([\w\p{L}.]+)/);
my $output = `/etc/e-smith/events/actions/letsencrypt-setdomains " " $domain `;
return $output || "-empty-";
} ## end sub update_one_domain
sub update_all_domains {
my $self = shift;
my $output = `/etc/e-smith/events/actions/letsencrypt-setdomains "" "" all `;
return $output || "-empty-";
} ## end sub update_all_domains
sub update_enabled_domains {
my $self = shift;
my $output = `/etc/e-smith/events/actions/letsencrypt-setdomains "" "" enabled `;
return $output || "-empty-";
} ## end sub update_enabled_domains
1;

View File

@@ -1,448 +0,0 @@
package SrvMngr::Controller::Letsencrypt;
#
# Generated by SM2Gen version:0.8 Chameleon version:4.5.4 On Python:3.12.3 at 2024-12-01 15:22:43
#
#----------------------------------------------------------------------
# heading : Network
# description : Letsencrypt certificate
# navigation : 6000 6600
#
# name : letsencrypt, method : get, url : /letsencrypt, ctlact : Letsencrypt#main
# name : letsencryptu, method : post, url : /letsencryptu, ctlact : Letsencrypt#do_update
# name : letsencryptd, method : get, url : /letsencryptd, ctlact : Letsencrypt#do_display
#
# routes : end
#
# Documentation: https://wiki.contribs.org/Letsencrypt
#----------------------------------------------------------------------
#
# Scheme of things:
#
# TBA!!
use strict;
use warnings;
use Mojo::Base 'Mojolicious::Controller';
use constant FALSE => 0;
use constant TRUE => 1;
use Locale::gettext;
use SrvMngr::I18N;
use SrvMngr qw(theme_list init_session);
use Data::Dumper;
use esmith::util;
use esmith::util::network;
use esmith::ConfigDB;
use esmith::AccountsDB;
use esmith::NetworksDB;
use esmith::HostsDB;
use esmith::DomainsDB;
require
'/usr/share/smanager/lib/SrvMngr/Controller/Letsencrypt-Custom.pm'; #The code that is to be added by the developer
sub main {
#
# Initial entry - route is "/<whatever>"
#
#set initial panel
#for initial panel:
#Specifiy panel to enter
#load up _data hash with DB fields
#load up stash with pointer(s) to control fields hash(= get-))
#and a pointer to the prefix_data hash
#render initial panel
my $c = shift;
$c->app->log->info($c->log_req);
#The most common ones
my $cdb = esmith::ConfigDB->open() || die("Couldn't open config db");
my $adb = esmith::AccountsDB->open() || die("Couldn't open Accounts db");
my $ndb = esmith::NetworksDB->open() || die("Couldn't open Network db");
my $hdb = esmith::HostsDB->open() || die("Couldn't open Hosts db");
my $ddb = esmith::DomainsDB->open() || die("Couldn't open Domains db");
my %lets_data = ();
my $title = $c->l('lets_Letsencrypt_certificate');
my $modul = '';
$lets_data{'trt'} = 'LIST';
#Load any DB entries into the <prefix>_data area so as they are preset in the form
# which DB - this only really works if the initial panel is a PARAMS type panel and not a TABLE
my $db = $cdb; #pickup local or global db or Default to config
$c->do_display($lets_data{'trt'});
} ## end sub main
# Post request with params - submit from the form
sub do_update {
#
# Return after submit pushed on panel (this is a post) - route is "/<whatever>u"
# parameters in the params hash.
#
#load up all params into prefix_data hash:
#By panel (series of if statements - only one executed):
#call validate-PANEL() - return ret = ok or error message
#if validation not ok:
#render back to current panel with error message in stash
#otherwise:
#By panel (series of if statements - only one executed):
#do whatever is required: call perform-PANEL() - return "ok" or Error Message
#call signal-event for any global actions specified (check it exists - error and continue?)
#if action smeserver-<whatever>-update exists
#signal_event smeserver-<whatever>-update
#call signal-event for any specific actions for thids panel (check it exists first - error and continue)
#set success in stash
#if no "nextpanel" entry:
#set firstpanel
#else
#set nextpanel
#call render
my $c = shift;
$c->app->log->info($c->log_req);
my $modul = '';
#The most common ones - you might want to comment out any not used.
my $cdb = esmith::ConfigDB->open() || die("Couldn't open config db");
my $adb = esmith::AccountsDB->open() || die("Couldn't open Accounts db");
my $ndb = esmith::NetworksDB->open() || die("Couldn't open Network db");
my $hdb = esmith::HostsDB->open() || die("Couldn't open Hosts db");
my $ddb = esmith::DomainsDB->open() || die("Couldn't open Domains db");
my %lets_data = ();
my $title = $c->l('lets_Letsencrypt_certificate');
# Accessing all POST parameters
my %params = $c->req->params->to_hash;
# Get number of POST parameters
my $num_params = keys %params;
#Params are available in the hash "params" - copy to the prefix_data hash
#while (my ($key, $value) = each %{$c->req->params->to_hash}) {
# $lets_data{$key} = $value;
#}
# the value of trt will tell you which panel has returned
my $trt = $c->param('trt') || 'LIST'; #hidden control on every form.
my $ret = 'ok';
#Validate the parameters in a custom sub one for each panel (although only one of these will be executed)
my $thispanel;
if ($trt eq 'LIST') {
#Validate form parameters for panel LIST
$ret = $c->validate_LIST(\%lets_data);
$thispanel = 'LIST';
} ## end if ($trt eq 'LIST')
if ($trt eq 'PARAMS') {
#Validate form parameters for panel PARAMS
$ret = $c->validate_PARAMS(\%lets_data);
$thispanel = 'PARAMS';
} ## end if ($trt eq 'PARAMS')
if ($trt eq 'CHECKALLDOMAINS') {
#Validate form parameters for panel CHECKALLDOMAINS
$ret = $c->validate_CHECKALLDOMAINS(\%lets_data);
$thispanel = 'CHECKALLDOMAINS';
} ## end if ($trt eq 'CHECKALLDOMAINS')
if ($trt eq 'CHECKALLENABLEDDOMAINS') {
#Validate form parameters for panel CHECKALLENABLEDDOMAINS
$ret = $c->validate_CHECKALLENABLEDDOMAINS(\%lets_data);
$thispanel = 'CHECKALLENABLEDDOMAINS';
} ## end if ($trt eq 'CHECKALLENABLEDDOMAINS')
if ($trt eq 'CHECKONEDOMAIN') {
#Validate form parameters for panel CHECKONEDOMAIN
$ret = $c->validate_CHECKONEDOMAIN(\%lets_data);
$thispanel = 'CHECKONEDOMAIN';
} ## end if ($trt eq 'CHECKONEDOMAIN')
if ($ret ne "ok") {
$c->do_display($thispanel);
} else {
#Do whatever is needed, including writing values to the DB
if ($trt eq 'LIST') {
#do whatever is required ...
$ret = $c->perform_LIST(\%lets_data);
if ($ret ne "ok") {
# return to the panel with error message
$c->stash(error => $c->l($ret));
$c->stash(
title => $title,
modul => $modul,
lets_data => \%lets_data
);
$c->render(template => "letsencrypt");
} else {
$c->stash(success => $c->l('lets_LIST_panel_action_was_successful'))
; #A bit bland - edit it in the lex file
}
} ## end if ($trt eq 'LIST')
if ($trt eq 'PARAMS') {
#do whatever is required ...
$ret = $c->perform_PARAMS(\%lets_data);
if ($ret ne "ok") {
# return to the panel with error message
$c->stash(error => $c->l($ret));
$c->stash(
title => $title,
modul => $modul,
lets_data => \%lets_data
);
$c->render(template => "letsencrypt");
} else {
$c->stash(success => $c->l('lets_PARAMS_panel_action_was_successful'))
; #A bit bland - edit it in the lex file
}
} ## end if ($trt eq 'PARAMS')
if ($trt eq 'CHECKALLDOMAINS') {
#do whatever is required ...
$ret = $c->perform_CHECKALLDOMAINS(\%lets_data);
if ($ret ne "ok") {
# return to the panel with error message
$c->stash(error => $c->l($ret));
$c->stash(
title => $title,
modul => $modul,
lets_data => \%lets_data
);
$c->render(template => "letsencrypt");
} else {
$c->stash(success => $c->l('lets_CHECKALLDOMAINS_panel_action_was_successful'))
; #A bit bland - edit it in the lex file
}
} ## end if ($trt eq 'CHECKALLDOMAINS')
if ($trt eq 'CHECKALLENABLEDDOMAINS') {
#do whatever is required ...
$ret = $c->perform_CHECKALLENABLEDDOMAINS(\%lets_data);
if ($ret ne "ok") {
# return to the panel with error message
$c->stash(error => $c->l($ret));
$c->stash(
title => $title,
modul => $modul,
lets_data => \%lets_data
);
$c->render(template => "letsencrypt");
} else {
$c->stash(success => $c->l('lets_CHECKALLENABLEDDOMAINS_panel_action_was_successful'))
; #A bit bland - edit it in the lex file
}
} ## end if ($trt eq 'CHECKALLENABLEDDOMAINS')
if ($trt eq 'CHECKONEDOMAIN') {
#do whatever is required ...
$ret = $c->perform_CHECKONEDOMAIN(\%lets_data);
if ($ret ne "ok") {
# return to the panel with error message
$c->stash(error => $c->l($ret));
$c->stash(
title => $title,
modul => $modul,
lets_data => \%lets_data
);
$c->render(template => "letsencrypt");
} else {
$c->stash(success => $c->l('lets_CHECKONEDOMAIN_panel_action_was_successful'))
; #A bit bland - edit it in the lex file
}
} ## end if ($trt eq 'CHECKONEDOMAIN')
# and call any signal-events needed
#TBD
# Setup shared data and call panel
if ('none' eq 'none') {
$lets_data{'trt'} = 'LIST';
} else {
$lets_data{'trt'} = 'none';
}
$c->do_display($lets_data{'trt'});
} ## end else [ if ($ret ne "ok") ]
} ## end sub do_update
sub do_display {
#
# Return after link clicked in table (this is a get) - route is "/<whatever>d"
# Expects ?trt=PANEL&selected="TableRowName" plus any other required
#
# OR it maybe a post from the main panel to add a new record
#
#load up all supplied params into prefix_data hash
#call get-selected-PANEL() - returns hash of all relevent parameters
#load up returned hash into prefix_data
#render - to called panel
my ($c, $trt) = @_;
$c->app->log->info($c->log_req);
#The most common ones - you might want to comment out any not used.
my $cdb = esmith::ConfigDB->open() || die("Couldn't open config db");
my $adb = esmith::AccountsDB->open() || die("Couldn't open Accounts db");
my $ndb = esmith::NetworksDB->open() || die("Couldn't open Network db");
my $hdb = esmith::HostsDB->open() || die("Couldn't open Hosts db");
my $ddb = esmith::DomainsDB->open() || die("Couldn't open Domains db");
my %lets_data = ();
my $title = $c->l('lets_Letsencrypt_certificate');
my $modul = "";
# Accessing all parameters
my $params = $c->req->params->to_hash;
# Get number of parameters
my $num_params = scalar keys %$params;
#Tag as Post or Get (ie. create new entry or edit existing one
my $is_new_record = ($c->req->method() eq 'POST');
#Params are available in the hash "params" - copy to the prefix_data hash
#while (my ($key, $value) = each %{$c->req->params->to_hash}) {
# $lets_data{$key} = $value;
#}
# the value of trt will tell you which panel has returned
if (!$trt) {
$trt = $c->param('trt') || 'LIST'; #Indicates where to go now
}
# Now add in the params from the selected row from the table
my %selectedrow;
if ($trt eq 'LIST') {
#Validate Get selected row (if applicable) LIST
%selectedrow = $c->get_selected_LIST($lets_data{'Selected'}, $is_new_record);
} ## end if ($trt eq 'LIST')
if ($trt eq 'PARAMS') {
#Validate Get selected row (if applicable) PARAMS
%selectedrow = $c->get_selected_PARAMS($lets_data{'Selected'}, $is_new_record);
} ## end if ($trt eq 'PARAMS')
if ($trt eq 'CHECKALLDOMAINS') {
#Validate Get selected row (if applicable) CHECKALLDOMAINS
%selectedrow = $c->get_selected_CHECKALLDOMAINS($lets_data{'Selected'}, $is_new_record);
} ## end if ($trt eq 'CHECKALLDOMAINS')
if ($trt eq 'CHECKALLENABLEDDOMAINS') {
#Validate Get selected row (if applicable) CHECKALLENABLEDDOMAINS
%selectedrow = $c->get_selected_CHECKALLENABLEDDOMAINS($lets_data{'Selected'}, $is_new_record);
} ## end if ($trt eq 'CHECKALLENABLEDDOMAINS')
if ($trt eq 'CHECKONEDOMAIN') {
#Validate Get selected row (if applicable) CHECKONEDOMAIN
%selectedrow = $c->get_selected_CHECKONEDOMAIN($lets_data{'Selected'}, $is_new_record);
} ## end if ($trt eq 'CHECKONEDOMAIN')
#Copy in the selected row params to the prefix_data hash to pass to the panel
while (my ($key, $value) = each %selectedrow) {
$lets_data{$key} = $value;
}
# Where to go now
$lets_data{'trt'} = $trt;
# Set up other shared data according to the panel to go to
if ($trt eq 'LIST') {
# pickup any other contents needed and load them into hash shared with panel
my %returned_hash;
# subroutine returns a hash directly
%returned_hash = $c->get_data_for_panel_LIST();
# Copy each key-value pair from the returned hash to the prefix data hash
while (my ($key, $value) = each %returned_hash) {
$lets_data{$key} = $value;
}
} ## end if ($trt eq 'LIST')
if ($trt eq 'PARAMS') {
# pickup any other contents needed and load them into hash shared with panel
my %returned_hash;
# subroutine returns a hash directly
%returned_hash = $c->get_data_for_panel_PARAMS();
# Copy each key-value pair from the returned hash to the prefix data hash
while (my ($key, $value) = each %returned_hash) {
$lets_data{$key} = $value;
}
} ## end if ($trt eq 'PARAMS')
if ($trt eq 'CHECKALLDOMAINS') {
# pickup any other contents needed and load them into hash shared with panel
my %returned_hash;
# subroutine returns a hash directly
%returned_hash = $c->get_data_for_panel_CHECKALLDOMAINS();
# Copy each key-value pair from the returned hash to the prefix data hash
while (my ($key, $value) = each %returned_hash) {
$lets_data{$key} = $value;
}
} ## end if ($trt eq 'CHECKALLDOMAINS')
if ($trt eq 'CHECKALLENABLEDDOMAINS') {
# pickup any other contents needed and load them into hash shared with panel
my %returned_hash;
# subroutine returns a hash directly
%returned_hash = $c->get_data_for_panel_CHECKALLENABLEDDOMAINS();
# Copy each key-value pair from the returned hash to the prefix data hash
while (my ($key, $value) = each %returned_hash) {
$lets_data{$key} = $value;
}
} ## end if ($trt eq 'CHECKALLENABLEDDOMAINS')
if ($trt eq 'CHECKONEDOMAIN') {
# pickup any other contents needed and load them into hash shared with panel
my %returned_hash;
# subroutine returns a hash directly
%returned_hash = $c->get_data_for_panel_CHECKONEDOMAIN();
# Copy each key-value pair from the returned hash to the prefix data hash
while (my ($key, $value) = each %returned_hash) {
$lets_data{$key} = $value;
}
} ## end if ($trt eq 'CHECKONEDOMAIN')
# and table control fields
$c->stash(DomainList => $c->get_DomainList());
# Data for panel
$c->stash(
title => $title,
modul => $modul,
lets_data => \%lets_data
);
$c->render(template => "letsencrypt");
} ## end sub do_display
1;

View File

@@ -142,6 +142,10 @@ sub do_display {
if ($trt eq 'LIST') {
#List all the port forwards
# Open them again as maybe written to above
$tcp_db = esmith::ConfigDB->open('portforward_tcp') || die "Can't open portforward_tcp database: $!\n";
$udp_db = esmith::ConfigDB->open('portforward_udp') || die "Can't open portforward_udp database: $!\n";
my @tcpforwards = $tcp_db->get_all;
my @udpforwards = $udp_db->get_all;
my $empty = 1 if not @tcpforwards and not @udpforwards;
@@ -211,6 +215,7 @@ sub add_portforward {
sub get_destination_host {
my $q = shift;
$cdb = esmith::ConfigDB->open || die "Can't open configuration database: $!\n";
my $dhost = $q->param("dhost");
my $localip = $cdb->get_prop('InternalInterface', 'IPAddress');
my $external_ip = $cdb->get_prop('ExternalInterface', 'IPAddress') || $localip;
@@ -357,6 +362,7 @@ sub isValidPort() {
sub validate_destination_host {
my $c = shift;
$cdb = esmith::ConfigDB->open || die "Can't open configuration database: $!\n";
my $dhost = $c->param('dhost');
$dhost =~ s/^\s+|\s+$//g;
my $localip = $cdb->get_prop('InternalInterface', 'IPAddress');
@@ -395,4 +401,4 @@ sub validate_allowed_hosts {
} ## end foreach (split(/[\s,]+/, $ahost...))
return %valid_ahost_list;
} ## end sub validate_allowed_hosts
1;
1;

View File

@@ -14,6 +14,9 @@ use SrvMngr qw(gen_locale_date_string);
use Locale::gettext;
use SrvMngr::I18N;
use SrvMngr qw(theme_list init_session);
use List::Util qw(sum);
#use Mail::Log::Trace::Postfix;
sub main {
my $c = shift;
@@ -48,44 +51,66 @@ sub generateReport {
my $c = shift;
my $report_type = shift;
my $out = '';
#------------------------------------------------------------
# Looks good; go ahead and generate the report.
# Go ahead and generate the report.
#------------------------------------------------------------
# $| = 1;
my $now_string = $c->gen_locale_date_string();
my $log_path = '/var/log/maillog';
$out .= sprintf("<h3>%s %s </h3>", $c->l('REPORT_GENERATED'), $now_string);
if ($report_type =~ /^qmail-q/) {
open(QMAILQUEUEREPORT, "/var/qmail/bin/$report_type |");
$out .= sprintf "<pre>";
while (<QMAILQUEUEREPORT>) {
$out .= sprintf("%s", $_);
}
close QMAILQUEUEREPORT;
$out .= sprintf "</pre>";
$out .= sprintf("<h3>%s</h3>", $c->l('END_OF_REPORT'));
return '';
} ## end if ($report_type =~ /^qmail-q/)
chdir "/var/log/qmail";
open(QMAILANALOG,
"/bin/cat \@* current 2>/dev/null"
. "| /usr/local/bin/tai64nunix"
. "| /usr/local/qmailanalog/bin/matchup 5>/dev/null"
. "| /usr/local/qmailanalog/bin/$report_type |");
$out .= sprintf "<pre>";
# Get the selected report from the form submission
my $selected_report = $report_type;
while (<QMAILANALOG>) {
# Call the relevant report sub based on the selection
if ($selected_report eq 'daily_summary') {
$out .= daily_summary_report($log_path);
}
elsif ($selected_report eq 'daily_summary_today') {
$out .= daily_summary_report_today($log_path);
}
elsif ($selected_report eq 'daily_summary_all') {
$out .= daily_summary_report_all($log_path);
}
elsif ($selected_report eq 'top_senders') {
$out .= top_senders_and_recipients($log_path);
}
elsif ($selected_report eq 'bounce_analysis') {
$out .= bounce_rate_analysis($log_path);
}
elsif ($selected_report eq 'spam_and_virus') {
$out .= spam_and_virus_filter_report($log_path);
}
elsif ($selected_report eq 'delivery_status') {
$out .= delivery_status_report($log_path);
}
elsif ($selected_report eq 'geo_analysis') {
$out .= geographical_analysis_of_email($log_path);
}
elsif ($selected_report eq 'traffic_analysis') {
$out .= traffic_analysis($log_path);
}
elsif ($selected_report eq 'auth_analysis') {
$out .= authentication_analysis($log_path);
}
elsif ($selected_report eq 'user_activity') {
$out .= user_activity_report($log_path);
}
elsif ($selected_report eq 'error_reporting') {
$out .= error_reporting($log_path);
}
elsif ($selected_report eq 'comparison_reports') {
$out .= comparison_reports($log_path, '/var/log/mail.log.1');
}
elsif ($selected_report eq 'customized_reports') {
$out .= customized_reports($log_path);
}
else {
$out .= 'Invalid report selected';
}
# Cook any special HTML characters
s/\&/\&amp;/g;
s/\"/\&quot;/g;
s/\>/\&gt;/g;
s/\</\&lt;/g;
$out .= sprintf("%s", $_);
} ## end while (<QMAILANALOG>)
close QMAILANALOG;
# The $output variable now contains the generated report output.
# Further processing can be done here, or you can render it later.
$out .= sprintf "</pre>";
$out .= sprintf("<h3>%s</h3>", $c->l('END_OF_REPORT'));
return $out;
@@ -94,22 +119,243 @@ sub generateReport {
sub reportType_list {
my $c = shift;
my @array = (
# [ $c->l('qma_LIST_OUTGOING') => 'qmail-qread' ],
# [ $c->l('qma_SUMMARIZE_QUEUE') => 'qmail-qstat' ],
[ $c->l('qma_SUCCESSFUL_DELIVERY_DELAY') => 'zddist' ],
[ $c->l('qma_REASONS_DEFERRAL') => 'zdeferrals' ],
[ $c->l('qma_REASONS_FAILURE') => 'zfailures' ],
[ $c->l('qma_BASIC_STATS') => 'zoverall' ],
[ $c->l('qma_RECIP_STATS') => 'zrecipients' ],
[ $c->l('qma_RECIP_HOSTS') => 'zrhosts' ],
[ $c->l('qma_RECIP_ORDERED') => 'zrxdelay' ],
[ $c->l('qma_SENDER_STATS') => 'zsenders' ],
[ $c->l('qma_SENDMAIL_STYLE') => 'zsendmail' ],
[ $c->l('qma_REASONS_SUCCESS') => 'zsuccesses' ],
[ $c->l('qma_SENDER_UIDS') => 'zsuids' ]
);
[$c->l('qma_Daily_Summary_Report_yesterday') => 'daily_summary'],
[$c->l('qma_Daily_Summary_Report_today') => 'daily_summary_today'],
[$c->l('qma_Daily_Summary_Report_all') => 'daily_summary_all'],
#[$c->l('qma_Top Senders and Recipients') => 'top_senders'],
#[$c->l('qma_Bounce Rate Analysis') => 'bounce_analysis'],
#[$c->l('qma_Spam and Virus Filtering Report') => 'spam_and_virus'],
#[$c->l('qma_Delivery Status Report') => 'delivery_status'],
#[$c->l('qma_Geographic Analysis of Email') => 'geo_analysis'],
#[$c->l('qma_Traffic Analysis') => 'traffic_analysis'],
#[$c->l('qma_Authentication Analysis') => 'auth_analysis'],
#[$c->l('qma_User Activity Report') => 'user_activity'],
#[$c->l('qma_Error Reporting') => 'error_reporting'],
#[$c->l('qma_Comparison Reports') => 'comparison_reports'],
#[$c->l('qma_Customized Reports') => 'customized_reports'],
);
my @sorted_array = sort { $a->[0] cmp $b->[0] } @array;
return \@sorted_array;
} ## end sub reportType_list
1;
sub daily_summary_report {
my $log_file = shift; # Path to log file
my $output = qx(ls -1 /var/log/maillog* | xargs cat |pflogsumm -d yesterday --detail 0 --no-no-msg-size);
return format_as_html("Daily Summary Report", $output);
}
sub daily_summary_report_today {
my $log_file = shift; # Path to log file
my $output = qx(ls -1 /var/log/maillog* | xargs cat |pflogsumm -d today --detail 0 --no-no-msg-size);
return format_as_html("Daily Summary Report", $output);
}
sub daily_summary_report_all {
my $log_file = shift; # Path to log file
my $output = qx(ls -1 /var/log/maillog* | xargs cat |pflogsumm --detail 0 --no-no-msg-size);
return format_as_html("Summary Report across all logs", $output);
}
sub top_senders_and_recipients {
my $log_file = shift;
my $output = qx(pflogsumm --smtpd-stats $log_file);
return format_as_html("Top Senders and Recipients", $output);
}
sub bounce_rate_analysis {
my $log_file = shift;
my $output = qx(pflogsumm --bounce-detail 10 $log_file); # Show up to 10 bounce details
return format_as_html("Bounce Rate Analysis", $output);
}
sub spam_and_virus_filter_report {
my $log_file = shift;
my $output = qx(pflogsumm -u 10 $log_file); # User report with up to 10 entries
return format_as_html("Spam and Virus Filtering Report", $output);
}
sub delivery_status_report {
my $log_file = shift;
my $output = qx(pflogsumm --deferral-detail 10 $log_file); # Show deferral details
return format_as_html("Delivery Status Report", $output);
}
sub geographical_analysis_of_email {
my $log_file = shift;
# `pflogsumm` doesn't have a specific option for geographic analysis in the help text;
# It's assumed this could be replaced with something relevant, like a SMTP detail.
my $output = qx(pflogsumm --smtp-detail 10 $log_file); # Show up to 10 SMTP details
return format_as_html("Geographic Analysis of Email", $output);
}
sub traffic_analysis {
my $log_file = shift;
my $output = qx(pflogsumm --verbose-msg-detail $log_file); # Request verbose detail
return format_as_html("Traffic Analysis", $output);
}
sub authentication_analysis {
my $log_file = shift;
my $output = qx(pflogsumm -u 10 --verbose-msg-detail $log_file); # User detailed report
return format_as_html("Authentication Analysis", $output);
}
sub user_activity_report {
my $log_file = shift;
my $output = qx(pflogsumm -u 20 $log_file); # Show user activity for up to 20 users
return format_as_html("User Activity Report", $output);
}
sub error_reporting {
my $log_file = shift;
my $output = qx(pflogsumm --problems-first $log_file); # This will show problems first
return format_as_html("Error Reporting", $output);
}
sub comparison_reports {
my ($log_file1, $log_file2) = @_; # Comparing two log files
my $output = qx(pflogsumm $log_file1 $log_file2); # Standard comparison without special flags
return format_as_html("Comparison Reports", $output);
}
sub customized_reports {
my $log_file = shift;
# Because we don't have a concrete custom flag, we'll consider using -d with specific detail.
my $output = qx(pflogsumm --detail 10 $log_file); # Generally show detailed summary
return format_as_html("Customized Reports", $output);
}
sub format_as_html {
my ($title, $content) = @_;
return <<HTML;
<h2>$title</h2>
<pre>$content</pre>
HTML
}
### 1. Message Tracking
#sub trace_message {
#my ($log_path, $message_id) = @_;
##my $tracer = Mail::Log::Trace::Postfix->new({log_file => $log_path});
##$tracer->set_message_id($message_id);
#my $output = "Message Tracking Report for ID: $message_id\n";
##$output .= "=" x 50 . "\n";
##$output .= sprintf "%-12s: %s\n", 'From', $tracer->get_from_address;
##$output .= sprintf "%-12s: %s\n", 'Status', $tracer->get_final_status;
##$output .= "\nRecipients:\n";
##$output .= join("\n", map { "- $_" } $tracer->get_recipient_addresses);
##$output .= "\n\nTimeline:\n";
##my $timeline = $tracer->get_timestamps;
##while (my ($stage, $time) = each %$timeline) {
##$output .= sprintf "%-10s: %s\n", ucfirst($stage), $time;
##}
#return $output || "No records found for message ID: $message_id";
#}
#### 2. Queue Analysis
#sub get_queue_stats {
#my $spool_dir = '/var/spool/postfix';
#my %queues = map { $_ => 0 } qw(active deferred bounce hold corrupt);
#foreach my $q (keys %queues) {
#opendir(my $dh, "$spool_dir/$q");
#$queues{$q} = scalar(grep { -f "$spool_dir/$q/$_" } readdir($dh));
#closedir($dh);
#}
#my $output = "Current Postfix Queue Status\n";
#$output .= "=" x 30 . "\n";
#$output .= sprintf "%-10s: %3d messages\n", ucfirst($_), $queues{$_}
#for sort keys %queues;
#$output .= "\nTotal: " . sum(values %queues) . " messages in queue";
#return $output;
#}
#### 3. Message Statistics
#sub get_message_stats {
#my ($log_path) = @_;
#my %stats = (received => 0, rejected => 0, delivered => 0,
#deferred => 0, bounced => 0, held => 0);
#open(my $fh, '<', $log_path);
#while(<$fh>) {
#$stats{received}++ if /qmgr.*: [A-Z0-9]+: from=/;
#$stats{delivered}++ if /status=sent/;
#$stats{rejected}++ if /NOQUEUE: reject/;
#$stats{deferred}++ if /status=deferred/;
#$stats{bounced}++ if /status=bounced/;
#$stats{held}++ if /status=hold/;
#}
#close($fh);
#my $output = "Message Statistics for " . localtime . "\n";
#$output .= "=" x 40 . "\n";
#$output .= sprintf "%-12s: %6d\n", 'Received', $stats{received};
#$output .= sprintf "%-12s: %6d (%.1f%%)\n", 'Delivered', $stats{delivered},
#($stats{received} ? ($stats{delivered}/$stats{received}*100) : 0);
#$output .= sprintf "%-12s: %6d\n", 'Rejected', $stats{rejected};
#$output .= sprintf "%-12s: %6d\n", 'Deferred', $stats{deferred};
#$output .= sprintf "%-12s: %6d\n", 'Bounced', $stats{bounced};
#$output .= sprintf "%-12s: %6d\n", 'Held', $stats{held};
#return $output;
#}
#### 4. User Activity Audit
#sub get_user_activity {
#my ($log_path, $email) = @_;
##my $tracer = Mail::Log::Trace::Postfix->new({log_file => $log_path});
##my $sent = scalar $tracer->find_messages_by_sender($email);
##my $received = scalar $tracer->find_messages_by_recipient($email);
#my $output = "Activity Report for: $email\n";
##$output .= "=" x (length($email) + 18) . "\n";
##$output .= "Messages sent: $sent\n";
##$output .= "Messages received: $received\n\n";
##$output .= "Last week's activity:\n";
##$output .= join("\n", map { sprintf "- %s: %d messages", $_->[0], $_->[1] }
##$tracer->get_weekly_stats($email));
#return $output || "No activity found for $email";
#}
#### 5. Security Monitoring
#sub detect_auth_failures {
#my ($log_path) = @_;
#my %failures;
#open(my $fh, '<', $log_path);
#while(<$fh>) {
#if(/SASL (?:LOGIN|PLAIN) authentication failed.*?\[([0-9.]+)\]/) {
#$failures{$1}++;
#}
#}
#close($fh);
#return "No authentication failures found" unless keys %failures;
#my $output = "Authentication Failure Report\n";
#$output .= "=" x 30 . "\n";
#$output .= sprintf "%-15s %s\n", 'IP Address', 'Attempts';
#$output .= sprintf "%-15s %s\n", '-' x 15, '-' x 7;
#foreach my $ip (sort { $failures{$b} <=> $failures{$a} } keys %failures) {
#$output .= sprintf "%-15s %5d\n", $ip, $failures{$ip};
#}
#$output .= "\nTotal failures: " . sum(values %failures);
#return $output;
#}
1;

View File

@@ -30,7 +30,7 @@ our @EXPORT = qw( networkAccess_list passwordLogin_list get_ssh_permit_root_logi
);
# get_pptp_sessions
our $db = esmith::ConfigDB->open || warn "Couldn't open configuration database";
my $db; # = esmith::ConfigDB->open || warn "Couldn't open configuration database";
sub main {
my $c = shift;
@@ -144,6 +144,7 @@ sub passwordLogin_list {
}
sub get_prop {
$db = esmith::ConfigDB->open || warn "Couldn't open configuration database";
my ($c, $item, $prop) = @_;
warn "You must specify a record key" unless $item;
warn "You must specify a property name" unless $prop;
@@ -154,6 +155,8 @@ sub get_prop {
sub get_value {
my $c = shift;
my $item = shift;
$db = esmith::ConfigDB->open || warn "Couldn't open configuration database";
$db = esmith::ConfigDB->open || warn "Couldn't open configuration database";
return ($db->get($item)->value());
} ## end sub get_value
@@ -179,8 +182,8 @@ sub get_ssh_password_auth {
}
sub get_ssh_access {
my $status = get_prop('', 'sshd', 'status');
my $c = shift;
my $status = $c->get_prop('sshd', 'status');
if (defined($status) && ($status eq 'enabled')) {
my $access = get_prop('', 'sshd', 'access');
$access = ($access eq 'public') ? 'public' : 'private';
@@ -202,6 +205,7 @@ sub get_ftp_password_login_access {
} ## end sub get_ftp_password_login_access
sub get_telnet_mode {
$db = esmith::ConfigDB->open || warn "Couldn't open configuration database";
my $telnet = $db->get('telnet');
return ('off') unless $telnet;
my $status = $telnet->prop('status') || 'disabled';
@@ -211,8 +215,8 @@ sub get_telnet_mode {
} ## end sub get_telnet_mode
sub get_ipsecrw_sessions {
$db = esmith::ConfigDB->open || warn "Couldn't open configuration database";
my $status = $db->get('ipsec')->prop('RoadWarriorStatus');
if (defined($status) && ($status eq 'enabled')) {
return ($db->get('ipsec')->prop('RoadWarriorSessions') || '0');
} else {
@@ -221,6 +225,7 @@ sub get_ipsecrw_sessions {
} ## end sub get_ipsecrw_sessions
sub get_ipsecrw_status {
$db = esmith::ConfigDB->open || warn "Couldn't open configuration database";
return undef unless ($db->get('ipsec'));
return $db->get('ipsec')->prop('RoadWarriorStatus');
}
@@ -228,6 +233,7 @@ sub get_ipsecrw_status {
sub pptp_and_dhcp_range {
my $c = shift;
my $val = shift || 0;
$db = esmith::ConfigDB->open || warn "Couldn't open configuration database";
my $dhcp_status = $db->get_prop('dhcpd', 'status') || 'disabled';
my $dhcp_end = $db->get_prop('dhcpd', 'end') || '';
my $dhcp_start = $db->get_prop('dhcpd', 'start') || '';
@@ -245,6 +251,7 @@ sub pptp_and_dhcp_range {
sub _get_valid_from {
my $c = shift;
$db = esmith::ConfigDB->open || warn "Couldn't open configuration database";
my $rec = $db->get('httpd-admin');
return undef unless ($rec);
my @vals = (split ',', ($rec->prop('ValidFrom') || ''));
@@ -287,12 +294,12 @@ sub validate_network_and_mask {
sub change_settings {
my ($c, %rma_datas) = @_;
$db = esmith::ConfigDB->open || warn "Couldn't open configuration database";
#------------------------------------------------------------
# good; go ahead and change the access.
#------------------------------------------------------------
$db = esmith::ConfigDB->open || warn "Couldn't open configuration database";
my $rec = $db->get('telnet');
if ($rec) {
if ($rma_datas{telnetAccess} eq "off") {
$rec->set_prop('status', 'disabled');
@@ -363,7 +370,7 @@ sub change_settings {
sub set_ipsecrw_sessions {
my $c = shift;
my $sessions = shift;
$db = esmith::ConfigDB->open || warn "Couldn't open configuration database";
if (defined $sessions) {
$db->get('ipsec')->set_prop('RoadWarriorSessions', $sessions);
@@ -378,6 +385,7 @@ sub add_new_valid_from {
my $c = shift;
my $net = shift;
my $mask = shift;
$db = esmith::ConfigDB->open || warn "Couldn't open configuration database";
# we transform bit mask to regular mask
$mask = get_reg_mask($net, $mask);
@@ -400,6 +408,7 @@ sub remove_valid_from {
my $c = shift;
my $remove_nets = shift;
my @remove = split /,/, $remove_nets;
$db = esmith::ConfigDB->open || warn "Couldn't open configuration database";
# my @remove = $c->param('Remove_nets');
my @vals = $c->_get_valid_from();
@@ -430,4 +439,4 @@ sub remove_valid_from {
$db->get('httpd-admin')->set_prop('ValidFrom', $prop);
return 1;
} ## end sub remove_valid_from
1;
1;

View File

@@ -1,16 +1,11 @@
package SrvMngr::Controller::Review;
#----------------------------------------------------------------------
# heading : Support
# heading : Investigation
# description : Review configuration
# navigation : 000 500
# menu : N
# navigation : 6000 6800
# routes : end
#----------------------------------------------------------------------
# heading-o : Configuration
# description-o : Review configuration
# navigation-o : 6000 6800
#----------------------------------------------------------------------
use strict;
use warnings;
use Mojo::Base 'Mojolicious::Controller';
@@ -152,6 +147,55 @@ sub get2_local_networks {
} ## end else [ if ($numNetworks == 0)]
} ## end sub get2_local_networks
sub get_net_prop {
my $fm = shift;
my $item = shift;
my $prop = shift;
my $record = $networks->get($item);
if ($record) {
return $record->prop($prop);
}
else {
return '';
}
}
sub get_local_networks {
my $fm = shift;
my @nets = $networks->get_all_by_prop('type' => 'network');
my $numNetworks = @nets;
if ($numNetworks == 0) {
return $fm->localise('NO_NETWORKS');
}
else {
my $out = "";
foreach my $network (sort @nets) {
if ($out ne "") {
$out .= "<BR>";
}
$out .= $network->key."/" . get_net_prop($fm, $network->key, 'Mask');
if ( defined get_net_prop($fm, $network->key, 'Router') ) {
$out .= " via " . get_net_prop ($fm, $network->key, 'Router');
}
}
return $out;
}
}
sub get_local_domain
{
return (get_value('','DomainName'));
}
=head2 print2_gateway_stanza
If this system is a server gateway, show the external ip and gateway ip (mojo ver)
@@ -217,4 +261,51 @@ sub print2_dhcp_stanza {
} ## end if (get_prop($c, 'dhcpd'...))
return $out;
} ## end sub print2_dhcp_stanza
1;
sub get_value {
my $fm = shift;
my $item = shift;
my $record = $db->get($item);
if ($record) {
return $record->value();
}
else {
return '';
}
}
sub get_prop {
my $fm = shift if (ref($_[0]) ); # If we're being called in a formmagick context
# The first argument will always be a fm.
#otherwise, we don't want to grab it
my $item = shift;
my $prop = shift;
my $record = $db->get($item);
if ($record) {
return $record->prop($prop);
}
else {
return '';
}
}
sub get_public_ip_address
{
my $self = shift;
my $sysconfig = $db->get('sysconfig');
if ($sysconfig)
{
my $publicIP = $sysconfig->prop('PublicIP');
if ($publicIP)
{
return $publicIP;
}
}
return undef;
}
1;

View File

@@ -2,7 +2,7 @@ package SrvMngr::Controller::Roundcubepanel;
#----------------------------------------------------------------------
# heading : System
# description : Roundcube webmail
# description : Webmail
# navigation : 99999 9999
#----------------------------------------------------------------------
#----------------------------------------------------------------------
@@ -21,10 +21,9 @@ use SrvMngr qw(theme_list init_session);
sub main {
my $c = shift;
$c->app->log->info($c->log_req);
my $title = $c->l('Roundcube Webmail');
my $title = $c->l('Webmail');
my $roundcube_url = $c->param('url');
my $roundcube_height = $c->param('height') | 600;
$c->stash(title => $title, modul => $roundcube_url, height => $roundcube_height);
$c->stash(title => $title, modul => $roundcube_url);
$c->render(template => 'roundcube');
} ## end sub main

View File

@@ -14,7 +14,7 @@ use Mojo::Base 'Mojolicious::Controller';
use Locale::gettext;
use SrvMngr::I18N;
use SrvMngr qw(theme_list init_session
is_normal_password email_simple);
validate_password email_simple);
#use esmith::FormMagick qw( validate_password );
#use CGI::FormMagick::Validator qw( call_fm_validation );
@@ -434,31 +434,6 @@ sub check_password {
return validate_password($c, $check_type, $pass1);
} ## end sub check_password
sub validate_password {
my ($c, $strength, $pass) = @_;
use Crypt::Cracklib;
my $reason;
if ($strength eq "none") {
return $c->l("Passwords must be at least 7 characters long") unless (length($pass) > 6);
return "OK";
}
$reason = is_normal_password($c, $pass, undef);
return $reason unless ($reason eq "OK");
return "OK" unless ($strength eq "strong");
if (-f '/usr/lib64/cracklib_dict.pwd') {
$reason = fascist_check($pass, '/usr/lib64/cracklib_dict');
} else {
$reason = fascist_check($pass, '/usr/lib/cracklib_dict');
}
$reason ||= "Software error: password check failed";
return "OK" if ($reason eq "ok");
return $c->l("Bad Password Choice") . ": "
. $c->l("The password you have chosen is not a good choice, because") . " "
. $c->l($reason) . ".";
} ## end sub validate_password
sub emailForward_list {
my $c = shift;
return [

View File

@@ -16,7 +16,7 @@ use esmith::ConfigDB;
use esmith::AccountsDB;
use Locale::gettext;
use SrvMngr::I18N;
use SrvMngr qw( theme_list init_session is_normal_password );
use SrvMngr qw( theme_list init_session validate_password );
#our $cdb = esmith::ConfigDB->open_ro || die "Couldn't open configuration db";
sub main {
@@ -200,28 +200,4 @@ sub check_password {
return validate_password($c, $strength, $password);
} ## end sub check_password
sub validate_password {
my ($c, $strength, $pass) = @_;
use Crypt::Cracklib;
if ($strength eq "none") {
return $c->l("Passwords must be at least 7 characters long") unless (length($pass) > 6);
return "OK";
}
my $reason = is_normal_password($c, $pass, undef);
return $reason unless ($reason eq "OK");
return "OK" unless ($strength eq "strong");
if (-f '/usr/lib64/cracklib_dict.pwd') {
$reason = fascist_check($pass, '/usr/lib64/cracklib_dict');
} else {
$reason = fascist_check($pass, '/usr/lib/cracklib_dict');
}
$reason ||= "Software error: password check failed";
return "OK" if ($reason eq "ok");
return
$c->l("Bad Password Choice") . ": "
. $c->l("The password you have chosen is not a good choice, because") . " "
. $c->($reason) . ".";
} ## end sub validate_password
1;

View File

@@ -31,7 +31,8 @@ sub main {
my %log_datas = ();
my $title = $c->l('log_FORM_TITLE');
my $notif = '';
$log_datas{default_op} = ($cdb->get('viewlogfiles')->prop('DefaultOperation')) || 'view';
my $viewlog = $cdb->get('viewlogfiles');
$log_datas{default_op} = ($viewlog ? $viewlog->prop('DefaultOperation') : undef) || 'view';
$c->stash(title => $title, notif => $notif, log_datas => \%log_datas);
$c->render(template => 'viewlogfiles');
} ## end sub main

View File

@@ -2,7 +2,7 @@
'clm_LABEL_FILESYSTEM_SCAN_PERIOD' => 'Scan filesystem',
'clm_DESC_FILESYSTEM_SCAN_PERIOD' => '<h2>General Settings</h2>
If this option is enabled then the filesystem will be
scanned for viruses.A report of any found viruses will be
scanned for viruses. A report of any found viruses will be
emailed to the administrator.',
'clm_LABEL_QUARANTINE' => 'Quarantine infected files',
'clm_LABEL_CLAM_VERSIONS' => 'ClamAV and db versions',

View File

@@ -14,26 +14,26 @@ web site for that domain.',
i-bay as the content.',
'dom_DOMAIN_NAME_VALIDATION_ERROR' => 'Error: unexpected or missing characters in domain name
[_1].The domain name should contain one or more
letters, numbers, periods and minus signs.Did not create new domain.',
letters, numbers, periods and minus signs. Did not create new domain.',
'dom_DOMAIN_DESCRIPTION_VALIDATION_ERROR' => 'Error: unexpected or missing characters in domain description
[_1]. Did not create new domain.',
'dom_DOMAIN_IN_USE_ERROR' => 'Error: domain [_1] is already in use.Did not create
'dom_DOMAIN_IN_USE_ERROR' => 'Error: domain [_1] is already in use. Did not create
new domain.',
'dom_SYSTEM_DOMAIN_ERROR' => 'Error: domain [_1] is your system domain name.You
cannot have a domain with the same name.Did not create new domain.',
'dom_SYSTEM_DOMAIN_ERROR' => 'Error: domain [_1] is your system domain name. You
cannot have a domain with the same name. Did not create new domain.',
'dom_SUCCESSFULLY_CREATED' => 'Successfully created domain [_1].Your web
server is now being restarted.The links on this page will be
server is now being restarted. The links on this page will be
inactive until the web server restart is complete.',
'dom_MODIFY_TITLE' => 'Modify domain',
'dom_NONEXISTENT_DOMAIN_ERROR' => 'Error: [_1] is not an existing domain.',
'dom_SUCCESSFULLY_MODIFIED' => 'Successfully modified domain [_1].Your web
server is now being restarted.The links on this page will be inactive until the web server restart is complete.',
server is now being restarted. The links on this page will be inactive until the web server restart is complete.',
'dom_REMOVE_TITLE' => 'Remove domain',
'dom_REMOVE_DESCRIPTION' => 'You are about to remove the domain "[_1]" ([_2]).',
'dom_ABOUT_TO_REMOVE' => 'Are you sure you wish to remove this domain ?',
'dom_ERROR_WHILE_REMOVING_DOMAIN' => 'Error: internal failure while removing domain [_1].',
'dom_SUCCESSFULLY_DELETED' => 'Successfully deleted domain [_1]. Your web server
is now being restarted.The links on this page will be inactive
is now being restarted. The links on this page will be inactive
until the web server restart is complete.',
'dom_DESC_CORPORATE_DNS_CURRENT' => 'Corporate DNS Settings',
'dom_DOMAINS_PAGE_CORPORATE_DNS' => 'Modify corporate DNS settings',

View File

@@ -128,7 +128,7 @@
'FM_IP_NUMBER3' => '[_1] is more than 255',
'FM_USERNAME' => 'This field must look like a valid username (3 to 8 letters and numbers)',
'FM_PASSWORD1' => 'You must provide a password.',
'FM_PASSWORD2' => 'The password you provided was not a good password.A good password must contain all of the following: upper case letter, lower case letter, number, non-alphanumeric character, be at least 7 characters long.',
'FM_PASSWORD2' => 'The password you provided was not a good password. A good password must contain all of the following: upper case letter, lower case letter, number, non-alphanumeric character, be at least 7 characters long.',
'FM_MAC_ADDRESS1' => 'You must provide a MAC address.',
'FM_MAC_ADDRESS2' => 'The MAC address you provided was not valid.',
'FM_ERR_UNEXPECTED_DESC' => 'Error: unexpected or missing characters in description',
@@ -151,4 +151,5 @@ SMALL => 'Small',
MEDIUM => 'Medium',
LARGE => 'Large',
FIELD_INVALID_CHARS => 'A field you entered contains invalid characters.',
'REPORT_GENERATED' => "Report generated",
'END_OF_REPORT' => 'End of Report',

View File

@@ -4,7 +4,7 @@
'grp_ACCOUNT_CONFLICT' => 'Error: the group "[_1]" can\'t be created because there is
already a [_2] account of that name.',
'grp_INVALID_GROUP_DESCRIPTION' => 'Error: unexpected or missing characters in group description',
'grp_NO_MEMBERS' => 'Error: no members in group.Did not create new group.',
'grp_NO_MEMBERS' => 'Error: no members in group. Did not create new group.',
'grp_CREATED_GROUP' => 'Successfully created user group',
'grp_DELETED_GROUP' => 'Successfully removed user group',
'grp_MODIFIED_GROUP' => 'Successfully modifed user group',

View File

@@ -34,17 +34,17 @@ the local network. Please enter a valid IP address in the
format "aaa.bbb.ccc.ddd".',
'hos_ETHERNET_ADDRESS_DESCRIPTION' => 'The ethernet address is optional and causes the DHCP server to
statically bind the local IP address to the computer with this
ethernet address.If specified, it must be of the form
ethernet address. If specified, it must be of the form
"AA:BB:CC:DD:EE:FF" and must contain only the numbers 0-9 and
the letters A-F.',
'hos_CREATE_LOCAL_HOST_TITLE' => 'Create a new hostname referring to a local host.',
'hos_DIDNT_ENTER_LOCAL_IP' => 'Error: You did not specify a Local IP address.IP
'hos_DIDNT_ENTER_LOCAL_IP' => 'Error: You did not specify a Local IP address. IP
addresses must contain only numbers and periods and
be in the form "aaa.bbb.ccc.ddd".Did not create hostname.',
'hos_IP_VALIDATION_ERROR' => 'Error: IP Address [_1] is
invalid. IP Addresses must contain only numbers and periodsand be in the form "aaa.bbb.ccc.ddd". Did not create hostname.',
'hos_MAC_ADDRESS_VALIDATION_ERROR' => 'Error: Ethernet address [_1]
is invalid.Ethernet addresses must be in the
is invalid. Ethernet addresses must be in the
form "AA:BB:CC:DD:EE:FF" and only contain the
numbers 0-9 and the letters A-F. Did not create
hostname.',

View File

@@ -1,72 +0,0 @@
package SrvMngr::I18N::Modules::Letsencrypt::en;
use strict;
use warnings;
use utf8;
use Mojo::Base 'SrvMngr::I18N';
use SrvMngr::I18N::Modules::General::en;
my %lexicon = (
#
# Generated by SM2Gen version: SM2Gen version:0.8 Chameleon version:4.5.4 On Python:3.12.3 at 2024-12-01 15:22:43
#
'lets_Manage_letsencrypt-config_settings:' => 'Manage letsencrypt-config settings',
'lets_HOOKSCRIPT_STATUS' => 'Hookscript Status',
'lets_SERVICE_STATUS' => 'Service Status',
'lets_EMAIL' => 'Email',
'lets_Back' => 'Back',
'lets_Internal_IP' => 'Internal IP',
'lets_Save' => 'Save',
'lets_Issuer' => 'Issuer',
'lets_IS_IN_CERT' => 'Is In cart',
'lets_For_this_Server' => 'For this Server',
'lets_Loop_through_checking_the_letsencrypt' => 'Loop through checking the letsencrypt status for each configured domain',
'lets_Loop_through_checking_the_letsencrypt' => 'Loop through checking the letsencrypt status for each configured domain which is enabled',
'lets_Check_just_one_domain' => 'Check just one domain',
'lets_PARAMS_panel_action_was_successful' => 'PARAMS panel action was successful',
'lets_Check_all_domains' => 'Check all domains',
'lets_LIST_panel_action_was_successful' => 'LIST panel action was successful',
'lets_Status_Report' => 'Status Report',
'lets_LABEL_NAMESERVERS' => 'Label timeservers',
'lets_Loop_through_and_check_the' => 'Loop through and check the letsencrypt status for a specific domain',
'lets_Letsencrypt_certificate' => 'Letsencrypt certificate',
'lets_Error_Status_Report' => 'Error Status Report',
'lets_Not_Before' => 'Not Before',
'lets_Content' => 'Content',
'lets_CONFIG_LETSENCRYPT' => 'confirm Letsencrypt',
'lets_API_STATUS' => 'ape Status',
'lets_ACCEPT_TERMS_STATUS' => 'Accept Terms Status',
'lets_Check_all_enabled_domains' => 'Check all enabled domains',
'lets_All_domains_check_result' => 'All domains check result',
'lets_CHECKALLDOMAINS_panel_action_was_successful' => 'CHECKALLDOMAINS panel action was successful',
'lets_Domains_name' => 'Domains name',
'lets_HOSTOVERRIDE_STATUS' => 'Hostoverride Status',
'lets_List_of_Domains_and_Hosts' => 'List of Domains and Hosts',
'lets_Brief_description' => 'Brief description',
'lets_KEYSIZE_STATUS' => 'Keysize Status',
'lets_Domain_name_/_HOSTNAME' => 'Domain name / HOSTNAME',
'lets_Enabled_domains_check_result' => 'Enabled domains check result',
'lets_CHECKALLENABLEDDOMAINS_panel_action_was_successful' => 'CHECKALLENABLEDDOMAINS panel action was successful',
'lets_Internet_IP' => 'Internet IP',
'lets_Expiry' => 'Expiry',
'lets_CHECK_ALL_DOMAINS' => 'Check All Domains',
'lets_LABEL_POINT' => 'Label Point',
'lets_CHECK' => 'Check',
'lets_CONFIG' => 'Config',
'lets_Current_certificate_details' => 'Current certificate details',
'lets_LABEL_LECERT' => 'Label secret',
'lets_One_domain_check_result' => 'One domain check result',
'lets_CHECKONEDOMAIN_panel_action_was_successful' => 'CHECKONEDOMAIN panel action was successful',
'lets_CONFIGUREMODE_STATUS' => 'Configuremode Status',
'lets_CHECK_ALL_ENABLED_DOMAINS' => 'Check All Enabled Domains',
'lets_External_Interface_IP' => 'External Interface IP',
'lets_APPLY' => 'Apply',
);
our %Lexicon = (
%{ SrvMngr::I18N::Modules::General::en::Lexicon },
%lexicon
);
1;

View File

@@ -1,55 +0,0 @@
#
# Generated by SM2Gen version: SM2Gen version:0.8 Chameleon version:4.5.4 On Python:3.12.3 at 2024-12-01 15:22:43
# edited by bjr 09Jan2025
#
'lets_Manage_letsencrypt-config_settings:' => 'Manage letsencrypt-config settings',
'lets_HOOKSCRIPT_STATUS' => 'Hookscript Status',
'lets_SERVICE_STATUS' => 'Service Status',
'lets_EMAIL' => 'Email',
'lets_Back' => 'Back',
'lets_Internal_IP' => 'Internal IP',
'lets_Save' => 'Save',
'lets_Issuer' => 'Issuer',
'lets_IS_IN_CERT' => 'Is in certificate',
'lets_For_this_Server' => 'For this Server',
'lets_Loop_through_checking_the_letsencrypt' => 'Loop through checking the letsencrypt status for each configured domain',
'lets_Loop_through_checking_the_letsencrypt' => 'Loop through checking the letsencrypt status for each configured domain which is enabled',
'lets_Check_just_one_domain' => 'Check just one domain',
'lets_PARAMS_panel_action_was_successful' => 'Parameter panel action was successful',
'lets_Check_all_domains' => 'Check all domains',
'lets_LIST_panel_action_was_successful' => 'List panel action was successful',
'lets_Status_Report' => 'Status Report',
'lets_LABEL_NAMESERVERS' => 'Label timeservers',
'lets_Loop_through_and_check_the' => 'Loop through and check the letsencrypt status for a specific domain',
'lets_Letsencrypt_certificate' => 'Letsencrypt certificate',
'lets_Error_Status_Report' => 'Error Status Report',
'lets_Not_Before' => 'Not Before',
'lets_Content' => 'Content',
'lets_CONFIG_LETSENCRYPT' => 'Configure Letsencrypt',
'lets_API_STATUS' => 'API Status',
'lets_ACCEPT_TERMS_STATUS' => 'Accept Terms Status',
'lets_Check_all_enabled_domains' => 'Check all enabled domains',
'lets_All_domains_check_result' => 'All domains check result',
'lets_CHECKALLDOMAINS_panel_action_was_successful' => 'Check all domains panel action was successful',
'lets_Domains_name' => 'Domains name',
'lets_HOSTOVERRIDE_STATUS' => 'Hostoverride Status',
'lets_List_of_Domains_and_Hosts' => 'List of Domains and Hosts',
'lets_Brief_description' => 'Brief description',
'lets_KEYSIZE_STATUS' => 'Keysize Status',
'lets_Domain_name_/_HOSTNAME' => 'Domain name / HOSTNAME',
'lets_Enabled_domains_check_result' => 'Enabled domains check result',
'lets_CHECKALLENABLEDDOMAINS_panel_action_was_successful' => 'Check all enabled domains panel action was successful',
'lets_Internet_IP' => 'Internet IP',
'lets_Expiry' => 'Expiry',
'lets_CHECK_ALL_DOMAINS' => 'Check All Domains',
'lets_LABEL_POINT' => 'Label Point',
'lets_CHECK' => 'Check',
'lets_CONFIG' => 'Config',
'lets_Current_certificate_details' => 'Current certificate details',
'lets_LABEL_LECERT' => 'Label secret',
'lets_One_domain_check_result' => 'One domain check result',
'lets_CHECKONEDOMAIN_panel_action_was_successful' => 'Check one domain panel action was successful',
'lets_CONFIGUREMODE_STATUS' => 'Configure mode Status',
'lets_CHECK_ALL_ENABLED_DOMAINS' => 'Check All Enabled Domains',
'lets_External_Interface_IP' => 'External Interface IP',
'lets_APPLY' => 'Apply',

View File

@@ -14,7 +14,7 @@ For example, you may wish to create a pseudonym
"webmaster" for your "webdevelopers" group or a
pseudonym "joe" for the user "joseph".</p>
<p>The server automatically creates pseudonyms of the form
firstname.lastname and firstname_lastname for every user
firstname. lastname and firstname_lastname for every user
on the system and a pseudonym "everyone" which contains
all users on the system.</p>
<p>Pseudonyms also allow you to create e-mail aliases for valid

View File

@@ -8,6 +8,15 @@ reports are available.</P>
these reports</P>',
'qma_REPORT_TYPE' => 'Choose a report type',
'qma_GENERATE_REPORT' => 'Generate report',
'qma_INVALID_REPORT_TYPE' => 'Invalid report type: ',
'qma_REPORT_GENERATED' => 'Report generated: ',
'qma_END_OF_REPORT' => 'End of Report',
'Mail log file analysis' => 'Mail log file analysis',
'qma_Daily_Summary_Report_yesterday' => 'Summary report for yesterday',
'qma_Daily_Summary_Report_today' => 'Summary report for today up to now',
'qma_Daily_Summary_Report_all' => 'Summary report for all time up to now',
'qma_LIST_OUTGOING' => 'List outgoing messages and recipients',
'qma_SUMMARIZE_QUEUE' => 'Summarize status of mail queue',
'qma_SUCCESSFUL_DELIVERY_DELAY' => 'Successful delivery delay distribution',
@@ -20,9 +29,4 @@ these reports</P>',
'qma_SENDER_STATS' => 'Sender statistics',
'qma_SENDMAIL_STYLE' => 'Sendmail style log',
'qma_REASONS_SUCCESS' => 'Reasons for success',
'qma_SENDER_UIDS' => 'Sender uids',
'qma_INVALID_REPORT_TYPE' => 'Invalid report type: ',
'qma_REPORT_GENERATED' => 'Report generated: ',
'qma_END_OF_REPORT' => 'End of Report',
'Mail log file analysis' => 'Mail log file analysis',
'qma_SENDER_UIDS' => 'Sender uids',

View File

@@ -26,7 +26,9 @@ experienced administrators
for remote problem diagnosis and resolution.
We recommend leaving this
parameter set to "No Access"
unless you have a specific reason to do otherwise.',
unless you have a specific reason to do otherwise.
Note that an "Autoblock" feature is enabled by default when public access is enabled; to disable or tune this feature, refer to the manual at https://wiki.koozali.org/AutoBlock
',
'rma_TITLE_FTP_ACCESS' => 'FTP Settings',
'rma_DESC_FTP_ACCESS' => 'You can also control <b>FTP</b> access to your server. We
recommend leaving this parameter set to \'no access\' unless you
@@ -75,11 +77,11 @@ connected to a server serial port.',
'rma_LABEL_PPTP_ACCESS' => 'PPTP default user access',
'rma_TITLE_TELNET_ACCESS' => 'Telnet Settings',
'rma_DESC_TELNET_ACCESS' => 'WARNING:Telnet is currently enabled, but this feature is
no longer supported.Telnet is inherently insecure and should only
no longer supported. Telnet is inherently insecure and should only
be used in circumstances where no practical alternative exists. You
should change option to [_1] and use
secure shell if remote access is
required.Once disabled, telnet will no longer appear on this
required. Once disabled, telnet will no longer appear on this
screen. ',
'rma_TITLE_IPSECRW' => 'IPSEC Client (Roadwarrior) Settings',
'rma_DESC_IPSECRW' => 'You can allow IPSEC client access to your server, authenticated by
@@ -90,4 +92,4 @@ to the number 0 unless you require IPSEC client access.',
can do so here.<br>Any old certificates will no longer
authenticate against the server, so <b><i>all IPSEC clients will
need to import a new certificate!</i></b>.',
'rma_LABEL_IPSECRW_RESET' => 'Reset digital certificates',
'rma_LABEL_IPSECRW_RESET' => 'Reset digital certificates',

View File

@@ -2,7 +2,7 @@
'rvw_FORM_TITLE' => 'Review configuration',
'rvw_DESCRIPTION' => 'This report summarizes the networking, server, and domain
parameters on this server relevant to configuring
the client computers on your network.You may wish to print this
the client computers on your network. You may wish to print this
page and use it as a reference.',
'rvw_NETWORKING_PARAMS' => 'Networking Parameters',
'rvw_SERVER_MODE' => 'Server Mode',

View File

@@ -4,7 +4,7 @@
by the services running on your server.',
'log_LOG_FILE_SELECT_DESC' => 'Choose a log file to view',
'log_FILTER_PATTERN_DESC' => 'You may optionally specify a filter pattern to display only the
lines from the log file which match this pattern.If you leave
lines from the log file which match this pattern. If you leave
this field blank, all available lines of the log file will be
displayed. Note that this option is not used if you download the
logfile.',

View File

@@ -0,0 +1,38 @@
Configuration report created {$report_creation_time}
==================
Base configuration
==================
SME server version: {$releaseversion}
SME server mode: {$systemmode}
SME server previous mode: {$previoussystemmode }
Running Kernel: {$curkernel}
===========================
New RPMs not in base system
===========================
{ foreach $i (@newrpms) {
$OUT .= "$i";
}
}
===========================
Custom and modified templates
===========================
{ foreach $i (@templates) {
$OUT .= "$i";
}
}
===========================
Modified events
===========================
{ foreach $i (@events) {
$OUT .= "$i";
}
}
=======================
Additional repositories
=======================
{ foreach $r (@repositories) {
$OUT .= "$r";
}
}
DONE!

View File

@@ -1,90 +0,0 @@
/*
Generated by SM2Gen version: SM2Gen version:0.8 Chameleon version:4.5.4 On Python:3.12.3 at 2024-12-01 15:22:43
*/
.Letsencrypt-panel {}
.name {}
.rout {}
.grou {}
.link2 {}
.link3 {}
.link4 {}
.endg {}
.subh2 {}
.read4 {}
.read5 {}
.read6 {}
.subh3 {}
.read1 {}
.read2 {}
.read3 {}
.subh4 {}
.tabl1 {}
thead .tabl1 {}
tbody .tabl1 {}
.name {}
.rout {}
.subh {}
.para1 {}
.sele1 {}
.sele2 {}
.sele3 {}
.sele4 {}
.sele5 {}
.sele6 {}
.sele7 {}
.emai8 {}
.subm9 {}
.name {}
.rout {}
.head {}
.subh {}
.text1 {}
.back2 {}
.name {}
.rout {}
.head {}
.subh {}
.text1 {}
.back2 {}
.name {}
.rout {}
.head {}
.subh {}
.read1 {}
.text2 {}
.back3 {}
.inline-buttons {
display: flex; /* Use flexbox to arrange items horizontally */
gap: 10px; /* Optional: Add space between buttons */
}
.inline-buttons .link {
/* Additional styling can be added here if needed */
}
.inline-buttons .link {
display: inline-block; /* Keep links as inline-block for button shape */
padding: 7px 14px; /* Adjusted padding to approximate 70% of the original */
margin: 0; /* Remove margin */
background-color: #efefef; /* Light gray background color */
color: black; /* Text color */
text-decoration: none; /* Remove underline */
border: 2px solid #bbb; /* Thin, light gray border */
border-radius: 3px; /* Slightly rounded corners */
font-size: 11.2px; /* Adjusted font size to approximate 70% of the original */
text-align: center; /* Center the text */
cursor: pointer; /* Pointer cursor on hover */ }
/* Hover and active effects for better interaction */
.inline-buttons .link:hover {
background-color: #d9d9d9; /* Darker shade on hover */
}
.inline-buttons .link:active {
background-color: #c0c0c0; /* Even darker shade on click */
}
span .label {
padding-top:13em;
}

View File

@@ -0,0 +1,43 @@
/* General styles for the module panel */
#module {
padding: 20px;
border: 1px solid #ccc;
border-radius: 10px;
background-color: #f9f9f9;
box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1);
}
/* Debug information styling */
#module p {
font-family: monospace;
color: #555;
}
#module pre {
background-color: #eee;
padding: 10px;
border-radius: 5px;
}
/* Error message styling */
.sme-error {
color: #d9534f;
font-weight: bold;
margin-bottom: 15px;
}
/* Title styling */
#module h1 {
font-family: Arial, sans-serif;
color: #333;
text-align: center;
margin-bottom: 20px;
}
/* Content styling */
.module-content {
font-family: Georgia, serif;
font-size: 13px;
line-height: 1.2;
color: #555;
}

View File

@@ -0,0 +1,505 @@
{
margin-left: 0;
}
a.alert {
color: red;
font-family: Verdana, Tahoma, sans-serif;
font-size: 11px;
background: #e8f3e1;
}
a.item {
color: #00008b;
font-family: Verdana, Tahoma, sans-serif;
font-size: 11px;
background: #e8f3e1;
}
a.item-current:hover, a.warn-current:hover {
border-color: #888;
}
a.item-current:link, a.warn-current:link,
a.item-current:visited, a.warn-current:visited,
a.item-current:active, a.warn-current:active,
a.item-current:hover, a.warn-current:hover {
display: block;
font-family: Verdana, Tahoma, sans-serif;
font-size: 10px;
color: black;
text-decoration: none;
background: #fff;
border-color: #888;
margin: 0;
border-style: solid;
border-width: 1px;
padding-right: 10px;
padding-left: 10px;
padding-bottom: 2px;
text-align: left;
}
a.item:active, a.item-current:active,
a.warn:active, a.warn-current:active {
display: block;
font-family: Verdana, Tahoma, sans-serif;
font-size: 10px;
color: white;
background: black;
text-decoration: none;
border-color: #000;
margin: 0;
border-style: solid;
border-width: 1px;
padding-right: 10px;
padding-left: 10px;
padding-bottom: 2px;
text-align: left;
}
a.item:hover, a.item-current:hover,
a.warn:hover, a.warn-current:hover {
display: block;
font-family: Verdana, Tahoma, sans-serif;
font-size: 10px;
color: black;
text-decoration: none;
background: #ccc;
border-color: #888;
margin: 0;
border-style: solid;
border-width: 1px;
padding-right: 10px;
padding-left: 10px;
padding-bottom: 2px;
text-align: left;
}
a.item:link, a.item-current:link,
a.warn:link, a.warn-current:link {
display: block;
font-family: Verdana, Tahoma, sans-serif;
font-size: 10px;
color: black;
background: #e8f3e1;
text-decoration: none;
text-align: left;
border-color: #e8f3e1;
margin: 0;
border-style: solid;
border-width: 1px;
padding: 0 10px 2px;
}
a.item:visited, a.item-current:visited,
a.warn:visited, a.warn-current:visited {
display: block;
font-family: Verdana, Tahoma, sans-serif;
font-size: 10px;
color: black;
background: #e8f3e1;
text-decoration: none;
border-color: #e8f3e1;
margin: 0;
border-style: solid;
border-width: 1px;
padding-right: 10px;
padding-left: 10px;
padding-bottom: 2px;
text-align: left;
}
a.section-title {
display: inline-block;
color: #6CA345;
padding-left: 5px;
padding-right: 5px;
line-height: 18px;
font-weight: bold;
}
a.sl {
color: green;
font-family: Verdana, Tahoma, sans-serif;
font-size: 11px;
background: #e8f3e1;
}
a.update {
color: red;
font-family: Verdana, Tahoma, sans-serif;
font-size: 11px;
background: #98d36e;
}
a.warn:link, a.warn-current:link,
a.warn:visited, a.warn-current:visited,
a.warn:active, a.warn-current:active,
a.warn:hover, a.warn-current:hover {
background-image: url("/server-common/warn.gif");
background-repeat: no-repeat;
background-position: 10px;
padding-left: 25px;
}
a:active {
color: #606060;
text-decoration: none;
}
a:hover {
color: #F00;
text-decoration: none;
}
a:link {
color: #006921;
text-decoration: none;
}
a:visited {
color: #063;
text-decoration: none;
}
body {
background-color: #FFF;
color: #000;
font-family: Verdana, Tahoma, sans-serif;
font-size: 11px;
border-width: 0;
}
body, body.main {
margin: 5px 20px 5px 5px;
}
body, body.menu {
margin: 0 0 0 2px;
}
body.header {
font-family: Verdana, Tahoma, sans-serif;
font-size: 11px;
background-color: #bee6a2;
margin: 0;
}
body.main {
font-family: Verdana, Tahoma, sans-serif;
font-size: 11px;
background-color: #fff;
color: #000;
}
body.menu {
font-family: Verdana, Tahoma, sans-serif;
font-size: 11px;
background-color: #e8f3e1;
}
div.error, div.sme-error, span.error, span.sme-error {
color: red;
background-color: #f9f9f9;
border-width: 1px;
border-style: solid;
border-color: red;
padding: 10px;
border-radius: 10px;
}
form {
margin-top: 2px;
margin-bottom: 2px;
}
h1, .h1 {
font-family: Verdana, Tahoma, sans-serif;
color: #333;
font-size: 18px;
margin-bottom: 4px;
margin-top: 12px;
}
h2, .h2 {
font-family: Verdana, Tahoma, sans-serif;
color: #333;
font-size: 14px;
margin-bottom: 3px;
margin-top: 12px;
}
h3, .h3 {
font-family: Verdana, Tahoma, sans-serif;
color: #333;
font-size: 12px;
margin-bottom: 2px;
margin-top: 12px;
}
h4, .h4 {
font-family: Verdana, Tahoma, sans-serif;
font-style: italic;
color: #333;
font-size: 12px;
margin-bottom: 2px;
margin-top: 10px;
}
hr.sectionbar {
color: #8ebe43;
background-color: #8ebe43;
height: 1px;
width: 80%;
border: 0;
}
hr.sme-copyrightbar {
color: #8ebe43;
background-color: #8ebe43;
height: 1px;
width: 100%;
border: 0;
}
input.action {
margin-left: 0;
background-color: #bee6a2;
color: darkgreen;
border-radius: 8px;
border: 2px solid #4CAF50;
display: flex;
justify-content: center;
align-items: center;
}
input.action2 {
margin-left: 0;
color: black;
background-color: #d4d0c8;
display: flex;
justify-content: center;
}
input.action:active {
background-color: #3e8e41;
transform: translate(-2px,2px);
}
input.action:hover {
background-color: #3e8e41;
color: white;
}
input.field-with-error {
background-color: #fd9e7e;
}
label.field-with-error {
color: #dd7e5e;
}
ol, ul, li {
font-family: Verdana, Tahoma, sans-serif;
font-size: 10px;
font-weight: normal;
color: black;
}
p {
margin-top: 8px;
margin-bottom: 2px;
}
span {
font-family: Verdana, Tahoma, sans-serif;
font-size: 11px;
}
span.data {
padding: 2px;
font-weight: bold;
margin-left: 0;
}
span.data2 {
padding: 2px;
}
span.label {
display: inline-block;
font-weight: bold;
background-color: #e8f3e1;
width: 30%;
text-align: right;
}
span.label2 {
display: inline-block;
font-weight: bold;
background-color: #e8f3e1;
text-align: right;
}
table, tr, td, div, p, form {
color: #000;
font-family: Verdana, Tahoma, sans-serif;
font-size: 11px;
}
table.sme-border {
border-collapse: collapse;
border: 2px solid #cccccc;
empty-cells: show;
margin: 5px;
}
table.sme-layout {
border-collapse: collapse;
margin-bottom: 2px;
margin-top: 2px;
}
table.sme-noborders {
padding: 0;
margin: 0 0 20px;
font-family: Verdana, Tahoma, sans-serif;
font-size: 11px;
}
td {
text-align: left;
}
td.darkgrey {
background-color: #888;
}
td.label {
font-weight: bold;
background-color: #e8f3e1;
width: 30%;
text-align: right;
}
td.menu-cell {
margin: 0;
padding: 0;
}
td.section {
padding-bottom: 2px;
padding-top: 8px;
background-color: #e8f3e1;
}
td.sme-border a, td.sme-border-right a, td.sme-border-center a {
font-size: 10px;
}
td.sme-border, td.sme-border-warning, td.sme-border-right, td.sme-border-center {
border: 1px solid #cccccc;
font-family: Verdana, Tahoma, sans-serif;
font-size: 10px;
font-weight: normal;
color: #000;
text-align: left;
padding: 3px 2px;
}
td.sme-border-center {
text-align: center;
}
td.sme-border-right {
text-align: right;
}
td.sme-border-warning {
color: red;
}
/* sme-layout* : Used for top-level layout */
table.sme-layout {
border-collapse: collapse;
margin-bottom: 2px;
margin-top: 2px;
}
tr.sme-layout {
border: 1px solid #dddddd;
}
td.sme-layout {
border: 1px solid #dddddd;
}
td.sme-noborders-content {
text-align: left;
vertical-align: top;
font-family: Verdana, Tahoma, sans-serif;
font-size: 11px;
}
td.sme-noborders-info, div.sme-noborders-info {
text-align: left;
vertical-align: top;
}
td.sme-noborders-label {
font-weight: bold;
text-align: right;
background-color: #e8f3e1;
font-family: Verdana, Tahoma, sans-serif;
font-size: 11px;
width: 33%;
}
td.sme-radiobutton {
width: 30px;
}
th.sme-border {
border: 1px;
background-color: #bee6a2;
font-family: Verdana, Tahoma, sans-serif;
font-size: 10px;
font-weight: bold;
color: #000;
text-align: center;
vertical-align: bottom;
padding: 3px;
}
th.sme-layout {
border: 1px;
background-color: #e8f3e1;
font-family: Verdana, Tahoma, sans-serif;
font-size: 9pt;
font-weight: bold;
color: #000;
text-align: right;
padding: 4px;
}
tr.sme-layout {
border: 1px;
}
ul {
list-style-type: circle;
}
div.success, span.success {
color: #006400;
border-width: 1px;
border-style: solid;
border-color: #006400 ;
padding: 10px;
border-radius: 10px;
}
div.roundcube #roundcube{
width:100%;
height:600px;
}

View File

@@ -0,0 +1,283 @@
/* css/sme-password.css */
.input-container {
position: relative;
display: inline-block;
}
.sme-password {
padding-right: 5px; /* Ensure space for the toggle icon */
}
.toggle-password {
position: absolute;
right: 4px; /* Position it towards the right */
top: 50%; /* Center vertically */
transform: translateY(-50%); /* Adjust for exact centering */
cursor: pointer;
width: 20px; /* Set the width of the icon */
height: 20px; /* Set the height of the icon */
}
.module {
padding: 20px;
border: 1px ;
border-radius: 10px;
background-color: #f9f9f9;
box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1);
margin-left: 10px !important;
margin-top: 10px;
}
.sme-copyright {
color: #777;
font-family: Verdana, Tahoma, sans-serif;
font-size: 10px;
}
.logo {
height: 142%;
width: auto;
margin-left: -16px;
}
.gradient-panel {
width: 100%;
height: 40px;
background: linear-gradient(to right, white ,#c0e7a5 );
display: flex;
align-items: center;
position: relative;
}
.sme-error {
color: #d9534f;
display: block;
background-color: #fff;
border-width: 1px;
border-style: solid;
border-color: red;
padding: 2px;
font-weight: bold;
margin-bottom: 15px;
}
.login-button {
position: absolute;
left: 7%;
transform: translateX(-50%);
background-color: #4caf50b8;
color: white !important;
border: none;
padding: 8px;
text-align: center;
text-decoration: none;
display: inline-block;
font-size: 14px;
cursor: pointer;
border-radius: 4px;
margin-left: 77%;
}
.sme-warning {
color: orange;
display: block;
background-color: #fff;
border-width: 1px;
border-style: solid;
border-color: orange;
padding: 2px;
}
.infobar {
font-family: Verdana, Tahoma, sans-serif;
font-size: 11px;
background-color: #98d36e;
}
.module-content {
font-family: Georgia, Garamond, serif;
font-size: 13px;
line-height: 1.2;
color: #555;
}
#help-button {
text-decoration: none;
font-size: 20px;
padding: 8px;
background-color: #98d36e;
border-radius: 4px;
color: #000;
}
/*
#module {
padding: 20px;
border: 1px;
border-radius: 10px;
background-color: #f9f9f9;
box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1);
}
*/
#container {
max-width: 100%;
position: relative;
margin: auto;
}
#header2 {
width:96%;
margin-left: 1px;
margin-top: 4px;
}
#main {
margin-left: 200px;
padding: 10px;
}
#central {
padding: 5px;
}
#footer {
padding-left: 5px;
}
#header {
width: 100%;
margin: auto;
}
#navigation {
width: 190px;
position: absolute;
padding: 5px;
background-color: #E8F3E1;
overflow: auto;
margin-top:20px;
}
#footer img {
float: right;
position: fixed;
/*margin-left: 40%;*/
}
.flag-style {
position: absolute;
transform: translateY(-50%);
left: 95%;
/*right: 20px;
*/
width: 24px;
height: 14px;
display: inline-block;
vertical-align: middle;
}
/* flag container*/
#flag-container span {
font-size: 24px;
display: flex; /* Allows for easy centering */
justify-content: center; /* Center horizontally */
align-items: center; /* Center vertically */
width: 100%; /* Full width of parent */
height: 24px; /* Set a fixed height */
border: 1px solid #ccc; /* Light gray border */
border-radius: 5px; /* Rounded corners */
cursor: default; /* Prevent text cursor */
}
.fallback-box {
display: inline-block; /* Make it inline-block to fit around the content */
border: 2px solid gray; /* Change the border color as desired */
padding: 10px; /* Add some padding */
border-radius: 10px; /* Round the corners of the box */
font-size: 60px; /* Adjust size if needed */
margin-top: 10px; /* Add some margin */
text-align: center; /* Center text inside the box */
}
table.sme-border {
border-collapse: collapse;
border: 2px solid #cccccc;
empty-cells: show;
margin: 5px 5px 5px 2px;
}
td.sme-border, td.sme-border-warning, td.sme-border-right, td.sme-border-center {
border: 1px solid #cccccc;
font-family: Verdana, Arial, Helvetica, sans-serif;
font-size: 10px;
font-weight: normal;
color: #000000;
text-align: left;
padding-left: 2px;
padding-right: 2px;
padding-top: 3px;
padding-bottom: 3px;
}
td.sme-border-warning {
color: red;
}
td.sme-border-right {
text-align: right;
}
td.sme-border-center {
text-align: center;
}
th.sme-border {
border: 1px solid #cccccc;
background-color: #bee6a2;
font-family: Verdana, Arial, Helvetica, sans-serif;
font-size: 10px;
font-weight: bold;
color: #000000;
text-align: center;
vertical-align: bottom;
padding-left: 3px;
padding-right: 3px;
padding-top: 3px;
padding-bottom: 3px;
/*border-width: 1px;
border-style: solid;
border-color: #F2F0EE #75736E #75736E #F2F0EE ;
*/
}
td.sme-border a, td.sme-border-right a, td.sme-border-center a {
font-size: 10px;
}
th.sme-layout {
border: 1px solid #8ebe43;
background-color: #bee6a2;
}
table.sme-border {
border: 2px solid #dddddd;
}
td.sme-border-warning,
td.sme-border-right,
td.sme-border-center {
border: 1px solid #dddddd;
}
td.sme-border-right {text-align: right;}
td.sme-border-center {text-align: center;}
th.sme-border {
border: 1px solid #dddddd;
background-color: #e8f3e1;
}
.no-visited-state {
color: inherit;
/* Or specify the desired color */
text-decoration: none;
/* Or any other style you want to reset */
}
.no-visited-state:visited {
color: inherit;
/* Or specify the desired color */
text-decoration: none;
/* Or any other style you want to reset */
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

View File

@@ -0,0 +1,25 @@
document.addEventListener('DOMContentLoaded', function() {
const analysisType = document.getElementById('analysis_type');
const messageIdGroup = document.getElementById('message_id_group');
const emailAddressGroup = document.getElementById('email_address_group');
// Initially hide both controls
messageIdGroup.style.display = 'none';
emailAddressGroup.style.display = 'none';
analysisType.addEventListener('change', function() {
// Hide both controls first
messageIdGroup.style.display = 'none';
emailAddressGroup.style.display = 'none';
// Show the relevant control based on the selected option
switch(this.value) {
case 'trace_message':
messageIdGroup.style.display = 'block';
break;
case 'user_activity':
emailAddressGroup.style.display = 'block';
break;
}
});
});

View File

@@ -74,10 +74,8 @@
</p><br>
%= hidden_field 'Function' => $bac_datas->{'function'}
<div class='center'>
%= submit_button $c->l('bac_UPDATE_CONF'), class => 'action'
</div>
% end
</div>
% end
% end

View File

@@ -30,10 +30,8 @@
%= hidden_field 'Function' => $bac_datas->{'function'}
<div class='center'>
%= submit_button $c->l('bac_RESTORE_FROM_TAPE'), class => 'action'
</div>
% end
</div>
% end
% end

View File

@@ -44,12 +44,10 @@
</span></p>
%= hidden_field 'Function' => $bac_datas->{'function'} . '1'
<div class='center'>
%= submit_button $c->l('NEXT'), class => 'action'
</div>
% end
</div>
% end
% end

View File

@@ -148,9 +148,7 @@
%= hidden_field 'Function' => $bac_datas->{function}
%= hidden_field 'VFSType' => $bac_datas->{vfstype}
<div class='center'>
%= submit_button $c->l('bac_UPDATE_CONF'), class => 'action'
</div>
% end
</div>
% end
% end

View File

@@ -38,9 +38,7 @@
</span><br><br>
%= hidden_field 'Function' => $bac_datas->{'function'}
<div class='center'>
%= submit_button $c->l('bac_RESTORE_FROM_WORKSTN'), class => 'action'
</div>
% end
</div>
% end
% end

View File

@@ -29,9 +29,7 @@
%=l 'bac_YOU_MUST_REBOOT'
</p>
%= hidden_field 'Function' => $bac_datas->{'function'}
<div class='center'>
%= submit_button $c->l('bac_REBOOT'), class => 'action'
</div>
% end
</div>

View File

@@ -39,12 +39,10 @@
</span><br>
<br>
%= hidden_field 'Function' => $bac_datas->{'function'}
<div class='center'>
%= submit_button $c->l('PERFORM'), class => 'action'
</div>
% end
</div>
% end
% end

View File

@@ -41,9 +41,7 @@
%= hidden_field 'Backupset' => $bac_datas->{'backupset'}
%= hidden_field 'Filterexp' => $bac_datas->{'filterexp'}
<div class='center'>
%= submit_button $c->l('PERFORM'), class => 'action'
</div>
% end

View File

@@ -24,9 +24,7 @@
%= form_for '/backupd' => (method => 'POST') => begin
%= hidden_field 'Function' => $bac_datas->{'function'}
<div class='center'>
%= submit_button $c->l('NEXT'), class => 'action'
</div>
% end

View File

@@ -44,10 +44,8 @@
<br><br>
%= hidden_field 'Function' => $bac_datas->{'function'} . '1'
<div class='center'>
%= submit_button $c->l('bac_VERIFY'), class => 'action'
</div>
% end
</div>
% end
% end

View File

@@ -28,10 +28,8 @@
%= hidden_field 'Function' => $bac_datas->{'function'}
<div class='center'>
%= submit_button $c->l('NEXT'), class => 'action'
</div>
% end
</div>
% end
% end

View File

@@ -11,42 +11,52 @@
# The events handle cases where mysqld is not enabled, and/or is not running.
my $status = system("/sbin/e-smith/signal-event", "pre-backup", "desktop");
if ($status) {
desktopBackupRecordStatus($backup_rec, 'pre-backup', $status);
return ($c->l('bac_OPERATION_STATUS_REPORT').
$c->l('bac_ERR_PRE_BACKUP'));
$c->desktopBackupRecordStatus($backup_rec, 'pre-backup', $status);
return ($c->l('bac_OPERATION_STATUS_REPORT').$c->l('bac_ERR_PRE_BACKUP'));
}
my $clvl = $c->stash('compressionlevel');
my $cmd = "/bin/tar --directory / --create @{$c->stash('directories')} --file=-"
. "@{$c->stash('exclude')} | /usr/bin/gzip $clvl ";
my $cmd = "/bin/tar --create --file=- --directory / @{$c->stash('exclude')} "
. "@{$c->stash('directories')} | /usr/bin/gzip $clvl ";
my $success = open my $fh, '-|', $cmd;
unless ($success) { return "Error dowload command."; };
# Write chunk
$c->res->headers->content_type('application/x-tar');
$c->res->headers->content_disposition(qq/attachment; filename="smeserver.tgz"/);
my $cb;
$cb = sub {
my $c = shift;
my $size = 500 * 1024;
my $length = sysread($fh, my $buffer, $size);
unless ($length) {
close $fh;
undef $cb;
$c->finish;
return;
}
$c->write_chunk($buffer, $cb);
};
$c->$cb;
#unless ($success) { return "Error download command."; };
if ($success) {
# Try with download plugin - seems to fail to complete download and also
# name of file deposited is not as required.
#my $output = do { local $/; <$fh> };
#close $fh;
#$c->render_file(
#data => $output,
#filename => 'output.txt',
#content_type => 'text/plain'
#);
# So organise it ourselves.
$c->res->headers->content_type('application/x-tar');
$c->res->headers->content_disposition(qq/attachment; filename="smeserver.tgz"/);
my $cb;
$cb = sub {
my $c = shift;
my $size = 500 * 1024;
my $length = sysread($fh, my $buffer, $size);
unless ($length) {
close $fh;
undef $cb;
$c->finish;
return;
}
$c->write_chunk($buffer, $cb);
};
$c->$cb;
} else {
$c->render(text => "Failed to execute command: $!", status => 500);
}
# Remove the dumped tables.
$status = system("/sbin/e-smith/signal-event", "post-backup", "desktop");
if ($status) {
desktopBackupRecordStatus($backup_rec, 'post-backup', $status);
die ($c->l('bac_ERR_POST_BACKUP'),"\n");
$c->desktopBackupRecordStatus($backup_rec, 'post-backup', $status);
die ($c->l('bac_ERR_POST_BACKUP'),"\n");
}
$now = time();
@@ -54,3 +64,4 @@
$backup_rec->set_prop('Result', "0");
%>
1;

View File

@@ -70,12 +70,10 @@
</span></p>
<br>
<div class='center'>
%= submit_button $c->l('PERFORM'), class => 'action'
</div>
%= submit_button $c->l('PERFORM'), class => 'action'
% end
</div>
% end
% end

View File

@@ -18,9 +18,16 @@
<% my $btn = l('bugr_Download this report'); %>
%= form_for 'bugreportD' => (method => 'POST') => begin
%= submit_button "$btn", class => 'action'
%= hidden_field 'trt' => $bugr_datas->{trt}
% end
%= submit_button "$btn", class => 'action'
%= hidden_field 'trt' => $bugr_datas->{trt}
% end
% my $out = "================== <br />";
% $out .= "Boot anaysis image (right click and save image to download)<br />";
% $out .= "================== <br />";
% $out .= "<img src='images/boot.svg' alt='boot timing image' width=95% >";
<br><%= $c->render_to_string(inline=>$out) %><br>
</div>

View File

@@ -33,7 +33,7 @@
%= select_field 'EmailUnknownUser' => $c->get_emailunknownuser_opt(), class => 'input'
</span></p>
<hr class='menubar' />
<!--<hr class='menubar' />-->
<h2>
%=l 'mai_TITLE_DELEGATE'
</h2>
@@ -47,7 +47,7 @@
%= text_field 'DelegateMailServer', class => 'input'
</span></p>
<hr class='sectionbar' />
<!--<hr class='sectionbar' />-->
<h2>
%=l 'mai_TITLE_SMARTHOST'
</h2>
@@ -89,4 +89,4 @@
% end
</div>
%end
%end

View File

@@ -92,7 +92,7 @@
%= select_field 'uSMTPAuth' => $c->get_smtp_ssl_auth_opt(), class => 'input'
</span></p>
<hr class="sectionbar" />
<!--<hr class="sectionbar" />-->
<h2>
%=l 'mai_TITLE_SECONDARY'
</h2>

View File

@@ -47,9 +47,10 @@
</div>
%= hidden_field 'trt' => 'ACC'
% end
% end
<br>
<hr class="sectionbar" />
<!--<hr class="sectionbar" />-->
%= form_for 'emailsettings' => (method => 'POST') => begin
<p><span class=label>
@@ -76,9 +77,10 @@
</div>
%= hidden_field 'trt' => 'FIL'
% end
% end
<br>
<hr class="sectionbar" />
<!--<hr class="sectionbar" />-->
%= form_for 'emailsettings' => (method => 'POST') => begin
<p><span class=label>
@@ -118,8 +120,9 @@
%= hidden_field 'trt' => 'REC'
% end
<br>
<hr class="sectionbar" />
<!--<hr class="sectionbar" />-->
%= form_for 'emailsettings' => (method => 'POST') => begin
<p><span class=label>

View File

@@ -2,7 +2,7 @@
% content_for 'module' => begin
<div id="central" class="sme-error">
<div id="central" class="sme-error module">
<p><br>dev<br> Oups !!!
The page you were requesting
"<%= $self->req->url->path || '/' %>"
@@ -14,4 +14,4 @@
</p>
</div>
% end
% end

View File

@@ -8,7 +8,7 @@
</p>
% }
<div id='central' class='central initial-panel'>
<div id='central' class='central initial-panel module'>
% if ( stash 'error' ) {
<br><div class=sme-error>

View File

@@ -7,11 +7,18 @@
<title><%= $title %></title>
<link rel="made" href="mailto:bugs%40koozali.org">
<meta name="copyright" content="(head.tmpl)Copyright 2003-2004 Mitel Corporation">
%= stylesheet '/css/sme_core.css'
%= stylesheet '/css/sme_main.css'
%= stylesheet '/css/sme_menu.css'
%= stylesheet '/css/styles.css'
%= stylesheet '/css/sme-password.css'
%= stylesheet '/css/new_sme.css'
%= stylesheet '/css/new-sme-main.css'
%# Replaced by consolidated (and rationlised) CSS files as above March 2025
%#= stylesheet '/css/sme_core.css'
%#= stylesheet '/css/sme_main.css'
%#= stylesheet '/css/sme_menu.css'
%#= stylesheet '/css/styles.css'
%#= stylesheet '/css/sme-password.css'
%= content_for 'head_contrib'
% if (config 'hasJquery') {
%= include 'partials/_js_imports'
@@ -70,7 +77,7 @@
%= content 'js_toggleMenu'
% }
<div id="navigation" class="col-md-3">
<div id="navigation" class="col-md-3 module">
%= include 'partials/_nav_menu'
% if ( $c->is_logged_in ) {
%= include 'partials/_user_menu'
@@ -84,17 +91,17 @@
%= include 'partials/_info'
% if (flash 'success') {
<br><div class=success>
<br><div class="success module">
%= $c->render_to_string(inline => flash 'success')
</div>
% }
% if ( flash 'warning' ) {
<br><div class=sme-warning>
<br><div class="sme-warning module">
%= $c->render_to_string(inline => flash 'warning')
</div>
%}
% if ( flash 'error' ) {
<br><div class=sme-error>
<br><div class="sme-error module">
%= $c->render_to_string(inline => flash 'error')
</div>
%}

View File

@@ -1,69 +0,0 @@
%#
%# Generated by SM2Gen version:0.8 Chameleon version:4.5.4 On Python:3.12.3 at 2024-12-01 15:22:43
%#
% layout 'default', title => "Sme server 2 - Letsencrypt certificate", share_dir => './';
%# css specific to this panel:
% content_for 'module' => begin
%= stylesheet '/css/letsencrypt.css'
<div id="module" class="module Letsencrypt-panel">
% if (config->{debug} == 1) {
<pre>
%= dumper $c->current_route
%= dumper $lets_data->{trt}
</pre>
% }
<h1><%=$title%></h1>
% if ( stash('modul')) {
%= $c->render_to_string(inline => stash('modul') );
% }
%if ($c->stash('first')) {
<br><p>
%=$c->render_to_string(inline =>$c->l($c->stash('first')))
</p>
%} elsif ($c->stash('success')) {
<div class='success '>
<h2><%=$c->l('lets_Status_Report') %></h2><p>
%= $c->l($c->stash('success'));
</p>
</div>
%} elsif ($c->stash('error')) {
<div class='sme-error'>
<h2><%=$c->l('lets_Error_Status_Report') %></h2><p>
%= $c->l($c->stash('error'));
</p>
</div>
%}
%#Routing to partials according to trt parameter.
%#This ought to be cascading if/then/elsif, but is easier to just stack the if/then's rather like a case statement'
% if ($lets_data->{trt} eq "LIST") {
%= include 'partials/_lets_LIST'
%}
% if ($lets_data->{trt} eq "PARAMS") {
%= include 'partials/_lets_PARAMS'
%}
% if ($lets_data->{trt} eq "CHECKALLDOMAINS") {
%= include 'partials/_lets_CHECKALLDOMAINS'
%}
% if ($lets_data->{trt} eq "CHECKALLENABLEDDOMAINS") {
%= include 'partials/_lets_CHECKALLENABLEDDOMAINS'
%}
% if ($lets_data->{trt} eq "CHECKONEDOMAIN") {
%= include 'partials/_lets_CHECKONEDOMAIN'
%}
</div>
%end

View File

@@ -1,20 +1,27 @@
% layout 'default', title => "Sme server 2 - module";
% content_for 'module' => begin
%= stylesheet '/css/module.css'
<div id='module' class='module module-panel'>
% if (config->{debug} == 1) {
<p>
%= dumper $c->current_route
</p>
<p>
<strong>Debug Info:</strong>
<pre><%= dumper $c->current_route %></pre>
</p>
% }
% if ( stash 'error' ) {
<br><div class=sme-error>
%= $c->render_to_string(inline => stash 'error')
</div>
%}
<h1> <%=$title %></h1><br>
%= $c->render_to_string( inline => stash 'modul' )
% if (stash 'error') {
<div class="sme-error">
<strong>Error:</strong><br>
<%= $c->render_to_string(inline => stash 'error') %>
</div>
% }
<h1><%= $title %></h1>
<div class="module-content">
<%= $c->render_to_string(inline => stash 'modul') %>
</div>
</div>
%end
% end

View File

@@ -2,7 +2,7 @@
% content_for 'module' => begin
<div id="central" class="sme-error">
<div id="central" class="sme-error module">
<p><br>dev<br> Oups !!!
The page you were requesting
"<%= $self->req->url->path || '/' %>"
@@ -12,4 +12,4 @@
</p>
</div>
% end
% end

View File

@@ -1,5 +1,5 @@
% layout 'defaultlight', title => 'Sme server 2 - Error P';
<div id='central' class='central not_found-panel'>
<div id='central' class='central not_found-panel module'>
<p><br><br>
The page you were requesting
"<%= $self->req->url->path || '/' %>"
@@ -7,4 +7,4 @@
<br><br>
%= link_to Welcome => '/'
</p>
</div>
</div>

View File

@@ -85,7 +85,8 @@
%= form_for '/domains' => (method => 'POST') => begin
<HR class="sectionbar">
<!-- <HR class="sectionbar">-->
<br>
% my $btn2 = l('dom_DOMAINS_PAGE_CORPORATE_DNS');
@@ -119,4 +120,4 @@
</div>
</div>

View File

@@ -1,8 +1,8 @@
<div id="footer">
<HR class="sme-copyrightbar">
<div id="footer" class="module">
<!--<HR class="sme-copyrightbar">-->
<a href="https://mojolicious.org" target="_blank"><img src="images/sme-mojo-logo-white.png" style="position:relative;"></a>
<font class="sme-copyright">
% if ( $c->is_logged_in ) {
% if ( $c->is_logged_in && $c->is_admin) {
SME Server <%= session 'releaseVersion' %>-<%= $c->app->VERSION %> Manager II
% my $mode;
% if (config->{mode} eq 'development'){ $mode = '-dev';} else { $mode = '';}

View File

@@ -1,128 +1,12 @@
<style>
#h2l1 {
display: flex; /* Use flexbox layout */
justify-content: space-between; /* Space between child elements */
align-items: center; /* Center items vertically */
}
#h2e11 {
flex: 1; /* Allow the first div to take available space on the left */
}
#h2e12 {
display: flex; /* Make this div a flex container */
align-items: center; /* Vertically center content in this div */
margin-left: 20px; /* Add margin to the left of this div */
}
#flag-container {
display: flex; /* Make this div a flex container */
align-items: center; /* Vertically center content in this div */
margin-left: 20px; /* Add margin to the left of the flag container */
padding-right: 20px; /* Add padding to the right side of the flag container */
}
.flag-icon {
width: 43px;
font-size: 20px;
}
#legacy-button button {
background-color: #98d36e; /* Button background color */
font-weight: lighter; /* Lighter text for the button */
color: #063; /* Button text color */
padding: 5px 10px; /* Padding for the button */
border: none; /* Remove default button border */
border-radius: 4px; /* Rounded corners for button */
cursor: pointer; /* Change cursor on hover */
}
#legacy-button button:hover {
background-color: #82c961; /* Change color on hover */
}
.infobar {
display: flex; /* Use flexbox for alignment */
justify-content: space-between; /* Space between child elements */
align-items: center; /* Center items vertically */
padding: 10px; /* Adjust padding as desired */
}
#h2e21 {
flex: 1; /* Allow the first div to take available space on the left */
}
#h2e22 {
display: flex; /* Make this div a flex container */
justify-content: center; /* Center the help button */
align-items: center; /* Center vertically */
flex: none; /* Prevent this div from growing */
position: relative; /* Relative position for centering */
width: 100px; /* Set a width for the help button container */
}
#h2e23 {
margin-left: auto; /* Push the third div to the right */
}
.login-button {
background-color: #98d36e; /* Button background color */
font-weight: bold; /* Bold text */
color: #ffffff; /* Button text color */
padding: 8px 12px; /* Adjust padding for button height */
border: none; /* Remove default border */
border-radius: 4px; /* Rounded corners */
cursor: pointer; /* Change cursor on hover */
}
.login-button:hover {
background-color: #82c961; /* Change color on hover */
}
#help-button {
text-decoration: none; /* Remove underline from link */
font-size: 20px; /* Adjust font size as needed */
padding: 8px 12px; /* Add padding to the help link */
background-color: #98d36e; /* Background for visibility */
border-radius: 4px; /* Rounded corners */
color: #000; /* Button text color */
}
#help-button:hover {
background-color: #82c961; /* Change background on hover */
}
</style>
<div id="header2" class="hd2">
<div id="h2l1">
<div id="h2e11">
<a target='_blank' href="http://www.koozali.org"><img src="images/smeserver_logo.jpg" height="40" alt="SME Server"></a>
</div>
<div id="h2e22">
<button type='button'class="login-button"><a id="help-button" target="_parent" href="manual">?</a></button>
</div>
<div id="h2e12">
<button type='button' class="login-button"><a id="legacy-button" href="/server-manager" target='_blank'>Legacy SM</a></button>
</div>
<div id="h2e23">
% if ( not defined $c->session->{username} ) {
<button type='button' class="login-button"><a target="_parent" href="login">Login</a></button>
% } else {
<button type='button' class="login-button"><a target="_parent" href="logout"><%= $c->session->{username} %> Logout</a></button>
% }
</div>
<div id="flag-container">
<!-- The flag icon will be inserted here -->
</div>
</div>
<div id="h2l2" class="infobar">
<div id="h2e21">
<b>
<%= session 'SystemName' %>@<%= session 'DomainName' %></b>
</div>
<div id="header2" class="hd2 module gradient-panel">
<img src="images/KoozaliServerManager.png" alt="Koozali Logo" class="logo" >
% if ( not defined $c->session->{username} ) {
<button type='button' class="login-button"><a class = "no-visited-state" target="_parent" href="login">Login</a></button>
% } else {
<button type='button' class="login-button"><a class = "no-visited-state" target="_parent" href="logout">Logout <%= $c->session->{username} %></a></button>
% }
<div id="flag-container" class = "flag-style">
<!-- The flag icon will be inserted here -->
</div>
</div>
</div>

View File

@@ -1,16 +1,25 @@
<% use POSIX qw(strftime); %>
<div id="info">
<% if (! $c->session->{PwdSet} ) { %>
<div class="sme-error"><h5>
<div class="sme-error module"><h5>
Warning: you have not yet changed the default system password.</h5></div>
<% } %>
<% if ( $c->is_unsafe ) { %>
<div class="sme-error"><h5>
<div class="sme-error module"><h5>
Warning: a reconfigure and reboot is required before proceeding! Failure to do so now
may leave your system in an unknown state!</h5></div>
<% } %>
<% if ( $c->session->{Access} eq 'public' && ((config->{debug} ne '0') || (config->{mode} ne 'production')) ) { %>
<div class="sme-error"><h5>
<div class="sme-error module"><h5>
Warning: Development or debug mode enabled AND public access is offered !
</h5></div>
<% } %>
<% my $curdate = strftime '%Y%m%d', localtime; %>
<% if ( "$curdate" >= "20290531" ) { %>
<div class="sme-error"><h5>
URGENT NOTICE: As per May 31st 2029, SME Server 11 is obsolete, and potentially INSECURE. NO support will be offered for any issue found with this installed version.
Please migrate IMMEDIATELY to Koozali SME Server 12 or higher version. Failure to upgrade may lead to the compromise of this server.
</br>Please, consult <a href="https://wiki.koozali.org/SME_Server:Download" target="_blank">https://wiki.koozali.org/SME_Server:Download</a> to get the latest version
</h5></div>
<% } %>
</div>

View File

@@ -1,45 +0,0 @@
%#
%# Generated by SM2Gen version:0.8 Chameleon version:4.5.4 On Python:3.12.3 at 2024-12-01 15:22:43
%#
<div id="Letsencrypt-CHECKALLDOMAINS" class="partial Letsencrypt-CHECKALLDOMAINS">
<script>
window.onload = function() {
SelectInput();
};
</script>
% if (config->{debug} == 1) {
<pre>
%= dumper $lets_data
</pre>
% }
% my $btn = l('lets_APPLY');
%= form_for "letsencryptu" => (method => 'POST') => begin
% param 'trt' => $lets_data->{trt} unless param 'trt';
%= hidden_field 'trt' => $lets_data->{trt}
%# Inputs etc in here.
<h1 class='head'><%=l('lets_Check_all_domains')%></h1>
<h2 class='subh'><%=l('lets_Loop_through_checking_the_letsencrypt')%></h2>
<span class=label>
%=l('lets_All_domains_check_result')
</span><span class=data>
% param 'AllDomainsCheck' => $lets_data->{AllDomainsCheck} unless param 'AllDomainsCheck';
%= text_area 'AllDomainsCheck', cols=>40, rows=>10, Readonly=>'true'
</span><br>
<span class='data'>
%my $back_text = l('lets_Back'); # Localized text
%my $actionBack = qq{
% <a href="letsencryptd">
% <input class='action back' type='submit' value='$back_text'>
% </a>
%};
<%= $c->render_to_string(inline => $actionBack) %>
</span>
%# Probably finally by a submit.
%end
</div>

View File

@@ -1,45 +0,0 @@
%#
%# Generated by SM2Gen version:0.8 Chameleon version:4.5.4 On Python:3.12.3 at 2024-12-01 15:22:43
%#
<div id="Letsencrypt-CHECKALLENABLEDDOMAINS" class="partial Letsencrypt-CHECKALLENABLEDDOMAINS">
<script>
window.onload = function() {
SelectInput();
};
</script>
% if (config->{debug} == 1) {
<pre>
%= dumper $lets_data
</pre>
% }
% my $btn = l('lets_APPLY');
%= form_for "letsencryptu" => (method => 'POST') => begin
% param 'trt' => $lets_data->{trt} unless param 'trt';
%= hidden_field 'trt' => $lets_data->{trt}
%# Inputs etc in here.
<h1 class='head'><%=l('lets_Check_all_enabled_domains')%></h1>
<h2 class='subh'><%=l('lets_Loop_through_checking_the_letsencrypt')%></h2>
<span class=label>
%=l('lets_Enabled_domains_check_result')
</span><span class=data>
% param 'EnabledDomainsCheck' => $lets_data->{EnabledDomainsCheck} unless param 'EnabledDomainsCheck';
%= text_area 'EnabledDomainsCheck', cols=>40, rows=>10, Readonly=>'true'
</span><br>
<span class='data'>
%my $back_text = l('lets_Back'); # Localized text
%my $actionBack = qq{
% <a href="letsencryptd">
% <input class='action back' type='submit' value='$back_text'>
% </a>
%};
<%= $c->render_to_string(inline => $actionBack) %>
</span>
%# Probably finally by a submit.
%end
</div>

View File

@@ -1,52 +0,0 @@
%#
%# Generated by SM2Gen version:0.8 Chameleon version:4.5.4 On Python:3.12.3 at 2024-12-01 15:22:43
%#
<div id="Letsencrypt-CHECKONEDOMAIN" class="partial Letsencrypt-CHECKONEDOMAIN">
<script>
window.onload = function() {
SelectInput();
};
</script>
% if (config->{debug} == 1) {
<pre>
%= dumper $lets_data
</pre>
% }
% my $btn = l('lets_APPLY');
%= form_for "letsencryptu" => (method => 'POST') => begin
% param 'trt' => $lets_data->{trt} unless param 'trt';
%= hidden_field 'trt' => $lets_data->{trt}
%# Inputs etc in here.
<h1 class='head'><%=l('lets_Check_just_one_domain')%></h1>
<h2 class='subh'><%=l('lets_Loop_through_and_check_the')%></h2>
<p><span class=label>
%=l('lets_Domains_name')
</span><span class=data>
% param 'OneDomainToCheck' => $lets_data->{OneDomainToCheck} unless param 'OneDomainToCheck';
%= text_field 'OneDomainToCheck', size => '50', class => 'textinput OneDomainToCheck' , pattern=>'.*' , placeholder=>'OneDomainToCheck', Readonly=>'true'
<br></span></p>
<span class=label>
%=l('lets_One_domain_check_result')
</span><span class=data>
% param 'OneDomainsCheck' => $lets_data->{OneDomainsCheck} unless param 'OneDomainsCheck';
%= text_area 'OneDomainsCheck', cols=>40, rows=>10, Readonly=>'true'
</span><br>
<span class='data'>
%my $back_text = l('lets_Back'); # Localized text
%my $actionBack = qq{
% <a href="letsencryptd">
% <input class='action back' type='submit' value='$back_text'>
% </a>
%};
<%= $c->render_to_string(inline => $actionBack) %>
</span>
%# Probably finally by a submit.
%end
</div>

View File

@@ -1,126 +0,0 @@
%#
%# Generated by SM2Gen version:0.8 Chameleon version:4.5.4 On Python:3.12.3 at 2024-12-01 15:22:43
%#
<div id="Letsencrypt-LIST" class="partial Letsencrypt-LIST">
<script>
window.onload = function() {
SelectInput();
};
</script>
% if (config->{debug} == 1) {
<pre>
%= dumper $lets_data
</pre>
% }
% my $btn = l('lets_APPLY');
%= form_for "letsencryptu" => (method => 'POST') => begin
% param 'trt' => $lets_data->{trt} unless param 'trt';
%= hidden_field 'trt' => $lets_data->{trt}
%# Inputs etc in here.
<div class=inline-buttons>
<a href='letsencryptd?trt=PARAMS' class='link link2'>
%= l('lets_CONFIG')
</a>
%#= link_to l('lets_CONFIG'), 'letsencryptd?trt=PARAMS' , class=>'link link2'
<a href='letsencryptd?trt=CHECKALLDOMAINS' class='link link3'>
%= l('lets_CHECK_ALL_DOMAINS')
</a>
%#= link_to l('lets_CHECK_ALL_DOMAINS'), 'letsencryptd?trt=CHECKALLDOMAINS' , class=>'link link3'
<a href='letsencryptd?trt=CHECKALLENABLEDDOMAINS' class='link link4'>
%= l('lets_CHECK_ALL_ENABLED_DOMAINS')
</a>
%#= link_to l('lets_CHECK_ALL_ENABLED_DOMAINS'), 'letsencryptd?trt=CHECKALLENABLEDDOMAINS' , class=>'link link4'
</div>
<h2 class='subh2'><%=l('lets_For_this_Server')%></h2>
<p><span class=label>
%=l('lets_Internal_IP')
</span><span class=data>
% param 'InternalIP' => $lets_data->{InternalIP} unless param 'InternalIP';
%= text_field 'InternalIP', size => '50', class => 'textinput InternalIP' , pattern=>'.*' , placeholder=>'InternalIP', Readonly=>'true'
<br></span></p>
<p><span class=label>
%=l('lets_External_Interface_IP')
</span><span class=data>
% param 'ExternalIP' => $lets_data->{ExternalIP} unless param 'ExternalIP';
%= text_field 'ExternalIP', size => '50', class => 'textinput ExternalIP' , pattern=>'.*' , placeholder=>'ExternalIP', Readonly=>'true'
<br></span></p>
<p><span class=label>
%=l('lets_Internet_IP')
</span><span class=data>
% param 'InternetIP' => $lets_data->{InternetIP} unless param 'InternetIP';
%= text_field 'InternetIP', size => '50', class => 'textinput InternetIP' , pattern=>'.*' , placeholder=>'InternetIP', Readonly=>'true'
<br></span></p>
<h2 class='subh3'><%=l('lets_Current_certificate_details')%></h2>
<p><span class=label>
%=l('lets_Issuer')
</span><span class=data>
% param 'Issuer' => $lets_data->{Issuer} unless param 'Issuer';
%= text_field 'Issuer', size => '50', class => 'textinput Issuer' , pattern=>'.*' , placeholder=>'Issuer', Readonly=>'true'
<br></span></p>
<p><span class=label>
%=l('lets_Expiry')
</span><span class=data>
% param 'Expiry' => $lets_data->{Expiry} unless param 'Expiry';
%= text_field 'Expiry', size => '50', class => 'textinput Expiry' , pattern=>'.*' , placeholder=>'Expiry', Readonly=>'true'
<br></span></p>
<p><span class=label>
%=l('lets_Not_Before')
</span><span class=data>
% param 'NotBefore' => $lets_data->{NotBefore} unless param 'NotBefore';
%= text_field 'NotBefore', size => '50', class => 'textinput NotBefore' , pattern=>'.*' , placeholder=>'NotBefore', Readonly=>'true'
<br></span></p>
<h2 class='subh4'><%=l('lets_List_of_Domains_and_Hosts')%></h2>
<br /><table class="sme-border TableSort sme-table tabl1 ">
<thead class='tabl1'>
<tr table-head-row>
<th class='sme-border table-head-col table-head-col-Domain name / HOSTNAME '><%=l('lets_Domain_name_/_HOSTNAME')%></th>
<th class='sme-border table-head-col table-head-col-Brief description '><%=l('lets_Brief_description')%></th>
<th class='sme-border table-head-col table-head-col-Content '><%=l('lets_Content')%></th>
<th class='sme-border table-head-col table-head-col-LABEL_NAMESERVERS '><%=l('lets_LABEL_NAMESERVERS')%></th>
<th class='sme-border table-head-col table-head-col-LABEL_POINT '><%=l('lets_LABEL_POINT')%></th>
<th class='sme-border table-head-col table-head-col-LABEL_LECERT '><%=l('lets_LABEL_LECERT')%></th>
<th class='sme-border table-head-col table-head-col-IS_IN_CERT '><%=l('lets_IS_IN_CERT')%></th>
<th class='sme-border table-head-col table-head-col-CHECK '><%=l('lets_CHECK')%></th>
</tr>
</thead>
<tbody class='tabl1'>
% my $control_data = $c->stash('DomainList');
% foreach my $row (@$control_data) {
<tr class='table-row'>
<td class='sme-border table-col table-col-Table1-Domain name / HOSTNAME'><%=$c->render_to_string(inline=>$row->{'Table1-Domain name / HOSTNAME'})%></td>
<td class='sme-border table-col table-col-Table1-Brief description'><%=$c->render_to_string(inline=>$row->{'Table1-Brief description'})%></td>
<td class='sme-border table-col table-col-Table1-Content'><%=$c->render_to_string(inline=>$row->{'Table1-Content'})%></td>
<td class='sme-border table-col table-col-Table1-LABEL_NAMESERVERS'><%=$c->render_to_string(inline=>$row->{'Table1-LABEL_NAMESERVERS'})%></td>
<td class='sme-border table-col table-col-Table1-LABEL_POINT'><%=$c->render_to_string(inline=>$row->{'Table1-LABEL_POINT'})%></td>
<td class='sme-border table-col table-col-Table1-LABEL_LECERT'><%=$c->render_to_string(inline=>$row->{'Table1-LABEL_LECERT'})%></td>
<td class='sme-border table-col table-col-Table1-IS_IN_CERT'><%=$c->render_to_string(inline=>$row->{'Table1-IS_IN_CERT'})%></td>
<td class='sme-border table-col table-col-Table1-CHECK'><%=$c->render_to_string(inline=>$row->{'Table1-CHECK'})%></td>
</tr>
%}
</tbody>
</table>
%# Probably finally by a submit.
%end
</div>

View File

@@ -1,97 +0,0 @@
%#
%# Generated by SM2Gen version:0.8 Chameleon version:4.5.4 On Python:3.12.3 at 2024-12-01 15:22:43
%#
<div id="Letsencrypt-PARAMS" class="partial Letsencrypt-PARAMS">
<script>
window.onload = function() {
SelectInput();
};
</script>
% if (config->{debug} == 1) {
<pre>
%= dumper $lets_data
</pre>
% }
% my $btn = l('lets_APPLY');
%= form_for "letsencryptu" => (method => 'POST') => begin
% param 'trt' => $lets_data->{trt} unless param 'trt';
%= hidden_field 'trt' => $lets_data->{trt}
%# Inputs etc in here.
<h2 class='subh'><%=l('lets_Manage_letsencrypt-config_settings:')%></h2>
<p class='paragraph para1'>
%=l('lets_CONFIG_LETSENCRYPT')
</p>
<p><span class=label>
%=l('lets_SERVICE_STATUS')
</span><span class=data>
% my @status_options = [['Disabled' => 'disabled'], ['Enabled' => 'enabled'], ['TEST' => 'test']];
% param 'status' => $lets_data->{status} unless param 'status';
%= select_field 'status' => @status_options, class => 'input'
<br></span> </p>
<p><span class=label>
%=l('lets_HOOKSCRIPT_STATUS')
</span><span class=data>
% my @hookScript_options = [['Disabled' => 'disabled'], ['Enabled' => 'enabled']];
% param 'hookScript' => $lets_data->{hookScript} unless param 'hookScript';
%= select_field 'hookScript' => @hookScript_options, class => 'input'
<br></span> </p>
<p><span class=label>
%=l('lets_HOSTOVERRIDE_STATUS')
</span><span class=data>
% my @hostOverride_options = [['Disabled' => 'disabled'], ['Yes' => 'yes']];
% param 'hostOverride' => $lets_data->{hostOverride} unless param 'hostOverride';
%= select_field 'hostOverride' => @hostOverride_options, class => 'input'
<br></span> </p>
<p><span class=label>
%=l('lets_ACCEPT_TERMS_STATUS')
</span><span class=data>
% my @ACCEPT_TERMS_options = [['Disabled' => 'disabled'], ['Yes' => 'yes']];
% param 'ACCEPT_TERMS' => $lets_data->{ACCEPT_TERMS} unless param 'ACCEPT_TERMS';
%= select_field 'ACCEPT_TERMS' => @ACCEPT_TERMS_options, class => 'input'
<br></span> </p>
<p><span class=label>
%=l('lets_API_STATUS')
</span><span class=data>
% my @API_options = [['2' => '2']];
% param 'API' => $lets_data->{API} unless param 'API';
%= select_field 'API' => @API_options, class => 'input'
<br></span> </p>
<p><span class=label>
%=l('lets_KEYSIZE_STATUS')
</span><span class=data>
% my @keysize_options = [['2048' => '2048'], ['3072' => '3072'], ['4096' => '4096']];
% param 'keysize' => $lets_data->{keysize} unless param 'keysize';
%= select_field 'keysize' => @keysize_options, class => 'input'
<br></span> </p>
<p><span class=label>
%=l('lets_CONFIGUREMODE_STATUS')
</span><span class=data>
% my @configure_options = [['ALL' => 'all'], ['Domains' => 'domains'], ['HOSTS' => 'hosts'], ['NONE' => 'none']];
% param 'configure' => $lets_data->{configure} unless param 'configure';
%= select_field 'configure' => @configure_options, class => 'input'
<br></span> </p>
<p><span class=label>
%=l('lets_EMAIL')
</span><span class=data>
% param 'email' => $lets_data->{email} unless param 'email';
%=email_field 'email', class => 'emai8'
</span></p>
<span class='data'>
%= submit_button l('lets_Save'), class => 'action subm9'
</span>
%# Probably finally by a submit.
%end
</div>

View File

@@ -13,17 +13,18 @@
% my $var5 = @vars[4];
% my $var6 = @vars[5];
<br>
%if ($ret{'ret'} eq "") {
%} elsif (index($ret{ret},"SUCCESS") != -1) {
<div class='success'>
<h2> Operation Status Report</h2>
%= $c->l($ret{ret},$var1,$var2,$var3,$var4,$var5,$var6);
<!--<h2> Operation Status Report</h2>-->
%= $c->render_to_string(inline => l($ret{ret},$var1,$var2,$var3,$var4,$var5,$var6));
</div>
%} else {
<div class='sme-error'>
<h2> Operation Status Report - Error</h2>
%= $c->l($ret{ret},$var1,$var2,$var3,$var4,$var5,$var6);
<!--<h2> Operation Status Report - Error</h2>-->
%= $c->render_to_string(inline => l($ret{ret},$var1,$var2,$var3,$var4,$var5,$var6));
</div>
%}
<br />
@@ -66,5 +67,4 @@
</p>
%end
</div>
</div>

View File

@@ -26,13 +26,15 @@
%if ($ret{ret} eq "") {
%=l "ln_FIRSTPAGE_DESC"
%} elsif (index($ret{ret},"SUCCESS") != -1) {
<br>
<div class='success'>
<h2> Operation Status Report</h2>
<!--<h2> Operation Status Report</h2>-->
%= $c->render_to_string(inline => l($ret{ret},$var1,$var2,$var3,$var4,$var5,$var6,$var7));
</div>
%} else {
<br>
<div class='sme-error'>
<h2> Operation Status Report - Error</h2>
<!--<h2> Operation Status Report - Error</h2>-->
%= $c->render_to_string(inline => l($ret{ret},$var1,$var2,$var3,$var4,$var5,$var6,$var7));
</div>
%}
@@ -103,4 +105,4 @@
</table>
%= hidden_field 'trt' => $ln_datas->{trt}
%}
</div>
</div>

View File

@@ -13,16 +13,17 @@
% my $var5 = @vars[4];
% my $var6 = @vars[5];
<br>
%if ($ret{'ret'} eq "") {
%} elsif (index($ret{ret},"SUCCESS") != -1) {
<div class='success'>
<h2> Operation Status Report</h2>
<!--<h2> Operation Status Report</h2>-->
%= $c->l($ret{ret},$var1,$var2,$var3,$var4,$var5,$var6);
</div>
%} else {
<div class='sme-error'>
<h2> Operation Status Report - Error</h2>
<!--<h2> Operation Status Report - Error</h2>-->
%= $c->l($ret{ret},$var1,$var2,$var3,$var4,$var5,$var6);
</div>
%}
@@ -84,4 +85,4 @@
%end
</div>
</div>

View File

@@ -21,13 +21,15 @@
%if ($ret{ret} eq "") {
%= $c->render_to_string(inline => l('pf_FIRST_PAGE_DESCRIPTION'));
%} elsif (index($ret{ret},"SUCCESS") != -1) {
<br>
<div class='success'>
<h2> Operation Status Report</h2>
<!--<h2> Operation Status Report</h2>-->
%= $c->l($ret{ret},$var1,$var2,$var3,$var4,$var5,$var6);
</div>
%} else {
<br>
<div class='sme-error'>
<h2> Operation Status Report - Error</h2>
<!--<h2> Operation Status Report - Error</h2>-->
%= $c->l($ret{ret},$var1,$var2,$var3,$var4,$var5,$var6);
</div>
%}
@@ -113,4 +115,4 @@
</table>
%= hidden_field 'trt' => $pf_datas->{trt}
</div>
</div>

View File

@@ -11,4 +11,4 @@
</span>
</p>
<hr class='sectionbar' />
<!--<hr class='sectionbar' />-->

View File

@@ -59,11 +59,11 @@
%= t td => (class => 'sme-border') => "$first $last"
%= t td => (class => 'sme-border') => $vpnaccess
%= t td => (class => 'sme-border') => $fwd
%my ($actionModify, $actionLock, $actionResetPw, $actionRemove,$actionroundcube) = '&nbsp;';
%my $modify_text = l('MODIFY'); # Localized text
%my $csrf_token = "TOKEN"; # CSRF token for security
%my $useraccounts_user_name = $user->key; # useraccountss_entry name extracted from the data structure
%my $password_text = l("PASSWORD_RESET");
% my ($actionModify, $actionLock, $actionResetPw, $actionRemove,$actionroundcube) = '&nbsp;';
% my $modify_text = l('MODIFY'); # Localized text
% my $csrf_token = "TOKEN"; # CSRF token for security
% my $useraccounts_user_name = $user->key; # useraccountss_entry name extracted from the data structure
% my $password_text = l("PASSWORD_RESET");
%if ($useraccounts_user_name eq 'admin') {
%$actionModify = qq{
%<a href="useraccountsd?CsrfDef=$csrf_token&trt=UPS&user=$useraccounts_user_name">
@@ -98,9 +98,9 @@
%</a>
%};
%} elsif ($useraccounts_user_name ne 'admin') {
%my $lock_text = l('ACCOUNT LOCKED'); # Localized text
%my $csrf_token = "TOKEN"; # CSRF token for security
%my $useraccounts_user_name = $user->key; # useraccountss_entry name extracted from the data structure
% my $lock_text = l('ACCOUNT LOCKED'); # Localized text
% my $csrf_token = "TOKEN"; # CSRF token for security
% my $useraccounts_user_name = $user->key; # useraccountss_entry name extracted from the data structure
%$actionLock = qq{
%<a href="useraccountsd?CsrfDef=$csrf_token&trt=LCK&user=$useraccounts_user_name">
% <button type='button' class='sme-lock-button' title='$lock_text' >
@@ -117,8 +117,8 @@
%};
%}
%if ( $removable eq 'yes' ) {
%my $remove_text = l('REMOVE'); # Localized text
%my $csrf_token = "TOKEN"; # CSRF token for security
% my $remove_text = l('REMOVE'); # Localized text
% my $csrf_token = "TOKEN"; # CSRF token for security
%$actionRemove = qq{
%<a href="useraccountsd?CsrfDef=$csrf_token&trt=DEL&user=$useraccounts_user_name">
% <button type='button' class='sme-remove-button' title='$remove_text' >
@@ -128,13 +128,12 @@
%};
%}
%my $thisdomain = session 'SystemName';
%$thisdomain .= ".".session 'DomainName';
%my $roundcube_text = l('Webmail'); # Localized text
%my $csrf_token = "TOKEN"; # CSRF token for security
%my $useraccounts_user_name = $user->key; # useraccountss_entry name extracted from the data structure
%$actionroundcube = qq{
%<a href="roundcubepanel?CsrfDef=$csrf_token&url=https://$thisdomain/roundcube?_user=$useraccounts_user_name">
% my $thisdomain = $c->req->url->to_abs->host;
% my $roundcube_text = l('Webmail'); # Localized text
% $csrf_token = "TOKEN"; # CSRF token for security
% $useraccounts_user_name = $user->key; # useraccountss_entry name extracted from the data structure
% $actionroundcube = qq{
%<a href="roundcubepanel?CsrfDef=$csrf_token&url=https://$thisdomain/roundcube?_user=$useraccounts_user_name&height=600px">
% <button type='button' class='sme-email-button' title='$roundcube_text' >
% $roundcube_text
% </button>
@@ -156,4 +155,4 @@
%= hidden_field 'trt' => $usr_datas->{trt}
</div>
</div>

View File

@@ -1,6 +1,6 @@
% layout 'default', title => "Sme server 2 - qmailanalog";
% content_for 'module' => begin
%= javascript '/js/qmailanalog.js'
<div id='module' class='module qmailanalog-panel'>
%if (config->{debug} == 1) {
<p>
@@ -11,17 +11,34 @@
<br>
<%= $modul %>
<% my $btn = l('qma_GENERATE_REPORT'); %>
%= form_for 'qmailanalog' => (method => 'POST') => begin
<p>
<span class=label>
%=l 'qma_REPORT_TYPE'
</span><span class=data>
<!-- (to be sorted) -->
%= select_field 'report_type' => $c->reportType_list()
</span>
</p>
%= submit_button "$btn", class => 'action'
<p>
<span class=label>
%=l 'qma_REPORT_TYPE'
</span><span class=data>
<!-- (to be sorted) -->
%= select_field 'report_type' => $c->reportType_list(), id => 'analysis_type'
</span>
</p>
<!--And optional parameters, depending on the choice.-->
<div id="message_id_group">
<span class=label>
%= label_for message_id => 'Message ID:'
</span><span class=data>
%= text_field 'message_id', placeholder => 'Enter Postfix Message ID', id => 'message_id_group'
</span>
</div>
<div id="email_address_group">
<span class=label>
%= label_for email_address => 'Email Address:'
</span><span class=data>
%= email_field 'email_address', placeholder => 'Enter email address', id => 'email_address_group'
</span>
</div>
%= submit_button "$btn", class => 'action'
% end
</div>
%end

View File

@@ -17,7 +17,7 @@
</span>
%}
<hr class='sectionbar' />
<!--<hr class='sectionbar' />-->
<% my $btn = l('SAVE'); %>
@@ -50,7 +50,7 @@
</span>
<br><br>
<hr class='sectionbar' />
<!--<hr class='sectionbar' />-->
%}
@@ -85,7 +85,7 @@
%= t td => (class => 'sme-border') => $net
%= t td => (class => 'sme-border') => $mask
%= t td => (class => 'sme-border') => $numhosts
<td class='sme-border'><input type='checkbox' name='Remote_nets' value='<%= $net.'/'.$mask %>'> </td>
<td class='sme-border'><input type='checkbox' name='Remove_nets' value='<%= $net.'/'.$mask %>'> </td>
</tr>
% }
@@ -115,7 +115,7 @@
%= text_field 'ValidFromMask', class => 'input'
</span>
<hr class='sectionbar' />
<!--<hr class='sectionbar' />-->
<h2>
%=l 'rma_TITLE_SSH'
@@ -154,7 +154,7 @@
</span>
<br>
<hr class='sectionbar' />
<!--<hr class='sectionbar' />-->
<h2>
%=l 'rma_TITLE_FTP_ACCESS'
@@ -183,7 +183,7 @@
% my $mode = $c->get_telnet_mode();
% if ( $mode ne 'off') {
<hr class='sectionbar' />
<!--<hr class='sectionbar' />-->
<h2>
%=l 'rma_TITLE_TELNET_ACCESS'

View File

@@ -1,7 +1,7 @@
% layout 'default', title => 'Sme server 2 - Review';
% content_for 'module' => begin
<div id='central' class='central review-panel'>
<div id='central' class='central review-panel module'>
<h1> <%= $title %> </h1>
<%= $modul %><br><br>
@@ -134,4 +134,4 @@
</div>
% end
% end

View File

@@ -3,7 +3,7 @@
% content_for 'module' => begin
<div id='roundcube' class='roundcube roundcube-panel'>
<div id='roundcube' class='roundcube roundcube-panel module'>
% if (config->{debug} == 1) {
<p>
%= dumper $c->current_route
@@ -14,26 +14,27 @@
%= $c->render_to_string(inline => stash 'error')
</div>
%}
<h1> roundcube - <%=$title %></h1><br>
<p>If the roundcube panel does not appear after logging in, then please check your password.</p><br />
<h1><%=$title %></h1><br>
<p>If the Webmail panel does not appear after logging in, then please check your password.</p><br />
% my $thisdomain = session 'SystemName';
% $thisdomain .= ".".session 'DomainName';
% my $thisdomain = $c->req->url->to_abs->host;
% my $url = $c->stash('modul');
% if (!$url) {
% $url = $thisdomain."/roundcube";
%}
% my $username = 'admin';
% if ($url =~ /[?&]_user=([^&]+)/) {
% $username = $1;
%}
<a href="<%= "https://".$thisdomain."/" %>roundcube?_user=<%= $username %>"><button class="sme-fullwindow1-button" width=20em title="<%= l('Full Window') %>"><%= l('Full Window') %></button></a>
% my $height = $c->stash('height') | '600px';
% if ($height !~ /px$/) { $height = $height.'px';}
% if ($url eq "") {
% $url = "https://".$thisdomain."/roundcube";
% if (!($url =~ /https:/)) {
% $url = 'https://' . $url;
%}
<object id="roundcube" class="roundcube" data="<%=$url %>" style="width:99%;height:<%= $height %>;" title="<%= $c->stash('title') %>" type="text/html" ><%= $c->stash('title') %> not found</object>
<div class='roundcube'>
<a href="<%= "https://".$thisdomain."/" %>roundcube?_user=<%= $username %>"><button class="sme-fullwindow1-button" width=20em title="<%= l('Full Window') %>"><%= l('Full Window') %></button></a>
<object id="roundcube" data="<%=$url %>" title="<%= $c->stash('title') %>" type="text/html" ><%= $c->stash('title') %> not found</object>
</div>
</div>
%end
%end

View File

@@ -1,7 +1,7 @@
% layout 'default', title => 'Sme server 2 - IndexT';
% content_for 'module' => begin
<div id='central' class='central welcome-panel'>
<div id='central' class='central welcome-panel module'>
<p>Index on line - Welcome page<br>
</p>
<p>

View File

@@ -2,7 +2,7 @@
% content_for 'module' => begin
<div id="central" class="sme-error">
<div id="central " class="sme-error module">
<p><br>dev<br> What else !!!
The page you were requesting
"<%= $self->req->url->path || '/' %>"
@@ -14,4 +14,4 @@
</p>
</div>
% end
% end

View File

@@ -55,7 +55,7 @@
% end
%}
<br><hr class=sectionbar /><br>
<!--<br><hr class=sectionbar /><br>-->
%= form_for 'yum' => (method => 'POST') => begin
@@ -97,4 +97,4 @@
</div>
% end
% end

View File

@@ -2,7 +2,7 @@ Summary: Sme server navigation module : manager 2
%define name smeserver-manager
Name: %{name}
%define version 11.0.0
%define release 50
%define release 78
Version: %{version}
Release: %{release}%{?dist}
License: GPL
@@ -143,8 +143,110 @@ true
%defattr(-,root,root)
%changelog
* Thu Apr 17 2025 Brian Read <brianr@koozali.org> 11.0.0-78.sme
- typo in remoteaccess panel
- Fix crash in veiwlogfiles if viewlogfiles key not in DB
* Sat Apr 12 2025 Brian Read <brianr@koozali.org> 11.0.0-77.sme
- Sort out local and pulic access setting in remote panel [SME: 12988]
- caching problem, plus confusion between normal and public setting in sshd / access in DB
* Fri Apr 11 2025 Brian Read <brianr@koozali.org> 11.0.0-76.sme
- Restore css for roundcube embedded [SME: 12987]
* Wed Apr 09 2025 Brian Read <brianr@koozali.org> 11.0.0-75.sme
- Move review configuration to behind login [SME: 12984]
- Fix crash in port forwarding [SME: 12985]
* Wed Mar 26 2025 Brian Read <brianr@koozali.org> 11.0.0-74.sme
- Fix error message and success message format in Local Networking panel [SME: 12969]
* Tue Mar 25 2025 Brian Read <brianr@koozali.org> 11.0.0-73.sme
- Some changes to error message format in css.
- Fix DB Cache problem with port forwarding panel [SME: 12970]
- Fix error and success message display for port forwarding panel [SME: 12969]
* Mon Mar 24 2025 Brian Read <brianr@koozali.org> 11.0.0-72.sme
- Remove css files from template structure [SME: 12967]
- Rationalise and merge css files
- Adjust some gaps around panels
- Remove HR lines
* Thu Mar 20 2025 Brian Read <brianr@koozali.org> 11.0.0-71.sme
- Sort out navigation menu error on startup [SME: 12946]
- More places where floating panel needed
- Adjust floating panel to make space around it the same
- clean up some css
* Wed Mar 19 2025 Brian Read <brianr@koozali.org> 11.0.0-70.sme
- Re-cast the default theme - use proper koozali logo image, unwind multiple divs
- Enhance responsiveness
- Revert Ibay menu name to Ibays
- Remove legacy SM1 button on header
- Remove "?" access to wiki help on header
* Mon Mar 17 2025 Brian Read <brianr@koozali.org> 11.0.0-69.sme
- Add a total summary report across all existing logs [SME: 12951]
* Mon Mar 17 2025 Brian Read <brianr@koozali.org> 11.0.0-68.sme
- re-write qmailanalog for postfix [SME: 12951]
- Clean up backup.pm
- Enhance module panel - used by mail log analysis and Licence display
* Tue Mar 11 2025 Brian Read <brianr@koozali.org> 11.0.0-66.sme
- Move the button for each backup panel to the left to conform to all the other panels.
* Sun Mar 09 2025 Brian Read <brianr@koozali.org> 11.0.0-65.sme
- Sort out missing hostname on nfs and cifs workstation backup on error [SME: 12948]
* Sat Mar 08 2025 Brian Read <brianr@koozali.org> 11.0.0-64.sme
- Add code to check for boot phase completion [SME: 12953]
* Thu Mar 06 2025 Brian Read <brianr@koozali.org> 11.0.0-63.sme
- Add boot.svg image to Bug Report panel [SME: 12953]
- Move report template to inside smanager tree
- Add one-off systemd task to create boot.svg run from panel
* Tue Mar 04 2025 Brian Read <brianr@koozali.org> 11.0.0-62.sme
- Update *_en.lex files to conform to standard english punctuation [SME: 11809]
* Tue Mar 04 2025 Brian Read <brianr@koozali.org> 11.0.0-61.sme
- Arrange for the version in the footer to be suppressed if non admin login [SME: 12887]
* Thu Feb 27 2025 Brian Read <brianr@koozali.org> 11.0.0-60.sme
- Enhance ssh security wording to mention autoblock in remoteaccess panel [SME: 8309]
* Thu Feb 27 2025 Brian Read <brianr@koozali.org> 11.0.0-59.sme
- Arrange for Urgent notice to be displayed if date is past Rocky 8 EOL [SME: 12918]
* Tue Feb 25 2025 Brian Read <brianr@koozali.org> 11.0.0-58.sme
- re-organise open db placement [SME: 12695]
- Re-arrange parameters to tar to avoid warning message in logs [SME: 12943]
* Fri Feb 21 2025 Jean-Philippe Pialasse <jpp@koozali.org> 11.0.0-57.sme
- upgrade validate_password sub to use esmith::util [SME: 12937]
and deduplicate code
* Thu Feb 20 2025 Brian Read <brianr@koozali.org> 11.0.0-56.sme
- open db in routes for backup controller file [SME: 12933]
- Fix error handling for pre-backup fail [SME: 12934]
* Tue Feb 18 2025 Brian Read <brianr@koozali.org> 11.0.0-55.sme
- fix public ftp access not showing on panel [SME: 12927]
* Sat Feb 15 2025 Jean-Philippe Pialasse <jpp@koozali.org> 11.0.0-54.sme
- helper to set default value of select field using protected value [SME: 12923]
* Wed Feb 12 2025 Jean-Philippe Pialasse <jpp@koozali.org> 11.0.0-52.sme
- move letsencrypt panel to smeserver-certificates [SME: 12916]
* Mon Feb 10 2025 Brian Read <brianr@koozali.org> 11.0.0-51.sme
- Replace url in call to webmail by browser url rather than system host and domain [SME: 12910]
- Fix up CSS so not inline
- Sort out reveiw panel missing routines from FormMagic [SME: 12907].
* Sun Feb 09 2025 Brian Read <brianr@koozali.org> 11.0.0-50.sme
- Move all routines from FormMagic still called by SM2 panels to SM2 [SME:12906]
- Move all routines from FormMagic still called by SM2 panels to SM2 [SME: 12906]
- delete all references to FormMagic
* Fri Feb 07 2025 Brian Read <brianr@koozali.org> 11.0.0-49.sme