Compare commits
	
		
			52 Commits
		
	
	
		
			11_0_0-48_
			...
			11_0_0-89_
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 1a8f935431 | |||
| e8d6d39583 | |||
| 91201b7b02 | |||
| c85022c49e | |||
| fd076895ba | |||
|   | 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 | |||
| a4668da720 | |||
| 7ad224998c | |||
| 3070e0656c | 
							
								
								
									
										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 | ||||
| @@ -4,6 +4,7 @@ package SrvMngr; | ||||
| use strict; | ||||
| use warnings; | ||||
| use utf8; | ||||
| binmode(STDOUT); | ||||
|  | ||||
| use Mojo::Base 'Mojolicious'; | ||||
|  | ||||
| @@ -17,6 +18,7 @@ use Mojo::Home; | ||||
|  | ||||
| use DBM::Deep; | ||||
| use Mojo::JWT; | ||||
| use POSIX qw(strftime); | ||||
|  | ||||
| use Mojolicious::Plugin::Config; | ||||
| #use Mojolicious::Plugin::I18N; | ||||
| @@ -27,8 +29,15 @@ use SrvMngr::Model::Main; | ||||
|  | ||||
| use SrvMngr::Plugin::WithoutCache; | ||||
|  | ||||
| use esmith::I18N; | ||||
| use esmith::ConfigDB::UTF8; | ||||
| use esmith::NavigationDB; # no UTF8 raw is ok for ASCII only flat file | ||||
|  | ||||
| # 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 = '';  | ||||
| our $VERSION = '78.el8.sme';  | ||||
| #Extract the release value | ||||
| if ($VERSION =~ /^(\d+)/) { | ||||
|     $VERSION = $1;  # $1 contains the matched numeric digits | ||||
| @@ -40,9 +49,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 simpleNavMerge | ||||
| 	); | ||||
|  | ||||
| has home => sub { | ||||
| @@ -208,6 +218,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; | ||||
|     }); | ||||
|  | ||||
| } | ||||
|  | ||||
|  | ||||
| @@ -281,10 +307,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'); | ||||
| @@ -526,12 +553,10 @@ sub theme_list { | ||||
| #------------------------------------------------------------ | ||||
|  | ||||
| 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'; | ||||
|  | ||||
| @@ -540,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::UTF8->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)(-.*)?)"; | ||||
|  | ||||
| @@ -601,8 +646,7 @@ sub getNavigation { | ||||
|  | ||||
|     my $navinfo = NAVIGATIONDIR . "/navigation.$lang"; | ||||
|  | ||||
|     my $navdb = esmith::NavigationDB->open_ro( $navinfo ) or | ||||
| 	die "Couldn't open $navinfo\n"; | ||||
|     my $navdb = esmith::NavigationDB->open_ro( $navinfo ) or die "Couldn't open $navinfo\n"; # no UTF8 | ||||
|  | ||||
|     # Check the navdb for anything with a UrlPath, which means that it doesn't | ||||
|     # have a cgi file to be picked up by the above code. Ideally, only pages | ||||
| @@ -618,70 +662,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 { | ||||
|  | ||||
| @@ -729,7 +813,7 @@ sub get_routes_list { | ||||
|  | ||||
|     my $c  = shift; | ||||
|  | ||||
|     my $rtdb = esmith::ConfigDB->open_ro('routes') || die 'Cannot open Routes db'; | ||||
|     my $rtdb = esmith::ConfigDB::UTF8->open_ro('routes') || die 'Cannot open Routes db'; | ||||
|     my @routes = $rtdb->get_all(); | ||||
|     my @rt; | ||||
|  | ||||
| @@ -768,7 +852,23 @@ sub ip_number { | ||||
|     return 'OK'; | ||||
| } | ||||
|  | ||||
| sub validate_password { | ||||
|     my ($c, $strength, $pass) = @_; | ||||
|     use esmith::util; | ||||
|     use POSIX qw(locale_h); | ||||
|     use locale; | ||||
|     my $old_locale = setlocale(LC_ALL); | ||||
|     setlocale(LC_ALL, "en_US"); | ||||
|     my $reason = esmith::util::validatePassword($pass,$strength); | ||||
|     return "OK" if ($reason eq "ok"); | ||||
|     setlocale(LC_ALL, $old_locale); | ||||
|     return | ||||
|           $c->l("Bad Password Choice") . ": " | ||||
|         . $c->l("The password you have chosen is not a good choice, because") . " " | ||||
|         . $c->l($reason). "."; | ||||
| } ## end sub validate_password | ||||
|  | ||||
| # to deprecate : this is not anymore a way to validate our passwords | ||||
| sub is_normal_password { | ||||
|  | ||||
| #  from CGI::FormMagick::Validator qw( password ); | ||||
| @@ -784,6 +884,29 @@ sub is_normal_password { | ||||
|     } | ||||
| } | ||||
|  | ||||
| sub gen_locale_date_string | ||||
| { | ||||
|     my $self = shift; | ||||
|     my $i18n = esmith::I18N->new(); | ||||
|     $i18n->setLocale('formmagick', $i18n->preferredLanguage()); | ||||
|     return strftime "%c", localtime; | ||||
| } | ||||
|  | ||||
| sub get_public_ip_address | ||||
| { | ||||
|     my $self = shift; | ||||
| 	my $cdb = esmith::ConfigDB::UTF8->open() || die "Couldn't open config db"; | ||||
|     my $sysconfig = $cdb->get('sysconfig'); | ||||
|     if ($sysconfig) | ||||
|     { | ||||
|         my $publicIP = $sysconfig->prop('PublicIP'); | ||||
|         if ($publicIP) | ||||
|         { | ||||
|             return $publicIP; | ||||
|         } | ||||
|     } | ||||
|     return undef; | ||||
| } | ||||
|  | ||||
| sub email_simple { | ||||
|     my ($c, $data) = @_; | ||||
| @@ -866,4 +989,4 @@ sub get_reg_mask { | ||||
| } | ||||
|  | ||||
|  | ||||
| 1; | ||||
| 1; | ||||
|   | ||||
| @@ -3,7 +3,7 @@ package SrvMngr::Controller::Backup; | ||||
| #---------------------------------------------------------------------- | ||||
| # heading     : System | ||||
| # description : Backup or restore | ||||
| # navigation  : 4000 200 | ||||
| # navigation  : 4000 100 | ||||
| # Copyright (C) 2002 Mitel Networks Corporation | ||||
| #---------------------------------------------------------------------- | ||||
| # routes : end | ||||
| @@ -20,22 +20,23 @@ use Locale::gettext; | ||||
| use SrvMngr::I18N; | ||||
| use SrvMngr qw(theme_list init_session ip_number_or_blank); | ||||
| use Quota; | ||||
| use esmith::ConfigDB; | ||||
| use esmith::AccountsDB; | ||||
| use esmith::ConfigDB::UTF8; | ||||
| use esmith::AccountsDB::UTF8; | ||||
| use esmith::util; | ||||
| use File::Basename; | ||||
| use File::Find; | ||||
| use File::Path qw(make_path remove_tree); | ||||
| use esmith::Backup; | ||||
| use esmith::BackupHistoryDB; | ||||
| use esmith::BackupHistoryDB; #no UTF8 and not in use  | ||||
| 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; | ||||
|  | ||||
| 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 +53,9 @@ sub main { | ||||
|     my $c = shift; | ||||
|     $c->app->log->info($c->log_req); | ||||
|     my %bac_datas = (); | ||||
|     $cdb = esmith::ConfigDB::UTF8->open   || die "Couldn't open config db"; | ||||
|     $adb = esmith::AccountsDB::UTF8->open || die "Couldn't open accounts db"; | ||||
|     $rdb = esmith::ConfigDB::UTF8->open('/etc/e-smith/restore'); | ||||
|     my $title     = $c->l('bac_BACKUP_TITLE'); | ||||
|     my $notif; | ||||
|     $bac_datas{'function'} = 'desktop_backup'; | ||||
| @@ -108,6 +112,9 @@ sub do_display { | ||||
|     my $rt = $c->current_route; | ||||
|     my ($res, $result) = ''; | ||||
|     my $function = $c->param('Function'); | ||||
|    $cdb = esmith::ConfigDB::UTF8->open   || die "Couldn't open config db"; | ||||
|    $adb = esmith::AccountsDB::UTF8->open || die "Couldn't open accounts db"; | ||||
|    $rdb = esmith::ConfigDB::UTF8->open('/etc/e-smith/restore'); | ||||
|  | ||||
|     if ($function =~ /^(\S+)$/) { | ||||
|         $function = $1; | ||||
| @@ -129,7 +136,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 +276,9 @@ sub do_update { | ||||
|     my $c = shift; | ||||
|     $c->app->log->info($c->log_req); | ||||
|     my $rt       = $c->current_route; | ||||
|     $cdb = esmith::ConfigDB::UTF8->open   || die "Couldn't open config db"; | ||||
|     $adb = esmith::AccountsDB::UTF8->open || die "Couldn't open accounts db"; | ||||
|     $rdb = esmith::ConfigDB::UTF8->open('/etc/e-smith/restore'); | ||||
|     my $function = $c->param('Function'); | ||||
|     DEBUG && warn("do_update $function"); | ||||
|     my %bac_datas = (); | ||||
| @@ -513,13 +527,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 +933,7 @@ sub workstnVerify { | ||||
|  | ||||
| sub workstnRestore { | ||||
|     my ($c) = @_; | ||||
|     my $out; | ||||
|     my $out = ''; | ||||
|     my $restoreref = $c->param('Backupset'); | ||||
|     my $set        = $restoreref; | ||||
|     $set =~ s/\/[^\/]*$//; | ||||
| @@ -1002,6 +1016,7 @@ sub workstnRestore { | ||||
|         return "$c->l('bac_OPERATION_STATUS_REPORT') $c->l('bac_ERR_PRE_RESTORE')"; | ||||
|     } | ||||
|     $| = 1; | ||||
|     my $RD; | ||||
|  | ||||
|     if (open(RD, "-|")) { | ||||
|  | ||||
| @@ -1034,8 +1049,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 +1078,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 +1559,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 +1965,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 +2090,7 @@ sub bunmount { | ||||
|         system('/bin/umount', '-f', $mount) == 0 | ||||
|             or return ($c->l('bac_ERR_WHILE_UNMOUNTING')); | ||||
|     } | ||||
|     return; | ||||
|     return ""; | ||||
| } ## end sub bunmount | ||||
|  | ||||
| sub findmnt { | ||||
|   | ||||
| @@ -3,7 +3,7 @@ package SrvMngr::Controller::Bugreport; | ||||
| #---------------------------------------------------------------------- | ||||
| # heading     : Investigation | ||||
| # description : Report a bug | ||||
| # navigation  : 7000 500 | ||||
| # navigation  : 7000 300 | ||||
| # routes : end | ||||
| #------------------------------ | ||||
| use strict; | ||||
| @@ -14,8 +14,12 @@ use SrvMngr::I18N; | ||||
| use SrvMngr qw(theme_list init_session); | ||||
| use Text::Template; | ||||
| use File::Basename; | ||||
| use esmith::FormMagick qw( gen_locale_date_string ); | ||||
| our $cdb = esmith::ConfigDB->open or die "Couldn't open ConfigDB\n"; | ||||
| use SrvMngr qw( gen_locale_date_string ); | ||||
| use esmith::ConfigDB::UTF8; | ||||
| our $cdb = esmith::ConfigDB::UTF8->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'); | ||||
| @@ -78,7 +82,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 +118,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 = ''; | ||||
|   | ||||
| @@ -13,9 +13,9 @@ use Mojo::Base 'Mojolicious::Controller'; | ||||
| use Locale::gettext; | ||||
| use SrvMngr::I18N; | ||||
| use SrvMngr qw(theme_list init_session); | ||||
| use esmith::ConfigDB::UTF8; | ||||
|  | ||||
| #package esmith::FormMagick::Panel::clamav; | ||||
| our $db = esmith::ConfigDB->open() || die "Couldn't open config db"; | ||||
| our $db; | ||||
|  | ||||
| sub main { | ||||
|     my $c = shift; | ||||
| @@ -23,6 +23,7 @@ sub main { | ||||
|     my %clm_datas = (); | ||||
|     my $title     = $c->l('clm_FORM_TITLE'); | ||||
|     my $modul     = $c->render_to_string(inline => $c->l('clm_DESC_FILESYSTEM_SCAN_PERIOD')); | ||||
|     $db = esmith::ConfigDB::UTF8->open() || die "Couldn't open config db"; | ||||
|     $clm_datas{'FilesystemScan'} = ($db->get_prop('clamav', 'FilesystemScan')) || 'disabled'; | ||||
|     $clm_datas{'Quarantine'}     = ($db->get_prop('clamav', 'Quarantine'))     || 'disabled'; | ||||
|     $clm_datas{'clam_versions'}  = get_clam_versions(); | ||||
| @@ -53,6 +54,7 @@ sub do_update { | ||||
|  | ||||
| sub change_settings { | ||||
|     my $c                  = shift; | ||||
|     $db = esmith::ConfigDB::UTF8->open() || die "Couldn't open config db"; | ||||
|     my $status             = $c->param('status'); | ||||
|     my $FilesystemScan     = ($c->param('FilesystemScan') || 'disabled'); | ||||
|     my $Quarantine         = ($c->param('Quarantine') || 'disabled'); | ||||
|   | ||||
| @@ -3,7 +3,7 @@ package SrvMngr::Controller::Datetime; | ||||
| #---------------------------------------------------------------------- | ||||
| # heading     : System | ||||
| # description : Date and time | ||||
| # navigation  : 4000 400 | ||||
| # navigation  : 4000 300 | ||||
| # routes : end | ||||
| #------------------------------ | ||||
| use strict; | ||||
| @@ -12,9 +12,10 @@ use Mojo::Base 'Mojolicious::Controller'; | ||||
| use Locale::gettext; | ||||
| use SrvMngr::I18N; | ||||
| use SrvMngr qw(theme_list init_session); | ||||
| use esmith::FormMagick; | ||||
| use esmith::util; | ||||
| our $cdb = esmith::ConfigDB->open() || die "Couldn't open config db"; | ||||
| use SrvMngr qw( gen_locale_date_string ); | ||||
| use esmith::ConfigDB::UTF8; | ||||
| our $cdb ; | ||||
|  | ||||
| sub main { | ||||
|     my $c = shift; | ||||
| @@ -23,6 +24,7 @@ sub main { | ||||
|     my $title     = $c->l('dat_FORM_TITLE'); | ||||
|     my $modul     = $c->l('dat_INITIAL_DESC'); | ||||
|     $dat_datas{ntpstatus} = 'disabled'; | ||||
|     $cdb = esmith::ConfigDB::UTF8->open() || die "Couldn't open config db"; | ||||
|     my $rec = $cdb->get('ntpd'); | ||||
|  | ||||
|     if ($rec) { | ||||
| @@ -41,7 +43,7 @@ sub main { | ||||
|  | ||||
|     # get rid of trailing carriage return on last field | ||||
|     chop($dat_datas{ampm}); | ||||
|     $dat_datas{'now_string'} = esmith::FormMagick->gen_locale_date_string(); | ||||
|     $dat_datas{'now_string'} = gen_locale_date_string; | ||||
|     $c->stash(title => $title, modul => $modul, dat_datas => \%dat_datas); | ||||
|     $c->render('datetime'); | ||||
| } ## end sub main | ||||
| @@ -54,6 +56,7 @@ sub do_update { | ||||
|     my $result; | ||||
|     my $success; | ||||
|     my $old_ntpstatus = $c->param('Old_ntpstatus'); | ||||
|     $cdb = esmith::ConfigDB::UTF8->open() || die "Couldn't open config db"; | ||||
|     $dat_datas{ntpstatus} = $c->param('Ntpstatus'); | ||||
|  | ||||
|     if ($dat_datas{ntpstatus} ne $old_ntpstatus) { | ||||
| @@ -70,7 +73,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...}) | ||||
| @@ -125,6 +128,7 @@ sub do_update { | ||||
|  | ||||
| sub validate_change_datetime { | ||||
|     my $c = shift; | ||||
|     $cdb = esmith::ConfigDB::UTF8->open() || die "Couldn't open config db"; | ||||
|  | ||||
|     #-------------------------------------------------- | ||||
|     # Untaint parameters and check for validity | ||||
| @@ -220,15 +224,14 @@ sub validate_change_datetime { | ||||
|     #-------------------------------------------------- | ||||
|     # Store time zone in configuration database | ||||
|     #-------------------------------------------------- | ||||
|     my $conf = esmith::ConfigDB->open(); | ||||
|     my $old  = $conf->get('UnsavedChanges')->value; | ||||
|     my $rec  = $conf->get('TimeZone'); | ||||
|     my $old  = $cdb->get('UnsavedChanges')->value; | ||||
|     my $rec  = $cdb->get('TimeZone'); | ||||
|  | ||||
|     unless ($rec) { | ||||
|         $rec = $conf->new_record('TimeZone', undef); | ||||
|         $rec = $cdb->new_record('TimeZone', undef); | ||||
|     } | ||||
|     $rec->set_value($timezone); | ||||
|     $conf->get('UnsavedChanges')->set_value($old); | ||||
|     $cdb->get('UnsavedChanges')->set_value($old); | ||||
|  | ||||
|     #-------------------------------------------------- | ||||
|     # Signal event to change time zone, system time | ||||
| @@ -353,4 +356,20 @@ sub getMonth_list { | ||||
|         [ $c->l('dat_DECEMBER')  => '12' ] | ||||
|     ]; | ||||
| } ## end sub getMonth_list | ||||
|  | ||||
| sub getYear_list { | ||||
|     my $c= shift; | ||||
|     my @yearArray; | ||||
|     # could use also `/bin/date '+%Y'` | ||||
|     my $start=2025-40; my $max=2025+40; | ||||
|     for ( my $i = $start; $i <= $max; $i++ ) { | ||||
|  | ||||
|         push @yearArray,$i; | ||||
|     } | ||||
|  | ||||
|     my @yearList = sort @yearArray; | ||||
|     return \@yearList; | ||||
|  | ||||
| } ## end sub getYear_list | ||||
|  | ||||
| 1; | ||||
|   | ||||
| @@ -3,7 +3,7 @@ package SrvMngr::Controller::Directory; | ||||
| #---------------------------------------------------------------------- | ||||
| # heading     : User management | ||||
| # description : Directory | ||||
| # navigation  : 2000 300 | ||||
| # navigation  : 2000 400 | ||||
| # | ||||
| # routes : end | ||||
| #---------------------------------------------------------------------- | ||||
| @@ -12,15 +12,16 @@ use warnings; | ||||
| use Mojo::Base 'Mojolicious::Controller'; | ||||
| use Locale::gettext; | ||||
| use SrvMngr::I18N; | ||||
| use esmith::ConfigDB::UTF8; | ||||
| use esmith::AccountsDB::UTF8; | ||||
| use SrvMngr qw(theme_list init_session); | ||||
|  | ||||
| #use esmith::util qw(ldapBase); | ||||
| use esmith::FormMagick::Panel::directory; | ||||
| our $db = esmith::ConfigDB->open() || die "Couldn't open config db"; | ||||
| 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')); | ||||
| @@ -54,7 +55,7 @@ sub do_update { | ||||
|     $db->get('ldap')->set_prop('defaultPhoneNumber', $phonenumber); | ||||
|  | ||||
|     if ($existing eq 'update') { | ||||
|         my $ac = esmith::AccountsDB->open() || die "Couldn't open accounts db"; | ||||
|         my $ac = esmith::AccountsDB::UTF8->open() || die "Couldn't open accounts db"; | ||||
|         my @users = $ac->users(); | ||||
|  | ||||
|         foreach my $user (@users) { | ||||
| @@ -75,4 +76,21 @@ sub do_update { | ||||
|     $c->stash(title => $title, modul => $result); | ||||
|     $c->render(template => 'module'); | ||||
| } ## end sub do_update | ||||
|  | ||||
| sub get_ldap_base { | ||||
|     return esmith::util::ldapBase(get_value('','DomainName')); | ||||
| } | ||||
|  | ||||
| sub get_value { | ||||
|     my $fm = shift; | ||||
|     my $item = shift; | ||||
|  | ||||
|     my $record = $db->get($item); | ||||
|     if ($record) { | ||||
|         return $record->value(); | ||||
|     } | ||||
|     else { | ||||
|         return ''; | ||||
|     } | ||||
| } | ||||
| 1; | ||||
|   | ||||
| @@ -13,16 +13,10 @@ use Mojo::Base 'Mojolicious::Controller'; | ||||
| use Locale::gettext; | ||||
| use SrvMngr::I18N; | ||||
| use SrvMngr qw(theme_list init_session); | ||||
| use esmith::DomainsDB::UTF8; | ||||
| use esmith::AccountsDB::UTF8; | ||||
|  | ||||
| #use Data::Dumper; | ||||
| #use esmith::FormMagick::Panel::domains; | ||||
| use esmith::DomainsDB; | ||||
| use esmith::AccountsDB; | ||||
|  | ||||
| #use URI::Escape; | ||||
| our $ddb = esmith::DomainsDB->open  || die "Couldn't open domains db"; | ||||
| our $cdb = esmith::ConfigDB->open   || die "Couldn't open configuration db"; | ||||
| our $adb = esmith::AccountsDB->open || die "Couldn't open accounts db"; | ||||
| our ($ddb,$cdb,$adb); | ||||
| our $REGEXP_DOMAIN = qq([a-zA-Z0-9\-\.]+); | ||||
|  | ||||
| sub main { | ||||
| @@ -30,6 +24,9 @@ sub main { | ||||
|     $c->app->log->info($c->log_req); | ||||
|     my %dom_datas = (); | ||||
|     my $title     = $c->l('dom_FORM_TITLE'); | ||||
|     $ddb = esmith::DomainsDB::UTF8->open  || die "Couldn't open domains db"; | ||||
|     $cdb = esmith::ConfigDB::UTF8->open   || die "Couldn't open configuration db"; | ||||
|     $adb = esmith::AccountsDB::UTF8->open || die "Couldn't open accounts db"; | ||||
|     $dom_datas{trt} = 'LST'; | ||||
|     my @domains; | ||||
|  | ||||
| @@ -54,6 +51,9 @@ sub do_display { | ||||
|     my $rt     = $c->current_route; | ||||
|     my $trt    = $c->param('trt'); | ||||
|     my $domain = $c->param('Domain') || ''; | ||||
|     $ddb = esmith::DomainsDB::UTF8->open  || die "Couldn't open domains db"; | ||||
|     $cdb = esmith::ConfigDB::UTF8->open   || die "Couldn't open configuration db"; | ||||
|     $adb = esmith::AccountsDB::UTF8->open || die "Couldn't open accounts db"; | ||||
|  | ||||
|     #$trt = 'DEL' if ( $rt eq 'domaindel1' ); | ||||
|     #$trt = 'UPD' if ( $rt eq 'domainupd1' ); | ||||
| @@ -121,6 +121,9 @@ sub do_update { | ||||
|     $c->app->log->info($c->log_req); | ||||
|     my $rt        = $c->current_route; | ||||
|     my $trt       = $c->param('trt'); | ||||
|     $ddb = esmith::DomainsDB::UTF8->open  || die "Couldn't open domains db"; | ||||
|     $cdb = esmith::ConfigDB::UTF8->open   || die "Couldn't open configuration db"; | ||||
|     $adb = esmith::AccountsDB::UTF8->open || die "Couldn't open accounts db"; | ||||
|     my %dom_datas = (); | ||||
|     my ($res, $result) = ''; | ||||
|  | ||||
| @@ -237,6 +240,7 @@ sub create_modify_domain { | ||||
|                 . ' Ctl' | ||||
|         ); | ||||
|     } ## end unless ($domain) | ||||
|     $ddb = esmith::DomainsDB::UTF8->open  || die "Couldn't open domains db"; | ||||
|     my $rec = $ddb->get($domain); | ||||
|  | ||||
|     if ($rec and $action eq 'create') { | ||||
| @@ -366,6 +370,7 @@ sub nameserver_options_list { | ||||
|  | ||||
| sub get_nameserver_value { | ||||
|     my $c = shift; | ||||
|     $ddb = esmith::DomainsDB::UTF8->open  || die "Couldn't open domains db"; | ||||
|     my $domain = $c->param('Domain') || undef; | ||||
|     return ($ddb->get_prop($domain, 'Nameservers') || 'internet'); | ||||
| } ## end sub get_nameserver_value | ||||
|   | ||||
| @@ -3,7 +3,7 @@ package SrvMngr::Controller::Emailsettings; | ||||
| #---------------------------------------------------------------------- | ||||
| # heading     : System | ||||
| # description : E-mail | ||||
| # navigation  : 4000 500 | ||||
| # navigation  : 4000 400 | ||||
| # | ||||
| # | ||||
| # routes : end | ||||
| @@ -16,16 +16,18 @@ use constant TRUE  => 1; | ||||
| use Locale::gettext; | ||||
| use SrvMngr::I18N; | ||||
| use SrvMngr qw(theme_list init_session ip_number_or_blank); | ||||
| use esmith::ConfigDB; | ||||
| use esmith::AccountsDB; | ||||
| use esmith::ConfigDB::UTF8; | ||||
| use esmith::AccountsDB::UTF8; | ||||
| use esmith::util; | ||||
| use File::Basename; | ||||
| our $pattern_db = esmith::ConfigDB->open("mailpatterns"); | ||||
| our $cdb = esmith::ConfigDB->open || die "Couldn't open config db"; | ||||
| our $pattern_db; | ||||
| our $cdb; | ||||
|  | ||||
| sub main { | ||||
|     my $c = shift; | ||||
|     $c->app->log->info($c->log_req); | ||||
|     $pattern_db = esmith::ConfigDB::UTF8->open("mailpatterns"); | ||||
|     $cdb = esmith::ConfigDB::UTF8->open || die "Couldn't open config db"; | ||||
|     my %mai_datas = (); | ||||
|     my $title     = $c->l('mai_FORM_TITLE'); | ||||
|     $mai_datas{'trt'} = 'LIST'; | ||||
| @@ -42,7 +44,7 @@ sub do_display { | ||||
|     my $title     = $c->l('mai_FORM_TITLE'); | ||||
|     my ($notif, $dest) = ''; | ||||
|     $mai_datas{'trt'} = $trt; | ||||
|     $cdb = esmith::ConfigDB->open || die "Couldn't open config db"; | ||||
|     $cdb = esmith::ConfigDB::UTF8->open || die "Couldn't open config db"; | ||||
|  | ||||
|     if ($trt eq 'ACC') { | ||||
|         $dest = 'emailaccess'; | ||||
| @@ -94,7 +96,7 @@ sub do_update { | ||||
|     my $trt       = $c->param('trt'); | ||||
|     my %mai_datas = (); | ||||
|     $mai_datas{trt} = $trt; | ||||
|     $cdb = esmith::ConfigDB->open || die "Couldn't open config db"; | ||||
|     $cdb = esmith::ConfigDB::UTF8->open || die "Couldn't open config db"; | ||||
|     my $title = $c->l('mai_FORM_TITLE'); | ||||
|     my ($dest, $res, $result) = ''; | ||||
|  | ||||
| @@ -231,7 +233,7 @@ sub get_patterns_status { | ||||
| sub adjust_patterns { | ||||
|     my $c        = shift; | ||||
|     my @selected = @{ $c->every_param('BlockExecutableContent') }; | ||||
|  | ||||
|     $pattern_db = esmith::ConfigDB::UTF8->open("mailpatterns"); | ||||
|     foreach my $pattern ($pattern_db->get_all_by_prop(type => "pattern")) { | ||||
|         my $status | ||||
|             = (grep $pattern->key eq $_, @selected) | ||||
| @@ -284,7 +286,7 @@ sub get_current_imap_access { | ||||
| sub get_current_smtp_ssl_auth { | ||||
|     my ($c, $localise, $soru, $debug) = @_; | ||||
|     die "Error: \$soru must be either 's' or 'u':$soru.\n" unless $soru eq 's' || $soru eq 'u'; | ||||
|     $cdb = esmith::ConfigDB->open || die "Couldn't open config db"; | ||||
|     $cdb = esmith::ConfigDB::UTF8->open || die "Couldn't open config db"; | ||||
|  | ||||
|     # Initialize variables with default values | ||||
|     my $smtpStatus = 'none'; | ||||
| @@ -485,7 +487,7 @@ sub get_retrieval_opt { | ||||
|  | ||||
| sub get_emailunknownuser_options { | ||||
|     my $c                = shift; | ||||
|     my $accounts         = esmith::AccountsDB->open_ro(); | ||||
|     my $accounts         = esmith::AccountsDB::UTF8->open_ro(); | ||||
|     my %existingAccounts = ( | ||||
|         'admin'          => $c->l("mai_FORWARD_TO_ADMIN"), | ||||
|         'returntosender' => $c->l("mai_RETURN_TO_SENDER") | ||||
| @@ -503,7 +505,7 @@ sub get_emailunknownuser_options { | ||||
|  | ||||
| sub get_emailunknownuser_opt { | ||||
|     my $c        = shift; | ||||
|     my $accounts = esmith::AccountsDB->open_ro(); | ||||
|     my $accounts = esmith::AccountsDB::UTF8->open_ro(); | ||||
|     my @existingAccounts | ||||
|         = ([ $c->l("mai_FORWARD_TO_ADMIN") => 'admin' ], [ $c->l("mai_RETURN_TO_SENDER") => 'returntosender' ]); | ||||
|  | ||||
| @@ -580,14 +582,13 @@ sub display_multidrop { | ||||
|  | ||||
| sub change_settings_reception { | ||||
|     my $c = shift; | ||||
|     $cdb = esmith::ConfigDB->open || die "Couldn't open config db"; | ||||
|     $cdb = esmith::ConfigDBi::UTF8->open || die "Couldn't open config db"; | ||||
|     my $FetchmailMethod      = ($c->param('FetchmailMethod') || 'standard'); | ||||
|     my $FetchmailFreqOffice  = ($c->param('FreqOffice')      || 'every15min'); | ||||
|     my $FetchmailFreqOutside = ($c->param('FreqOutside')     || 'everyhour'); | ||||
|     my $FetchmailFreqWeekend = ($c->param('FreqWeekend')     || 'everyhour'); | ||||
|     my $SpecifyHeader        = ($c->param('SpecifyHeader')   || 'off'); | ||||
|     my $fetchmail | ||||
|         = $cdb->get('fetchmail') || $cdb->new_record("fetchmail", { type => "service", status => "disabled" }); | ||||
|     my $fetchmail = $cdb->get('fetchmail') || $cdb->new_record("fetchmail", { type => "service", status => "disabled" }); | ||||
|  | ||||
|     if ($FetchmailMethod eq 'standard') { | ||||
|         $fetchmail->set_prop('status', 'disabled'); | ||||
| @@ -662,7 +663,7 @@ sub change_settings_reception { | ||||
|  | ||||
| sub change_settings_delivery { | ||||
|     my ($c) = shift; | ||||
|     $cdb = esmith::ConfigDB->open || die "Couldn't open config db"; | ||||
|     $cdb = esmith::ConfigDB::UTF8->open || die "Couldn't open config db"; | ||||
|     my $EmailUnknownUser = ($c->param('EmailUnknownUser') || 'returntosender'); | ||||
|     $cdb->set_value('SMTPSmartHost',      $c->param('SMTPSmartHost')); | ||||
|     $cdb->set_value('DelegateMailServer', $c->param('DelegateMailServer')); | ||||
| @@ -683,7 +684,7 @@ sub change_settings_delivery { | ||||
|  | ||||
| sub change_settings_access { | ||||
|     my $c = shift; | ||||
|     $cdb = esmith::ConfigDB->open || die "Couldn't open config db"; | ||||
|     $cdb = esmith::ConfigDB::UTF8->open || die "Couldn't open config db"; | ||||
|     my $pop3Access = ($c->param('POPAccess') || 'private'); | ||||
|  | ||||
|     if ($pop3Access eq 'disabled') { | ||||
| @@ -757,7 +758,7 @@ sub change_settings_access { | ||||
|  | ||||
| sub change_settings_filtering { | ||||
|     my $c = shift; | ||||
|     $cdb = esmith::ConfigDB->open || die "Couldn't open config db"; | ||||
|     $cdb = esmith::ConfigDB::UTF8->open || die "Couldn't open config db"; | ||||
|     my $virus_status = ($c->param('VirusStatus') || 'disabled'); | ||||
|     $cdb->set_prop("qpsmtpd", 'VirusScan', $virus_status); | ||||
|  | ||||
|   | ||||
| @@ -14,18 +14,18 @@ use Mojo::Base 'Mojolicious::Controller'; | ||||
| use Locale::gettext; | ||||
| use SrvMngr::I18N; | ||||
| use SrvMngr qw(theme_list init_session); | ||||
| use esmith::AccountsDB::UTF8; | ||||
| use esmith::ConfigDB::UTF8; | ||||
|  | ||||
| #use Data::Dumper; | ||||
| #use esmith::FormMagick::Panel::groups; | ||||
| use esmith::AccountsDB; | ||||
| our $cdb = esmith::ConfigDB->open   || die "Couldn't open configuration db"; | ||||
| our $adb = esmith::AccountsDB->open || die "Couldn't open accounts db"; | ||||
| our ($cdb,$adb); | ||||
|  | ||||
| sub main { | ||||
|     my $c = shift; | ||||
|     $c->app->log->info($c->log_req); | ||||
|     my %grp_datas = (); | ||||
|     my $title     = $c->l('grp_FORM_TITLE'); | ||||
|     $cdb = esmith::ConfigDB::UTF8->open   || die "Couldn't open configuration db"; | ||||
|     $adb = esmith::AccountsDB::UTF8->open || die "Couldn't open accounts db"; | ||||
|     $grp_datas{trt} = 'LST'; | ||||
|     my @groups; | ||||
|  | ||||
| @@ -44,6 +44,8 @@ sub do_display { | ||||
|     my $group     = $c->param('group'); | ||||
|     my %grp_datas = (); | ||||
|     my $title     = $c->l('grp_FORM_TITLE'); | ||||
|     $cdb = esmith::ConfigDB::UTF8->open   || die "Couldn't open configuration db"; | ||||
|     $adb = esmith::AccountsDB::UTF8->open || die "Couldn't open accounts db"; | ||||
|     $grp_datas{'trt'} = $trt; | ||||
|  | ||||
|     if ($trt eq 'ADD') { | ||||
| @@ -99,6 +101,8 @@ sub do_update { | ||||
|     my $title     = $c->l('grp_FORM_TITLE'); | ||||
|     my ($res, $result) = ''; | ||||
|     my %grp_datas = (); | ||||
|     $cdb = esmith::ConfigDB::UTF8->open   || die "Couldn't open configuration db"; | ||||
|     $adb = esmith::AccountsDB::UTF8->open || die "Couldn't open accounts db"; | ||||
|     $grp_datas{'trt'}   = $trt; | ||||
|     $grp_datas{'group'} = $groupName; | ||||
|     my @members = (); | ||||
|   | ||||
| @@ -14,21 +14,14 @@ use Mojo::Base 'Mojolicious::Controller'; | ||||
| use Locale::gettext; | ||||
| use SrvMngr::I18N; | ||||
| use SrvMngr qw(theme_list init_session); | ||||
|  | ||||
| #use Data::Dumper; | ||||
| #use esmith::FormMagick::Panel::hostentries; | ||||
| use esmith::DomainsDB; | ||||
| use esmith::AccountsDB; | ||||
| use esmith::HostsDB; | ||||
| use esmith::NetworksDB; | ||||
| use HTML::Entities; | ||||
| use Net::IPv4Addr qw(ipv4_in_network); | ||||
| use esmith::DomainsDB::UTF8; | ||||
| use esmith::ConfigDB::UTF8; | ||||
| use esmith::HostsDB::UTF8; | ||||
| use esmith::NetworksDB::UTF8; | ||||
|  | ||||
| #use URI::Escape; | ||||
| our $ddb = esmith::DomainsDB->open  || die "Couldn't open hostentries db"; | ||||
| our $cdb = esmith::ConfigDB->open   || die "Couldn't open configuration db"; | ||||
| our $hdb = esmith::HostsDB->open    || die "Couldn't open hosts db"; | ||||
| our $ndb = esmith::NetworksDB->open || die "Couldn't open networks db"; | ||||
| our ($ddb,$cdb,$hdb,$ndb); | ||||
|  | ||||
| sub main { | ||||
|     my $c = shift; | ||||
| @@ -36,6 +29,9 @@ sub main { | ||||
|     my %hos_datas = (); | ||||
|     my $title     = $c->l('hos_FORM_TITLE'); | ||||
|     my $notif     = ''; | ||||
|     $cdb = esmith::ConfigDB::UTF8->open   || die "Couldn't open configuration db"; | ||||
|     $hdb = esmith::HostsDB::UTF8->open    || die "Couldn't open hosts db"; | ||||
|     $ndb = esmith::NetworksDB::UTF8->open || die "Couldn't open networks db"; | ||||
|     $hos_datas{trt} = 'LIST'; | ||||
|     my %dom_hosts = (); | ||||
|  | ||||
| @@ -68,6 +64,9 @@ sub do_display { | ||||
|     $trt = 'LST' if ($trt ne 'DEL' && $trt ne 'UPD' && $trt ne 'ADD'); | ||||
|     my %hos_datas = (); | ||||
|     my $title     = $c->l('hos_FORM_TITLE'); | ||||
|     $cdb = esmith::ConfigDB::UTF8->open   || die "Couldn't open configuration db"; | ||||
|     $hdb = esmith::HostsDB::UTF8->open    || die "Couldn't open hosts db"; | ||||
|     $ndb = esmith::NetworksDB::UTF8->open || die "Couldn't open networks db"; | ||||
|     my $notif     = ''; | ||||
|     $hos_datas{'trt'} = $trt; | ||||
|  | ||||
| @@ -112,6 +111,9 @@ sub do_update { | ||||
|     my $trt       = ($c->param('trt') || 'LIST'); | ||||
|     my %hos_datas = (); | ||||
|     my $title     = $c->l('hos_FORM_TITLE'); | ||||
|     $cdb = esmith::ConfigDB::UTF8->open   || die "Couldn't open configuration db"; | ||||
|     $hdb = esmith::HostsDB::UTF8->open    || die "Couldn't open hosts db"; | ||||
|     $ndb = esmith::NetworksDB::UTF8->open || die "Couldn't open networks db"; | ||||
|     my $notif     = ''; | ||||
|     my $result    = ''; | ||||
|     $hos_datas{'name'}       = lc $c->param('Name'); | ||||
| @@ -368,10 +370,10 @@ sub delete_hostentry { | ||||
| } ## end sub delete_hostentry | ||||
|  | ||||
| sub domains_list { | ||||
|     my $d = esmith::DomainsDB->open_ro() or die "Couldn't open DomainsDB"; | ||||
|     $ddb = esmith::DomainsDB::UTF8->open_ro() or die "Couldn't open DomainsDB"; | ||||
|     my @domains; | ||||
|  | ||||
|     for ($d->domains) { | ||||
|     for ($ddb->domains) { | ||||
|         my $ns = $_->prop("Nameservers") || 'localhost'; | ||||
|         push @domains, $_->key if ($ns eq 'localhost'); | ||||
|     } | ||||
| @@ -505,7 +507,7 @@ sub must_be_local { | ||||
|     my $localip = shift; | ||||
|  | ||||
|     # Make sure that the IP is indeed local. | ||||
|     #my $ndb = esmith::NetworksDB->open_ro; | ||||
|     #$ndb = esmith::NetworksDB::UTF8->open_ro; | ||||
|     my @local_list = $ndb->local_access_spec; | ||||
|  | ||||
|     foreach my $spec (@local_list) { | ||||
|   | ||||
| @@ -2,7 +2,7 @@ package SrvMngr::Controller::Ibays; | ||||
|  | ||||
| #---------------------------------------------------------------------- | ||||
| # heading     : Network | ||||
| # description : Shared areas (was ibays) | ||||
| # description : Ibays | ||||
| # navigation  : 6000 100 | ||||
| # | ||||
| # | ||||
| @@ -13,20 +13,20 @@ use warnings; | ||||
| use Mojo::Base 'Mojolicious::Controller'; | ||||
| use Locale::gettext; | ||||
| use SrvMngr::I18N; | ||||
| use SrvMngr qw( theme_list init_session is_normal_password ); | ||||
| use esmith::AccountsDB; | ||||
| use esmith::ConfigDB; | ||||
| use esmith::DomainsDB; | ||||
| use SrvMngr qw( theme_list init_session validate_password ); | ||||
| use esmith::AccountsDB::UTF8; | ||||
| use esmith::ConfigDB::UTF8; | ||||
| use esmith::DomainsDB::UTF8; | ||||
|  | ||||
| #use esmith::FormMagick::Panel::ibays; | ||||
| our $adb = esmith::AccountsDB->open || die "Couldn't open accounts db"; | ||||
| our $cdb = esmith::ConfigDB->open() || die "Couldn't open config db"; | ||||
| my ($adb,$cdb); | ||||
|  | ||||
| sub main { | ||||
|     my $c = shift; | ||||
|     $c->app->log->info($c->log_req); | ||||
|     my %iba_datas = (); | ||||
|     my $title     = $c->l('iba_FORM_TITLE'); | ||||
|     $adb = esmith::AccountsDB::UTF8->open || die "Couldn't open accounts db"; | ||||
|     $cdb = esmith::ConfigDB::UTF8->open() || die "Couldn't open config db"; | ||||
|     $iba_datas{'trt'} = 'LIST'; | ||||
|     my @ibays; | ||||
|  | ||||
| @@ -42,6 +42,8 @@ sub do_display { | ||||
|     my $rt   = $c->current_route; | ||||
|     my $trt  = ($c->param('trt') || 'LIST'); | ||||
|     my $ibay = $c->param('ibay') || ''; | ||||
|     $adb = esmith::AccountsDB::UTF8->open || die "Couldn't open accounts db"; | ||||
|     $cdb = esmith::ConfigDB::UTF8->open() || die "Couldn't open config db"; | ||||
|  | ||||
|     #$trt = 'DEL' if ( $ibay ); | ||||
|     #$trt = 'ADD' if ( $rt eq 'ibayadd' ); | ||||
| @@ -95,7 +97,7 @@ sub do_display { | ||||
|  | ||||
|     if ($trt eq 'LIST') { | ||||
|         my @ibays; | ||||
|         $adb = esmith::AccountsDB->open || die "Couldn't open accounts db"; | ||||
|         $adb = esmith::AccountsDB::UTF8->open || die "Couldn't open accounts db"; | ||||
|  | ||||
|         if ($adb) { | ||||
|             @ibays = $adb->ibays(); | ||||
| @@ -116,6 +118,8 @@ sub do_update { | ||||
|     $iba_datas{'trt'} = $trt; | ||||
|     my $result = ''; | ||||
|     my $res; | ||||
|     $adb = esmith::AccountsDB::UTF8->open || die "Couldn't open accounts db"; | ||||
|     $cdb = esmith::ConfigDB::UTF8->open() || die "Couldn't open config db"; | ||||
|  | ||||
|     if ($trt eq 'ADD') { | ||||
|         my $name = ($c->param('ibay') || ''); | ||||
| @@ -300,7 +304,7 @@ sub print_vhost_message { | ||||
|     my $c              = shift; | ||||
|     my $name           = $c->param('ibay'); | ||||
|     my $result         = ''; | ||||
|     my $domaindb       = esmith::DomainsDB->open(); | ||||
|     my $domaindb       = esmith::DomainsDB::UTF8->open(); | ||||
|     my @domains        = $domaindb->get_all_by_prop(Content => $name); | ||||
|     my $vhostListItems = join "\n", (map ($_->key . " " . $_->prop('Description'), @domains)); | ||||
|  | ||||
| @@ -322,7 +326,7 @@ sub remove_ibay { | ||||
|     if (my $acct = $adb->get($name)) { | ||||
|         if ($acct->prop('type') eq 'ibay') { | ||||
|             $acct->set_prop('type', 'ibay-deleted'); | ||||
|             my $domains_db = esmith::DomainsDB->open(); | ||||
|             my $domains_db = esmith::DomainsDB::UTF8->open(); | ||||
|             my @domains = $domains_db->get_all_by_prop(Content => $name); | ||||
|  | ||||
|             foreach my $d (@domains) { | ||||
| @@ -379,31 +383,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; | ||||
| @@ -13,12 +13,12 @@ use Mojo::Base 'Mojolicious::Controller'; | ||||
| use Locale::gettext; | ||||
| use SrvMngr::I18N; | ||||
| use SrvMngr qw(theme_list init_session subnet_mask get_reg_mask ip_number); | ||||
|  | ||||
| #use Data::Dumper; | ||||
| use esmith::util; | ||||
| use esmith::HostsDB; | ||||
| my $network_db = esmith::NetworksDB->open() || die("Couldn't open networks db"); | ||||
| use esmith::HostsDB::UTF8; | ||||
| use esmith::NetworksDB::UTF8; | ||||
| use esmith::ConfigDB::UTF8; | ||||
| my $ret = "OK"; | ||||
| our ($network_db,$config_db); | ||||
|  | ||||
| sub main { | ||||
|     my $c = shift; | ||||
| @@ -26,6 +26,7 @@ sub main { | ||||
|     my %ln_datas = (); | ||||
|     $ln_datas{return} = ""; | ||||
|     my $title = $c->l('ln_LOCAL NETWORKS'); | ||||
|     $network_db = esmith::NetworksDB::UTF8->open() || die("Couldn't open networks db"); | ||||
|     my $modul = ''; | ||||
|     $ln_datas{trt} = 'LIST'; | ||||
|     my @localnetworks; | ||||
| @@ -47,6 +48,7 @@ sub do_display { | ||||
|     $c->app->log->info($c->log_req); | ||||
|     my $rt = $c->current_route; | ||||
|     my $trt = ($c->param('trt') || 'LIST'); | ||||
|     $network_db = esmith::NetworksDB::UTF8->open() || die("Couldn't open networks db"); | ||||
|     $trt = 'DEL'  if ($rt eq 'localnetworksdel'); | ||||
|     $trt = 'ADD'  if ($rt eq 'localnetworksadd'); | ||||
|     $trt = 'ADD1' if ($rt eq 'localnetworksadd1'); | ||||
| @@ -74,14 +76,14 @@ sub do_display { | ||||
|             #Error - return to Add page | ||||
|             $trt = "ADD"; | ||||
|         } | ||||
|         $network_db = esmith::NetworksDB->open() || die("Failed to open Networkdb-3");    #Refresh the network DB | ||||
| 	#$network_db = esmith::NetworksDB::UTF8->open() || die("Failed to open Networkdb-3");    #Refresh the network DB | ||||
|         $c->stash(ret => \%ret);    #stash it away for the template | ||||
|     } ## end if ($trt eq 'ADD1') | ||||
|  | ||||
|     if ($trt eq 'DEL1') { | ||||
|  | ||||
|         #After Remove clicked on Delete network panel | ||||
|         my $network_db   = esmith::NetworksDB->open() || die("Failed to open Networkdb-1"); | ||||
| 	#$network_db   = esmith::NetworksDB::UTF8->open() || die("Failed to open Networkdb-1"); | ||||
|         my $localnetwork = $c->param("localnetwork"); | ||||
|         my $delete_hosts = $c->param("deletehost") || "1";                                    #default to deleting them. | ||||
|         my $rec = $network_db->get($localnetwork) || die("Failed to find network on db:$localnetwork"); | ||||
| @@ -90,7 +92,7 @@ sub do_display { | ||||
|             $ln_datas{localnetwork} = $localnetwork; | ||||
|         } | ||||
|         my %ret = remove_network($localnetwork, $delete_hosts); | ||||
|         $network_db = esmith::NetworksDB->open() || die("Failed to open Networkdb-2");        #Refresh the network DB | ||||
| 	#$network_db = esmith::NetworksDB::UTF8->open() || die("Failed to open Networkdb-2");        #Refresh the network DB | ||||
|         my @localnetworks; | ||||
|  | ||||
|         if ($network_db) { | ||||
| @@ -135,7 +137,7 @@ sub do_display { | ||||
|  | ||||
| sub remove_network { | ||||
|     my $network      = shift; | ||||
|     my $network_db   = esmith::NetworksDB->open(); | ||||
|     $network_db   = esmith::NetworksDB::UTF8->open(); | ||||
|     my $record       = $network_db->get($network); | ||||
|     my $delete_hosts = shift; | ||||
|  | ||||
| @@ -171,7 +173,7 @@ sub hosts_on_network { | ||||
|     my $netmask = shift; | ||||
|     die if not $network and $netmask; | ||||
|     my $cidr             = "$network/$netmask"; | ||||
|     my $hosts            = esmith::HostsDB->open() || die("Couldn't open hosts db"); | ||||
|     my $hosts            = esmith::HostsDB::UTF8->open() || die("Couldn't open hosts db"); | ||||
|     my @localhosts       = grep { $_->prop('HostType') eq 'Local' } $hosts->hosts; | ||||
|     my @hosts_on_network = (); | ||||
|  | ||||
| @@ -204,9 +206,9 @@ sub add_network { | ||||
|  | ||||
|     # we transform bit mask to regular mask | ||||
|     $networkMask = get_reg_mask($networkAddress, $networkMask); | ||||
|     my $network_db = esmith::NetworksDB->open() | ||||
|         || esmith::NetworksDB->create(); | ||||
|     my $config_db    = esmith::ConfigDB->open(); | ||||
|     my $network_db = esmith::NetworksDB::UTF8->open() | ||||
|         || esmith::NetworksDB::UTF8->create(); | ||||
|     my $config_db    = esmith::ConfigDB::UTF8->open(); | ||||
|     my $localIP      = $config_db->get('LocalIP'); | ||||
|     my $localNetmask = $config_db->get('LocalNetmask'); | ||||
|     my ($localNetwork, $localBroadcast) | ||||
| @@ -265,3 +267,4 @@ sub add_network { | ||||
|         ); | ||||
|     } ## end else [ if ($totalHosts == 1) ] | ||||
| } ## end sub add_network | ||||
| 1; | ||||
|   | ||||
| @@ -3,7 +3,7 @@ package SrvMngr::Controller::Login; | ||||
| #---------------------------------------------------------------------- | ||||
| # heading     : Support | ||||
| # description : Login | ||||
| # navigation  : 0000 001 | ||||
| # navigation  : 0 200 | ||||
| # menu        : N | ||||
| # | ||||
| # routes : end | ||||
| @@ -18,7 +18,7 @@ use strict; | ||||
| use warnings; | ||||
| use Mojo::Base 'Mojolicious::Controller'; | ||||
| use Locale::gettext; | ||||
| use esmith::AccountsDB; | ||||
| use esmith::AccountsDB::UTF8; | ||||
| use SrvMngr::I18N; | ||||
| use SrvMngr::Model::Main; | ||||
| use SrvMngr qw( theme_list init_session ); | ||||
| @@ -26,7 +26,7 @@ my $MAX_LOGIN_ATTEMPTS   = 3; | ||||
| my $DURATION_BLOCKED     = 30 * 60;        # access blocked for 30 min | ||||
| my $TIMEOUT_FAILED_LOGIN = 1; | ||||
| my $RESET_DURATION       = 2 * 60 * 60;    # 2 hours for resetting | ||||
| our $adb = esmith::AccountsDB->open() or die "Couldn't open DB Accounts\n"; | ||||
| our $adb; | ||||
| my $allowed_user_re = qr/^\w{5,10}$/; | ||||
| my %Login_Attempts; | ||||
|  | ||||
| @@ -39,6 +39,7 @@ sub main { | ||||
| sub login { | ||||
|     my $c   = shift; | ||||
|     my $trt = $c->param('Trt'); | ||||
|     $adb = esmith::AccountsDB::UTF8->open() or die "Couldn't open DB Accounts\n"; | ||||
|  | ||||
|     # password reset request | ||||
|     if ($trt eq 'RESET') { | ||||
| @@ -85,13 +86,13 @@ sub login { | ||||
|         $c->session(logged_in => 1);        # set the logged_in flag | ||||
|         $c->session(username  => $name);    # keep a copy of the username | ||||
|  | ||||
|         #    if ( $name eq 'admin' || $adb->is_user_in_group($name, 'AdmiN') )  # for futur use | ||||
|         #    if ( $name eq 'admin' || $adb->is_user_in_group($name, 'Admin') )  # for futur use | ||||
|         if ($name eq 'admin') { | ||||
|             $c->session(is_admin => 1); | ||||
|         } else { | ||||
|             $c->session(is_admin => 0); | ||||
|         } | ||||
|         $c->session(expiration => 600);     # expire this session in 10 minutes | ||||
|         $c->session(expiration => $c->config->{timeout} );     # expire this session in the time set  in config | ||||
|         $c->flash(success => $c->l('use_WELCOME')); | ||||
|         record_login_attempt($c, 'SUCCESS'); | ||||
|     } else { | ||||
| @@ -114,6 +115,7 @@ sub mail_rescue { | ||||
|     my $c    = shift; | ||||
|     my $name = $c->param('Username'); | ||||
|     my $from = $c->param('From'); | ||||
|     $adb = esmith::AccountsDB::UTF8->open() or die "Couldn't open DB Accounts\n"; | ||||
|     my $res; | ||||
|     $res .= $c->l('use_TOO_MANY_LOGIN') if (is_denied($c)); | ||||
|  | ||||
|   | ||||
| @@ -3,7 +3,7 @@ package SrvMngr::Controller::Logout; | ||||
| #---------------------------------------------------------------------- | ||||
| # heading     : Current User | ||||
| # description : Logout | ||||
| # navigation  : 1000 900 | ||||
| # navigation  : 1000 1000 | ||||
| # menu        : U | ||||
| # | ||||
| # 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 | ||||
|   | ||||
| @@ -13,17 +13,12 @@ use Mojo::Base 'Mojolicious::Controller'; | ||||
| use Locale::gettext; | ||||
| use SrvMngr::I18N; | ||||
| use SrvMngr qw(theme_list init_session); | ||||
|  | ||||
| #use Regexp::Common qw /net/; | ||||
| #use Data::Dumper; | ||||
| use esmith::util; | ||||
| use esmith::HostsDB; | ||||
| our $db = esmith::ConfigDB->open | ||||
|     || die "Can't open configuration database: $!\n"; | ||||
| our $tcp_db = esmith::ConfigDB->open('portforward_tcp') | ||||
|     || die "Can't open portforward_tcp database: $!\n"; | ||||
| our $udp_db = esmith::ConfigDB->open('portforward_udp') | ||||
|     || die "Can't open portforward_udp database: $!\n"; | ||||
| use esmith::ConfigDB::UTF8;  | ||||
|  | ||||
| my ($cdb,$tcp_db,$udp_db); | ||||
|  | ||||
| my %ret = (); | ||||
| use constant FALSE => 0; | ||||
| use constant TRUE  => 1; | ||||
| @@ -35,6 +30,9 @@ sub main { | ||||
|     $pf_datas{return} = ""; | ||||
|     my $title = $c->l('pf_FORM_TITLE'); | ||||
|     my $modul = ''; | ||||
|     $cdb = esmith::ConfigDB::UTF8->open || die "Can't open configuration database: $!\n"; | ||||
|     $tcp_db = esmith::ConfigDB::UTF8->open('portforward_tcp') || die "Can't open portforward_tcp database: $!\n"; | ||||
|     $udp_db = esmith::ConfigDB::UTF8->open('portforward_udp') || die "Can't open portforward_udp database: $!\n"; | ||||
|     $pf_datas{trt} = 'LIST'; | ||||
|     my @tcpforwards = $tcp_db->get_all; | ||||
|     my @udpforwards = $udp_db->get_all; | ||||
| @@ -55,6 +53,9 @@ sub do_display { | ||||
|     $c->app->log->info($c->log_req); | ||||
|     my $rt = $c->current_route; | ||||
|     my $trt = ($c->param('trt') || 'LIST'); | ||||
|     my $cdb = esmith::ConfigDB::UTF8->open || die "Can't open configuration database: $!\n"; | ||||
|     my $tcp_db = esmith::ConfigDB::UTF8->open('portforward_tcp') || die "Can't open portforward_tcp database: $!\n"; | ||||
|     my $udp_db = esmith::ConfigDB::UTF8->open('portforward_udp') || die "Can't open portforward_udp database: $!\n"; | ||||
|     $trt = 'DEL'  if ($rt eq 'portforwardingdel'); | ||||
|     $trt = 'ADD'  if ($rt eq 'portforwardingadd'); | ||||
|     $trt = 'ADD1' if ($rt eq 'portforwardingadd1'); | ||||
| @@ -137,6 +138,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::UTF8->open('portforward_tcp') || die "Can't open portforward_tcp database: $!\n"; | ||||
|         $udp_db = esmith::ConfigDB::UTF8->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; | ||||
| @@ -163,10 +168,10 @@ sub add_portforward { | ||||
|     my $fdb; | ||||
|  | ||||
|     if ($proto eq 'TCP') { | ||||
|         $tcp_db = esmith::ConfigDB->open('portforward_tcp') || die "Can't open portforward_tcp database: $!\n"; | ||||
|         $tcp_db = esmith::ConfigDB::UTF8->open('portforward_tcp') || die "Can't open portforward_tcp database: $!\n"; | ||||
|         $fdb = $tcp_db; | ||||
|     } else { | ||||
|         $udp_db = esmith::ConfigDB->open('portforward_udp') || die "Can't open portforward_udp database: $!\n"; | ||||
|         $udp_db = esmith::ConfigDB::UTF8->open('portforward_udp') || die "Can't open portforward_udp database: $!\n"; | ||||
|         $fdb = $udp_db; | ||||
|     } | ||||
|  | ||||
| @@ -206,9 +211,10 @@ sub add_portforward { | ||||
|  | ||||
| sub get_destination_host { | ||||
|     my $q           = shift; | ||||
|     $cdb = esmith::ConfigDB::UTF8->open || die "Can't open configuration database: $!\n"; | ||||
|     my $dhost       = $q->param("dhost"); | ||||
|     my $localip     = $db->get_prop('InternalInterface', 'IPAddress'); | ||||
|     my $external_ip = $db->get_prop('ExternalInterface', 'IPAddress') || $localip; | ||||
|     my $localip     = $cdb->get_prop('InternalInterface', 'IPAddress'); | ||||
|     my $external_ip = $cdb->get_prop('ExternalInterface', 'IPAddress') || $localip; | ||||
|  | ||||
|     if ($dhost =~ /^(127.0.0.1|$localip|$external_ip)$/i) { | ||||
|  | ||||
| @@ -352,10 +358,11 @@ sub isValidPort() { | ||||
|  | ||||
| sub validate_destination_host { | ||||
|     my $c     = shift; | ||||
|     $cdb = esmith::ConfigDB::UTF8->open || die "Can't open configuration database: $!\n"; | ||||
|     my $dhost = $c->param('dhost'); | ||||
|     $dhost =~ s/^\s+|\s+$//g; | ||||
|     my $localip = $db->get_prop('InternalInterface', 'IPAddress'); | ||||
|     my $external_ip = $db->get_prop('ExternalInterface', 'IPAddress') || $localip; | ||||
|     my $localip = $cdb->get_prop('InternalInterface', 'IPAddress'); | ||||
|     my $external_ip = $cdb->get_prop('ExternalInterface', 'IPAddress') || $localip; | ||||
|  | ||||
|     if ($dhost =~ /^(localhost|127.0.0.1|$localip|$external_ip)$/i) { | ||||
|  | ||||
| @@ -363,7 +370,7 @@ sub validate_destination_host { | ||||
|         $c->param(-name => 'dhost', -value => 'localhost'); | ||||
|         return (ret => 'pf_SUCCESS'); | ||||
|     } ## end if ($dhost =~ /^(localhost|127.0.0.1|$localip|$external_ip)$/i) | ||||
|     my $systemmode = $db->get_value('SystemMode'); | ||||
|     my $systemmode = $cdb->get_value('SystemMode'); | ||||
|  | ||||
|     if ($systemmode eq 'serveronly') { | ||||
|         return (ret => 'pf_IN_SERVERONLY'); | ||||
|   | ||||
| @@ -14,14 +14,15 @@ use Mojo::Base 'Mojolicious::Controller'; | ||||
| use Locale::gettext; | ||||
| use SrvMngr::I18N; | ||||
| use SrvMngr qw(theme_list init_session); | ||||
| use esmith::FormMagick::Panel::printers; | ||||
| our $adb = esmith::AccountsDB->open || die "Couldn't open accounts db"; | ||||
| use esmith::AccountsDB::UTF8; | ||||
| our $adb; | ||||
|  | ||||
| sub main { | ||||
|     my $c = shift; | ||||
|     $c->app->log->info($c->log_req); | ||||
|     my %prt_datas = (); | ||||
|     my $title     = $c->l('prt_FORM_TITLE'); | ||||
|     $adb = esmith::AccountsDB::UTF8->open || die "Couldn't open accounts db"; | ||||
|     $prt_datas{'trt'} = 'LIST'; | ||||
|     my @printerDrivers; | ||||
|  | ||||
| @@ -37,6 +38,7 @@ sub do_display { | ||||
|     my $rt      = $c->current_route; | ||||
|     my $trt     = ($c->param('trt') || 'LIST'); | ||||
|     my $printer = $c->param('printer') || ''; | ||||
|     $adb = esmith::AccountsDB::UTF8->open || die "Couldn't open accounts db"; | ||||
|  | ||||
|     #$trt = 'DEL' if ( $printer ); | ||||
|     #$trt = 'ADD' if ( $rt eq 'printeradd' ); | ||||
| @@ -77,6 +79,7 @@ sub do_update { | ||||
|     my $trt       = ($c->param('trt') || 'LIST'); | ||||
|     my %prt_datas = (); | ||||
|     my $title     = $c->l('prt_FORM_TITLE'); | ||||
|     $adb = esmith::AccountsDB::UTF8->open || die "Couldn't open accounts db"; | ||||
|     $prt_datas{'trt'} = $trt; | ||||
|     my ($res, $result) = ''; | ||||
|  | ||||
|   | ||||
| @@ -3,7 +3,7 @@ package SrvMngr::Controller::Proxy; | ||||
| #---------------------------------------------------------------------- | ||||
| # heading     : System | ||||
| # description : Proxy settings | ||||
| # navigation  : 4000 710 | ||||
| # navigation  : 4000 200 | ||||
| #---------------------------------------------------------------------- | ||||
| # | ||||
| # routes : end | ||||
| @@ -14,11 +14,14 @@ use Mojo::Base 'Mojolicious::Controller'; | ||||
| use Locale::gettext; | ||||
| use SrvMngr::I18N; | ||||
| use SrvMngr qw(theme_list init_session); | ||||
| our $db = esmith::ConfigDB->open || die "Couldn't open config db"; | ||||
| use esmith::ConfigDB::UTF8; | ||||
|  | ||||
| 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 %prx_datas = (); | ||||
|     my $title     = $c->l('prx_TITLE'); | ||||
|     my $modul     = $c->render_to_string(inline => $c->l('prx_FIRST_PAGE_DESCRIPTION')); | ||||
|   | ||||
| @@ -3,7 +3,7 @@ package SrvMngr::Controller::Pseudonyms; | ||||
| #---------------------------------------------------------------------- | ||||
| # heading     : User management | ||||
| # description : Pseudonyms | ||||
| # navigation  : 2000 210 | ||||
| # navigation  : 2000 300 | ||||
| #---------------------------------------------------------------------- | ||||
| # | ||||
| # routes : end | ||||
| @@ -14,14 +14,10 @@ use Mojo::Base 'Mojolicious::Controller'; | ||||
| use Locale::gettext; | ||||
| use SrvMngr::I18N; | ||||
| use SrvMngr qw(theme_list init_session); | ||||
| use esmith::AccountsDB::UTF8; | ||||
| use esmith::DomainsDB::UTF8; | ||||
|  | ||||
| #use Data::Dumper; | ||||
| #use esmith::FormMagick::Panel::pseudonyms; | ||||
| use esmith::AccountsDB; | ||||
|  | ||||
| #use URI::Escape; | ||||
| our $cdb = esmith::ConfigDB->open   || die "Couldn't open configuration db"; | ||||
| our $adb = esmith::AccountsDB->open || die "Couldn't open accounts db"; | ||||
| our ($cdb,$adb); | ||||
|  | ||||
| sub main { | ||||
|     my $c = shift; | ||||
| @@ -31,6 +27,7 @@ sub main { | ||||
|     my $notif     = ''; | ||||
|     $pse_datas{trt} = 'LST'; | ||||
|     my @pseudonyms; | ||||
| 	$adb = esmith::AccountsDB::UTF8->open || die "Couldn't open accounts db"; | ||||
|  | ||||
|     if ($adb) { | ||||
|         @pseudonyms = $adb->pseudonyms(); | ||||
| @@ -47,7 +44,8 @@ sub do_display { | ||||
|     my $pseudonym = $c->param('pseudonym') || ''; | ||||
|     my $title     = $c->l('pse_FORM_TITLE'); | ||||
|     my %pse_datas = (); | ||||
|     $pse_datas{'trt'} = $trt; | ||||
| 	$adb = esmith::AccountsDB::UTF8->open || die "Couldn't open accounts db"; | ||||
| 	$pse_datas{'trt'} = $trt; | ||||
|  | ||||
|     if ($trt eq 'ADD') { | ||||
|  | ||||
| @@ -92,6 +90,7 @@ sub do_update { | ||||
|     my $rt        = $c->current_route; | ||||
|     my $trt       = ($c->param('trt') || 'LST'); | ||||
|     my $title     = $c->l('pse_FORM_TITLE'); | ||||
| 	$adb = esmith::AccountsDB::UTF8->open || die "Couldn't open accounts db"; | ||||
|     my %pse_datas = (); | ||||
|     $pse_datas{'trt'} = $trt; | ||||
|     my ($res, $result) = ''; | ||||
| @@ -324,8 +323,7 @@ sub validate_new_pseudonym_name { | ||||
|     if (defined $acct) { | ||||
|         return ($c->l('pse_NAME_IN_USE')); | ||||
|     } elsif ($pseudonym =~ /@/) { | ||||
|         use esmith::DomainsDB; | ||||
|         my $ddb = esmith::DomainsDB->open_ro | ||||
|         my $ddb = esmith::DomainsDB::UTF8->open_ro | ||||
|             or die "Couldn't open DomainsDB\n"; | ||||
|         my ($lhs, $rhs) = split /@/, $pseudonym; | ||||
|         return ($c->l('pse_PSEUDONYM_INVALID_DOMAIN')) unless ($ddb->get($rhs)); | ||||
|   | ||||
| @@ -10,10 +10,13 @@ package SrvMngr::Controller::Qmailanalog; | ||||
| use strict; | ||||
| use warnings; | ||||
| use Mojo::Base 'Mojolicious::Controller'; | ||||
| use esmith::FormMagick qw(gen_locale_date_string); | ||||
| use SrvMngr qw(gen_locale_date_string); | ||||
| use Locale::gettext; | ||||
| use SrvMngr::I18N; | ||||
| use SrvMngr qw(theme_list init_session); | ||||
| 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; | ||||
| @@ -3,7 +3,7 @@ package SrvMngr::Controller::Quota; | ||||
| #---------------------------------------------------------------------- | ||||
| # heading     : User management | ||||
| # description : Quotas | ||||
| # navigation  : 2000 300 | ||||
| # navigation  : 2000 500 | ||||
| #---------------------------------------------------------------------- | ||||
| # | ||||
| # routes : end | ||||
| @@ -11,22 +11,21 @@ package SrvMngr::Controller::Quota; | ||||
| use strict; | ||||
| use warnings; | ||||
| use Mojo::Base 'Mojolicious::Controller'; | ||||
| use esmith::FormMagick::Panel::quota; | ||||
|  | ||||
| #use esmith::TestUtils; | ||||
| use Scalar::Util qw(looks_like_number); | ||||
| use Locale::gettext; | ||||
| use SrvMngr::I18N; | ||||
| use SrvMngr qw(theme_list init_session); | ||||
| use esmith::AccountsDB::UTF8; | ||||
|  | ||||
| #our $db = esmith::ConfigDB->open || die "Couldn't open config db"; | ||||
| our $adb = esmith::AccountsDB->open || die "Couldn't open accounts db"; | ||||
| my $adb; | ||||
|  | ||||
| sub main { | ||||
|     my $c = shift; | ||||
|     $c->app->log->info($c->log_req); | ||||
|     my %quo_datas = (); | ||||
|     my $title     = $c->l('quo_FORM_TITLE'); | ||||
|     $adb = esmith::AccountsDB::UTF8->open || die "Couldn't open accounts db"; | ||||
|     $quo_datas{'trt'} = 'LIST'; | ||||
|     my @userAccounts; | ||||
|  | ||||
| @@ -45,6 +44,7 @@ sub do_display { | ||||
|     $trt = 'UPD' if ($user); | ||||
|     my %quo_datas = (); | ||||
|     my $title     = $c->l('quo_FORM_TITLE'); | ||||
|     $adb = esmith::AccountsDB::UTF8->open || die "Couldn't open accounts db"; | ||||
|     $quo_datas{'trt'} = $trt; | ||||
|  | ||||
|     if ($trt eq 'UPD') { | ||||
| @@ -53,9 +53,9 @@ sub do_display { | ||||
|         if ($rec and $rec->prop('type') eq 'user') { | ||||
|             $quo_datas{user}    = $user; | ||||
|             $quo_datas{userRec} = $rec; | ||||
|             my $max = esmith::FormMagick::Panel::quota->toBestUnit($rec->prop('MaxBlocks')); | ||||
|             my $max = $c->toBestUnit($rec->prop('MaxBlocks')); | ||||
|             $quo_datas{hardlim} = $max; | ||||
|             $max                = esmith::FormMagick::Panel::quota->toBestUnit($rec->prop('MaxBlocksSoftLim')); | ||||
|             $max                = $c->toBestUnit($rec->prop('MaxBlocksSoftLim')); | ||||
|             $quo_datas{softlim} = $max; | ||||
|         } ## end if ($rec and $rec->prop...) | ||||
|     } ## end if ($trt eq 'UPD') | ||||
| @@ -73,6 +73,7 @@ sub do_update { | ||||
|     $quo_datas{trt} = $trt; | ||||
|     my $result = ''; | ||||
|     my $res; | ||||
|     $adb = esmith::AccountsDB::UTF8->open || die "Couldn't open accounts db"; | ||||
|  | ||||
|     if ($trt eq 'UPD') { | ||||
|         $quo_datas{user}    = ($c->param('user') || ''); | ||||
| @@ -156,4 +157,54 @@ sub validate_quota { | ||||
|         or die($c->l('quo_ERR_MODIFYING') . "\n"); | ||||
|     return 'OK'; | ||||
| } ## end sub validate_quota | ||||
|  | ||||
| sub toMB | ||||
| { | ||||
|     my ($self,$kb) = @_; | ||||
|     return sprintf("%.2f", $kb / 1024); | ||||
| } | ||||
|  | ||||
| sub toMBNoDecimalPlaces | ||||
| { | ||||
|     my ($self,$kb) = @_; | ||||
|     return sprintf("%.0f", $kb / 1024); | ||||
| } | ||||
|  | ||||
| sub toGBNoDecimalPlaces | ||||
| { | ||||
|     my ($self,$kb) = @_; | ||||
|     return sprintf("%.0f", $kb / 1024 / 1024); | ||||
| } | ||||
|  | ||||
| sub toKB  | ||||
| { | ||||
|     my ($self,$mb) = @_; | ||||
|     return sprintf("%.0f", $mb * 1024); | ||||
| } | ||||
|  | ||||
|  | ||||
| sub GBtoKB | ||||
| { | ||||
|     my ($self,$gb) = @_; | ||||
|     return sprintf("%.0f", $gb * 1024 * 1024); | ||||
| } | ||||
|  | ||||
| sub MBtoKB | ||||
| { | ||||
|     my ($self,$mb) = @_; | ||||
|     return sprintf("%.0f", $mb * 1024); | ||||
| } | ||||
|  | ||||
| sub toBestUnit | ||||
| { | ||||
|     my ($self,$kb) = @_; | ||||
|     return 0 if($kb == 0); | ||||
|     return $kb."K" if($kb < 1024); | ||||
|     return $kb."K" if($kb > 1024 && $kb < 1048576 && $kb % 1024 != 0); | ||||
|     return $self->toMBNoDecimalPlaces($kb)."M" if($kb < 1048576); | ||||
|     return $self->toMBNoDecimalPlaces($kb)."M" if($kb > 1048576  | ||||
| 	&& ($kb % 1048576 != 0)); | ||||
|     return $self->toGBNoDecimalPlaces($kb)."G"; | ||||
| } | ||||
|  | ||||
| 1 | ||||
|   | ||||
| @@ -14,7 +14,7 @@ use Mojo::Base 'Mojolicious::Controller'; | ||||
| use Locale::gettext; | ||||
| use SrvMngr::I18N; | ||||
| use SrvMngr qw(theme_list init_session ip_number subnet_mask get_reg_mask); | ||||
| use esmith::ConfigDB; | ||||
| use esmith::ConfigDB::UTF8; | ||||
| use esmith::util; | ||||
| use File::Basename; | ||||
| use Exporter; | ||||
| @@ -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"; | ||||
| our  $db;  | ||||
|  | ||||
| sub main { | ||||
|     my $c = shift; | ||||
| @@ -38,7 +38,7 @@ sub main { | ||||
|     my $title     = $c->l('rma_FORM_TITLE'); | ||||
|     my $notif     = ''; | ||||
|     my %rma_datas = (); | ||||
|     $db = esmith::ConfigDB->open || warn "Couldn't open configuration database"; | ||||
|     $db = esmith::ConfigDB::UTF8->open || warn "Couldn't open configuration database"; | ||||
|  | ||||
|     #$rma_datas{ipsecrwSess}  = $c->get_ipsecrw_sessions(); | ||||
|     #$rma_datas{pptpSessions} = $c->get_pptp_sessions(); | ||||
| @@ -60,7 +60,7 @@ sub do_action { | ||||
|     my $title = $c->l('rma_FORM_TITLE'); | ||||
|     my ($result, $res, $trt) = ''; | ||||
|     my %rma_datas = (); | ||||
|     $db = esmith::ConfigDB->open || warn "Couldn't open configuration database"; | ||||
|     $db = esmith::ConfigDB::UTF8->open || warn "Couldn't open configuration database"; | ||||
|     $rma_datas{ipsecrwSess}  = ($c->param('IpsecrwSess')  || ''); | ||||
|     $rma_datas{ipsecrwReset} = ($c->param('IpsecrwReset') || ''); | ||||
|  | ||||
| @@ -144,6 +144,7 @@ sub passwordLogin_list { | ||||
| } | ||||
|  | ||||
| sub get_prop { | ||||
|     $db = esmith::ConfigDB::UTF8->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,7 @@ sub get_prop { | ||||
| sub get_value { | ||||
|     my $c    = shift; | ||||
|     my $item = shift; | ||||
|     $db = esmith::ConfigDB::UTF8->open || warn "Couldn't open configuration database"; | ||||
|     return ($db->get($item)->value()); | ||||
| } ## end sub get_value | ||||
|  | ||||
| @@ -179,8 +181,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 +204,7 @@ sub get_ftp_password_login_access { | ||||
| } ## end sub get_ftp_password_login_access | ||||
|  | ||||
| sub get_telnet_mode { | ||||
|     $db = esmith::ConfigDB::UTF8->open || warn "Couldn't open configuration database"; | ||||
|     my $telnet = $db->get('telnet'); | ||||
|     return ('off') unless $telnet; | ||||
|     my $status = $telnet->prop('status') || 'disabled'; | ||||
| @@ -211,8 +214,8 @@ sub get_telnet_mode { | ||||
| } ## end sub get_telnet_mode | ||||
|  | ||||
| sub get_ipsecrw_sessions { | ||||
|     $db = esmith::ConfigDB::UTF8->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 +224,7 @@ sub get_ipsecrw_sessions { | ||||
| } ## end sub get_ipsecrw_sessions | ||||
|  | ||||
| sub get_ipsecrw_status { | ||||
|     $db = esmith::ConfigDB::UTF8->open || warn "Couldn't open configuration database"; | ||||
|     return undef unless ($db->get('ipsec')); | ||||
|     return $db->get('ipsec')->prop('RoadWarriorStatus'); | ||||
| } | ||||
| @@ -228,6 +232,7 @@ sub get_ipsecrw_status { | ||||
| sub pptp_and_dhcp_range { | ||||
|     my $c           = shift; | ||||
|     my $val         = shift || 0; | ||||
|     $db = esmith::ConfigDB::UTF8->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 +250,7 @@ sub pptp_and_dhcp_range { | ||||
|  | ||||
| sub _get_valid_from { | ||||
|     my $c   = shift; | ||||
|     $db = esmith::ConfigDB::UTF8->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 +293,12 @@ sub validate_network_and_mask { | ||||
|  | ||||
| sub change_settings { | ||||
|     my ($c, %rma_datas) = @_; | ||||
|  | ||||
|     $db = esmith::ConfigDB::UTF8->open || warn "Couldn't open configuration database"; | ||||
|     #------------------------------------------------------------ | ||||
|     # good; go ahead and change the access. | ||||
|     #------------------------------------------------------------ | ||||
|     $db = esmith::ConfigDB::UTF8->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 +369,7 @@ sub change_settings { | ||||
| sub set_ipsecrw_sessions { | ||||
|     my $c        = shift; | ||||
|     my $sessions = shift; | ||||
|  | ||||
|     $db = esmith::ConfigDB::UTF8->open || warn "Couldn't open configuration database"; | ||||
|     if (defined $sessions) { | ||||
|         $db->get('ipsec')->set_prop('RoadWarriorSessions', $sessions); | ||||
|  | ||||
| @@ -378,6 +384,7 @@ sub add_new_valid_from { | ||||
|     my $c    = shift; | ||||
|     my $net  = shift; | ||||
|     my $mask = shift; | ||||
|     $db = esmith::ConfigDB::UTF8->open || warn "Couldn't open configuration database"; | ||||
|  | ||||
|     # we transform bit mask to regular mask | ||||
|     $mask = get_reg_mask($net, $mask); | ||||
| @@ -400,6 +407,7 @@ sub remove_valid_from { | ||||
|     my $c           = shift; | ||||
|     my $remove_nets = shift; | ||||
|     my @remove      = split /,/, $remove_nets; | ||||
|     $db = esmith::ConfigDB::UTF8->open || warn "Couldn't open configuration database"; | ||||
|  | ||||
|     #	my @remove = $c->param('Remove_nets'); | ||||
|     my @vals = $c->_get_valid_from(); | ||||
|   | ||||
| @@ -8,6 +8,8 @@ use Mojo::Base 'Mojolicious::Controller'; | ||||
| use Locale::gettext; | ||||
| use SrvMngr::I18N; | ||||
| use SrvMngr qw(theme_list init_session); | ||||
| use esmith::ConfigDB::UTF8 qw(open_ro); | ||||
| use esmith::AccountsDB::UTF8 qw(open_ro); | ||||
|  | ||||
| # retrieve a configuration db record | ||||
| sub getconfig { | ||||
| @@ -16,8 +18,7 @@ sub getconfig { | ||||
|     $c->app->log->info($c->log_req . ' ' . $key); | ||||
|  | ||||
|     if ($key) { | ||||
|         use esmith::ConfigDB qw(open_ro); | ||||
|         my $cdb = esmith::ConfigDB->open_ro; | ||||
|         my $cdb = esmith::ConfigDB::UTF8->open_ro; | ||||
|         return getdb($c, $cdb, $key); | ||||
|     } ## end if ($key) | ||||
| } ## end sub getconfig | ||||
| @@ -29,8 +30,7 @@ sub getaccount { | ||||
|     $c->app->log->info($c->log_req . ' ' . $key); | ||||
|  | ||||
|     if ($key) { | ||||
|         use esmith::AccountsDB qw(open_ro); | ||||
|         my $adb = esmith::AccountsDB->open_ro; | ||||
|         my $adb = esmith::AccountsDB::UTF8->open_ro; | ||||
|         return getdb($c, $adb, $key); | ||||
|     } ## end if ($key) | ||||
| } ## end sub getaccount | ||||
|   | ||||
| @@ -1,39 +1,38 @@ | ||||
| package SrvMngr::Controller::Review; | ||||
|  | ||||
| #---------------------------------------------------------------------- | ||||
| # heading     : Support | ||||
| # heading     : Investigation | ||||
| # description : Review configuration | ||||
| # navigation  : 000 500 | ||||
| # menu        : N | ||||
| # navigation  : 7000 400 | ||||
| # routes : end | ||||
| #---------------------------------------------------------------------- | ||||
| # heading-o     : Configuration | ||||
| # description-o : Review configuration | ||||
| # navigation-o  : 6000 6800 | ||||
| #---------------------------------------------------------------------- | ||||
| use strict; | ||||
| use warnings; | ||||
| use Mojo::Base 'Mojolicious::Controller'; | ||||
| use Locale::gettext; | ||||
| use SrvMngr::I18N; | ||||
| use SrvMngr qw(theme_list init_session); | ||||
| use SrvMngr qw(gen_locale_date_string); | ||||
| use esmith::ConfigDB::UTF8; | ||||
| use esmith::DomainsDB::UTF8; | ||||
| use esmith::NetworksDB::UTF8; | ||||
|  | ||||
| #use SrvMngr::Review_sub qw(print_page); | ||||
| #use smeserver::Panel::review; | ||||
| use esmith::FormMagick::Panel::review; | ||||
| our $db       = esmith::ConfigDB->open_ro   || die "Couldn't open config db"; | ||||
| our $domains  = esmith::DomainsDB->open_ro  || die "Couldn't open domains"; | ||||
| our $networks = esmith::NetworksDB->open_ro || die "Couldn't open networks"; | ||||
| our $db; | ||||
| our $domains ; | ||||
| our $networks; | ||||
|  | ||||
| sub main { | ||||
|     my $c = shift; | ||||
|     $c->app->log->info($c->log_req); | ||||
|     $db       = esmith::ConfigDB::UTF8->open_ro   || die "Couldn't open config db"; | ||||
|     my $title     = $c->l('rvw_FORM_TITLE'); | ||||
|     my $modul     = $c->render_to_string(inline => $c->l('rvw_DESCRIPTION')); | ||||
|     my %rvw_datas = (); | ||||
|     $rvw_datas{'servermode'} = (get_value('', 'SystemMode') || ''); | ||||
|     $rvw_datas{'localip'}          = get_value('$c', 'LocalIP') . '/' . get_value('$c', 'LocalNetmask'); | ||||
|     $rvw_datas{'publicip'}         = esmith::FormMagick::Panel::review->get_public_ip_address($c); | ||||
|     $rvw_datas{'publicip'}         = $c->get_public_ip_address($c); | ||||
|     $rvw_datas{'gateway'}          = $c->render_to_string(inline => print2_gateway_stanza($c)); | ||||
|     $rvw_datas{'serveronly'}       = $c->render_to_string(inline => print2_serveronly_stanza($c)); | ||||
|     $rvw_datas{'addlocalnetworks'} = get_local_networks($c); | ||||
| @@ -101,6 +100,7 @@ sub gen2_email_addresses { | ||||
|  | ||||
| sub gen2_domains { | ||||
|     my $c          = shift; | ||||
|     $domains  = esmith::DomainsDB::UTF8->open_ro  || die "Couldn't open domains"; | ||||
|     my @virtual    = $domains->get_all_by_prop(type => 'domain'); | ||||
|     my $numvirtual = @virtual; | ||||
|  | ||||
| @@ -129,6 +129,7 @@ serving.	(mojo ver) | ||||
|  | ||||
| sub get2_local_networks { | ||||
|     my $c           = shift; | ||||
|     $networks = esmith::NetworksDB::UTF8->open_ro || die "Couldn't open networks"; | ||||
|     my @nets        = $networks->get_all_by_prop('type' => 'network'); | ||||
|     my $numNetworks = @nets; | ||||
|  | ||||
| @@ -151,6 +152,55 @@ sub get2_local_networks { | ||||
|     } ## end else [ if ($numNetworks == 0)] | ||||
| } ## end sub get2_local_networks | ||||
|  | ||||
| sub get_net_prop { | ||||
|   my $fm = shift; | ||||
|   my $item = shift; | ||||
|   my $prop = shift; | ||||
|   $networks = esmith::NetworksDB::UTF8->open_ro || die "Couldn't open networks"; | ||||
|   my $record = $networks->get($item); | ||||
|   if ($record) { | ||||
|     return $record->prop($prop); | ||||
|   } | ||||
|   else { | ||||
|     return ''; | ||||
|   } | ||||
|  | ||||
| } | ||||
|  | ||||
|  | ||||
| sub get_local_networks { | ||||
|     my $fm = shift; | ||||
|     $networks = esmith::NetworksDB::UTF8->open_ro || die "Couldn't open networks"; | ||||
|     my @nets = $networks->get_all_by_prop('type' => 'network'); | ||||
|  | ||||
|     my $numNetworks = @nets; | ||||
|     if ($numNetworks == 0) { | ||||
|         return  $fm->localise('NO_NETWORKS'); | ||||
|     } | ||||
|     else { | ||||
|         my $out = ""; | ||||
|         foreach my $network (sort @nets) { | ||||
|             if ($out ne "") { | ||||
|                 $out .= "<BR>"; | ||||
|             } | ||||
|  | ||||
|             $out .= $network->key."/" . get_net_prop($fm, $network->key, 'Mask'); | ||||
|  | ||||
|             if ( defined get_net_prop($fm, $network->key, 'Router') ) { | ||||
|                 $out .= " via " . get_net_prop ($fm, $network->key, 'Router');  | ||||
|             } | ||||
|         } | ||||
|         return $out; | ||||
|     } | ||||
|  | ||||
| } | ||||
|  | ||||
| sub get_local_domain | ||||
| { | ||||
|     return (get_value('','DomainName')); | ||||
| } | ||||
|  | ||||
|  | ||||
| =head2 print2_gateway_stanza | ||||
|  | ||||
| If this system is a server gateway, show the external ip and gateway ip (mojo ver) | ||||
| @@ -216,4 +266,53 @@ sub print2_dhcp_stanza { | ||||
|     } ## end if (get_prop($c, 'dhcpd'...)) | ||||
|     return $out; | ||||
| } ## end sub print2_dhcp_stanza | ||||
|  | ||||
| sub get_value { | ||||
|   my $fm = shift; | ||||
|   my $item = shift; | ||||
|   $db       = esmith::ConfigDB::UTF8->open_ro   || die "Couldn't open config db"; | ||||
|   my $record = $db->get($item); | ||||
|   if ($record) { | ||||
|     return $record->value(); | ||||
|   } | ||||
|   else { | ||||
|     return ''; | ||||
|   } | ||||
|    | ||||
| } | ||||
|  | ||||
| sub get_prop { | ||||
|   my $fm = shift if (ref($_[0]) ); # If we're being called in a formmagick context | ||||
| 				 # The first argument will always be a fm. | ||||
| 				 #otherwise, we don't want to grab it | ||||
|   my $item = shift; | ||||
|   my $prop = shift; | ||||
|   $db       = esmith::ConfigDB::UTF8->open_ro   || die "Couldn't open config db"; | ||||
|   my $record = $db->get($item); | ||||
|   if ($record) { | ||||
|     return $record->prop($prop); | ||||
|   } | ||||
|   else { | ||||
|     return ''; | ||||
|   } | ||||
|  | ||||
| } | ||||
|  | ||||
| sub get_public_ip_address | ||||
| { | ||||
|     my $self = shift; | ||||
|     $db       = esmith::ConfigDB::UTF8->open_ro   || die "Couldn't open config db"; | ||||
|     my $sysconfig = $db->get('sysconfig'); | ||||
|     if ($sysconfig) | ||||
|     { | ||||
|         my $publicIP = $sysconfig->prop('PublicIP'); | ||||
|         if ($publicIP) | ||||
|         { | ||||
|             return $publicIP; | ||||
|         } | ||||
|     } | ||||
|     return undef; | ||||
| } | ||||
|  | ||||
|  | ||||
| 1; | ||||
|   | ||||
| @@ -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 | ||||
|   | ||||
| @@ -5,19 +5,18 @@ package SrvMngr::Controller::Swttheme; | ||||
| use strict; | ||||
| use warnings; | ||||
| use Mojo::Base 'Mojolicious::Controller'; | ||||
|  | ||||
| use esmith::ConfigDB::UTF8; | ||||
| #use SrvMngr qw(theme_list init_session); | ||||
| our $db = esmith::ConfigDB->open() || die "Couldn't open config db"; | ||||
|  | ||||
| sub main { | ||||
|     my $c     = shift; | ||||
|     my $db = esmith::ConfigDB::UTF8->open() || die "Couldn't open config db"; | ||||
|     my $from  = $c->param('From') || '/'; | ||||
|     my $theme = $c->param('Theme'); | ||||
|     $c->app->log->info(" swt theme '$from'  '$theme' "); | ||||
|     my $oldTheme = $c->session->{CurrentTheme}; | ||||
|  | ||||
|     if ($theme ne $oldTheme) { | ||||
|  | ||||
|         #	$c->app->renderer->paths([$c->app->home->rel_file('themes/default/templates')]); | ||||
|         #	$c->app->static->paths([$c->app->home->rel_file('themes/default/public')]); | ||||
|         #	if ( $theme ne 'default' ) { | ||||
| @@ -31,7 +30,7 @@ sub main { | ||||
|         system("/sbin/e-smith/signal-event smanager-theme-change") == 0 | ||||
|             or warn "$c->l('ERROR_UPDATING')"; | ||||
|     } ## end if ($theme ne $oldTheme) | ||||
| ## (not sure)     $c->flash( warning => $c->l('swt_LOGIN_AGAIN') ); | ||||
|     ## (not sure)     $c->flash( warning => $c->l('swt_LOGIN_AGAIN') ); | ||||
|     $from = '/initial'  if $from eq '/'; | ||||
|     $from = '/' . $from if ($from !~ m|^\/|); | ||||
|     $c->redirect_to($from); | ||||
|   | ||||
| @@ -14,27 +14,21 @@ use Mojo::Base 'Mojolicious::Controller'; | ||||
| use Locale::gettext; | ||||
| use SrvMngr::I18N; | ||||
| use SrvMngr qw(theme_list init_session | ||||
|     is_normal_password email_simple); | ||||
|  | ||||
| #use esmith::FormMagick qw( validate_password ); | ||||
| #use CGI::FormMagick::Validator qw( call_fm_validation ); | ||||
| use esmith::AccountsDB; | ||||
| use esmith::ConfigDB; | ||||
|     validate_password email_simple); | ||||
| use esmith::AccountsDB::UTF8; | ||||
| use esmith::ConfigDB::UTF8; | ||||
| use esmith::util; | ||||
|  | ||||
| #use esmith::FormMagick; | ||||
| #use esmith::cgi; | ||||
| #use File::Basename; | ||||
| #use Exporter; | ||||
| #use Carp qw(verbose); | ||||
| #use esmith::FormMagick::Panel::useraccounts; | ||||
| our $adb = esmith::AccountsDB->open || die "Couldn't open accounts db"; | ||||
| our $cdb = esmith::ConfigDB->open() || die "Couldn't open config db"; | ||||
| my ($cdb,$adb); | ||||
|  | ||||
| sub main { | ||||
|     my $c = shift; | ||||
|     $c->app->log->info($c->log_req); | ||||
| 	my $adb = esmith::AccountsDB->open || die "Couldn't open accounts db"; | ||||
| 	$cdb = esmith::ConfigDB::UTF8->open() || die "Couldn't open config db"; | ||||
| 	$adb = esmith::AccountsDB::UTF8->open || die "Couldn't open accounts db"; | ||||
|     my $notif     = ''; | ||||
|     my %usr_datas = (); | ||||
|     my $title     = $c->l('usr_FORM_TITLE'); | ||||
| @@ -53,6 +47,8 @@ sub do_display { | ||||
|     my %usr_datas = (); | ||||
|     my $title     = $c->l('usr_FORM_TITLE'); | ||||
|     my ($notif, $modul) = ''; | ||||
| 	$cdb = esmith::ConfigDB::UTF8->open() || die "Couldn't open config db"; | ||||
| 	$adb = esmith::AccountsDB::UTF8->open || die "Couldn't open accounts db"; | ||||
|     $usr_datas{'trt'} = $trt; | ||||
|  | ||||
|     if ($trt eq 'ADD') { | ||||
| @@ -139,6 +135,8 @@ sub do_update { | ||||
|     $usr_datas{trt} = $trt; | ||||
|     my $title = $c->l('usr_FORM_TITLE'); | ||||
|     my ($res, $result) = ''; | ||||
| 	$cdb = esmith::ConfigDB::UTF8->open() || die "Couldn't open config db"; | ||||
| 	$adb = esmith::AccountsDB::UTF8->open || die "Couldn't open accounts db"; | ||||
|  | ||||
|     if ($trt eq 'ADD') { | ||||
|  | ||||
| @@ -357,10 +355,10 @@ sub lock_account { | ||||
|         $user = $1; | ||||
|  | ||||
|         if (system("/sbin/e-smith/signal-event", "user-lock", $user)) { | ||||
|             $adb = esmith::AccountsDB->open(); | ||||
|             $adb = esmith::AccountsDB::UTF8->open(); | ||||
|             return $c->l("usr_ERR_OCCURRED_LOCKING"); | ||||
|         } | ||||
|         $adb = esmith::AccountsDB->open(); | ||||
|         $adb = esmith::AccountsDB::UTF8->open(); | ||||
|         return 'OK'; | ||||
|     } else { | ||||
|         return $c->l('NO_SUCH_USER', $user); | ||||
| @@ -381,10 +379,10 @@ sub remove_account { | ||||
|         $user = $1; | ||||
|  | ||||
|         if (system("/sbin/e-smith/signal-event", "user-delete", $user)) { | ||||
|             $adb = esmith::AccountsDB->open(); | ||||
|             $adb = esmith::AccountsDB::UTF8->open(); | ||||
|             return $c->l("ERR_OCCURRED_DELETING"); | ||||
|         } | ||||
|         $adb = esmith::AccountsDB->open(); | ||||
|         $adb = esmith::AccountsDB::UTF8->open(); | ||||
|         $adb->get($user)->delete; | ||||
|         return 'OK'; | ||||
|     } else { | ||||
| @@ -400,7 +398,7 @@ sub reset_password { | ||||
|         return $c->l('usr_TAINTED_USER'); | ||||
|     } | ||||
|     $user = $1; | ||||
| 	my $adb = esmith::AccountsDB->open || die "Couldn't open accounts db"; | ||||
| 	my $adb = esmith::AccountsDB::UTF8->open || die "Couldn't open accounts db"; | ||||
|     my $acct = $adb->get($user); | ||||
|  | ||||
|     if ($acct->prop('type') eq "user") { | ||||
| @@ -409,10 +407,10 @@ sub reset_password { | ||||
|         undef $adb; | ||||
|  | ||||
|         if (system("/sbin/e-smith/signal-event", "password-modify", $user)) { | ||||
|             $adb = esmith::AccountsDB->open(); | ||||
|             $adb = esmith::AccountsDB::UTF8->open(); | ||||
|             return $c->l("usr_ERR_OCCURRED_MODIFYING_PASSWORD"); | ||||
|         } | ||||
|         $adb = esmith::AccountsDB->open(); | ||||
|         $adb = esmith::AccountsDB::UTF8->open(); | ||||
|         return 'OK'; | ||||
|     } else { | ||||
|         return $c->l('NO_SUCH_USER', $user); | ||||
| @@ -428,31 +426,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 [ | ||||
| @@ -690,10 +663,10 @@ sub modify_user { | ||||
|         undef $adb; | ||||
|  | ||||
|         unless (system("/sbin/e-smith/signal-event", "user-modify", $acctName) == 0) { | ||||
|             $adb = esmith::AccountsDB->open(); | ||||
|             $adb = esmith::AccountsDB::UTF8->open(); | ||||
|             return $c->l('usr_CANNOT_MODIFY_USER'); | ||||
|         } | ||||
|         $adb = esmith::AccountsDB->open(); | ||||
|         $adb = esmith::AccountsDB::UTF8->open(); | ||||
|     } ## end if ($acctType eq "user") | ||||
|     return 'OK'; | ||||
| } ## end sub modify_user | ||||
| @@ -726,10 +699,10 @@ sub create_user { | ||||
|     $acctName = $1; | ||||
|  | ||||
|     if (system("/sbin/e-smith/signal-event", "user-create", $acctName)) { | ||||
|         $adb = esmith::AccountsDB->open(); | ||||
|         $adb = esmith::AccountsDB::UTF8->open(); | ||||
|         return $c->l("usr_ERR_OCCURRED_CREATING"); | ||||
|     } | ||||
|     $adb = esmith::AccountsDB->open(); | ||||
|     $adb = esmith::AccountsDB::UTF8->open(); | ||||
|     $c->set_groups(); | ||||
|     return 'OK'; | ||||
| } ## end sub create_user | ||||
| @@ -754,7 +727,7 @@ sub modify_admin { | ||||
|     $acct->merge_props(%newProperties); | ||||
|     undef $adb; | ||||
|     my $status = system("/sbin/e-smith/signal-event", "user-modify-admin", 'admin'); | ||||
|     $adb = esmith::AccountsDB->open(); | ||||
|     $adb = esmith::AccountsDB::UTF8->open(); | ||||
|  | ||||
|     if ($status == 0) { | ||||
|         return 'OK'; | ||||
| @@ -778,8 +751,7 @@ sub system_validate_password { | ||||
| sub system_check_password { | ||||
|     my $c     = shift; | ||||
|     my $pass1 = shift; | ||||
|     use esmith::ConfigDB; | ||||
|     my $conf = esmith::ConfigDB->open(); | ||||
|     my $conf = esmith::ConfigDB::UTF8->open(); | ||||
|     my ($check_type, $rec); | ||||
|  | ||||
|     if ($conf) { | ||||
| @@ -819,4 +791,4 @@ sub system_change_password { | ||||
|         return $c->l("Error occurred while modifying password for admin.", 'First'); | ||||
|     } | ||||
| } ## end sub system_change_password | ||||
| 1 | ||||
| 1 | ||||
|   | ||||
| @@ -12,12 +12,11 @@ use strict; | ||||
| use warnings; | ||||
| use Mojo::Base 'Mojolicious::Controller'; | ||||
| use esmith::util; | ||||
| use esmith::ConfigDB; | ||||
| use esmith::AccountsDB; | ||||
| use esmith::ConfigDB::UTF8; | ||||
| use esmith::AccountsDB::UTF8; | ||||
| use Locale::gettext; | ||||
| use SrvMngr::I18N; | ||||
| use SrvMngr qw( theme_list init_session is_normal_password ); | ||||
| our $cdb = esmith::ConfigDB->open_ro || die "Couldn't open configuration db"; | ||||
| use SrvMngr qw( theme_list init_session validate_password ); | ||||
|  | ||||
| sub main { | ||||
|     my $c         = shift; | ||||
| @@ -161,7 +160,7 @@ sub reset_password { | ||||
|     my $ret; | ||||
|     return $c->l('usr_TAINTED_USER') unless (($user) = ($user =~ /^(\w[\-\w_\.]*)$/)); | ||||
|     $user = $1; | ||||
|     my $adb  = esmith::AccountsDB->open(); | ||||
|     my $adb  = esmith::AccountsDB::UTF8->open(); | ||||
|     my $acct = $adb->get($user); | ||||
|     return $c->l('NO_SUCH_USER', $user) unless ($acct->prop('type') eq 'user'); | ||||
|     $ret = esmith::util::setUserPasswordRequirePrevious($user, $oldpassword, $password) if $trt ne 'RESET'; | ||||
| @@ -171,10 +170,10 @@ sub reset_password { | ||||
|     undef $adb; | ||||
|  | ||||
|     if (system("/sbin/e-smith/signal-event", "password-modify", $user)) { | ||||
|         $adb = esmith::AccountsDB->open(); | ||||
|         $adb = esmith::AccountsDB::UTF8->open(); | ||||
|         return $c->l("usr_ERR_OCCURRED_MODIFYING_PASSWORD"); | ||||
|     } | ||||
|     $adb = esmith::AccountsDB->open(); | ||||
|     $adb = esmith::AccountsDB::UTF8->open(); | ||||
|     return 'OK'; | ||||
| } ## end sub reset_password | ||||
|  | ||||
| @@ -194,33 +193,10 @@ sub check_password { | ||||
|     my $c        = shift; | ||||
|     my $password = shift; | ||||
|     my $strength; | ||||
|     my $cdb = esmith::ConfigDB::UTF8->open_ro || die "Couldn't open configuration db"; | ||||
|     my $rec = $cdb->get('passwordstrength'); | ||||
|     $strength = ($rec ? ($rec->prop('Users') || 'none') : 'none'); | ||||
|     return validate_password($c, $strength, $password); | ||||
| } ## end sub check_password | ||||
|  | ||||
| sub validate_password { | ||||
|     my ($c, $strength, $pass) = @_; | ||||
|     use Crypt::Cracklib; | ||||
|  | ||||
|     if ($strength eq "none") { | ||||
|         return $c->l("Passwords must be at least 7 characters long") unless (length($pass) > 6); | ||||
|         return "OK"; | ||||
|     } | ||||
|     my $reason = is_normal_password($c, $pass, undef); | ||||
|     return $reason unless ($reason eq "OK"); | ||||
|     return "OK" unless ($strength eq "strong"); | ||||
|  | ||||
|     if (-f '/usr/lib64/cracklib_dict.pwd') { | ||||
|         $reason = fascist_check($pass, '/usr/lib64/cracklib_dict'); | ||||
|     } else { | ||||
|         $reason = fascist_check($pass, '/usr/lib/cracklib_dict'); | ||||
|     } | ||||
|     $reason ||= "Software error: password check failed"; | ||||
|     return "OK" if ($reason eq "ok"); | ||||
|     return | ||||
|           $c->l("Bad Password Choice") . ": " | ||||
|         . $c->l("The password you have chosen is not a good choice, because") . " " | ||||
|         . $c->($reason) . "."; | ||||
| } ## end sub validate_password | ||||
| 1; | ||||
|   | ||||
| @@ -12,19 +12,18 @@ use strict; | ||||
| use warnings; | ||||
| use Mojo::Base 'Mojolicious::Controller'; | ||||
|  | ||||
| #use esmith::FormMagick qw(gen_locale_date_string); | ||||
| use Locale::gettext; | ||||
| use SrvMngr::I18N; | ||||
| use SrvMngr qw(theme_list init_session); | ||||
| use esmith::ConfigDB; | ||||
| #use Time::TAI64; | ||||
| use File::Basename; | ||||
| use HTML::Entities; | ||||
| use esmith::FormMagick qw(gen_locale_date_string); | ||||
| use SrvMngr qw(gen_locale_date_string); | ||||
| use File::Temp qw(tempfile); | ||||
| use constant TRUE  => 1; | ||||
| use constant FALSE => 0; | ||||
| our $cdb = esmith::ConfigDB->open() || die "Couldn't open config db"; | ||||
| use esmith::ConfigDB::UTF8; | ||||
|  | ||||
| our $cdb; | ||||
| our @logfiles = ();    # with array | ||||
|  | ||||
| sub main { | ||||
| @@ -33,7 +32,9 @@ sub main { | ||||
|     my %log_datas = (); | ||||
|     my $title     = $c->l('log_FORM_TITLE'); | ||||
|     my $notif     = ''; | ||||
|     $log_datas{default_op} = ($cdb->get('viewlogfiles')->prop('DefaultOperation')) || 'view'; | ||||
|     $cdb = esmith::ConfigDB::UTF8->open() || die "Couldn't open config db"; | ||||
|     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 | ||||
| @@ -232,6 +233,7 @@ sub showlogFile { | ||||
| sub download_logFile { | ||||
|     my ($c, %log_datas) = @_; | ||||
|     my $fullpath = "/var/log/$log_datas{filename}"; | ||||
|     $cdb = esmith::ConfigDB::UTF8->open() || die "Couldn't open config db"; | ||||
|  | ||||
|     # Save this information for later. | ||||
|     $cdb->get('viewlogfiles')->merge_props('DefaultOperation', $log_datas{operation}); | ||||
| @@ -295,4 +297,4 @@ sub download_logFile { | ||||
|     ); | ||||
|     return undef; | ||||
| } ## end sub download_logFile | ||||
| 1; | ||||
| 1; | ||||
|   | ||||
| @@ -13,12 +13,13 @@ use Mojo::Base 'Mojolicious::Controller'; | ||||
| use Locale::gettext; | ||||
| use SrvMngr::I18N; | ||||
| use SrvMngr qw(theme_list init_session); | ||||
| use esmith::FormMagick::Panel::workgroup; | ||||
| our $db = esmith::ConfigDB->open || die "Couldn't open config db"; | ||||
| use esmith::ConfigDB::UTF8; | ||||
| 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 %wkg_datas = (); | ||||
|     my $title     = $c->l('wkg_FORM_TITLE'); | ||||
|     my $modul     = ''; | ||||
|   | ||||
| @@ -3,7 +3,7 @@ package SrvMngr::Controller::Yum; | ||||
| #---------------------------------------------------------------------- | ||||
| # heading     : System | ||||
| # description : Software installer | ||||
| # navigation  : 4000 300 | ||||
| # navigation  : 4000 500 | ||||
| # | ||||
| # routes : end | ||||
| #---------------------------------------------------------------------- | ||||
| @@ -13,28 +13,30 @@ use Mojo::Base 'Mojolicious::Controller'; | ||||
| use Locale::gettext; | ||||
| use SrvMngr::I18N; | ||||
| use SrvMngr qw(theme_list init_session ip_number_or_blank); | ||||
| use esmith::ConfigDB; | ||||
| # dnf_* should remain ASCII; yum_repositories do not need to be UTF-8 | ||||
| use esmith::ConfigDB::UTF8; | ||||
| use esmith::util; | ||||
| use File::Basename; | ||||
| our $cdb = esmith::ConfigDB->open || die "Couldn't open config db"; | ||||
| our $cdb; | ||||
| my $dnf_status_file = '/var/cache/dnf/dnf.status'; | ||||
|  | ||||
| #use File::stat; | ||||
| our %dbs; | ||||
|  | ||||
| for (qw(available installed updates)) { | ||||
|     $dbs{$_} = esmith::ConfigDB->open_ro("dnf_$_") | ||||
|     $dbs{$_} = esmith::ConfigDB::UTF8->open_ro("dnf_$_") | ||||
|         or die "Couldn't open dnf_$_ DB\n"; | ||||
| } | ||||
|  | ||||
| for (qw(repositories)) { | ||||
|     $dbs{$_} = esmith::ConfigDB->open("yum_$_") | ||||
|     $dbs{$_} = esmith::ConfigDB::UTF8->open("yum_$_") | ||||
|         or die "Couldn't open yum_$_ DB\n"; | ||||
| } | ||||
|  | ||||
| sub main { | ||||
|     my $c = shift; | ||||
|     $c->app->log->info($c->log_req); | ||||
|     $cdb = esmith::ConfigDB::UTF8->open || die "Couldn't open config db"; | ||||
|     my %yum_datas = (); | ||||
|     my $title     = $c->l('yum_FORM_TITLE'); | ||||
|     my $dest      = 'yum'; | ||||
| @@ -60,6 +62,7 @@ sub do_display { | ||||
|     my $c         = shift; | ||||
|     my $rt        = $c->current_route; | ||||
|     my $trt       = ($c->param('trt') || 'STAT'); | ||||
|     $cdb = esmith::ConfigDB::UTF8->open || die "Couldn't open config db"; | ||||
|     my %yum_datas = (); | ||||
|     my $title     = $c->l('yum_FORM_TITLE'); | ||||
|     my ($notif, $dest) = ''; | ||||
|   | ||||
| @@ -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.', | ||||
|   | ||||
| @@ -4,19 +4,19 @@ use strict; | ||||
| use warnings; | ||||
| use utf8; | ||||
|  | ||||
| use esmith::ConfigDB; | ||||
| use esmith::AccountsDB; | ||||
| use esmith::ConfigDB::UTF8; | ||||
| use esmith::AccountsDB::UTF8; | ||||
| use esmith::util; | ||||
|  | ||||
| use Net::LDAP qw/LDAP_INVALID_CREDENTIALS/; | ||||
|  | ||||
| our ($cdb,$adb); | ||||
|  | ||||
|  | ||||
| sub init_data { | ||||
|  | ||||
|     my %datas = (); | ||||
|  | ||||
|     my $cdb = esmith::ConfigDB->open_ro() or die("can't open Config DB"); | ||||
|     $cdb = esmith::ConfigDB::UTF8->open_ro() or die("can't open Config DB"); | ||||
|     my $sysconfig = $cdb->get("sysconfig"); | ||||
|  | ||||
|     $datas{'lang'} = $sysconfig->prop('Language') || 'en_US'; | ||||
| @@ -42,7 +42,7 @@ sub init_data { | ||||
|  | ||||
| sub reconf_needed { | ||||
|  | ||||
|     my $cdb = esmith::ConfigDB->open_ro() or die("can't open Config DB"); | ||||
|     $cdb = esmith::ConfigDB::UTF8->open_ro() or die("can't open Config DB"); | ||||
|     #my $unsafe = ($cdb->get('bootstrap-console') and $cdb->get('bootstrap-console')->prop('Run') eq 'yes') || | ||||
|     #     ($cdb->get('UnsavedChanges') and $cdb->get('UnsavedChanges')->value eq 'yes') || '0'; | ||||
| 	my $unsafe = ($cdb->get('UnsavedChanges') and $cdb->get('UnsavedChanges')->value eq 'yes') || '0';    | ||||
| @@ -55,7 +55,7 @@ sub check_credentials { | ||||
|     my ($c, $username, $password) = @_; | ||||
|     return unless $username || $password; | ||||
|  | ||||
|     my $cdb = esmith::ConfigDB->open_ro() or die("can't open Configuration DB"); | ||||
|     $cdb = esmith::ConfigDB::UTF8->open_ro() or die("can't open Configuration DB"); | ||||
|     my $l = $cdb->get('ldap'); | ||||
|     my $status = $l->prop('status') || "disabled"; | ||||
|     unless ($status eq "enabled" ) { | ||||
| @@ -88,13 +88,13 @@ sub check_adminalias { | ||||
|     my $c = shift; | ||||
|  | ||||
|     my $alias; | ||||
|     my $cdb = esmith::ConfigDB->open_ro() or die("can't open Configuration DB"); | ||||
|     $cdb = esmith::ConfigDB::UTF8->open_ro() or die("can't open Configuration DB"); | ||||
|     if (defined $cdb->get('AdminAlias')) { | ||||
| 	$alias = $cdb->get('AdminAlias')->value; | ||||
|     } | ||||
|     return undef unless $alias; | ||||
|  | ||||
|     my $adb = esmith::AccountsDB->open_ro() or die("can't open Accounts DB"); | ||||
|     $adb = esmith::AccountsDB::UTF8->open_ro() or die("can't open Accounts DB"); | ||||
|     my $arec = $adb->get( $alias ); | ||||
|     return undef unless $arec; | ||||
|  | ||||
| @@ -105,4 +105,4 @@ sub check_adminalias { | ||||
| } | ||||
|  | ||||
|  | ||||
| 1; | ||||
| 1; | ||||
|   | ||||
							
								
								
									
										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::UTF8; | ||||
|  | ||||
| # 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::UTF8->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 | ||||
| @@ -5,11 +5,11 @@ | ||||
| use strict; | ||||
| use warnings; | ||||
|  | ||||
| use esmith::ConfigDB; | ||||
| use esmith::ConfigDB::UTF8; | ||||
|  | ||||
| use constant WEBFUNCTIONS => '/usr/share/smanager/lib/SrvMngr/Controller/'; | ||||
|  | ||||
| my $rtdb = esmith::ConfigDB->open('routes') or | ||||
| my $rtdb = esmith::ConfigDB::UTF8->open('routes') or | ||||
|         die "Couldn't access Routes database\n"; | ||||
|  | ||||
| my @routes = $rtdb->get_all_by_prop( type => 'route' ); | ||||
|   | ||||
| @@ -7,7 +7,7 @@ | ||||
| use strict; | ||||
| use warnings; | ||||
|  | ||||
| use esmith::ConfigDB; | ||||
| use esmith::ConfigDB::UTF8; | ||||
|  | ||||
| sub gen_pwd { | ||||
|     use MIME::Base64 qw(encode_base64); | ||||
| @@ -29,7 +29,7 @@ sub gen_pwd { | ||||
|     return $p; | ||||
| } | ||||
|  | ||||
| my $cdb = esmith::ConfigDB->open() || die "Couldn't open config db"; | ||||
| my $cdb = esmith::ConfigDB::UTF8->open() || die "Couldn't open config db"; | ||||
|  | ||||
| my $pwds = $cdb->get_prop('smanager','Secrets'); | ||||
|  | ||||
|   | ||||
| @@ -14,6 +14,10 @@ BEGIN | ||||
|     $ENV{'HOME'} = '/usr/share/smanager'; | ||||
|     delete $ENV{'ENV'}; | ||||
|     esmith::util::setRealToEffective(); | ||||
|     #to help debug UTF8, see perlrun and perlvar -CSAD or -CLSD | ||||
|     #print '$ENV{PERL_UNICODE}='.$ENV{'PERL_UNICODE'}."\n" if $ENV{'PERL_UNICODE'}; | ||||
|     #print '${^UNICODE}='.${^UNICODE}.' ; ${^UTF8LOCALE}='.${^UTF8LOCALE} ."\n"; | ||||
|     #print '${^OPEN}'.${^OPEN}."\n" if ${^OPEN} ; | ||||
| }  | ||||
|  | ||||
|  | ||||
|   | ||||
| @@ -6,8 +6,8 @@ use Test::Mojo; | ||||
| use FindBin; | ||||
| use lib "$FindBin::Bin/../lib"; | ||||
|  | ||||
| eval "use esmith::ConfigDB"; | ||||
| plan skip_all => 'esmith::ConfigDB (and others) required for testing 002_basic' if $@; | ||||
| eval "use esmith::ConfigDB::UTF8"; | ||||
| plan skip_all => 'esmith::ConfigDB::UTF8 (and others) required for testing 002_basic' if $@; | ||||
|  | ||||
| plan tests => 3; | ||||
|  | ||||
|   | ||||
| @@ -6,8 +6,8 @@ use Test::Mojo; | ||||
| use FindBin; | ||||
| use lib "$FindBin::Bin/../lib"; | ||||
|  | ||||
| eval "use esmith::ConfigDB"; | ||||
| plan skip_all => 'esmith::ConfigDB (and others) required for testing 004_panels' if $@; | ||||
| eval "use esmith::ConfigDB::UTF8"; | ||||
| plan skip_all => 'esmith::ConfigDB::UTF8 (and others) required for testing 004_panels' if $@; | ||||
|  | ||||
| my $tests; | ||||
| plan tests => $tests; | ||||
| @@ -17,8 +17,8 @@ BEGIN { $tests += 2 * 3 }; | ||||
| my $t = Test::Mojo->new('SrvMngr'); | ||||
| $t->ua->max_redirects(1); | ||||
|  | ||||
| $t->get_ok('/')->status_is(200)->content_like(qr/SME Server 10/); | ||||
| $t->get_ok('/manual')->status_is(200)->content_like(qr/SME Server 10/); | ||||
| $t->get_ok('/')->status_is(200)->content_like(qr/SME Server 11/); | ||||
| $t->get_ok('/manual')->status_is(200)->content_like(qr/SME Server 11/); | ||||
|  | ||||
| BEGIN { $tests += 5 * 2 }; | ||||
| my @panels = qw/ Initial Login Manual Support Request /; | ||||
|   | ||||
| @@ -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 | ||||
| @@ -1,6 +1,6 @@ | ||||
| <% | ||||
|  | ||||
|     my $backups = esmith::BackupHistoryDB->open; | ||||
|     my $backups = esmith::BackupHistoryDB->open; # no UTF8 | ||||
|     my $now = time(); | ||||
|     my $backup_rec = $backups->new_record($now, { | ||||
| 	type => 'backup_record', BackupType => 'desktop', | ||||
| @@ -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> | ||||
| @@ -64,7 +64,7 @@ | ||||
|                                         %       </a> | ||||
| 					%}; | ||||
| 					%my $remove_text = l('REMOVE');  # Localized text | ||||
| 					%my $csrf_token = "TOKEN";  # CSRF token for security | ||||
| 					%$csrf_token = "TOKEN";  # CSRF token for security | ||||
| 					%#my $hostentries_name = $_->{'HostName'};  # hostentries name extracted from the data structure | ||||
| 					%$actionRemove = qq{ | ||||
|                                         %       <a href="hostentriesd?CsrfDef=$csrf_token&trt=DEL&Hostname=$hostentries_name"> | ||||
|   | ||||
Some files were not shown because too many files have changed in this diff Show More
		Reference in New Issue
	
	Block a user