Compare commits
44 Commits
11_0_0-50_
...
11_0_0-86_
Author | SHA1 | Date | |
---|---|---|---|
![]() |
d993bd9d19 | ||
![]() |
a31806f205 | ||
b44f1c5000 | |||
2538ac9ea0 | |||
dbfeaa18a3 | |||
ced08b28d4 | |||
c74a71dee1 | |||
96b002e7a9 | |||
f30b4ab2b5 | |||
fa286e966d | |||
9bb2128891 | |||
accf96df0d | |||
1c601f0ace | |||
cffbe53fb4 | |||
aad1a458f4 | |||
252bf20410 | |||
ebbe7af9a7 | |||
36de44fcef | |||
750ab7dd11 | |||
77ca17c851 | |||
535d78eacb | |||
88ee369253 | |||
5be2152e89 | |||
63973f2bb4 | |||
82ff48e641 | |||
c5d863b3a0 | |||
4f00dfbdb1 | |||
f9bf8cf064 | |||
4f0617f6c3 | |||
4c94d768e2 | |||
1731f75cba | |||
5fe285f9f2 | |||
1c93be6e8a | |||
ce96f72726 | |||
0fd7137edd | |||
d179b06f69 | |||
c2427189d5 | |||
887af04bfe | |||
34b85b1cde | |||
a5758b4431 | |||
58aa423089 | |||
c0b4d1f90e | |||
a979d472e8 | |||
d776f20736 |
12
createlinks
12
createlinks
@@ -8,12 +8,12 @@ use esmith::Build::CreateLinks qw(:all);
|
||||
my $mngrdir = '/usr/share/smanager';
|
||||
|
||||
# templates to expand
|
||||
for ( qw( sme_core.css sme_main.css sme_menu.css styles.css ) )
|
||||
{
|
||||
templates2events("$mngrdir/themes/default/public/css/$_", qw(
|
||||
bootstrap-console-save smeserver-manager-update
|
||||
));
|
||||
}
|
||||
#for ( qw( sme_core.css sme_main.css sme_menu.css styles.css ) )
|
||||
#{
|
||||
# templates2events("$mngrdir/themes/default/public/css/$_", qw(
|
||||
# bootstrap-console-save smeserver-manager-update
|
||||
# ));
|
||||
#}
|
||||
|
||||
templates2events("$mngrdir/conf/srvmngr.conf",
|
||||
qw( smeserver-manager-update smanager-theme-change smanager-modify bootstrap-console-save ));
|
||||
|
@@ -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
|
||||
}
|
@@ -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
|
||||
}
|
@@ -1 +0,0 @@
|
||||
/* DO NOT MODIFY THIS FILE! It is updated automatically */
|
@@ -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
|
||||
}
|
@@ -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
|
||||
}
|
||||
|
@@ -1 +0,0 @@
|
||||
/* DO NOT MODIFY THIS FILE! It is updated automatically */
|
@@ -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
|
||||
}
|
@@ -1 +0,0 @@
|
||||
/* DO NOT MODIFY THIS FILE! It is updated automatically */
|
@@ -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
|
||||
}
|
@@ -1 +0,0 @@
|
||||
/* DO NOT MODIFY THIS FILE! It is updated automatically */
|
9
root/usr/lib/systemd/system/bootsequence.service
Normal file
9
root/usr/lib/systemd/system/bootsequence.service
Normal file
@@ -0,0 +1,9 @@
|
||||
[Unit]
|
||||
Description=Koozali SME Server boot diagnostic tool
|
||||
After=sme-server.target
|
||||
PartOf=sme-server.target
|
||||
|
||||
[Service]
|
||||
Type=oneshot
|
||||
ExecStart=/bin/sh -c "/usr/bin/systemd-analyze plot > /usr/share/smanager/themes/default/public/images/boot.svg"
|
||||
RemainAfterExit=yes
|
@@ -30,8 +30,11 @@ use SrvMngr::Plugin::WithoutCache;
|
||||
|
||||
use esmith::I18N;
|
||||
|
||||
# Import the function(s) you need
|
||||
use SrvMngr_Auth qw(check_admin_access);
|
||||
|
||||
#this is overwrittrn with the "release" by the spec file - release can be "99.el8.sme"
|
||||
our $VERSION = '50.el8.sme';
|
||||
our $VERSION = '78.el8.sme';
|
||||
#Extract the release value
|
||||
if ($VERSION =~ /^(\d+)/) {
|
||||
$VERSION = $1; # $1 contains the matched numeric digits
|
||||
@@ -43,10 +46,10 @@ $VERSION = eval $VERSION;
|
||||
use Exporter 'import';
|
||||
our @EXPORT_OK = qw(
|
||||
init_session get_mod_url theme_list
|
||||
getNavigation ip_number is_normal_password email_simple
|
||||
getNavigation ip_number validate_password is_normal_password email_simple
|
||||
mac_address_or_blank mac_address ip_number_or_blank
|
||||
lang_space get_routes_list subnet_mask get_reg_mask
|
||||
gen_locale_date_string get_public_ip_address
|
||||
gen_locale_date_string get_public_ip_address simpleNavMerge
|
||||
);
|
||||
|
||||
has home => sub {
|
||||
@@ -212,6 +215,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;
|
||||
});
|
||||
|
||||
}
|
||||
|
||||
|
||||
@@ -285,10 +304,11 @@ sub setup_routing {
|
||||
$if_logged_in->get('/userpassword')->to('userpassword#main')->name('passwd');
|
||||
$if_logged_in->post('/userpassword')->to('userpassword#change_password')->name('passwd2');
|
||||
|
||||
my $if_admin = $r->under( sub {
|
||||
my $c =shift;
|
||||
return $c->is_admin || $c->auth_fail($c->l("acs_ADMIN"));
|
||||
});
|
||||
my $if_admin = $r->under( sub {
|
||||
my $c = shift;
|
||||
# Call the imported function directly
|
||||
return check_admin_access($c) || $c->auth_fail($c->l("acs_ADMIN"));
|
||||
});
|
||||
|
||||
$if_admin->get('/backup')->to('backup#main')->name('backup');
|
||||
$if_admin->post('/backup')->to('backup#do_display')->name('backupd');
|
||||
@@ -533,9 +553,10 @@ sub getNavigation {
|
||||
|
||||
use esmith::NavigationDB;
|
||||
|
||||
my $c = shift;
|
||||
my $class = shift; #not the controller as it is called as an external, not part of the controller.
|
||||
my $lang = shift || 'en-us';
|
||||
my $menu = shift || 'N';
|
||||
my $username = shift || ''; #Username when logged in as a user not admin
|
||||
|
||||
# my $lang = $c->session->{lang} || 'en-us';
|
||||
|
||||
@@ -544,13 +565,33 @@ sub getNavigation {
|
||||
|
||||
my @files = ();
|
||||
my %files_hash = ();
|
||||
|
||||
# Added: Store allowed admin panels for non-admin users
|
||||
my @allowed_admin_panels = ();
|
||||
my $is_admin = 1; # Default to admin (full access)
|
||||
|
||||
# Added: Check if user is non-admin and get their allowed panels
|
||||
if ($username ne '') {
|
||||
# Get the AccountsDB to check user permissions
|
||||
my $accountsdb = esmith::AccountsDB->open_ro() or
|
||||
die "Couldn't open AccountsDB\n";
|
||||
|
||||
# Check if user has AdminPanels property
|
||||
my $user_rec = $accountsdb->get($username);
|
||||
if (defined $user_rec && $user_rec->prop('AdminPanels')) {
|
||||
$is_admin = 0; # User is non-admin with specific panel access
|
||||
# Get comma-separated list of allowed admin panels
|
||||
my $admin_panels = $user_rec->prop('AdminPanels');
|
||||
@allowed_admin_panels = split(/,/, $admin_panels);
|
||||
}
|
||||
}
|
||||
|
||||
#-----------------------------------------------------
|
||||
# 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)(-.*)?)";
|
||||
|
||||
@@ -622,70 +663,110 @@ sub getNavigation {
|
||||
}
|
||||
|
||||
foreach my $file (keys %files_hash)
|
||||
{
|
||||
#my $heading = 'Unknown';
|
||||
my $heading = 'Legacy';
|
||||
|
||||
my $description = $file;
|
||||
my $headingWeight = 99999;
|
||||
my $descriptionWeight = 99999;
|
||||
my $urlpath = '';
|
||||
my $menucat = 'A'; # admin menu (default)
|
||||
{
|
||||
#my $heading = 'Unknown';
|
||||
my $heading = 'Legacy';
|
||||
|
||||
my $description = $file;
|
||||
my $headingWeight = 99999;
|
||||
my $descriptionWeight = 99999;
|
||||
my $urlpath = '';
|
||||
my $menucat = 'A'; # admin menu (default)
|
||||
|
||||
my $rec = $navdb->get($file);
|
||||
my $rec = $navdb->get($file);
|
||||
|
||||
if (defined $rec)
|
||||
{
|
||||
$heading = $rec->prop('Heading');
|
||||
$description = $rec->prop('Description');
|
||||
$headingWeight = $rec->prop('HeadingWeight') || 99999; #Stop noise in logs if file in dir does not have nav header.
|
||||
$descriptionWeight = $rec->prop('DescriptionWeight');
|
||||
$urlpath = $rec->prop('UrlPath') || '';
|
||||
$menucat = $rec->prop('MenuCat') || 'A'; # admin menu (default)
|
||||
}
|
||||
next if $menu ne $menucat;
|
||||
if (defined $rec)
|
||||
{
|
||||
$heading = $rec->prop('Heading');
|
||||
$description = $rec->prop('Description');
|
||||
$headingWeight = $rec->prop('HeadingWeight') || 99999; #Stop noise in logs if file in dir does not have nav header.
|
||||
$descriptionWeight = $rec->prop('DescriptionWeight');
|
||||
$urlpath = $rec->prop('UrlPath') || '';
|
||||
$menucat = $rec->prop('MenuCat') || 'A'; # admin menu (default)
|
||||
}
|
||||
|
||||
# Added: Check if this is an admin menu item and if user has access
|
||||
if ($menucat eq 'A' && !$is_admin) {
|
||||
# Skip this admin panel if user doesn't have access to it
|
||||
my $has_access = 0;
|
||||
my $file_no_ext = $file;
|
||||
$file_no_ext =~ s/\.pm$//; # Remove .pm extension if present
|
||||
foreach my $allowed_panel (@allowed_admin_panels) {
|
||||
if ($file_no_ext eq lc($allowed_panel)) {
|
||||
#die("Here!!$file $file_no_ext $allowed_panel ");
|
||||
$has_access = 1;
|
||||
last;
|
||||
}
|
||||
}
|
||||
next if !$has_access;
|
||||
}
|
||||
|
||||
#--------------------------------------------------
|
||||
# add heading, description and weight information to data structure
|
||||
#--------------------------------------------------
|
||||
next if $menu ne $menucat;
|
||||
|
||||
unless (exists $nav {$heading})
|
||||
{
|
||||
$nav {$heading} = { COUNT => 0, WEIGHT => 0, DESCRIPTIONS => [] };
|
||||
}
|
||||
#--------------------------------------------------
|
||||
# add heading, description and weight information to data structure
|
||||
#--------------------------------------------------
|
||||
|
||||
$nav {$heading} {'COUNT'} ++;
|
||||
$nav {$heading} {'WEIGHT'} += $headingWeight;
|
||||
unless (exists $nav {$heading})
|
||||
{
|
||||
$nav {$heading} = { COUNT => 0, WEIGHT => 0, DESCRIPTIONS => [] };
|
||||
}
|
||||
|
||||
# Check for manager panel, and assign the appropriate
|
||||
# cgi-bin prefix for the links.
|
||||
# Grab the last 2 directories by splitting for '/'s and
|
||||
# then concatenating the last 2
|
||||
# probably a better way, but I don't know it.
|
||||
$nav {$heading} {'COUNT'} ++;
|
||||
$nav {$heading} {'WEIGHT'} += $headingWeight;
|
||||
|
||||
my $path;
|
||||
if ( $files_hash{$file} eq 'ctrl') {
|
||||
$path = "2";
|
||||
} elsif ( $files_hash{$file} eq 'cgim') {
|
||||
$path = "/cgi-bin";
|
||||
} else {
|
||||
my @filename = split /\//, $files_hash{$file};
|
||||
$path = "/$filename[scalar @filename - 2]/$filename[scalar @filename - 1]";
|
||||
};
|
||||
# Check for manager panel, and assign the appropriate
|
||||
# cgi-bin prefix for the links.
|
||||
# Grab the last 2 directories by splitting for '/'s and
|
||||
# then concatenating the last 2
|
||||
# probably a better way, but I don't know it.
|
||||
|
||||
push @{ $nav {$heading} {'DESCRIPTIONS'} },
|
||||
{ DESCRIPTION => $description,
|
||||
WEIGHT => $descriptionWeight,
|
||||
FILENAME => $urlpath ? $urlpath : "$path/$file",
|
||||
CGIPATH => $path,
|
||||
MENUCAT => $menucat
|
||||
my $path;
|
||||
if ( $files_hash{$file} eq 'ctrl') {
|
||||
$path = "2";
|
||||
} elsif ( $files_hash{$file} eq 'cgim') {
|
||||
$path = "/cgi-bin";
|
||||
} else {
|
||||
my @filename = split /\//, $files_hash{$file};
|
||||
$path = "/$filename[scalar @filename - 2]/$filename[scalar @filename - 1]";
|
||||
};
|
||||
|
||||
push @{ $nav {$heading} {'DESCRIPTIONS'} },
|
||||
{ DESCRIPTION => $description,
|
||||
WEIGHT => $descriptionWeight,
|
||||
FILENAME => $urlpath ? $urlpath : "$path/$file",
|
||||
CGIPATH => $path,
|
||||
MENUCAT => $menucat
|
||||
};
|
||||
}
|
||||
|
||||
return \%nav;
|
||||
|
||||
}
|
||||
|
||||
sub simpleNavMerge {
|
||||
#Used to merge two nav structures - used for the user and selected admin menu.
|
||||
my ($class,$nav1, $nav2) = @_;
|
||||
my %result = %$nav1; # Start with a copy of first nav
|
||||
|
||||
# Merge in second nav
|
||||
foreach my $heading (keys %$nav2) {
|
||||
if (exists $result{$heading}) {
|
||||
# Add counts and weights
|
||||
$result{$heading}{COUNT} += $nav2->{$heading}{COUNT};
|
||||
$result{$heading}{WEIGHT} += $nav2->{$heading}{WEIGHT};
|
||||
# Append descriptions
|
||||
push @{$result{$heading}{DESCRIPTIONS}}, @{$nav2->{$heading}{DESCRIPTIONS}};
|
||||
} else {
|
||||
# Just copy the heading
|
||||
$result{$heading} = $nav2->{$heading};
|
||||
}
|
||||
}
|
||||
|
||||
return \%result;
|
||||
}
|
||||
|
||||
|
||||
|
||||
sub _lang_space {
|
||||
|
||||
@@ -772,7 +853,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 +909,6 @@ sub get_public_ip_address
|
||||
return undef;
|
||||
}
|
||||
|
||||
|
||||
sub email_simple {
|
||||
my ($c, $data) = @_;
|
||||
|
||||
|
@@ -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;
|
@@ -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;
|
@@ -70,7 +70,7 @@ sub do_update {
|
||||
} else {
|
||||
$dat_datas{ntpserver} = ($cdb->get_prop('ntpd', 'NTPServer')) || '';
|
||||
}
|
||||
$dat_datas{now_string} = esmith::FormMagick->gen_locale_date_string();
|
||||
$dat_datas{now_string} = gen_locale_date_string();
|
||||
$c->stash(title => $title, modul => $modul, dat_datas => \%dat_datas);
|
||||
return $c->render('datetime');
|
||||
} ## end if ($dat_datas{ntpstatus...})
|
||||
|
@@ -12,13 +12,15 @@ use warnings;
|
||||
use Mojo::Base 'Mojolicious::Controller';
|
||||
use Locale::gettext;
|
||||
use SrvMngr::I18N;
|
||||
use esmith::ConfigDB::UTF8;
|
||||
use SrvMngr qw(theme_list init_session);
|
||||
|
||||
our $db = esmith::ConfigDB->open() || die "Couldn't open config db";
|
||||
our $db;
|
||||
|
||||
sub main {
|
||||
my $c = shift;
|
||||
$c->app->log->info($c->log_req);
|
||||
$db = esmith::ConfigDB::UTF8->open() || die "Couldn't open config db";
|
||||
my %dir_datas = ();
|
||||
my $title = $c->l('dir_FORM_TITLE');
|
||||
my $modul = $c->render_to_string(inline => $c->l('dir_DESCRIPTION'));
|
||||
|
@@ -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()
|
||||
|
||||
|
@@ -1,566 +0,0 @@
|
||||
#
|
||||
# Generated by SM2Gen version:0.8 Chameleon version:4.5.4 On Python:3.12.3 at 2024-11-16 10:30:16
|
||||
#
|
||||
#
|
||||
# Routines to be edited by the developer to provide content and validation for parameters
|
||||
# and provison of the control data for table(s)
|
||||
#
|
||||
use esmith::util;
|
||||
use esmith::util::network;
|
||||
use esmith::ConfigDB;
|
||||
use esmith::HostsDB;
|
||||
use esmith::AccountsDB;
|
||||
use esmith::NetworksDB;
|
||||
use esmith::DomainsDB;
|
||||
use constant FALSE => 0;
|
||||
use constant TRUE => 1;
|
||||
|
||||
#The most common ones
|
||||
our $cdb = esmith::ConfigDB->open() || die("Couldn't open config db");
|
||||
our $adb = esmith::AccountsDB->open() || die("Couldn't open Accounts db");
|
||||
our $ndb = esmith::NetworksDB->open() || die("Couldn't open Network db");
|
||||
our $hdb = esmith::HostsDB->open() || die("Couldn't open Hosts db");
|
||||
our $ddb = esmith::DomainsDB->open() || die("Couldn't open Domains db");
|
||||
|
||||
# Validation routines - parameters for each panel
|
||||
sub validate_LIST {
|
||||
my $c = shift;
|
||||
my $prefix_data = shift; #Data hash as parameter
|
||||
# Validation for each field
|
||||
my $ret = "";
|
||||
|
||||
if (!TRUE) #validate $c->param('InternalIP')
|
||||
{
|
||||
$ret .= 'Validation for InternalIP failed';
|
||||
}
|
||||
|
||||
if (!TRUE) #validate $c->param('ExternalIP')
|
||||
{
|
||||
$ret .= 'Validation for ExternalIP failed';
|
||||
}
|
||||
|
||||
if (!TRUE) #validate $c->param('InternetIP')
|
||||
{
|
||||
$ret .= 'Validation for InternetIP failed';
|
||||
}
|
||||
|
||||
if (!TRUE) #validate $c->param('Issuer')
|
||||
{
|
||||
$ret .= 'Validation for Issuer failed';
|
||||
}
|
||||
|
||||
if (!TRUE) #validate $c->param('Expiry')
|
||||
{
|
||||
$ret .= 'Validation for Expiry failed';
|
||||
}
|
||||
|
||||
if (!TRUE) #validate $c->param('NotBefore')
|
||||
{
|
||||
$ret .= 'Validation for NotBefore failed';
|
||||
}
|
||||
if ($ret eq "") { $ret = 'ok'; }
|
||||
return $ret;
|
||||
} ## end sub validate_LIST
|
||||
|
||||
sub validate_PARAMS {
|
||||
my $c = shift;
|
||||
my $prefix_data = shift; #Data hash as parameter
|
||||
# Validation for each field
|
||||
my $ret = "";
|
||||
|
||||
if (!TRUE) #validate $c->param('status')
|
||||
{
|
||||
$ret .= 'Validation for status failed';
|
||||
}
|
||||
|
||||
if (!TRUE) #validate $c->param('hookScript')
|
||||
{
|
||||
$ret .= 'Validation for hookScript failed';
|
||||
}
|
||||
|
||||
if (!TRUE) #validate $c->param('hostOverride')
|
||||
{
|
||||
$ret .= 'Validation for hostOverride failed';
|
||||
}
|
||||
|
||||
if (!TRUE) #validate $c->param('ACCEPT_TERMS')
|
||||
{
|
||||
$ret .= 'Validation for ACCEPT_TERMS failed';
|
||||
}
|
||||
|
||||
if (!TRUE) #validate $c->param('API')
|
||||
{
|
||||
$ret .= 'Validation for API failed';
|
||||
}
|
||||
|
||||
if (!TRUE) #validate $c->param('keysize')
|
||||
{
|
||||
$ret .= 'Validation for keysize failed';
|
||||
}
|
||||
|
||||
if (!TRUE) #validate $c->param('configure')
|
||||
{
|
||||
$ret .= 'Validation for configure failed';
|
||||
}
|
||||
|
||||
if (!TRUE) #validate $c->param('Email')
|
||||
{
|
||||
$ret .= 'Validation for Email failed';
|
||||
}
|
||||
if ($ret eq "") { $ret = 'ok'; }
|
||||
return $ret;
|
||||
} ## end sub validate_PARAMS
|
||||
|
||||
sub validate_CHECKALLDOMAINS {
|
||||
my $c = shift;
|
||||
my $prefix_data = shift; #Data hash as parameter
|
||||
# Validation for each field
|
||||
my $ret = "";
|
||||
|
||||
if (!TRUE) #validate $c->param('AllDomainsCheck')
|
||||
{
|
||||
$ret .= 'Validation for AllDomainsCheck failed';
|
||||
}
|
||||
if ($ret eq "") { $ret = 'ok'; }
|
||||
return $ret;
|
||||
} ## end sub validate_CHECKALLDOMAINS
|
||||
|
||||
sub validate_CHECKALLENABLEDDOMAINS {
|
||||
my $c = shift;
|
||||
my $prefix_data = shift; #Data hash as parameter
|
||||
# Validation for each field
|
||||
my $ret = "";
|
||||
|
||||
if (!TRUE) #validate $c->param('EnabledDomainsCheck')
|
||||
{
|
||||
$ret .= 'Validation for EnabledDomainsCheck failed';
|
||||
}
|
||||
if ($ret eq "") { $ret = 'ok'; }
|
||||
return $ret;
|
||||
} ## end sub validate_CHECKALLENABLEDDOMAINS
|
||||
|
||||
sub validate_CHECKONEDOMAIN {
|
||||
my $c = shift;
|
||||
my $prefix_data = shift; #Data hash as parameter
|
||||
# Validation for each field
|
||||
my $ret = "";
|
||||
|
||||
if (!TRUE) #validate $c->param('OneDomainToCheck')
|
||||
{
|
||||
$ret .= 'Validation for OneDomainToCheck failed';
|
||||
}
|
||||
|
||||
if (!TRUE) #validate $c->param('OneDomainsCheck')
|
||||
{
|
||||
$ret .= 'Validation for OneDomainsCheck failed';
|
||||
}
|
||||
if ($ret eq "") { $ret = 'ok'; }
|
||||
return $ret;
|
||||
} ## end sub validate_CHECKONEDOMAIN
|
||||
|
||||
# Get singleton data for each panel
|
||||
sub get_data_for_panel_LIST {
|
||||
|
||||
# Return a hash with the fields required which will be loaded into the shared data
|
||||
my $c = shift;
|
||||
|
||||
# my ($reply, $err, $server_cert) = Net::SSLeay::sslcat('localhost', 443, '/');
|
||||
# my $issuer = Net::SSLeay::X509_NAME_oneline(Net::SSLeay::X509_get_issuer_name($server_cert));
|
||||
# my $before = Net::SSLeay::P_ASN1_TIME_get_isotime(Net::SSLeay::X509_get_notBefore($server_cert));
|
||||
# my $expiry = Net::SSLeay::P_ASN1_TIME_get_isotime(Net::SSLeay::X509_get_notAfter($server_cert));
|
||||
my %ret = (
|
||||
'Data1' => 'Data for LIST', #Example
|
||||
# fields from Inputs in LIST $fields['LIST']
|
||||
'InternalIP' => $cdb->get_prop('InternalInterface', 'IPAddress'),
|
||||
'ExternalIP' => $cdb->get_prop('ExternalInterface', 'IPAddress'),
|
||||
'InternetIP' => $c->get_my_ip(),
|
||||
'Issuer' => '$issuer',
|
||||
'Expiry' => '$expiry',
|
||||
'NotBefore' => '$before',
|
||||
);
|
||||
return %ret;
|
||||
} ## end sub get_data_for_panel_LIST
|
||||
|
||||
sub get_data_for_panel_PARAMS {
|
||||
|
||||
# Return a hash with the fields required which will be loaded into the shared data
|
||||
my $c = shift;
|
||||
my %ret = (
|
||||
'Data1' => 'Data for PARAMS', #Example
|
||||
# fields from Inputs in PARAMS $fields['PARAMS']
|
||||
'status' => $cdb->get_prop('letsencrypt', 'status', 'disabled'),
|
||||
'hookScript' => $cdb->get_prop('letsencrypt', 'hookScript', 'disabled'),
|
||||
'hostOverride' => $cdb->get_prop('letsencrypt', 'hostOverride', 'disabled'),
|
||||
'ACCEPT_TERMS' => $cdb->get_prop('letsencrypt', 'ACCEPT_TERMS', ''),
|
||||
'API' => $cdb->get_prop('letsencrypt', 'API', '2'),
|
||||
'keysize' => $cdb->get_prop('letsencrypt', 'keysize', '4096'),
|
||||
'configure' => $cdb->get_prop('letsencrypt', 'configure', 'none'),
|
||||
'email' => $cdb->get_prop('letsencrypt', 'email')
|
||||
);
|
||||
return %ret;
|
||||
} ## end sub get_data_for_panel_PARAMS
|
||||
|
||||
sub get_data_for_panel_CHECKALLDOMAINS {
|
||||
|
||||
# Return a hash with the fields required which will be loaded into the shared data
|
||||
my $c = shift;
|
||||
my %ret = (
|
||||
'Data1' => 'Data for CHECKALLDOMAINS', #Example
|
||||
# fields from Inputs in CHECKALLDOMAINS $fields['CHECKALLDOMAINS']
|
||||
'AllDomainsCheck' => $c->update_all_domains(),
|
||||
);
|
||||
return %ret;
|
||||
} ## end sub get_data_for_panel_CHECKALLDOMAINS
|
||||
|
||||
sub get_data_for_panel_CHECKALLENABLEDDOMAINS {
|
||||
|
||||
# Return a hash with the fields required which will be loaded into the shared data
|
||||
my $c = shift;
|
||||
my %ret = (
|
||||
'Data1' => 'Data for CHECKALLENABLEDDOMAINS', #Example
|
||||
# fields from Inputs in CHECKALLENABLEDDOMAINS $fields['CHECKALLENABLEDDOMAINS']
|
||||
'EnabledDomainsCheck' => $c->update_enabled_domains(),
|
||||
);
|
||||
return %ret;
|
||||
} ## end sub get_data_for_panel_CHECKALLENABLEDDOMAINS
|
||||
|
||||
sub get_data_for_panel_CHECKONEDOMAIN {
|
||||
|
||||
# Return a hash with the fields required which will be loaded into the shared data
|
||||
my $c = shift;
|
||||
my %ret = (
|
||||
'Data1' => 'Data for CHECKONEDOMAIN', #Example
|
||||
# fields from Inputs in CHECKONEDOMAIN $fields['CHECKONEDOMAIN']
|
||||
'OneDomainToCheck' => $c->param("CHECKONEDOMAIN"),
|
||||
'OneDomainsCheck' => $c->update_one_domain($c->param("CHECKONEDOMAIN"))
|
||||
);
|
||||
return %ret;
|
||||
} ## end sub get_data_for_panel_CHECKONEDOMAIN
|
||||
|
||||
# Get control data for table(s)
|
||||
# Define a constant hash for field name mapping
|
||||
use constant DomainList_FIELD_MAPPING => (
|
||||
'Table1-Domain name / HOSTNAME' => 'Domain',
|
||||
'Table1-Brief description' => 'Description',
|
||||
'Table1-Content' => 'Content',
|
||||
'Table1-LABEL_NAMESERVERS' => 'Nameservers',
|
||||
'Table1-LABEL_POINT' => 'Source-for-Table1-LABEL_POINT',
|
||||
'Table1-LABEL_LECERT' => 'letsencryptSSLcert',
|
||||
'Table1-IS_IN_CERT' => 'isincert',
|
||||
'Table1-CHECK' => 'Check'
|
||||
|
||||
#'target_field2' => 'source_field2',
|
||||
# Add more mappings as needed
|
||||
);
|
||||
use constant TEST_DOMAIN_LIST => (
|
||||
{ "domain" => "Domain1", "fred" => "fred1", "description" => "Description1" },
|
||||
{ "domain" => "Domain2", "fred" => "fred2", "description" => "Description2" },
|
||||
{ "domain" => "Domain3", "fred" => "fred3", "description" => "Description3" },
|
||||
|
||||
# Add more test entries as needed
|
||||
);
|
||||
|
||||
sub actual_DomainList {
|
||||
my $c = shift;
|
||||
|
||||
# Actual code for extracting DomainList
|
||||
my @list = ();
|
||||
|
||||
# my @rv = Net::SSLeay::X509_get_subjectAltNames($server_cert);
|
||||
# foreach my $element (@rv) {
|
||||
# next if $element =~ /^\d+$/; ;
|
||||
# #print $element . "\n";
|
||||
# push @list, $element;
|
||||
# }
|
||||
my @data = ();
|
||||
my $check = $c->l('Check Domain');
|
||||
|
||||
for ($ddb->domains) {
|
||||
my $ns = $_->prop('Nameservers') || 'internet';
|
||||
my $le = $_->prop('letsencryptSSLcert') || 'disabled'; #letsencrypt configure all
|
||||
my $dname = $_->key;
|
||||
my $isincert = "N";
|
||||
my $link = $c->create_link("letsencryptd", "CHECKONEDOMAIN", "");
|
||||
my $checklink = "<a href='" . $link . "&CHECKONEDOMAIN=" . $_->key . "'>" . $check . "</a>";
|
||||
|
||||
#my $checklink = "<a href=''>check</a>";
|
||||
$isincert = "Y" if ($dname ~~ @list);
|
||||
|
||||
# domain
|
||||
push @data,
|
||||
{
|
||||
Domain => $_->key,
|
||||
$_->props,
|
||||
letsencryptSSLcert => $le,
|
||||
isincert => $isincert,
|
||||
Check => $checklink,
|
||||
Nameservers => $ns,
|
||||
};
|
||||
|
||||
#and hosts
|
||||
for my $h ($hdb->get_hosts_by_domain($dname)) {
|
||||
next if $ddb->get($h->key);
|
||||
next unless ($h->prop('HostType') eq "Self" || $h->prop('HostType') eq "Local");
|
||||
$le = $h->prop('letsencryptSSLcert') || 'disabled'; #letsencrypt configure all
|
||||
$isincert = "N";
|
||||
$isincert = "Y" if ($h->key ~~ @list);
|
||||
push @data, {
|
||||
Domain => "--> " . $h->key,
|
||||
$h->props,
|
||||
Description => $h->prop('ExternalIP') || $h->prop('InternalIP') || "",
|
||||
Content => $h->prop('HostType'),
|
||||
isincert => $isincert,
|
||||
Check => "", #$checklink
|
||||
Nameservers => $c->l($ns),
|
||||
};
|
||||
} ## end for my $h ($hdb->get_hosts_by_domain...)
|
||||
} ## end for ($ddb->domains)
|
||||
return @data;
|
||||
} ## end sub actual_DomainList
|
||||
|
||||
sub get_DomainList {
|
||||
|
||||
# Return an array of hashes of the contents for each row and column for DomainList
|
||||
my $c = shift;
|
||||
my @source_records
|
||||
= $c->actual_DomainList(); #TEST_DOMAIN_LIST #Replace by code or call to produce contents of table;
|
||||
my @transformed_records;
|
||||
my %Field_Mapping = DomainList_FIELD_MAPPING;
|
||||
|
||||
# Iterate over each record in the source array
|
||||
for my $source_record (@source_records) {
|
||||
my %transformed_record;
|
||||
|
||||
# Iterate over each key-value pair in the $Field_Mapping constant
|
||||
while (my ($target, $source) = each %Field_Mapping) {
|
||||
|
||||
# Check if the source field exists in the source record
|
||||
if (exists $source_record->{$source}) {
|
||||
|
||||
# Assign the source field value to the target field in the transformed record
|
||||
$transformed_record{$target} = $source_record->{$source};
|
||||
}
|
||||
} ## end while (my ($target, $source...))
|
||||
|
||||
# Add transformed record to the array if it's not empty
|
||||
push @transformed_records, \%transformed_record if %transformed_record;
|
||||
} ## end for my $source_record (...)
|
||||
return \@transformed_records;
|
||||
} ## end sub get_DomainList
|
||||
|
||||
# Return hash with values from row in which link clicked on table
|
||||
sub get_selected_LIST {
|
||||
my $c = shift;
|
||||
my $selected = shift; #Parameter is name of selected row.
|
||||
my $is_new_record = shift; #Indicates new record required (defaults)
|
||||
my %ret = {};
|
||||
return %ret;
|
||||
} ## end sub get_selected_LIST
|
||||
|
||||
sub get_selected_PARAMS {
|
||||
my $c = shift;
|
||||
my $selected = shift; #Parameter is name of selected row.
|
||||
my $is_new_record = shift; #Indicates new record required (defaults)
|
||||
my %ret = {};
|
||||
return %ret;
|
||||
} ## end sub get_selected_PARAMS
|
||||
|
||||
sub get_selected_CHECKALLDOMAINS {
|
||||
my $c = shift;
|
||||
my $selected = shift; #Parameter is name of selected row.
|
||||
my $is_new_record = shift; #Indicates new record required (defaults)
|
||||
my %ret = {};
|
||||
return %ret;
|
||||
} ## end sub get_selected_CHECKALLDOMAINS
|
||||
|
||||
sub get_selected_CHECKALLENABLEDDOMAINS {
|
||||
my $c = shift;
|
||||
my $selected = shift; #Parameter is name of selected row.
|
||||
my $is_new_record = shift; #Indicates new record required (defaults)
|
||||
my %ret = {};
|
||||
return %ret;
|
||||
} ## end sub get_selected_CHECKALLENABLEDDOMAINS
|
||||
|
||||
sub get_selected_CHECKONEDOMAIN {
|
||||
my $c = shift;
|
||||
my $selected = shift; #Parameter is name of selected row.
|
||||
my $is_new_record = shift; #Indicates new record required (defaults)
|
||||
my %ret = {};
|
||||
return %ret;
|
||||
} ## end sub get_selected_CHECKONEDOMAIN
|
||||
|
||||
#after sucessful modify or create or whatever and submit then perfom (if the params validate)
|
||||
sub perform_LIST {
|
||||
my $c = shift;
|
||||
my $prefix_data = shift; #Data hash as parameter
|
||||
my $ret = "";
|
||||
my $db = $cdb; #maybe one of the others
|
||||
my $dbkey = 'ChangeThis';
|
||||
|
||||
if (!TRUE
|
||||
) #copy or perform with value: InternalIP e.g. $db->set_prop($dbkey,'InternalIP',$c->param('InternalIP'),type=>'service'))
|
||||
{
|
||||
$ret .= 'Perform/save failed for InternalIP';
|
||||
} ## end if (!TRUE)
|
||||
|
||||
if (!TRUE
|
||||
) #copy or perform with value: ExternalIP e.g. $db->set_prop($dbkey,'ExternalIP',$c->param('ExternalIP'),type=>'service'))
|
||||
{
|
||||
$ret .= 'Perform/save failed for ExternalIP';
|
||||
} ## end if (!TRUE)
|
||||
|
||||
if (!TRUE
|
||||
) #copy or perform with value: InternetIP e.g. $db->set_prop($dbkey,'InternetIP',$c->param('InternetIP'),type=>'service'))
|
||||
{
|
||||
$ret .= 'Perform/save failed for InternetIP';
|
||||
} ## end if (!TRUE)
|
||||
|
||||
if (!TRUE
|
||||
) #copy or perform with value: Issuer e.g. $db->set_prop($dbkey,'Issuer',$c->param('Issuer'),type=>'service'))
|
||||
{
|
||||
$ret .= 'Perform/save failed for Issuer';
|
||||
} ## end if (!TRUE)
|
||||
|
||||
if (!TRUE
|
||||
) #copy or perform with value: Expiry e.g. $db->set_prop($dbkey,'Expiry',$c->param('Expiry'),type=>'service'))
|
||||
{
|
||||
$ret .= 'Perform/save failed for Expiry';
|
||||
} ## end if (!TRUE)
|
||||
|
||||
if (!TRUE
|
||||
) #copy or perform with value: NotBefore e.g. $db->set_prop($dbkey,'NotBefore',$c->param('NotBefore'),type=>'service'))
|
||||
{
|
||||
$ret .= 'Perform/save failed for NotBefore';
|
||||
} ## end if (!TRUE)
|
||||
if ($ret eq "") { $ret = 'ok'; }
|
||||
return $ret;
|
||||
} ## end sub perform_LIST
|
||||
|
||||
sub perform_PARAMS {
|
||||
my $c = shift;
|
||||
my $prefix_data = shift; #Data hash as parameter
|
||||
my $ret = "";
|
||||
my $db = $cdb; #maybe one of the others
|
||||
my $dbkey = 'letsencrypt';
|
||||
|
||||
# To make it write to DB as comment, delete this (regex) string in each if statement "TRUE\) \#copy or perform with value: .* e.g."
|
||||
if (!$db->set_prop($dbkey, 'status', $c->param('status'), type => 'service')) {
|
||||
$ret .= 'Perform/save failed for status';
|
||||
}
|
||||
|
||||
if (!$db->set_prop($dbkey, 'hookScript', $c->param('hookScript'), type => 'service')) {
|
||||
$ret .= 'Perform/save failed for hookScript';
|
||||
}
|
||||
|
||||
if (!$db->set_prop($dbkey, 'hostOverride', $c->param('hostOverride'), type => 'service')) {
|
||||
$ret .= 'Perform/save failed for hostOverride';
|
||||
}
|
||||
|
||||
if (!$db->set_prop($dbkey, 'ACCEPT_TERMS', $c->param('ACCEPT_TERMS'), type => 'service')) {
|
||||
$ret .= 'Perform/save failed for ACCEPT_TERMS';
|
||||
}
|
||||
if (!$db->set_prop($dbkey, 'API', $c->param('API'), type => 'service')) { $ret .= 'Perform/save failed for API'; }
|
||||
|
||||
if (!$db->set_prop($dbkey, 'keysize', $c->param('keysize'), type => 'service')) {
|
||||
$ret .= 'Perform/save failed for keysize';
|
||||
}
|
||||
|
||||
if (!$db->set_prop($dbkey, 'configure', $c->param('configure'), type => 'service')) {
|
||||
$ret .= 'Perform/save failed for configure';
|
||||
}
|
||||
|
||||
if (!$db->set_prop($dbkey, 'email', $c->param('email'), type => 'service')) {
|
||||
$ret .= 'Perform/save failed for email';
|
||||
}
|
||||
if ($ret eq "") { $ret = 'ok'; }
|
||||
return $ret;
|
||||
} ## end sub perform_PARAMS
|
||||
|
||||
sub perform_CHECKALLDOMAINS {
|
||||
my $c = shift;
|
||||
my $prefix_data = shift; #Data hash as parameter
|
||||
my $ret = "";
|
||||
my $db = $cdb; #maybe one of the others
|
||||
my $dbkey = 'ChangeThis';
|
||||
|
||||
if (!TRUE
|
||||
) #copy or perform with value: AllDomainsCheck e.g. $db->set_prop($dbkey,'AllDomainsCheck',$c->param('AllDomainsCheck'),type=>'service'))
|
||||
{
|
||||
$ret .= 'Perform/save failed for AllDomainsCheck';
|
||||
} ## end if (!TRUE)
|
||||
if ($ret eq "") { $ret = 'ok'; }
|
||||
return $ret;
|
||||
} ## end sub perform_CHECKALLDOMAINS
|
||||
|
||||
sub perform_CHECKALLENABLEDDOMAINS {
|
||||
my $c = shift;
|
||||
my $prefix_data = shift; #Data hash as parameter
|
||||
my $ret = "";
|
||||
my $db = $cdb; #maybe one of the others
|
||||
my $dbkey = 'ChangeThis';
|
||||
|
||||
if (!TRUE
|
||||
) #copy or perform with value: EnabledDomainsCheck e.g. $db->set_prop($dbkey,'EnabledDomainsCheck',$c->param('EnabledDomainsCheck'),type=>'service'))
|
||||
{
|
||||
$ret .= 'Perform/save failed for EnabledDomainsCheck';
|
||||
} ## end if (!TRUE)
|
||||
if ($ret eq "") { $ret = 'ok'; }
|
||||
return $ret;
|
||||
} ## end sub perform_CHECKALLENABLEDDOMAINS
|
||||
|
||||
sub perform_CHECKONEDOMAIN {
|
||||
my $c = shift;
|
||||
my $prefix_data = shift; #Data hash as parameter
|
||||
my $ret = "";
|
||||
my $db = $cdb; #maybe one of the others
|
||||
my $dbkey = 'ChangeThis';
|
||||
|
||||
if (!TRUE
|
||||
) #copy or perform with value: OneDomainToCheck e.g. $db->set_prop($dbkey,'OneDomainToCheck',$c->param('OneDomainToCheck'),type=>'service'))
|
||||
{
|
||||
$ret .= 'Perform/save failed for OneDomainToCheck';
|
||||
} ## end if (!TRUE)
|
||||
|
||||
if (!TRUE
|
||||
) #copy or perform with value: OneDomainsCheck e.g. $db->set_prop($dbkey,'OneDomainsCheck',$c->param('OneDomainsCheck'),type=>'service'))
|
||||
{
|
||||
$ret .= 'Perform/save failed for OneDomainsCheck';
|
||||
} ## end if (!TRUE)
|
||||
if ($ret eq "") { $ret = 'ok'; }
|
||||
return $ret;
|
||||
} ## end sub perform_CHECKONEDOMAIN
|
||||
|
||||
sub create_link {
|
||||
|
||||
# WIP
|
||||
my ($c, $route, $panel, $index) = @_;
|
||||
my $link = "$route?trt=$panel&Selected=$index";
|
||||
return $link;
|
||||
} ## end sub create_link
|
||||
|
||||
sub get_my_ip {
|
||||
my ($self, $item, $prop, $default) = @_;
|
||||
my $output = `/usr/sbin/e-smith/getmyip`;
|
||||
return $output || "IP";
|
||||
} ## end sub get_my_ip
|
||||
|
||||
sub update_one_domain {
|
||||
my ($self, $domain) = @_;
|
||||
return "$domain not domain" unless ($ddb->get($domain) || $hdb->get($domain));
|
||||
($domain) = ($domain =~ /([\w\p{L}.]+)/);
|
||||
my $output = `/etc/e-smith/events/actions/letsencrypt-setdomains " " $domain `;
|
||||
return $output || "-empty-";
|
||||
} ## end sub update_one_domain
|
||||
|
||||
sub update_all_domains {
|
||||
my $self = shift;
|
||||
my $output = `/etc/e-smith/events/actions/letsencrypt-setdomains "" "" all `;
|
||||
return $output || "-empty-";
|
||||
} ## end sub update_all_domains
|
||||
|
||||
sub update_enabled_domains {
|
||||
my $self = shift;
|
||||
my $output = `/etc/e-smith/events/actions/letsencrypt-setdomains "" "" enabled `;
|
||||
return $output || "-empty-";
|
||||
} ## end sub update_enabled_domains
|
||||
1;
|
@@ -1,448 +0,0 @@
|
||||
package SrvMngr::Controller::Letsencrypt;
|
||||
#
|
||||
# Generated by SM2Gen version:0.8 Chameleon version:4.5.4 On Python:3.12.3 at 2024-12-01 15:22:43
|
||||
#
|
||||
#----------------------------------------------------------------------
|
||||
# heading : Network
|
||||
# description : Letsencrypt certificate
|
||||
# navigation : 6000 6600
|
||||
#
|
||||
# name : letsencrypt, method : get, url : /letsencrypt, ctlact : Letsencrypt#main
|
||||
# name : letsencryptu, method : post, url : /letsencryptu, ctlact : Letsencrypt#do_update
|
||||
# name : letsencryptd, method : get, url : /letsencryptd, ctlact : Letsencrypt#do_display
|
||||
#
|
||||
# routes : end
|
||||
#
|
||||
# Documentation: https://wiki.contribs.org/Letsencrypt
|
||||
#----------------------------------------------------------------------
|
||||
#
|
||||
# Scheme of things:
|
||||
#
|
||||
# TBA!!
|
||||
use strict;
|
||||
use warnings;
|
||||
use Mojo::Base 'Mojolicious::Controller';
|
||||
use constant FALSE => 0;
|
||||
use constant TRUE => 1;
|
||||
use Locale::gettext;
|
||||
use SrvMngr::I18N;
|
||||
use SrvMngr qw(theme_list init_session);
|
||||
use Data::Dumper;
|
||||
use esmith::util;
|
||||
use esmith::util::network;
|
||||
use esmith::ConfigDB;
|
||||
use esmith::AccountsDB;
|
||||
use esmith::NetworksDB;
|
||||
use esmith::HostsDB;
|
||||
use esmith::DomainsDB;
|
||||
require
|
||||
'/usr/share/smanager/lib/SrvMngr/Controller/Letsencrypt-Custom.pm'; #The code that is to be added by the developer
|
||||
|
||||
sub main {
|
||||
#
|
||||
# Initial entry - route is "/<whatever>"
|
||||
#
|
||||
#set initial panel
|
||||
#for initial panel:
|
||||
#Specifiy panel to enter
|
||||
#load up _data hash with DB fields
|
||||
#load up stash with pointer(s) to control fields hash(= get-))
|
||||
#and a pointer to the prefix_data hash
|
||||
#render initial panel
|
||||
my $c = shift;
|
||||
$c->app->log->info($c->log_req);
|
||||
|
||||
#The most common ones
|
||||
my $cdb = esmith::ConfigDB->open() || die("Couldn't open config db");
|
||||
my $adb = esmith::AccountsDB->open() || die("Couldn't open Accounts db");
|
||||
my $ndb = esmith::NetworksDB->open() || die("Couldn't open Network db");
|
||||
my $hdb = esmith::HostsDB->open() || die("Couldn't open Hosts db");
|
||||
my $ddb = esmith::DomainsDB->open() || die("Couldn't open Domains db");
|
||||
my %lets_data = ();
|
||||
my $title = $c->l('lets_Letsencrypt_certificate');
|
||||
my $modul = '';
|
||||
$lets_data{'trt'} = 'LIST';
|
||||
|
||||
#Load any DB entries into the <prefix>_data area so as they are preset in the form
|
||||
# which DB - this only really works if the initial panel is a PARAMS type panel and not a TABLE
|
||||
my $db = $cdb; #pickup local or global db or Default to config
|
||||
$c->do_display($lets_data{'trt'});
|
||||
} ## end sub main
|
||||
|
||||
# Post request with params - submit from the form
|
||||
sub do_update {
|
||||
#
|
||||
# Return after submit pushed on panel (this is a post) - route is "/<whatever>u"
|
||||
# parameters in the params hash.
|
||||
#
|
||||
#load up all params into prefix_data hash:
|
||||
#By panel (series of if statements - only one executed):
|
||||
#call validate-PANEL() - return ret = ok or error message
|
||||
#if validation not ok:
|
||||
#render back to current panel with error message in stash
|
||||
#otherwise:
|
||||
#By panel (series of if statements - only one executed):
|
||||
#do whatever is required: call perform-PANEL() - return "ok" or Error Message
|
||||
#call signal-event for any global actions specified (check it exists - error and continue?)
|
||||
#if action smeserver-<whatever>-update exists
|
||||
#signal_event smeserver-<whatever>-update
|
||||
#call signal-event for any specific actions for thids panel (check it exists first - error and continue)
|
||||
#set success in stash
|
||||
#if no "nextpanel" entry:
|
||||
#set firstpanel
|
||||
#else
|
||||
#set nextpanel
|
||||
#call render
|
||||
my $c = shift;
|
||||
$c->app->log->info($c->log_req);
|
||||
my $modul = '';
|
||||
|
||||
#The most common ones - you might want to comment out any not used.
|
||||
my $cdb = esmith::ConfigDB->open() || die("Couldn't open config db");
|
||||
my $adb = esmith::AccountsDB->open() || die("Couldn't open Accounts db");
|
||||
my $ndb = esmith::NetworksDB->open() || die("Couldn't open Network db");
|
||||
my $hdb = esmith::HostsDB->open() || die("Couldn't open Hosts db");
|
||||
my $ddb = esmith::DomainsDB->open() || die("Couldn't open Domains db");
|
||||
my %lets_data = ();
|
||||
my $title = $c->l('lets_Letsencrypt_certificate');
|
||||
|
||||
# Accessing all POST parameters
|
||||
my %params = $c->req->params->to_hash;
|
||||
|
||||
# Get number of POST parameters
|
||||
my $num_params = keys %params;
|
||||
|
||||
#Params are available in the hash "params" - copy to the prefix_data hash
|
||||
#while (my ($key, $value) = each %{$c->req->params->to_hash}) {
|
||||
# $lets_data{$key} = $value;
|
||||
#}
|
||||
# the value of trt will tell you which panel has returned
|
||||
my $trt = $c->param('trt') || 'LIST'; #hidden control on every form.
|
||||
my $ret = 'ok';
|
||||
|
||||
#Validate the parameters in a custom sub one for each panel (although only one of these will be executed)
|
||||
my $thispanel;
|
||||
|
||||
if ($trt eq 'LIST') {
|
||||
|
||||
#Validate form parameters for panel LIST
|
||||
$ret = $c->validate_LIST(\%lets_data);
|
||||
$thispanel = 'LIST';
|
||||
} ## end if ($trt eq 'LIST')
|
||||
|
||||
if ($trt eq 'PARAMS') {
|
||||
|
||||
#Validate form parameters for panel PARAMS
|
||||
$ret = $c->validate_PARAMS(\%lets_data);
|
||||
$thispanel = 'PARAMS';
|
||||
} ## end if ($trt eq 'PARAMS')
|
||||
|
||||
if ($trt eq 'CHECKALLDOMAINS') {
|
||||
|
||||
#Validate form parameters for panel CHECKALLDOMAINS
|
||||
$ret = $c->validate_CHECKALLDOMAINS(\%lets_data);
|
||||
$thispanel = 'CHECKALLDOMAINS';
|
||||
} ## end if ($trt eq 'CHECKALLDOMAINS')
|
||||
|
||||
if ($trt eq 'CHECKALLENABLEDDOMAINS') {
|
||||
|
||||
#Validate form parameters for panel CHECKALLENABLEDDOMAINS
|
||||
$ret = $c->validate_CHECKALLENABLEDDOMAINS(\%lets_data);
|
||||
$thispanel = 'CHECKALLENABLEDDOMAINS';
|
||||
} ## end if ($trt eq 'CHECKALLENABLEDDOMAINS')
|
||||
|
||||
if ($trt eq 'CHECKONEDOMAIN') {
|
||||
|
||||
#Validate form parameters for panel CHECKONEDOMAIN
|
||||
$ret = $c->validate_CHECKONEDOMAIN(\%lets_data);
|
||||
$thispanel = 'CHECKONEDOMAIN';
|
||||
} ## end if ($trt eq 'CHECKONEDOMAIN')
|
||||
|
||||
if ($ret ne "ok") {
|
||||
$c->do_display($thispanel);
|
||||
} else {
|
||||
|
||||
#Do whatever is needed, including writing values to the DB
|
||||
if ($trt eq 'LIST') {
|
||||
|
||||
#do whatever is required ...
|
||||
$ret = $c->perform_LIST(\%lets_data);
|
||||
|
||||
if ($ret ne "ok") {
|
||||
|
||||
# return to the panel with error message
|
||||
$c->stash(error => $c->l($ret));
|
||||
$c->stash(
|
||||
title => $title,
|
||||
modul => $modul,
|
||||
lets_data => \%lets_data
|
||||
);
|
||||
$c->render(template => "letsencrypt");
|
||||
} else {
|
||||
$c->stash(success => $c->l('lets_LIST_panel_action_was_successful'))
|
||||
; #A bit bland - edit it in the lex file
|
||||
}
|
||||
} ## end if ($trt eq 'LIST')
|
||||
|
||||
if ($trt eq 'PARAMS') {
|
||||
|
||||
#do whatever is required ...
|
||||
$ret = $c->perform_PARAMS(\%lets_data);
|
||||
|
||||
if ($ret ne "ok") {
|
||||
|
||||
# return to the panel with error message
|
||||
$c->stash(error => $c->l($ret));
|
||||
$c->stash(
|
||||
title => $title,
|
||||
modul => $modul,
|
||||
lets_data => \%lets_data
|
||||
);
|
||||
$c->render(template => "letsencrypt");
|
||||
} else {
|
||||
$c->stash(success => $c->l('lets_PARAMS_panel_action_was_successful'))
|
||||
; #A bit bland - edit it in the lex file
|
||||
}
|
||||
} ## end if ($trt eq 'PARAMS')
|
||||
|
||||
if ($trt eq 'CHECKALLDOMAINS') {
|
||||
|
||||
#do whatever is required ...
|
||||
$ret = $c->perform_CHECKALLDOMAINS(\%lets_data);
|
||||
|
||||
if ($ret ne "ok") {
|
||||
|
||||
# return to the panel with error message
|
||||
$c->stash(error => $c->l($ret));
|
||||
$c->stash(
|
||||
title => $title,
|
||||
modul => $modul,
|
||||
lets_data => \%lets_data
|
||||
);
|
||||
$c->render(template => "letsencrypt");
|
||||
} else {
|
||||
$c->stash(success => $c->l('lets_CHECKALLDOMAINS_panel_action_was_successful'))
|
||||
; #A bit bland - edit it in the lex file
|
||||
}
|
||||
} ## end if ($trt eq 'CHECKALLDOMAINS')
|
||||
|
||||
if ($trt eq 'CHECKALLENABLEDDOMAINS') {
|
||||
|
||||
#do whatever is required ...
|
||||
$ret = $c->perform_CHECKALLENABLEDDOMAINS(\%lets_data);
|
||||
|
||||
if ($ret ne "ok") {
|
||||
|
||||
# return to the panel with error message
|
||||
$c->stash(error => $c->l($ret));
|
||||
$c->stash(
|
||||
title => $title,
|
||||
modul => $modul,
|
||||
lets_data => \%lets_data
|
||||
);
|
||||
$c->render(template => "letsencrypt");
|
||||
} else {
|
||||
$c->stash(success => $c->l('lets_CHECKALLENABLEDDOMAINS_panel_action_was_successful'))
|
||||
; #A bit bland - edit it in the lex file
|
||||
}
|
||||
} ## end if ($trt eq 'CHECKALLENABLEDDOMAINS')
|
||||
|
||||
if ($trt eq 'CHECKONEDOMAIN') {
|
||||
|
||||
#do whatever is required ...
|
||||
$ret = $c->perform_CHECKONEDOMAIN(\%lets_data);
|
||||
|
||||
if ($ret ne "ok") {
|
||||
|
||||
# return to the panel with error message
|
||||
$c->stash(error => $c->l($ret));
|
||||
$c->stash(
|
||||
title => $title,
|
||||
modul => $modul,
|
||||
lets_data => \%lets_data
|
||||
);
|
||||
$c->render(template => "letsencrypt");
|
||||
} else {
|
||||
$c->stash(success => $c->l('lets_CHECKONEDOMAIN_panel_action_was_successful'))
|
||||
; #A bit bland - edit it in the lex file
|
||||
}
|
||||
} ## end if ($trt eq 'CHECKONEDOMAIN')
|
||||
|
||||
# and call any signal-events needed
|
||||
#TBD
|
||||
# Setup shared data and call panel
|
||||
if ('none' eq 'none') {
|
||||
$lets_data{'trt'} = 'LIST';
|
||||
} else {
|
||||
$lets_data{'trt'} = 'none';
|
||||
}
|
||||
$c->do_display($lets_data{'trt'});
|
||||
} ## end else [ if ($ret ne "ok") ]
|
||||
} ## end sub do_update
|
||||
|
||||
sub do_display {
|
||||
#
|
||||
# Return after link clicked in table (this is a get) - route is "/<whatever>d"
|
||||
# Expects ?trt=PANEL&selected="TableRowName" plus any other required
|
||||
#
|
||||
# OR it maybe a post from the main panel to add a new record
|
||||
#
|
||||
#load up all supplied params into prefix_data hash
|
||||
#call get-selected-PANEL() - returns hash of all relevent parameters
|
||||
#load up returned hash into prefix_data
|
||||
#render - to called panel
|
||||
my ($c, $trt) = @_;
|
||||
$c->app->log->info($c->log_req);
|
||||
|
||||
#The most common ones - you might want to comment out any not used.
|
||||
my $cdb = esmith::ConfigDB->open() || die("Couldn't open config db");
|
||||
my $adb = esmith::AccountsDB->open() || die("Couldn't open Accounts db");
|
||||
my $ndb = esmith::NetworksDB->open() || die("Couldn't open Network db");
|
||||
my $hdb = esmith::HostsDB->open() || die("Couldn't open Hosts db");
|
||||
my $ddb = esmith::DomainsDB->open() || die("Couldn't open Domains db");
|
||||
my %lets_data = ();
|
||||
my $title = $c->l('lets_Letsencrypt_certificate');
|
||||
my $modul = "";
|
||||
|
||||
# Accessing all parameters
|
||||
my $params = $c->req->params->to_hash;
|
||||
|
||||
# Get number of parameters
|
||||
my $num_params = scalar keys %$params;
|
||||
|
||||
#Tag as Post or Get (ie. create new entry or edit existing one
|
||||
my $is_new_record = ($c->req->method() eq 'POST');
|
||||
|
||||
#Params are available in the hash "params" - copy to the prefix_data hash
|
||||
#while (my ($key, $value) = each %{$c->req->params->to_hash}) {
|
||||
# $lets_data{$key} = $value;
|
||||
#}
|
||||
# the value of trt will tell you which panel has returned
|
||||
if (!$trt) {
|
||||
$trt = $c->param('trt') || 'LIST'; #Indicates where to go now
|
||||
}
|
||||
|
||||
# Now add in the params from the selected row from the table
|
||||
my %selectedrow;
|
||||
|
||||
if ($trt eq 'LIST') {
|
||||
|
||||
#Validate Get selected row (if applicable) LIST
|
||||
%selectedrow = $c->get_selected_LIST($lets_data{'Selected'}, $is_new_record);
|
||||
} ## end if ($trt eq 'LIST')
|
||||
|
||||
if ($trt eq 'PARAMS') {
|
||||
|
||||
#Validate Get selected row (if applicable) PARAMS
|
||||
%selectedrow = $c->get_selected_PARAMS($lets_data{'Selected'}, $is_new_record);
|
||||
} ## end if ($trt eq 'PARAMS')
|
||||
|
||||
if ($trt eq 'CHECKALLDOMAINS') {
|
||||
|
||||
#Validate Get selected row (if applicable) CHECKALLDOMAINS
|
||||
%selectedrow = $c->get_selected_CHECKALLDOMAINS($lets_data{'Selected'}, $is_new_record);
|
||||
} ## end if ($trt eq 'CHECKALLDOMAINS')
|
||||
|
||||
if ($trt eq 'CHECKALLENABLEDDOMAINS') {
|
||||
|
||||
#Validate Get selected row (if applicable) CHECKALLENABLEDDOMAINS
|
||||
%selectedrow = $c->get_selected_CHECKALLENABLEDDOMAINS($lets_data{'Selected'}, $is_new_record);
|
||||
} ## end if ($trt eq 'CHECKALLENABLEDDOMAINS')
|
||||
|
||||
if ($trt eq 'CHECKONEDOMAIN') {
|
||||
|
||||
#Validate Get selected row (if applicable) CHECKONEDOMAIN
|
||||
%selectedrow = $c->get_selected_CHECKONEDOMAIN($lets_data{'Selected'}, $is_new_record);
|
||||
} ## end if ($trt eq 'CHECKONEDOMAIN')
|
||||
|
||||
#Copy in the selected row params to the prefix_data hash to pass to the panel
|
||||
while (my ($key, $value) = each %selectedrow) {
|
||||
$lets_data{$key} = $value;
|
||||
}
|
||||
|
||||
# Where to go now
|
||||
$lets_data{'trt'} = $trt;
|
||||
|
||||
# Set up other shared data according to the panel to go to
|
||||
if ($trt eq 'LIST') {
|
||||
|
||||
# pickup any other contents needed and load them into hash shared with panel
|
||||
my %returned_hash;
|
||||
|
||||
# subroutine returns a hash directly
|
||||
%returned_hash = $c->get_data_for_panel_LIST();
|
||||
|
||||
# Copy each key-value pair from the returned hash to the prefix data hash
|
||||
while (my ($key, $value) = each %returned_hash) {
|
||||
$lets_data{$key} = $value;
|
||||
}
|
||||
} ## end if ($trt eq 'LIST')
|
||||
|
||||
if ($trt eq 'PARAMS') {
|
||||
|
||||
# pickup any other contents needed and load them into hash shared with panel
|
||||
my %returned_hash;
|
||||
|
||||
# subroutine returns a hash directly
|
||||
%returned_hash = $c->get_data_for_panel_PARAMS();
|
||||
|
||||
# Copy each key-value pair from the returned hash to the prefix data hash
|
||||
while (my ($key, $value) = each %returned_hash) {
|
||||
$lets_data{$key} = $value;
|
||||
}
|
||||
} ## end if ($trt eq 'PARAMS')
|
||||
|
||||
if ($trt eq 'CHECKALLDOMAINS') {
|
||||
|
||||
# pickup any other contents needed and load them into hash shared with panel
|
||||
my %returned_hash;
|
||||
|
||||
# subroutine returns a hash directly
|
||||
%returned_hash = $c->get_data_for_panel_CHECKALLDOMAINS();
|
||||
|
||||
# Copy each key-value pair from the returned hash to the prefix data hash
|
||||
while (my ($key, $value) = each %returned_hash) {
|
||||
$lets_data{$key} = $value;
|
||||
}
|
||||
} ## end if ($trt eq 'CHECKALLDOMAINS')
|
||||
|
||||
if ($trt eq 'CHECKALLENABLEDDOMAINS') {
|
||||
|
||||
# pickup any other contents needed and load them into hash shared with panel
|
||||
my %returned_hash;
|
||||
|
||||
# subroutine returns a hash directly
|
||||
%returned_hash = $c->get_data_for_panel_CHECKALLENABLEDDOMAINS();
|
||||
|
||||
# Copy each key-value pair from the returned hash to the prefix data hash
|
||||
while (my ($key, $value) = each %returned_hash) {
|
||||
$lets_data{$key} = $value;
|
||||
}
|
||||
} ## end if ($trt eq 'CHECKALLENABLEDDOMAINS')
|
||||
|
||||
if ($trt eq 'CHECKONEDOMAIN') {
|
||||
|
||||
# pickup any other contents needed and load them into hash shared with panel
|
||||
my %returned_hash;
|
||||
|
||||
# subroutine returns a hash directly
|
||||
%returned_hash = $c->get_data_for_panel_CHECKONEDOMAIN();
|
||||
|
||||
# Copy each key-value pair from the returned hash to the prefix data hash
|
||||
while (my ($key, $value) = each %returned_hash) {
|
||||
$lets_data{$key} = $value;
|
||||
}
|
||||
} ## end if ($trt eq 'CHECKONEDOMAIN')
|
||||
|
||||
# and table control fields
|
||||
$c->stash(DomainList => $c->get_DomainList());
|
||||
|
||||
# Data for panel
|
||||
$c->stash(
|
||||
title => $title,
|
||||
modul => $modul,
|
||||
lets_data => \%lets_data
|
||||
);
|
||||
$c->render(template => "letsencrypt");
|
||||
} ## end sub do_display
|
||||
1;
|
@@ -3,7 +3,7 @@ package SrvMngr::Controller::Login;
|
||||
#----------------------------------------------------------------------
|
||||
# heading : Support
|
||||
# description : Login
|
||||
# navigation : 0000 001
|
||||
# navigation : 0 200
|
||||
# menu : N
|
||||
#
|
||||
# routes : end
|
||||
|
@@ -3,7 +3,7 @@ package SrvMngr::Controller::Manual;
|
||||
#----------------------------------------------------------------------
|
||||
# heading : Support
|
||||
# description : Online manual
|
||||
# navigation : 0000 100
|
||||
# navigation : 0 300
|
||||
# menu : N
|
||||
#
|
||||
# routes : end
|
||||
|
@@ -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;
|
@@ -3,7 +3,7 @@ package SrvMngr::Controller::Printers;
|
||||
#----------------------------------------------------------------------
|
||||
# heading : System
|
||||
# description : Printers
|
||||
# navigation : 4000 800
|
||||
# navigation : 4000 900
|
||||
#
|
||||
#
|
||||
# routes : end
|
||||
|
@@ -3,7 +3,7 @@ package SrvMngr::Controller::Proxy;
|
||||
#----------------------------------------------------------------------
|
||||
# heading : System
|
||||
# description : Proxy settings
|
||||
# navigation : 4000 710
|
||||
# navigation : 4000 800
|
||||
#----------------------------------------------------------------------
|
||||
#
|
||||
# routes : end
|
||||
|
@@ -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/\&/\&/g;
|
||||
s/\"/\"/g;
|
||||
s/\>/\>/g;
|
||||
s/\</\</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;
|
@@ -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;
|
@@ -1,16 +1,11 @@
|
||||
package SrvMngr::Controller::Review;
|
||||
|
||||
#----------------------------------------------------------------------
|
||||
# heading : Support
|
||||
# heading : Investigation
|
||||
# description : Review configuration
|
||||
# navigation : 000 500
|
||||
# menu : N
|
||||
# navigation : 7000 600
|
||||
# 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;
|
@@ -1,9 +1,9 @@
|
||||
package SrvMngr::Controller::Roundcubepanel;
|
||||
|
||||
#----------------------------------------------------------------------
|
||||
# heading : System
|
||||
# description : Roundcube webmail
|
||||
# navigation : 99999 9999
|
||||
# heading : Network
|
||||
# description : Webmail
|
||||
# navigation : 6000 900
|
||||
#----------------------------------------------------------------------
|
||||
#----------------------------------------------------------------------
|
||||
# name : roundcubepanel, method : get, url : /roundcubepanel, ctlact : Roundcubepanel#main
|
||||
@@ -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
|
||||
|
||||
|
@@ -3,7 +3,7 @@ package SrvMngr::Controller::Support;
|
||||
#----------------------------------------------------------------------
|
||||
# heading : Support
|
||||
# description : Support and licensing
|
||||
# navigation : 0000 200
|
||||
# navigation : 0 400
|
||||
# menu : N
|
||||
#
|
||||
# routes : end
|
||||
|
@@ -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 [
|
||||
|
@@ -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;
|
||||
|
@@ -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
|
||||
|
@@ -2,7 +2,7 @@
|
||||
'clm_LABEL_FILESYSTEM_SCAN_PERIOD' => 'Scan filesystem',
|
||||
'clm_DESC_FILESYSTEM_SCAN_PERIOD' => '<h2>General Settings</h2>
|
||||
If this option is enabled then the filesystem will be
|
||||
scanned for viruses.A report of any found viruses will be
|
||||
scanned for viruses. A report of any found viruses will be
|
||||
emailed to the administrator.',
|
||||
'clm_LABEL_QUARANTINE' => 'Quarantine infected files',
|
||||
'clm_LABEL_CLAM_VERSIONS' => 'ClamAV and db versions',
|
||||
|
@@ -14,26 +14,26 @@ web site for that domain.',
|
||||
i-bay as the content.',
|
||||
'dom_DOMAIN_NAME_VALIDATION_ERROR' => 'Error: unexpected or missing characters in domain name
|
||||
[_1].The domain name should contain one or more
|
||||
letters, numbers, periods and minus signs.Did not create new domain.',
|
||||
letters, numbers, periods and minus signs. Did not create new domain.',
|
||||
'dom_DOMAIN_DESCRIPTION_VALIDATION_ERROR' => 'Error: unexpected or missing characters in domain description
|
||||
[_1]. Did not create new domain.',
|
||||
'dom_DOMAIN_IN_USE_ERROR' => 'Error: domain [_1] is already in use.Did not create
|
||||
'dom_DOMAIN_IN_USE_ERROR' => 'Error: domain [_1] is already in use. Did not create
|
||||
new domain.',
|
||||
'dom_SYSTEM_DOMAIN_ERROR' => 'Error: domain [_1] is your system domain name.You
|
||||
cannot have a domain with the same name.Did not create new domain.',
|
||||
'dom_SYSTEM_DOMAIN_ERROR' => 'Error: domain [_1] is your system domain name. You
|
||||
cannot have a domain with the same name. Did not create new domain.',
|
||||
'dom_SUCCESSFULLY_CREATED' => 'Successfully created domain [_1].Your web
|
||||
server is now being restarted.The links on this page will be
|
||||
server is now being restarted. The links on this page will be
|
||||
inactive until the web server restart is complete.',
|
||||
'dom_MODIFY_TITLE' => 'Modify domain',
|
||||
'dom_NONEXISTENT_DOMAIN_ERROR' => 'Error: [_1] is not an existing domain.',
|
||||
'dom_SUCCESSFULLY_MODIFIED' => 'Successfully modified domain [_1].Your web
|
||||
server is now being restarted.The links on this page will be inactive until the web server restart is complete.',
|
||||
server is now being restarted. The links on this page will be inactive until the web server restart is complete.',
|
||||
'dom_REMOVE_TITLE' => 'Remove domain',
|
||||
'dom_REMOVE_DESCRIPTION' => 'You are about to remove the domain "[_1]" ([_2]).',
|
||||
'dom_ABOUT_TO_REMOVE' => 'Are you sure you wish to remove this domain ?',
|
||||
'dom_ERROR_WHILE_REMOVING_DOMAIN' => 'Error: internal failure while removing domain [_1].',
|
||||
'dom_SUCCESSFULLY_DELETED' => 'Successfully deleted domain [_1]. Your web server
|
||||
is now being restarted.The links on this page will be inactive
|
||||
is now being restarted. The links on this page will be inactive
|
||||
until the web server restart is complete.',
|
||||
'dom_DESC_CORPORATE_DNS_CURRENT' => 'Corporate DNS Settings',
|
||||
'dom_DOMAINS_PAGE_CORPORATE_DNS' => 'Modify corporate DNS settings',
|
||||
|
@@ -128,7 +128,7 @@
|
||||
'FM_IP_NUMBER3' => '[_1] is more than 255',
|
||||
'FM_USERNAME' => 'This field must look like a valid username (3 to 8 letters and numbers)',
|
||||
'FM_PASSWORD1' => 'You must provide a password.',
|
||||
'FM_PASSWORD2' => 'The password you provided was not a good password.A good password must contain all of the following: upper case letter, lower case letter, number, non-alphanumeric character, be at least 7 characters long.',
|
||||
'FM_PASSWORD2' => 'The password you provided was not a good password. A good password must contain all of the following: upper case letter, lower case letter, number, non-alphanumeric character, be at least 7 characters long.',
|
||||
'FM_MAC_ADDRESS1' => 'You must provide a MAC address.',
|
||||
'FM_MAC_ADDRESS2' => 'The MAC address you provided was not valid.',
|
||||
'FM_ERR_UNEXPECTED_DESC' => 'Error: unexpected or missing characters in description',
|
||||
@@ -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',
|
||||
|
@@ -4,7 +4,7 @@
|
||||
'grp_ACCOUNT_CONFLICT' => 'Error: the group "[_1]" can\'t be created because there is
|
||||
already a [_2] account of that name.',
|
||||
'grp_INVALID_GROUP_DESCRIPTION' => 'Error: unexpected or missing characters in group description',
|
||||
'grp_NO_MEMBERS' => 'Error: no members in group.Did not create new group.',
|
||||
'grp_NO_MEMBERS' => 'Error: no members in group. Did not create new group.',
|
||||
'grp_CREATED_GROUP' => 'Successfully created user group',
|
||||
'grp_DELETED_GROUP' => 'Successfully removed user group',
|
||||
'grp_MODIFIED_GROUP' => 'Successfully modifed user group',
|
||||
|
@@ -34,17 +34,17 @@ the local network. Please enter a valid IP address in the
|
||||
format "aaa.bbb.ccc.ddd".',
|
||||
'hos_ETHERNET_ADDRESS_DESCRIPTION' => 'The ethernet address is optional and causes the DHCP server to
|
||||
statically bind the local IP address to the computer with this
|
||||
ethernet address.If specified, it must be of the form
|
||||
ethernet address. If specified, it must be of the form
|
||||
"AA:BB:CC:DD:EE:FF" and must contain only the numbers 0-9 and
|
||||
the letters A-F.',
|
||||
'hos_CREATE_LOCAL_HOST_TITLE' => 'Create a new hostname referring to a local host.',
|
||||
'hos_DIDNT_ENTER_LOCAL_IP' => 'Error: You did not specify a Local IP address.IP
|
||||
'hos_DIDNT_ENTER_LOCAL_IP' => 'Error: You did not specify a Local IP address. IP
|
||||
addresses must contain only numbers and periods and
|
||||
be in the form "aaa.bbb.ccc.ddd".Did not create hostname.',
|
||||
'hos_IP_VALIDATION_ERROR' => 'Error: IP Address [_1] is
|
||||
invalid. IP Addresses must contain only numbers and periodsand be in the form "aaa.bbb.ccc.ddd". Did not create hostname.',
|
||||
'hos_MAC_ADDRESS_VALIDATION_ERROR' => 'Error: Ethernet address [_1]
|
||||
is invalid.Ethernet addresses must be in the
|
||||
is invalid. Ethernet addresses must be in the
|
||||
form "AA:BB:CC:DD:EE:FF" and only contain the
|
||||
numbers 0-9 and the letters A-F. Did not create
|
||||
hostname.',
|
||||
|
@@ -1,72 +0,0 @@
|
||||
package SrvMngr::I18N::Modules::Letsencrypt::en;
|
||||
use strict;
|
||||
use warnings;
|
||||
use utf8;
|
||||
use Mojo::Base 'SrvMngr::I18N';
|
||||
|
||||
use SrvMngr::I18N::Modules::General::en;
|
||||
|
||||
my %lexicon = (
|
||||
#
|
||||
# Generated by SM2Gen version: SM2Gen version:0.8 Chameleon version:4.5.4 On Python:3.12.3 at 2024-12-01 15:22:43
|
||||
#
|
||||
'lets_Manage_letsencrypt-config_settings:' => 'Manage letsencrypt-config settings',
|
||||
'lets_HOOKSCRIPT_STATUS' => 'Hookscript Status',
|
||||
'lets_SERVICE_STATUS' => 'Service Status',
|
||||
'lets_EMAIL' => 'Email',
|
||||
'lets_Back' => 'Back',
|
||||
'lets_Internal_IP' => 'Internal IP',
|
||||
'lets_Save' => 'Save',
|
||||
'lets_Issuer' => 'Issuer',
|
||||
'lets_IS_IN_CERT' => 'Is In cart',
|
||||
'lets_For_this_Server' => 'For this Server',
|
||||
'lets_Loop_through_checking_the_letsencrypt' => 'Loop through checking the letsencrypt status for each configured domain',
|
||||
'lets_Loop_through_checking_the_letsencrypt' => 'Loop through checking the letsencrypt status for each configured domain which is enabled',
|
||||
'lets_Check_just_one_domain' => 'Check just one domain',
|
||||
'lets_PARAMS_panel_action_was_successful' => 'PARAMS panel action was successful',
|
||||
'lets_Check_all_domains' => 'Check all domains',
|
||||
'lets_LIST_panel_action_was_successful' => 'LIST panel action was successful',
|
||||
'lets_Status_Report' => 'Status Report',
|
||||
'lets_LABEL_NAMESERVERS' => 'Label timeservers',
|
||||
'lets_Loop_through_and_check_the' => 'Loop through and check the letsencrypt status for a specific domain',
|
||||
'lets_Letsencrypt_certificate' => 'Letsencrypt certificate',
|
||||
'lets_Error_Status_Report' => 'Error Status Report',
|
||||
'lets_Not_Before' => 'Not Before',
|
||||
'lets_Content' => 'Content',
|
||||
'lets_CONFIG_LETSENCRYPT' => 'confirm Letsencrypt',
|
||||
'lets_API_STATUS' => 'ape Status',
|
||||
'lets_ACCEPT_TERMS_STATUS' => 'Accept Terms Status',
|
||||
'lets_Check_all_enabled_domains' => 'Check all enabled domains',
|
||||
'lets_All_domains_check_result' => 'All domains check result',
|
||||
'lets_CHECKALLDOMAINS_panel_action_was_successful' => 'CHECKALLDOMAINS panel action was successful',
|
||||
'lets_Domains_name' => 'Domains name',
|
||||
'lets_HOSTOVERRIDE_STATUS' => 'Hostoverride Status',
|
||||
'lets_List_of_Domains_and_Hosts' => 'List of Domains and Hosts',
|
||||
'lets_Brief_description' => 'Brief description',
|
||||
'lets_KEYSIZE_STATUS' => 'Keysize Status',
|
||||
'lets_Domain_name_/_HOSTNAME' => 'Domain name / HOSTNAME',
|
||||
'lets_Enabled_domains_check_result' => 'Enabled domains check result',
|
||||
'lets_CHECKALLENABLEDDOMAINS_panel_action_was_successful' => 'CHECKALLENABLEDDOMAINS panel action was successful',
|
||||
'lets_Internet_IP' => 'Internet IP',
|
||||
'lets_Expiry' => 'Expiry',
|
||||
'lets_CHECK_ALL_DOMAINS' => 'Check All Domains',
|
||||
'lets_LABEL_POINT' => 'Label Point',
|
||||
'lets_CHECK' => 'Check',
|
||||
'lets_CONFIG' => 'Config',
|
||||
'lets_Current_certificate_details' => 'Current certificate details',
|
||||
'lets_LABEL_LECERT' => 'Label secret',
|
||||
'lets_One_domain_check_result' => 'One domain check result',
|
||||
'lets_CHECKONEDOMAIN_panel_action_was_successful' => 'CHECKONEDOMAIN panel action was successful',
|
||||
'lets_CONFIGUREMODE_STATUS' => 'Configuremode Status',
|
||||
'lets_CHECK_ALL_ENABLED_DOMAINS' => 'Check All Enabled Domains',
|
||||
'lets_External_Interface_IP' => 'External Interface IP',
|
||||
'lets_APPLY' => 'Apply',
|
||||
);
|
||||
|
||||
our %Lexicon = (
|
||||
%{ SrvMngr::I18N::Modules::General::en::Lexicon },
|
||||
%lexicon
|
||||
);
|
||||
|
||||
|
||||
1;
|
@@ -1,55 +0,0 @@
|
||||
#
|
||||
# Generated by SM2Gen version: SM2Gen version:0.8 Chameleon version:4.5.4 On Python:3.12.3 at 2024-12-01 15:22:43
|
||||
# edited by bjr 09Jan2025
|
||||
#
|
||||
'lets_Manage_letsencrypt-config_settings:' => 'Manage letsencrypt-config settings',
|
||||
'lets_HOOKSCRIPT_STATUS' => 'Hookscript Status',
|
||||
'lets_SERVICE_STATUS' => 'Service Status',
|
||||
'lets_EMAIL' => 'Email',
|
||||
'lets_Back' => 'Back',
|
||||
'lets_Internal_IP' => 'Internal IP',
|
||||
'lets_Save' => 'Save',
|
||||
'lets_Issuer' => 'Issuer',
|
||||
'lets_IS_IN_CERT' => 'Is in certificate',
|
||||
'lets_For_this_Server' => 'For this Server',
|
||||
'lets_Loop_through_checking_the_letsencrypt' => 'Loop through checking the letsencrypt status for each configured domain',
|
||||
'lets_Loop_through_checking_the_letsencrypt' => 'Loop through checking the letsencrypt status for each configured domain which is enabled',
|
||||
'lets_Check_just_one_domain' => 'Check just one domain',
|
||||
'lets_PARAMS_panel_action_was_successful' => 'Parameter panel action was successful',
|
||||
'lets_Check_all_domains' => 'Check all domains',
|
||||
'lets_LIST_panel_action_was_successful' => 'List panel action was successful',
|
||||
'lets_Status_Report' => 'Status Report',
|
||||
'lets_LABEL_NAMESERVERS' => 'Label timeservers',
|
||||
'lets_Loop_through_and_check_the' => 'Loop through and check the letsencrypt status for a specific domain',
|
||||
'lets_Letsencrypt_certificate' => 'Letsencrypt certificate',
|
||||
'lets_Error_Status_Report' => 'Error Status Report',
|
||||
'lets_Not_Before' => 'Not Before',
|
||||
'lets_Content' => 'Content',
|
||||
'lets_CONFIG_LETSENCRYPT' => 'Configure Letsencrypt',
|
||||
'lets_API_STATUS' => 'API Status',
|
||||
'lets_ACCEPT_TERMS_STATUS' => 'Accept Terms Status',
|
||||
'lets_Check_all_enabled_domains' => 'Check all enabled domains',
|
||||
'lets_All_domains_check_result' => 'All domains check result',
|
||||
'lets_CHECKALLDOMAINS_panel_action_was_successful' => 'Check all domains panel action was successful',
|
||||
'lets_Domains_name' => 'Domains name',
|
||||
'lets_HOSTOVERRIDE_STATUS' => 'Hostoverride Status',
|
||||
'lets_List_of_Domains_and_Hosts' => 'List of Domains and Hosts',
|
||||
'lets_Brief_description' => 'Brief description',
|
||||
'lets_KEYSIZE_STATUS' => 'Keysize Status',
|
||||
'lets_Domain_name_/_HOSTNAME' => 'Domain name / HOSTNAME',
|
||||
'lets_Enabled_domains_check_result' => 'Enabled domains check result',
|
||||
'lets_CHECKALLENABLEDDOMAINS_panel_action_was_successful' => 'Check all enabled domains panel action was successful',
|
||||
'lets_Internet_IP' => 'Internet IP',
|
||||
'lets_Expiry' => 'Expiry',
|
||||
'lets_CHECK_ALL_DOMAINS' => 'Check All Domains',
|
||||
'lets_LABEL_POINT' => 'Label Point',
|
||||
'lets_CHECK' => 'Check',
|
||||
'lets_CONFIG' => 'Config',
|
||||
'lets_Current_certificate_details' => 'Current certificate details',
|
||||
'lets_LABEL_LECERT' => 'Label secret',
|
||||
'lets_One_domain_check_result' => 'One domain check result',
|
||||
'lets_CHECKONEDOMAIN_panel_action_was_successful' => 'Check one domain panel action was successful',
|
||||
'lets_CONFIGUREMODE_STATUS' => 'Configure mode Status',
|
||||
'lets_CHECK_ALL_ENABLED_DOMAINS' => 'Check All Enabled Domains',
|
||||
'lets_External_Interface_IP' => 'External Interface IP',
|
||||
'lets_APPLY' => 'Apply',
|
@@ -14,7 +14,7 @@ For example, you may wish to create a pseudonym
|
||||
"webmaster" for your "webdevelopers" group or a
|
||||
pseudonym "joe" for the user "joseph".</p>
|
||||
<p>The server automatically creates pseudonyms of the form
|
||||
firstname.lastname and firstname_lastname for every user
|
||||
firstname. lastname and firstname_lastname for every user
|
||||
on the system and a pseudonym "everyone" which contains
|
||||
all users on the system.</p>
|
||||
<p>Pseudonyms also allow you to create e-mail aliases for valid
|
||||
|
@@ -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',
|
@@ -26,7 +26,9 @@ experienced administrators
|
||||
for remote problem diagnosis and resolution.
|
||||
We recommend leaving this
|
||||
parameter set to "No Access"
|
||||
unless you have a specific reason to do otherwise.',
|
||||
unless you have a specific reason to do otherwise.
|
||||
Note that an "Autoblock" feature is enabled by default when public access is enabled; to disable or tune this feature, refer to the manual at https://wiki.koozali.org/AutoBlock
|
||||
',
|
||||
'rma_TITLE_FTP_ACCESS' => 'FTP Settings',
|
||||
'rma_DESC_FTP_ACCESS' => 'You can also control <b>FTP</b> access to your server. We
|
||||
recommend leaving this parameter set to \'no access\' unless you
|
||||
@@ -75,11 +77,11 @@ connected to a server serial port.',
|
||||
'rma_LABEL_PPTP_ACCESS' => 'PPTP default user access',
|
||||
'rma_TITLE_TELNET_ACCESS' => 'Telnet Settings',
|
||||
'rma_DESC_TELNET_ACCESS' => 'WARNING:Telnet is currently enabled, but this feature is
|
||||
no longer supported.Telnet is inherently insecure and should only
|
||||
no longer supported. Telnet is inherently insecure and should only
|
||||
be used in circumstances where no practical alternative exists. You
|
||||
should change option to [_1] and use
|
||||
secure shell if remote access is
|
||||
required.Once disabled, telnet will no longer appear on this
|
||||
required. Once disabled, telnet will no longer appear on this
|
||||
screen. ',
|
||||
'rma_TITLE_IPSECRW' => 'IPSEC Client (Roadwarrior) Settings',
|
||||
'rma_DESC_IPSECRW' => 'You can allow IPSEC client access to your server, authenticated by
|
||||
@@ -90,4 +92,4 @@ to the number 0 unless you require IPSEC client access.',
|
||||
can do so here.<br>Any old certificates will no longer
|
||||
authenticate against the server, so <b><i>all IPSEC clients will
|
||||
need to import a new certificate!</i></b>.',
|
||||
'rma_LABEL_IPSECRW_RESET' => 'Reset digital certificates',
|
||||
'rma_LABEL_IPSECRW_RESET' => 'Reset digital certificates',
|
@@ -2,7 +2,7 @@
|
||||
'rvw_FORM_TITLE' => 'Review configuration',
|
||||
'rvw_DESCRIPTION' => 'This report summarizes the networking, server, and domain
|
||||
parameters on this server relevant to configuring
|
||||
the client computers on your network.You may wish to print this
|
||||
the client computers on your network. You may wish to print this
|
||||
page and use it as a reference.',
|
||||
'rvw_NETWORKING_PARAMS' => 'Networking Parameters',
|
||||
'rvw_SERVER_MODE' => 'Server Mode',
|
||||
|
@@ -4,7 +4,7 @@
|
||||
by the services running on your server.',
|
||||
'log_LOG_FILE_SELECT_DESC' => 'Choose a log file to view',
|
||||
'log_FILTER_PATTERN_DESC' => 'You may optionally specify a filter pattern to display only the
|
||||
lines from the log file which match this pattern.If you leave
|
||||
lines from the log file which match this pattern. If you leave
|
||||
this field blank, all available lines of the log file will be
|
||||
displayed. Note that this option is not used if you download the
|
||||
logfile.',
|
||||
|
100
root/usr/share/smanager/lib/SrvMngr_Auth.pm
Normal file
100
root/usr/share/smanager/lib/SrvMngr_Auth.pm
Normal file
@@ -0,0 +1,100 @@
|
||||
# Optimized SrvMngr_Auth module using stash caching and Exporter
|
||||
|
||||
package SrvMngr_Auth;
|
||||
|
||||
use strict;
|
||||
use warnings;
|
||||
use Exporter qw(import); # Import the Exporter module
|
||||
use esmith::AccountsDB;
|
||||
|
||||
# Define functions to be exported upon request
|
||||
our @EXPORT_OK = qw(check_admin_access load_user_auth_info has_panel_access get_panel_from_path);
|
||||
|
||||
# Helper function to extract panel name from path
|
||||
sub get_panel_from_path {
|
||||
my ($path) = @_;
|
||||
|
||||
if ($path =~ m{^/([^/]+)}) {
|
||||
return $1;
|
||||
}
|
||||
|
||||
return ''; # Return empty string if no panel found
|
||||
}
|
||||
|
||||
# Load user authentication info and cache it in the stash
|
||||
sub load_user_auth_info {
|
||||
my ($c) = @_;
|
||||
|
||||
# Check if auth info is already cached in the stash
|
||||
return if exists $c->stash->{auth_info};
|
||||
|
||||
my %auth_info = (
|
||||
username => '', # Initialize username
|
||||
is_admin => 0,
|
||||
allowed_panels => [],
|
||||
);
|
||||
|
||||
# Get username from session
|
||||
$auth_info{username} = $c->session->{username} || ''; # Provide default empty string
|
||||
|
||||
# Check if user is admin
|
||||
$auth_info{is_admin} = $c->is_admin || 0;
|
||||
|
||||
# If not admin, get allowed panels
|
||||
if (!$auth_info{is_admin} && $auth_info{username}) {
|
||||
my $accountsdb = esmith::AccountsDB->open_ro();
|
||||
if ($accountsdb) {
|
||||
my $user_rec = $accountsdb->get($auth_info{username});
|
||||
# Check if the property exists before trying to get its value
|
||||
if (defined $user_rec && $user_rec->prop('AdminPanels')) {
|
||||
# Get comma-separated list of allowed admin panels
|
||||
my $admin_panels = $user_rec->prop('AdminPanels');
|
||||
$auth_info{allowed_panels} = [split(/,/, $admin_panels)];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
# Store the calculated info in the stash
|
||||
$c->stash(auth_info => \%auth_info);
|
||||
}
|
||||
|
||||
# Check if a user has access to a specific panel (uses cached info)
|
||||
sub has_panel_access {
|
||||
my ($c, $panel) = @_;
|
||||
|
||||
# Ensure auth info is loaded
|
||||
load_user_auth_info($c);
|
||||
|
||||
my $auth_info = $c->stash->{auth_info};
|
||||
|
||||
# Check if requested panel is in allowed panels
|
||||
foreach my $allowed_panel (@{$auth_info->{allowed_panels}}) {
|
||||
return 1 if lc($panel) eq lc($allowed_panel)
|
||||
|| lc(substr($panel, 0, length($allowed_panel))) eq lc($allowed_panel);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
# Main function to check admin access (uses cached info)
|
||||
sub check_admin_access {
|
||||
my ($c) = @_;
|
||||
|
||||
# Ensure auth info is loaded
|
||||
load_user_auth_info($c);
|
||||
|
||||
my $auth_info = $c->stash->{auth_info};
|
||||
|
||||
# First check if user is admin
|
||||
return 1 if $auth_info->{is_admin};
|
||||
|
||||
# If not admin, check if they have access to the specific panel
|
||||
my $current_path = $c->req->url->path;
|
||||
my $requested_panel = $current_path;
|
||||
return 0 unless $requested_panel;
|
||||
|
||||
# Check if user has access to this panel using the cached info
|
||||
return has_panel_access($c, $requested_panel);
|
||||
}
|
||||
|
||||
1; # Return true value for module loading
|
@@ -0,0 +1,38 @@
|
||||
Configuration report created {$report_creation_time}
|
||||
|
||||
==================
|
||||
Base configuration
|
||||
==================
|
||||
SME server version: {$releaseversion}
|
||||
SME server mode: {$systemmode}
|
||||
SME server previous mode: {$previoussystemmode }
|
||||
Running Kernel: {$curkernel}
|
||||
===========================
|
||||
New RPMs not in base system
|
||||
===========================
|
||||
{ foreach $i (@newrpms) {
|
||||
$OUT .= "$i";
|
||||
}
|
||||
}
|
||||
===========================
|
||||
Custom and modified templates
|
||||
===========================
|
||||
{ foreach $i (@templates) {
|
||||
$OUT .= "$i";
|
||||
}
|
||||
}
|
||||
===========================
|
||||
Modified events
|
||||
===========================
|
||||
{ foreach $i (@events) {
|
||||
$OUT .= "$i";
|
||||
}
|
||||
}
|
||||
=======================
|
||||
Additional repositories
|
||||
=======================
|
||||
{ foreach $r (@repositories) {
|
||||
$OUT .= "$r";
|
||||
}
|
||||
}
|
||||
DONE!
|
@@ -1,90 +0,0 @@
|
||||
/*
|
||||
Generated by SM2Gen version: SM2Gen version:0.8 Chameleon version:4.5.4 On Python:3.12.3 at 2024-12-01 15:22:43
|
||||
*/
|
||||
.Letsencrypt-panel {}
|
||||
.name {}
|
||||
.rout {}
|
||||
.grou {}
|
||||
.link2 {}
|
||||
.link3 {}
|
||||
.link4 {}
|
||||
.endg {}
|
||||
.subh2 {}
|
||||
.read4 {}
|
||||
.read5 {}
|
||||
.read6 {}
|
||||
.subh3 {}
|
||||
.read1 {}
|
||||
.read2 {}
|
||||
.read3 {}
|
||||
.subh4 {}
|
||||
.tabl1 {}
|
||||
thead .tabl1 {}
|
||||
tbody .tabl1 {}
|
||||
.name {}
|
||||
.rout {}
|
||||
.subh {}
|
||||
.para1 {}
|
||||
.sele1 {}
|
||||
.sele2 {}
|
||||
.sele3 {}
|
||||
.sele4 {}
|
||||
.sele5 {}
|
||||
.sele6 {}
|
||||
.sele7 {}
|
||||
.emai8 {}
|
||||
.subm9 {}
|
||||
.name {}
|
||||
.rout {}
|
||||
.head {}
|
||||
.subh {}
|
||||
.text1 {}
|
||||
.back2 {}
|
||||
.name {}
|
||||
.rout {}
|
||||
.head {}
|
||||
.subh {}
|
||||
.text1 {}
|
||||
.back2 {}
|
||||
.name {}
|
||||
.rout {}
|
||||
.head {}
|
||||
.subh {}
|
||||
.read1 {}
|
||||
.text2 {}
|
||||
.back3 {}
|
||||
.inline-buttons {
|
||||
display: flex; /* Use flexbox to arrange items horizontally */
|
||||
gap: 10px; /* Optional: Add space between buttons */
|
||||
}
|
||||
|
||||
.inline-buttons .link {
|
||||
/* Additional styling can be added here if needed */
|
||||
}
|
||||
|
||||
|
||||
.inline-buttons .link {
|
||||
display: inline-block; /* Keep links as inline-block for button shape */
|
||||
padding: 7px 14px; /* Adjusted padding to approximate 70% of the original */
|
||||
margin: 0; /* Remove margin */
|
||||
background-color: #efefef; /* Light gray background color */
|
||||
color: black; /* Text color */
|
||||
text-decoration: none; /* Remove underline */
|
||||
border: 2px solid #bbb; /* Thin, light gray border */
|
||||
border-radius: 3px; /* Slightly rounded corners */
|
||||
font-size: 11.2px; /* Adjusted font size to approximate 70% of the original */
|
||||
text-align: center; /* Center the text */
|
||||
cursor: pointer; /* Pointer cursor on hover */ }
|
||||
|
||||
/* Hover and active effects for better interaction */
|
||||
.inline-buttons .link:hover {
|
||||
background-color: #d9d9d9; /* Darker shade on hover */
|
||||
}
|
||||
|
||||
.inline-buttons .link:active {
|
||||
background-color: #c0c0c0; /* Even darker shade on click */
|
||||
}
|
||||
|
||||
span .label {
|
||||
padding-top:13em;
|
||||
}
|
43
root/usr/share/smanager/themes/default/public/css/module.css
Normal file
43
root/usr/share/smanager/themes/default/public/css/module.css
Normal 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;
|
||||
}
|
@@ -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;
|
||||
}
|
283
root/usr/share/smanager/themes/default/public/css/new_sme.css
Normal file
283
root/usr/share/smanager/themes/default/public/css/new_sme.css
Normal 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 |
@@ -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;
|
||||
}
|
||||
});
|
||||
});
|
@@ -74,10 +74,8 @@
|
||||
</p><br>
|
||||
|
||||
%= hidden_field 'Function' => $bac_datas->{'function'}
|
||||
<div class='center'>
|
||||
%= submit_button $c->l('bac_UPDATE_CONF'), class => 'action'
|
||||
</div>
|
||||
|
||||
% end
|
||||
</div>
|
||||
% end
|
||||
% end
|
@@ -30,10 +30,8 @@
|
||||
|
||||
%= hidden_field 'Function' => $bac_datas->{'function'}
|
||||
|
||||
<div class='center'>
|
||||
%= submit_button $c->l('bac_RESTORE_FROM_TAPE'), class => 'action'
|
||||
</div>
|
||||
|
||||
% end
|
||||
</div>
|
||||
% end
|
||||
% end
|
@@ -44,12 +44,10 @@
|
||||
</span></p>
|
||||
|
||||
%= hidden_field 'Function' => $bac_datas->{'function'} . '1'
|
||||
<div class='center'>
|
||||
%= submit_button $c->l('NEXT'), class => 'action'
|
||||
</div>
|
||||
|
||||
% end
|
||||
|
||||
</div>
|
||||
|
||||
% end
|
||||
% end
|
@@ -148,9 +148,7 @@
|
||||
|
||||
%= hidden_field 'Function' => $bac_datas->{function}
|
||||
%= hidden_field 'VFSType' => $bac_datas->{vfstype}
|
||||
<div class='center'>
|
||||
%= submit_button $c->l('bac_UPDATE_CONF'), class => 'action'
|
||||
</div>
|
||||
% end
|
||||
</div>
|
||||
% end
|
||||
% end
|
@@ -38,9 +38,7 @@
|
||||
</span><br><br>
|
||||
|
||||
%= hidden_field 'Function' => $bac_datas->{'function'}
|
||||
<div class='center'>
|
||||
%= submit_button $c->l('bac_RESTORE_FROM_WORKSTN'), class => 'action'
|
||||
</div>
|
||||
% end
|
||||
</div>
|
||||
% end
|
||||
% end
|
@@ -29,9 +29,7 @@
|
||||
%=l 'bac_YOU_MUST_REBOOT'
|
||||
</p>
|
||||
%= hidden_field 'Function' => $bac_datas->{'function'}
|
||||
<div class='center'>
|
||||
%= submit_button $c->l('bac_REBOOT'), class => 'action'
|
||||
</div>
|
||||
% end
|
||||
</div>
|
||||
|
||||
|
@@ -39,12 +39,10 @@
|
||||
</span><br>
|
||||
<br>
|
||||
%= hidden_field 'Function' => $bac_datas->{'function'}
|
||||
<div class='center'>
|
||||
%= submit_button $c->l('PERFORM'), class => 'action'
|
||||
</div>
|
||||
|
||||
% end
|
||||
|
||||
</div>
|
||||
|
||||
% end
|
||||
% end
|
@@ -41,9 +41,7 @@
|
||||
%= hidden_field 'Backupset' => $bac_datas->{'backupset'}
|
||||
%= hidden_field 'Filterexp' => $bac_datas->{'filterexp'}
|
||||
|
||||
<div class='center'>
|
||||
%= submit_button $c->l('PERFORM'), class => 'action'
|
||||
</div>
|
||||
|
||||
% end
|
||||
|
||||
|
@@ -24,9 +24,7 @@
|
||||
|
||||
%= form_for '/backupd' => (method => 'POST') => begin
|
||||
%= hidden_field 'Function' => $bac_datas->{'function'}
|
||||
<div class='center'>
|
||||
%= submit_button $c->l('NEXT'), class => 'action'
|
||||
</div>
|
||||
|
||||
% end
|
||||
|
||||
|
@@ -44,10 +44,8 @@
|
||||
|
||||
<br><br>
|
||||
%= hidden_field 'Function' => $bac_datas->{'function'} . '1'
|
||||
<div class='center'>
|
||||
%= submit_button $c->l('bac_VERIFY'), class => 'action'
|
||||
</div>
|
||||
|
||||
% end
|
||||
</div>
|
||||
% end
|
||||
% end
|
@@ -28,10 +28,8 @@
|
||||
|
||||
%= hidden_field 'Function' => $bac_datas->{'function'}
|
||||
|
||||
<div class='center'>
|
||||
%= submit_button $c->l('NEXT'), class => 'action'
|
||||
</div>
|
||||
|
||||
% end
|
||||
</div>
|
||||
% end
|
||||
% end
|
@@ -11,42 +11,52 @@
|
||||
# The events handle cases where mysqld is not enabled, and/or is not running.
|
||||
my $status = system("/sbin/e-smith/signal-event", "pre-backup", "desktop");
|
||||
if ($status) {
|
||||
desktopBackupRecordStatus($backup_rec, 'pre-backup', $status);
|
||||
return ($c->l('bac_OPERATION_STATUS_REPORT').
|
||||
$c->l('bac_ERR_PRE_BACKUP'));
|
||||
$c->desktopBackupRecordStatus($backup_rec, 'pre-backup', $status);
|
||||
return ($c->l('bac_OPERATION_STATUS_REPORT').$c->l('bac_ERR_PRE_BACKUP'));
|
||||
}
|
||||
|
||||
my $clvl = $c->stash('compressionlevel');
|
||||
my $cmd = "/bin/tar --directory / --create @{$c->stash('directories')} --file=-"
|
||||
. "@{$c->stash('exclude')} | /usr/bin/gzip $clvl ";
|
||||
my $cmd = "/bin/tar --create --file=- --directory / @{$c->stash('exclude')} "
|
||||
. "@{$c->stash('directories')} | /usr/bin/gzip $clvl ";
|
||||
|
||||
my $success = open my $fh, '-|', $cmd;
|
||||
unless ($success) { return "Error dowload command."; };
|
||||
|
||||
# Write chunk
|
||||
$c->res->headers->content_type('application/x-tar');
|
||||
$c->res->headers->content_disposition(qq/attachment; filename="smeserver.tgz"/);
|
||||
|
||||
my $cb;
|
||||
$cb = sub {
|
||||
my $c = shift;
|
||||
my $size = 500 * 1024;
|
||||
my $length = sysread($fh, my $buffer, $size);
|
||||
unless ($length) {
|
||||
close $fh;
|
||||
undef $cb;
|
||||
$c->finish;
|
||||
return;
|
||||
}
|
||||
$c->write_chunk($buffer, $cb);
|
||||
};
|
||||
$c->$cb;
|
||||
#unless ($success) { return "Error download command."; };
|
||||
if ($success) {
|
||||
# Try with download plugin - seems to fail to complete download and also
|
||||
# name of file deposited is not as required.
|
||||
#my $output = do { local $/; <$fh> };
|
||||
#close $fh;
|
||||
#$c->render_file(
|
||||
#data => $output,
|
||||
#filename => 'output.txt',
|
||||
#content_type => 'text/plain'
|
||||
#);
|
||||
# So organise it ourselves.
|
||||
$c->res->headers->content_type('application/x-tar');
|
||||
$c->res->headers->content_disposition(qq/attachment; filename="smeserver.tgz"/);
|
||||
my $cb;
|
||||
$cb = sub {
|
||||
my $c = shift;
|
||||
my $size = 500 * 1024;
|
||||
my $length = sysread($fh, my $buffer, $size);
|
||||
unless ($length) {
|
||||
close $fh;
|
||||
undef $cb;
|
||||
$c->finish;
|
||||
return;
|
||||
}
|
||||
$c->write_chunk($buffer, $cb);
|
||||
};
|
||||
$c->$cb;
|
||||
} else {
|
||||
$c->render(text => "Failed to execute command: $!", status => 500);
|
||||
}
|
||||
|
||||
# Remove the dumped tables.
|
||||
$status = system("/sbin/e-smith/signal-event", "post-backup", "desktop");
|
||||
if ($status) {
|
||||
desktopBackupRecordStatus($backup_rec, 'post-backup', $status);
|
||||
die ($c->l('bac_ERR_POST_BACKUP'),"\n");
|
||||
$c->desktopBackupRecordStatus($backup_rec, 'post-backup', $status);
|
||||
die ($c->l('bac_ERR_POST_BACKUP'),"\n");
|
||||
}
|
||||
|
||||
$now = time();
|
||||
@@ -54,3 +64,4 @@
|
||||
$backup_rec->set_prop('Result', "0");
|
||||
|
||||
%>
|
||||
1;
|
@@ -70,12 +70,10 @@
|
||||
</span></p>
|
||||
|
||||
<br>
|
||||
<div class='center'>
|
||||
%= submit_button $c->l('PERFORM'), class => 'action'
|
||||
</div>
|
||||
|
||||
%= submit_button $c->l('PERFORM'), class => 'action'
|
||||
|
||||
% end
|
||||
|
||||
</div>
|
||||
|
||||
% end
|
||||
% end
|
@@ -18,9 +18,16 @@
|
||||
<% my $btn = l('bugr_Download this report'); %>
|
||||
|
||||
%= form_for 'bugreportD' => (method => 'POST') => begin
|
||||
%= submit_button "$btn", class => 'action'
|
||||
%= hidden_field 'trt' => $bugr_datas->{trt}
|
||||
% end
|
||||
%= submit_button "$btn", class => 'action'
|
||||
%= hidden_field 'trt' => $bugr_datas->{trt}
|
||||
% end
|
||||
|
||||
% my $out = "================== <br />";
|
||||
% $out .= "Boot anaysis image (right click and save image to download)<br />";
|
||||
% $out .= "================== <br />";
|
||||
% $out .= "<img src='images/boot.svg' alt='boot timing image' width=95% >";
|
||||
|
||||
<br><%= $c->render_to_string(inline=>$out) %><br>
|
||||
|
||||
</div>
|
||||
|
||||
|
@@ -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
|
@@ -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>
|
||||
|
@@ -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>
|
||||
|
@@ -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
|
@@ -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>
|
||||
|
@@ -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>
|
||||
%}
|
||||
|
@@ -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
|
@@ -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
|
@@ -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
|
@@ -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>
|
@@ -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>
|
@@ -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 = '';}
|
||||
|
@@ -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>
|
@@ -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>
|
@@ -1,45 +0,0 @@
|
||||
%#
|
||||
%# Generated by SM2Gen version:0.8 Chameleon version:4.5.4 On Python:3.12.3 at 2024-12-01 15:22:43
|
||||
%#
|
||||
<div id="Letsencrypt-CHECKALLDOMAINS" class="partial Letsencrypt-CHECKALLDOMAINS">
|
||||
<script>
|
||||
window.onload = function() {
|
||||
SelectInput();
|
||||
};
|
||||
</script>
|
||||
% if (config->{debug} == 1) {
|
||||
<pre>
|
||||
%= dumper $lets_data
|
||||
</pre>
|
||||
% }
|
||||
% my $btn = l('lets_APPLY');
|
||||
%= form_for "letsencryptu" => (method => 'POST') => begin
|
||||
% param 'trt' => $lets_data->{trt} unless param 'trt';
|
||||
%= hidden_field 'trt' => $lets_data->{trt}
|
||||
%# Inputs etc in here.
|
||||
|
||||
<h1 class='head'><%=l('lets_Check_all_domains')%></h1>
|
||||
|
||||
<h2 class='subh'><%=l('lets_Loop_through_checking_the_letsencrypt')%></h2>
|
||||
|
||||
<span class=label>
|
||||
%=l('lets_All_domains_check_result')
|
||||
</span><span class=data>
|
||||
% param 'AllDomainsCheck' => $lets_data->{AllDomainsCheck} unless param 'AllDomainsCheck';
|
||||
%= text_area 'AllDomainsCheck', cols=>40, rows=>10, Readonly=>'true'
|
||||
</span><br>
|
||||
|
||||
<span class='data'>
|
||||
%my $back_text = l('lets_Back'); # Localized text
|
||||
%my $actionBack = qq{
|
||||
% <a href="letsencryptd">
|
||||
% <input class='action back' type='submit' value='$back_text'>
|
||||
% </a>
|
||||
%};
|
||||
<%= $c->render_to_string(inline => $actionBack) %>
|
||||
</span>
|
||||
|
||||
|
||||
%# Probably finally by a submit.
|
||||
%end
|
||||
</div>
|
@@ -1,45 +0,0 @@
|
||||
%#
|
||||
%# Generated by SM2Gen version:0.8 Chameleon version:4.5.4 On Python:3.12.3 at 2024-12-01 15:22:43
|
||||
%#
|
||||
<div id="Letsencrypt-CHECKALLENABLEDDOMAINS" class="partial Letsencrypt-CHECKALLENABLEDDOMAINS">
|
||||
<script>
|
||||
window.onload = function() {
|
||||
SelectInput();
|
||||
};
|
||||
</script>
|
||||
% if (config->{debug} == 1) {
|
||||
<pre>
|
||||
%= dumper $lets_data
|
||||
</pre>
|
||||
% }
|
||||
% my $btn = l('lets_APPLY');
|
||||
%= form_for "letsencryptu" => (method => 'POST') => begin
|
||||
% param 'trt' => $lets_data->{trt} unless param 'trt';
|
||||
%= hidden_field 'trt' => $lets_data->{trt}
|
||||
%# Inputs etc in here.
|
||||
|
||||
<h1 class='head'><%=l('lets_Check_all_enabled_domains')%></h1>
|
||||
|
||||
<h2 class='subh'><%=l('lets_Loop_through_checking_the_letsencrypt')%></h2>
|
||||
|
||||
<span class=label>
|
||||
%=l('lets_Enabled_domains_check_result')
|
||||
</span><span class=data>
|
||||
% param 'EnabledDomainsCheck' => $lets_data->{EnabledDomainsCheck} unless param 'EnabledDomainsCheck';
|
||||
%= text_area 'EnabledDomainsCheck', cols=>40, rows=>10, Readonly=>'true'
|
||||
</span><br>
|
||||
|
||||
<span class='data'>
|
||||
%my $back_text = l('lets_Back'); # Localized text
|
||||
%my $actionBack = qq{
|
||||
% <a href="letsencryptd">
|
||||
% <input class='action back' type='submit' value='$back_text'>
|
||||
% </a>
|
||||
%};
|
||||
<%= $c->render_to_string(inline => $actionBack) %>
|
||||
</span>
|
||||
|
||||
|
||||
%# Probably finally by a submit.
|
||||
%end
|
||||
</div>
|
@@ -1,52 +0,0 @@
|
||||
%#
|
||||
%# Generated by SM2Gen version:0.8 Chameleon version:4.5.4 On Python:3.12.3 at 2024-12-01 15:22:43
|
||||
%#
|
||||
<div id="Letsencrypt-CHECKONEDOMAIN" class="partial Letsencrypt-CHECKONEDOMAIN">
|
||||
<script>
|
||||
window.onload = function() {
|
||||
SelectInput();
|
||||
};
|
||||
</script>
|
||||
% if (config->{debug} == 1) {
|
||||
<pre>
|
||||
%= dumper $lets_data
|
||||
</pre>
|
||||
% }
|
||||
% my $btn = l('lets_APPLY');
|
||||
%= form_for "letsencryptu" => (method => 'POST') => begin
|
||||
% param 'trt' => $lets_data->{trt} unless param 'trt';
|
||||
%= hidden_field 'trt' => $lets_data->{trt}
|
||||
%# Inputs etc in here.
|
||||
|
||||
<h1 class='head'><%=l('lets_Check_just_one_domain')%></h1>
|
||||
|
||||
<h2 class='subh'><%=l('lets_Loop_through_and_check_the')%></h2>
|
||||
|
||||
<p><span class=label>
|
||||
%=l('lets_Domains_name')
|
||||
</span><span class=data>
|
||||
% param 'OneDomainToCheck' => $lets_data->{OneDomainToCheck} unless param 'OneDomainToCheck';
|
||||
%= text_field 'OneDomainToCheck', size => '50', class => 'textinput OneDomainToCheck' , pattern=>'.*' , placeholder=>'OneDomainToCheck', Readonly=>'true'
|
||||
<br></span></p>
|
||||
|
||||
<span class=label>
|
||||
%=l('lets_One_domain_check_result')
|
||||
</span><span class=data>
|
||||
% param 'OneDomainsCheck' => $lets_data->{OneDomainsCheck} unless param 'OneDomainsCheck';
|
||||
%= text_area 'OneDomainsCheck', cols=>40, rows=>10, Readonly=>'true'
|
||||
</span><br>
|
||||
|
||||
<span class='data'>
|
||||
%my $back_text = l('lets_Back'); # Localized text
|
||||
%my $actionBack = qq{
|
||||
% <a href="letsencryptd">
|
||||
% <input class='action back' type='submit' value='$back_text'>
|
||||
% </a>
|
||||
%};
|
||||
<%= $c->render_to_string(inline => $actionBack) %>
|
||||
</span>
|
||||
|
||||
|
||||
%# Probably finally by a submit.
|
||||
%end
|
||||
</div>
|
@@ -1,126 +0,0 @@
|
||||
%#
|
||||
%# Generated by SM2Gen version:0.8 Chameleon version:4.5.4 On Python:3.12.3 at 2024-12-01 15:22:43
|
||||
%#
|
||||
<div id="Letsencrypt-LIST" class="partial Letsencrypt-LIST">
|
||||
<script>
|
||||
window.onload = function() {
|
||||
SelectInput();
|
||||
};
|
||||
</script>
|
||||
% if (config->{debug} == 1) {
|
||||
<pre>
|
||||
%= dumper $lets_data
|
||||
</pre>
|
||||
% }
|
||||
% my $btn = l('lets_APPLY');
|
||||
%= form_for "letsencryptu" => (method => 'POST') => begin
|
||||
% param 'trt' => $lets_data->{trt} unless param 'trt';
|
||||
%= hidden_field 'trt' => $lets_data->{trt}
|
||||
%# Inputs etc in here.
|
||||
|
||||
<div class=inline-buttons>
|
||||
|
||||
|
||||
<a href='letsencryptd?trt=PARAMS' class='link link2'>
|
||||
%= l('lets_CONFIG')
|
||||
</a>
|
||||
%#= link_to l('lets_CONFIG'), 'letsencryptd?trt=PARAMS' , class=>'link link2'
|
||||
|
||||
|
||||
<a href='letsencryptd?trt=CHECKALLDOMAINS' class='link link3'>
|
||||
%= l('lets_CHECK_ALL_DOMAINS')
|
||||
</a>
|
||||
%#= link_to l('lets_CHECK_ALL_DOMAINS'), 'letsencryptd?trt=CHECKALLDOMAINS' , class=>'link link3'
|
||||
|
||||
|
||||
<a href='letsencryptd?trt=CHECKALLENABLEDDOMAINS' class='link link4'>
|
||||
%= l('lets_CHECK_ALL_ENABLED_DOMAINS')
|
||||
</a>
|
||||
%#= link_to l('lets_CHECK_ALL_ENABLED_DOMAINS'), 'letsencryptd?trt=CHECKALLENABLEDDOMAINS' , class=>'link link4'
|
||||
|
||||
|
||||
</div>
|
||||
|
||||
|
||||
<h2 class='subh2'><%=l('lets_For_this_Server')%></h2>
|
||||
|
||||
<p><span class=label>
|
||||
%=l('lets_Internal_IP')
|
||||
</span><span class=data>
|
||||
% param 'InternalIP' => $lets_data->{InternalIP} unless param 'InternalIP';
|
||||
%= text_field 'InternalIP', size => '50', class => 'textinput InternalIP' , pattern=>'.*' , placeholder=>'InternalIP', Readonly=>'true'
|
||||
<br></span></p>
|
||||
|
||||
<p><span class=label>
|
||||
%=l('lets_External_Interface_IP')
|
||||
</span><span class=data>
|
||||
% param 'ExternalIP' => $lets_data->{ExternalIP} unless param 'ExternalIP';
|
||||
%= text_field 'ExternalIP', size => '50', class => 'textinput ExternalIP' , pattern=>'.*' , placeholder=>'ExternalIP', Readonly=>'true'
|
||||
<br></span></p>
|
||||
|
||||
<p><span class=label>
|
||||
%=l('lets_Internet_IP')
|
||||
</span><span class=data>
|
||||
% param 'InternetIP' => $lets_data->{InternetIP} unless param 'InternetIP';
|
||||
%= text_field 'InternetIP', size => '50', class => 'textinput InternetIP' , pattern=>'.*' , placeholder=>'InternetIP', Readonly=>'true'
|
||||
<br></span></p>
|
||||
|
||||
<h2 class='subh3'><%=l('lets_Current_certificate_details')%></h2>
|
||||
|
||||
<p><span class=label>
|
||||
%=l('lets_Issuer')
|
||||
</span><span class=data>
|
||||
% param 'Issuer' => $lets_data->{Issuer} unless param 'Issuer';
|
||||
%= text_field 'Issuer', size => '50', class => 'textinput Issuer' , pattern=>'.*' , placeholder=>'Issuer', Readonly=>'true'
|
||||
<br></span></p>
|
||||
|
||||
<p><span class=label>
|
||||
%=l('lets_Expiry')
|
||||
</span><span class=data>
|
||||
% param 'Expiry' => $lets_data->{Expiry} unless param 'Expiry';
|
||||
%= text_field 'Expiry', size => '50', class => 'textinput Expiry' , pattern=>'.*' , placeholder=>'Expiry', Readonly=>'true'
|
||||
<br></span></p>
|
||||
|
||||
<p><span class=label>
|
||||
%=l('lets_Not_Before')
|
||||
</span><span class=data>
|
||||
% param 'NotBefore' => $lets_data->{NotBefore} unless param 'NotBefore';
|
||||
%= text_field 'NotBefore', size => '50', class => 'textinput NotBefore' , pattern=>'.*' , placeholder=>'NotBefore', Readonly=>'true'
|
||||
<br></span></p>
|
||||
|
||||
<h2 class='subh4'><%=l('lets_List_of_Domains_and_Hosts')%></h2>
|
||||
|
||||
<br /><table class="sme-border TableSort sme-table tabl1 ">
|
||||
<thead class='tabl1'>
|
||||
<tr table-head-row>
|
||||
<th class='sme-border table-head-col table-head-col-Domain name / HOSTNAME '><%=l('lets_Domain_name_/_HOSTNAME')%></th>
|
||||
<th class='sme-border table-head-col table-head-col-Brief description '><%=l('lets_Brief_description')%></th>
|
||||
<th class='sme-border table-head-col table-head-col-Content '><%=l('lets_Content')%></th>
|
||||
<th class='sme-border table-head-col table-head-col-LABEL_NAMESERVERS '><%=l('lets_LABEL_NAMESERVERS')%></th>
|
||||
<th class='sme-border table-head-col table-head-col-LABEL_POINT '><%=l('lets_LABEL_POINT')%></th>
|
||||
<th class='sme-border table-head-col table-head-col-LABEL_LECERT '><%=l('lets_LABEL_LECERT')%></th>
|
||||
<th class='sme-border table-head-col table-head-col-IS_IN_CERT '><%=l('lets_IS_IN_CERT')%></th>
|
||||
<th class='sme-border table-head-col table-head-col-CHECK '><%=l('lets_CHECK')%></th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody class='tabl1'>
|
||||
% my $control_data = $c->stash('DomainList');
|
||||
% foreach my $row (@$control_data) {
|
||||
<tr class='table-row'>
|
||||
<td class='sme-border table-col table-col-Table1-Domain name / HOSTNAME'><%=$c->render_to_string(inline=>$row->{'Table1-Domain name / HOSTNAME'})%></td>
|
||||
<td class='sme-border table-col table-col-Table1-Brief description'><%=$c->render_to_string(inline=>$row->{'Table1-Brief description'})%></td>
|
||||
<td class='sme-border table-col table-col-Table1-Content'><%=$c->render_to_string(inline=>$row->{'Table1-Content'})%></td>
|
||||
<td class='sme-border table-col table-col-Table1-LABEL_NAMESERVERS'><%=$c->render_to_string(inline=>$row->{'Table1-LABEL_NAMESERVERS'})%></td>
|
||||
<td class='sme-border table-col table-col-Table1-LABEL_POINT'><%=$c->render_to_string(inline=>$row->{'Table1-LABEL_POINT'})%></td>
|
||||
<td class='sme-border table-col table-col-Table1-LABEL_LECERT'><%=$c->render_to_string(inline=>$row->{'Table1-LABEL_LECERT'})%></td>
|
||||
<td class='sme-border table-col table-col-Table1-IS_IN_CERT'><%=$c->render_to_string(inline=>$row->{'Table1-IS_IN_CERT'})%></td>
|
||||
<td class='sme-border table-col table-col-Table1-CHECK'><%=$c->render_to_string(inline=>$row->{'Table1-CHECK'})%></td>
|
||||
</tr>
|
||||
%}
|
||||
</tbody>
|
||||
</table>
|
||||
|
||||
|
||||
%# Probably finally by a submit.
|
||||
%end
|
||||
</div>
|
@@ -1,97 +0,0 @@
|
||||
%#
|
||||
%# Generated by SM2Gen version:0.8 Chameleon version:4.5.4 On Python:3.12.3 at 2024-12-01 15:22:43
|
||||
%#
|
||||
<div id="Letsencrypt-PARAMS" class="partial Letsencrypt-PARAMS">
|
||||
<script>
|
||||
window.onload = function() {
|
||||
SelectInput();
|
||||
};
|
||||
</script>
|
||||
% if (config->{debug} == 1) {
|
||||
<pre>
|
||||
%= dumper $lets_data
|
||||
</pre>
|
||||
% }
|
||||
% my $btn = l('lets_APPLY');
|
||||
%= form_for "letsencryptu" => (method => 'POST') => begin
|
||||
% param 'trt' => $lets_data->{trt} unless param 'trt';
|
||||
%= hidden_field 'trt' => $lets_data->{trt}
|
||||
%# Inputs etc in here.
|
||||
|
||||
<h2 class='subh'><%=l('lets_Manage_letsencrypt-config_settings:')%></h2>
|
||||
|
||||
<p class='paragraph para1'>
|
||||
%=l('lets_CONFIG_LETSENCRYPT')
|
||||
</p>
|
||||
|
||||
<p><span class=label>
|
||||
%=l('lets_SERVICE_STATUS')
|
||||
</span><span class=data>
|
||||
% my @status_options = [['Disabled' => 'disabled'], ['Enabled' => 'enabled'], ['TEST' => 'test']];
|
||||
% param 'status' => $lets_data->{status} unless param 'status';
|
||||
%= select_field 'status' => @status_options, class => 'input'
|
||||
<br></span> </p>
|
||||
|
||||
<p><span class=label>
|
||||
%=l('lets_HOOKSCRIPT_STATUS')
|
||||
</span><span class=data>
|
||||
% my @hookScript_options = [['Disabled' => 'disabled'], ['Enabled' => 'enabled']];
|
||||
% param 'hookScript' => $lets_data->{hookScript} unless param 'hookScript';
|
||||
%= select_field 'hookScript' => @hookScript_options, class => 'input'
|
||||
<br></span> </p>
|
||||
|
||||
<p><span class=label>
|
||||
%=l('lets_HOSTOVERRIDE_STATUS')
|
||||
</span><span class=data>
|
||||
% my @hostOverride_options = [['Disabled' => 'disabled'], ['Yes' => 'yes']];
|
||||
% param 'hostOverride' => $lets_data->{hostOverride} unless param 'hostOverride';
|
||||
%= select_field 'hostOverride' => @hostOverride_options, class => 'input'
|
||||
<br></span> </p>
|
||||
|
||||
<p><span class=label>
|
||||
%=l('lets_ACCEPT_TERMS_STATUS')
|
||||
</span><span class=data>
|
||||
% my @ACCEPT_TERMS_options = [['Disabled' => 'disabled'], ['Yes' => 'yes']];
|
||||
% param 'ACCEPT_TERMS' => $lets_data->{ACCEPT_TERMS} unless param 'ACCEPT_TERMS';
|
||||
%= select_field 'ACCEPT_TERMS' => @ACCEPT_TERMS_options, class => 'input'
|
||||
<br></span> </p>
|
||||
|
||||
<p><span class=label>
|
||||
%=l('lets_API_STATUS')
|
||||
</span><span class=data>
|
||||
% my @API_options = [['2' => '2']];
|
||||
% param 'API' => $lets_data->{API} unless param 'API';
|
||||
%= select_field 'API' => @API_options, class => 'input'
|
||||
<br></span> </p>
|
||||
|
||||
<p><span class=label>
|
||||
%=l('lets_KEYSIZE_STATUS')
|
||||
</span><span class=data>
|
||||
% my @keysize_options = [['2048' => '2048'], ['3072' => '3072'], ['4096' => '4096']];
|
||||
% param 'keysize' => $lets_data->{keysize} unless param 'keysize';
|
||||
%= select_field 'keysize' => @keysize_options, class => 'input'
|
||||
<br></span> </p>
|
||||
|
||||
<p><span class=label>
|
||||
%=l('lets_CONFIGUREMODE_STATUS')
|
||||
</span><span class=data>
|
||||
% my @configure_options = [['ALL' => 'all'], ['Domains' => 'domains'], ['HOSTS' => 'hosts'], ['NONE' => 'none']];
|
||||
% param 'configure' => $lets_data->{configure} unless param 'configure';
|
||||
%= select_field 'configure' => @configure_options, class => 'input'
|
||||
<br></span> </p>
|
||||
|
||||
<p><span class=label>
|
||||
%=l('lets_EMAIL')
|
||||
</span><span class=data>
|
||||
% param 'email' => $lets_data->{email} unless param 'email';
|
||||
%=email_field 'email', class => 'emai8'
|
||||
</span></p>
|
||||
|
||||
|
||||
<span class='data'>
|
||||
%= submit_button l('lets_Save'), class => 'action subm9'
|
||||
</span>
|
||||
|
||||
%# Probably finally by a submit.
|
||||
%end
|
||||
</div>
|
@@ -4,7 +4,7 @@
|
||||
% my %ret;
|
||||
% unless (length($retref)) {%ret = (ret=>"");}
|
||||
% else {%ret = %$retref;}
|
||||
|
||||
|
||||
% my @vars = split(",",$ret{vars});
|
||||
% my $var1 = @vars[0];
|
||||
% my $var2 = @vars[1];
|
||||
@@ -13,30 +13,31 @@
|
||||
% 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 {
|
||||
%} 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 />
|
||||
% my $btn = l('ADD');
|
||||
% my $network_db = esmith::NetworksDB->open();
|
||||
|
||||
% my $network_db = esmith::NetworksDB::UTF8->open() || die "Couldn't open NetworksDB db";
|
||||
|
||||
% if (config->{debug} == 1) {
|
||||
<p>
|
||||
%= dumper $c->current_route
|
||||
%= dumper $c->stash("ret")
|
||||
</p>
|
||||
% }
|
||||
|
||||
|
||||
%= form_for '/localnetworksb' => (method => 'POST') => begin
|
||||
<h2>
|
||||
%=l "ln_ADD_TITLE"
|
||||
@@ -66,5 +67,4 @@
|
||||
</p>
|
||||
%end
|
||||
|
||||
</div>
|
||||
|
||||
</div>
|
@@ -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>
|
@@ -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>
|
@@ -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>
|
@@ -11,4 +11,4 @@
|
||||
</span>
|
||||
</p>
|
||||
|
||||
<hr class='sectionbar' />
|
||||
<!--<hr class='sectionbar' />-->
|
@@ -1,5 +1,7 @@
|
||||
% use SrvMngr qw( getNavigation );
|
||||
% my %nav = %{SrvMngr->getNavigation( $c->languages(), 'U' )};
|
||||
% use SrvMngr qw( getNavigation simpleNavMerge );
|
||||
% my %nav1 = %{SrvMngr->getNavigation( $c->languages(), 'U' )};
|
||||
% my %nav2 = %{SrvMngr->getNavigation( $c->languages(), 'A', session('username') )};
|
||||
% my %nav = $c->session->{is_admin} ? %nav1 : %{SrvMngr->simpleNavMerge(\%nav1, \%nav2)};
|
||||
|
||||
<div id='usermenu'>
|
||||
<a href='#' id='toguser' class='section section-title'>Current User (<%= session 'username' %>)</a>
|
||||
@@ -7,26 +9,24 @@
|
||||
% my $cc = 300;
|
||||
% foreach my $h (sort { ($nav{$a}{'WEIGHT'}/$nav{$a}{'COUNT'})
|
||||
% <=> ($nav{$b}{'WEIGHT'}/$nav{$b}{'COUNT'}) } keys %nav) {
|
||||
<!-- div class='section'><%= $h %></div -->
|
||||
% my ($classNew, $target, $href) = '';
|
||||
% foreach (sort { $a->{'WEIGHT'} <=> $b->{'WEIGHT'} } @{$nav{$h}{'DESCRIPTIONS'}}) {
|
||||
|
||||
% next if ($_->{'MENUCAT'} ne 'U' ); # menu User
|
||||
|
||||
% if ( $_->{'FILENAME'} =~ m/^2\// ) {
|
||||
% $target = '_self';
|
||||
% (my $file2 = $_->{'FILENAME'}) =~ s|^2/||;
|
||||
% $href = '/smanager/' . $file2;
|
||||
% } else {
|
||||
% $target = 'main';
|
||||
% $href = '/server-manager' . $_->{'FILENAME'};
|
||||
% }
|
||||
<div class='menu-cell'><a class='item<%= $classNew %>' target='<%= $target %>'
|
||||
id='sme<%= $cc %>' href='<%= $href %>'><%= $_->{'DESCRIPTION'} %></a></div>
|
||||
<!-- div class='section'><%= $h %></div -->
|
||||
% my ($classNew, $target, $href) = '';
|
||||
% foreach (sort { $a->{'WEIGHT'} <=> $b->{'WEIGHT'} } @{$nav{$h}{'DESCRIPTIONS'}}) {
|
||||
% next if ($_->{'MENUCAT'} ne 'A' && $_->{'MENUCAT'} ne 'U' ); # menu User
|
||||
% if ( $_->{'FILENAME'} =~ m/^2\// ) {
|
||||
% $target = '_self';
|
||||
% (my $file2 = $_->{'FILENAME'}) =~ s|^2/||;
|
||||
% $href = '/smanager/' . $file2;
|
||||
% } else {
|
||||
% $target = 'main';
|
||||
% $href = '/server-manager' . $_->{'FILENAME'};
|
||||
% }
|
||||
<div class='menu-cell'><a class='item<%= $classNew %>' target='<%= $target %>'
|
||||
id='sme<%= $cc %>' href='<%= $href %>'><%= $_->{'DESCRIPTION'} %></a></div>
|
||||
% $cc++;
|
||||
% }
|
||||
% }
|
||||
|
||||
% }
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
@@ -59,11 +59,11 @@
|
||||
%= t td => (class => 'sme-border') => "$first $last"
|
||||
%= t td => (class => 'sme-border') => $vpnaccess
|
||||
%= t td => (class => 'sme-border') => $fwd
|
||||
%my ($actionModify, $actionLock, $actionResetPw, $actionRemove,$actionroundcube) = ' ';
|
||||
%my $modify_text = l('MODIFY'); # Localized text
|
||||
%my $csrf_token = "TOKEN"; # CSRF token for security
|
||||
%my $useraccounts_user_name = $user->key; # useraccountss_entry name extracted from the data structure
|
||||
%my $password_text = l("PASSWORD_RESET");
|
||||
% my ($actionModify, $actionLock, $actionResetPw, $actionRemove,$actionroundcube) = ' ';
|
||||
% my $modify_text = l('MODIFY'); # Localized text
|
||||
% my $csrf_token = "TOKEN"; # CSRF token for security
|
||||
% my $useraccounts_user_name = $user->key; # useraccountss_entry name extracted from the data structure
|
||||
% my $password_text = l("PASSWORD_RESET");
|
||||
%if ($useraccounts_user_name eq 'admin') {
|
||||
%$actionModify = qq{
|
||||
%<a href="useraccountsd?CsrfDef=$csrf_token&trt=UPS&user=$useraccounts_user_name">
|
||||
@@ -98,9 +98,9 @@
|
||||
%</a>
|
||||
%};
|
||||
%} elsif ($useraccounts_user_name ne 'admin') {
|
||||
%my $lock_text = l('ACCOUNT LOCKED'); # Localized text
|
||||
%my $csrf_token = "TOKEN"; # CSRF token for security
|
||||
%my $useraccounts_user_name = $user->key; # useraccountss_entry name extracted from the data structure
|
||||
% my $lock_text = l('ACCOUNT LOCKED'); # Localized text
|
||||
% my $csrf_token = "TOKEN"; # CSRF token for security
|
||||
% my $useraccounts_user_name = $user->key; # useraccountss_entry name extracted from the data structure
|
||||
%$actionLock = qq{
|
||||
%<a href="useraccountsd?CsrfDef=$csrf_token&trt=LCK&user=$useraccounts_user_name">
|
||||
% <button type='button' class='sme-lock-button' title='$lock_text' >
|
||||
@@ -117,8 +117,8 @@
|
||||
%};
|
||||
%}
|
||||
%if ( $removable eq 'yes' ) {
|
||||
%my $remove_text = l('REMOVE'); # Localized text
|
||||
%my $csrf_token = "TOKEN"; # CSRF token for security
|
||||
% my $remove_text = l('REMOVE'); # Localized text
|
||||
% my $csrf_token = "TOKEN"; # CSRF token for security
|
||||
%$actionRemove = qq{
|
||||
%<a href="useraccountsd?CsrfDef=$csrf_token&trt=DEL&user=$useraccounts_user_name">
|
||||
% <button type='button' class='sme-remove-button' title='$remove_text' >
|
||||
@@ -128,13 +128,12 @@
|
||||
%};
|
||||
%}
|
||||
|
||||
%my $thisdomain = session 'SystemName';
|
||||
%$thisdomain .= ".".session 'DomainName';
|
||||
%my $roundcube_text = l('Webmail'); # Localized text
|
||||
%my $csrf_token = "TOKEN"; # CSRF token for security
|
||||
%my $useraccounts_user_name = $user->key; # useraccountss_entry name extracted from the data structure
|
||||
%$actionroundcube = qq{
|
||||
%<a href="roundcubepanel?CsrfDef=$csrf_token&url=https://$thisdomain/roundcube?_user=$useraccounts_user_name">
|
||||
% my $thisdomain = $c->req->url->to_abs->host;
|
||||
% my $roundcube_text = l('Webmail'); # Localized text
|
||||
% $csrf_token = "TOKEN"; # CSRF token for security
|
||||
% $useraccounts_user_name = $user->key; # useraccountss_entry name extracted from the data structure
|
||||
% $actionroundcube = qq{
|
||||
%<a href="roundcubepanel?CsrfDef=$csrf_token&url=https://$thisdomain/roundcube?_user=$useraccounts_user_name&height=600px">
|
||||
% <button type='button' class='sme-email-button' title='$roundcube_text' >
|
||||
% $roundcube_text
|
||||
% </button>
|
||||
@@ -156,4 +155,4 @@
|
||||
|
||||
%= hidden_field 'trt' => $usr_datas->{trt}
|
||||
|
||||
</div>
|
||||
</div>
|
||||
|
@@ -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
|
@@ -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'
|
||||
|
@@ -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
|
@@ -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
|
@@ -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>
|
||||
|
@@ -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
|
@@ -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
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user