Compare commits

...

58 Commits

Author SHA1 Message Date
6d3f8f48c2 * Fri Jan 24 2025 Brian Read <brianr@koozali.org> 11.0.0-44.sme
- Change to network-online for systemd startup to make sure network is up [SME: 12758]
2025-01-24 19:04:28 +00:00
f8d9ec34e3 Fix red error message when goes over one line 2025-01-23 15:53:51 +00:00
835d439e42 mojo update, version in footer, password setting in useraccounts 2025-01-23 15:03:28 +00:00
4797a1b189 Add mojo version to footer 2025-01-23 09:59:29 +00:00
1e4ec809b5 Update spec file to -43 2025-01-23 07:34:50 +00:00
d1197f55cf Update letsencrypt dealing with pointer to hash of params 2025-01-23 07:12:01 +00:00
b5d6de3bcf Update to work for Mojo 9.39 - config accessed through plugin not global hash 2025-01-22 11:53:21 +00:00
ec4f515012 * Fri Jan 17 2025 Brian Read <brianr@koozali.org> 11.0.0-42.sme
- Implement password visibility icon - [SME: 12803]
2025-01-17 12:04:36 +00:00
9b03d377e2 * Wed Jan 15 2025 Brian Read <brianr@koozali.org> 11.0.0-41.sme
- Add journal files to those not viewable [SME: 12870]
2025-01-15 18:44:48 +00:00
957d2ada21 Add journal files to list of files in /var/log NOT viewable 2025-01-15 18:39:22 +00:00
be49419eba * Wed Jan 15 2025 Brian Read <brianr@koozali.org> 11.0.0-40.sme
- Comment out missing prefix message in navigation2-conf action and re-format it with perltidy [SME: 127672]
2025-01-15 11:41:22 +00:00
c1915a722b Reformat Controller perl code using perltidy 2025-01-14 12:49:31 +00:00
7ff51625c0 Update .perltidyrc 2025-01-14 11:52:05 +00:00
18c95a9021 Add .gitignore and .perltidyrc to Controlller directory 2025-01-14 11:06:38 +00:00
5ef3a00a05 * Sat Jan 11 2025 Brian Read <brianr@koozali.org> 11.0.0-38.sme
- Fix password reset for admin in user panel [SME: 12655]
2025-01-11 07:04:32 +00:00
174e140a04 * Thu Jan 09 2025 Brian Read <brianr@koozali.org> 11.0.0-37.sme
- Delete userpanelaccess from base (left in incorrectly after saome testing)  [SME: 12839]
2025-01-09 19:06:51 +00:00
d77b9bd341 Update spec file changelog for 12864 2025-01-09 15:53:59 +00:00
746609ced0 Bug:12864 Correct spelling in Lex file for API 2025-01-09 15:14:10 +00:00
9380ac0264 Bug:12868 fix email settings for spamassassin status 2025-01-09 14:49:56 +00:00
a07bdf4aa5 * Tue Dec 31 2024 Jean-Philippe Pialasse <jpp@koozali.org> 11.0.0-35.sme
- fix PATH [SME: 12847]
2024-12-31 03:09:36 -05:00
4270814afc * Tue Dec 31 2024 Jean-Philippe Pialasse <jpp@koozali.org> 11.0.0-34.sme
- fix css warning xxcolor [SME: 12844]
- update CSP style rules [SME: 12840]
2024-12-31 02:00:14 -05:00
58c3f2348a * Mon Dec 30 2024 Jean-Philippe Pialasse <jpp@koozali.org> 11.0.0-33.sme
- host locally flag-icon.min.css 3.5.0 [SME: 12845]
- remove onclick to comply with strict CSP [SME: 12846]
- add CSP rules with specific hash [SME: 12840]
2024-12-31 01:25:04 -05:00
b58f82a332 Fix up user and localnetwork panels and stop menu moving betweek proxy and reboot 2024-12-18 12:08:00 +00:00
8db1279a3e * Tue Dec 17 2024 Brian Read <brianr@koozali.org> 11.0.0-31.sme
- Edit html to avoid w3c html validation warnings [SME: 6278]
2024-12-17 06:35:33 +00:00
1d3d59b5c1 Fix up action commands for user panel 2024-12-16 19:55:15 +00:00
ff9a84dd29 Fix up action commands for pseudonyms and quota 2024-12-16 16:15:03 +00:00
34e7331845 Fix up action commands for port forwarding and printers 2024-12-16 13:55:52 +00:00
dfda47882d Fix up action commands for Ibays and correct groups link 2024-12-16 13:26:19 +00:00
55269fd685 Fix up action commands for Groups and Host panels 2024-12-15 17:17:32 +00:00
1b1b99955b Fix yp html warnings from w3c - mainly empty paragraphs, but also domain lists recast buttons 2024-12-15 10:15:38 +00:00
c6eb08a727 More Fix up html to conform to W3c standards - avoid duplicate id in nav menu 2024-12-14 14:06:56 +00:00
8e70adc797 A bit more header html fixing 2024-12-13 17:52:32 +00:00
2424684d35 Fix up html warned from w3c validator in header and footed 2024-12-13 16:42:42 +00:00
78bb7743c1 Add in letsencrypt and add requires for certificates and lib 2024-12-13 11:52:45 +00:00
87f6a46502 Add in letsencrypt action routines for SM2 panel 2024-12-01 15:36:46 +00:00
a08767919c Add in getmyip script 2024-11-27 16:01:56 +00:00
2b83be6d70 Fix 1267 in remoteaccess panel 2024-11-26 16:38:31 +00:00
6c1b6ed1f4 Add *.bak to .gitignore 2024-11-12 19:20:21 +00:00
3fa8ab5eda Update README with specific Bugzilla links 2024-10-27 14:23:06 +00:00
55465e3081 Update readme bugzilla link to show all outstanding bugs 2024-10-27 12:12:21 +00:00
e5b9a012d9 * Fri Oct 18 2024 Brian Read <brianr@koozali.org> 11.0.0-28.sme
- Add in emailsettings for port 25,465 and 587  [SME: 12750]
- Comment out change to localhost for roundcube in _user_list email icon setting [SME: 12751]
2024-10-18 11:46:27 +01:00
fbdf3170ec Add in _user_list.html.ep change 2024-10-06 09:48:42 +01:00
87d1d072c0 * Fri Oct 04 2024 Brian Read <brianr@koozali.org> 11.0.0-26.sme
- Add in email link to roundcube from user accounts [SME: 12751]
2024-10-04 12:34:34 +01:00
d49db26f26 Add in email link to roundcube from user accounts 2024-10-04 12:14:56 +01:00
c4f9d67abc First shot at Email icon in action col for user accounts 2024-10-02 16:42:58 +01:00
fe62bd3e39 Add curosr change when save or submit pressed 2024-10-02 14:13:47 +01:00
df6d21dbc9 Up release to accomodate messed up build 2024-10-02 09:56:24 +01:00
9c9592f861 Add release number to footer for SM2 2024-10-02 09:12:38 +01:00
4d2097d2da * Tue Sep 24 2024 Jean-Philippe Pialasse <jpp@koozali.org> 11.0.0-22.sme
- fix typos, and tidy tabs [SME: 12744]
2024-09-24 22:06:09 -04:00
44a9ecc0e1 Remove both option for webmail, add in DB re-open in Emailsetting and Portforwarding panels 2024-09-24 17:37:52 +01:00
785ebcfaaf * Mon Sep 23 2024 Jean-Philippe Pialasse <jpp@koozali.org> 11.0.0-20.sme
- webmail switch panel to use roundcube [SME: 12742]
- prevent browser from caching [SME: 12695]
2024-09-23 10:07:08 -04:00
127ea74a8b Add in WithoutCache plugin 2024-09-05 11:57:23 +01:00
b9f6392c1d Update flag to use emojii and fix singleton locale 2024-08-25 11:34:57 +01:00
659f060eb6 Left align submit in Software Install subservient panels 2024-08-22 15:41:04 +01:00
1087a8a5a2 Software Installer panel - move dnf monitoring to /var/cache/dnf.status 2024-08-22 12:17:32 +01:00
6a5a756438 uc DNF to lc dnf in Yum.pm 2024-08-21 16:06:16 +01:00
91ca26de27 Migrate panel for software installer from yum to dnf 2024-08-21 12:39:46 +01:00
8b93232bbe make small changes to the readme 2024-08-16 15:42:40 +02:00
147 changed files with 8302 additions and 7243 deletions

1
.gitignore vendored
View File

@@ -2,3 +2,4 @@
*.log
*spec-20*
*.tar.xz
*.bak

View File

@@ -13,7 +13,14 @@ SMEServer Koozali developed git repo for smeserver-manager smeserver
<br />https://wiki.koozali.org/Server_Manager_2_Howto_incorporate_a_legacy_contrib
## Bugzilla
Show list of outstanding bugs: [here](https://bugs.koozali.org/buglist.cgi?component=smeserver-manager&product=SME%20Server%2010.X&query_format=advanced&limit=0&bug_status=UNCONFIRMED&bug_status=NEW&bug_status=ASSIGNED&bug_status=REOPENED&bug_status=CONFIRMED)
Show list of outstanding bugs:
[All](https://bugs.koozali.org/buglist.cgi?action=wrap&bug_status=UNCONFIRMED&bug_status=CONFIRMED&bug_status=NEEDINFO&bug_status=IN_PROGRESS&bug_status=RESOLVED&bug_status=VERIFIED&cf_package=smeserver-manager&classification=SME+Server&list_id=105756&order=changeddate+DESC%2Ccomponent%2Cpriority%2Cbug_severity&query_format=advanced)
[Confirmed](https://bugs.koozali.org/buglist.cgi?action=wrap&bug_status=CONFIRMED&cf_package=smeserver-manager&classification=SME+Server&order=changeddate+DESC%2Ccomponent%2Cpriority%2Cbug_severity&query_format=advanced)
[Unconfirmed](https://bugs.koozali.org/buglist.cgi?action=wrap&bug_status=UNCONFIRMED&cf_package=smeserver-manager&classification=SME+Server&order=changeddate+DESC%2Ccomponent%2Cpriority%2Cbug_severity&query_format=advanced)
[Need info](https://bugs.koozali.org/buglist.cgi?action=wrap&bug_status=NEEDINFO&cf_package=smeserver-manager&classification=SME+Server&order=changeddate+DESC%2Ccomponent%2Cpriority%2Cbug_severity&query_format=advanced)
[In progress](https://bugs.koozali.org/buglist.cgi?action=wrap&bug_status=IN_PROGRESS&cf_package=smeserver-manager&classification=SME+Server&order=changeddate+DESC%2Ccomponent%2Cpriority%2Cbug_severity&query_format=advanced)
[Resolved](https://bugs.koozali.org/buglist.cgi?action=wrap&bug_status=RESOLVED&cf_package=smeserver-manager&classification=SME+Server&order=changeddate+DESC%2Ccomponent%2Cpriority%2Cbug_severity&query_format=advanced)
[Verified](https://bugs.koozali.org/buglist.cgi?action=wrap&bug_status=VERIFIED&cf_package=smeserver-manager&classification=SME+Server&order=changeddate+DESC%2Ccomponent%2Cpriority%2Cbug_severity&query_format=advanced)
## Description
@@ -27,10 +34,10 @@ It is based on the perl Mojolicious package. Mojolicious is a real-time web fram
smeserver-manager provides an intuitive and user-friendly web interface that allows administrators to manage various aspects of the server without needing deep technical knowledge or command-line skills.
#### User and Group Management:
Easily add, remove, and manage user accounts and groups. The interface simplifies creating email accounts, setting passwords, and configuring user permissions.
It allows you to easily add, remove, and manage user accounts and groups. The interface simplifies creating email accounts, setting passwords, and configuring user permissions.
#### Network Configuration:
Configures network settings such as IP addresses, DNS, DHCP, and gateway settings. The interface also provides options for setting up VPNs, remote access, and firewall rules.
You can configures network settings such as IP addresses, DNS, DHCP, and gateway settings. The interface also provides options for setting up VPNs, remote access, and firewall rules.
#### File Sharing and Storage:
Enables and manages file sharing services like Samba (for Windows file sharing) and NFS (for Unix/Linux file sharing). Administrators can easily create shared folders and manage permissions.
@@ -72,4 +79,4 @@ Dependencies: Relies on specific packages and configurations of SME Server, and
### Summary
SMEserver-manager is a powerful tool that brings simplicity and efficiency to server management for small to medium-sized enterprises. By providing a centralized, web-based interface, it allows administrators to manage users, network settings, file sharing, email services, web hosting, and more, all from a single location.
SMEserver-manager is a powerful tool that brings simplicity and efficiency to server management for small to medium-sized enterprises. By providing a centralized, web-based interface, it allows administrators to manage users, network settings, file sharing, email services, web hosting, and more, all from a single location.

2
clog
View File

@@ -1,2 +0,0 @@
* Sun Jul 28 2024 Brian Read <brianr@koozali.org> 11.0.0-14.sme
- fix [SME: ]

View File

@@ -0,0 +1 @@
-pbp -nst -nse -l=120 -ce -csc -pt=2 -kbl=0 -mbl=1 -lbl=1

View File

@@ -1,218 +1,207 @@
#!/usr/bin/perl -w
#----------------------------------------------------------------------
# copyright (C) 1999-2006 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
#
#
#----------------------------------------------------------------------
package esmith;
use strict;
use constant SMNGR_LIB => '/usr/share/smanager/lib';
use constant I18NMODULES => 'SrvMngr/I18N/Modules';
use constant WEBFUNCTIONS => 'SrvMngr/Controller';
use constant NAVDIR => '/home/e-smith/db';
use constant SMNGR_LIB => '/usr/share/smanager/lib';
use constant I18NMODULES => 'SrvMngr/I18N/Modules';
use constant WEBFUNCTIONS => 'SrvMngr/Controller';
use constant NAVDIR => '/home/e-smith/db';
use constant NAVIGATIONDIR => 'navigation2';
use constant DEBUG => 0;
use constant DEBUG => 0;
use esmith::NavigationDB;
use esmith::I18N;
use Data::Dumper; # activate if DEBUG
use Data::Dumper; # activate if DEBUG
binmode(STDOUT, ":encoding(UTF-8)");
my $navigation_ignore =
"(\.\.?|Swttheme\.pm|Login\.pm|Request\.pm|Modules\.pm(-.*)?)";
my $i18n = new esmith::I18N;
my $navigation_ignore = "(\.\.?|Swttheme\.pm|Login\.pm|Request\.pm|Modules\.pm(-.*)?)";
my $i18n = new esmith::I18N;
my %navdbs;
opendir FUNCTIONS, SMNGR_LIB.'/'.WEBFUNCTIONS or
die "Couldn't open ", SMNGR_LIB.'/'.WEBFUNCTIONS, "\n";
my @files = grep (!/^${navigation_ignore}$/, readdir (FUNCTIONS));
opendir FUNCTIONS, SMNGR_LIB . '/' . WEBFUNCTIONS
or die "Couldn't open ", SMNGR_LIB . '/' . WEBFUNCTIONS, "\n";
my @files = grep (!/^${navigation_ignore}$/, readdir(FUNCTIONS));
closedir FUNCTIONS;
my @langs = $i18n->availableLanguages();
my @langs = $i18n->availableLanguages();
#my @langs = ('tr'); #Temp override
foreach my $lang (@langs) {
my $long_lex = SMNGR_LIB . '/' . I18NMODULES . "/General/general_$lang.lex";
next unless (-e $long_lex);
open(LEX, '<:encoding(UTF-8)', $long_lex)
or die "Couldn't open ", $long_lex, " for reading.\n";
my @gen_lex = <LEX>;
close LEX;
#my @files = ('Portforwarding.pm'); #Temp override
foreach my $file (@files) {
next if (-d SMNGR_LIB . '/' . WEBFUNCTIONS . "/$file");
foreach my $lang (@langs)
{
my $long_lex = SMNGR_LIB.'/'.I18NMODULES."/General/general_$lang.lex";
next unless ( -e $long_lex );
# next unless ( $file =~ m/D.*\.pm$/ );
next unless ($file =~ m/[A-Z].*\.pm$/);
my $file2 = lc($file);
$file2 =~ s/\.pm$//;
open(LEX, '<:encoding(UTF-8)', $long_lex)
or die "Couldn't open ", $long_lex, " for reading.\n";
my @gen_lex = <LEX>;
close LEX;
#--------------------------------------------------
# extract heading, description and weight information
# from Mojo controller
#--------------------------------------------------
open(SCRIPT, SMNGR_LIB . '/' . WEBFUNCTIONS . "/$file");
my $heading = undef;
my $description = undef;
my $heading_weight = undef;
my $description_weight = undef;
my $menucat = undef;
my $routes = undef;
#my @files = ('Portforwarding.pm'); #Temp override
foreach my $file (@files)
{
next if (-d SMNGR_LIB.'/'.WEBFUNCTIONS . "/$file");
# next unless ( $file =~ m/D.*\.pm$/ );
next unless ( $file =~ m/[A-Z].*\.pm$/ );
while (<SCRIPT>) {
$heading = $1 if (/^\s*#\s*heading\s*:\s*(.+?)\s*$/);
$description = $1
if (/^\s*#\s*description\s*:\s*(.+?)\s*$/);
($heading_weight, $description_weight) = ($1, $2)
if (/^\s*#\s*navigation\s*:\s*(\d+?)\s+(\d+?)\s*$/);
$menucat = $1
if (/^\s*#\s*menu\s*:\s*(.+?)\s*$/);
last
if (defined $heading
and defined $description
and defined $heading_weight
and defined $description_weight
and defined $menucat);
my $file2 = lc($file);
$file2 =~ s/\.pm$//;
#--------------------------------------------------
# extract heading, description and weight information
# from Mojo controller
#--------------------------------------------------
open(SCRIPT, SMNGR_LIB.'/'.WEBFUNCTIONS . "/$file");
my $heading = undef;
my $description = undef;
my $heading_weight = undef;
my $description_weight = undef;
my $menucat = undef;
my $routes = undef;
# routes : end (stop before eof if 'menu' is not here before 'routes'!!!
$routes = $1 if (/^\s*#\s*routes\s*:\s*(.+?)\s*$/);
last if (defined $routes and $routes eq 'end');
} ## end while (<SCRIPT>)
close SCRIPT;
print "updating script $file for lang $lang\n" if DEBUG;
my $navdb = $navdbs{$lang};
my $navinfo = NAVDIR . '/' . NAVIGATIONDIR . "/navigation.$lang";
$navdb ||= esmith::NavigationDB->open($navinfo);
$navdb ||= esmith::NavigationDB->create($navinfo)
or die "Couldn't create $navinfo\n";
$navdbs{$lang} ||= $navdb;
my $rec = $navdb->get($file2)
|| $navdb->new_record($file2, { type => 'panel' });
my @panel_lex = ();
$long_lex = SMNGR_LIB . '/' . I18NMODULES . '/' . ucfirst($file2) . "/${file2}_$lang.lex";
while ( <SCRIPT> )
{
$heading = $1 if (/^\s*#\s*heading\s*:\s*(.+?)\s*$/);
$description = $1
if (/^\s*#\s*description\s*:\s*(.+?)\s*$/);
($heading_weight, $description_weight) = ($1, $2)
if (/^\s*#\s*navigation\s*:\s*(\d+?)\s+(\d+?)\s*$/);
$menucat = $1
if (/^\s*#\s*menu\s*:\s*(.+?)\s*$/);
if (-e $long_lex) {
open(LEX, '<:encoding(UTF-8)', $long_lex)
or die "Couldn't open ", $long_lex, " for reading.\n";
@panel_lex = <LEX>;
close LEX;
} ## end if (-e $long_lex)
last if (defined $heading and
defined $description and
defined $heading_weight and
defined $description_weight and
defined $menucat);
#Extract the prefix for this module
my @keys = values @panel_lex; # Get all values from the array
my $i = 0; # Initialize the index
my $found = 0; # Flag to check if the prefix was found
my $prefix = "xx_"; # Probably never match!!
# routes : end (stop before eof if 'menu' is not here before 'routes'!!!
$routes = $1 if (/^\s*#\s*routes\s*:\s*(.+?)\s*$/);
last if (defined $routes and $routes eq 'end');
}
close SCRIPT;
while ($i < @keys) { # Loop until we run out of entries
my $extracted_value = $keys[$i] || ""; # The current entry
#print("Extracted val: ".$extracted_value."\n");
print "updating script $file for lang $lang\n"if DEBUG;
my $navdb = $navdbs{$lang};
my $navinfo = NAVDIR.'/'.NAVIGATIONDIR . "/navigation.$lang";
$navdb ||= esmith::NavigationDB->open($navinfo);
$navdb ||= esmith::NavigationDB->create($navinfo) or
die "Couldn't create $navinfo\n";
$navdbs{$lang} ||= $navdb;
my $rec = $navdb->get($file2) ||
$navdb->new_record($file2, { type => 'panel' } );
my @panel_lex = ();
$long_lex = SMNGR_LIB.'/'.I18NMODULES.'/'.ucfirst($file2)."/${file2}_$lang.lex";
if ( -e $long_lex ) {
open(LEX, '<:encoding(UTF-8)', $long_lex)
or die "Couldn't open ", $long_lex, " for reading.\n";
@panel_lex = <LEX>;
close LEX;
}
#Extract the prefix for this module
my @keys = values @panel_lex; # Get all values from the array
my $i = 0; # Initialize the index
my $found = 0; # Flag to check if the prefix was found
my $prefix = "xx_"; # Probably never match!!
# Extract prefix from the second value (up to and including the first underscore)
#my ($prefix) = $second_value =~ /^'(.*?_)/; # Match everything up to and including the first underscore
($prefix) = $extracted_value =~ /^'(.*?_)/; # Match everything up to and including the first underscore
while ($i < @keys) { # Loop until we run out of entries
my $extracted_value = $keys[$i] || ""; # The current entry
#print("Extracted val: ".$extracted_value."\n");
if (defined $prefix) {
$found = 1; # Set found flag to true
last; # Exit the loop if prefix is found
} else {
# Extract prefix from the second value (up to and including the first underscore)
#my ($prefix) = $second_value =~ /^'(.*?_)/; # Match everything up to and including the first underscore
($prefix) = $extracted_value =~ /^'(.*?_)/; # Match everything up to and including the first underscore
if (defined $prefix) {
$found = 1; # Set found flag to true
last; # Exit the loop if prefix is found
} else {
#print("Extracted Val: " . $extracted_value . "\n");
}
#print("Extracted Val: " . $extracted_value . "\n");
}
$i++; # Increment the index to check the next entry
} ## end while ($i < @keys)
$i++; # Increment the index to check the next entry
}
if (!$found) {
#print(STDERR "No valid prefix found in any entries: " . $file2 . " (" . $lang . ")\n"); # if DEBUG;
$prefix = "xx_"; # Probably never match!!
}
if (!$found) {
print(STDERR "No valid prefix found in any entries: ".$file2." (".$lang.")\n"); # if DEBUG;
$prefix = "xx_"; # Probably never match!!
}
#print("Prefix: ".$prefix." ".$file2." (".$lang.")\n");
my %Lexicon = ();
push(@panel_lex, @gen_lex);
my $top_error = 0;
#print("Prefix: ".$prefix." ".$file2." (".$lang.")\n");
my %Lexicon = ();
push(@panel_lex, @gen_lex);
my $top_error = 0;
chomp @panel_lex;
chomp @panel_lex;
for (@panel_lex) {
next unless $_; # first one empty
my ($k, $v) = split / => /, $_;
# errors on split to $v (use DEBUG to see)
if ( $k and $v ) {
$k =~ s/\'//g;
$v =~ s/\'//g;
$v =~ s/,$//g;
$Lexicon{ lc($k) } = $v;
} else {
$k = "?" unless ($k);
print STDERR "Error for $lang $file2 on $k \n" if DEBUG;
$top_error++;
}
}
if ( $top_error > 0) {
if ( DEBUG ) {
print STDERR "$top_error errors for $lang $file2\n";
# print Dumper(\@panel_lex);
# print Dumper(\%Lexicon);
# exit 1;
}
}
$heading = "" unless defined $heading;
$description = "" unless defined $description;
# Get the base language code from $lang
my $base_lang = (split('-', $lang))[0];
my $loc_heading = process_localization( \%Lexicon, $heading, $lang, $prefix );
my $loc_description = process_localization( \%Lexicon, $description, $lang, $prefix );
$loc_heading =~ s/^\s*(\w.*?)\s*$/$1/;
$loc_description =~ s/^\s*(\w.*?)\s*$/$1/;
for (@panel_lex) {
next unless $_; # first one empty
my ($k, $v) = split / => /, $_;
$rec->merge_props(
Heading => $loc_heading,
Description => $loc_description,
HeadingWeight => localise( \%Lexicon, $heading_weight ),
DescriptionWeight => localise( \%Lexicon, $description_weight ),
MenuCat => (defined $menucat ? $menucat : 'A'));
}
#warn "trying to close for lang $lang\n";
my $navdb = $navdbs{$lang};
$navdb->close();
}
# errors on split to $v (use DEBUG to see)
if ($k and $v) {
$k =~ s/\'//g;
$v =~ s/\'//g;
$v =~ s/,$//g;
$Lexicon{ lc($k) } = $v;
} else {
$k = "?" unless ($k);
print STDERR "Error for $lang $file2 on $k \n" if DEBUG;
$top_error++;
}
} ## end for (@panel_lex)
if ($top_error > 0) {
if (DEBUG) {
print STDERR "$top_error errors for $lang $file2\n";
# print Dumper(\@panel_lex);
# print Dumper(\%Lexicon);
# exit 1;
} ## end if (DEBUG)
} ## end if ($top_error > 0)
$heading = "" unless defined $heading;
$description = "" unless defined $description;
# Get the base language code from $lang
my $base_lang = (split('-', $lang))[0];
my $loc_heading = process_localization(\%Lexicon, $heading, $lang, $prefix);
my $loc_description = process_localization(\%Lexicon, $description, $lang, $prefix);
$loc_heading =~ s/^\s*(\w.*?)\s*$/$1/;
$loc_description =~ s/^\s*(\w.*?)\s*$/$1/;
$rec->merge_props(
Heading => $loc_heading,
Description => $loc_description,
HeadingWeight => localise(\%Lexicon, $heading_weight),
DescriptionWeight => localise(\%Lexicon, $description_weight),
MenuCat => (defined $menucat ? $menucat : 'A')
);
} ## end foreach my $file (@files)
#warn "trying to close for lang $lang\n";
my $navdb = $navdbs{$lang};
$navdb->close();
} ## end foreach my $lang (@langs)
sub localise {
my ($lexicon, $string) = @_;
#print("Looking up:".$string."\n");
$string = "" unless defined $string;
$string = "" unless defined $string;
my $lc_string = lc($string);
my $res = $lexicon->{$lc_string} || $string;
my $res = $lexicon->{$lc_string} || $string;
#print("Returning:".$res."\n");
return $res;
}
} ## end sub localise
# Subroutine to process localization
sub process_localization {
@@ -226,15 +215,17 @@ sub process_localization {
# Check the condition
if ($loc_heading eq $heading && $base_lang ne 'en') {
# Construct the new key by combining the prefix and the original heading
my $key = $prefix . $heading;
# Localize using the constructed key
$loc_heading = localise($lexicon_ref, $key);
# See if it got a hit
if ($loc_heading eq $key){
$loc_heading = $heading;
}
}
return $loc_heading; # Optionally return the localized heading
}
if ($loc_heading eq $key) {
$loc_heading = $heading;
}
} ## end if ($loc_heading eq $heading...)
return $loc_heading; # Optionally return the localized heading
} ## end sub process_localization

View File

@@ -39,6 +39,22 @@
$OUT .= "# private access by default\n";
$OUT .= " Require ip $localAccess $externalSSLAccess\n";
}
$OUT .= " </Location>\n";
# any smanager script or style added in line should be hashed and added here to run in a modern browser
$OUT .= " Header set Content-Security-Policy \"script-src 'self' 'unsafe-eval' 'unsafe-hashes' "
." 'sha256-X8Qwlk0M9iDTQZqFVpbVcThRjBqQXpwTOZCLX8I+Frk=' 'sha256-inQ04nmqTZI75Z5g/tAzjahedNugPFfrhxHyoFezFkM=' 'sha256-5IsIX+Vbow7wwy2RjR3+5X06R/0CQZPkw3OHj/228cM=' 'sha256-tfVskwioRaNsV75h89itf7FujMgIrodfs1Ea4UAJNpE=' 'sha256-P51OyslUh5bGkoWk9qY+o4Su4HuwNFoQcFCeNxF7Ms8=' ; "
." style-src 'self' 'unsafe-hashes' "
#'sha256-EhT63KK1JBrsUM27H+5RMNifDFpVB+GXcTtavKXwCK8=' #h2l1
#'sha256-msdEhWmYTu7vqzGaQHDfvy6lzlDsbKkouwvN2R6Co9E=' #busy-indicator
#'sha256-iYwYhiMcsGmXCUzLEpEzZNz5dINrlkqf1sLbLhEcqGM=' _footer.html.ep style="position:relative;"
#'sha256-bOTFT8zacR4Rfja/WIKXgAQQXVaPyG3oBlvAhU4ga8g=' _usr_list style="min-width:35em"
#'sha256-CP93jJ1Y8nMwUoDzFbo1srdgsbADPasAc0Wjig1ahpY=' groups style="min-width:15em"
." 'sha256-msdEhWmYTu7vqzGaQHDfvy6lzlDsbKkouwvN2R6Co9E=' 'sha256-iYwYhiMcsGmXCUzLEpEzZNz5dINrlkqf1sLbLhEcqGM=' 'sha256-bOTFT8zacR4Rfja/WIKXgAQQXVaPyG3oBlvAhU4ga8g=' 'sha256-CP93jJ1Y8nMwUoDzFbo1srdgsbADPasAc0Wjig1ahpY=' 'sha256-EhT63KK1JBrsUM27H+5RMNifDFpVB+GXcTtavKXwCK8=' ;"
." \"\n";
$OUT .= " </Location>\n";
# prevent caching of manager files in browser
$OUT .= " <LocationMatch \"/$place/.+\.(html|cgi)\$\">\n";
$OUT .= " Header set Cache-Control no-store\n";
$OUT .= " </LocationMatch>\n";
}
}

View File

@@ -67,5 +67,21 @@ hr.sme-copyrightbar {
color: #8ebe43;
background-color: #8ebe43;
}
/* flag container no flag */
#flag-container span {
font-size: 24px;
}
.fallback-box {
display: inline-block; /* Make it inline-block to fit around the content */
border: 2px solid gray; /* Change the border color as desired */
padding: 10px; /* Add some padding */
border-radius: 10px; /* Round the corners of the box */
font-size: 60px; /* Adjust size if needed */
margin-top: 10px; /* Add some margin */
text-align: center; /* Center text inside the box */
}
HERE
}

View File

@@ -80,6 +80,7 @@ a:active { color: #606060; text-decoration: none; }
.sme-error {
color: red;
display:block;
background-color: #ffffff;
border-width: 1px;
border-style: solid;
@@ -93,6 +94,7 @@ a:active { color: #606060; text-decoration: none; }
.sme-warning {
color: orange;
display:block;
background-color: #ffffff;
border-width: 1px;
border-style: solid;
@@ -276,4 +278,4 @@ a.menu-title {
/*end*/
EOF
}
}

View File

@@ -1,7 +1,7 @@
[Unit]
Description=Server Manager 2 Mojo
Requires=network.target httpd-e-smith.service ldap.service
After=network.target
Requires=network-online.target httpd-e-smith.service ldap.service
After=network-online.target
[Service]
Type=simple

View File

@@ -25,8 +25,16 @@ use SrvMngr::Plugin::I18N;
use SrvMngr::I18N;
use SrvMngr::Model::Main;
use SrvMngr::Plugin::WithoutCache;
our $VERSION = '1.420';
#this is overwrittrn with the "release" by the spec file - release can be "99.el8.sme"
our $VERSION = '';
#Extract the release value
if ($VERSION =~ /^(\d+)/) {
$VERSION = $1; # $1 contains the matched numeric digits
} else {
$VERSION = '999' #No leading numeric digits found
}
$VERSION = eval $VERSION;
use Exporter 'import';
@@ -210,6 +218,8 @@ sub setup_plugins {
$self->plugin('TagHelpers');
$self->plugin('RenderFile');
$self->plugin('SrvMngr::Plugin::WithoutCache');
# CSRF protection if production mode
# $self->plugin('Mojolicious::Plugin::CSRFDefender' => {

View File

@@ -0,0 +1 @@
*.tdy

View File

@@ -0,0 +1 @@
-pbp -nst -nse -l=120 -ce -csc -pt=2 -kbl=0 -mbl=1 -lbl=1

File diff suppressed because it is too large Load Diff

View File

@@ -4,172 +4,143 @@ package SrvMngr::Controller::Bugreport;
# heading : Investigation
# description : Report a bug
# navigation : 7000 500
# routes : end
#------------------------------
use strict;
use warnings;
use Mojo::Base 'Mojolicious::Controller';
use Locale::gettext;
use SrvMngr::I18N;
use SrvMngr qw(theme_list init_session);
use 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";
# Get some basic info on the current SME install
our $sysconfig = $cdb->get('sysconfig');
our $systemmode = $cdb->get('SystemMode')->value;
our $sysconfig = $cdb->get('sysconfig');
our $systemmode = $cdb->get('SystemMode')->value;
our $previoussystemmode = $sysconfig->prop('PreviousSystemMode');
our $releaseversion = $sysconfig->prop('ReleaseVersion');
our $releaseversion = $sysconfig->prop('ReleaseVersion');
# Prepare some filehandles for templates and reports
our $templatefile = '/tmp/bugreport_template.txt';
our $templatefile = '/tmp/bugreport_template.txt';
our $configreportfile = '/tmp/configreport.txt';
sub main {
my $c = shift;
$c->app->log->info($c->log_req);
my %bugr_datas = ();
my $title = $c->l('bugr_FORM_TITLE');
my $modul = $c->render_to_string( inline => $c->l('bugr_DESCRIPTION'));
my $title = $c->l('bugr_FORM_TITLE');
my $modul = $c->render_to_string(inline => $c->l('bugr_DESCRIPTION'));
$bugr_datas{'trt'} = 'SHOW';
$c->stash(title => $title, modul => $modul, bugr_datas => \%bugr_datas);
$c->render(template => 'bugreport');
};
} ## end sub main
sub do_report {
my $c = shift;
$c->app->log->info($c->log_req);
my $title = $c->l('bugr_FORM_TITLE');
my $trt = $c->param('trt') || 'SHOW';
my $title = $c->l('bugr_FORM_TITLE');
my $trt = $c->param('trt') || 'SHOW';
my %bugr_datas = ();
$bugr_datas{'trt'} = $trt;
if ( $trt eq 'SHOW' ) {
create_configuration_report();
if ($trt eq 'SHOW') {
create_configuration_report();
my $out = $c->render_to_string(inline => show_config_report());
$bugr_datas{'trt'} = 'DOWN';
$c->stash(title => $title, modul => $out, bugr_datas => \%bugr_datas);
$c->render(template => 'bugreport2');
} ## end if ($trt eq 'SHOW')
$bugr_datas{'trt'} = 'DOWN';
$c->stash(title => $title, modul => $out, bugr_datas => \%bugr_datas);
$c->render(template => 'bugreport2');
}
if ( $trt eq 'DOWN' ) {
my $modul = 'Bug report download';
# $c->render_file(
# 'filepath' => "$configreportfile",
# 'format' => 'x-download',
# 'content_disposition' => 'attachment',
# 'cleanup' => 1,
# );
# the following in this sub will not be used !!!
# $bugr_datas{'trt'} = 'DOWN';
# $c->stash(title => $title, modul => $modul, bugr_datas => \%bugr_datas);
# $c->render(template => 'bugreport');
}
};
if ($trt eq 'DOWN') {
my $modul = 'Bug report download';
# $c->render_file(
# 'filepath' => "$configreportfile",
# 'format' => 'x-download',
# 'content_disposition' => 'attachment',
# 'cleanup' => 1,
# );
# the following in this sub will not be used !!!
# $bugr_datas{'trt'} = 'DOWN';
# $c->stash(title => $title, modul => $modul, bugr_datas => \%bugr_datas);
# $c->render(template => 'bugreport');
} ## end if ($trt eq 'DOWN')
} ## end sub do_report
sub create_configuration_report {
my $c = shift;
# TBD: possibly check $q for a boolean value eg. from a checkbox
# indicating the user has read privacy warning etc.
# create the reporting template
my $configreport_template = Text::Template->new(TYPE => 'FILE', SOURCE => '/etc/e-smith/web/common/configuration_report.tmpl', UNTAINT => 1);
my $configreport_template = Text::Template->new(
TYPE => 'FILE',
SOURCE => '/etc/e-smith/web/common/configuration_report.tmpl',
UNTAINT => 1
);
my $report_creation_time = gen_locale_date_string;
# curent kernel
my $curkernel = `uname -r`;
# get additional RPMs
my @newrpms = `/sbin/e-smith/audittools/newrpms`;
# get additional Repositories
my @repositories = `/sbin/e-smith/audittools/repositories`;
#print @repositories;
#print @repositories;
# get templates
my @templates = `/sbin/e-smith/audittools/templates`;
# get events
my @events = `/sbin/e-smith/audittools/events`;
# set template variables
my %vars = (report_creation_time => \$report_creation_time,
releaseversion => \$releaseversion,
curkernel => \$curkernel,
systemmode => \$systemmode,
previoussystemmode => \$previoussystemmode,
newrpms => \@newrpms,
templates => \@templates,
events => \@events,
repositories => \@repositories,
);
my %vars = (
report_creation_time => \$report_creation_time,
releaseversion => \$releaseversion,
curkernel => \$curkernel,
systemmode => \$systemmode,
previoussystemmode => \$previoussystemmode,
newrpms => \@newrpms,
templates => \@templates,
events => \@events,
repositories => \@repositories,
);
# prcess template
my $result = $configreport_template->fill_in(HASH => \%vars);
# write processed template to file
open (my $cfgrep, '>', $configreportfile) or die "Could not create temporary file for config report!";
open(my $cfgrep, '>', $configreportfile) or die "Could not create temporary file for config report!";
print $cfgrep $result;
close $cfgrep;
}
} ## end sub create_configuration_report
sub show_config_report {
my $c = shift;
my $c = shift;
my $out = '';
$out .= sprintf "<PRE>";
open (my $cfgrep, '<', $configreportfile) or die "Could not find temporary config report file!";
open(my $cfgrep, '<', $configreportfile) or die "Could not find temporary config report file!";
while (<$cfgrep>) {
$out .= sprintf("%s", $_);
$out .= sprintf("%s", $_);
}
$out .= sprintf "</PRE>";
return $out;
}
} ## end sub show_config_report
sub download_config_report {
my $c = shift;
$c->render_file(
'filepath' => "$configreportfile",
'format' => 'x-download',
'content_disposition' => 'attachment',
'cleanup' => 1,
'filepath' => "$configreportfile",
'format' => 'x-download',
'content_disposition' => 'attachment',
'cleanup' => 1,
);
}
} ## end sub download_config_report
1;

View File

@@ -7,107 +7,84 @@ package SrvMngr::Controller::Clamav;
#
# routes : end
#------------------------------
use strict;
use warnings;
use Mojo::Base 'Mojolicious::Controller';
use Locale::gettext;
use SrvMngr::I18N;
use SrvMngr qw(theme_list init_session);
#package esmith::FormMagick::Panel::clamav;
our $db = esmith::ConfigDB->open() || die "Couldn't open config db";
sub main {
my $c = shift;
$c->app->log->info($c->log_req);
my %clm_datas = ();
my $title = $c->l('clm_FORM_TITLE');
my $modul = $c->render_to_string(inline => $c->l('clm_DESC_FILESYSTEM_SCAN_PERIOD'));
$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();
$c->stash( title => $title, modul => $modul, clm_datas => \%clm_datas );
my $title = $c->l('clm_FORM_TITLE');
my $modul = $c->render_to_string(inline => $c->l('clm_DESC_FILESYSTEM_SCAN_PERIOD'));
$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();
$c->stash(title => $title, modul => $modul, clm_datas => \%clm_datas);
$c->render(template => 'clamav');
};
} ## end sub main
sub do_update {
my $c = shift;
$c->app->log->info($c->log_req);
my $http_clamav_status = $c->param('http_clamav_status') || 'disabled';
my $smtp_clamav_status = $c->param('smtp_clamav_status') || '';
my $result = "";
my $result = "";
$c->change_settings();
# Update the system
system("/sbin/e-smith/signal-event clamav-update") == 0
or $result = $c->l('clm_ERROR_UPDATING_CONFIGURATION');
if ( ! $result ) {
$result = $c->l('clm_SUCCESS') ;
$c->flash( success => $result );
if (!$result) {
$result = $c->l('clm_SUCCESS');
$c->flash(success => $result);
} else {
$c->flash( error => $result );
$c->flash(error => $result);
}
$c->redirect_to('/clamav');
};
} ## end sub do_update
sub change_settings {
my $c = shift;
my $status = $c->param('status');
my $FilesystemScan = ( $c->param('FilesystemScan') || 'disabled' );
my $Quarantine = ( $c->param('Quarantine') || 'disabled' );
my $DatabaseMirror = ( $c->param('DatabaseMirror') || 'db.us.clamav.net' );
my $UpdateOfficeHrs = ( $c->param('UpdateOfficeHrs') || 'disabled' );
my $UpdateNonOfficeHrs = ( $c->param('UpdateNonOfficeHrs') || 'disabled' );
my $UpdateWeekend = ( $c->param('UpdateWeekend') || 'disabled' );
my $HTTPProxyServer = ( $c->param('HTTPProxyServer') || '' );
my $HTTPProxyPort = ( $c->param('HTTPProxyPort') || '' );
my $HTTPProxyUsername = ( $c->param('HTTPProxyUsername') || '' );
my $HTTPProxyPassword = ( $c->param('HTTPProxyPassword') || '' );
my $clamav = $db->get('clamav') || $db->new_record('clamav', {type=>'service'});
my $c = shift;
my $status = $c->param('status');
my $FilesystemScan = ($c->param('FilesystemScan') || 'disabled');
my $Quarantine = ($c->param('Quarantine') || 'disabled');
my $DatabaseMirror = ($c->param('DatabaseMirror') || 'db.us.clamav.net');
my $UpdateOfficeHrs = ($c->param('UpdateOfficeHrs') || 'disabled');
my $UpdateNonOfficeHrs = ($c->param('UpdateNonOfficeHrs') || 'disabled');
my $UpdateWeekend = ($c->param('UpdateWeekend') || 'disabled');
my $HTTPProxyServer = ($c->param('HTTPProxyServer') || '');
my $HTTPProxyPort = ($c->param('HTTPProxyPort') || '');
my $HTTPProxyUsername = ($c->param('HTTPProxyUsername') || '');
my $HTTPProxyPassword = ($c->param('HTTPProxyPassword') || '');
my $clamav = $db->get('clamav') || $db->new_record('clamav', { type => 'service' });
$status ||= $clamav->prop('status');
$clamav->merge_props(
status => $status,
FilesystemScan => $FilesystemScan,
Quarantine => $Quarantine,
DatabaseMirror => $DatabaseMirror,
UpdateOfficeHrs => $UpdateOfficeHrs,
UpdateNonOfficeHrs => $UpdateNonOfficeHrs,
UpdateWeekend => $UpdateWeekend,
HTTPProxyServer => $HTTPProxyServer,
HTTPProxyPort => $HTTPProxyPort,
HTTPProxyUsername => $HTTPProxyUsername,
HTTPProxyPassword => $HTTPProxyPassword,
);
status => $status,
FilesystemScan => $FilesystemScan,
Quarantine => $Quarantine,
DatabaseMirror => $DatabaseMirror,
UpdateOfficeHrs => $UpdateOfficeHrs,
UpdateNonOfficeHrs => $UpdateNonOfficeHrs,
UpdateWeekend => $UpdateWeekend,
HTTPProxyServer => $HTTPProxyServer,
HTTPProxyPort => $HTTPProxyPort,
HTTPProxyUsername => $HTTPProxyUsername,
HTTPProxyPassword => $HTTPProxyPassword,
);
} ## end sub change_settings
}
sub get_clam_versions
{
sub get_clam_versions {
my $version = `/usr/bin/freshclam -V`;
chomp $version;
$version =~ s/^ClamAV //;
return $version;
}
} ## end sub get_clam_versions
1;

View File

@@ -4,191 +4,162 @@ package SrvMngr::Controller::Datetime;
# heading : System
# description : Date and time
# navigation : 4000 400
# routes : end
#------------------------------
use strict;
use warnings;
use Mojo::Base 'Mojolicious::Controller';
use Locale::gettext;
use SrvMngr::I18N;
use SrvMngr qw(theme_list init_session);
use esmith::FormMagick;
use esmith::util;
our $cdb = esmith::ConfigDB->open() || die "Couldn't open config db";
sub main {
my $c = shift;
$c->app->log->info($c->log_req);
my %dat_datas = ();
my $title = $c->l('dat_FORM_TITLE');
my $modul = $c->l('dat_INITIAL_DESC');
my $title = $c->l('dat_FORM_TITLE');
my $modul = $c->l('dat_INITIAL_DESC');
$dat_datas{ntpstatus} = 'disabled';
my $rec = $cdb->get('ntpd');
if ($rec) {
$dat_datas{'ntpserver'} = $rec->prop('NTPServer') || '';
if ( $rec->prop('status') eq 'enabled' ) {
$dat_datas{ntpstatus} = 'enabled'
unless ($rec->prop('SyncToHWClockSupported') || 'yes') eq 'yes' and $dat_datas{ntpserver} =~ m#^\s*$#;
}
}
($dat_datas{weekday}, $dat_datas{monthname},
$dat_datas{month}, $dat_datas{day}, $dat_datas{year},
$dat_datas{hour}, $dat_datas{minute}, $dat_datas{second},
$dat_datas{ampm}) = split /\|/,
`/bin/date '+%A|%B|%-m|%-d|%Y|%-I|%M|%S|%p'`;
if ($rec->prop('status') eq 'enabled') {
$dat_datas{ntpstatus} = 'enabled'
unless ($rec->prop('SyncToHWClockSupported') || 'yes') eq 'yes' and $dat_datas{ntpserver} =~ m#^\s*$#;
}
} ## end if ($rec)
( $dat_datas{weekday}, $dat_datas{monthname}, $dat_datas{month}, $dat_datas{day}, $dat_datas{year},
$dat_datas{hour}, $dat_datas{minute}, $dat_datas{second}, $dat_datas{ampm}
)
= split /\|/,
`/bin/date '+%A|%B|%-m|%-d|%Y|%-I|%M|%S|%p'`;
# get rid of trailing carriage return on last field
chop ($dat_datas{ampm});
chop($dat_datas{ampm});
$dat_datas{'now_string'} = esmith::FormMagick->gen_locale_date_string();
$c->stash( title => $title, modul => $modul, dat_datas => \%dat_datas );
$c->stash(title => $title, modul => $modul, dat_datas => \%dat_datas);
$c->render('datetime');
};
} ## end sub main
sub do_update {
my $c = shift;
my $c = shift;
my %dat_datas = ();
my $title = $c->l('dat_FORM_TITLE');
my $modul = $c->l('dat_INITIAL_DESC');
my $title = $c->l('dat_FORM_TITLE');
my $modul = $c->l('dat_INITIAL_DESC');
my $result;
my $success;
my $old_ntpstatus = $c->param('Old_ntpstatus');
$dat_datas{ntpstatus} = $c->param('Ntpstatus');
if ($dat_datas{ntpstatus} ne $old_ntpstatus) {
if ($dat_datas{ntpstatus} eq 'disabled') {
( $dat_datas{weekday}, $dat_datas{monthname}, $dat_datas{month},
$dat_datas{day}, $dat_datas{year}, $dat_datas{hour},
$dat_datas{minute}, $dat_datas{second}, $dat_datas{ampm}
)
= split /\|/,
`/bin/date '+%A|%B|%-m|%-d|%Y|%-I|%M|%S|%p'`;
if ( $dat_datas{ntpstatus} ne $old_ntpstatus) {
# get rid of trailing carriage return on last field
chop($dat_datas{ampm});
} else {
$dat_datas{ntpserver} = ($cdb->get_prop('ntpd', 'NTPServer')) || '';
}
$dat_datas{now_string} = esmith::FormMagick->gen_locale_date_string();
$c->stash(title => $title, modul => $modul, dat_datas => \%dat_datas);
return $c->render('datetime');
} ## end if ($dat_datas{ntpstatus...})
if ( $dat_datas{ntpstatus} eq 'disabled' ) {
($dat_datas{weekday},
$dat_datas{monthname},
$dat_datas{month},
$dat_datas{day},
$dat_datas{year},
$dat_datas{hour},
$dat_datas{minute},
$dat_datas{second},
$dat_datas{ampm}) = split /\|/,
`/bin/date '+%A|%B|%-m|%-d|%Y|%-I|%M|%S|%p'`;
# get rid of trailing carriage return on last field
chop ($dat_datas{ampm});
} else {
$dat_datas{ntpserver} = ($cdb->get_prop('ntpd','NTPServer')) || '';
}
$dat_datas{now_string} = esmith::FormMagick->gen_locale_date_string();
$c->stash( title => $title, modul => $modul, dat_datas => \%dat_datas );
return $c->render('datetime');
}
if ( $dat_datas{ntpstatus} eq 'enabled' ) {
# update ntpserver
if ($dat_datas{ntpstatus} eq 'enabled') {
# update ntpserver
$dat_datas{ntpserver} = $c->param('Ntpserver') || '';
if ( $dat_datas{ntpserver} eq "pool.ntp.org" ) {
if ($dat_datas{ntpserver} eq "pool.ntp.org") {
$result .= $c->l('dat_INVALID_NTP_ADDR');
} elsif ( $dat_datas{ntpserver} =~ /^([a-zA-Z0-9\.\-]+)$/ ) {
} elsif ($dat_datas{ntpserver} =~ /^([a-zA-Z0-9\.\-]+)$/) {
$dat_datas{ntpserver} = $1;
# } elsif ( $dat_datas{ntpserver} =~ /^\s*$/ ) {
# $dat_datas{ntpserver} = "";
# } elsif ( $dat_datas{ntpserver} =~ /^\s*$/ ) {
# $dat_datas{ntpserver} = "";
} else {
$result .= $c->l('dat_INVALID_NTP_ADDR');
}
if ( ! $result ) {
$success = update_ntpserver( $c, $dat_datas{ntpserver} );
}
if (!$result) {
$success = update_ntpserver($c, $dat_datas{ntpserver});
}
} else {
# set Locale time & clean ntpserver
# set Locale time & clean ntpserver
#my $servername = ($c->param('ServerName') || 'WS');
if (!$result) {
$result = validate_change_datetime($c);
#my $servername = ($c->param('ServerName') || 'WS');
if ( ! $result ) {
$result = validate_change_datetime( $c );
if ( $result eq 'OK' ) {
$success = $c->l('dat_UPDATING_CLOCK');
$result = '';
disable_ntp();
$success .= '<br>'. $c->l('dat_SERVER_DISABLED_DESC');
}
}
}
if ($result eq 'OK') {
$success = $c->l('dat_UPDATING_CLOCK');
$result = '';
disable_ntp();
$success .= '<br>' . $c->l('dat_SERVER_DISABLED_DESC');
} ## end if ($result eq 'OK')
} ## end if (!$result)
} ## end else [ if ($dat_datas{ntpstatus...})]
if ($result) {
$c->stash(error => $result);
$c->stash(title => $title, modul => $modul, dat_datas => \%dat_datas);
return $c->render('datetime');
} ## end if ($result)
if ( $result ) {
$c->stash( error => $result );
$c->stash( title => $title, modul => $modul, dat_datas => \%dat_datas );
return $c->render('datetime');
}
#$result = $c->l('dat_SUCCESS');
my $message = "'Datetime' update DONE";
$c->app->log->info($message);
$c->flash( success => $success );
$c->flash(success => $success);
$c->redirect_to('/datetime');
};
} ## end sub do_update
sub validate_change_datetime {
my $c = shift;
#--------------------------------------------------
# Untaint parameters and check for validity
#--------------------------------------------------
my $timezone = $c->param('Timezone');
my $timezone = $c->param ('Timezone');
if ($timezone =~ /^([\w\-]+\/?[\w\-+]*)$/) {
$timezone = $1;
} else {
$timezone = "US/Eastern";
}
my $month = $c->param ('Month');
my $month = $c->param('Month');
if ($month =~ /^(\d{1,2})$/) {
$month = $1;
} else {
$month = "1";
}
if (($month < 1) || ($month > 12)) {
return $c->l('dat_INVALID_MONTH')." $month. ". $c->l('dat_MONTH_BETWEEN_1_AND_12');
}
my $day = $c->param ('Day');
if (($month < 1) || ($month > 12)) {
return $c->l('dat_INVALID_MONTH') . " $month. " . $c->l('dat_MONTH_BETWEEN_1_AND_12');
}
my $day = $c->param('Day');
if ($day =~ /^(\d{1,2})$/) {
$day = $1;
} else {
$day = "1";
}
if (($day < 1) || ($day > 31)) {
return $c->l('dat_INVALID_DAY')." $day. ". $c->l('dat_BETWEEN_1_AND_31');
}
my $year = $c->param ('Year');
if (($day < 1) || ($day > 31)) {
return $c->l('dat_INVALID_DAY') . " $day. " . $c->l('dat_BETWEEN_1_AND_31');
}
my $year = $c->param('Year');
if ($year =~ /^(\d{4})$/) {
$year = $1;
} else {
@@ -196,20 +167,21 @@ sub validate_change_datetime {
}
if (($year < 1900) || ($year > 2200)) {
return $c->l('dat_INVALID_YEAR')." $year. ". $c->l('dat_FOUR_DIGIT_YEAR');
return $c->l('dat_INVALID_YEAR') . " $year. " . $c->l('dat_FOUR_DIGIT_YEAR');
}
my $hour = $c->param('Hour');
my $hour = $c->param ('Hour');
if ($hour =~ /^(\d{1,2})$/) {
$hour = $1;
} else {
$hour = "12";
}
if (($hour < 1) || ($hour > 12)) {
return $c->l('dat_INVALID_HOUR')." $hour. ". $c->l('dat_BETWEEN_1_AND_12');
}
my $minute = $c->param ('Minute');
if (($hour < 1) || ($hour > 12)) {
return $c->l('dat_INVALID_HOUR') . " $hour. " . $c->l('dat_BETWEEN_1_AND_12');
}
my $minute = $c->param('Minute');
if ($minute =~ /^(\d{1,2})$/) {
$minute = $1;
} else {
@@ -217,10 +189,10 @@ sub validate_change_datetime {
}
if (($minute < 0) || ($minute > 59)) {
return $c->l('datINVALID_MINUTE')." $minute. ".$c->l('dat_BETWEEN_0_AND_59');
return $c->l('datINVALID_MINUTE') . " $minute. " . $c->l('dat_BETWEEN_0_AND_59');
}
my $second = $c->param ('Second');
my $second = $c->param('Second');
if ($second =~ /^(\d{1,2})$/) {
$second = $1;
} else {
@@ -228,10 +200,10 @@ sub validate_change_datetime {
}
if (($second < 0) || ($second > 59)) {
return $c->l('dat_INVALID_SECOND')." $second. ". $c->l('dat_BETWEEN_0_AND_59');
return $c->l('dat_INVALID_SECOND') . " $second. " . $c->l('dat_BETWEEN_0_AND_59');
}
my $ampm = $c->param('Ampm');
my $ampm = $c->param ('Ampm');
if ($ampm =~ /^(AM|PM)$/) {
$ampm = $1;
} else {
@@ -239,8 +211,8 @@ sub validate_change_datetime {
}
# convert to 24 hour time
$hour = $hour % 12;
if ($ampm eq "PM") {
$hour = $hour + 12;
}
@@ -248,12 +220,12 @@ 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 = $conf->get('UnsavedChanges')->value;
my $rec = $conf->get('TimeZone');
unless ($rec) {
$rec = $conf->new_record('TimeZone',undef);
$rec = $conf->new_record('TimeZone', undef);
}
$rec->set_value($timezone);
$conf->get('UnsavedChanges')->set_value($old);
@@ -262,71 +234,56 @@ sub validate_change_datetime {
# Signal event to change time zone, system time
# and hardware clock
#--------------------------------------------------
my $newdate = sprintf "%02d%02d%02d%02d%04d.%02d",
$month, $day, $hour, $minute, $year, $second;
esmith::util::backgroundCommand(2,
"/sbin/e-smith/signal-event","timezone-update",$newdate);
my $newdate = sprintf "%02d%02d%02d%02d%04d.%02d", $month, $day, $hour, $minute, $year, $second;
esmith::util::backgroundCommand(2, "/sbin/e-smith/signal-event", "timezone-update", $newdate);
return 'OK';
}
} ## end sub validate_change_datetime
sub update_ntpserver {
my $c = shift;
my $c = shift;
my $ntpserver = shift;
my $msg;
#------------------------------------------------------------
# Looks good; go ahead and change the parameters.
#------------------------------------------------------------
#------------------------------------------------------------
# Looks good; go ahead and change the parameters.
#------------------------------------------------------------
my $old = $cdb->get('UnsavedChanges')->value;
my $rec = $cdb->get('ntpd');
if ($rec) {
$rec->set_prop('status','enabled');
$rec->set_prop('NTPServer',$ntpserver);
$rec->set_prop('status', 'enabled');
$rec->set_prop('NTPServer', $ntpserver);
} else {
$rec = $cdb->new_record( 'ntpd',
{ type=>'service', status=>'enabled', SyncToHWClockSupported => 'yes', NTPServer=>$ntpserver } );
$rec = $cdb->new_record('ntpd',
{ type => 'service', status => 'enabled', SyncToHWClockSupported => 'yes', NTPServer => $ntpserver });
}
$cdb->get('UnsavedChanges')->set_value($old);
$msg = $c->l('dat_SETTINGS_CHANGED');
if ( $ntpserver =~ /^\s*$/ ) {
if ($ntpserver =~ /^\s*$/) {
$rec->set_prop('status', ($rec->prop('SyncToHWClockSupported') || 'yes') eq 'yes' ? 'enabled' : 'disabled');
$rec->set_prop('NTPServer', '');
$msg = $c->l('dat_INVALID_NTP_SERVER') if ($rec->prop('SyncToHWClockSupported') || 'yes') ne 'yes';
}
esmith::util::backgroundCommand( 2, "/sbin/e-smith/signal-event", "timeserver-update" );
} ## end if ($ntpserver =~ /^\s*$/)
esmith::util::backgroundCommand(2, "/sbin/e-smith/signal-event", "timeserver-update");
return $msg;
}
} ## end sub update_ntpserver
sub disable_ntp {
# make sure that the parameters are set for disabled
my $old = $cdb->get('UnsavedChanges')->value;
my $rec = $cdb->get('ntpd');
if ($rec) {
$rec->set_prop('status', ($rec->prop('SyncToHWClockSupported') || 'yes') eq 'yes' ? 'enabled' : 'disabled');
$rec->set_prop('NTPServer','');
$rec->set_prop('NTPServer', '');
} else {
$rec = $cdb->new_record('ntpd',
{type=>'service', status=>'enabled', SyncToHWClockSupported => 'yes', NTPServer=>''});
$rec = $cdb->new_record('ntpd',
{ type => 'service', status => 'enabled', SyncToHWClockSupported => 'yes', NTPServer => '' });
}
$cdb->get('UnsavedChanges')->set_value($old);
}
} ## end sub disable_ntp
sub getTimezone {
@@ -336,69 +293,64 @@ sub getTimezone {
# If that is not defined, try and get it from /etc/localtime.
# If that doesn't work, default to US/Eastern.
#--------------------------------------------------
my $localtime;
my $timezonedefault = "US/Eastern";
if (defined $cdb->get('TimeZone')) {
$timezonedefault = $cdb->get('TimeZone')->value;
$timezonedefault = $cdb->get('TimeZone')->value;
} else {
if (defined ($localtime = readlink '/etc/localtime')) {
my $pos = index $localtime, 'zoneinfo/';
if ( $pos > -1 ) {
$timezonedefault = substr $localtime, ($pos + 9);
}
}
}
return $timezonedefault;
}
if (defined($localtime = readlink '/etc/localtime')) {
my $pos = index $localtime, 'zoneinfo/';
if ($pos > -1) {
$timezonedefault = substr $localtime, ($pos + 9);
}
} ## end if (defined($localtime...))
} ## end else [ if (defined $cdb->get(...))]
return $timezonedefault;
} ## end sub getTimezone
sub getZone_list {
my $c = shift;
#--------------------------------------------------
# Get a sorted list of time zones
#--------------------------------------------------
$ENV{BASH_ENV} = '';
if (! open (ZONES, "cd /usr/share/zoneinfo; /usr/bin/find . -type f -or -type l | /bin/grep '^./[A-Z]' |"))
{
warn ( $c->l('COULD_NOT_OPEN_TZ_FILE').$!.'.' );
if (!open(ZONES, "cd /usr/share/zoneinfo; /usr/bin/find . -type f -or -type l | /bin/grep '^./[A-Z]' |")) {
warn($c->l('COULD_NOT_OPEN_TZ_FILE') . $! . '.');
return undef;
}
my $zone;
my $zone;
my @zones = ();
while (defined ($zone = <ZONES>))
{
chop ($zone);
while (defined($zone = <ZONES>)) {
chop($zone);
$zone =~ s/^.\///;
push @zones, $zone;
}
} ## end while (defined($zone = <ZONES>...))
close ZONES;
my @zt = sort @zones;
return \@zt;
}
} ## end sub getZone_list
sub getMonth_list {
my $c = shift;
return [[ $c->l('dat_JANUARY') => '1'],
[ $c->l('dat_FEBRUARY') => '2'],
[ $c->l('dat_MARCH') => '3'],
[ $c->l('dat_APRIL') => '4'],
[ $c->l('dat_MAY') => '5'],
[ $c->l('dat_JUNE') => '6'],
[ $c->l('dat_JULY') => '7'],
[ $c->l('dat_AUGUST') => '8'],
[ $c->l('dat_SEPTEMBER') => '9'],
[ $c->l('dat_OCTOBER') => '10'],
[ $c->l('dat_NOVEMBER') => '11'],
[ $c->l('dat_DECEMBER') => '12']];
}
return [
[ $c->l('dat_JANUARY') => '1' ],
[ $c->l('dat_FEBRUARY') => '2' ],
[ $c->l('dat_MARCH') => '3' ],
[ $c->l('dat_APRIL') => '4' ],
[ $c->l('dat_MAY') => '5' ],
[ $c->l('dat_JUNE') => '6' ],
[ $c->l('dat_JULY') => '7' ],
[ $c->l('dat_AUGUST') => '8' ],
[ $c->l('dat_SEPTEMBER') => '9' ],
[ $c->l('dat_OCTOBER') => '10' ],
[ $c->l('dat_NOVEMBER') => '11' ],
[ $c->l('dat_DECEMBER') => '12' ]
];
} ## end sub getMonth_list
1;

View File

@@ -7,91 +7,72 @@ package SrvMngr::Controller::Directory;
#
# routes : end
#----------------------------------------------------------------------
use strict;
use warnings;
use Mojo::Base 'Mojolicious::Controller';
use Locale::gettext;
use SrvMngr::I18N;
use SrvMngr qw(theme_list init_session);
#use esmith::util qw(ldapBase);
use esmith::FormMagick::Panel::directory;
our $db = esmith::ConfigDB->open() || die "Couldn't open config db";
sub main {
my $c = shift;
$c->app->log->info($c->log_req);
my %dir_datas = ();
my $title = $c->l('dir_FORM_TITLE');
my $modul = $c->render_to_string(inline => $c->l('dir_DESCRIPTION'));
$dir_datas{'root'} = get_ldap_base();
$dir_datas{'access'} = ($db->get_prop('ldap','access')) || 'private';
$dir_datas{'department'} = ($db->get_prop('ldap','defaultDepartment')) || '';
$dir_datas{'company'} = ($db->get_prop('ldap','defaultCompany')) || '';
$dir_datas{'street'} = ($db->get_prop('ldap','defaultStreet')) || '';
$dir_datas{'city'} = ($db->get_prop('ldap','defaultCity')) || '';
$dir_datas{'phonenumber'} = ($db->get_prop('ldap','defaultPhoneNumber')) || '';
$c->stash( title => $title, modul => $modul, dir_datas => \%dir_datas );
my $title = $c->l('dir_FORM_TITLE');
my $modul = $c->render_to_string(inline => $c->l('dir_DESCRIPTION'));
$dir_datas{'root'} = get_ldap_base();
$dir_datas{'access'} = ($db->get_prop('ldap', 'access')) || 'private';
$dir_datas{'department'} = ($db->get_prop('ldap', 'defaultDepartment')) || '';
$dir_datas{'company'} = ($db->get_prop('ldap', 'defaultCompany')) || '';
$dir_datas{'street'} = ($db->get_prop('ldap', 'defaultStreet')) || '';
$dir_datas{'city'} = ($db->get_prop('ldap', 'defaultCity')) || '';
$dir_datas{'phonenumber'} = ($db->get_prop('ldap', 'defaultPhoneNumber')) || '';
$c->stash(title => $title, modul => $modul, dir_datas => \%dir_datas);
$c->render(template => 'directory');
};
} ## end sub main
sub do_update {
my $c = shift;
$c->app->log->info($c->log_req);
my $access = $c->param('access');
my $department = $c->param('department');
my $company = $c->param('company');
my $street = $c->param('street');
my $city = $c->param('city');
my $access = $c->param('access');
my $department = $c->param('department');
my $company = $c->param('company');
my $street = $c->param('street');
my $city = $c->param('city');
my $phonenumber = $c->param('phonenumber');
my $existing = $c->param('existing');
my $result = "";
$db->get('ldap')->set_prop('access', $access);
$db->get('ldap')->set_prop('defaultDepartment', $department);
$db->get('ldap')->set_prop('defaultCompany', $company);
$db->get('ldap')->set_prop('defaultStreet', $street);
$db->get('ldap')->set_prop('defaultCity', $city);
my $existing = $c->param('existing');
my $result = "";
$db->get('ldap')->set_prop('access', $access);
$db->get('ldap')->set_prop('defaultDepartment', $department);
$db->get('ldap')->set_prop('defaultCompany', $company);
$db->get('ldap')->set_prop('defaultStreet', $street);
$db->get('ldap')->set_prop('defaultCity', $city);
$db->get('ldap')->set_prop('defaultPhoneNumber', $phonenumber);
if ($existing eq 'update') {
my $ac = esmith::AccountsDB->open() || die "Couldn't open accounts db";
my @users = $ac->users();
foreach my $user (@users) {
$user->set_prop('Phone', $phonenumber);
$user->set_prop('Company', $company);
$user->set_prop('Dept', $department);
$user->set_prop('City', $city);
$user->set_prop('Street', $street);
}
}
my $ac = esmith::AccountsDB->open() || die "Couldn't open accounts db";
my @users = $ac->users();
foreach my $user (@users) {
$user->set_prop('Phone', $phonenumber);
$user->set_prop('Company', $company);
$user->set_prop('Dept', $department);
$user->set_prop('City', $city);
$user->set_prop('Street', $street);
} ## end foreach my $user (@users)
} ## end if ($existing eq 'update')
#
# Update the system
#
system ("/sbin/e-smith/signal-event ldap-update") == 0
or $result = $c->l('ERROR_UPDATING_CONFIGURATION');
system("/sbin/e-smith/signal-event ldap-update") == 0
or $result = $c->l('ERROR_UPDATING_CONFIGURATION');
my $title = $c->l('dir_FORM_TITLE');
if ( $result eq '' ) { $result = $c->l('dir_SUCCESS'); }
$c->stash( title => $title, modul => $result );
if ($result eq '') { $result = $c->l('dir_SUCCESS'); }
$c->stash(title => $title, modul => $result);
$c->render(template => 'module');
};
} ## end sub do_update
1;

View File

@@ -10,493 +10,412 @@ package SrvMngr::Controller::Domains;
use strict;
use warnings;
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::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 $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 $REGEXP_DOMAIN = qq([a-zA-Z0-9\-\.]+);
sub main {
my $c = shift;
$c->app->log->info($c->log_req);
my %dom_datas = ();
my $title = $c->l('dom_FORM_TITLE');
my $title = $c->l('dom_FORM_TITLE');
$dom_datas{trt} = 'LST';
my @domains;
for ($ddb->domains())
{
for ($ddb->domains()) {
my $ns = $_->prop('Nameservers') || 'internet';
push @domains,
{ Domain => $_->key, $_->props,
Nameservers => $ns,
}
}
$dom_datas{forwarder} = $cdb->get_prop('dnscache', 'Forwarder');
$dom_datas{forwarder2} = $cdb->get_prop('dnscache', 'Forwarder2') || '';
$c->stash( title => $title, dom_datas => \%dom_datas, domains => \@domains );
push @domains,
{
Domain => $_->key,
$_->props,
Nameservers => $ns,
};
} ## end for ($ddb->domains())
$dom_datas{forwarder} = $cdb->get_prop('dnscache', 'Forwarder');
$dom_datas{forwarder2} = $cdb->get_prop('dnscache', 'Forwarder2') || '';
$c->stash(title => $title, dom_datas => \%dom_datas, domains => \@domains);
$c->render(template => 'domains');
};
} ## end sub main
sub do_display {
my $c = shift;
$c->app->log->info($c->log_req);
my $rt = $c->current_route;
my $trt = $c->param('trt');
my $rt = $c->current_route;
my $trt = $c->param('trt');
my $domain = $c->param('Domain') || '';
#$trt = 'DEL' if ( $rt eq 'domaindel1' );
#$trt = 'UPD' if ( $rt eq 'domainupd1' );
#$trt = 'UP2' if ( $rt eq 'domainup21' );
#$trt = 'ADD' if ( $rt eq 'domainadd1' );
my %dom_datas = ();
my $title = $c->l('dom_FORM_TITLE');
my $result = '';
my $title = $c->l('dom_FORM_TITLE');
my $result = '';
$dom_datas{'trt'} = $trt;
if ( $trt ne 'ADD' and $trt ne 'UPD' and $trt ne 'UP2' and $trt ne 'DEL' ) {
$result = "Trt unknown ( $trt ) !"
}
if ( $trt eq 'ADD' ) {
#nothing
}
if ( $trt eq 'UPD' ) {
my $rec = $ddb->get($domain);
if ( $rec ) {
$dom_datas{domain} = $domain;
$dom_datas{description} = $rec->prop('Description') || '';
$dom_datas{content} = $rec->prop('Content') || '';
$dom_datas{nameservers} = $rec->prop('Nameservers') || 'internet';
} else {
$result = "Domain $domain not found !"
}
}
if ( $trt eq 'UP2' ) {
$dom_datas{forwarder} = $cdb->get_prop('dnscache', 'Forwarder') || '';
$dom_datas{forwarder2} = $cdb->get_prop('dnscache', 'Forwarder2') || '';
}
if ( $trt eq 'DEL' ) {
my $rec = $ddb->get($domain);
if ( $rec ) {
$dom_datas{domain} = $domain;
$dom_datas{description} = $rec->prop('Description') || '';
}
}
if ( $trt eq 'LST' ) {
my @domains;
if ($adb) {
@domains = $ddb->domains();
}
$c->stash( domains => \@domains );
}
if ( ! $result ) {
$c->stash( error => $result );
if ($trt ne 'ADD' and $trt ne 'UPD' and $trt ne 'UP2' and $trt ne 'DEL') {
$result = "Trt unknown ( $trt ) !";
}
$c->stash( title => $title, dom_datas => \%dom_datas );
$c->render( template => 'domains' );
};
if ($trt eq 'ADD') {
#nothing
}
if ($trt eq 'UPD') {
my $rec = $ddb->get($domain);
if ($rec) {
$dom_datas{domain} = $domain;
$dom_datas{description} = $rec->prop('Description') || '';
$dom_datas{content} = $rec->prop('Content') || '';
$dom_datas{nameservers} = $rec->prop('Nameservers') || 'internet';
} else {
$result = "Domain $domain not found !";
}
} ## end if ($trt eq 'UPD')
if ($trt eq 'UP2') {
$dom_datas{forwarder} = $cdb->get_prop('dnscache', 'Forwarder') || '';
$dom_datas{forwarder2} = $cdb->get_prop('dnscache', 'Forwarder2') || '';
}
if ($trt eq 'DEL') {
my $rec = $ddb->get($domain);
if ($rec) {
$dom_datas{domain} = $domain;
$dom_datas{description} = $rec->prop('Description') || '';
}
} ## end if ($trt eq 'DEL')
if ($trt eq 'LST') {
my @domains;
if ($adb) {
@domains = $ddb->domains();
}
$c->stash(domains => \@domains);
} ## end if ($trt eq 'LST')
if (!$result) {
$c->stash(error => $result);
}
$c->stash(title => $title, dom_datas => \%dom_datas);
$c->render(template => 'domains');
} ## end sub do_display
sub do_update {
my $c = shift;
$c->app->log->info($c->log_req);
my $rt = $c->current_route;
my $trt = $c->param('trt');
my $rt = $c->current_route;
my $trt = $c->param('trt');
my %dom_datas = ();
my ($res, $result) = '';
#my $domain = uri_unescape($c->param('domain'));
my $domain = $c->param('Domain');
if ( $trt eq 'ADD' ) {
if ($trt eq 'ADD') {
my $account = $c->param('Account');
# controls (validate ?????)
#? validate_new_domain_name( $c, $domain, $account );
#$result .= $res unless $res eq 'OK';
# controls (validate ?????)
#? validate_new_domain_name( $c, $domain, $account );
#$result .= $res unless $res eq 'OK';
#$result .= ' blocked';
$res = '';
#$result .= ' blocked';
$res = '';
if ( ! $result ) {
$res = $c->create_modify_domain( 'create', $domain );
$result .= $res unless $res eq 'OK';
}
if ( ! $result ) {
$result = $c->l('dom_SUCCESSFULLY_CREATED') . " $domain";
}
}
if (!$result) {
$res = $c->create_modify_domain('create', $domain);
$result .= $res unless $res eq 'OK';
}
if ( $trt eq 'UPD' ) {
if (!$result) {
$result = $c->l('dom_SUCCESSFULLY_CREATED') . " $domain";
}
} ## end if ($trt eq 'ADD')
if ($trt eq 'UPD') {
my $description = $c->param('Description');
my $content = $c->param('Content');
my $content = $c->param('Content');
my $nameservers = $c->param('Nameservers');
# controls
#$res = validate_description( $c, $account );
#$result .= $res unless $res eq 'OK';
# controls
#$res = validate_description( $c, $account );
#$result .= $res unless $res eq 'OK';
#$result .= 'blocked';
$res = '';
#$result .= 'blocked';
if (!$result) {
$res = $c->create_modify_domain('modify', $domain);
$result .= $res unless $res eq 'OK';
}
$res = '';
if ( ! $result ) {
$res = $c->create_modify_domain( 'modify', $domain );
$result .= $res unless $res eq 'OK';
}
if (!$result) {
$result = $c->l('dom_SUCCESSFULLY_MODIFIED') . " $domain";
}
} ## end if ($trt eq 'UPD')
if ( ! $result ) {
$result = $c->l('dom_SUCCESSFULLY_MODIFIED') . " $domain";
}
}
if ( $trt eq 'UP2' ) {
my $forwarder = $c->param('Forwarder');
if ($trt eq 'UP2') {
my $forwarder = $c->param('Forwarder');
my $forwarder2 = $c->param('Forwarder2');
# controls
# controls
$res = $c->ip_number_or_blank($forwarder);
$result .= $res unless $res eq 'OK';
$res = $c->ip_number_or_blank($forwarder2);
$result .= $res unless $res eq 'OK';
$res = $c->ip_number_or_blank( $forwarder );
$result .= $res unless $res eq 'OK';
#$result .= 'blocked';
$res = '';
$res = $c->ip_number_or_blank( $forwarder2 );
$result .= $res unless $res eq 'OK';
#$result .= 'blocked';
$res = '';
if ( ! $result ) {
$res = $c->modify_dns( $forwarder, $forwarder2 );
$result .= $res unless $res eq 'OK';
}
if ( ! $result ) {
$result = $c->l('SUCCESS') . " $forwarder $forwarder2";
}
}
if (!$result) {
$res = $c->modify_dns($forwarder, $forwarder2);
$result .= $res unless $res eq 'OK';
}
if (!$result) {
$result = $c->l('SUCCESS') . " $forwarder $forwarder2";
}
} ## end if ($trt eq 'UP2')
if ( $trt eq 'DEL' ) {
if ($trt eq 'DEL') {
# controls
#$res = validate_is_domain($c, $domain);
#$result .= $res unless $res eq 'OK';
#$result .= 'blocked';
$res = '';
if ( ! $result ) {
$res = $c->delete_domain( $domain );
$result .= $res unless $res eq 'OK';
}
if ( ! $result ) {
$result = $c->l('dom_SUCCESSFULLY_DELETED') . " $domain";
}
}
# controls
#$res = validate_is_domain($c, $domain);
#$result .= $res unless $res eq 'OK';
#$result .= 'blocked';
$res = '';
if (!$result) {
$res = $c->delete_domain($domain);
$result .= $res unless $res eq 'OK';
}
if (!$result) {
$result = $c->l('dom_SUCCESSFULLY_DELETED') . " $domain";
}
} ## end if ($trt eq 'DEL')
# common parts
if ($res ne 'OK') {
my $title = $c->l('dom_FORM_TITLE');
$dom_datas{'domain'} = $domain;
$dom_datas{'trt'} = $trt;
$c->stash( error => $result . "($res)" );
$c->stash( title => $title, dom_datas => \%dom_datas );
return $c->render( 'domains' );
}
my $title = $c->l('dom_FORM_TITLE');
$dom_datas{'domain'} = $domain;
$dom_datas{'trt'} = $trt;
$c->stash(error => $result . "($res)");
$c->stash(title => $title, dom_datas => \%dom_datas);
return $c->render('domains');
} ## end if ($res ne 'OK')
my $message = "'Domains' updates ($trt) DONE";
$c->app->log->info($message);
$c->flash( success => $result );
$c->flash(success => $result);
$c->redirect_to('/domains');
};
} ## end sub do_update
sub create_modify_domain {
my ($c, $action, $domain) = @_;
$domain = $1 if ($domain =~ /^($REGEXP_DOMAIN)$/);
unless ($domain) {
return ($c->l($action eq 'create' ? 'dom_ERROR_CREATING_DOMAIN'
: 'dom_ERROR_MODIFYING_DOMAIN') . ' Ctl');
}
unless ($domain) {
return (
$c->l(
$action eq 'create'
? 'dom_ERROR_CREATING_DOMAIN'
: 'dom_ERROR_MODIFYING_DOMAIN'
)
. ' Ctl'
);
} ## end unless ($domain)
my $rec = $ddb->get($domain);
if ($rec and $action eq 'create') {
return $c->l('dom_DOMAIN_IN_USE_ERROR');
}
if (not $rec and $action eq 'modify') {
return $c->l('dom_NONEXISTENT_DOMAIN_ERROR');
}
$rec ||= $ddb->new_record($domain, { type => 'domain' });
my %props;
$props{$_} = $c->param($_) for ( qw(Content Description Nameservers) );
$props{$_} = $c->param($_) for (qw(Content Description Nameservers));
$rec->merge_props(%props);
if ( system( "/sbin/e-smith/signal-event",
"domain-$action", "$domain" ) != 0 ) {
return ($c->l($action eq 'create' ? 'dom_ERROR_CREATING_DOMAIN'
: 'dom_ERROR_MODIFYING_DOMAIN') . " Exe $action");
}
if (system("/sbin/e-smith/signal-event", "domain-$action", "$domain") != 0) {
return (
$c->l(
$action eq 'create'
? 'dom_ERROR_CREATING_DOMAIN'
: 'dom_ERROR_MODIFYING_DOMAIN'
)
. " Exe $action"
);
} ## end if (system("/sbin/e-smith/signal-event"...))
return 'OK';
}
} ## end sub create_modify_domain
sub delete_domain {
my ($c, $domain) = @_;
$domain = $1 if ($domain =~ /^($REGEXP_DOMAIN)$/);
return ($c->l('dom_ERROR_WHILE_REMOVING_DOMAIN') . ' Ctl') unless ($domain);
my $rec = $ddb->get($domain);
return ($c->l('dom_NONEXISTENT_DOMAIN_ERROR')) if (not $rec);
$rec->set_prop('type', 'domain-deleted');
if (system("/sbin/e-smith/signal-event", "domain-delete", "$domain") != 0) {
return ($c->l('dom_ERROR_WHILE_REMOVING_DOMAIN') . 'Exe');
return ($c->l('dom_ERROR_WHILE_REMOVING_DOMAIN') . 'Exe');
}
$rec->delete;
return 'OK';
}
} ## end sub delete_domain
sub modify_dns {
my ($c, $forwarder, $forwarder2) = @_;
my $dnscache = $cdb->get('dnscache');
($forwarder, $forwarder2) = ($forwarder2, '')
if ($forwarder2 and not $forwarder);
if ($forwarder) {
$dnscache->set_prop('Forwarder', $forwarder);
$dnscache->set_prop('Forwarder', $forwarder);
} else {
$dnscache->delete_prop('Forwarder');
}
if ($forwarder2) {
$dnscache->set_prop('Forwarder2', $forwarder2);
} else {
$dnscache->delete_prop('Forwarder2');
$dnscache->delete_prop('Forwarder');
}
unless ( system( "/sbin/e-smith/signal-event", "dns-update" ) == 0 )
{
if ($forwarder2) {
$dnscache->set_prop('Forwarder2', $forwarder2);
} else {
$dnscache->delete_prop('Forwarder2');
}
unless (system("/sbin/e-smith/signal-event", "dns-update") == 0) {
return $c->l('dom_ERROR_UPDATING');
}
return 'OK';
}
} ## end sub modify_dns
sub existing_accounts_list {
my $c = shift;
my @existingAccounts = ( ['Administrator' => 'admin']);
my @existingAccounts = ([ 'Administrator' => 'admin' ]);
foreach my $a ($adb->get_all) {
if ($a->prop('type') =~ /(user|group)/) {
push @existingAccounts, [ $a->key => $a->key ];
}
if ($a->prop('type') eq "domain") {
my $target = $adb->get($a->prop('Account'));
unless ($target)
{
warn "WARNING: domain (" . $a->key . ") => missing Account("
. $a->prop('Account') . ")\n";
unless ($target) {
warn "WARNING: domain (" . $a->key . ") => missing Account(" . $a->prop('Account') . ")\n";
next;
}
push @existingAccounts, [ $a->key, $a->key ]
unless ($target->prop('type') eq "domain");
}
}
return(\@existingAccounts);
}
} ## end if ($a->prop('type') eq...)
} ## end foreach my $a ($adb->get_all)
return (\@existingAccounts);
} ## end sub existing_accounts_list
sub content_options_list {
my $c = shift;
my @options = ( [ $c->l('dom_PRIMARY_SITE') => 'Primary' ]);
my @options = ([ $c->l('dom_PRIMARY_SITE') => 'Primary' ]);
foreach ($adb->ibays) {
push @options, [ $_->prop('Name') => $_->key ]
if ($_->key ne 'Primary');
push @options, [ $_->prop('Name') => $_->key ]
if ($_->key ne 'Primary');
}
return \@options;
} ## end sub content_options_list
return \@options
}
sub get_content_value
{
my $c = shift;
sub get_content_value {
my $c = shift;
my $domain = shift;
return $domain ? $ddb->get_prop($domain, 'Content') : 'Primary';
}
} ## end sub get_content_value
sub get_description_value
{
sub get_description_value {
my $c = shift;
my $domain = $c->param('Domain') || undef;
return $ddb->get_prop($domain, 'Description');
}
} ## end sub get_description_value
sub nameserver_options_list {
my $c = shift;
my $c = shift;
my $domain = $c->param('Domain') || undef;
my @opts = qw(localhost internet);
my @opts = qw(localhost internet);
push @opts, 'corporate' if ($cdb->get_prop('dnscache', 'Forwarder'));
my $ns = ($ddb->get_prop($domain, 'Nameservers') || 'internet');
push @opts, $ns unless scalar grep { /^$ns$/ } @opts;
push @opts, $ns unless scalar grep {/^$ns$/} @opts;
my @options;
foreach (@opts) {
push @options, [ $c->l( "dom_$_" ) => $_ ];
push @options, [ $c->l("dom_$_") => $_ ];
}
return \@options;
}
} ## end sub nameserver_options_list
sub get_nameserver_value {
my $c = shift;
my $domain = $c->param('Domain') || undef;
return ($ddb->get_prop($domain, 'Nameservers') || 'internet');
}
} ## end sub get_nameserver_value
sub validate_Domain
{
my $c = shift;
sub validate_Domain {
my $c = shift;
my $domain = lc shift;
return ($domain =~ /^($REGEXP_DOMAIN)$/)
? 'OK'
: 'DOMAIN_NAME_VALIDATION_ERROR';
} ## end sub validate_Domain
return ($domain =~ /^($REGEXP_DOMAIN)$/) ? 'OK' :
'DOMAIN_NAME_VALIDATION_ERROR';
}
sub validate_Description {
sub validate_Description
{
# XXX - FIXME - NOTREACHED
# We used to use the Description in the Appletalk volume name
# which meant it needed validation. I don't see any reason to
# do this any more
my $c = shift;
my $c = shift;
my $description = shift;
return ($description =~ /^([\-\'\w][\-\'\w\s\.]*)$/) ? 'OK' :
'DOMAIN_DESCRIPTION_VALIDATION_ERROR';
}
return ($description =~ /^([\-\'\w][\-\'\w\s\.]*)$/)
? 'OK'
: 'DOMAIN_DESCRIPTION_VALIDATION_ERROR';
} ## end sub validate_Description
sub ip_number_or_blank {
# XXX - FIXME - we should push this down into CGI::FormMagick
my $c = shift;
my $c = shift;
my $ip = shift;
if (!defined($ip) || $ip eq "")
{
if (!defined($ip) || $ip eq "") {
return 'OK';
}
return ip_number( $c, $ip );
}
return ip_number($c, $ip);
} ## end sub ip_number_or_blank
sub ip_number {
# from CGI::FormMagick::Validator qw( ip_number );
# from CGI::FormMagick::Validator qw( ip_number );
my ($c, $data) = @_;
return undef unless defined $data;
return $c->l('FM_IP_NUMBER1') unless $data =~ /^[\d.]+$/;
my @octets = split /\./, $data;
my $dots = ($data =~ tr/.//);
return $c->l('FM_IP_NUMBER2') unless (scalar @octets == 4 and $dots == 3);
foreach my $octet (@octets) {
return $c->l("FM_IP_NUMBER3", $octet) if $octet > 255;
}
return 'OK';
}
} ## end sub ip_number
1;

File diff suppressed because it is too large Load Diff

View File

@@ -11,329 +11,252 @@ package SrvMngr::Controller::Groups;
use strict;
use warnings;
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::groups;
use esmith::AccountsDB;
our $cdb = esmith::ConfigDB->open || die "Couldn't open configuration db";
our $cdb = esmith::ConfigDB->open || die "Couldn't open configuration db";
our $adb = esmith::AccountsDB->open || die "Couldn't open accounts db";
sub main {
my $c = shift;
$c->app->log->info($c->log_req);
my %grp_datas = ();
my $title = $c->l('grp_FORM_TITLE');
my $title = $c->l('grp_FORM_TITLE');
$grp_datas{trt} = 'LST';
my @groups;
if ($adb) {
@groups = $adb->groups();
}
$c->stash( title => $title, grp_datas => \%grp_datas, groups => \@groups );
$c->stash(title => $title, grp_datas => \%grp_datas, groups => \@groups);
$c->render(template => 'groups');
};
} ## end sub main
sub do_display {
my $c = shift;
$c->app->log->info($c->log_req);
my $rt = $c->current_route;
my $trt = ($c->param('trt') || 'LST');
my $group = $c->param('group');
my $rt = $c->current_route;
my $trt = ($c->param('trt') || 'LST');
my $group = $c->param('group');
my %grp_datas = ();
my $title = $c->l('grp_FORM_TITLE');
my $title = $c->l('grp_FORM_TITLE');
$grp_datas{'trt'} = $trt;
if ( $trt eq 'ADD' ) {
#nothing
}
if ($trt eq 'ADD') {
#nothing
}
if ( $trt eq 'UPD' ) {
my %members = ();
my %users = ();
if ($trt eq 'UPD') {
my %members = ();
my %users = ();
my $rec = $adb->get($group);
my $rec = $adb->get($group);
if ($rec and $rec->prop('type') eq 'group') {
if ($rec and $rec->prop('type') eq 'group') {
$grp_datas{group} = $group;
$grp_datas{description} = $rec->prop('Description') || '';
%members = @{ $c->gen_members_list($group) };
} ## end if ($rec and $rec->prop...)
$c->stash(members => \%members, users => \%users);
} ## end if ($trt eq 'UPD')
$grp_datas{group} = $group;
$grp_datas{description} = $rec->prop('Description') || '';
if ($trt eq 'DEL') {
my %members = ();
my %ibays = ();
my $rec = $adb->get($group);
%members = @{$c->gen_members_list( $group )};
}
if ($rec and $rec->prop('type') eq 'group') {
$grp_datas{group} = $group;
$grp_datas{description} = $rec->prop('Description') || '';
%members = @{ $c->gen_members_list($group) };
%ibays = @{ $c->gen_ibays_list($group) };
} ## end if ($rec and $rec->prop...)
$c->stash(members => \%members, ibays => \%ibays);
} ## end if ($trt eq 'DEL')
$c->stash( members => \%members, users => \%users );
}
if ( $trt eq 'DEL' ) {
my %members = ();
my %ibays = ();
my $rec = $adb->get($group);
if ($rec and $rec->prop('type') eq 'group') {
$grp_datas{group} = $group;
$grp_datas{description} = $rec->prop('Description') || '';
%members = @{$c->gen_members_list($group)};
%ibays = @{$c->gen_ibays_list($group)};
}
$c->stash( members => \%members, ibays => \%ibays );
if ($trt eq 'LST') {
my @groups;
if ($adb) {
@groups = $adb->groups();
}
if ( $trt eq 'LST' ) {
my @groups;
if ($adb) {
@groups = $adb->groups();
}
$c->stash( groups => \@groups );
}
$c->stash( title => $title, grp_datas => \%grp_datas );
$c->render( template => 'groups' );
};
$c->stash(groups => \@groups);
} ## end if ($trt eq 'LST')
$c->stash(title => $title, grp_datas => \%grp_datas);
$c->render(template => 'groups');
} ## end sub do_display
sub do_update {
my $c = shift;
$c->app->log->info($c->log_req);
my $rt = $c->current_route;
my $trt = ($c->param('trt') || 'LST');
my $rt = $c->current_route;
my $trt = ($c->param('trt') || 'LST');
my $groupName = $c->param('groupName') || '';
my $title = $c->l('grp_FORM_TITLE');
my $title = $c->l('grp_FORM_TITLE');
my ($res, $result) = '';
my %grp_datas = ();
$grp_datas{'trt'} = $trt;
$grp_datas{'trt'} = $trt;
$grp_datas{'group'} = $groupName;
my @members = ();
if ( $trt eq 'ADD' ) {
if ($trt eq 'ADD') {
my $groupDesc = $c->param('groupDesc');
@members = @{$c->every_param('groupMembers')};
@members = @{ $c->every_param('groupMembers') };
my $members = join(",", @members);
my $members = join ( ",", @members );
# controls
$res = $c->validate_group($groupName);
$result .= $res . '<br>' unless $res eq 'OK';
$res = $c->validate_group_length($groupName);
$result .= $res . '<br>' unless $res eq 'OK';
$res = $c->validate_group_naming_conflict($groupName);
$result .= $res . '<br>' unless $res eq 'OK';
$res = $c->validate_description($groupDesc);
$result .= $res . '<br>' unless $res eq 'OK';
$res = $c->validate_group_has_members(@members);
$result .= $res . '<br>' unless $res eq 'OK';
my %props = ('type', 'group', 'Description', $groupDesc, 'Members', $members);
$res = '';
# controls
$res = $c->validate_group( $groupName );
$result .= $res . '<br>' unless $res eq 'OK';
if (!$result) {
$adb->new_record($groupName, \%props);
$res = $c->validate_group_length( $groupName );
$result .= $res . '<br>' unless $res eq 'OK';
# Untaint groupName before use in system()
($groupName) = ($groupName =~ /^([a-z][\-\_\.a-z0-9]*)$/);
system("/sbin/e-smith/signal-event", "group-create", "$groupName") == 0
or $result .= $c->l('qgp_CREATE_ERROR') . "\n";
} ## end if (!$result)
$res = $c->validate_group_naming_conflict( $groupName );
$result .= $res . '<br>' unless $res eq 'OK';
$res = $c->validate_description( $groupDesc );
$result .= $res . '<br>' unless $res eq 'OK';
$res = $c->validate_group_has_members( @members );
$result .= $res . '<br>' unless $res eq 'OK';
my %props = (
'type', 'group', 'Description',
$groupDesc, 'Members', $members
);
$res = '';
if ( ! $result ) {
$adb->new_record( $groupName, \%props );
# Untaint groupName before use in system()
($groupName) = ($groupName =~ /^([a-z][\-\_\.a-z0-9]*)$/);
system("/sbin/e-smith/signal-event", "group-create", "$groupName") == 0
or $result .= $c->l('qgp_CREATE_ERROR')."\n";
}
if ( ! $result ) {
$result = $c->l('grp_CREATED_GROUP') . ' ' . $groupName;
$res = 'OK';
}
}
if ( $trt eq 'UPD' ) {
if (!$result) {
$result = $c->l('grp_CREATED_GROUP') . ' ' . $groupName;
$res = 'OK';
}
} ## end if ($trt eq 'ADD')
if ($trt eq 'UPD') {
my $groupDesc = $c->param('groupDesc');
@members = @{$c->every_param('groupMembers')};
my $members = join ( ",", @members );
@members = @{ $c->every_param('groupMembers') };
my $members = join(",", @members);
# controls
$res = '';
$res = validate_description( $c, $groupDesc );
$result .= $res . '<br>' unless $res eq 'OK';
# controls
$res = '';
$res = validate_description($c, $groupDesc);
$result .= $res . '<br>' unless $res eq 'OK';
$res = validate_group_has_members($c, @members);
$result .= $res . '<br>' unless $res eq 'OK';
$res = '';
$res = validate_group_has_members( $c, @members );
$result .= $res . '<br>' unless $res eq 'OK';
if (!$result) {
$adb->get($groupName)->set_prop('Members', $members);
$adb->get($groupName)->set_prop('Description', $groupDesc);
$res = '';
if ( ! $result ) {
# Untaint groupName before use in system()
($groupName) = ($groupName =~ /^([a-z][\-\_\.a-z0-9]*)$/);
system("/sbin/e-smith/signal-event", "group-modify", "$groupName") == 0
or $result .= $c->l('qgp_MODIFY_ERROR') . "\n";
} ## end if (!$result)
$adb->get($groupName)->set_prop( 'Members', $members );
$adb->get($groupName)->set_prop( 'Description', $groupDesc );
if (!$result) {
$result = $c->l('grp_MODIFIED_GROUP') . ' ' . $groupName;
$res = 'OK';
}
} ## end if ($trt eq 'UPD')
# Untaint groupName before use in system()
($groupName) = ($groupName =~ /^([a-z][\-\_\.a-z0-9]*)$/);
if ($trt eq 'DEL') {
if ($groupName =~ /^([a-z][\-\_\.a-z0-9]*)$/) {
$groupName = $1;
} else {
$result .= $c->l('grp_ERR_INTERNAL_FAILURE') . ':' . $groupName;
}
my $rec = $adb->get($groupName);
$result .= $c->l('grp_ERR_INTERNAL_FAILURE') . ':' . $groupName unless ($rec);
$res = '';
system("/sbin/e-smith/signal-event", "group-modify", "$groupName") ==0
or $result .= $c->l('qgp_MODIFY_ERROR')."\n";
}
if (!$result) {
$res = delete_group($c, $groupName);
$result .= $res unless $res eq 'OK';
if ( ! $result ) {
$result = $c->l('grp_MODIFIED_GROUP') . ' ' . $groupName;
$res = 'OK';
}
}
if ( $trt eq 'DEL' ) {
if ($groupName =~ /^([a-z][\-\_\.a-z0-9]*)$/) {
$groupName = $1;
} else {
$result .= $c->l('grp_ERR_INTERNAL_FAILURE') . ':' . $groupName;
}
my $rec = $adb->get($groupName);
$result .= $c->l('grp_ERR_INTERNAL_FAILURE') . ':' . $groupName unless ($rec);
$res = '';
if ( ! $result ) {
$res = delete_group( $c, $groupName );
$result .= $res unless $res eq 'OK';
if ( ! $result ) {
$result = $c->l('grp_DELETED_GROUP') . ' ' . $groupName;
$res = 'OK';
}
}
}
if (!$result) {
$result = $c->l('grp_DELETED_GROUP') . ' ' . $groupName;
$res = 'OK';
}
} ## end if (!$result)
} ## end if ($trt eq 'DEL')
# common parts
if ($res ne 'OK') {
$c->stash( error => $result );
my %members = @{$c->gen_members_list($groupName)};
$c->stash( title => $title, members => \%members, grp_datas => \%grp_datas );
return $c->render('groups');
}
$c->stash(error => $result);
my %members = @{ $c->gen_members_list($groupName) };
$c->stash(title => $title, members => \%members, grp_datas => \%grp_datas);
return $c->render('groups');
} ## end if ($res ne 'OK')
my $message = "'Groups' updates ($trt) DONE";
$c->app->log->info($message);
$c->flash( success => $result );
$c->flash(success => $result);
$c->redirect_to('/groups');
};
} ## end sub do_update
sub delete_group {
my ( $c, $groupName ) = @_;
my ($c, $groupName) = @_;
# Update the db account (1)
$adb->get($groupName)->set_prop('type', 'group-deleted');
# Untaint groupName before use in system()
($groupName) = ($groupName =~ /^([a-z][\-\_\.a-z0-9]*)$/);
return (system ("/sbin/e-smith/signal-event", "group-delete", "$groupName") ||
! $adb->get($groupName)->delete()) ?
$c->l('DELETE_ERROR') : 'OK';
}
return (system("/sbin/e-smith/signal-event", "group-delete", "$groupName") || !$adb->get($groupName)->delete())
? $c->l('DELETE_ERROR')
: 'OK';
} ## end sub delete_group
sub gen_members_list {
my ( $c, $group ) = @_;
my ($c, $group) = @_;
my @members = ();
my $rec = $adb->get($group);
@members = split ( /,/, $rec->prop('Members') ) if ( $rec );
my $rec = $adb->get($group);
@members = split(/,/, $rec->prop('Members')) if ($rec);
my %names;
foreach my $m (@members) {
my $name;
if ( $m eq 'admin' ) {
if ($m eq 'admin') {
$name = "Administrator";
} else {
$name = $adb->get($m)->prop('FirstName') . " " . $adb->get($m)->prop('LastName');
}
else {
$name = $adb->get($m)->prop('FirstName') . " "
. $adb->get($m)->prop('LastName');
}
$names{$m} = $name;
}
$names{$m} = $name;
} ## end foreach my $m (@members)
@members = %names;
return \@members;
}
} ## end sub gen_members_list
sub gen_ibays_list {
my ( $c, $group ) = @_;
my ($c, $group) = @_;
my %names;
foreach my $ibay ( $adb->ibays ) {
if ( $ibay->prop('Group') eq $group ) {
$names{$ibay->key} = $ibay->prop('Name');
foreach my $ibay ($adb->ibays) {
if ($ibay->prop('Group') eq $group) {
$names{ $ibay->key } = $ibay->prop('Name');
}
}
} ## end foreach my $ibay ($adb->ibays)
my @ibays = %names;
return \@ibays;
}
} ## end sub gen_ibays_list
sub gen_users_list {
my $c = shift;
my @users = sort { $a->key() cmp $b->key() } $adb->users();
my %names;
foreach my $user ( @users ) {
$names{$user->key} = $user->prop('FirstName') . " "
. $user->prop('LastName');
foreach my $user (@users) {
$names{ $user->key } = $user->prop('FirstName') . " " . $user->prop('LastName');
}
return \%names;
}
} ## end sub gen_users_list
=head1 VALIDATION
@@ -350,21 +273,17 @@ ok($panel->validate_is_group('ro2ot') eq 'NOT_A_GROUP', "Ro2ot is not a group");
=cut
sub validate_is_group () {
my $c = shift;
my $group = shift;
my $c = shift;
my $group = shift;
my @groups = $adb->groups();
my %groups = map { $_->key => 1 } @groups;
unless ( exists $groups{$group} ) {
unless (exists $groups{$group}) {
return ($c->l('grp_NOT_A_GROUP'));
}
return ("OK");
}
} ## end sub validate_is_group
=head2 validate_group_naming_conflict FM GROUPNAME
@@ -375,29 +294,21 @@ Returns "NAME_CONFLICT" if this group name conflicts with anything else
ok (undef, 'need testing for validate_naming_Conflicts');
=cut
sub validate_group_naming_conflict
{
my $c = shift;
sub validate_group_naming_conflict {
my $c = shift;
my $groupName = shift;
my $account = $adb->get($groupName);
my $account = $adb->get($groupName);
my $type;
if (defined $account)
{
$type = $account->prop('type');
}
elsif (defined getpwnam($groupName) || defined getgrnam($groupName))
{
$type = "system";
}
else
{
return('OK');
if (defined $account) {
$type = $account->prop('type');
} elsif (defined getpwnam($groupName) || defined getgrnam($groupName)) {
$type = "system";
} else {
return ('OK');
}
return ($c->l('grp_ACCOUNT_CONFLICT', $groupName, $type));
}
} ## end sub validate_group_naming_conflict
=head2 validate_group FM groupname
@@ -414,14 +325,14 @@ ok(validate_group('','f&oo') eq 'GROUP_CONTAINS_INVALD', 'f&oo is not a valid gr
=cut
sub validate_group {
my $c = shift;
my $c = shift;
my $groupName = shift;
unless ( $groupName =~ /^([a-z][\-\_\.a-z0-9]*)$/ ) {
unless ($groupName =~ /^([a-z][\-\_\.a-z0-9]*)$/) {
return $c->l('grp_GROUP_NAMING');
}
return ('OK');
}
} ## end sub validate_group
=head2 validate_group_length FM GROUPNAME
@@ -438,22 +349,21 @@ ok(($panel->validate_group_length('fooooooooooooooooo') eq 'GROUP_TOO_LONG'), "a
=cut
sub validate_group_length {
my $c = shift;
my $groupName = shift;
my $c = shift;
my $groupName = shift;
my $maxGroupNameLength = (
$cdb->get('maxGroupNameLength')
? $cdb->get('maxGroupNameLength')->prop('type')
: ""
)
|| 12;
my $maxGroupNameLength = ($cdb->get('maxGroupNameLength')
? $cdb->get('maxGroupNameLength')->prop('type')
: "") || 12;
if ( length $groupName > $maxGroupNameLength ) {
if (length $groupName > $maxGroupNameLength) {
return $c->l('grp_GROUP_TOO_LONG', $maxGroupNameLength);
}
else {
} else {
return ('OK');
}
}
} ## end sub validate_group_length
=head2 validate_group_has_members FM MEMBERS
@@ -473,17 +383,16 @@ ok(validate_group_has_members('') eq 'NO_MEMBERS', "We do ok with a group with
=cut
sub validate_group_has_members {
my $c = shift;
my $c = shift;
my @members = (@_);
my $count = @members;
if ( $count == 0 ) {
if ($count == 0) {
return ($c->l('grp_NO_MEMBERS'));
}
else {
} else {
return ('OK');
}
}
} ## end sub validate_group_has_members
=pod
@@ -492,16 +401,13 @@ Checks the supplied description. Period is allowed in description
=cut
sub validate_description
{
sub validate_description {
my ($c, $description) = @_;
if ( $description =~ /^([\-\'\w][\-\'\w\s\.]*)$/ ) {
if ($description =~ /^([\-\'\w][\-\'\w\s\.]*)$/) {
return ('OK');
}
else {
} else {
return ($c->l('FM_ERR_UNEXPECTED_DESC'));
}
}
} ## end sub validate_description
1

View File

@@ -11,16 +11,12 @@ package SrvMngr::Controller::Hostentries;
use strict;
use warnings;
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;
@@ -29,89 +25,73 @@ use HTML::Entities;
use Net::IPv4Addr qw(ipv4_in_network);
#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";
sub main {
my $c = shift;
$c->app->log->info( $c->log_req );
$c->app->log->info($c->log_req);
my %hos_datas = ();
my $title = $c->l('hos_FORM_TITLE');
my $notif = '';
$hos_datas{trt} = 'LIST';
my %dom_hosts = ();
foreach my $d ( @{ domains_list() } ) {
foreach my $d (@{ domains_list() }) {
$dom_hosts{$d} = { COUNT => 0, HOSTS => [] };
if ( my @hosts = $hdb->get_hosts_by_domain($d) ) {
if (my @hosts = $hdb->get_hosts_by_domain($d)) {
$dom_hosts{$d}{'COUNT'} = scalar(@hosts);
# my @entries;
push @{ $dom_hosts{$d}{'HOSTS'} }, host_data($_) foreach (@hosts);
}
}
} ## end if (my @hosts = $hdb->...)
} ## end foreach my $d (@{ domains_list...})
$c->stash(
title => $title,
notif => $notif,
hos_datas => \%hos_datas,
dom_hosts => \%dom_hosts
);
$c->render( template => 'hostentries' );
}
$c->render(template => 'hostentries');
} ## end sub main
sub do_display {
my $c = shift;
$c->app->log->info( $c->log_req );
$c->app->log->info($c->log_req);
my $rt = $c->current_route;
my $trt = $c->param('trt') || 'LST';
my $hostname = $c->param('Hostname') || '';
$trt = 'ADD' if ( $rt eq 'hostentryadd' );
$trt = 'LST' if ( $trt ne 'DEL' && $trt ne 'UPD' && $trt ne 'ADD' );
$trt = 'ADD' if ($rt eq 'hostentryadd');
$trt = 'LST' if ($trt ne 'DEL' && $trt ne 'UPD' && $trt ne 'ADD');
my %hos_datas = ();
my $title = $c->l('hos_FORM_TITLE');
my $notif = '';
$hos_datas{'trt'} = $trt;
if ( $trt eq 'ADD' ) {
if ($trt eq 'ADD') {
}
if ( $trt eq 'UPD' or $trt eq 'DEL' ) {
if ($trt eq 'UPD' or $trt eq 'DEL') {
my $rec = $hdb->get($hostname);
if ($rec) {
$hos_datas{hostname} = $rec->key;
( $hos_datas{name}, $hos_datas{domain} ) =
split_hostname($hostname);
($hos_datas{name}, $hos_datas{domain})
= split_hostname($hostname);
$hos_datas{internalip} = $rec->prop('InternalIP') || '';
$hos_datas{externalip} = $rec->prop('ExternalIP') || '';
$hos_datas{macaddress} = $rec->prop('MACAddress') || '';
$hos_datas{hosttype} = $rec->prop('HostType');
$hos_datas{comment} =
HTML::Entities::encode( $rec->prop('Comment') );
}
else {
$hos_datas{comment} = HTML::Entities::encode($rec->prop('Comment'));
} else {
$notif = "Hostname $hostname not found !";
}
}
} ## end if ($trt eq 'UPD' or $trt...)
#if ( $trt eq 'DEL' ) {
# my $rec = $hdb->get($hostname);
# if ( $rec ) {
# get_hos_datas( $rec, %hos_datas );
@@ -119,29 +99,21 @@ sub do_display {
# $notif = "Hostname $hostname not found !"
# }
#}
if ( $trt eq 'LIST' ) {
if ($trt eq 'LIST') {
}
$c->stash( title => $title, notif => $notif, hos_datas => \%hos_datas );
$c->render( template => 'hostentries' );
}
$c->stash(title => $title, notif => $notif, hos_datas => \%hos_datas);
$c->render(template => 'hostentries');
} ## end sub do_display
sub do_update {
my $c = shift;
$c->app->log->info( $c->log_req );
my $rt = $c->current_route;
my $trt = ( $c->param('trt') || 'LIST' );
$c->app->log->info($c->log_req);
my $rt = $c->current_route;
my $trt = ($c->param('trt') || 'LIST');
my %hos_datas = ();
my $title = $c->l('hos_FORM_TITLE');
my $notif = '';
my $result = '';
$hos_datas{'name'} = lc $c->param('Name');
$hos_datas{'domain'} = lc $c->param('Domain');
$hos_datas{'hostname'} = $c->param('Hostname');
@@ -151,199 +123,180 @@ sub do_update {
$hos_datas{'macaddress'} = $c->param('Macaddress');
$hos_datas{'externalip'} = $c->param('Externalip');
my $hostname = "$hos_datas{'name'}.$hos_datas{'domain'}";
if ( $trt eq 'ADD' ) {
$hos_datas{'hostname'} = $hostname;
if ($trt eq 'ADD') {
$hos_datas{'hostname'} = $hostname;
# controls
my $res = '';
unless ( $hos_datas{'name'} =~ /^[a-z0-9][a-z0-9-]*$/ ) {
unless ($hos_datas{'name'} =~ /^[a-z0-9][a-z0-9-]*$/) {
$result .= $c->l('hos_HOSTNAME_VALIDATOR_ERROR') . '<br>';
}
unless ( $hos_datas{comment} =~ /^([a-zA-Z0-9][\_\.\-,A-Za-z0-9\s]*)$/
|| $hos_datas{comment} eq '' )
unless ($hos_datas{comment} =~ /^([a-zA-Z0-9][\_\.\-,A-Za-z0-9\s]*)$/
|| $hos_datas{comment} eq '')
{
$result .= $c->l('hos_HOSTNAME_COMMENT_ERROR') . '<br>';
}
} ## end unless ($hos_datas{comment...})
# Look for duplicate hosts.
my $hostrec = undef;
if ( $hostrec = $hdb->get($hostname) ) {
if ($hostrec = $hdb->get($hostname)) {
$result .= $c->l(
'hos_HOSTNAME_EXISTS_ERROR',
{
fullHostName => $hostname,
{ fullHostName => $hostname,
type => $hostrec->prop('HostType')
}
) . '<br>',;
}
} ## end if ($hostrec = $hdb->get...)
if ( !$result and $hos_datas{hosttype} ne 'Self' ) {
if ( $hos_datas{hosttype} eq 'Local' ) {
if (!$result and $hos_datas{hosttype} ne 'Self') {
if ($hos_datas{hosttype} eq 'Local') {
$hos_datas{'trt'} = 'ALC'; # ADD/LOCAL
}
else {
} else {
$hos_datas{'trt'} = 'ARM'; # ADD/REMOVE
}
$c->stash( title => $title, notif => '', hos_datas => \%hos_datas );
return $c->render( template => 'hostentries' );
}
$c->stash(title => $title, notif => '', hos_datas => \%hos_datas);
return $c->render(template => 'hostentries');
} ## end if (!$result and $hos_datas...)
#!#$result .= ' blocked';
if ( !$result ) {
$res = create_modify_hostentry( $c, $trt, %hos_datas );
if (!$result) {
$res = create_modify_hostentry($c, $trt, %hos_datas);
$result .= $res unless $res eq 'OK';
}
if ( !$result ) {
if (!$result) {
$result = $c->l('hos_CREATE_OR_MODIFY_SUCCEEDED') . ' ' . $hostname;
$trt = 'SUC';
}
}
} ## end if ($trt eq 'ADD')
if ( $trt eq 'UPD' ) {
if ($trt eq 'UPD') {
# controls
my $res = '';
#$res = validate_description( $c, $account );
#$result .= $res unless $res eq 'OK';
unless ( $hos_datas{comment} =~ /^([a-zA-Z0-9][\_\.\-,A-Za-z0-9\s]*)$/
|| $hos_datas{comment} eq '' )
unless ($hos_datas{comment} =~ /^([a-zA-Z0-9][\_\.\-,A-Za-z0-9\s]*)$/
|| $hos_datas{comment} eq '')
{
$result .= $c->l('hos_HOSTNAME_COMMENT_ERROR') . '<br>';
}
if ( !$result and $hos_datas{hosttype} ne 'Self' ) {
if ( $hos_datas{hosttype} eq 'Local' ) {
if (!$result and $hos_datas{hosttype} ne 'Self') {
if ($hos_datas{hosttype} eq 'Local') {
$hos_datas{'trt'} = 'ULC'; # UPDATE/LOCAL
}
else {
} else {
$hos_datas{'trt'} = 'URM'; # UPDATE/REMOVE
}
$c->stash( title => $title, notif => '', hos_datas => \%hos_datas );
return $c->render( template => 'hostentries' );
}
$c->stash(title => $title, notif => '', hos_datas => \%hos_datas);
return $c->render(template => 'hostentries');
} ## end if (!$result and $hos_datas...)
#!#$result .= 'blocked';
if ( !$result ) {
$res = create_modify_hostentry( $c, $trt, %hos_datas );
if (!$result) {
$res = create_modify_hostentry($c, $trt, %hos_datas);
$result .= $res unless $res eq 'OK';
}
if ( !$result ) {
if (!$result) {
$result = $c->l('hos_MODIFY_SUCCEEDED') . ' ' . $hostname;
$trt = 'SUC';
}
}
} ## end if ($trt eq 'UPD')
if ( $trt =~ /^.LC$/ ) {
if ($trt =~ /^.LC$/) {
# controls
my $res = '';
$res = ip_number( $c, $hos_datas{internalip} );
$res = ip_number($c, $hos_datas{internalip});
$result .= $res . ' ' unless $res eq 'OK';
$res = not_in_dhcp_range( $c, $hos_datas{internalip} );
$res = not_in_dhcp_range($c, $hos_datas{internalip});
$result .= $res . ' ' unless $res eq 'OK';
$res = not_taken( $c, $hos_datas{internalip} );
$res = not_taken($c, $hos_datas{internalip});
$result .= $res . ' ' unless $res eq 'OK';
$res = must_be_local( $c, $hos_datas{internalip} );
$res = must_be_local($c, $hos_datas{internalip});
$result .= $res . ' ' unless $res eq 'OK';
$res = mac_address_or_blank( $c, $hos_datas{macaddress} );
$res = mac_address_or_blank($c, $hos_datas{macaddress});
$result .= $res . ' ' unless $res eq 'OK';
#!#$result .= 'blocked';
if ( !$result ) {
$res = create_modify_hostentry( $c, $trt, %hos_datas );
if (!$result) {
$res = create_modify_hostentry($c, $trt, %hos_datas);
$result .= $res unless $res eq 'OK';
}
if ( !$result ) {
if (!$result) {
$result = $c->l('hos_MODIFY_SUCCEEDED') . ' ' . $hostname;
$trt = 'SUC';
}
}
} ## end if ($trt =~ /^.LC$/)
if ( $trt =~ /^.RM$/ ) {
if ($trt =~ /^.RM$/) {
# controls
my $res = '';
$res = ip_number_or_blank( $c, $hos_datas{externalip} );
$res = ip_number_or_blank($c, $hos_datas{externalip});
$result .= $res . '<br>' unless $res eq 'OK';
#!#$result .= 'blocked';
if ( !$result ) {
$res = create_modify_hostentry( $c, $trt, %hos_datas );
if (!$result) {
$res = create_modify_hostentry($c, $trt, %hos_datas);
$result .= $res unless $res eq 'OK';
}
if ( !$result ) {
if (!$result) {
$result = $c->l('hos_MODIFY_SUCCEEDED') . ' ' . $hostname;
$trt = 'SUC';
}
}
} ## end if ($trt =~ /^.RM$/)
#if ( $trt eq 'ULC' ) {
#}
#if ( $trt eq 'URM' ) {
#}
if ( $trt eq 'DEL' ) {
if ($trt eq 'DEL') {
# controls
my $res = '';
#$res = validate_is_hostentry($c, $hostname);
#$result .= $res unless $res eq 'OK';
#!#$result .= 'blocked';
if ( !$result ) {
my $res = delete_hostentry( $c, $hos_datas{hostname} );
if (!$result) {
my $res = delete_hostentry($c, $hos_datas{hostname});
$result .= $res unless $res eq 'OK';
}
if ( !$result ) {
if (!$result) {
$result = $c->l('hos_REMOVE_SUCCEEDED') . ' ' . $hostname;
$trt = 'SUC';
}
}
} ## end if ($trt eq 'DEL')
$hos_datas{'hostname'} = $hostname;
$hos_datas{'trt'} = $trt;
$c->stash(title => $title, notif => $result, hos_datas => \%hos_datas);
$c->stash( title => $title, notif => $result, hos_datas => \%hos_datas );
if ( $hos_datas{trt} ne 'SUC' ) {
return $c->render( template => 'hostentries' );
if ($hos_datas{trt} ne 'SUC') {
return $c->render(template => 'hostentries');
}
$c->redirect_to('/hostentries');
}
} ## end sub do_update
sub create_modify_hostentry {
my ( $c, $trt, %hos_datas ) = @_;
my ($c, $trt, %hos_datas) = @_;
my $hostname = $hos_datas{hostname};
my $action;
if ( $trt eq 'ADD' or $trt eq 'ALC' or $trt eq 'ARM' ) {
if ($trt eq 'ADD' or $trt eq 'ALC' or $trt eq 'ARM') {
$action = 'create';
}
if ( $trt eq 'UPD' or $trt eq 'ULC' or $trt eq 'URM' ) {
if ($trt eq 'UPD' or $trt eq 'ULC' or $trt eq 'URM') {
$action = 'modify';
}
@@ -353,20 +306,20 @@ sub create_modify_hostentry {
? $c->l('hos_ERROR_CREATING_HOST')
: $c->l('hos_ERROR_MODIFYING_HOST')
);
}
} ## end unless ($hostname)
# Untaint and lowercase $hostname
$hostname =~ /([\w\.-]+)/;
$hostname = lc($1);
my $rec = $hdb->get($hostname);
if ( $rec and $action eq 'create' ) {
if ($rec and $action eq 'create') {
return $c->l('hos_HOSTNAME_IN_USE_ERROR');
}
if ( not $rec and $action eq 'modify' ) {
if (not $rec and $action eq 'modify') {
return $c->l('hos_NONEXISTENT_HOSTNAME_ERROR');
}
my %props = (
type => 'host',
HostType => $hos_datas{hosttype},
@@ -376,224 +329,178 @@ sub create_modify_hostentry {
Comment => $hos_datas{comment},
);
if ( $action eq 'create' ) {
if ( $hdb->new_record( $hostname, \%props ) ) {
if (
system( "/sbin/e-smith/signal-event", "host-$action",
$hostname ) != 0
)
{
if ($action eq 'create') {
if ($hdb->new_record($hostname, \%props)) {
if (system("/sbin/e-smith/signal-event", "host-$action", $hostname) != 0) {
return $c->l('hos_ERROR_WHILE_CREATING_HOST');
}
}
}
} ## end if ($hdb->new_record($hostname...))
} ## end if ($action eq 'create')
if ( $action eq 'modify' ) {
if ( $rec->merge_props(%props) ) {
if (
system( "/sbin/e-smith/signal-event", "host-$action",
$hostname ) != 0
)
{
if ($action eq 'modify') {
if ($rec->merge_props(%props)) {
if (system("/sbin/e-smith/signal-event", "host-$action", $hostname) != 0) {
rturn $c->l('hos_ERROR_WHILE_MODIFYING_HOST');
}
}
}
} ## end if ($rec->merge_props(...))
} ## end if ($action eq 'modify')
return 'OK';
}
} ## end sub create_modify_hostentry
sub delete_hostentry {
my ( $c, $hostname ) = @_;
my ($c, $hostname) = @_;
# Untaint $hostname before use in system()
$hostname =~ /([\w\.-]+)/;
$hostname = $1;
return ( $c->l('hos_ERROR_WHILE_REMOVING_HOST') ) unless ($hostname);
return ($c->l('hos_ERROR_WHILE_REMOVING_HOST')) unless ($hostname);
my $rec = $hdb->get($hostname);
return ( $c->l('hos_NONEXISTENT_HOST_ERROR') ) if ( not $rec );
return ($c->l('hos_NONEXISTENT_HOST_ERROR')) if (not $rec);
if ( $rec->delete() ) {
if (
system( "/sbin/e-smith/signal-event", "host-delete", "$hostname" )
== 0 )
{
if ($rec->delete()) {
if (system("/sbin/e-smith/signal-event", "host-delete", "$hostname") == 0) {
return 'OK';
}
}
return ( $c->l('hos_ERROR_WHILE_DELETING_HOST') );
}
} ## end if ($rec->delete())
return ($c->l('hos_ERROR_WHILE_DELETING_HOST'));
} ## end sub delete_hostentry
sub domains_list {
my $d = esmith::DomainsDB->open_ro() or die "Couldn't open DomainsDB";
my @domains;
for ( $d->domains ) {
my $ns = $_->prop("Nameservers") || 'localhost';
push @domains, $_->key if ( $ns eq 'localhost' );
}
for ($d->domains) {
my $ns = $_->prop("Nameservers") || 'localhost';
push @domains, $_->key if ($ns eq 'localhost');
}
return \@domains;
}
} ## end sub domains_list
sub host_data {
my $host_record = shift;
my $ht = $host_record->prop('HostType');
my $ip =
( $ht eq 'Self' ) ? $cdb->get_value('LocalIP')
: ( $ht eq 'Remote' ) ? $host_record->prop('ExternalIP')
: $host_record->prop('InternalIP');
my $ht = $host_record->prop('HostType');
my $ip
= ($ht eq 'Self') ? $cdb->get_value('LocalIP')
: ($ht eq 'Remote') ? $host_record->prop('ExternalIP')
: $host_record->prop('InternalIP');
my %data = (
'IP' => $ip,
'HostName' => $host_record->key(),
'HostType' => $host_record->prop('HostType'),
'MACAddress' => ( $host_record->prop('MACAddress') || '' ),
'Comment' => ( $host_record->prop('Comment') || '' ),
'static' => ( $host_record->prop('static') || 'no' )
'MACAddress' => ($host_record->prop('MACAddress') || ''),
'Comment' => ($host_record->prop('Comment') || ''),
'static' => ($host_record->prop('static') || 'no')
);
return \%data
}
return \%data;
} ## end sub host_data
sub hosttype_list {
my $c = shift;
return [
[ $c->l('SELF') => 'Self' ],
[ $c->l('LOCAL') => 'Local' ],
[ $c->l('REMOTE') => 'Remote' ]
];
return [ [ $c->l('SELF') => 'Self' ], [ $c->l('LOCAL') => 'Local' ], [ $c->l('REMOTE') => 'Remote' ] ];
}
sub split_hostname {
my $hostname = shift;
return ( $hostname =~ /^([^\.]+)\.(.+)$/ );
return ($hostname =~ /^([^\.]+)\.(.+)$/);
}
sub mac_address_or_blank {
my ( $c, $data ) = @_;
my ($c, $data) = @_;
return "OK" unless $data;
return mac_address( $c, $data );
}
return mac_address($c, $data);
} ## end sub mac_address_or_blank
sub mac_address {
# from CGI::FormMagick::Validator::Network
my ( $c, $data ) = @_;
my ($c, $data) = @_;
$_ = lc $data; # easier to match on $_
if ( not defined $_ ) {
if (not defined $_) {
return $c->l('FM_MAC_ADDRESS1');
}
elsif (/^([0-9a-f][0-9a-f](:[0-9a-f][0-9a-f]){5})$/) {
} elsif (/^([0-9a-f][0-9a-f](:[0-9a-f][0-9a-f]){5})$/) {
return "OK";
}
else {
} else {
return $c->l('FM_MAC_ADDRESS2');
}
}
} ## end sub mac_address
sub ip_number_or_blank {
# XXX - FIXME - we should push this down into CGI::FormMagick
my $c = shift;
my $ip = shift;
if ( !defined($ip) || $ip eq "" ) {
if (!defined($ip) || $ip eq "") {
return 'OK';
}
return ip_number( $c, $ip );
}
return ip_number($c, $ip);
} ## end sub ip_number_or_blank
sub ip_number {
# from CGI::FormMagick::Validator qw( ip_number );
my ( $c, $data ) = @_;
my ($c, $data) = @_;
return undef unless defined $data;
return $c->l('FM_IP_NUMBER1') unless $data =~ /^[\d.]+$/;
my @octets = split /\./, $data;
my $dots = ( $data =~ tr/.// );
return $c->l('FM_IP_NUMBER2') unless ( scalar @octets == 4 and $dots == 3 );
my $dots = ($data =~ tr/.//);
return $c->l('FM_IP_NUMBER2') unless (scalar @octets == 4 and $dots == 3);
foreach my $octet (@octets) {
return $c->l( "FM_IP_NUMBER3", $octet ) if $octet > 255;
return $c->l("FM_IP_NUMBER3", $octet) if $octet > 255;
}
return 'OK';
}
} ## end sub ip_number
sub not_in_dhcp_range {
my $c = shift;
my $address = shift;
my $status = $cdb->get('dhcpd')->prop('status') || "disabled";
my $status = $cdb->get('dhcpd')->prop('status') || "disabled";
return 'OK' unless $status eq "enabled";
my $start = $cdb->get('dhcpd')->prop('start');
my $end = $cdb->get('dhcpd')->prop('end');
return ( esmith::util::IPquadToAddr($start) <=
esmith::util::IPquadToAddr($address)
&& esmith::util::IPquadToAddr($address) <=
esmith::util::IPquadToAddr($end) )
? $c->l('hos_ADDR_IN_DHCP_RANGE')
: 'OK';
}
return ( esmith::util::IPquadToAddr($start) <= esmith::util::IPquadToAddr($address)
&& esmith::util::IPquadToAddr($address) <= esmith::util::IPquadToAddr($end))
? $c->l('hos_ADDR_IN_DHCP_RANGE')
: 'OK';
} ## end sub not_in_dhcp_range
sub not_taken {
my $c = shift;
my $localip = shift;
my $server_localip = $cdb->get_value('LocalIP') || '';
my $server_gateway = $cdb->get_value('GatewayIP') || '';
my $c = shift;
my $localip = shift;
my $server_localip = $cdb->get_value('LocalIP') || '';
my $server_gateway = $cdb->get_value('GatewayIP') || '';
my $server_extip = $cdb->get_value('ExternalIP') || '';
#$c->debug_msg("\$localip is $localip");
#$c->debug_msg("\$server_localip is $server_localip");
#$c->debug_msg("\$server_gateway is $server_gateway");
#$c->debug_msg("\$server_extip is $server_extip");
if ( $localip eq $server_localip ) {
if ($localip eq $server_localip) {
return $c->l('hos_ERR_IP_IS_LOCAL_OR_GATEWAY');
}
if ( $localip eq $server_gateway ) {
if ($localip eq $server_gateway) {
return $c->l('hos_ERR_IP_IS_LOCAL_OR_GATEWAY');
}
if ( ( $cdb->get_value('SystemMode') ne 'serveronly' )
&& ( $server_extip eq $localip ) )
if ( ($cdb->get_value('SystemMode') ne 'serveronly')
&& ($server_extip eq $localip))
{
return $c->l('hos_ERR_IP_IS_LOCAL_OR_GATEWAY');
}
} ## end if (($cdb->get_value('SystemMode'...)))
if ( $localip eq '127.0.0.1' ) {
if ($localip eq '127.0.0.1') {
return $c->l('hos_ERR_IP_IS_LOCAL_OR_GATEWAY');
}
else {
} else {
return 'OK';
}
}
} ## end sub not_taken
sub must_be_local {
my $c = shift;
my $localip = shift;
@@ -603,13 +510,13 @@ sub must_be_local {
foreach my $spec (@local_list) {
next if $spec eq '127.0.0.1';
if ( eval { Net::IPv4Addr::ipv4_in_network( $spec, $localip ) } ) {
if (eval { Net::IPv4Addr::ipv4_in_network($spec, $localip) }) {
return 'OK';
}
}
} ## end foreach my $spec (@local_list)
# Not OK. The IP is not on any of our local networks.
return $c->l('hos_ERR_IP_NOT_LOCAL');
}
} ## end sub must_be_local
1;

View File

@@ -4,289 +4,255 @@ package SrvMngr::Controller::Ibays;
# heading : Network
# description : Shared areas (was ibays)
# navigation : 6000 100
#
#
#
# routes : end
#----------------------------------------------------------------------
use strict;
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 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";
sub main {
my $c = shift;
$c->app->log->info($c->log_req);
my %iba_datas = ();
my $title = $c->l('iba_FORM_TITLE');
my $title = $c->l('iba_FORM_TITLE');
$iba_datas{'trt'} = 'LIST';
my @ibays;
if ($adb)
{
if ($adb) {
@ibays = $adb->ibays();
}
$c->stash( title => $title, iba_datas => \%iba_datas, ibays => \@ibays );
$c->stash(title => $title, iba_datas => \%iba_datas, ibays => \@ibays);
$c->render(template => 'ibays');
};
} ## end sub main
sub do_display {
my $c = shift;
my $rt = $c->current_route;
my $trt = ($c->param('trt') || 'LIST');
my $c = shift;
my $rt = $c->current_route;
my $trt = ($c->param('trt') || 'LIST');
my $ibay = $c->param('ibay') || '';
#$trt = 'DEL' if ( $ibay );
#$trt = 'ADD' if ( $rt eq 'ibayadd' );
my %iba_datas = ();
my $title = $c->l('iba_FORM_TITLE');
my $modul = '';
my $title = $c->l('iba_FORM_TITLE');
my $modul = '';
$iba_datas{'trt'} = $trt;
if ( $trt eq 'ADD' ) {
if ($trt eq 'ADD') {
$iba_datas{ibay} = '';
$iba_datas{description} = '';
$iba_datas{group} = '';
$iba_datas{userAccess} = '';
$iba_datas{publicAccess} = '';
$iba_datas{CgiBin} = '';
$iba_datas{SSL} = '';
} ## end if ($trt eq 'ADD')
$iba_datas{ibay} = '';
$iba_datas{description} = '';
$iba_datas{group} = '';
$iba_datas{userAccess} = '';
$iba_datas{publicAccess} = '';
$iba_datas{CgiBin} = '';
$iba_datas{SSL} = '';
if ($trt eq 'UPD') {
my $rec = $adb->get($ibay);
if ($rec and $rec->prop('type') eq 'ibay') {
$iba_datas{ibay} = $ibay;
$iba_datas{description} = $rec->prop('Name') || '';
$iba_datas{group} = $rec->prop('Group') || '';
$iba_datas{userAccess} = $rec->prop('UserAccess') || '';
$iba_datas{publicAccess} = $rec->prop('PublicAccess') || '';
$iba_datas{CgiBin} = $rec->prop('CgiBin') || 'disabled';
$iba_datas{SSL} = $rec->prop('SSL') || 'disabled';
} ## end if ($rec and $rec->prop...)
} ## end if ($trt eq 'UPD')
if ($trt eq 'DEL') {
my $rec = $adb->get($ibay);
if ($rec and $rec->prop('type') eq 'ibay') {
$iba_datas{ibay} = $ibay;
$iba_datas{description} = $rec->prop('Name') || '';
$modul .= print_vhost_message($c, $ibay);
} ## end if ($rec and $rec->prop...)
} ## end if ($trt eq 'DEL')
if ($trt eq 'PWD') {
my $rec = $adb->get($ibay);
if ($rec and $rec->prop('type') eq 'ibay') {
$iba_datas{ibay} = $ibay;
$iba_datas{description} = $rec->prop('Name') || '';
}
} ## end if ($trt eq 'PWD')
if ( $trt eq 'UPD' ) {
if ($trt eq 'LIST') {
my @ibays;
$adb = esmith::AccountsDB->open || die "Couldn't open accounts db";
my $rec = $adb->get($ibay);
if ($rec and $rec->prop('type') eq 'ibay') {
$iba_datas{ibay} = $ibay;
$iba_datas{description} = $rec->prop('Name') || '';
$iba_datas{group} = $rec->prop('Group') || '';
$iba_datas{userAccess} = $rec->prop('UserAccess') || '';
$iba_datas{publicAccess} = $rec->prop('PublicAccess') || '';
$iba_datas{CgiBin} = $rec->prop('CgiBin') || 'disabled';
$iba_datas{SSL} = $rec->prop('SSL') || 'disabled';
}
if ($adb) {
@ibays = $adb->ibays();
}
if ( $trt eq 'DEL' ) {
my $rec = $adb->get($ibay);
if ($rec and $rec->prop('type') eq 'ibay') {
$iba_datas{ibay} = $ibay;
$iba_datas{description} = $rec->prop('Name') || '';
$modul .= print_vhost_message( $c, $ibay );
}
}
if ( $trt eq 'PWD' ) {
my $rec = $adb->get($ibay);
if ($rec and $rec->prop('type') eq 'ibay') {
$iba_datas{ibay} = $ibay;
$iba_datas{description} = $rec->prop('Name') || '';
}
}
if ( $trt eq 'LIST' ) {
my @ibays;
$adb = esmith::AccountsDB->open || die "Couldn't open accounts db";
if ($adb)
{
@ibays = $adb->ibays();
}
$c->stash( ibays => \@ibays );
}
$c->stash( title => $title, modul => $modul, iba_datas => \%iba_datas );
$c->render( template => 'ibays' );
};
$c->stash(ibays => \@ibays);
} ## end if ($trt eq 'LIST')
$c->stash(title => $title, modul => $modul, iba_datas => \%iba_datas);
$c->render(template => 'ibays');
} ## end sub do_display
sub do_update {
my $c = shift;
$c->app->log->info($c->log_req);
my $rt = $c->current_route;
my $trt = ($c->param('trt') || 'LIST');
my $rt = $c->current_route;
my $trt = ($c->param('trt') || 'LIST');
my %iba_datas = ();
my $title = $c->l('iba_FORM_TITLE');
my $title = $c->l('iba_FORM_TITLE');
$iba_datas{'trt'} = $trt;
my $result = '';
my $res;
if ( $trt eq 'ADD' ) {
if ($trt eq 'ADD') {
my $name = ($c->param('ibay') || '');
my $name = ($c->param('ibay') || '');
# controls
$res = validate_ibay($c, $name);
$result .= $res unless $res eq 'OK';
# controls
$res = validate_ibay( $c, $name );
$result .= $res unless $res eq 'OK';
if (!$result) {
$res = create_ibay($c, $name);
$result .= $res unless $res eq 'OK';
if ( ! $result ) {
$res = create_ibay( $c, $name );
$result .= $res unless $res eq 'OK';
if ( ! $result ) {
$result = $c->l('iba_SUCCESSFULLY_CREATED_IBAY') . ' ' . $name;
$iba_datas{trt} = 'LST';
}
}
}
if (!$result) {
$result = $c->l('iba_SUCCESSFULLY_CREATED_IBAY') . ' ' . $name;
$iba_datas{trt} = 'LST';
}
} ## end if (!$result)
} ## end if ($trt eq 'ADD')
if ( $trt eq 'UPD' ) {
if ($trt eq 'UPD') {
my $name = ($c->param('ibay') || '');
my $name = ($c->param('ibay') || '');
# controls
$res = '';
# controls
$res = '';
if (!$result) {
$res = modify_ibay($c, $name);
$result .= $res unless $res eq 'OK';
if ( ! $result ) {
$res = modify_ibay( $c, $name );
$result .= $res unless $res eq 'OK';
if ( ! $result ) {
$result = $c->l('iba_SUCCESSFULLY_MODIFIED_IBAY') . ' ' . $name;
$iba_datas{trt} = 'LST';
}
}
}
if (!$result) {
$result = $c->l('iba_SUCCESSFULLY_MODIFIED_IBAY') . ' ' . $name;
$iba_datas{trt} = 'LST';
}
} ## end if (!$result)
} ## end if ($trt eq 'UPD')
if ( $trt eq 'PWD' ) {
my $ibay = ($c->param('ibay') || '');
my $pass1 = ($c->param('newPass') || '');
if ($trt eq 'PWD') {
my $ibay = ($c->param('ibay') || '');
my $pass1 = ($c->param('newPass') || '');
my $pass2 = ($c->param('newPassVerify') || '');
# controls
# controls
unless ($pass1 eq $pass2) {
$result .= $c->l('iba_IBAY_PASSWD_VERIFY_ERROR') . ' - ';
}
}
$res = check_password($c, $pass1);
$result .= $res unless $res eq 'OK';
$res = check_password( $c, $pass1 );
$result .= $res unless $res eq 'OK';
if ( ! $result ) {
$res = reset_password( $c, $ibay, $pass1 );
$result .= $res unless $res eq 'OK';
if ( ! $result ) {
$result = $c->l('iba_SUCCESSFULLY_RESET_PASSWORD') . ' ' . $ibay;
$iba_datas{trt} = 'LST';
}
}
}
if (!$result) {
$res = reset_password($c, $ibay, $pass1);
$result .= $res unless $res eq 'OK';
if ( $trt eq 'DEL' ) {
my $ibay = $c->param ('ibay');
if (!$result) {
$result = $c->l('iba_SUCCESSFULLY_RESET_PASSWORD') . ' ' . $ibay;
$iba_datas{trt} = 'LST';
}
} ## end if (!$result)
} ## end if ($trt eq 'PWD')
if ($ibay =~ /^([a-z][a-z0-9]*)$/) {
$ibay = $1;
} else {
$result .= $c->l('iba_ERR_INTERNAL_FAILURE') . ':' . $ibay;
}
if ($trt eq 'DEL') {
my $ibay = $c->param('ibay');
if ( ! $result ) {
$res = remove_ibay( $c, $ibay );
$result .= $res unless $res eq 'OK';
if ( ! $result ) {
$result = $c->l('iba_SUCCESSFULLY_DELETED_IBAY') . ' ' . $ibay;
$iba_datas{trt} = 'LST';
}
}
}
if ($ibay =~ /^([a-z][a-z0-9]*)$/) {
$ibay = $1;
} else {
$result .= $c->l('iba_ERR_INTERNAL_FAILURE') . ':' . $ibay;
}
if (!$result) {
$res = remove_ibay($c, $ibay);
$result .= $res unless $res eq 'OK';
if (!$result) {
$result = $c->l('iba_SUCCESSFULLY_DELETED_IBAY') . ' ' . $ibay;
$iba_datas{trt} = 'LST';
}
} ## end if (!$result)
} ## end if ($trt eq 'DEL')
# common parts
if ($res ne 'OK') {
$c->stash( error => $result );
$c->stash( title => $title, iba_datas => \%iba_datas );
return $c->render('ibays');
$c->stash(error => $result);
$c->stash(title => $title, iba_datas => \%iba_datas);
return $c->render('ibays');
}
my $message = "'Ibays' updates ($trt) DONE";
$c->app->log->info($message);
$c->flash( success => $result );
$c->flash(success => $result);
$c->redirect_to('/ibays');
};
} ## end sub do_update
sub validate_ibay {
my ($c, $name) = @_;
my $msg = validate_name($c, $name);
unless ($msg eq "OK")
{
unless ($msg eq "OK") {
return ($msg);
}
$msg = max_ibay_name_length($c, $name);
unless ($msg eq "OK")
{
unless ($msg eq "OK") {
return ($msg);
}
$msg = conflict_check($c, $name);
unless ($msg eq "OK")
{
unless ($msg eq "OK") {
return ($msg);
}
return ('OK');
}
} ## end sub validate_ibay
sub create_ibay {
my ($c, $name) = @_;
my $msg;
my $uid = $adb->get_next_uid();
if (my $acct = $adb->new_record($name, {
Name => $c->param('ibayDesc'),
CgiBin => $c->param('CgiBin'),
Group => $c->param('group'),
PublicAccess => $c->param('publicAccess'),
SSL => $c->param('SSL'),
UserAccess => $c->param('userAccess'),
Uid => $uid,
Gid => $uid,
PasswordSet => 'no',
type => 'ibay',
}) )
my $uid = $adb->get_next_uid();
if (my $acct = $adb->new_record(
$name,
{ Name => $c->param('ibayDesc'),
CgiBin => $c->param('CgiBin'),
Group => $c->param('group'),
PublicAccess => $c->param('publicAccess'),
SSL => $c->param('SSL'),
UserAccess => $c->param('userAccess'),
Uid => $uid,
Gid => $uid,
PasswordSet => 'no',
type => 'ibay',
}
)
)
{
# Untaint $name before use in system()
$name =~ /(.+)/; $name = $1;
if (system ("/sbin/e-smith/signal-event", "ibay-create", $name) == 0) {
$name =~ /(.+)/;
$name = $1;
if (system("/sbin/e-smith/signal-event", "ibay-create", $name) == 0) {
$msg = 'OK';
} else {
$msg = $c->l('iba_ERROR_WHILE_CREATING_IBAY');
@@ -295,14 +261,12 @@ sub create_ibay {
$msg = $c->l('iba_CANT_CREATE_IBAY');
}
return $msg;
}
} ## end sub create_ibay
sub modify_ibay {
my ($c, $name) = @_;
my $msg;
if (my $acct = $adb->get($name)) {
if ($acct->prop('type') eq 'ibay') {
$acct->merge_props(
@@ -315,10 +279,10 @@ sub modify_ibay {
);
# Untaint $name before use in system()
$name =~ /(.+)/; $name = $1;
if (system ("/sbin/e-smith/signal-event", "ibay-modify",
$name) == 0)
{
$name =~ /(.+)/;
$name = $1;
if (system("/sbin/e-smith/signal-event", "ibay-modify", $name) == 0) {
$msg = 'OK';
} else {
$msg = $c->l('iba_ERROR_WHILE_MODIFYING_IBAY');
@@ -329,53 +293,47 @@ sub modify_ibay {
} else {
$msg = $c->l('iba_CANT_FIND_IBAY');
}
return $msg;
}
} ## end sub modify_ibay
sub print_vhost_message {
my $c = shift;
my $name = $c->param('ibay');
my $c = shift;
my $name = $c->param('ibay');
my $result = '';
my $domaindb = esmith::DomainsDB->open();
my @domains = $domaindb->get_all_by_prop(Content => $name);
my $vhostListItems = join "\n", (map ($_->key . " " . $_->prop('Description'), @domains));
my $result = '';
my $domaindb = esmith::DomainsDB->open();
my @domains = $domaindb->get_all_by_prop(Content => $name);
my $vhostListItems = join "\n",
(map ($_->key." ".$_->prop('Description'), @domains));
if ($vhostListItems)
{
if ($vhostListItems) {
$result = $c->l('iba_VHOST_MESSAGE') . "<br><ul>";
foreach ( $vhostListItems ) {
$result .= "<li> $_ </li>";
}
$result .= '</ul>'
}
return $result;
}
foreach ($vhostListItems) {
$result .= "<li> $_ </li>";
}
$result .= '</ul>';
} ## end if ($vhostListItems)
return $result;
} ## end sub print_vhost_message
sub remove_ibay {
my ($c, $name) = @_;
my $msg = '';
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 = $domains_db->get_all_by_prop(Content=>$name);
my @domains = $domains_db->get_all_by_prop(Content => $name);
foreach my $d (@domains) {
$d->set_prop(Content => 'Primary');
}
# Untaint $name before use in system()
$name =~ /(.+)/; $name = $1;
if (system ("/sbin/e-smith/signal-event", "ibay-delete",
$name) == 0)
{
$name =~ /(.+)/;
$name = $1;
if (system("/sbin/e-smith/signal-event", "ibay-delete", $name) == 0) {
$msg = 'OK';
$acct->delete();
} else {
@@ -384,27 +342,25 @@ sub remove_ibay {
} else {
$msg = $c->l('iba_CANT_FIND_IBAY');
}
} else {
$msg = $c->l('iba_CANT_FIND_IBAY');
}
return $msg;
}
} ## end sub remove_ibay
sub reset_password {
my ($c, $name, $newPass) = @_;
my ($msg, $acct);
if (($acct = $adb->get($name)) && ($acct->prop('type') eq 'ibay')) {
esmith::util::setIbayPassword ($acct->key, $newPass);
esmith::util::setIbayPassword($acct->key, $newPass);
$acct->set_prop('PasswordSet', 'yes');
# Untaint $name before use in system()
$name =~ /(.+)/; $name = $1;
if (system ("/sbin/e-smith/signal-event", "password-modify",
$name) == 0)
{
$name =~ /(.+)/;
$name = $1;
if (system("/sbin/e-smith/signal-event", "password-modify", $name) == 0) {
$msg = 'OK';
} else {
$msg = $c->l('iba_ERROR_WHILE_RESETTING_PASSWORD');
@@ -413,52 +369,41 @@ sub reset_password {
$msg = $c->l('iba_CANT_FIND_IBAY');
}
return $msg;
}
} ## end sub reset_password
sub check_password {
my ($c, $password) = @_;
my $strength;
my $rec = $cdb->get('passwordstrength');
$strength = ($rec ? ($rec->prop('Ibays') || 'none') : 'none');
return validate_password( $c, $strength, $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' ) {
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) . ".";
}
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()
@@ -468,18 +413,14 @@ drop down list.
=cut
sub group_list_m {
my @groups = $adb->groups();
my @grps = ( ['Admin' => 'admin'], ['Everyone' => 'shared']);
my @grps = ([ 'Admin' => 'admin' ], [ 'Everyone' => 'shared' ]);
foreach my $g (@groups) {
push @grps, [ $g->prop('Description')." (". $g->key.")", $g->key() ];
push @grps, [ $g->prop('Description') . " (" . $g->key . ")", $g->key() ];
}
return \@grps;
}
} ## end sub group_list_m
=head2 userAccess_list
@@ -489,13 +430,13 @@ drop down list.
=cut
sub userAccess_list_m {
my $c = shift;
return [[ $c->l('WARG') => 'wr-admin-rd-group'],
[ $c->l('WGRE') => 'wr-group-rd-everyone'],
[ $c->l('WGRG') => 'wr-group-rd-group']];
}
return [
[ $c->l('WARG') => 'wr-admin-rd-group' ],
[ $c->l('WGRE') => 'wr-group-rd-everyone' ],
[ $c->l('WGRG') => 'wr-group-rd-group' ]
];
} ## end sub userAccess_list_m
=head2 publicAccess_list
@@ -505,19 +446,18 @@ access drop down list.
=cut
sub publicAccess_list_m {
my $c = shift;
return [[ $c->l('NONE') => 'none'],
[ $c->l('LOCAL_NETWORK_NO_PASSWORD') => 'local'],
[ $c->l('LOCAL_NETWORK_PASSWORD') => 'local-pw'],
[ $c->l('ENTIRE_INTERNET_NO_PASSWORD') => 'global'],
[ $c->l('ENTIRE_INTERNET_PASSWORD') => 'global-pw'],
[ $c->l('ENTIRE_INTERNET_PASSWORD_REMOTE') => 'global-pw-remote']];
}
return [
[ $c->l('NONE') => 'none' ],
[ $c->l('LOCAL_NETWORK_NO_PASSWORD') => 'local' ],
[ $c->l('LOCAL_NETWORK_PASSWORD') => 'local-pw' ],
[ $c->l('ENTIRE_INTERNET_NO_PASSWORD') => 'global' ],
[ $c->l('ENTIRE_INTERNET_PASSWORD') => 'global-pw' ],
[ $c->l('ENTIRE_INTERNET_PASSWORD_REMOTE') => 'global-pw-remote' ]
];
} ## end sub publicAccess_list_m
sub max_ibay_name_length {
my ($c, $data) = @_;
$cdb->reload();
my $max = $cdb->get('maxIbayNameLength')->value;
@@ -526,52 +466,42 @@ sub max_ibay_name_length {
return "OK";
} else {
return $c->l('iba_MAX_IBAY_NAME_LENGTH_ERROR', $data, $max, $max);
# {acctName => $data,
# maxIbayNameLength => $max,
# maxLength => $max});
}
}
# {acctName => $data,
# maxIbayNameLength => $max,
# maxLength => $max});
} ## end else [ if (length($data) <= $max)]
} ## end sub max_ibay_name_length
sub conflict_check {
my ($c, $name) = @_;
my $rec = $adb->get($name);
my $type;
if (defined $rec)
{
my $type = $rec->prop('type');
if ($type eq "pseudonym")
{
my $acct = $rec->prop("Account");
my $acct_type = $adb->get($acct)->prop('type');
return $c->l('iba_ACCT_CLASHES_WITH_PSEUDONYM', $name, $acct_type, $acct);
}
}
elsif (defined getpwnam($name) || defined getgrnam($name))
{
if (defined $rec) {
my $type = $rec->prop('type');
if ($type eq "pseudonym") {
my $acct = $rec->prop("Account");
my $acct_type = $adb->get($acct)->prop('type');
return $c->l('iba_ACCT_CLASHES_WITH_PSEUDONYM', $name, $acct_type, $acct);
} ## end if ($type eq "pseudonym")
} elsif (defined getpwnam($name) || defined getgrnam($name)) {
$type = 'system';
}
else
{
} else {
# No account record and no account
return 'OK';
}
return $c->l('iba_ACCOUNT_EXISTS', $name, $type);
}
} ## end sub conflict_check
sub validate_name {
my ($c, $acctName) = @_;
unless ($acctName =~ /^([a-z][\_\.\-a-z0-9]*)$/)
{
unless ($acctName =~ /^([a-z][\_\.\-a-z0-9]*)$/) {
return $c->l('iba_ACCT_NAME_HAS_INVALID_CHARS', $acctName);
}
return "OK";
}
} ## end sub validate_name
1

View File

@@ -9,29 +9,18 @@ package SrvMngr::Controller::Initial;
#----------------------------------------------------------------------
use strict;
use warnings;
use Mojo::Base 'Mojolicious::Controller';
use Locale::gettext;
use SrvMngr::I18N;
use SrvMngr qw(theme_list init_session);
#use SrvMngr::Model::Main;
sub main {
my $c = shift;
$c->app->log->info($c->log_req);
my $title = $c->l('initial_FORM_TITLE');
my $modul = $c->render_to_string(inline => $c->l('initial_FRAMES_BODY'));
$c->stash( title => $title, modul => $modul );
$c->stash(title => $title, modul => $modul);
$c->render(template => 'initial');
}
} ## end sub main
1;

View File

@@ -10,37 +10,27 @@ package SrvMngr::Controller::Legacypanel;
#
# routes : end
#----------------------------------------------------------------------
use strict;
use warnings;
use Mojo::Base 'Mojolicious::Controller';
use Locale::gettext;
use SrvMngr::I18N;
use SrvMngr qw(theme_list init_session);
#use SrvMngr::Model::Main;
sub main {
my $c = shift;
$c->app->log->info($c->log_req);
my $title = $c->l('legacy panel');
my $legacy_url = $c->param('url');
my $title = $c->l('legacy panel');
my $legacy_url = $c->param('url');
my $legacy_height = $c->param('height') | 600;
$c->stash( title => $title, modul => $legacy_url, height => $legacy_height );
$c->stash(title => $title, modul => $legacy_url, height => $legacy_height);
$c->render(template => 'embedded');
}
} ## end sub main
sub getlegacyurl {
my $c = shift;
my $url = shift;
return "/smanager/legacypanel?url=$url";
}
my $c = shift;
my $url = shift;
return "/smanager/legacypanel?url=$url";
} ## end sub getlegacyurl
1;

View File

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

View File

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

View File

@@ -4,13 +4,12 @@ package SrvMngr::Controller::Localnetworks;
# heading : Network
# description : Local networks
# navigation : 6000 500
#
#
# routes : end
#----------------------------------------------------------------------
use strict;
use warnings;
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);
@@ -18,246 +17,223 @@ 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");
my $ret = "OK";
sub main {
my $c = shift;
$c->app->log->info( $c->log_req );
$c->app->log->info($c->log_req);
my %ln_datas = ();
$ln_datas{return} = "";
my $title = $c->l('ln_LOCAL NETWORKS');
my $modul = '';
$ln_datas{trt} = 'LIST';
my @localnetworks;
if ($network_db) {
@localnetworks = $network_db->get_all_by_prop( type => 'network' );
}
if ($network_db) {
@localnetworks = $network_db->get_all_by_prop(type => 'network');
}
$c->stash(
title => $title,
modul => $modul,
ln_datas => \%ln_datas,
localnetworks => \@localnetworks
);
$c->render( template => 'localnetworks' );
}
$c->render(template => 'localnetworks');
} ## end sub main
sub do_display {
my $c = shift;
$c->app->log->info( $c->log_req );
my $rt = $c->current_route;
my $trt = ( $c->param('trt') || 'LIST' );
$trt = 'DEL' if ( $rt eq 'localnetworksdel' );
$trt = 'ADD' if ( $rt eq 'localnetworksadd' );
$trt = 'ADD1' if ( $rt eq 'localnetworksadd1' );
$trt = 'DEL1' if ( $rt eq 'localnetworksdel1' );
$c->app->log->info($c->log_req);
my $rt = $c->current_route;
my $trt = ($c->param('trt') || 'LIST');
$trt = 'DEL' if ($rt eq 'localnetworksdel');
$trt = 'ADD' if ($rt eq 'localnetworksadd');
$trt = 'ADD1' if ($rt eq 'localnetworksadd1');
$trt = 'DEL1' if ($rt eq 'localnetworksdel1');
my %ln_datas = ();
my $title = $c->l('ln_LOCAL NETWORKS');
my $modul = '';
if ( $trt eq 'ADD' ) {
#Add a network - called from the list panel
# Nothing to do here...as just need fields to input data.
if ($trt eq 'ADD') {
}
#Add a network - called from the list panel
# Nothing to do here...as just need fields to input data.
} ## end if ($trt eq 'ADD')
if ( $trt eq 'ADD1' ) {
#Add a network - called after new network details filled in
my %ret = add_network($c);
#Return to list page if success
if ((index($ret{ret},"SUCCESS") != -1)) {
$trt = "LIST";
} else {
#Error - return to Add page
$trt = "ADD";
}
$network_db = esmith::NetworksDB->open() || die("Failed to open Networkdb-3"); #Refresh the network DB
$c->stash(ret=>\%ret); #stash it away for the template
}
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");
#Add a network - called after new network details filled in
my %ret = add_network($c);
#Return to list page if success
if ((index($ret{ret}, "SUCCESS") != -1)) {
$trt = "LIST";
} else {
#Error - return to Add page
$trt = "ADD";
}
$network_db = esmith::NetworksDB->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");
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");
if ( $rec and $rec->prop('type') eq '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");
if ($rec and $rec->prop('type') eq 'localnetwork') {
$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
my %ret = remove_network($localnetwork, $delete_hosts);
$network_db = esmith::NetworksDB->open() || die("Failed to open Networkdb-2"); #Refresh the network DB
my @localnetworks;
if ($network_db) {
@localnetworks = $network_db->get_all_by_prop( type => 'network' );
}
# Load up ln_datas with values need by template
$ln_datas{subnet} = $rec->prop('Mask');
$ln_datas{router} = $rec->prop('Router');
$c->stash( ln_datas => \%ln_datas, localnetworks => \@localnetworks ,ret =>\%ret);
}
if ( $trt eq 'DEL' ) {
#Initial delete panel requiring confirmation
my $localnetwork = $c->param("localnetwork") || '';
$c->stash(localnetwork=>$localnetwork);
if ($network_db) {
@localnetworks = $network_db->get_all_by_prop(type => 'network');
}
# Load up ln_datas with values need by template
$ln_datas{subnet} = $rec->prop('Mask');
$ln_datas{router} = $rec->prop('Router');
$c->stash(ln_datas => \%ln_datas, localnetworks => \@localnetworks, ret => \%ret);
} ## end if ($trt eq 'DEL1')
if ($trt eq 'DEL') {
#Initial delete panel requiring confirmation
my $localnetwork = $c->param("localnetwork") || '';
$c->stash(localnetwork => $localnetwork);
my $rec = $network_db->get($localnetwork) || die("Failed to get local network in db::$localnetwork");
my $subnet = $rec->prop('Mask');
$ln_datas{subnet} = $subnet;
$ln_datas{router} = $rec->prop('Router');
my $numhosts = hosts_on_network($localnetwork,$subnet);
my $numhosts = hosts_on_network($localnetwork, $subnet);
$ln_datas{localnetwork} = $localnetwork;
$ln_datas{deletehosts} = $numhosts>0?1:0;
}
$ln_datas{deletehosts} = $numhosts > 0 ? 1 : 0;
} ## end if ($trt eq 'DEL')
if ( $trt eq 'LIST' ) {
#List all the networks
if ($trt eq 'LIST') {
#List all the networks
my @localnetworks;
if ($network_db) {
@localnetworks = $network_db->get_all_by_prop( type => 'network' );
@localnetworks = $network_db->get_all_by_prop(type => 'network');
}
$c->stash( localnetworks => \@localnetworks );
## $c->redirect_to('/localnetworks');
}
$c->stash(localnetworks => \@localnetworks);
## $c->redirect_to('/localnetworks');
} ## end if ($trt eq 'LIST')
$ln_datas{'trt'} = $trt;
$c->stash( title => $title, modul => $modul, ln_datas => \%ln_datas );
$c->render( template => 'localnetworks' );
}
$c->stash(title => $title, modul => $modul, ln_datas => \%ln_datas);
$c->render(template => 'localnetworks');
} ## end sub do_display
sub remove_network {
my $network = shift;
my $network_db = esmith::NetworksDB->open();
my $record = $network_db->get($network);
my $delete_hosts = shift;
my $network = shift;
my $network_db = esmith::NetworksDB->open();
my $record = $network_db->get($network);
my $delete_hosts = shift;
if ( my $record = $network_db->get($network) ) {
if (my $record = $network_db->get($network)) {
my $subnet = $record->prop('Mask');
my $router = $record->prop('Router');
$record->set_prop( type => 'network-deleted' );
$record->set_prop(type => 'network-deleted');
# Untaint $network before use in system()
$network =~ /(.+)/;
$network = $1;
if ( system( "/sbin/e-smith/signal-event", "network-delete", $network ) == 0 ) {
if (system("/sbin/e-smith/signal-event", "network-delete", $network) == 0) {
if ($delete_hosts) {
my @hosts_to_delete = hosts_on_network( $network, $subnet );
my @hosts_to_delete = hosts_on_network($network, $subnet);
foreach my $host (@hosts_to_delete) {
$host->delete;
}
}
} ## end if ($delete_hosts)
$record->delete;
return (ret=>'ln_SUCCESS_REMOVED_NETWORK',vars=>"$network,$subnet,$router");
}
else {
return (ret=>"ln_ERROR_DELETING_NETWORK");
return (ret => 'ln_SUCCESS_REMOVED_NETWORK', vars => "$network,$subnet,$router");
} else {
return (ret => "ln_ERROR_DELETING_NETWORK");
}
} else {
return (ret => "ln_NO_SUCH_NETWORK");
}
else {
return (ret=>"ln_NO_SUCH_NETWORK");
}
}
} ## end sub remove_network
sub hosts_on_network {
my $network = shift;
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 @localhosts = grep { $_->prop('HostType') eq 'Local' } $hosts->hosts;
my $cidr = "$network/$netmask";
my $hosts = esmith::HostsDB->open() || die("Couldn't open hosts db");
my @localhosts = grep { $_->prop('HostType') eq 'Local' } $hosts->hosts;
my @hosts_on_network = ();
foreach my $host (@localhosts) {
my $ip = $host->prop('InternalIP') || "";
if ($ip) {
if ( Net::IPv4Addr::ipv4_in_network( $cidr, $ip ) ) {
if (Net::IPv4Addr::ipv4_in_network($cidr, $ip)) {
push @hosts_on_network, $host;
}
}
}
} ## end if ($ip)
} ## end foreach my $host (@localhosts)
return @hosts_on_network if wantarray;
return scalar @hosts_on_network;
}
} ## end sub hosts_on_network
sub add_network
{
sub add_network {
my ($fm) = @_;
my $networkAddress = $fm->param('networkAddress');
my $networkMask = $fm->param('networkMask');
my $networkRouter = $fm->param('networkRouter');
#Validate Ips and subnet mask
my $res = ip_number($fm, $networkAddress);
return (ret=>'ln_INVALID_IP_ADDRESS', vars=>"Network Address $res") unless $res eq 'OK';
$res = subnet_mask( $networkMask );
return (ret=>'ln_INVALID_SUBNET_MASK', vars=>"$networkMask" ) unless $res eq 'OK';
return (ret => 'ln_INVALID_IP_ADDRESS', vars => "Network Address $res") unless $res eq 'OK';
$res = subnet_mask($networkMask);
return (ret => 'ln_INVALID_SUBNET_MASK', vars => "$networkMask") unless $res eq 'OK';
$res = ip_number($fm, $networkRouter);
return (ret=>'ln_INVALID_IP_ADDRESS' , vars=>"Routeur Address $res") unless $res eq 'OK';
return (ret => 'ln_INVALID_IP_ADDRESS', vars => "Routeur Address $res") unless $res eq 'OK';
# we transform bit mask to regular mask
$networkMask = get_reg_mask( $networkAddress, $networkMask );
$networkMask = get_reg_mask($networkAddress, $networkMask);
my $network_db = esmith::NetworksDB->open()
|| esmith::NetworksDB->create();
my $config_db = esmith::ConfigDB->open();
|| esmith::NetworksDB->create();
my $config_db = esmith::ConfigDB->open();
my $localIP = $config_db->get('LocalIP');
my $localNetmask = $config_db->get('LocalNetmask');
my ( $localNetwork, $localBroadcast ) =
esmith::util::computeNetworkAndBroadcast( $localIP->value(),
$localNetmask->value() );
my ( $routerNetwork, $routerBroadcast ) =
esmith::util::computeNetworkAndBroadcast( $networkRouter,
$localNetmask->value() );
my ($localNetwork, $localBroadcast)
= esmith::util::computeNetworkAndBroadcast($localIP->value(), $localNetmask->value());
my ($routerNetwork, $routerBroadcast)
= esmith::util::computeNetworkAndBroadcast($networkRouter, $localNetmask->value());
# Note to self or future developers:
# the following tests should probably be validation routines
# in the form itself, but it just seemed too fiddly to do that
# at the moment. -- Skud 2002-04-11
# I agree --bjr 2020-04-18
if ( $routerNetwork ne $localNetwork )
{
return (ret=>'ln_NOT_ACCESSIBLE_FROM_LOCAL_NETWORK');
if ($routerNetwork ne $localNetwork) {
return (ret => 'ln_NOT_ACCESSIBLE_FROM_LOCAL_NETWORK');
}
my ($network, $broadcast) = esmith::util::computeNetworkAndBroadcast($networkAddress, $networkMask);
if ($network eq $localNetwork) {
return (ret => 'ln_NETWORK_ALREADY_LOCAL');
}
my ( $network, $broadcast ) =
esmith::util::computeNetworkAndBroadcast( $networkAddress, $networkMask );
if ( $network eq $localNetwork )
{
return (ret=>'ln_NETWORK_ALREADY_LOCAL');
if ($network_db->get($network)) {
return (ret => 'ln_NETWORK_ALREADY_ADDED');
}
if ( $network_db->get($network) )
{
return (ret=>'ln_NETWORK_ALREADY_ADDED');
}
$network_db->new_record(
$network,
{
Mask => $networkMask,
{ Mask => $networkMask,
Router => $networkRouter,
type => 'network',
}
@@ -266,26 +242,26 @@ sub add_network
# Untaint $network before use in system()
$network =~ /(.+)/;
$network = $1;
system( "/sbin/e-smith/signal-event", "network-create", $network ) == 0
or ( return (ret=>'ln_ERROR_CREATING_NETWORK' ));
my ( $totalHosts, $firstAddr, $lastAddr ) =
esmith::util::computeHostRange( $network, $networkMask );
system("/sbin/e-smith/signal-event", "network-create", $network) == 0
or (return (ret => 'ln_ERROR_CREATING_NETWORK'));
my ($totalHosts, $firstAddr, $lastAddr) = esmith::util::computeHostRange($network, $networkMask);
my $msg;
if ( $totalHosts == 1 )
if ($totalHosts == 1) {
return (ret => 'ln_SUCCESS_SINGLE_ADDRESS', vars => "$network,$networkMask,$networkRouter");
} elsif (($totalHosts == 256)
|| ($totalHosts == 65536)
|| ($totalHosts == 16777216))
{
return (ret=>'ln_SUCCESS_SINGLE_ADDRESS',vars=>"$network,$networkMask,$networkRouter");
}
elsif (( $totalHosts == 256 )
|| ( $totalHosts == 65536 )
|| ( $totalHosts == 16777216 ) )
{
return ( ret=>'ln_SUCCESS_NETWORK_RANGE',vars=>"$network,$networkMask,$networkRouter,$totalHosts,$firstAddr,$lastAddr");
}
else
{ my $simpleMask = esmith::util::computeLocalNetworkPrefix( $network, $networkMask );
return ( ret => 'ln_SUCCESS_NONSTANDARD_RANGE',
vars=>"$network,$networkMask,$networkRouter,$totalHosts,$firstAddr,$lastAddr,$simpleMask");
}
}
return (
ret => 'ln_SUCCESS_NETWORK_RANGE',
vars => "$network,$networkMask,$networkRouter,$totalHosts,$firstAddr,$lastAddr"
);
} else {
my $simpleMask = esmith::util::computeLocalNetworkPrefix($network, $networkMask);
return (
ret => 'ln_SUCCESS_NONSTANDARD_RANGE',
vars => "$network,$networkMask,$networkRouter,$totalHosts,$firstAddr,$lastAddr,$simpleMask"
);
} ## end else [ if ($totalHosts == 1) ]
} ## end sub add_network

View File

@@ -8,266 +8,215 @@ package SrvMngr::Controller::Login;
#
# routes : end
#----------------------------------------------------------------------
# for information
# $r->get('/login')->to('login#main')->name('login');
# $r->post('/login')->to('login#login')->name('signin');
# $r->get('/login2')->to('login#pwdrescue')->name('pwdresc');
# $r->get('/loginc')->to('login#confpwd')->name('resetpwdconf');
# for information
use strict;
use warnings;
use Mojo::Base 'Mojolicious::Controller';
use Locale::gettext;
use esmith::AccountsDB;
use SrvMngr::I18N;
use SrvMngr::Model::Main;
use SrvMngr qw( theme_list init_session );
my $MAX_LOGIN_ATTEMPTS = 3;
my $DURATION_BLOCKED = 30 * 60; # access blocked for 30 min
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
my $RESET_DURATION = 2 * 60 * 60; # 2 hours for resetting
our $adb = esmith::AccountsDB->open() or die "Couldn't open DB Accounts\n";
my $allowed_user_re = qr/^\w{5,10}$/;
my %Login_Attempts;
sub main {
my $c = shift;
$c->stash( trt => 'NORM' );
$c->render('login');
}
my $c = shift;
$c->stash(trt => 'NORM');
$c->render('login');
} ## end sub main
sub login {
my $c = shift;
my $trt = $c->param('Trt');
my $c = shift;
my $trt = $c->param('Trt');
# password reset request
if ( $trt eq 'RESET' ) {
my $res = $c->mail_rescue();
if ( $res ne 'OK' ) {
$c->stash( error => $res, trt => $trt );
return $c->render('login');
}
$c->flash( success => $c->l('use_RESET_REGISTERED') );
record_login_attempt($c, 'RESET');
return $c->redirect_to( $c->home_page );
}
if ($trt eq 'RESET') {
my $res = $c->mail_rescue();
if ($res ne 'OK') {
$c->stash(error => $res, trt => $trt);
return $c->render('login');
}
$c->flash(success => $c->l('use_RESET_REGISTERED'));
record_login_attempt($c, 'RESET');
return $c->redirect_to($c->home_page);
} ## end if ($trt eq 'RESET')
# normal loggin
my $name = $c->param('Username');
my $pass = $c->param('Password');
my $from = $c->param('From');
my $name = $c->param('Username');
my $pass = $c->param('Password');
my $from = $c->param('From');
if ( is_denied($c) ) {
$c->stash( error => $c->l('use_TOO_MANY_LOGIN'), trt => 'NORM' );
return $c->render('login');
}
# untaint
unless ( ($name =~ /^([a-z][\-\_\.a-z0-9]*)$/) && ($pass =~ /^([ -~]+)$/) ) {
record_login_attempt($c, 'FAILED');
$c->stash( error => $c->l('use_INVALID_DATA'), trt => 'NORM' );
return $c->render('login');
}
my $alias = SrvMngr::Model::Main->check_adminalias( $c );
if ( $alias ) {
if ( $name eq $alias ) {
$name = 'admin';
} elsif ( $name eq 'admin' ) {
record_login_attempt($c, 'FAILED');
$c->stash( error => $c->l('use_SORRY'), trt => 'NORM' );
return $c->render('login');
if (is_denied($c)) {
$c->stash(error => $c->l('use_TOO_MANY_LOGIN'), trt => 'NORM');
return $c->render('login');
}
}
if (SrvMngr::Model::Main->check_credentials($name, $pass)) {
$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' ) {
$c->session(is_admin => 1);
# untaint
unless (($name =~ /^([a-z][\-\_\.a-z0-9]*)$/) && ($pass =~ /^([ -~]+)$/)) {
record_login_attempt($c, 'FAILED');
$c->stash(error => $c->l('use_INVALID_DATA'), trt => 'NORM');
return $c->render('login');
}
my $alias = SrvMngr::Model::Main->check_adminalias($c);
if ($alias) {
if ($name eq $alias) {
$name = 'admin';
} elsif ($name eq 'admin') {
record_login_attempt($c, 'FAILED');
$c->stash(error => $c->l('use_SORRY'), trt => 'NORM');
return $c->render('login');
}
} ## end if ($alias)
if (SrvMngr::Model::Main->check_credentials($name, $pass)) {
$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') {
$c->session(is_admin => 1);
} else {
$c->session(is_admin => 0);
}
$c->session(expiration => 600); # expire this session in 10 minutes
$c->flash(success => $c->l('use_WELCOME'));
record_login_attempt($c, 'SUCCESS');
} else {
$c->session(is_admin => 0);
}
$c->session(expiration => 600); # expire this session in 10 minutes
$c->flash( success => $c->l('use_WELCOME') );
record_login_attempt($c, 'SUCCESS');
} else {
record_login_attempt($c, 'FAILED');
sleep $TIMEOUT_FAILED_LOGIN;
$c->stash( error => $c->l('use_SORRY'), trt => 'NORM' );
return $c->render('login');
}
$from = $c->home_page if ( $from eq 'login' );
$c->redirect_to( $from );
}
record_login_attempt($c, 'FAILED');
sleep $TIMEOUT_FAILED_LOGIN;
$c->stash(error => $c->l('use_SORRY'), trt => 'NORM');
return $c->render('login');
} ## end else [ if (SrvMngr::Model::Main...)]
$from = $c->home_page if ($from eq 'login');
$c->redirect_to($from);
} ## end sub login
sub pwdrescue {
my $c = shift;
$c->stash( trt => 'RESET' );
$c->render('login');
}
my $c = shift;
$c->stash(trt => 'RESET');
$c->render('login');
} ## end sub pwdrescue
sub mail_rescue {
my $c = shift;
my $name = $c->param('Username');
my $from = $c->param('From');
my $res;
$res .= $c->l('use_TOO_MANY_LOGIN') if (is_denied($c));
my $c = shift;
my $name = $c->param('Username');
my $from = $c->param('From');
my $res;
$res .= $c->l('use_TOO_MANY_LOGIN') if ( is_denied($c) );
# untaint
if ( ! $res && $name !~ /^([a-z][\-\_\.a-z0-9]*)$/ ) {
record_login_attempt($c, 'FAILED');
$res .= $c->l('use_ERR_NAME');
}
if ( ! $res && $name eq 'admin' ) {
$res .= $c->l('use_NOT_THAT_OPER');
}
# user exists ?
if ( ! $res ) {
my $acct = $adb->get($name);
if ( ! $acct || $acct->prop('type') ne "user" || $acct->prop('PasswordSet') ne 'yes' ) {
$res .= $c->l('use_NOT_THAT_OPER');
}
# untaint
if (!$res && $name !~ /^([a-z][\-\_\.a-z0-9]*)$/) {
record_login_attempt($c, 'FAILED');
$res .= $c->l('use_ERR_NAME');
}
if (!$res && $name eq 'admin') {
$res .= $c->l('use_NOT_THAT_OPER');
}
# user exists ?
if (!$res) {
my $acct = $adb->get($name);
if (!$acct || $acct->prop('type') ne "user" || $acct->prop('PasswordSet') ne 'yes') {
$res .= $c->l('use_NOT_THAT_OPER');
}
} ## end if (!$res)
return $res if $res;
# send email
my $email = $name .'@'. $c->session->{DomainName};
# send email
my $email = $name . '@' . $c->session->{DomainName};
my $until = time() + $RESET_DURATION;
$c->pwdrst->{$name} = {
email => $email,
date => $until,
confirmed => 0,
};
my $jwt = $c->jwt->claims({ username => $name })->encode;
my $url = $c->url_for('loginc')->to_abs->query(jwt => $jwt);
$c->pwdrst->{$name} = {
email => $email,
date => $until,
confirmed => 0,
};
my $jwt = $c->jwt->claims({username => $name})->encode;
my $url = $c->url_for('loginc')->to_abs->query(jwt => $jwt);
# $c->email( $email, $c->l('use_CONFIRM_RESET'), $c->render_to_string(inline => $c->l('use_GO_TO_URL', $url) ) );
# directly (without minion)
$c->send_email( $email, $c->l('use_CONFIRM_RESET'), $c->render_to_string(inline => $c->l('use_GO_TO_URL', $url) ) );
return 'OK';
}
# $c->email( $email, $c->l('use_CONFIRM_RESET'), $c->render_to_string(inline => $c->l('use_GO_TO_URL', $url) ) );
# directly (without minion)
$c->send_email($email, $c->l('use_CONFIRM_RESET'), $c->render_to_string(inline => $c->l('use_GO_TO_URL', $url)));
return 'OK';
} ## end sub mail_rescue
sub logout {
my $c = shift;
$c->app->log->info($c->log_req);
$c->session( expires => 1 );
$c->flash( success => $c->l('use_BYE') );
$c->flash( error => 'Byegood' );
$c->redirect_to( $c->home_page );
}
my $c = shift;
$c->app->log->info($c->log_req);
$c->session(expires => 1);
$c->flash(success => $c->l('use_BYE'));
$c->flash(error => 'Byegood');
$c->redirect_to($c->home_page);
} ## end sub logout
sub confpwd {
my $c = shift;
my $jwt = $c->param('jwt');
my $name = $c->jwt->decode($jwt)->{username};
my $c = shift;
my $jwt = $c->param('jwt');
my $name = $c->jwt->decode($jwt)->{username};
# request already treated or outdated
if ( $c->pwdrst->{$name}{confirmed} != 0 or $c->pwdrst->{$name}{date} < time() ) {
$c->flash( error => $c->l('use_INVALID_REQUEST'));
return $c->redirect_to( $c->home_page );
}
if ($c->pwdrst->{$name}{confirmed} != 0 or $c->pwdrst->{$name}{date} < time()) {
$c->flash(error => $c->l('use_INVALID_REQUEST'));
return $c->redirect_to($c->home_page);
}
# reset password for this account
$c->pwdrst->{$name}{confirmed} = 1;
$c->flash( success => $c->l('use_OK_FOR_RESET') );
$c->pwdrst->{$name}{confirmed} = 1;
$c->flash(success => $c->l('use_OK_FOR_RESET'));
# call userpassword with encoded name
my $url = $c->url_for('userpasswordr')->to_abs->query(jwt => $jwt);
my $url = $c->url_for('userpasswordr')->to_abs->query(jwt => $jwt);
# warn "confpwd: " . $url . "\n";
return $c->redirect_to( $url );
}
return $c->redirect_to($url);
} ## end sub confpwd
sub record_login_attempt {
my ($c, $result) = @_;
my $user = $c->param('Username');
my $ip_address = $c->tx->remote_address;
my ($c, $result) = @_;
my $user = $c->param('Username');
my $ip_address = $c->tx->remote_address;
if ($result eq 'RESET') {
$c->app->log->info(join "\t", "Password reset requested for : $user at ", $ip_address);
} elsif ($result eq 'SUCCESS') {
$c->app->log->info(join "\t", "Login succeeded: $user", $ip_address);
$Login_Attempts{$ip_address}->{tries} = 0; # reset the number of login attempts
} else {
$c->app->log->info(join "\t", "Login FAILED: $user", $ip_address);
$Login_Attempts{$ip_address}->{tries}++;
if ( $Login_Attempts{$ip_address}->{tries} > $MAX_LOGIN_ATTEMPTS ) {
$Login_Attempts{$ip_address}->{denied_until} = time() + $DURATION_BLOCKED;
}
}
}
if ($result eq 'RESET') {
$c->app->log->info(join "\t", "Password reset requested for : $user at ", $ip_address);
} elsif ($result eq 'SUCCESS') {
$c->app->log->info(join "\t", "Login succeeded: $user", $ip_address);
$Login_Attempts{$ip_address}->{tries} = 0; # reset the number of login attempts
} else {
$c->app->log->info(join "\t", "Login FAILED: $user", $ip_address);
$Login_Attempts{$ip_address}->{tries}++;
if ($Login_Attempts{$ip_address}->{tries} > $MAX_LOGIN_ATTEMPTS) {
$Login_Attempts{$ip_address}->{denied_until} = time() + $DURATION_BLOCKED;
}
} ## end else [ if ($result eq 'RESET')]
} ## end sub record_login_attempt
sub is_denied {
my ($c) = @_;
my $ip_address = $c->tx->remote_address;
return unless exists $Login_Attempts{$ip_address}
my ($c) = @_;
my $ip_address = $c->tx->remote_address;
return
unless exists $Login_Attempts{$ip_address}
&& exists $Login_Attempts{$ip_address}->{denied_until};
return 'Denied'
if $Login_Attempts{$ip_address}->{denied_until} > time();
return 'Denied'
if $Login_Attempts{$ip_address}->{denied_until} > time();
# TIMEOUT has expired, reset attempts
delete $Login_Attempts{$ip_address}->{denied_until};
$Login_Attempts{$ip_address}->{tries} = 0;
return;
}
# TIMEOUT has expired, reset attempts
delete $Login_Attempts{$ip_address}->{denied_until};
$Login_Attempts{$ip_address}->{tries} = 0;
return;
} ## end sub is_denied
1;

View File

@@ -8,27 +8,18 @@ package SrvMngr::Controller::Logout;
#
# routes : end
#----------------------------------------------------------------------
use strict;
use warnings;
use Mojo::Base 'Mojolicious::Controller';
use Locale::gettext;
use SrvMngr::I18N;
use SrvMngr qw( theme_list init_session );
sub logout {
my $c = shift;
$c->app->log->info($c->log_req);
$c->session( expires => 1 );
$c->flash( success => 'Goodbye' );
$c->redirect_to( $c->home_page );
}
my $c = shift;
$c->app->log->info($c->log_req);
$c->session(expires => 1);
$c->flash(success => 'Goodbye');
$c->redirect_to($c->home_page);
} ## end sub logout
1;

View File

@@ -10,25 +10,17 @@ package SrvMngr::Controller::Manual;
#----------------------------------------------------------------------
use strict;
use warnings;
use Mojo::Base 'Mojolicious::Controller';
use Locale::gettext;
use SrvMngr::I18N;
use SrvMngr qw(theme_list init_session);
sub main {
my $c = shift;
$c->app->log->info($c->log_req);
my $title = $c->l('manual_FORM_TITLE');
my $modul = $c->render_to_string(inline => $c->l('manual_DESCRIPTION'));
$c->stash( title => $title, modul => $modul);
$c->stash(title => $title, modul => $modul);
$c->render(template => 'manual');
}
} ## end sub main
1;

View File

@@ -1,71 +1,57 @@
package SrvMngr::Controller::Modules;
use strict;
use warnings;
use Mojo::Base 'Mojolicious::Controller';
use Locale::gettext;
use SrvMngr::I18N;
#
# routes : end
#----------------------------------------------------------------------
use SrvMngr qw(theme_list init_session);
sub bugreport {
my $c = shift;
$c->app->log->info($c->log_req);
my $modul = $c->render_to_string( inline => "<p># my (\$lang, \$releaseVersion,
my $modul = $c->render_to_string(
inline => "<p># my (\$lang, \$releaseVersion,
<br># \$c->stash\(\'lang\', \'releaseVer\'
# \'navigation\'</p>");
$c->stash( modul => $modul );
};
# \'navigation\'</p>"
);
$c->stash(modul => $modul);
} ## end sub bugreport
sub support {
my $c = shift;
$c->app->log->info($c->log_req);
my $modul = $c->stash('modul');
$modul .= 'Mail result is 1 + 8.';
$c->stash( modul => $modul, PwdSet => '0', Unsafe => '0' );
$c->stash(modul => $modul, PwdSet => '0', Unsafe => '0');
#$c->render('modules/support');
};
} ## end sub support
sub modsearch {
my $c = shift;
my $c = shift;
my $module = $c->param('module');
$c->app->log->info($c->log_req);
my $redirect_url = SrvMngr->get_mod_url($module);
if($redirect_url ne "-1"){
#$c->render(text => "mod_search: $module to $redirect_url");
if ($redirect_url ne "-1") {
#$c->render(text => "mod_search: $module to $redirect_url");
return $c->redirect_to($redirect_url);
#return $c->redirect_to( url_for($redirect_url) );
}
} ## end if ($redirect_url ne "-1")
#$c->render(text => "mod_search: $module to 'welcome'");
return $c->redirect_to( $c->home_page );
};
return $c->redirect_to($c->home_page);
} ## end sub modsearch
sub whatever {
my $c = shift;
my $c = shift;
my $whatever = $c->param('whatever');
$c->app->log->info($c->log_req . ' ' . $whatever);
$c->render(text => "whatever: /$whatever did not match.", status => 404);
};
} ## end sub whatever
1;

View File

@@ -10,246 +10,246 @@ package SrvMngr::Controller::Portforwarding;
use strict;
use warnings;
use Mojo::Base 'Mojolicious::Controller';
use Locale::gettext;
use SrvMngr::I18N;
use SrvMngr qw(theme_list init_session);
#use Regexp::Common qw /net/;
#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";
my %ret = ();
use constant FALSE => 0;
use constant TRUE => 1;
sub main {
my $c = shift;
$c->app->log->info( $c->log_req );
$c->app->log->info($c->log_req);
my %pf_datas = ();
$pf_datas{return} = "";
my $title = $c->l('pf_FORM_TITLE');
my $modul = '';
$pf_datas{trt} = 'LIST';
my @tcpforwards = $tcp_db->get_all;
my @udpforwards = $udp_db->get_all;
my $empty = 1 if not @tcpforwards and not @udpforwards;
$c->stash(
title => $title,
modul => $modul,
pf_datas => \%pf_datas,
tcpforwards =>\@tcpforwards,
udpforwards =>\@udpforwards,
empty => $empty
my $empty = 1 if not @tcpforwards and not @udpforwards;
$c->stash(
title => $title,
modul => $modul,
pf_datas => \%pf_datas,
tcpforwards => \@tcpforwards,
udpforwards => \@udpforwards,
empty => $empty
);
$c->render( template => 'portforwarding' );
}
$c->render(template => 'portforwarding');
} ## end sub main
sub do_display {
my $c = shift;
$c->app->log->info( $c->log_req );
my $rt = $c->current_route;
my $trt = ( $c->param('trt') || 'LIST' );
$trt = 'DEL' if ( $rt eq 'portforwardingdel' );
$trt = 'ADD' if ( $rt eq 'portforwardingadd' );
$trt = 'ADD1' if ( $rt eq 'portforwardingadd1' );
$trt = 'DEL1' if ( $rt eq 'portforwardingdel1' );
$c->app->log->info($c->log_req);
my $rt = $c->current_route;
my $trt = ($c->param('trt') || 'LIST');
$trt = 'DEL' if ($rt eq 'portforwardingdel');
$trt = 'ADD' if ($rt eq 'portforwardingadd');
$trt = 'ADD1' if ($rt eq 'portforwardingadd1');
$trt = 'DEL1' if ($rt eq 'portforwardingdel1');
my %pf_datas = ();
my $title = $c->l('pf_FORM_TITLE');
my $modul = '';
if ( $trt eq 'ADD' ) {
# Add a portforward- called from the list panel
# Nothing to do here...as just need template to display fields to input data.
if ($trt eq 'ADD') {
}
# Add a portforward- called from the list panel
# Nothing to do here...as just need template to display fields to input data.
} ## end if ($trt eq 'ADD')
if ( $trt eq 'ADD1' ) {
#Add a port forward - called after new pf details filled in
my %ret = add_portforward($c);
#Return to list page if success
if ((index($ret{ret},"SUCCESS") != -1)) {
$trt = "LIST";
} else {
#Error - return to Add page
$trt = "ADD";
}
$c->stash(ret=>\%ret);
}
if ($trt eq 'ADD1') {
if ( $trt eq 'DEL1' ) {
##After Remove clicked on Delete network panel
my $sport = $c->param("sport") || '';
my $proto = $c->param("proto") || '';
#work out which protocol
#Add a port forward - called after new pf details filled in
my %ret = add_portforward($c);
#Return to list page if success
if ((index($ret{ret}, "SUCCESS") != -1)) {
$trt = "LIST";
} else {
#Error - return to Add page
$trt = "ADD";
}
$c->stash(ret => \%ret);
} ## end if ($trt eq 'ADD1')
if ($trt eq 'DEL1') {
##After Remove clicked on Delete network panel
my $sport = $c->param("sport") || '';
my $proto = $c->param("proto") || '';
#work out which protocol
my $fdb;
if ($proto eq 'TCP') {
$fdb = $tcp_db;
}
else {
} else {
$fdb = $udp_db;
}
#check that the sport is in the db
my $entry = $fdb->get($sport) || die("Unable to find sport and proto $sport $proto");
#check that the sport is in the db
my $entry = $fdb->get($sport) || die("Unable to find sport and proto $sport $proto");
$entry->delete;
system( "/sbin/e-smith/signal-event", "portforwarding-update") == 0
or ( die($c->l('pf_ERR_NONZERO_RETURN_EVENT')));
$trt = "LIST";
my %ret = (ret=>"pf_SUCCESS");
$c->stash(ret=>\%ret);
}
system("/sbin/e-smith/signal-event", "portforwarding-update") == 0
or (die($c->l('pf_ERR_NONZERO_RETURN_EVENT')));
$trt = "LIST";
my %ret = (ret => "pf_SUCCESS");
$c->stash(ret => \%ret);
} ## end if ($trt eq 'DEL1')
if ( $trt eq 'DEL' ) {
##Initial delete panel requiring confirmation
my $sport = $c->param("sport") || '';
my $proto = $c->param("proto") || '';
$c->stash(sport=>$sport);
#work out which protocol
if ($trt eq 'DEL') {
##Initial delete panel requiring confirmation
my $sport = $c->param("sport") || '';
my $proto = $c->param("proto") || '';
$c->stash(sport => $sport);
#work out which protocol
my $fdb;
if ($proto eq 'TCP') {
$fdb = $tcp_db;
}
else {
} else {
$fdb = $udp_db;
}
#pull out details and pass to template
my $entry = $fdb->get($sport) || die("Unable to find sport and proto $sport $proto");
#pull out details and pass to template
my $entry = $fdb->get($sport) || die("Unable to find sport and proto $sport $proto");
$pf_datas{proto} = $proto;
$pf_datas{sport} = $sport;
$pf_datas{dhost} = $entry->prop('DestHost');
$pf_datas{dport} = $entry->prop('DestPort') || '';
$pf_datas{cmmnt} = $entry->prop('Comment') || '';
$pf_datas{allow} = $entry->prop('AllowHosts') || '';
}
$pf_datas{cmmnt} = $entry->prop('Comment') || '';
$pf_datas{allow} = $entry->prop('AllowHosts') || '';
} ## end if ($trt eq 'DEL')
if ( $trt eq 'LIST' ) {
#List all the port forwards
my @tcpforwards = $tcp_db->get_all;
my @udpforwards = $udp_db->get_all;
my $empty = 1 if not @tcpforwards and not @udpforwards;
if ($trt eq 'LIST') {
$c->stash(
tcpforwards =>\@tcpforwards,
udpforwards =>\@udpforwards,
empty => $empty
);
#List all the port forwards
my @tcpforwards = $tcp_db->get_all;
my @udpforwards = $udp_db->get_all;
my $empty = 1 if not @tcpforwards and not @udpforwards;
$c->stash(
tcpforwards => \@tcpforwards,
udpforwards => \@udpforwards,
empty => $empty
);
#my %forwards = (TCP=>@tcpforwards,UDP=>@udpforwards);
#$c->stash(portforwarding => %forwards);
}
$pf_datas{'trt'} = $trt;
$c->stash( title => $title, modul => $modul, pf_datas => \%pf_datas );
$c->render( template => 'portforwarding' );
}
#my %forwards = (TCP=>@tcpforwards,UDP=>@udpforwards);
#$c->stash(portforwarding => %forwards);
} ## end if ($trt eq 'LIST')
$pf_datas{'trt'} = $trt;
$c->stash(title => $title, modul => $modul, pf_datas => \%pf_datas);
$c->render(template => 'portforwarding');
} ## end sub do_display
sub add_portforward {
my $c = shift;
my $sport = $c->param("sport") || '';
my $proto = $c->param("proto") || '';
#work out which protocol
my $fdb;
if ($proto eq 'TCP') {
$fdb = $tcp_db;
}
else {
$fdb = $udp_db;
}
#Get the other values
my $dport = $c->param("dport");
my $dhost = get_destination_host($c);
my $cmmnt = $c->param("cmmnt") || "";
my $allow = $c->param("allow") || "";
my $deny = (($c->param("allow")) ? "0.0.0.0/0" : "");
$proto =~ s/^\s+|\s+$//g;
$sport =~ s/^\s+|\s+$//g;
$dport =~ s/^\s+|\s+$//g;
$dhost =~ s/^\s+|\s+$//g;
#Validate the values
%ret=validate_source_port($c) ; unless (index($ret{ret},"SUCCESS")!= -1) {return %ret;}
%ret=validate_allowed_hosts($c) ; if (index($ret{ret},"SUCCESS")== -1) {return %ret;}
%ret=validate_destination_port($c) ; if (index($ret{ret},"SUCCESS")== -1) {return %ret;}
%ret=validate_destination_host($c) ; if (index($ret{ret},"SUCCESS")== -1) {return %ret;}
# and then write it to the DB and tell the exec about it.
my $entry = $fdb->get($sport) || $fdb->new_record($sport, { type => 'forward' });
$entry->set_prop('DestHost', $dhost);
$entry->set_prop('DestPort', $dport) if $dport;
$entry->set_prop('Comment', $cmmnt);
$entry->set_prop('AllowHosts', $allow);
$entry->set_prop('DenyHosts', $deny);
system( "/sbin/e-smith/signal-event", "portforwarding-update") == 0
or ( return (ret=>'pf_ERR_NONZERO_RETURN_EVENT' ));
my %ret = (ret=>"pf_SUCCESS");
return %ret;
}
my $c = shift;
my $sport = $c->param("sport") || '';
my $proto = $c->param("proto") || '';
sub get_destination_host
{
my $q = shift;
my $dhost = $q->param("dhost");
my $localip = $db->get_prop('InternalInterface', 'IPAddress');
#work out which protocol
my $fdb;
if ($proto eq 'TCP') {
$tcp_db = esmith::ConfigDB->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";
$fdb = $udp_db;
}
#Get the other values
my $dport = $c->param("dport");
my $dhost = get_destination_host($c);
my $cmmnt = $c->param("cmmnt") || "";
my $allow = $c->param("allow") || "";
my $deny = (($c->param("allow")) ? "0.0.0.0/0" : "");
$proto =~ s/^\s+|\s+$//g;
$sport =~ s/^\s+|\s+$//g;
$dport =~ s/^\s+|\s+$//g;
$dhost =~ s/^\s+|\s+$//g;
#Validate the values
%ret = validate_source_port($c);
unless (index($ret{ret}, "SUCCESS") != -1) { return %ret; }
%ret = validate_allowed_hosts($c);
if (index($ret{ret}, "SUCCESS") == -1) { return %ret; }
%ret = validate_destination_port($c);
if (index($ret{ret}, "SUCCESS") == -1) { return %ret; }
%ret = validate_destination_host($c);
if (index($ret{ret}, "SUCCESS") == -1) { return %ret; }
# and then write it to the DB and tell the exec about it.
my $entry = $fdb->get($sport) || $fdb->new_record($sport, { type => 'forward' });
$entry->set_prop('DestHost', $dhost);
$entry->set_prop('DestPort', $dport) if $dport;
$entry->set_prop('Comment', $cmmnt);
$entry->set_prop('AllowHosts', $allow);
$entry->set_prop('DenyHosts', $deny);
system("/sbin/e-smith/signal-event", "portforwarding-update") == 0
or (return (ret => 'pf_ERR_NONZERO_RETURN_EVENT'));
my %ret = (ret => "pf_SUCCESS");
return %ret;
} ## end sub add_portforward
sub get_destination_host {
my $q = shift;
my $dhost = $q->param("dhost");
my $localip = $db->get_prop('InternalInterface', 'IPAddress');
my $external_ip = $db->get_prop('ExternalInterface', 'IPAddress') || $localip;
if ($dhost =~ /^(127.0.0.1|$localip|$external_ip)$/i)
{
if ($dhost =~ /^(127.0.0.1|$localip|$external_ip)$/i) {
# localhost token gets expanded at runtime to current external IP
$dhost = 'localhost';
}
} ## end if ($dhost =~ /^(127.0.0.1|$localip|$external_ip)$/i)
return $dhost;
}
} ## end sub get_destination_host
sub validate_source_port {
my $q = shift;
my $q = shift;
my $sport = $q->param('sport');
$sport =~ s/^\s+|\s+$//g;
# If this is a port range, split it up and validate it individually.
my @ports = ();
if ($sport =~ /-/)
{
if ($sport =~ /-/) {
@ports = split /-/, $sport;
if (@ports > 2)
{
if (@ports > 2) {
#$self->debug_msg("found more than 2 ports: @ports");
return (ret=>'pf_ERR_BADPORT');
}
}
else
{
return (ret => 'pf_ERR_BADPORT');
} ## end if (@ports > 2)
} else {
push @ports, $sport;
}
#$self->debug_msg("the ports array is: @ports");
foreach my $port (@ports)
{
foreach my $port (@ports) {
#$self->debug_msg("looping on port $port");
if (! isValidPort($port))
{
if (!isValidPort($port)) {
#$self->debug_msg("returning: " . $self->localise('ERR_BADPORT'));
return (ret=>'pf_ERR_BADPORT');
return (ret => 'pf_ERR_BADPORT');
}
}
# Now, lets screen any duplicates.
} ## end foreach my $port (@ports)
# Now, lets screen any duplicates.
my $protocol = $q->param('protocol');
my @forwards = ();
@@ -259,152 +259,135 @@ sub validate_source_port {
} elsif ($protocol eq 'UDP') {
@forwards = map { $_->key } $udp_db->get_all;
}
foreach my $psport (@forwards)
{
if (detect_collision($sport, $psport))
{
return (ret=>'pf_ERR_PORT_COLLISION');
}
}
return (ret=>"pf_SUCCESS");
}
sub detect_collision
{
foreach my $psport (@forwards) {
if (detect_collision($sport, $psport)) {
return (ret => 'pf_ERR_PORT_COLLISION');
}
} ## end foreach my $psport (@forwards)
return (ret => "pf_SUCCESS");
} ## end sub validate_source_port
sub detect_collision {
my $port_a = shift;
my $port_b = shift;
# If they're both single ports, see if they're the same.
if (($port_a !~ /-/) && ($port_b !~ /-/))
{
if (($port_a !~ /-/) && ($port_b !~ /-/)) {
return $port_a eq $port_b;
}
# If port_a is not a range but port_b is, is a in b?
elsif ($port_a !~ /-/)
{
elsif ($port_a !~ /-/) {
my ($b1, $b2) = split /-/, $port_b;
return (($port_a >= $b1) && ($port_a <= $b2));
}
elsif ($port_b !~ /-/)
{
} elsif ($port_b !~ /-/) {
my ($a1, $a2) = split /-/, $port_a;
return (($port_b >= $a1) && ($port_b <= $a2));
}
else
{
} else {
# They're both ranges. Do they overlap?
my ($a1, $a2) = split /-/, $port_a;
my ($b1, $b2) = split /-/, $port_b;
# They can overlap in two ways. Either a1 is in b, or b1 is in a.
if (($a1 >= $b1) && ($a1 <= $b2))
{
if (($a1 >= $b1) && ($a1 <= $b2)) {
return TRUE;
}
elsif (($b1 >= $a1) && ($b1 <= $a2))
{
} elsif (($b1 >= $a1) && ($b1 <= $a2)) {
return TRUE;
}
return FALSE;
}
}
} ## end else [ if (($port_a !~ /-/) &&...)]
} ## end sub detect_collision
sub validate_destination_port {
my $c = shift;
my $c = shift;
my $dport = $c->param('dport');
$dport =~ s/^\s+|\s+$//g;
# If the dport is empty, that's ok.
return (ret=>'pf_SUCCESS') if not $dport;
# If the dport is empty, that's ok.
return (ret => 'pf_SUCCESS') if not $dport;
# If this is a port range, split it up and validate it individually.
my @ports = ();
if ($dport =~ /-/)
{
if ($dport =~ /-/) {
@ports = split /-/, $dport;
if (@ports > 2)
{
if (@ports > 2) {
#$self->debug_msg("found more than 2 ports: @ports");
return (ret=>'pf_ERR_BADPORT');
}
}
else
{
return (ret => 'pf_ERR_BADPORT');
} ## end if (@ports > 2)
} else {
push @ports, $dport;
}
#$self->debug_msg("the ports array is: @ports");
foreach my $port (@ports) {
foreach my $port (@ports)
{
#$self->debug_msg("looping on port $port");
if (! isValidPort($port))
{
#$self->debug_msg("returning: " . $self->localise('ERR_BADPORT'));
return (ret=>'pf_ERR_BADPORT');
}
}
return (ret=>'pf_SUCCESS');
}
if (!isValidPort($port)) {
#$self->debug_msg("returning: " . $self->localise('ERR_BADPORT'));
return (ret => 'pf_ERR_BADPORT');
}
} ## end foreach my $port (@ports)
return (ret => 'pf_SUCCESS');
} ## end sub validate_destination_port
sub isValidPort() {
my $port = shift;
return FALSE unless defined $port;
if (($port =~ /^\d+$/) &&
($port > 0) &&
($port < 65536))
if ( ($port =~ /^\d+$/)
&& ($port > 0)
&& ($port < 65536))
{
return TRUE;
}
else {
} else {
return FALSE;
}
}
} ## end sub isValidPort
sub validate_destination_host {
my $c = shift;
my $c = shift;
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;
if ($dhost =~ /^(localhost|127.0.0.1|$localip|$external_ip)$/i)
{
# localhost token gets expanded at runtime to current external IP
$c->param(-name=>'dhost', -value=>'localhost');
return (ret=>'pf_SUCCESS');
}
if ($dhost =~ /^(localhost|127.0.0.1|$localip|$external_ip)$/i) {
# localhost token gets expanded at runtime to current external IP
$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');
if ($systemmode eq 'serveronly') {
return (ret=>'pf_IN_SERVERONLY');
return (ret => 'pf_IN_SERVERONLY');
}
if (isValidIP($dhost)) {
return (ret=>'pf_SUCCESS');
return (ret => 'pf_SUCCESS');
} else {
return (ret => 'pf_ERR_BADIP');
}
else {
return (ret=>'pf_ERR_BADIP');
}
}
} ## end sub validate_destination_host
sub validate_allowed_hosts {
my $c = shift;
my $c = shift;
my $ahost = $c->param('allow');
$ahost =~ s/^\s+|\s+$//g;
my %valid_ahost_list = (ret=>"pf_SUCCESS");
my %valid_ahost_list = (ret => "pf_SUCCESS");
foreach (split(/[\s,]+/, $ahost)) {
my $valid_ipnet = 0;
$valid_ipnet = 1 if ($_ =~ m/^\d+\.\d+\.\d+\.\d+$/);
$valid_ipnet = 1 if ($_ =~ m/^\d+\.\d+\.\d+\.\d+\/\d+$/);
%valid_ahost_list = (ret=>"pf_ERR_BADAHOST") if ($valid_ipnet != 1);
}
%valid_ahost_list = (ret => "pf_ERR_BADAHOST") if ($valid_ipnet != 1);
} ## end foreach (split(/[\s,]+/, $ahost...))
return %valid_ahost_list;
}
} ## end sub validate_allowed_hosts
1;

View File

@@ -11,236 +11,198 @@ package SrvMngr::Controller::Printers;
use strict;
use warnings;
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";
sub main {
my $c = shift;
$c->app->log->info($c->log_req);
my %prt_datas = ();
my $title = $c->l('prt_FORM_TITLE');
my $title = $c->l('prt_FORM_TITLE');
$prt_datas{'trt'} = 'LIST';
my @printerDrivers;
if ($adb)
{
if ($adb) {
@printerDrivers = $adb->printers();
}
$c->stash( title => $title, prt_datas => \%prt_datas, printerDrivers => \@printerDrivers );
$c->stash(title => $title, prt_datas => \%prt_datas, printerDrivers => \@printerDrivers);
$c->render(template => 'printers');
};
} ## end sub main
sub do_display {
my $c = shift;
my $rt = $c->current_route;
my $trt = ($c->param('trt') || 'LIST');
my $c = shift;
my $rt = $c->current_route;
my $trt = ($c->param('trt') || 'LIST');
my $printer = $c->param('printer') || '';
#$trt = 'DEL' if ( $printer );
#$trt = 'ADD' if ( $rt eq 'printeradd' );
my %prt_datas = ();
my $title = $c->l('prt_FORM_TITLE');
my $title = $c->l('prt_FORM_TITLE');
$prt_datas{'trt'} = $trt;
if ( $trt eq 'ADD' ) {
if ($trt eq 'ADD') {
# nothing
# nothing
}
if ($trt eq 'DEL') {
my $rec = $adb->get($printer);
if ($rec and $rec->prop('type') eq 'printer') {
$prt_datas{printer} = $printer;
$prt_datas{description} = $rec->prop('Description') || '';
}
} ## end if ($trt eq 'DEL')
if ( $trt eq 'DEL' ) {
my $rec = $adb->get($printer);
if ($rec and $rec->prop('type') eq 'printer') {
$prt_datas{printer} = $printer;
$prt_datas{description} = $rec->prop('Description') || '';
}
if ($trt eq 'LIST') {
my @printerDrivers;
if ($adb) {
@printerDrivers = $adb->printers();
}
if ( $trt eq 'LIST' ) {
my @printerDrivers;
if ($adb)
{
@printerDrivers = $adb->printers();
}
$c->stash( printerDrivers => \@printerDrivers );
}
$c->stash( title => $title, prt_datas => \%prt_datas );
$c->render( template => 'printers' );
};
$c->stash(printerDrivers => \@printerDrivers);
} ## end if ($trt eq 'LIST')
$c->stash(title => $title, prt_datas => \%prt_datas);
$c->render(template => 'printers');
} ## end sub do_display
sub do_update {
my $c = shift;
$c->app->log->info($c->log_req);
my $rt = $c->current_route;
my $trt = ($c->param('trt') || 'LIST');
my $rt = $c->current_route;
my $trt = ($c->param('trt') || 'LIST');
my %prt_datas = ();
my $title = $c->l('prt_FORM_TITLE');
my $title = $c->l('prt_FORM_TITLE');
$prt_datas{'trt'} = $trt;
my ($res, $result) = '';
if ( $trt eq 'ADD' ) {
my $name = ($c->param('Name') || '');
if ($trt eq 'ADD') {
my $name = ($c->param('Name') || '');
my $description = ($c->param('Description') || '');
my $location = ($c->param('Location') || '');
my $location = ($c->param('Location') || '');
# controls
$res = $c->validate_printer( $name, $description, $location );
$result .= $res unless $res eq 'OK';
# controls
$res = $c->validate_printer($name, $description, $location);
$result .= $res unless $res eq 'OK';
if ( $location eq 'remote' and ! $result) {
$prt_datas{'trt'} = 'NET';
$prt_datas{'name'} = $name;
$prt_datas{'description'} = $description;
$prt_datas{'location'} = $location;
$c->stash( title => $title, prt_datas => \%prt_datas );
return $c->render( template => 'printers' );
}
$res = '';
if ( ! $result ) {
$res = $c->new_printer( $name, $description, $location );
#$remoteName, $address );
$result .= $res unless $res eq 'OK';
if ( ! $result ) {
$result = $c->l('prt_CREATED_SUCCESSFULLY') . ' ' . $name;
}
}
}
if ($location eq 'remote' and !$result) {
$prt_datas{'trt'} = 'NET';
$prt_datas{'name'} = $name;
$prt_datas{'description'} = $description;
$prt_datas{'location'} = $location;
$c->stash(title => $title, prt_datas => \%prt_datas);
return $c->render(template => 'printers');
} ## end if ($location eq 'remote'...)
$res = '';
if ( $trt eq 'NET' ) {
if (!$result) {
$res = $c->new_printer($name, $description, $location);
my $name = ($c->param('Name') || '');
#$remoteName, $address );
$result .= $res unless $res eq 'OK';
if (!$result) {
$result = $c->l('prt_CREATED_SUCCESSFULLY') . ' ' . $name;
}
} ## end if (!$result)
} ## end if ($trt eq 'ADD')
if ($trt eq 'NET') {
my $name = ($c->param('Name') || '');
my $description = ($c->param('Description') || '');
my $location = ($c->param('Location') || '');
my $remoteName = ($c->param ('RemoteName') || '');
my $address = ($c->param ('Address') || '');
my $location = ($c->param('Location') || '');
my $remoteName = ($c->param('RemoteName') || '');
my $address = ($c->param('Address') || '');
$prt_datas{'name'} = $name;
$prt_datas{'description'} = $description;
$prt_datas{'location'} = $location;
$prt_datas{'name'} = $name;
$prt_datas{'description'} = $description;
$prt_datas{'location'} = $location;
# controls
$res = $c->validate_network($location, $remoteName, $address);
$result .= $res unless $res eq 'OK';
$res = '';
# controls
$res = $c->validate_network( $location, $remoteName, $address);
$result .= $res unless $res eq 'OK';
if (!$result) {
$res = $c->new_printer($name, $description, $location, $remoteName, $address);
$result .= $res unless $res eq 'OK';
$res = '';
if ( ! $result ) {
$res = $c->new_printer( $name, $description, $location, $remoteName, $address );
$result .= $res unless $res eq 'OK';
if ( ! $result ) {
$result = $c->l('prt_CREATED_SUCCESSFULLY') . ' ' . $name;
}
}
}
if (!$result) {
$result = $c->l('prt_CREATED_SUCCESSFULLY') . ' ' . $name;
}
} ## end if (!$result)
} ## end if ($trt eq 'NET')
if ( $trt eq 'DEL' ) {
my $printer = ($c->param ('printer') || '');
if ($trt eq 'DEL') {
my $printer = ($c->param('printer') || '');
if ($printer =~ /^([a-z][a-z0-9]*)$/) {
$printer = $1;
} else {
$result .= $c->l('prt_ERR_INTERNAL_FAILURE') . ':' . $printer;
}
if ($printer =~ /^([a-z][a-z0-9]*)$/) {
$printer = $1;
} else {
$result .= $c->l('prt_ERR_INTERNAL_FAILURE') . ':' . $printer;
}
my $rec = $adb->get($printer);
$result .= $c->l('prt_ERR_INTERNAL_FAILURE') . ':' . $printer unless ($rec);
$res = '';
my $rec = $adb->get($printer);
$result .= $c->l('prt_ERR_INTERNAL_FAILURE') . ':' . $printer unless ($rec);
if (!$result) {
$res = $c->del_printer($printer);
$result .= $res unless $res eq 'OK';
$res = '';
if ( ! $result ) {
$res = $c->del_printer( $printer );
$result .= $res unless $res eq 'OK';
if ( ! $result ) {
$result = $c->l('prt_DELETED_SUCCESSFULLY') . ' ' . $printer;
}
}
}
if (!$result) {
$result = $c->l('prt_DELETED_SUCCESSFULLY') . ' ' . $printer;
}
} ## end if (!$result)
} ## end if ($trt eq 'DEL')
# common parts
if ($res ne 'OK') {
$c->stash( error => $result );
$c->stash( title => $title, prt_datas => \%prt_datas );
return $c->render('printers');
$c->stash(error => $result);
$c->stash(title => $title, prt_datas => \%prt_datas);
return $c->render('printers');
}
my $message = "'Printers' updates ($trt) DONE";
$c->app->log->info($message);
$c->flash( success => $result );
$c->flash(success => $result);
#$c->flash( error => 'No changes applied !!' ); # for testing purpose
$c->redirect_to('/printers');
};
} ## end sub do_update
sub del_printer {
my ( $c, $printer ) = @_;
my ($c, $printer) = @_;
# Update the db account (1)
my $rec = $adb->get($printer);
$rec->set_prop('type', 'printer-deleted');
system ("/sbin/e-smith/signal-event printer-delete $printer") == 0
or return $c->error('ERR_DELETING');
system("/sbin/e-smith/signal-event printer-delete $printer") == 0
or return $c->error('ERR_DELETING');
$rec->delete();
return 'OK';
}
} ## end sub del_printer
sub validate_printer {
my ($c, $name, $description, $location, $remoteName, $address ) = @_;
my ($c, $name, $description, $location, $remoteName, $address) = @_;
#------------------------------------------------------------
# Validate parameters and untaint them
#------------------------------------------------------------
if ($name =~ /^([a-z][a-z0-9]*)$/) {
if ($name =~ /^([a-z][a-z0-9]*)$/) {
$name = $1;
} else {
} else {
return $c->l('prt_ERR_UNEXPECTED_NAME') . ': ' . $name;
}
if ($description =~ /^([\'\w\s]+)$/) {
$description = $1;
$description = $1;
} else {
return $c->l('prt_ERR_UNEXPECTED_DESC') . ': ' . $description;
}
if ($location =~ /^(lp[0-9]+|remote|usb\/lp[0-9]+)$/){
if ($location =~ /^(lp[0-9]+|remote|usb\/lp[0-9]+)$/) {
$location = $1;
} else {
$location = "lp0";
@@ -249,26 +211,22 @@ sub validate_printer {
#------------------------------------------------------------
# Looks good. Find out if this printer has been taken
#------------------------------------------------------------
my $rec = $adb->get($name);
my $type;
if ($rec and ($type = $rec->prop('type'))) {
return $c->l('prt_ERR_EXISTS') . ' : ' . $name;
}
return 'OK';
}
} ## end sub validate_printer
sub validate_network {
my ($c, $location, $remoteName, $address ) = @_;
my ($c, $location, $remoteName, $address) = @_;
if ($location eq 'remote') {
my $msg = hostname_or_ip2($c, $address);
return $msg unless $msg eq 'OK';
my $msg = hostname_or_ip2 ( $c, $address );
return $msg unless $msg eq 'OK';
if ($address =~ /^([a-zA-Z0-9\.\-]+)$/) {
$address = $1;
} else {
@@ -280,82 +238,63 @@ sub validate_network {
} else {
return $c->l('prt_ERR_INVALID_REMOTE_NAME') . ' : ' . $remoteName;
}
}
} ## end if ($location eq 'remote')
return 'OK';
}
} ## end sub validate_network
sub new_printer {
my ($c, $name, $description, $location, $remoteName, $address ) = @_;
my ($c, $name, $description, $location, $remoteName, $address) = @_;
#------------------------------------------------------------
# Printer name is available! Update printers database and
# Printer name is available! Update printers database and
# signal the create-printer event.
#------------------------------------------------------------
my $result = '';
my $rec = $adb->new_record($name,
{type=>'printer',
Description => $description,
Address => $address,
RemoteName => $remoteName,
Location => $location});
system ("/sbin/e-smith/signal-event printer-create $name") == 0
or return $c->error('ERR_CREATING');
return 'OK',
}
my $rec = $adb->new_record(
$name,
{ type => 'printer',
Description => $description,
Address => $address,
RemoteName => $remoteName,
Location => $location
}
);
system("/sbin/e-smith/signal-event printer-create $name") == 0
or return $c->error('ERR_CREATING');
return 'OK',;
} ## end sub new_printer
sub hostname_or_ip2 {
my ($fm, $data) = @_;
if ($data =~ /^[\d\.]+$/) {
if (ip_number2($fm, $data) eq "OK")
{
if (ip_number2($fm, $data) eq "OK") {
return "OK";
}
else
{
} else {
return $fm->l('prt_MUST_BE_VALID_HOSTNAME_OR_IP');
}
}
elsif ($data =~ /^([a-zA-Z0-9\.\-]+)$/ )
{
} elsif ($data =~ /^([a-zA-Z0-9\.\-]+)$/) {
return "OK";
}
else
{
} else {
return $fm->l('prt_MUST_BE_VALID_HOSTNAME_OR_IP');
}
}
} ## end sub hostname_or_ip2
sub ip_number2 {
# from CGI::FormMagick::Validator::ip_number($fm, $data)
my ($fm, $data) = @_;
return undef unless defined $data;
return 'FM_IP_NUMBER1' unless $data =~ /^[\d.]+$/;
my @octets = split /\./, $data;
my $dots = ($data =~ tr/.//);
return 'FM_IP_NUMBER2' unless (scalar @octets == 4 and $dots == 3);
foreach my $octet (@octets) {
return $fm->l("FM_IP_NUMBER3", {octet => $octet}) if $octet > 255;
return $fm->l("FM_IP_NUMBER3", { octet => $octet }) if $octet > 255;
}
return 'OK';
}
} ## end sub ip_number2
=head2 publicAccess_list
@@ -365,15 +304,14 @@ access drop down list.
=cut
sub printerLocation_list {
my $c = shift;
return [[ $c->l('prt_LOCAL_PRINTER_0') => 'lp0'],
[ $c->l('prt_LOCAL_PRINTER_1') => 'lp1'],
[ $c->l('prt_LOCAL_PRINTER_2') => 'lp2'],
[ $c->l('prt_NET_PRINTER') => 'remote' ],
[ $c->l('prt_FIRST_USB_PRINTER') => 'usb/lp0'],
[ $c->l('prt_SECOND_USB_PRINTER') => 'usb/lp1']];
}
return [
[ $c->l('prt_LOCAL_PRINTER_0') => 'lp0' ],
[ $c->l('prt_LOCAL_PRINTER_1') => 'lp1' ],
[ $c->l('prt_LOCAL_PRINTER_2') => 'lp2' ],
[ $c->l('prt_NET_PRINTER') => 'remote' ],
[ $c->l('prt_FIRST_USB_PRINTER') => 'usb/lp0' ],
[ $c->l('prt_SECOND_USB_PRINTER') => 'usb/lp1' ]
];
} ## end sub printerLocation_list
1

View File

@@ -3,7 +3,7 @@ package SrvMngr::Controller::Proxy;
#----------------------------------------------------------------------
# heading : System
# description : Proxy settings
# navigation : 4000 700
# navigation : 4000 710
#----------------------------------------------------------------------
#
# routes : end
@@ -11,65 +11,50 @@ package SrvMngr::Controller::Proxy;
use strict;
use warnings;
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";
sub main {
my $c = shift;
$c->app->log->info($c->log_req);
my %prx_datas = ();
my $title = $c->l('prx_TITLE');
my $modul = $c->render_to_string(inline => $c->l('prx_FIRST_PAGE_DESCRIPTION'));
$prx_datas{'http_proxy_status'} = ($db->get_prop('squid','status')) || 'disabled';
my $title = $c->l('prx_TITLE');
my $modul = $c->render_to_string(inline => $c->l('prx_FIRST_PAGE_DESCRIPTION'));
$prx_datas{'http_proxy_status'} = ($db->get_prop('squid', 'status')) || 'disabled';
#if (system('/bin/rpm -q e-smith-email > /dev/null') == 0)
#{
$prx_datas{'smtp_proxy_status'} = $db->get_prop('qpsmtpd','Proxy') || undef;
$prx_datas{'smtp_proxy_status'} = $db->get_prop('qpsmtpd', 'Proxy') || undef;
#}
#(system('/bin/rpm -q e-smith-email > /dev/null') == 0) ?
$c->stash( title => $title, modul => $modul, prx_datas => \%prx_datas );
$c->stash(title => $title, modul => $modul, prx_datas => \%prx_datas);
$c->render(template => 'proxy');
};
} ## end sub main
sub do_update {
my $c = shift;
$c->app->log->info($c->log_req);
my $http_proxy_status = $c->param('http_proxy_status') || 'disabled';
my $smtp_proxy_status = $c->param('smtp_proxy_status') || '';
my $result = "";
my $result = "";
my $squid = $db->get('squid') or $result = $c->l('prx_ERR_NO_SQUID_REC');
# smtpd is allowed to not exist, as the relevant packages may not be
# installed.
my $smtpd = $db->get('qpsmtpd') || undef;
$squid->set_prop('status', $http_proxy_status);
$smtpd->set_prop('Proxy', $smtp_proxy_status) if $smtpd;
#
# Update the system
#
system("/sbin/e-smith/signal-event proxy-update") == 0
or $result = $c->l('prx_ERR_PROXY_UPDATE_FAILED');
my $title = $c->l('prx_TITLE');
if ( $result eq '' ) { $result = $c->l('prx_SUCCESS'); }
$c->stash( title => $title, modul => $result );
if ($result eq '') { $result = $c->l('prx_SUCCESS'); }
$c->stash(title => $title, modul => $result);
$c->render(template => 'module');
};
} ## end sub do_update
1;

View File

@@ -11,288 +11,252 @@ package SrvMngr::Controller::Pseudonyms;
use strict;
use warnings;
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::pseudonyms;
use esmith::AccountsDB;
#use URI::Escape;
our $cdb = esmith::ConfigDB->open || die "Couldn't open configuration db";
our $cdb = esmith::ConfigDB->open || die "Couldn't open configuration db";
our $adb = esmith::AccountsDB->open || die "Couldn't open accounts db";
sub main {
my $c = shift;
$c->app->log->info($c->log_req);
my %pse_datas = ();
my $title = $c->l('pse_FORM_TITLE');
my $notif = '';
my $title = $c->l('pse_FORM_TITLE');
my $notif = '';
$pse_datas{trt} = 'LST';
my @pseudonyms;
if ($adb)
{
if ($adb) {
@pseudonyms = $adb->pseudonyms();
}
$c->stash( title => $title, notif => $notif, pse_datas => \%pse_datas, pseudonyms => \@pseudonyms );
$c->stash(title => $title, notif => $notif, pse_datas => \%pse_datas, pseudonyms => \@pseudonyms);
$c->render(template => 'pseudonyms');
};
} ## end sub main
sub do_display {
my $c = shift;
$c->app->log->info($c->log_req);
my $rt = $c->current_route;
my $trt = ($c->param('trt') || 'LST');
my $rt = $c->current_route;
my $trt = ($c->param('trt') || 'LST');
my $pseudonym = $c->param('pseudonym') || '';
my $title = $c->l('pse_FORM_TITLE');
my $title = $c->l('pse_FORM_TITLE');
my %pse_datas = ();
$pse_datas{'trt'} = $trt;
if ( $trt eq 'ADD' ) {
#nothing
}
if ($trt eq 'ADD') {
if ( $trt eq 'UPD' ) {
my $rec = $adb->get($pseudonym);
if ($rec and $rec->prop('type') eq 'pseudonym') {
#nothing
}
$pse_datas{pseudonym} = $pseudonym;
$pse_datas{account} = $rec->prop('Account') || '';
$pse_datas{internal} = is_pseudonym_internal($pseudonym);
}
}
if ($trt eq 'UPD') {
my $rec = $adb->get($pseudonym);
if ( $trt eq 'DEL' ) {
if ($rec and $rec->prop('type') eq 'pseudonym') {
$pse_datas{pseudonym} = $pseudonym;
$pse_datas{account} = $rec->prop('Account') || '';
$pse_datas{internal} = is_pseudonym_internal($pseudonym);
} ## end if ($rec and $rec->prop...)
} ## end if ($trt eq 'UPD')
my $rec = $adb->get($pseudonym);
if ($rec and $rec->prop('type') eq 'pseudonym') {
if ($trt eq 'DEL') {
my $rec = $adb->get($pseudonym);
$pse_datas{pseudonym} = $pseudonym;
$pse_datas{account} = $rec->prop('Account') || '';
$pse_datas{internal} = is_pseudonym_internal($pseudonym);
if ($rec and $rec->prop('type') eq 'pseudonym') {
$pse_datas{pseudonym} = $pseudonym;
$pse_datas{account} = $rec->prop('Account') || '';
$pse_datas{internal} = is_pseudonym_internal($pseudonym);
} ## end if ($rec and $rec->prop...)
} ## end if ($trt eq 'DEL')
}
if ($trt eq 'LST') {
my @pseudonyms;
if ($adb) {
@pseudonyms = $adb->pseudonyms();
}
if ( $trt eq 'LST' ) {
my @pseudonyms;
if ($adb) {
@pseudonyms = $adb->pseudonyms();
}
$c->stash( pseudonyms => \@pseudonyms );
}
$c->stash( title => $title, pse_datas => \%pse_datas );
$c->render( template => 'pseudonyms' );
};
$c->stash(pseudonyms => \@pseudonyms);
} ## end if ($trt eq 'LST')
$c->stash(title => $title, pse_datas => \%pse_datas);
$c->render(template => 'pseudonyms');
} ## end sub do_display
sub do_update {
my $c = shift;
$c->app->log->info($c->log_req);
my $rt = $c->current_route;
my $trt = ($c->param('trt') || 'LST');
my $title = $c->l('pse_FORM_TITLE');
my $rt = $c->current_route;
my $trt = ($c->param('trt') || 'LST');
my $title = $c->l('pse_FORM_TITLE');
my %pse_datas = ();
$pse_datas{'trt'} = $trt;
my ($res, $result) = '';
#my $pseudonym = uri_unescape($c->param('Pseudonym'));
my $pseudonym = $c->param('Pseudonym');
$pse_datas{'pseudonym'} = $pseudonym;
if ( $trt eq 'ADD' ) {
if ($trt eq 'ADD') {
my $account = $c->param('Account');
# controls
$res = $c->validate_new_pseudonym_name( $pseudonym, $account );
$result .= $res unless $res eq 'OK';
# controls
$res = $c->validate_new_pseudonym_name($pseudonym, $account);
$result .= $res unless $res eq 'OK';
#$result .= ' blocked';
$res = '';
if ( ! $result ) {
$adb->new_record( $pseudonym, { type => 'pseudonym',
Account => $account} )
or $result .= "Error occurred while creating pseudonym in database.";
# Untaint $pseudonym before use in system()
($pseudonym) = ($pseudonym =~ /(.+)/);
system( "/sbin/e-smith/signal-event", "pseudonym-create", "$pseudonym",)
== 0 or $result .= 'pse_CREATE_ERROR.';
}
if ( ! $result ) {
$res = 'OK';
$result = $c->l('pse_CREATE_SUCCEEDED') . ' ' . $pseudonym;
}
}
#$result .= ' blocked';
$res = '';
if ( $trt eq 'UPD' ) {
if (!$result) {
$adb->new_record(
$pseudonym,
{ type => 'pseudonym',
Account => $account
}
) or $result .= "Error occurred while creating pseudonym in database.";
my $account = $c->param('Account');
my $internal = $c->param ('Internal') || 'NO';
my $removable = $adb->get($pseudonym)->prop('Removable') || 'yes';
# Untaint $pseudonym before use in system()
($pseudonym) = ($pseudonym =~ /(.+)/);
system("/sbin/e-smith/signal-event", "pseudonym-create", "$pseudonym",) == 0
or $result .= 'pse_CREATE_ERROR.';
} ## end if (!$result)
my %props = ('Account' => $account);
if (!$result) {
$res = 'OK';
$result = $c->l('pse_CREATE_SUCCEEDED') . ' ' . $pseudonym;
}
} ## end if ($trt eq 'ADD')
if ($removable eq 'yes') {
if ($internal eq "YES") { $props{'Visible'} = 'internal'; }
else { $adb->get($pseudonym)->delete_prop('Visible'); }
}
if ($trt eq 'UPD') {
my $account = $c->param('Account');
my $internal = $c->param('Internal') || 'NO';
my $removable = $adb->get($pseudonym)->prop('Removable') || 'yes';
my %props = ('Account' => $account);
# controls
#$res = '';
#$res = validate_description( $c, $account );
#$result .= $res unless $res eq 'OK';
if ($removable eq 'yes') {
if ($internal eq "YES") { $props{'Visible'} = 'internal'; }
else { $adb->get($pseudonym)->delete_prop('Visible'); }
}
#$result .= 'blocked';
# controls
#$res = '';
#$res = validate_description( $c, $account );
#$result .= $res unless $res eq 'OK';
#$result .= 'blocked';
$res = '';
$res = '';
if ( ! $result ) {
$adb->get($pseudonym)->merge_props(%props)
or $result .= "Error occurred while modifying pseudonym in database.";
# Untaint $pseudonym before use in system()
($pseudonym) = ($pseudonym =~ /(.+)/);
system( "/sbin/e-smith/signal-event", "pseudonym-modify", "$pseudonym",)
== 0 or $result .= "Error occurred while modifying pseudonym.";
}
if ( ! $result ) {
$res = 'OK';
$result = $c->l('pse_MODIFY_SUCCEEDED') . ' ' . $pseudonym;
}
}
if (!$result) {
$adb->get($pseudonym)->merge_props(%props)
or $result .= "Error occurred while modifying pseudonym in database.";
if ( $trt eq 'DEL' ) {
# Untaint $pseudonym before use in system()
($pseudonym) = ($pseudonym =~ /(.+)/);
system("/sbin/e-smith/signal-event", "pseudonym-modify", "$pseudonym",) == 0
or $result .= "Error occurred while modifying pseudonym.";
} ## end if (!$result)
# controls
$res = '';
$res = validate_is_pseudonym($c, $pseudonym);
$result .= $res unless $res eq 'OK';
#$result .= 'blocked';
$res = '';
if ( ! $result ) {
$res = $c->delete_pseudonym( $pseudonym );
$result .= $res unless $res eq 'OK';
if ( ! $result ) {
$res = 'OK';
$result = $c->l('pse_REMOVE_SUCCEEDED') . ' ' . $pseudonym;
}
}
}
if (!$result) {
$res = 'OK';
$result = $c->l('pse_MODIFY_SUCCEEDED') . ' ' . $pseudonym;
}
} ## end if ($trt eq 'UPD')
if ($trt eq 'DEL') {
# controls
$res = '';
$res = validate_is_pseudonym($c, $pseudonym);
$result .= $res unless $res eq 'OK';
#$result .= 'blocked';
$res = '';
if (!$result) {
$res = $c->delete_pseudonym($pseudonym);
$result .= $res unless $res eq 'OK';
if (!$result) {
$res = 'OK';
$result = $c->l('pse_REMOVE_SUCCEEDED') . ' ' . $pseudonym;
}
} ## end if (!$result)
} ## end if ($trt eq 'DEL')
# common parts
if ( $res ne 'OK' ) {
$c->stash( error => $result);
$c->stash( title => $title, pse_datas => \%pse_datas );
return $c->render('pseudonyms');
if ($res ne 'OK') {
$c->stash(error => $result);
$c->stash(title => $title, pse_datas => \%pse_datas);
return $c->render('pseudonyms');
}
my $message = "'Pseudonyms' updates $trt DONE";
$c->app->log->info($message);
$c->flash( success => $result );
$c->flash(success => $result);
$c->redirect_to('/pseudonyms');
};
} ## end sub do_update
sub delete_pseudonym {
my ($c, $pseudonym) = @_;
my $msg = '';
#------------------------------------------------------------
# Make the pseudonym inactive, signal pseudonym-delete event
# and then delete it
#------------------------------------------------------------
my @pseudonyms = $adb->pseudonyms();
foreach my $p_rec (@pseudonyms) {
if ($p_rec->prop("Account") eq $pseudonym) {
$adb->get($p_rec->key)->set_prop('type','pseudonym-deleted')
$adb->get($p_rec->key)->set_prop('type', 'pseudonym-deleted')
or $msg .= "Error occurred while changing pseudonym type.";
}
}
$adb->get($pseudonym)->set_prop('type','pseudonym-deleted')
} ## end foreach my $p_rec (@pseudonyms)
$adb->get($pseudonym)->set_prop('type', 'pseudonym-deleted')
or $msg .= "Error occurred while changing pseudonym type.";
# Untaint $pseudonym before use in system()
($pseudonym) = ($pseudonym =~ /(.+)/);
system( "/sbin/e-smith/signal-event", "pseudonym-delete", "$pseudonym") == 0
system("/sbin/e-smith/signal-event", "pseudonym-delete", "$pseudonym") == 0
or $msg .= "Error occurred while removing pseudonym.";
#TODO: is it ->delete or get()->delete
foreach my $p_rec (@pseudonyms) {
if ($p_rec->prop("Account") eq $pseudonym) {
$adb->get($p_rec->key)->delete()
or $msg .= "Error occurred while deleting pseudonym from database.";
}
}
} ## end foreach my $p_rec (@pseudonyms)
$adb->get($pseudonym)->delete()
or $msg .= "Error occurred while deleting pseudonym from database.";
return $msg unless $msg;
return $msg unless $msg;
return 'OK';
}
} ## end sub delete_pseudonym
sub existing_accounts_list {
my $c = shift;
my @existingAccounts = ( ['Administrator' => 'admin']);
my @existingAccounts = ([ 'Administrator' => 'admin' ]);
foreach my $a ($adb->get_all) {
if ($a->prop('type') =~ /(user|group)/) {
push @existingAccounts, [ $a->key => $a->key ];
}
if ($a->prop('type') eq "pseudonym") {
my $target = $adb->get($a->prop('Account'));
unless ($target)
{
warn "WARNING: pseudonym (" . $a->key . ") => missing Account("
. $a->prop('Account') . ")\n";
unless ($target) {
warn "WARNING: pseudonym (" . $a->key . ") => missing Account(" . $a->prop('Account') . ")\n";
next;
}
push @existingAccounts, [ $a->key, $a->key ]
unless ($target->prop('type') eq "pseudonym");
}
}
return(\@existingAccounts);
}
} ## end if ($a->prop('type') eq...)
} ## end foreach my $a ($adb->get_all)
return (\@existingAccounts);
} ## end sub existing_accounts_list
=head2 get_pseudonym_account
@@ -301,17 +265,17 @@ Returns the current Account property for this pseudonym
=cut
sub get_pseudonym_account {
my $c = shift;
my $c = shift;
my $pseudonym = shift;
my $a = $adb->get($pseudonym)->prop('Account');
my $a = $adb->get($pseudonym)->prop('Account');
if ($a eq "admin") {
$a = "Administrator";
} elsif ($a eq "shared") {
$a = $c->l("EVERYONE");
$a = $c->l("EVERYONE");
}
return($a);
}
return ($a);
} ## end sub get_pseudonym_account
=head2 is_pseudonym_not_removable
@@ -320,13 +284,12 @@ Returns 1 if the current Account is not removable, 0 otherwise
=cut
sub is_pseudonym_not_removable {
my $c = shift;
my $c = shift;
my $pseudonym = shift;
my $removable = $adb->get($pseudonym)->prop('Removable') || 'yes';
return 1 if ($removable eq 'yes');
return 1 if ($removable eq 'yes');
return 0;
}
} ## end sub is_pseudonym_not_removable
=head2 is_pseudonym_internal
@@ -335,13 +298,13 @@ Returns YES if the current Account property Visible is 'internal'
=cut
sub is_pseudonym_internal {
# my $c = shift;
my $pseudonym = shift;
# my $c = shift;
my $pseudonym = shift;
my $visible = $adb->get($pseudonym)->prop('Visible') || '';
return 'YES' if ($visible eq 'internal');
return 'YES' if ($visible eq 'internal');
return 'NO';
}
} ## end sub is_pseudonym_internal
=head2 validate_new_pseudonym_name FM PSEUDONYM
@@ -355,30 +318,25 @@ Returns "NAME_IN_USE" if this pseudonym is taken.
=cut
sub validate_new_pseudonym_name {
my ($c, $pseudonym, $account) = @_;
my $acct = $adb->get($pseudonym);
if (defined $acct) {
return($c->l('pse_NAME_IN_USE'));
return ($c->l('pse_NAME_IN_USE'));
} elsif ($pseudonym =~ /@/) {
use esmith::DomainsDB;
my $ddb = esmith::DomainsDB->open_ro
or die "Couldn't open DomainsDB\n";
or die "Couldn't open DomainsDB\n";
my ($lhs, $rhs) = split /@/, $pseudonym;
return ($c->l('pse_PSEUDONYM_INVALID_DOMAIN')) unless ($ddb->get($rhs));
return ($c->l('pse_PSEUDONYM_INVALID_SAMEACCT')) if ($lhs eq $account);
return ('OK'); # p:' . $pseudonym . ' a:' . $account);
} elsif ( $pseudonym !~ /^([a-z0-9][a-z0-9\.\-_!#\?~\$\^\+&`%\/\*]*)$/ ) {
return($c->l('pse_VALID_PSEUDONYM_NAMES'));
return ('OK'); # p:' . $pseudonym . ' a:' . $account);
} elsif ($pseudonym !~ /^([a-z0-9][a-z0-9\.\-_!#\?~\$\^\+&`%\/\*]*)$/) {
return ($c->l('pse_VALID_PSEUDONYM_NAMES'));
} else {
return('OK');
return ('OK');
}
}
} ## end sub validate_new_pseudonym_name
=head2 validate_is_pseudonym FM NAME
@@ -388,19 +346,15 @@ returns "NOT_A_PSEUDONYM" if the name in question isn't an existing pseudonym
=cut
sub validate_is_pseudonym {
my $c = shift;
my $c = shift;
my $pseudonym = shift;
$pseudonym = $adb->get($pseudonym);
return($c->l('pse_NOT_A_PSEUDONYM')) unless $pseudonym;
return ($c->l('pse_NOT_A_PSEUDONYM')) unless $pseudonym;
my $type = $pseudonym->prop('type');
unless (defined $type && ($type eq 'pseudonym') ) {
return($c->l('NOT_A_PSEUDONYM'));
unless (defined $type && ($type eq 'pseudonym')) {
return ($c->l('NOT_A_PSEUDONYM'));
}
return ('OK');
}
} ## end sub validate_is_pseudonym
1;

View File

@@ -10,143 +10,106 @@ package SrvMngr::Controller::Qmailanalog;
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);
sub main {
my $c = shift;
$c->app->log->info($c->log_req);
my $title = $c->l('qma_FORM_TITLE');
my $modul = $c->render_to_string(inline => $c->l('qma_INITIAL_DESC'));
$c->stash( title => $title, modul => $modul );
$c->stash(title => $title, modul => $modul);
$c->render(template => 'qmailanalog');
};
} ## end sub main
sub do_update {
my $c = shift;
$c->app->log->info($c->log_req);
my $result = "";
my $result = "";
my $report_type = $c->param('report_type');
if ($report_type =~ /^(\S+)$/)
{
$report_type = $1;
if ($report_type =~ /^(\S+)$/) {
$report_type = $1;
} elsif ($report_type =~ /^\s*$/) {
$report_type = "zoverall";
} else {
$result = $c->l('INVALID_REPORT_TYPE') . $report_type;
$report_type = undef;
}
elsif ($report_type =~ /^\s*$/)
{
$report_type = "zoverall";
} else {
$result = $c->l('INVALID_REPORT_TYPE') . $report_type;
$report_type = undef;
}
my $title = $c->l('qma_FORM_TITLE');
$result = $c->render_to_string(inline => generateReport($c, $report_type)) if $report_type;
$c->stash( title => $title, modul => $result );
$c->stash(title => $title, modul => $result);
$c->render(template => 'module');
};
} ## end sub do_update
sub generateReport {
my $c = shift;
my $report_type = shift;
my $out = '';
my $c = shift;
my $report_type = shift;
#------------------------------------------------------------
# Looks good; go ahead and generate the report.
#------------------------------------------------------------
# $| = 1;
my $now_string = $c->gen_locale_date_string();
$out .= sprintf("<h3>%s %s </h3>", $c->l('REPORT_GENERATED'), $now_string);
my $out = '';
#------------------------------------------------------------
# Looks good; go ahead and generate the report.
#------------------------------------------------------------
if ($report_type =~ /^qmail-q/) {
open(QMAILQUEUEREPORT, "/var/qmail/bin/$report_type |");
$out .= sprintf "<pre>";
# $| = 1;
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>";
my $now_string = $c->gen_locale_date_string();
$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 '';
}
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>";
while (<QMAILANALOG>)
{
# Cook any special HTML characters
s/\&/\&amp;/g;
s/\"/\&quot;/g;
s/\>/\&gt;/g;
s/\</\&lt;/g;
$out .= sprintf("%s", $_);
}
close QMAILANALOG;
$out .= sprintf "</pre>";
$out .= sprintf("<h3>%s</h3>", $c->l('END_OF_REPORT'));
return $out;
}
while (<QMAILANALOG>) {
# Cook any special HTML characters
s/\&/\&amp;/g;
s/\"/\&quot;/g;
s/\>/\&gt;/g;
s/\</\&lt;/g;
$out .= sprintf("%s", $_);
} ## end while (<QMAILANALOG>)
close QMAILANALOG;
$out .= sprintf "</pre>";
$out .= sprintf("<h3>%s</h3>", $c->l('END_OF_REPORT'));
return $out;
} ## end sub generateReport
sub reportType_list {
my $c = shift;
my $c = shift;
my @array = (
# [ $c->l('qma_LIST_OUTGOING') => 'qmail-qread' ],
# [ $c->l('qma_SUMMARIZE_QUEUE') => 'qmail-qstat' ],
# [ $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_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' ]
);
my @sorted_array = sort { $a->[0] cmp $b->[0] } @array;
return \@sorted_array;
}
} ## end sub reportType_list
1;

View File

@@ -11,183 +11,149 @@ 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);
#our $db = esmith::ConfigDB->open || die "Couldn't open config db";
our $adb = esmith::AccountsDB->open || die "Couldn't open accounts db";
sub main {
my $c = shift;
$c->app->log->info($c->log_req);
my %quo_datas = ();
my $title = $c->l('quo_FORM_TITLE');
my $title = $c->l('quo_FORM_TITLE');
$quo_datas{'trt'} = 'LIST';
my @userAccounts;
if ($adb) {
@userAccounts = $adb->users();
}
$c->stash( title => $title, quo_datas => \%quo_datas, userAccounts => \@userAccounts );
$c->stash(title => $title, quo_datas => \%quo_datas, userAccounts => \@userAccounts);
$c->render(template => 'quota');
};
} ## end sub main
sub do_display {
my $c = shift;
my $rt = $c->current_route;
my $trt = ($c->param('trt') || 'LIST');
my $c = shift;
my $rt = $c->current_route;
my $trt = ($c->param('trt') || 'LIST');
my $user = $c->param('user') || '';
$trt = 'UPD' if ( $user );
$trt = 'UPD' if ($user);
my %quo_datas = ();
my $title = $c->l('quo_FORM_TITLE');
my $title = $c->l('quo_FORM_TITLE');
$quo_datas{'trt'} = $trt;
if ( $trt eq 'UPD' ) {
my $rec = $adb->get($user);
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'));
$quo_datas{hardlim} = $max;
$max = esmith::FormMagick::Panel::quota->toBestUnit($rec->prop('MaxBlocksSoftLim'));
$quo_datas{softlim} = $max;
}
}
$c->stash( title => $title, quo_datas => \%quo_datas );
$c->render( template => 'quota' );
};
if ($trt eq 'UPD') {
my $rec = $adb->get($user);
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'));
$quo_datas{hardlim} = $max;
$max = esmith::FormMagick::Panel::quota->toBestUnit($rec->prop('MaxBlocksSoftLim'));
$quo_datas{softlim} = $max;
} ## end if ($rec and $rec->prop...)
} ## end if ($trt eq 'UPD')
$c->stash(title => $title, quo_datas => \%quo_datas);
$c->render(template => 'quota');
} ## end sub do_display
sub do_update {
my $c = shift;
$c->app->log->info($c->log_req);
my $title = $c->l('quo_FORM_TITLE');
my $title = $c->l('quo_FORM_TITLE');
my %quo_datas = ();
my $rt = $c->current_route;
my $trt = ($c->param('trt') || 'LIST');
my $rt = $c->current_route;
my $trt = ($c->param('trt') || 'LIST');
$quo_datas{trt} = $trt;
my $result = '';
my $res;
if ( $trt eq 'UPD' ) {
$quo_datas{user} = ($c->param('user') || '');
$quo_datas{softlim} = ($c->param('Soft') || '');
if ($trt eq 'UPD') {
$quo_datas{user} = ($c->param('user') || '');
$quo_datas{softlim} = ($c->param('Soft') || '');
$quo_datas{hardlim} = ($c->param('Hard') || '');
# controls
$res = validate_quota( $c, $quo_datas{user}, $quo_datas{softlim}, $quo_datas{hardlim} );
$result .= $res unless $res eq 'OK';
# controls
$res = validate_quota($c, $quo_datas{user}, $quo_datas{softlim}, $quo_datas{hardlim});
$result .= $res unless $res eq 'OK';
if ( ! $result ) {
$result = $c->l('quo_SUCCESSFULLY_MODIFIED') . ' ' . $quo_datas{user};
} else {
$quo_datas{userRec} = $adb->get($quo_datas{user}) || undef;
}
}
if (!$result) {
$result = $c->l('quo_SUCCESSFULLY_MODIFIED') . ' ' . $quo_datas{user};
} else {
$quo_datas{userRec} = $adb->get($quo_datas{user}) || undef;
}
} ## end if ($trt eq 'UPD')
# common parts
if ($res ne 'OK') {
$c->stash( error => $result );
$c->stash( title => $title, quo_datas => \%quo_datas );
return $c->render('quota');
$c->stash(error => $result);
$c->stash(title => $title, quo_datas => \%quo_datas);
return $c->render('quota');
}
my $message = "'Quota' updates ($trt) DONE";
$c->app->log->info($message);
$c->flash( success => $result );
$c->flash(success => $result);
$c->redirect_to('/quota');
};
} ## end sub do_update
sub validate_quota {
my ($c, $acct, $softlim, $hardlim ) = @_;
my ($c, $acct, $softlim, $hardlim) = @_;
my $msg;
my $rec = $adb->get($acct);
return $c->l('quo_ERR_NO_SUCH_ACCT') . ' : ' . $acct unless (defined $rec);
return $c->l('quo_ERR_NO_SUCH_ACCT') . ' : ' . $acct unless (defined $rec);
my $type = $rec->prop('type');
unless ($type eq "user") {
$msg = $c->l('quo_ERR_NOT_A_USER_ACCT').$acct.$c->l('quo_ACCOUNT_IS_TYPE').$type;
return $msg;
$msg = $c->l('quo_ERR_NOT_A_USER_ACCT') . $acct . $c->l('quo_ACCOUNT_IS_TYPE') . $type;
return $msg;
}
my $uid = getpwnam($acct);
return $c->l('COULD_NOT_GET_UID').$acct unless ($uid);
return $c->l('COULD_NOT_GET_UID') . $acct unless ($uid);
if (($softlim !~ /^(.+?)\s*([KMGT])?$/ ) || (!looks_like_number ($1))) {
return $c->l('quo_SOFT_VAL_MUST_BE_NUMBER');
if (($softlim !~ /^(.+?)\s*([KMGT])?$/) || (!looks_like_number($1))) {
return $c->l('quo_SOFT_VAL_MUST_BE_NUMBER');
}
my $exponent = 1; # Entries with no suffix are assumed to be in megabytes.
if (defined ($2)) {
$exponent = index("KMGT",$2);
}
$softlim = ($1 * 1024 ** $exponent);
my $exponent = 1; # Entries with no suffix are assumed to be in megabytes.
if (($hardlim !~ /^(.+?)\s*([KMGT])?$/ ) || (!looks_like_number ($1))) {
return $c->l('quo_HARD_VAL_MUST_BE_NUMBER');
if (defined($2)) {
$exponent = index("KMGT", $2);
}
$exponent = 1; # Entries with no suffix are assumed to be in megabytes.
if (defined ($2))
{
$exponent = index("KMGT",$2);
}
$hardlim = ($1 * 1024 ** $exponent);
$softlim = ($1 * 1024**$exponent);
if (($hardlim !~ /^(.+?)\s*([KMGT])?$/) || (!looks_like_number($1))) {
return $c->l('quo_HARD_VAL_MUST_BE_NUMBER');
}
$exponent = 1; # Entries with no suffix are assumed to be in megabytes.
if (defined($2)) {
$exponent = index("KMGT", $2);
}
$hardlim = ($1 * 1024**$exponent);
#------------------------------------------------------------
# Make sure that soft limit is less than hard limit.
#------------------------------------------------------------
unless ($hardlim == 0 or $hardlim > $softlim) {
return $c->l('quo_ERR_HARD_LT_SOFT');
return $c->l('quo_ERR_HARD_LT_SOFT');
}
#------------------------------------------------------------
# Update accounts database and signal the user-modify event.
#------------------------------------------------------------
$rec->set_prop('MaxBlocks', $hardlim);
$rec->set_prop('MaxBlocks', $hardlim);
$rec->set_prop('MaxBlocksSoftLim', $softlim);
# Untaint $acct before using in system().
$acct =~ /^(\w[\-\w_\.]*)$/; $acct = $1;
system ("/sbin/e-smith/signal-event", "user-modify", "$acct") == 0
or die ($c->l('quo_ERR_MODIFYING')."\n");
$acct =~ /^(\w[\-\w_\.]*)$/;
$acct = $1;
system("/sbin/e-smith/signal-event", "user-modify", "$acct") == 0
or die($c->l('quo_ERR_MODIFYING') . "\n");
return 'OK';
}
} ## end sub validate_quota
1

View File

@@ -1,87 +1,77 @@
package SrvMngr::Controller::Reboot;
#----------------------------------------------------------------------
# heading : System
# heading : System
# description : Reboot or shutdown
# navigation : 4000 700
# navigation : 4000 700
#
# routes : end
#----------------------------------------------------------------------
use strict;
use warnings;
use Mojo::Base 'Mojolicious::Controller';
use Locale::gettext;
use SrvMngr::I18N;
use SrvMngr qw(theme_list init_session);
sub main {
my $c = shift;
$c->app->log->info($c->log_req);
my $title = $c->l('rbo_FORM_TITLE');
my $modul = '';
$c->stash( title => $title, modul => $modul );
$c->stash(title => $title, modul => $modul);
$c->render(template => 'reboot');
};
} ## end sub main
sub do_action {
my $c = shift;
$c->app->log->info($c->log_req);
my $title = $c->l('rbo_FORM_TITLE');
my $result = "";
my $function = $c->param ('function');
my $debug = $c->param('debug');
my $title = $c->l('rbo_FORM_TITLE');
my $result = "";
my $function = $c->param('function');
my $debug = $c->param('debug');
if ($function eq "reboot") {
$result = $c->l('rbo_REBOOT_SUCCEEDED') . '<br>' . $c->l('rbo_DESC_REBOOT');
$result = $c->l('rbo_REBOOT_SUCCEEDED') . '<br>' . $c->l('rbo_DESC_REBOOT');
unless ($debug) {
esmith::util::backgroundCommand( 1, "/sbin/e-smith/signal-event", "reboot" );
# system( "/sbin/e-smith/signal-event", "reboot" ) == 0
# or die ("Error occurred while rebooting.\n");
}
esmith::util::backgroundCommand(1, "/sbin/e-smith/signal-event", "reboot");
# system( "/sbin/e-smith/signal-event", "reboot" ) == 0
# or die ("Error occurred while rebooting.\n");
} ## end unless ($debug)
} elsif ($function eq 'shutdown') {
$result = $c->l('rbo_SHUTDOWN_SUCCEEDED') . '<br>' . $c->l('rbo_DESC_SHUTDOWN');
$result = $c->l('rbo_SHUTDOWN_SUCCEEDED') . '<br>' . $c->l('rbo_DESC_SHUTDOWN');
unless ($debug) {
esmith::util::backgroundCommand( 1, "/sbin/e-smith/signal-event", "halt" );
# system( "/sbin/e-smith/signal-event", "halt" ) == 0
# or die ("Error occurred while halting.\n");
}
esmith::util::backgroundCommand(1, "/sbin/e-smith/signal-event", "halt");
# system( "/sbin/e-smith/signal-event", "halt" ) == 0
# or die ("Error occurred while halting.\n");
} ## end unless ($debug)
} elsif ($function eq 'reconfigure') {
$result = $c->l('rbo_RECONFIGURE_SUCCEEDED') . '<br>' . $c->l('rbo_DESC_RECONFIGURE');
$result = $c->l('rbo_RECONFIGURE_SUCCEEDED') . '<br>' . $c->l('rbo_DESC_RECONFIGURE');
unless ($debug) {
# esmith::util::backgroundCommand( 1, "/sbin/e-smith/signal-event", "post-upgrade",
# "; ", "/sbin/e-smith/signal-event", "reboot" );
system( "/sbin/e-smith/signal-event", "post-upgrade" ) == 0
or die ("Error occurred while running post-upgrade.\n");
system( "/sbin/e-smith/signal-event", "reboot" ) == 0
or die ("Error occurred while rebooting.\n");
}
}
$c->stash( title => $title, modul => $result );
# esmith::util::backgroundCommand( 1, "/sbin/e-smith/signal-event", "post-upgrade",
# "; ", "/sbin/e-smith/signal-event", "reboot" );
system("/sbin/e-smith/signal-event", "post-upgrade") == 0
or die("Error occurred while running post-upgrade.\n");
system("/sbin/e-smith/signal-event", "reboot") == 0
or die("Error occurred while rebooting.\n");
} ## end unless ($debug)
} ## end elsif ($function eq 'reconfigure')
$c->stash(title => $title, modul => $result);
$c->render(template => 'module');
};
} ## end sub do_action
sub rebootFunction_list {
my $c = shift;
return [[ $c->l('rbo_REBOOT') => 'reboot' ],
[ $c->l('RECONFIGURE') => 'reconfigure' ],
[ $c->l('SHUTDOWN') => 'shutdown' ]];
}
return [
[ $c->l('rbo_REBOOT') => 'reboot' ],
[ $c->l('RECONFIGURE') => 'reconfigure' ],
[ $c->l('SHUTDOWN') => 'shutdown' ]
];
} ## end sub rebootFunction_list
1;

View File

@@ -11,12 +11,9 @@ package SrvMngr::Controller::Remoteaccess;
use strict;
use warnings;
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::util;
use File::Basename;
@@ -25,165 +22,147 @@ use Carp;
use Socket qw( inet_aton );
#our @ISA = qw(esmith::FormMagick Exporter);
our @EXPORT = qw( networkAccess_list passwordLogin_list get_ssh_permit_root_login get_ssh_access get_telnet_mode
get_ftp_access get_ftp_password_login_access
get_value get_prop get_ssh_password_auth
validate_network_and_mask ip_number_or_blank subnet_mask_or_blank
get_ipsecrw_sessions pptp_and_dhcp_range
get_ftp_access get_ftp_password_login_access
get_value get_prop get_ssh_password_auth
validate_network_and_mask ip_number_or_blank subnet_mask_or_blank
get_ipsecrw_sessions pptp_and_dhcp_range
);
# get_pptp_sessions
# get_pptp_sessions
our $db = esmith::ConfigDB->open || warn "Couldn't open configuration database";
sub main {
my $c = shift;
$c->app->log->info($c->log_req);
my $title = $c->l('rma_FORM_TITLE');
my $notif = '';
my $title = $c->l('rma_FORM_TITLE');
my $notif = '';
my %rma_datas = ();
$db = esmith::ConfigDB->open || warn "Couldn't open configuration database";
#$rma_datas{ipsecrwSess} = $c->get_ipsecrw_sessions();
#$rma_datas{pptpSessions} = $c->get_pptp_sessions();
$rma_datas{sshAccess} = $c->get_ssh_access();
$rma_datas{sshPermitRootLogin} = $c->get_ssh_permit_root_login();
$rma_datas{sshAccess} = $c->get_ssh_access();
$rma_datas{sshPermitRootLogin} = $c->get_ssh_permit_root_login();
$rma_datas{sshPasswordAuthentication} = $c->get_ssh_password_auth();
$rma_datas{sshTCPPort} = $c->get_ssh_port();
$rma_datas{ftpAccess} = $c->get_ftp_access();
$rma_datas{ftpPasswordAccess} = $c->get_ftp_password_login_access();
$rma_datas{sshTCPPort} = $c->get_ssh_port();
$rma_datas{ftpAccess} = $c->get_ftp_access();
$rma_datas{ftpPasswordAccess} = $c->get_ftp_password_login_access();
#$rma_datas{telnetAccess} = $c->get_telnet_access;
$c->stash( title => $title, notif => $notif, rma_datas => \%rma_datas );
$c->stash(title => $title, notif => $notif, rma_datas => \%rma_datas);
$c->render(template => 'remoteaccess');
};
} ## end sub main
sub do_action {
my $c = shift;
$c->app->log->info($c->log_req);
my $title = $c->l('rma_FORM_TITLE');
my ($result, $res, $trt) = '';
my %rma_datas = ();
$rma_datas{ipsecrwSess} = ($c->param ('IpsecrwSess') || '');
$rma_datas{ipsecrwReset} = ($c->param ('IpsecrwReset') || '');
$db = esmith::ConfigDB->open || warn "Couldn't open configuration database";
$rma_datas{ipsecrwSess} = ($c->param('IpsecrwSess') || '');
$rma_datas{ipsecrwReset} = ($c->param('IpsecrwReset') || '');
#$rma_datas{pptpSessions} = ($c->param ('PptpSessions') || '0');
$rma_datas{validFromNetwork} = ($c->param ('ValidFromNetwork') || '');
$rma_datas{validFromMask} = ($c->param ('ValidFromMask') || '');
$rma_datas{validFromNetwork} = ($c->param('ValidFromNetwork') || '');
$rma_datas{validFromMask} = ($c->param('ValidFromMask') || '');
## my @remove = $q->param('validFromRemove'); ???????? the first one only !!
my @vals = $c->param ('Remove_nets');
my @vals = $c->param('Remove_nets');
$rma_datas{remove_nets} = join ',', @vals;
$rma_datas{sshaccess} = ($c->param ('SshAccess') || 'off');
$rma_datas{sshPermitRootLogin} = ($c->param ('SshPermitRootLogin') || 'no');
$rma_datas{sshPasswordAuthentication} = ($c->param ('SshPasswordAuthentication') || 'no');
$rma_datas{sshTCPPort} = ($c->param ('SshTCPPort') || '22');
$rma_datas{ftpAccess} = ($c->param ('FtpAccess') || 'off');
$rma_datas{ftpPasswordAccess} = ($c->param ('FtpPasswordAccess') || 'private');
$rma_datas{telnetAccess} = ($c->param ('TelnetAccess') || 'off');
$rma_datas{sshaccess} = ($c->param('SshAccess') || 'off');
$rma_datas{sshPermitRootLogin} = ($c->param('SshPermitRootLogin') || 'no');
$rma_datas{sshPasswordAuthentication} = ($c->param('SshPasswordAuthentication') || 'no');
$rma_datas{sshTCPPort} = ($c->param('SshTCPPort') || '22');
$rma_datas{ftpAccess} = ($c->param('FtpAccess') || 'off');
$rma_datas{ftpPasswordAccess} = ($c->param('FtpPasswordAccess') || 'private');
$rma_datas{telnetAccess} = ($c->param('TelnetAccess') || 'off');
# validate
my $v = $c->validation;
return $c->render('remoteaccess') unless $v->has_data;
#$v->optional('PptpSessions')->num(0, 999)->is_valid;
$v->optional('ValidFromNetwork')->size(7, 15)->is_valid;
$v->optional('ValidFromMask')->size(7, 15)->is_valid;
$v->required('SshTCPPort')->num(1, 65535)->is_valid;
$result .= 'field validation error' if $v->has_error;
if ( ! $result ) {
# controls
#$res = pptp_and_dhcp_range( $c, $rma_datas{pptpSessions} );
#$result .= $res . ' ' unless $res eq 'OK';
$res = ip_number_or_blank( $c, $rma_datas{validFromNetwork} );
$result .= $res . ' ' unless $res eq 'OK';
$res = subnet_mask_or_blank( $c, $rma_datas{validFromMask} );
$result .= $res . ' ' unless $res eq 'OK';
$res = validate_network_and_mask( $c, $rma_datas{validFromNetwork}, $rma_datas{validFromMask} );
$result .= $res . ' ' unless $res eq 'OK';
#$result .= ' blocked for testing !' . $rma_datas{remove_nets};
if ($c->param('ValidFromNetwork') ne "") {
$v->optional('ValidFromNetwork')->size(7, 15)->is_valid;
}
if ( ! $result ) {
$res = change_settings( $c, %rma_datas );
if ($c->param('ValidFromMask') ne "") {
$v->optional('ValidFromMask')->size(7, 15)->is_valid;
}
$v->required('SshTCPPort')->num(1, 65535)->is_valid;
$result .= 'field validation error' if $v->has_error;
if (!$result) {
# controls
#$res = pptp_and_dhcp_range( $c, $rma_datas{pptpSessions} );
#$result .= $res . ' ' unless $res eq 'OK';
$res = ip_number_or_blank($c, $rma_datas{validFromNetwork});
$result .= $res . ' ' unless $res eq 'OK';
$res = subnet_mask_or_blank($c, $rma_datas{validFromMask});
$result .= $res . ' ' unless $res eq 'OK';
$res = validate_network_and_mask($c, $rma_datas{validFromNetwork}, $rma_datas{validFromMask});
$result .= $res . ' ' unless $res eq 'OK';
#$result .= ' blocked for testing !' . $rma_datas{remove_nets};
} ## end if (!$result)
if (!$result) {
$res = change_settings($c, %rma_datas);
$result .= $res unless $res eq 'OK';
}
if ( ! $result ) {
$result = $c->l('rma_ACTION_SUCCEEDED');
$trt = 'SUC';
if ($result eq "") {
$result = $c->l('rma_SUCCESS');
$trt = 'SUC';
}
$c->stash(title => $title, notif => $result, rma_datas => \%rma_datas);
$c->stash( title => $title, notif => $result, rma_datas => \%rma_datas );
if ( $trt ne 'SUC' ) {
return $c->render(template => 'remoteaccess');
#return $c->render( template => 'remoteaccess' );
if ($trt eq 'SUC') {
$c->stash(title => $title, modul => $result);
return $c->render(template => 'module');
}
return $c->render(template => 'remoteaccess');
$c->redirect_to('/remoteaccess');
};
#$c->redirect_to('/remoteaccess');
} ## end sub do_action
sub networkAccess_list {
my $c = shift;
return [[ $c->l('rma_NO_ACCESS') => 'off'],
[ $c->l('NETWORKS_ALLOW_LOCAL') => 'private'],
[ $c->l('NETWORKS_ALLOW_PUBLIC') => 'public']];
}
return [
[ $c->l('rma_NO_ACCESS') => 'off' ],
[ $c->l('NETWORKS_ALLOW_LOCAL') => 'private' ],
[ $c->l('NETWORKS_ALLOW_PUBLIC') => 'public' ]
];
} ## end sub networkAccess_list
sub passwordLogin_list {
my $c = shift;
return [[$c->l('rma_PASSWORD_LOGIN_PRIVATE') => 'private'],
[$c->l('rma_PASSWORD_LOGIN_PUBLIC') => 'public']];
return [ [ $c->l('rma_PASSWORD_LOGIN_PRIVATE') => 'private' ], [ $c->l('rma_PASSWORD_LOGIN_PUBLIC') => 'public' ] ];
}
sub get_prop {
my ($c, $item, $prop) = @_;
warn "You must specify a record key" unless $item;
warn "You must specify a property name" unless $prop;
my $record = $db->get($item) or warn "Couldn't get record for $item";
return $record ? $record->prop($prop) : undef;
}
my ($c, $item, $prop) = @_;
warn "You must specify a record key" unless $item;
warn "You must specify a property name" unless $prop;
my $record = $db->get($item) or warn "Couldn't get record for $item";
return $record ? $record->prop($prop) : undef;
} ## end sub get_prop
sub get_value {
my $c = shift;
my $item = shift;
return ($db->get($item)->value());
}
my $c = shift;
my $item = shift;
return ($db->get($item)->value());
} ## end sub get_value
sub get_ftp_access {
my $status = get_prop('','ftp','status') || 'disabled';
my $status = get_prop('', 'ftp', 'status') || 'disabled';
return 'off' unless $status eq 'enabled';
my $access = get_prop('','ftp','access') || 'private';
return ($access eq 'public') ? 'normal' : 'private';
}
my $access = get_prop('', 'ftp', 'access') || 'private';
return ($access eq 'public') ? 'normal' : 'private';
} ## end sub get_ftp_access
#sub get_pptp_sessions {
# my $status = get_prop('','pptpd','status');
@@ -191,315 +170,264 @@ sub get_ftp_access {
# return(get_prop('','pptpd','sessions') || 'no');
# return '0';
#}
sub get_ssh_permit_root_login {
return(get_prop('','sshd','PermitRootLogin') || 'no');
return (get_prop('', 'sshd', 'PermitRootLogin') || 'no');
}
sub get_ssh_password_auth {
return(get_prop('','sshd','PasswordAuthentication') || 'yes');
return (get_prop('', 'sshd', 'PasswordAuthentication') || 'yes');
}
sub get_ssh_access {
my $status = get_prop('', 'sshd', 'status');
my $status = get_prop('','sshd','status');
if (defined($status) && ($status eq 'enabled')) {
my $access = get_prop('','sshd','access');
$access = ($access eq 'public') ? 'public' : 'private';
return($access);
}
else {
return('off');
}
}
if (defined($status) && ($status eq 'enabled')) {
my $access = get_prop('', 'sshd', 'access');
$access = ($access eq 'public') ? 'public' : 'private';
return ($access);
} else {
return ('off');
}
} ## end sub get_ssh_access
sub get_ssh_port {
return(get_prop('$c','sshd','TCPPort') || '22');
return (get_prop('$c', 'sshd', 'TCPPort') || '22');
}
sub get_ftp_password_login_access {
my $status = get_prop('','ftp','status') || 'disabled';
my $status = get_prop('', 'ftp', 'status') || 'disabled';
return 'private' unless $status eq 'enabled';
my $access = get_prop('','ftp','LoginAccess') || 'private';
return ($access eq 'public') ? 'public' : 'private';
}
my $access = get_prop('', 'ftp', 'LoginAccess') || 'private';
return ($access eq 'public') ? 'public' : 'private';
} ## end sub get_ftp_password_login_access
sub get_telnet_mode {
my $telnet = $db->get('telnet');
return ('off') unless $telnet;
my $status = $telnet->prop('status') || 'disabled';
return ('off') unless $status eq 'enabled';
my $access = $telnet->prop('access') || 'private';
return ($access eq "public") ? "public" : "private";
} ## end sub get_telnet_mode
my $telnet = $db->get('telnet');
return('off') unless $telnet;
my $status = $telnet->prop('status') || 'disabled';
return('off') unless $status eq 'enabled';
my $access = $telnet->prop('access') || 'private';
return ($access eq "public") ? "public" : "private";
}
sub get_ipsecrw_sessions {
my $status = $db->get('ipsec')->prop('RoadWarriorStatus');
if (defined($status) && ($status eq 'enabled')) {
return($db->get('ipsec')->prop('RoadWarriorSessions') || '0');
}
else {
return('0');
}
}
sub get_ipsecrw_sessions {
my $status = $db->get('ipsec')->prop('RoadWarriorStatus');
if (defined($status) && ($status eq 'enabled')) {
return ($db->get('ipsec')->prop('RoadWarriorSessions') || '0');
} else {
return ('0');
}
} ## end sub get_ipsecrw_sessions
sub get_ipsecrw_status {
return undef unless ( $db->get('ipsec'));
return $db->get('ipsec')->prop('RoadWarriorStatus');
return undef unless ($db->get('ipsec'));
return $db->get('ipsec')->prop('RoadWarriorStatus');
}
sub pptp_and_dhcp_range {
my $c = shift;
my $val = shift || 0;
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') || '';
my $c = shift;
my $val = shift || 0;
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') || '';
if ( $dhcp_status eq 'enabled' ) {
my $ip_start = unpack 'N', inet_aton($dhcp_start);
my $ip_end = unpack 'N', inet_aton($dhcp_end);
my $ip_count = $ip_end - $ip_start;
return 'OK' if( $val < $ip_count );
if ($dhcp_status eq 'enabled') {
my $ip_start = unpack 'N', inet_aton($dhcp_start);
my $ip_end = unpack 'N', inet_aton($dhcp_end);
my $ip_count = $ip_end - $ip_start;
return 'OK' if ($val < $ip_count);
return $c->l('rma_NUMBER_OF_PPTP_CLIENTS_MUST_BE_LESSER_THAN_NUMBER_OF_IP_IN_DHCP_RANGE');
} else {
return 'OK';
}
}
} ## end sub pptp_and_dhcp_range
sub _get_valid_from {
my $c = shift;
my $rec = $db->get('httpd-admin');
return undef unless($rec);
my @vals = (split ',', ($rec->prop('ValidFrom') || ''));
return @vals;
}
my $c = shift;
my $rec = $db->get('httpd-admin');
return undef unless ($rec);
my @vals = (split ',', ($rec->prop('ValidFrom') || ''));
return @vals;
} ## end sub _get_valid_from
sub ip_number_or_blank {
my $c = shift;
my $c = shift;
my $ip = shift;
if (!defined($ip) || $ip eq "") {
return 'OK';
return 'OK';
}
return ip_number($c, $ip);
}
} ## end sub ip_number_or_blank
sub subnet_mask_or_blank {
my $c = shift;
my $c = shift;
my $mask = shift;
if (!defined($mask) || $mask eq "") {
return "OK";
}
chomp $mask ;
return ( subnet_mask( $mask ) ne 'OK' ) ? $c->l('rma_INVALID_SUBNET_MASK') . " (" . $mask . ")" : 'OK';
}
chomp $mask;
return (subnet_mask($mask) ne 'OK')
? $c->l('rma_INVALID_SUBNET_MASK') . " (" . $mask . ")"
: 'OK';
} ## end sub subnet_mask_or_blank
sub validate_network_and_mask {
my $c = shift;
my $net = shift || "";
my $mask = shift || "";
my $c = shift;
my $net = shift || "";
my $mask = shift || "";
if ($net xor $mask) {
return $c->l('rma_ERR_INVALID_PARAMS' . " (" . $net."/".$mask . ")");
}
return 'OK';
}
if ($net xor $mask) {
return $c->l('rma_ERR_INVALID_PARAMS' . " (" . $net . "/" . $mask . ")");
}
return 'OK';
} ## end sub validate_network_and_mask
sub change_settings {
my ($c, %rma_datas) = @_;
#------------------------------------------------------------
# good; go ahead and change the access.
#------------------------------------------------------------
my $rec = $db->get('telnet');
if($rec) {
if ($rma_datas{telnetAccess} eq "off") {
$rec->set_prop('status','disabled');
} else {
$rec->set_prop('status','enabled');
$rec->set_prop('access', $rma_datas{telnetAccess});
}
}
$rec = $db->get('sshd') || $db->new_record('sshd', {type => 'service'});
if ($rec) {
if ($rma_datas{telnetAccess} eq "off") {
$rec->set_prop('status', 'disabled');
} else {
$rec->set_prop('status', 'enabled');
$rec->set_prop('access', $rma_datas{telnetAccess});
}
} ## end if ($rec)
$rec = $db->get('sshd') || $db->new_record('sshd', { type => 'service' });
$rec->set_prop('TCPPort', $rma_datas{sshTCPPort});
$rec->set_prop('status', ( $rma_datas{sshaccess} eq "off" ? 'disabled' : 'enabled'));
$rec->set_prop('access', $rma_datas{sshaccess});
$rec->set_prop('PermitRootLogin', $rma_datas{sshPermitRootLogin});
$rec->set_prop('status', ($rma_datas{sshaccess} eq "off" ? 'disabled' : 'enabled'));
$rec->set_prop('access', $rma_datas{sshaccess});
$rec->set_prop('PermitRootLogin', $rma_datas{sshPermitRootLogin});
$rec->set_prop('PasswordAuthentication', $rma_datas{sshPasswordAuthentication});
$rec = $db->get('ftp');
if($rec) {
if ($rma_datas{ftpAccess} eq "off") {
$rec->set_prop('status', 'disabled');
$rec->set_prop('access', 'private');
$rec->set_prop('LoginAccess', 'private');
} elsif ($rma_datas{ftpAccess} eq "normal") {
$rec->set_prop('status', 'enabled');
$rec->set_prop('access', 'public');
$rec->set_prop('LoginAccess', $rma_datas{ftpPasswordAccess});
} else {
$rec->set_prop('status', 'enabled');
$rec->set_prop('access', 'private');
$rec->set_prop('LoginAccess', $rma_datas{ftpPasswordAccess});
}
}
# if ($rma_datas{pptpSessions} == 0) {
# $db->get('pptpd')->set_prop('status', 'disabled');
# } else {
# $db->get('pptpd')->set_prop('status', 'enabled');
# $db->get('pptpd')->set_prop('sessions', $rma_datas{pptpSessions});
# }
if ($rec) {
if ($rma_datas{ftpAccess} eq "off") {
$rec->set_prop('status', 'disabled');
$rec->set_prop('access', 'private');
$rec->set_prop('LoginAccess', 'private');
} elsif ($rma_datas{ftpAccess} eq "normal") {
$rec->set_prop('status', 'enabled');
$rec->set_prop('access', 'public');
$rec->set_prop('LoginAccess', $rma_datas{ftpPasswordAccess});
} else {
$rec->set_prop('status', 'enabled');
$rec->set_prop('access', 'private');
$rec->set_prop('LoginAccess', $rma_datas{ftpPasswordAccess});
}
} ## end if ($rec)
if ( $rma_datas{validFromNetwork} && $rma_datas{validFromMask} ) {
unless (add_new_valid_from( $c, $rma_datas{validFromNetwork}, $rma_datas{validFromMask} )) {
return $c->l('rma_ERROR_UPDATING_CONFIGURATION') . 'new net';
}
}
# if ($rma_datas{pptpSessions} == 0) {
# $db->get('pptpd')->set_prop('status', 'disabled');
# } else {
# $db->get('pptpd')->set_prop('status', 'enabled');
# $db->get('pptpd')->set_prop('sessions', $rma_datas{pptpSessions});
# }
if ($rma_datas{validFromNetwork} && $rma_datas{validFromMask}) {
unless (add_new_valid_from($c, $rma_datas{validFromNetwork}, $rma_datas{validFromMask})) {
return $c->l('rma_ERROR_UPDATING_CONFIGURATION') . 'new net';
}
} ## end if ($rma_datas{validFromNetwork...})
if ($rma_datas{remove_nets}) {
unless (remove_valid_from($c, $rma_datas{remove_nets})) {
return $c->l('rma_ERROR_UPDATING_CONFIGURATION') . 'del net';
}
} ## end if ($rma_datas{remove_nets...})
if ( $rma_datas{remove_nets} ) {
unless (remove_valid_from( $c, $rma_datas{remove_nets} )) {
return $c->l('rma_ERROR_UPDATING_CONFIGURATION') . 'del net';
}
}
# reset ipsec roadwarrior CA,server,client certificates
if ($rma_datas{ipsecrwReset}) {
system('/sbin/e-smith/roadwarrior', 'reset_certs') == 0 or
return $c->l('rma_ERROR_UPDATING_CONFIGURATION') . 'rst ipsec';
system('/sbin/e-smith/roadwarrior', 'reset_certs') == 0
or return $c->l('rma_ERROR_UPDATING_CONFIGURATION') . 'rst ipsec';
}
if ( $rma_datas{ipsecrwSess} ) {
set_ipsecrw_sessions( $c, $rma_datas{ipsecrwSess} );
if ($rma_datas{ipsecrwSess}) {
set_ipsecrw_sessions($c, $rma_datas{ipsecrwSess});
}
unless ( system( "/sbin/e-smith/signal-event", "remoteaccess-update" ) == 0 ) {
unless (system("/sbin/e-smith/signal-event", "remoteaccess-update") == 0) {
return $c->l('rma_ERROR_UPDATING_CONFIGURATION');
}
return 'OK';
}
} ## end sub change_settings
sub set_ipsecrw_sessions {
my $c = shift;
my $c = shift;
my $sessions = shift;
if (defined $sessions) {
$db->get('ipsec')->set_prop('RoadWarriorSessions', $sessions);
if (int($sessions) > 0) {
$db->get('ipsec')->set_prop('RoadWarriorStatus', 'enabled');
}
}
return '';
}
$db->get('ipsec')->set_prop('RoadWarriorSessions', $sessions);
if (int($sessions) > 0) {
$db->get('ipsec')->set_prop('RoadWarriorStatus', 'enabled');
}
} ## end if (defined $sessions)
return '';
} ## end sub set_ipsecrw_sessions
sub add_new_valid_from {
my $c = shift;
my $net = shift;
my $mask = shift;
my $c = shift;
my $net = shift;
my $mask = shift;
# we transform bit mask to regular mask
$mask = get_reg_mask( $net, $mask );
my $rec = $db->get('httpd-admin');
return $c->error('ERR_NO_RECORD') unless $rec;
my $prop = $rec->prop('ValidFrom') || '';
my @vals = split /,/, $prop;
return '' if (grep /^$net\/$mask$/, @vals); # already have this entry
if ($prop ne '') {
$prop .= ",$net/$mask";
} else {
$prop = "$net/$mask";
}
$rec->set_prop('ValidFrom', $prop);
return 1;
}
# we transform bit mask to regular mask
$mask = get_reg_mask($net, $mask);
my $rec = $db->get('httpd-admin');
return $c->error('ERR_NO_RECORD') unless $rec;
my $prop = $rec->prop('ValidFrom') || '';
my @vals = split /,/, $prop;
return '' if (grep /^$net\/$mask$/, @vals); # already have this entry
if ($prop ne '') {
$prop .= ",$net/$mask";
} else {
$prop = "$net/$mask";
}
$rec->set_prop('ValidFrom', $prop);
return 1;
} ## end sub add_new_valid_from
sub remove_valid_from {
my $c = shift;
my $remove_nets = shift;
my @remove = split /,/, $remove_nets;
my $c = shift;
my $remove_nets = shift;
# my @remove = $c->param('Remove_nets');
my @vals = $c->_get_valid_from();
my @remove = split /,/, $remove_nets;
foreach my $entry (@remove) {
return undef unless $entry;
my ($net, $mask) = split(/\//, $entry);
# my @remove = $c->param('Remove_nets');
my @vals = $c->_get_valid_from();
foreach my $entry (@remove) {
return undef unless $entry;
my ($net, $mask) = split (/\//, $entry);
unless (@vals) {
print STDERR "ERROR: unable to load ValidFrom property from conf db\n";
return undef;
}
# what if we don't have a mask because someone added an entry from
# the command line? by the time we get here, the panel will have
# added a 32 bit mask, so we don't know for sure if the value in db
# is $net alone or $net/255.255.255.255. we have to check for both
# in this special case...
@vals = (grep { $entry ne $_ && $net ne $_ } @vals);
}
my $prop;
if (@vals) {
$prop = join ',',@vals;
} else {
$prop = '';
}
$db->get('httpd-admin')->set_prop('ValidFrom', $prop);
return 1;
}
unless (@vals) {
print STDERR "ERROR: unable to load ValidFrom property from conf db\n";
return undef;
}
# what if we don't have a mask because someone added an entry from
# the command line? by the time we get here, the panel will have
# added a 32 bit mask, so we don't know for sure if the value in db
# is $net alone or $net/255.255.255.255. we have to check for both
# in this special case...
@vals = (grep { $entry ne $_ && $net ne $_ } @vals);
} ## end foreach my $entry (@remove)
my $prop;
if (@vals) {
$prop = join ',', @vals;
} else {
$prop = '';
}
$db->get('httpd-admin')->set_prop('ValidFrom', $prop);
return 1;
} ## end sub remove_valid_from
1;

View File

@@ -1,56 +1,46 @@
package SrvMngr::Controller::Request;
#
# routes : end
#----------------------------------------------------------------------
use strict;
use warnings;
use Mojo::Base 'Mojolicious::Controller';
use Locale::gettext;
use SrvMngr::I18N;
use SrvMngr qw(theme_list init_session);
# retrieve a configuration db record
sub getconfig {
my $c = shift;
my $c = shift;
my $key = $c->param('key');
$c->app->log->info($c->log_req . ' ' . $key);
if ($key) {
use esmith::ConfigDB qw(open_ro);
my $cdb = esmith::ConfigDB->open_ro;
return getdb( $c, $cdb, $key);
}
}
use esmith::ConfigDB qw(open_ro);
my $cdb = esmith::ConfigDB->open_ro;
return getdb($c, $cdb, $key);
} ## end if ($key)
} ## end sub getconfig
# retrieve an accounts db record, given its name
sub getaccount {
my $c = shift;
my $c = shift;
my $key = $c->param('key');
$c->app->log->info($c->log_req . ' ' . $key);
if ($key) {
use esmith::AccountsDB qw(open_ro);
my $adb = esmith::AccountsDB->open_ro;
return getdb( $c, $adb, $key);
}
}
use esmith::AccountsDB qw(open_ro);
my $adb = esmith::AccountsDB->open_ro;
return getdb($c, $adb, $key);
} ## end if ($key)
} ## end sub getaccount
sub getdb {
my ($c, $db, $key) = @_;
if ( my $rec = $db->get($key) ) {
return $c->render(json => { $key => { $rec->props }} );
if (my $rec = $db->get($key)) {
return $c->render(json => { $key => { $rec->props } });
}
return undef;
}
} ## end sub getdb
1;

View File

@@ -7,76 +7,59 @@ package SrvMngr::Controller::Review;
# menu : N
# routes : end
#----------------------------------------------------------------------
# heading-o : Configuration
# 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::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 $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";
sub main {
my $c = shift;
$c->app->log->info($c->log_req);
my $title = $c->l('rvw_FORM_TITLE');
my $modul = $c->render_to_string(inline => $c->l('rvw_DESCRIPTION'));
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{'gateway'} =
$c->render_to_string(inline => print2_gateway_stanza($c));
$rvw_datas{'serveronly'} =
$c->render_to_string(inline => print2_serveronly_stanza($c));
$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{'gateway'} = $c->render_to_string(inline => print2_gateway_stanza($c));
$rvw_datas{'serveronly'} = $c->render_to_string(inline => print2_serveronly_stanza($c));
$rvw_datas{'addlocalnetworks'} = get_local_networks($c);
$rvw_datas{'dhcpserver'} =
$c->render_to_string(inline => print2_dhcp_stanza($c));
$rvw_datas{'dnsserver'} = (get_value('','LocalIP' )|| '');
$rvw_datas{'webserver'} = 'www.'.(get_local_domain());
$rvw_datas{'dhcpserver'} = $c->render_to_string(inline => print2_dhcp_stanza($c));
$rvw_datas{'dnsserver'} = (get_value('', 'LocalIP') || '');
$rvw_datas{'webserver'} = 'www.' . (get_local_domain());
my $port = $db->get_prop("squid", "TransparentPort") || 3128;
$rvw_datas{'proxyserver'} = 'proxy.'.get_local_domain().":$port";
$rvw_datas{'ftpserver'} = 'ftp.'.get_local_domain();
$rvw_datas{'smtpserver'} = 'mail.'.get_local_domain();
$rvw_datas{'domainname'} = (get_value('','DomainName' )|| '');
$rvw_datas{'virtualdomains'} =
$c->render_to_string(inline => gen2_domains($c));
$rvw_datas{'primarywebsite'} = 'http://www.'.get_value('','DomainName');
$rvw_datas{'servermanager'} = 'https://'. (get_value('','SystemName') || 'localhost').'/server-manager/';
$rvw_datas{'usermanager'} = 'https://'. (get_value('','SystemName') || 'localhost').'/user-password/';
$rvw_datas{'emailaddresses'} =
$c->render_to_string(inline => gen2_email_addresses($c));
$rvw_datas{'proxyserver'} = 'proxy.' . get_local_domain() . ":$port";
$rvw_datas{'ftpserver'} = 'ftp.' . get_local_domain();
$rvw_datas{'smtpserver'} = 'mail.' . get_local_domain();
$rvw_datas{'domainname'} = (get_value('', 'DomainName') || '');
$rvw_datas{'virtualdomains'} = $c->render_to_string(inline => gen2_domains($c));
$rvw_datas{'primarywebsite'} = 'http://www.' . get_value('', 'DomainName');
$rvw_datas{'servermanager'} = 'https://' . (get_value('', 'SystemName') || 'localhost') . '/server-manager/';
$rvw_datas{'usermanager'} = 'https://' . (get_value('', 'SystemName') || 'localhost') . '/user-password/';
$rvw_datas{'emailaddresses'} = $c->render_to_string(inline => gen2_email_addresses($c));
#$c->stash( releaseVersion => $c->session->{releaseVersion}, copyRight => $c->session->{copyRight},
#PwdSet => $c->session->{PwdSet}, Unsafe => $c->session->{Unsafe},
$c->stash( title => $title, modul => $modul, rvw_datas => \%rvw_datas,
);
#PwdSet => $c->session->{PwdSet}, Unsafe => $c->session->{Unsafe},
$c->stash(
title => $title,
modul => $modul,
rvw_datas => \%rvw_datas,
);
$c->render(template => 'review');
}
} ## end sub main
=head2 gen2_email_addresses
@@ -86,20 +69,28 @@ sub main {
=cut
sub gen2_email_addresses {
my $c = shift;
my $domain = get_value($c,'DomainName');
my $c = shift;
my $domain = get_value($c, 'DomainName');
my $useraccount = $c->l("rvw_EMAIL_USERACCOUNT");
my $firstname = $c->l("rvw_EMAIL_FIRSTNAME");
my $lastname = $c->l("rvw_EMAIL_LASTNAME");
my $out = "<I>" . $useraccount . "</I>\@" . $domain . "<BR>"
. "<I>" . $firstname . "</I>.<I>" . $lastname . "</I>\@" . $domain . "<BR>"
. "<I>" . $firstname . "</I>_<I>" . $lastname . "</I>\@" . $domain . "<BR>";
return $out;
}
my $firstname = $c->l("rvw_EMAIL_FIRSTNAME");
my $lastname = $c->l("rvw_EMAIL_LASTNAME");
my $out
= "<I>"
. $useraccount
. "</I>\@"
. $domain . "<BR>" . "<I>"
. $firstname
. "</I>.<I>"
. $lastname
. "</I>\@"
. $domain . "<BR>" . "<I>"
. $firstname
. "</I>_<I>"
. $lastname
. "</I>\@"
. $domain . "<BR>";
return $out;
} ## end sub gen2_email_addresses
=head2 gen2_domains
@@ -109,26 +100,25 @@ sub gen2_email_addresses {
=cut
sub gen2_domains {
my $c = shift;
my @virtual = $domains->get_all_by_prop( type => 'domain');
my $c = shift;
my @virtual = $domains->get_all_by_prop(type => 'domain');
my $numvirtual = @virtual;
if ($numvirtual == 0) {
$c->localise("NO_VIRTUAL_DOMAINS");
}
else {
} else {
my $out = "";
my $domain;
foreach $domain (sort @virtual) {
if ($out ne "") {
$out .= "<BR>";
}
$out .= $domain->key;
}
} ## end foreach $domain (sort @virtual)
return $out;
}
}
} ## end else [ if ($numvirtual == 0) ]
} ## end sub gen2_domains
=head2 get2_local_networks
@@ -138,33 +128,28 @@ serving. (mojo ver)
=cut
sub get2_local_networks {
my $c = shift;
my @nets = $networks->get_all_by_prop('type' => 'network');
my $c = shift;
my @nets = $networks->get_all_by_prop('type' => 'network');
my $numNetworks = @nets;
if ($numNetworks == 0) {
return $c->l('rvw_NO_NETWORKS');
}
else {
return $c->l('rvw_NO_NETWORKS');
} else {
my $out = "";
foreach my $network (sort @nets) {
if ($out ne "") {
$out .= "<BR>";
}
$out .= $network->key . "/" . get_net_prop($c, $network->key, 'Mask');
$out .= $network->key."/" . get_net_prop($c, $network->key, 'Mask');
if ( defined get_net_prop($c, $network->key, 'Router') ) {
$out .= " via " . get_net_prop ($c, $network->key, 'Router');
if (defined get_net_prop($c, $network->key, 'Router')) {
$out .= " via " . get_net_prop($c, $network->key, 'Router');
}
}
} ## end foreach my $network (sort @nets)
return $out;
}
}
} ## end else [ if ($numNetworks == 0)]
} ## end sub get2_local_networks
=head2 print2_gateway_stanza
@@ -172,28 +157,28 @@ If this system is a server gateway, show the external ip and gateway ip (mojo ve
=cut
sub print2_gateway_stanza
{
sub print2_gateway_stanza {
my $c = shift;
if (get_value($c,'SystemMode') =~ /servergateway/)
{
my $ip = get_value($c,'ExternalIP');
my $static =
(get_value($c, 'AccessType') eq 'dedicated') &&
(get_value($c, 'ExternalDHCP') eq 'off') &&
(get_prop($c, 'pppoe', 'status') eq 'disabled');
if ($static)
{
$ip .= "/".get_value($c,'ExternalNetmask');
}
my $out = $c->l('rvw_EXTERNAL_IP_ADDRESS_SUBNET_MASK').':'.$ip;
if ($static)
{
$out .= $c->l('rvw_GATEWAY').':'.get_value($c,'GatewayIP');
}
return $out
}
}
if (get_value($c, 'SystemMode') =~ /servergateway/) {
my $ip = get_value($c, 'ExternalIP');
my $static
= (get_value($c, 'AccessType') eq 'dedicated')
&& (get_value($c, 'ExternalDHCP') eq 'off')
&& (get_prop($c, 'pppoe', 'status') eq 'disabled');
if ($static) {
$ip .= "/" . get_value($c, 'ExternalNetmask');
}
my $out = $c->l('rvw_EXTERNAL_IP_ADDRESS_SUBNET_MASK') . ':' . $ip;
if ($static) {
$out .= $c->l('rvw_GATEWAY') . ':' . get_value($c, 'GatewayIP');
}
return $out;
} ## end if (get_value($c, 'SystemMode'...))
} ## end sub print2_gateway_stanza
=head2 print2_serveronly_stanza
If this system is a standalone server with net access, show the external
@@ -202,14 +187,15 @@ gateway IP (mojo ver)
=cut
sub print2_serveronly_stanza {
my $c = shift;
if ( (get_value($c,'SystemMode') eq 'serveronly') &&
get_value($c,'AccessType') &&
(get_value($c,'AccessType') ne "off")) {
return ( get_value($c,'GatewayIP') );
}
}
my $c = shift;
if ( (get_value($c, 'SystemMode') eq 'serveronly')
&& get_value($c, 'AccessType')
&& (get_value($c, 'AccessType') ne "off"))
{
return (get_value($c, 'GatewayIP'));
} ## end if ((get_value($c, 'SystemMode'...)))
} ## end sub print2_serveronly_stanza
=head2 print2_dhcp_stanza
@@ -220,16 +206,14 @@ Prints out the current state of dhcp service (mojo ver)
sub print2_dhcp_stanza {
my $c = shift;
my $out = (get_prop($c,'dhcpd','status') || 'disabled' );
my $out = (get_prop($c, 'dhcpd', 'status') || 'disabled');
if (get_prop($c,'dhcpd', 'status') eq 'enabled') {
$out .= '<br>'.$c->l('rvw_BEGINNING_OF_DHCP_ADDRESS_RANGE').':';
$out .= (get_prop($c,'dhcpd','start') || '' ).'<br>';
$out .= $c->l('rvw_END_OF_DHCP_ADDRESS_RANGE').':';
$out .= (get_prop($c,'dhcpd','end') || '' );
}
if (get_prop($c, 'dhcpd', 'status') eq 'enabled') {
$out .= '<br>' . $c->l('rvw_BEGINNING_OF_DHCP_ADDRESS_RANGE') . ':';
$out .= (get_prop($c, 'dhcpd', 'start') || '') . '<br>';
$out .= $c->l('rvw_END_OF_DHCP_ADDRESS_RANGE') . ':';
$out .= (get_prop($c, 'dhcpd', 'end') || '');
} ## end if (get_prop($c, 'dhcpd'...))
return $out;
}
} ## end sub print2_dhcp_stanza
1;

View File

@@ -0,0 +1,36 @@
package SrvMngr::Controller::Roundcubepanel;
#----------------------------------------------------------------------
# heading : System
# description : Roundcube webmail
# navigation : 99999 9999
#----------------------------------------------------------------------
#----------------------------------------------------------------------
# name : roundcubepanel, method : get, url : /roundcubepanel, ctlact : Roundcubepanel#main
#
# routes : end
#----------------------------------------------------------------------
use strict;
use warnings;
use Mojo::Base 'Mojolicious::Controller';
use Locale::gettext;
use SrvMngr::I18N;
use SrvMngr qw(theme_list init_session);
#use SrvMngr::Model::Main;
sub main {
my $c = shift;
$c->app->log->info($c->log_req);
my $title = $c->l('Roundcube 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->render(template => 'roundcube');
} ## end sub main
sub getroundcubeurl {
my $c = shift;
my $url = shift;
return "/smanager/roundcube?url=$url";
} ## end sub getroundcubeurl
1;

View File

@@ -11,34 +11,25 @@ package SrvMngr::Controller::Support;
use strict;
use warnings;
use Mojo::Base 'Mojolicious::Controller';
use SrvMngr qw(theme_list init_session);
use esmith::util;
sub display_licenses {
my $lang = shift;
my $lic = '';
my $lang = shift;
my $lic = '';
foreach my $license (esmith::util::getLicenses($lang)) {
$lic .= $license . '<br>';
}
return $lic;
}
foreach my $license (esmith::util::getLicenses($lang)) {
$lic .= $license . '<br>';
}
return $lic;
} ## end sub display_licenses
sub main {
my $c = shift;
$c->app->log->info($c->log_req);
my $title = $c->l('support_FORM_TITLE');
my $modul = $c->render_to_string(inline => display_licenses($c->session->{lang}));
$c->stash( title => $title, modul => $modul );
$c->stash(title => $title, modul => $modul);
$c->render(template => 'module');
};
} ## end sub main
1;

View File

@@ -1,51 +1,39 @@
package SrvMngr::Controller::Swttheme;
#
# routes : end
#----------------------------------------------------------------------
use strict;
use warnings;
use Mojo::Base 'Mojolicious::Controller';
#use SrvMngr qw(theme_list init_session);
our $db = esmith::ConfigDB->open() || die "Couldn't open config db";
sub main {
my $c = shift;
my $from = $c->param('From') || '/';
my $c = shift;
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' ) {
# # Put the new theme first
# my $t_path = $c->app->home->rel_file('themes/'.$theme);
# unshift @{$c->app->renderer->paths}, $t_path.'/templates' if -d $t_path.'/templates';
# unshift @{$c->app->static->paths}, $t_path.'/public' if -d $t_path.'/public';
# }
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' ) {
# # Put the new theme first
# my $t_path = $c->app->home->rel_file('themes/'.$theme);
# unshift @{$c->app->renderer->paths}, $t_path.'/templates' if -d $t_path.'/templates';
# unshift @{$c->app->static->paths}, $t_path.'/public' if -d $t_path.'/public';
# }
$c->session->{CurrentTheme} = $theme;
$db->get('smanager')->set_prop('Theme', $theme);
system ("/sbin/e-smith/signal-event smanager-theme-change") == 0
or warn "$c->l('ERROR_UPDATING')";
}
$db->get('smanager')->set_prop('Theme', $theme);
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') );
$from = '/initial' if $from eq '/';
$from = '/' . $from if ( $from !~ m|^\/| );
$c->redirect_to( $from);
}
$from = '/initial' if $from eq '/';
$from = '/' . $from if ($from !~ m|^\/|);
$c->redirect_to($from);
} ## end sub main
1;

View File

@@ -1,38 +0,0 @@
package SrvMngr::Controller::Userpanelaccess;
#----------------------------------------------------------------------
# heading : User management
# description : User Panel Access
# navigation : 2000 150
# menu :
#----------------------------------------------------------------------
# name : userpanelaccess, method : get, url : /userpanelaccess, ctlact : Userpanelaccess#main
#
# routes : end
#----------------------------------------------------------------------
use strict;
use warnings;
use Mojo::Base 'Mojolicious::Controller';
use Locale::gettext;
use SrvMngr::I18N;
use SrvMngr qw(theme_list init_session);
#use SrvMngr::Model::Main;
sub main {
my $c = shift;
$c->app->log->info($c->log_req);
my $title = $c->l('User panel access');
$c->stash( title => $title, modul => 'https://mailserver.bjsystems.co.uk/server-manager/cgi-bin/userpanelaccess', height => 600 );
$c->render(template => 'embedded');
}
1;

View File

@@ -8,182 +8,165 @@ package SrvMngr::Controller::Userpassword;
#
# routes : end
#----------------------------------------------------------------------
use strict;
use warnings;
use Mojo::Base 'Mojolicious::Controller';
use esmith::util;
use esmith::ConfigDB;
use esmith::AccountsDB;
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";
sub main {
my $c = shift;
my $c = shift;
my %pwd_datas = ();
if ( $c->is_logged_in ) {
$pwd_datas{Account} = $c->session->{username};
$pwd_datas{trt} = 'NORM';
if ($c->is_logged_in) {
$pwd_datas{Account} = $c->session->{username};
$pwd_datas{trt} = 'NORM';
} else {
my $rt = $c->current_route;
my $mess = '';
my $jwt = $c->param('jwt') || '';
my $name = $c->jwt->decode($jwt)->{username} || '';
my $rt = $c->current_route;
my $mess = '';
my $jwt = $c->param('jwt') || '';
my $name = $c->jwt->decode($jwt)->{username} || '';
$mess = 'Invalid state' unless ($jwt and $name and $rt eq 'upwdreset');
$mess = 'Invalid state' unless ($jwt and $name and $rt eq 'upwdreset');
# request already treated or outdated
if ( $c->pwdrst->{$name}{confirmed} != 1 or $c->pwdrst->{$name}{date} < time() ) {
$mess = $c->l('use_INVALID_REQUEST').' -step 1-';
}
if ($c->pwdrst->{$name}{confirmed} != 1 or $c->pwdrst->{$name}{date} < time()) {
$mess = $c->l('use_INVALID_REQUEST') . ' -step 1-';
}
if ($mess) {
$c->stash(error => $mess);
return $c->redirect_to($c->home_page);
}
if ( $mess ) {
$c->stash( error => $mess );
return $c->redirect_to ( $c->home_page );
}
# ok for reset password for this account - step 2
$c->pwdrst->{$name}{confirmed} = 2;
$pwd_datas{Account} = $name;
$pwd_datas{trt} = 'RESET';
$pwd_datas{jwt} = $jwt;
$c->flash( success => $c->l('use_OK_FOR_RESET') );
}
$c->stash( pwd_datas => \%pwd_datas );
$c->render( 'userpassword' );
}
$c->pwdrst->{$name}{confirmed} = 2;
$pwd_datas{Account} = $name;
$pwd_datas{trt} = 'RESET';
$pwd_datas{jwt} = $jwt;
$c->flash(success => $c->l('use_OK_FOR_RESET'));
} ## end else [ if ($c->is_logged_in) ]
$c->stash(pwd_datas => \%pwd_datas);
$c->render('userpassword');
} ## end sub main
sub change_password {
my $c = shift;
my $result;
my $res;
my %pwd_datas = ();
my $trt = $c->param('Trt');
my $acctName = $c->param('User');
my $oldPass = $c->param('Oldpass') || '';
my $pass = $c->param('Pass');
my %pwd_datas = ();
my $trt = $c->param('Trt');
my $acctName = $c->param('User');
my $oldPass = $c->param('Oldpass') || '';
my $pass = $c->param('Pass');
my $passVerify = $c->param('Passverify');
my $jwt = $c->param('jwt') || '';
my $rt = $c->current_route;
my $mess = ''; my $name = '';
my $jwt = $c->param('jwt') || '';
my $rt = $c->current_route;
my $mess = '';
my $name = '';
$name = $c->jwt->decode($jwt)->{username} if $jwt;
if ( $trt eq 'RESET' ) {
$mess = 'Invalid state' unless ($jwt and $name and ($rt eq 'upwdreset2'));
# request already treated or outdated
if ( $c->pwdrst->{$name}{confirmed} != 2 or $c->pwdrst->{$name}{date} < time() ) {
$mess = $c->l('use_INVALID_REQUEST').' -step 2-';
}
if ( ! $name or $c->is_logged_in or $name ne $acctName ) {
$mess = 'Invalid reset state';
if ($trt eq 'RESET') {
$mess = 'Invalid state' unless ($jwt and $name and ($rt eq 'upwdreset2'));
# request already treated or outdated
if ($c->pwdrst->{$name}{confirmed} != 2 or $c->pwdrst->{$name}{date} < time()) {
$mess = $c->l('use_INVALID_REQUEST') . ' -step 2-';
}
if (!$name or $c->is_logged_in or $name ne $acctName) {
$mess = 'Invalid reset state';
}
} else {
if ( $name or $jwt or ! $c->is_logged_in ) {
$mess = 'Invalid update state';
}
}
if ( $mess ) {
$c->stash( error => $mess );
return $c->redirect_to ( $c->home_page );
}
if ($name or $jwt or !$c->is_logged_in) {
$mess = 'Invalid update state';
}
} ## end else [ if ($trt eq 'RESET') ]
if ($mess) {
$c->stash(error => $mess);
return $c->redirect_to($c->home_page);
}
$pwd_datas{Account} = $acctName;
$pwd_datas{trt} = $trt;
$pwd_datas{trt} = $trt;
# common controls
if ( $acctName eq 'admin' ) {
if ($acctName eq 'admin') {
$result .= "Admin password should not be reset here !";
} else {
unless ( $pass && $passVerify ) {
$result .= $c->l('pwd_FIELDS_REQUIRED') . "<br>";
} else {
$result .= $c->l('pwd_PASSWORD_INVALID_CHARS') . "<br>" unless (($pass) = ($pass =~ /^([ -~]+)$/ ));
$result .= $c->l('pwd_PASSWORD_VERIFY_ERROR') . "<br>" unless ( $pass eq $passVerify );
}
}
if ( $result ne '' ) {
$c->stash( error => $result, pwd_datas => \%pwd_datas );
return $c->render( 'userpassword' );
unless ($pass && $passVerify) {
$result .= $c->l('pwd_FIELDS_REQUIRED') . "<br>";
} else {
$result .= $c->l('pwd_PASSWORD_INVALID_CHARS') . "<br>" unless (($pass) = ($pass =~ /^([ -~]+)$/));
$result .= $c->l('pwd_PASSWORD_VERIFY_ERROR') . "<br>" unless ($pass eq $passVerify);
}
} ## end else [ if ($acctName eq 'admin')]
if ($result ne '') {
$c->stash(error => $result, pwd_datas => \%pwd_datas);
return $c->render('userpassword');
}
# validate new password
$res = $c->check_password( $pass );
$result .= $res . "<br>" unless ( $res eq 'OK' );
$res = $c->check_password($pass);
$result .= $res . "<br>" unless ($res eq 'OK');
# controls old password
if ( $trt ne 'RESET' ) {
unless ( $oldPass ) {
$result .= $c->l('pwd_FIELDS_REQUIRED') . "<br>" unless $trt eq 'RESET';
if ($trt ne 'RESET') {
unless ($oldPass) {
$result .= $c->l('pwd_FIELDS_REQUIRED') . "<br>" unless $trt eq 'RESET';
} else {
$result .= $c->l('pwd_PASSWORD_OLD_INVALID_CHARS') . "<br>" unless (($oldPass) = ($oldPass =~ /^(\S+)$/ ));
$result .= $c->l('pwd_PASSWORD_OLD_INVALID_CHARS') . "<br>" unless (($oldPass) = ($oldPass =~ /^(\S+)$/));
}
if ( $result ne '' ) {
$c->stash( error => $result, pwd_datas => \%pwd_datas );
return $c->render( 'userpassword' );
if ($result ne '') {
$c->stash(error => $result, pwd_datas => \%pwd_datas);
return $c->render('userpassword');
}
# verify old password
if ( $trt ne 'RESET') {
$result .= $c->l('pwd_ERROR_PASSWORD_CHANGE') . "<br>"
unless (SrvMngr::Model::Main->check_credentials($acctName, $oldPass));
}
}
if ($trt ne 'RESET') {
$result .= $c->l('pwd_ERROR_PASSWORD_CHANGE') . "<br>"
unless (SrvMngr::Model::Main->check_credentials($acctName, $oldPass));
}
} ## end if ($trt ne 'RESET')
# $result .= 'Blocked for test (prevents updates)<br>';
if ( ! $result ) {
my $res = $c->reset_password( $trt, $acctName, $pass, $oldPass );
if (!$result) {
my $res = $c->reset_password($trt, $acctName, $pass, $oldPass);
$result .= $res unless $res eq 'OK';
}
if ( $result ) {
record_password_change_attempt($c, 'FAILED');
$c->stash( error => $result, pwd_datas => \%pwd_datas );
return $c->render( 'userpassword' );
}
if ($result) {
record_password_change_attempt($c, 'FAILED');
$c->stash(error => $result, pwd_datas => \%pwd_datas);
return $c->render('userpassword');
} ## end if ($result)
$c->pwdrst->{$name}{confirmed} = 9 if $trt eq 'RESET';
record_password_change_attempt($c, 'SUCCESS');
$result .= $c->l('pwd_PASSWORD_CHANGE_SUCCESS');
$c->flash( success => $result );
$c->redirect_to( $c->home_page );
}
$c->flash(success => $result);
$c->redirect_to($c->home_page);
} ## end sub change_password
sub reset_password {
my ($c, $trt, $user, $password, $oldpassword) = @_;
my $ret;
return $c->l('usr_TAINTED_USER') unless (($user) = ($user =~ /^(\w[\-\w_\.]*)$/));
$user = $1;
my $adb = esmith::AccountsDB->open();
my $adb = esmith::AccountsDB->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';
$ret = esmith::util::setUserPassword( $user, $password ) if $trt eq 'RESET';
return $c->l('pwd_ERROR_PASSWORD_CHANGE') .' '. $trt unless $ret;
return $c->l('NO_SUCH_USER', $user) unless ($acct->prop('type') eq 'user');
$ret = esmith::util::setUserPasswordRequirePrevious($user, $oldpassword, $password) if $trt ne 'RESET';
$ret = esmith::util::setUserPassword($user, $password) if $trt eq 'RESET';
return $c->l('pwd_ERROR_PASSWORD_CHANGE') . ' ' . $trt unless $ret;
$acct->set_prop("PasswordSet", "yes");
undef $adb;
@@ -192,66 +175,52 @@ sub reset_password {
return $c->l("usr_ERR_OCCURRED_MODIFYING_PASSWORD");
}
$adb = esmith::AccountsDB->open();
return 'OK';
}
} ## end sub reset_password
sub record_password_change_attempt {
my ($c, $result) = @_;
my $user = $c->param('User');
my $ip_address = $c->tx->remote_address;
my ($c, $result) = @_;
my $user = $c->param('User');
my $ip_address = $c->tx->remote_address;
if ($result eq 'SUCCESS') {
$c->app->log->info(join "\t", "Password change succeeded: $user", $ip_address);
} else {
$c->app->log->info(join "\t", "Password change FAILED: $user", $ip_address);
}
}
if ($result eq 'SUCCESS') {
$c->app->log->info(join "\t", "Password change succeeded: $user", $ip_address);
} else {
$c->app->log->info(join "\t", "Password change FAILED: $user", $ip_address);
}
} ## end sub record_password_change_attempt
sub check_password {
my $c = shift;
my $password = shift;
my $strength;
my $rec = $cdb->get('passwordstrength');
$strength = ($rec ? ($rec->prop('Users') || 'none') : 'none');
return validate_password( $c, $strength, $password );
}
my $c = shift;
my $password = shift;
my $strength;
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 $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' ) {
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) . ".";
}
return
$c->l("Bad Password Choice") . ": "
. $c->l("The password you have chosen is not a good choice, because") . " "
. $c->($reason) . ".";
} ## end sub validate_password
1;

View File

@@ -13,145 +13,122 @@ 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 File::Temp qw(tempfile);
use constant TRUE => 1;
use constant FALSE => 0;
our $cdb = esmith::ConfigDB->open() || die "Couldn't open config db";
our @logfiles = (); # with array
our @logfiles = (); # with array
sub main {
my $c = shift;
$c->app->log->info($c->log_req);
my %log_datas = ();
my $title = $c->l('log_FORM_TITLE');
my $notif = '';
$log_datas{default_op} =
($cdb->get('viewlogfiles')->prop('DefaultOperation')) || 'view';
$c->stash( title => $title, notif => $notif, log_datas => \%log_datas);
my $title = $c->l('log_FORM_TITLE');
my $notif = '';
$log_datas{default_op} = ($cdb->get('viewlogfiles')->prop('DefaultOperation')) || 'view';
$c->stash(title => $title, notif => $notif, log_datas => \%log_datas);
$c->render(template => 'viewlogfiles');
};
} ## end sub main
sub do_action {
my $c = shift;
$c->app->log->info($c->log_req);
my $title = $c->l('log_FORM_TITLE');
my $notif = '';
my $result = "";
my $title = $c->l('log_FORM_TITLE');
my $notif = '';
my $result = "";
my %log_datas = ();
$log_datas{filename} = $c->param('Filename');
$log_datas{matchpattern} = $c->param('Matchpattern');
$log_datas{filename} = $c->param('Filename');
$log_datas{matchpattern} = $c->param('Matchpattern');
$log_datas{highlightpattern} = $c->param('Highlightpattern');
$log_datas{operation} = $c->param('Operation');
if ($log_datas{operation} eq 'download') {
$log_datas{'trt'} = "DOWN"
} else {
$log_datas{'trt'} = "SHOW"
}
$log_datas{operation} = $c->param('Operation');
if ($log_datas{operation} eq 'download') {
$log_datas{'trt'} = "DOWN";
} else {
$log_datas{'trt'} = "SHOW";
}
if ($log_datas{filename} =~ /^([\S\s]+)$/) {
$log_datas{filename} = $1;
$log_datas{filename} = $1;
} elsif ($log_datas{filename} =~ /^$/) {
$log_datas{filename} = "messages";
$log_datas{filename} = "messages";
} else {
$result .= $c->l("log_FILENAME_ERROR", $log_datas{filename} )
. " ";
}
if ($log_datas{matchpattern} =~ /^(\S+)$/) {
$log_datas{matchpattern} = $1;
} else {
$log_datas{matchpattern} = ".";
}
if ($log_datas{highlightpattern} =~ /^(\S+)$/) {
$log_datas{highlightpattern} = $1;
} else {
$log_datas{highlightpattern} = '';
$result .= $c->l("log_FILENAME_ERROR", $log_datas{filename}) . " ";
}
if ($log_datas{matchpattern} =~ /^(\S+)$/) {
$log_datas{matchpattern} = $1;
} else {
$log_datas{matchpattern} = ".";
}
if ($log_datas{highlightpattern} =~ /^(\S+)$/) {
$log_datas{highlightpattern} = $1;
} else {
$log_datas{highlightpattern} = '';
}
my $fullpath = "/var/log/$log_datas{filename}";
if (-z $fullpath) {
$result .= $c->l("log_LOG_FILE_EMPTY", "$log_datas{filename}" );
$result .= $c->l("log_LOG_FILE_EMPTY", "$log_datas{filename}");
}
if ($log_datas{trt} eq "SHOW") {
if ( ! $result ) {
$result = $c->render_to_string(inline => showlogFile( $c, %log_datas ));
}
if (!$result) {
$result = $c->render_to_string(inline => showlogFile($c, %log_datas));
}
if ( $result ) {
$c->stash(title => $title, modul => $result, log_datas => \%log_datas);
return $c->render(template => 'viewlogfiles2');
}
}
if ($result) {
$c->stash(title => $title, modul => $result, log_datas => \%log_datas);
return $c->render(template => 'viewlogfiles2');
}
} ## end if ($log_datas{trt} eq...)
if ( $log_datas{trt} eq 'DOWN' ) {
my $modul = 'Log file download';
$notif = download_logFile( $c, %log_datas );
return undef unless defined $notif;
}
$c->stash( title => $title, notif => $notif, log_datas => \%log_datas);
if ($log_datas{trt} eq 'DOWN') {
my $modul = 'Log file download';
$notif = download_logFile($c, %log_datas);
return undef unless defined $notif;
} ## end if ($log_datas{trt} eq...)
$c->stash(title => $title, notif => $notif, log_datas => \%log_datas);
$c->render(template => 'viewlogfiles');
} ## end sub do_action
};
sub timestamp2local
{
sub timestamp2local {
$_ = shift;
if (/^(\@[0-9a-f]{24})(.*)/s)
{
return Time::TAI64::tai64nlocal($1) . $2;
}
elsif (/^([0-9]{10}\.[0-9]{3})(.*)/s)
{
return localtime($1) . $2;
if (/^(\@[0-9a-f]{24})(.*)/s) {
return Time::TAI64::tai64nlocal($1) . $2;
} elsif (/^([0-9]{10}\.[0-9]{3})(.*)/s) {
return localtime($1) . $2;
}
return $_;
}
} ## end sub timestamp2local
sub findlogFiles {
my $c = shift;
use File::Find;
sub findlogfiles
{
sub findlogfiles {
my $path = $File::Find::name;
if (-f)
{
if (-f) {
# Remove leading /var/log/messages
$path =~ s:^/var/log/::;
# don't bother to collect files known to be non-text
# or not log files
foreach (qw(
foreach (
qw(
journal
lastlog
btmp$
wtmp
@@ -161,176 +138,160 @@ sub findlogFiles {
httpd/ssl_scache.pag
httpd/ssl_scache.dir
\/config$
))
)
)
{
return if $path =~ /$_/;
}
} ## end foreach (qw( lastlog btmp$ wtmp...))
my ($file_base, $file_path, $file_type) = fileparse($path);
if ( $file_base =~ /@.*/ )
{
if ($file_base =~ /@.*/) {
#$logfiles{$path} = $file_path . timestamp2local($file_base);
push @logfiles, [ $file_path . timestamp2local($file_base), $path ];
}
else
{
push @logfiles, [ $file_path . timestamp2local($file_base), $path ];
} else {
#$logfiles{$path} = $path;
push @logfiles, [ $path, $path ];
push @logfiles, [ $path, $path ];
}
}
}
} ## end if (-f)
} ## end sub findlogfiles
@logfiles = ();
# Now go and find all the files under /var/log
find({wanted => \&findlogfiles, no_chdir => 1}, '/var/log');
find({ wanted => \&findlogfiles, no_chdir => 1 }, '/var/log');
my @logf = sort { $a->[0] cmp $b->[0] } @logfiles;
return \@logf;
}
} ## end sub findlogFiles
sub showlogFile {
my ($c, %log_datas) = @_;
my $fullpath = "/var/log/$log_datas{filename}";
my $out = '';
my $out = '';
$out .= sprintf("$fullpath: \n");
$out .= sprintf($c->l("log_VIEWING_TIME", $c->gen_locale_date_string()));
$out .= sprintf($c->l("log_VIEWING_TIME", $c->gen_locale_date_string() ));
unless ($log_datas{matchpattern} eq '.') {
unless ( $log_datas{matchpattern} eq '.' )
{
#$out .= sprintf("<p>\n");
$out .= sprintf($c->l("log_MATCH_HEADER", $log_datas{matchpattern} ));
}
$out .= sprintf($c->l("log_MATCH_HEADER", $log_datas{matchpattern}));
} ## end unless ($log_datas{matchpattern...})
if ($log_datas{highlightpattern}) {
if ( $log_datas{highlightpattern} )
{
#$out .= sprintf("<p>\n");
$out .= sprintf($c->l("log_HIGHLIGHT_HEADER", "$log_datas{highlightpattern}" ));
}
$out .= sprintf($c->l("log_HIGHLIGHT_HEADER", "$log_datas{highlightpattern}"));
} ## end if ($log_datas{highlightpattern...})
if ($log_datas{filename} =~ /\.gz$/) {
my $pid = open(LOGFILE, "-|");
die "Couldn't fork: $!" unless defined $pid;
unless ($pid) {
# Child
exec("/bin/zcat", $fullpath)
|| die "Can't exec zcat: $!";
|| die "Can't exec zcat: $!";
# NOTREACHED
}
} ## end unless ($pid)
} else {
open(LOGFILE, "$fullpath");
}
my $somethingMatched = 0;
my $fileEmpty = 1;
my $fileEmpty = 1;
$out .= sprintf("<PRE>");
while(<LOGFILE>)
{
while (<LOGFILE>) {
$fileEmpty = 0;
next unless /$log_datas{matchpattern}/;
$somethingMatched = 1;
$_ = timestamp2local($_);
$_ = HTML::Entities::encode_entities($_);
$_ = timestamp2local($_);
$_ = HTML::Entities::encode_entities($_);
($log_datas{highlightpattern} && /$log_datas{highlightpattern}/)
? $out .= sprintf( "<b>$_</b>" )
: $out .= sprintf("$_");
}
? $out .= sprintf("<b>$_</b>")
: $out .= sprintf("$_");
} ## end while (<LOGFILE>)
$out .= sprintf("</PRE>");
if ($fileEmpty) {
$out .= sprintf("<p>\n");
$out .= sprintf($c->l("log_LOG_FILE_EMPTY"));
} else {
unless ($somethingMatched)
{
unless ($somethingMatched) {
$out .= sprintf("<p>\n");
$out .= sprintf($c->l("log_NO_MATCHING_LINES"));
}
}
} ## end else [ if ($fileEmpty) ]
close LOGFILE;
return $out;
}
} ## end sub showlogFile
sub download_logFile {
my ($c, %log_datas) = @_;
my $fullpath = "/var/log/$log_datas{filename}";
# Save this information for later.
$cdb->get('viewlogfiles')->merge_props('DefaultOperation', $log_datas{operation});
# If the client is on windows, we must handle this a little differently.
my $win32 = FALSE;
my $mac = FALSE;
my $agent = $ENV{HTTP_USER_AGENT} || "";
if ($agent =~ /win32|windows/i) {
$win32 = TRUE;
} elsif ($agent =~ /mac/i) {
} elsif ($agent =~ /mac/i) {
$mac = TRUE;
}
# Check for errors first. Once we start sending the file it's too late to
# report them.
my $error = "";
unless (-f $fullpath) {
unless (-f $fullpath) {
$error = $c->l("log_ERR_NOEXIST_FILE") . $fullpath;
}
local *FILE;
open(FILE, "<$fullpath")
or $error = $c->l("log_ERR_NOOPEN_FILE");
# Put other error checking here.
# Put other error checking here.
return $error if $error;
# Fix the filename, as it might have a directory prefixed to it.
# Fix the filename, as it might have a directory prefixed to it.
my $filename = $log_datas{filename};
if ( $filename =~ m#/# ) {
if ($filename =~ m#/#) {
$filename = (split /\//, $filename)[-1];
}
# And send the file.
my $nl = "\n";
if ($win32) { $nl = "\r\n" }
elsif ($mac) { $nl = "\r" }
if ($win32) { $nl = "\r\n" }
elsif ($mac) { $nl = "\r" }
# Otherwise, send the file. Start with the headers.
# Note: The Content-disposition must be attachment, or IE will view the
# file inline like it's told. It ignores the Content-type, but it likes
# the Content-disposition (an officially unsupported header) for some
# reason. Yay Microsoft.
my $file2 = new File::Temp( UNLINK => 0 );
my $file2 = new File::Temp(UNLINK => 0);
while (my $line = <FILE>) {
chomp $line;
my $linew = timestamp2local($line) . $nl;
print $file2 $linew;
}
} ## end while (my $line = <FILE>)
close(FILE);
$c->render_file(
'filepath' => "$file2",
'filename' => "$filename",
'format' => 'x-download',
'content_disposition' => 'attachment',
'cleanup' => 1,
'filepath' => "$file2",
'filename' => "$filename",
'format' => 'x-download',
'content_disposition' => 'attachment',
'cleanup' => 1,
);
return undef;
}
1;
} ## end sub download_logFile
1;

View File

@@ -10,94 +10,71 @@ package SrvMngr::Controller::Workgroup;
use strict;
use warnings;
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";
sub main {
my $c = shift;
$c->app->log->info($c->log_req);
my %wkg_datas = ();
my $title = $c->l('wkg_FORM_TITLE');
my $modul = '';
$wkg_datas{'Workgroup'} = ($db->get_prop('smb','Workgroup')) || '';
$wkg_datas{'ServerName'} = ($db->get_prop('smb','ServerName')) || '';
$wkg_datas{'ServerRole'} = ($db->get_prop('smb','ServerRole')) || '';
$wkg_datas{'RoamingProfiles'} = ($db->get_prop('smb','RoamingProfiles')) || '';
$c->stash( title => $title, modul => $modul, wkg_datas => \%wkg_datas );
my $title = $c->l('wkg_FORM_TITLE');
my $modul = '';
$wkg_datas{'Workgroup'} = ($db->get_prop('smb', 'Workgroup')) || '';
$wkg_datas{'ServerName'} = ($db->get_prop('smb', 'ServerName')) || '';
$wkg_datas{'ServerRole'} = ($db->get_prop('smb', 'ServerRole')) || '';
$wkg_datas{'RoamingProfiles'} = ($db->get_prop('smb', 'RoamingProfiles')) || '';
$c->stash(title => $title, modul => $modul, wkg_datas => \%wkg_datas);
$c->render(template => 'workgroup');
};
} ## end sub main
sub do_update {
my $c = shift;
$c->app->log->info($c->log_req);
my $result = "";
my $workgroup = ($c->param('Workgroup') || 'no');
my $servername = ($c->param('ServerName') || 'WS');
my $result = "";
my $workgroup = ($c->param('Workgroup') || 'no');
my $servername = ($c->param('ServerName') || 'WS');
my $roamingprofiles = ($c->param('RoamingProfiles') || 'no');
my $serverrole = ($c->param('ServerRole') || 'WS');
my $serverrole = ($c->param('ServerRole') || 'WS');
# controls
my $res = validate2_workgroup($c, $workgroup, $servername);
$result .= $res unless $res eq 'OK';
$res = validate2_servername($c, $servername);
$result .= $res unless $res eq 'OK';
if ($result eq '') {
$db->get('smb')->set_prop('Workgroup', $workgroup);
$db->get('smb')->set_prop('ServerRole', $serverrole);
$db->get('smb')->set_prop('ServerName', $servername);
$db->get('smb')->set_prop('Workgroup', $workgroup);
$db->get('smb')->set_prop('ServerRole', $serverrole);
$db->get('smb')->set_prop('ServerName', $servername);
$db->get('smb')->set_prop('RoamingProfiles', $roamingprofiles);
}
system( "/sbin/e-smith/signal-event", "workgroup-update" ) == 0
or $result = $c->l('ERROR_UPDATING') . " system";
} ## end if ($result eq '')
system("/sbin/e-smith/signal-event", "workgroup-update") == 0
or $result = $c->l('ERROR_UPDATING') . " system";
my $title = $c->l('wkg_FORM_TITLE');
if ( $result eq '' ) { $result = $c->l('wkg_SUCCESS'); }
$c->stash( title => $title, modul => $result );
if ($result eq '') { $result = $c->l('wkg_SUCCESS'); }
$c->stash(title => $title, modul => $result);
$c->render(template => 'module');
};
} ## end sub do_update
sub validate2_servername {
my $c = shift;
my $c = shift;
my $servername = shift;
return ('OK') if ( $servername =~ /^([a-zA-Z][\-\w]*)$/ );
return ('OK') if ($servername =~ /^([a-zA-Z][\-\w]*)$/);
return $c->l('INVALID_SERVERNAME');
}
} ## end sub validate2_servername
sub validate2_workgroup {
my $c = shift;
my $workgroup = lc(shift);
my $c = shift;
my $workgroup = lc(shift);
my $servername = lc(shift);
# my $workgroup = $c->l(shift);
# my $servername = $c->l(shift);
return $c->l('INVALID_WORKGROUP') unless ( $workgroup =~ /^([a-zA-Z0-9][\-\w\.]*)$/ );
return $c->l('INVALID_WORKGROUP_MATCHES_SERVERNAME') if ( $servername eq $workgroup);
return ('OK');
}
# my $workgroup = $c->l(shift);
# my $servername = $c->l(shift);
return $c->l('INVALID_WORKGROUP') unless ($workgroup =~ /^([a-zA-Z0-9][\-\w\.]*)$/);
return $c->l('INVALID_WORKGROUP_MATCHES_SERVERNAME') if ($servername eq $workgroup);
return ('OK');
} ## end sub validate2_workgroup
1;

View File

@@ -10,249 +10,238 @@ package SrvMngr::Controller::Yum;
use strict;
use warnings;
use Mojo::Base 'Mojolicious::Controller';
use Locale::gettext;
use SrvMngr::I18N;
use SrvMngr qw(theme_list init_session ip_number_or_blank);
use esmith::ConfigDB;
use esmith::util;
use File::Basename;
our $cdb = esmith::ConfigDB->open || die "Couldn't open config db";
my $dnf_status_file = '/var/cache/dnf/dnf.status';
#use File::stat;
our %dbs;
for ( qw(available installed updates) )
{
$dbs{$_} = esmith::ConfigDB->open_ro("yum_$_") or
die "Couldn't open yum_$_ DB\n";
for (qw(available installed updates)) {
$dbs{$_} = esmith::ConfigDB->open_ro("dnf_$_")
or die "Couldn't open dnf_$_ DB\n";
}
for ( qw(repositories) )
{
$dbs{$_} = esmith::ConfigDB->open("yum_$_") or
die "Couldn't open yum_$_ DB\n";
for (qw(repositories)) {
$dbs{$_} = esmith::ConfigDB->open("yum_$_")
or die "Couldn't open yum_$_ DB\n";
}
sub main {
my $c = shift;
$c->app->log->info($c->log_req);
my %yum_datas = ();
my $title = $c->l('yum_FORM_TITLE');
my $dest = 'yum';
my $notif = '';
my $title = $c->l('yum_FORM_TITLE');
my $dest = 'yum';
my $notif = '';
$yum_datas{'trt'} = 'STAT';
if ( -e "/var/run/yum.pid" ) {
$yum_datas{'trt'} = 'LOGF';
$dest = 'yumlogfile';
} elsif ($cdb->get_prop('yum', 'LogFile')) {
$yum_datas{'trt'} = 'PSTU';
$yum_datas{'reconf'} = $cdb->get_value('UnsavedChanges', 'yes');
$dest = 'yumpostupg';
if ($c->is_dnf_running()) {
$yum_datas{'trt'} = 'LOGF';
$dest = 'yumlogfile';
} elsif ($cdb->get_prop('dnf', 'LogFile')) {
$yum_datas{'trt'} = 'PSTU';
$yum_datas{'reconf'} = $cdb->get_value('UnsavedChanges', 'yes');
$dest = 'yumpostupg';
} else {
# normal other trt
# normal other trt
}
$c->stash( title => $title, notif => $notif, yum_datas => \%yum_datas );
return $c->render( template => $dest );
}
$c->stash(title => $title, notif => $notif, yum_datas => \%yum_datas);
return $c->render(template => $dest);
} ## end sub main
sub do_display {
my $c = shift;
my $rt = $c->current_route;
my $trt = ($c->param('trt') || 'STAT');
my $c = shift;
my $rt = $c->current_route;
my $trt = ($c->param('trt') || 'STAT');
my %yum_datas = ();
my $title = $c->l('yum_FORM_TITLE');
my $title = $c->l('yum_FORM_TITLE');
my ($notif, $dest) = '';
$yum_datas{'trt'} = $trt;
# force $trt if current logfile
if ( -e "/var/run/yum.pid" ) {
$trt = 'LOGF';
} elsif ($cdb->get_prop('yum', 'LogFile')) {
$trt = 'PSTU';
if ($c->is_dnf_running()) {
$trt = 'LOGF';
} elsif ($cdb->get_prop('dnf', 'LogFile')) {
$trt = 'PSTU';
}
if ( $trt eq 'UPDT' ) {
$dest = 'yumupdate';
if ($trt eq 'UPDT') {
$dest = 'yumupdate';
}
if ($trt eq 'INST') {
$dest = 'yuminstall';
}
if ($trt eq 'REMO') {
$dest = 'yumremove';
}
if ($trt eq 'CONF') {
$dest = 'yumconfig';
}
if ($trt eq 'LOGF') {
if ($c->is_dnf_running()) {
$dest = 'yumlogfile';
}
} ## end if ($trt eq 'LOGF')
if ( $trt eq 'INST' ) {
$dest = 'yuminstall';
if ($trt eq 'PSTU') {
if ($cdb->get_prop('dnf', 'LogFile')) {
$dest = 'yumpostupg';
$yum_datas{'reconf'} = $cdb->get_value('UnsavedChanges', 'yes');
}
if ( $trt eq 'REMO' ) {
$dest = 'yumremove';
}
if ( $trt eq 'CONF' ) {
$dest = 'yumconfig';
}
if ( $trt eq 'LOGF' ) {
if (-e "/var/run/yum.pid") {
$dest = 'yumlogfile';
}
}
if ( $trt eq 'PSTU') {
if ($cdb->get_prop('yum', 'LogFile')) {
$dest = 'yumpostupg';
$yum_datas{'reconf'} = $cdb->get_value('UnsavedChanges', 'yes');
}
}
if ( ! $dest ) { $dest = 'yum'; }
$c->stash( title => $title, notif => $notif, yum_datas => \%yum_datas );
return $c->render( template => $dest );
};
} ## end if ($trt eq 'PSTU')
if (!$dest) { $dest = 'yum'; }
$c->stash(title => $title, notif => $notif, yum_datas => \%yum_datas);
return $c->render(template => $dest);
} ## end sub do_display
sub do_update {
my $c = shift;
$c->app->log->info($c->log_req);
my $rt = $c->current_route;
my $trt = $c->param('trt');
my $rt = $c->current_route;
my $trt = $c->param('trt');
my %yum_datas = ();
$yum_datas{trt} = $trt;
my $title = $c->l('yum_FORM_TITLE');
my ($dest, $res, $result) = '';
if ( $trt eq 'UPDT' ) {
if ($trt eq 'UPDT') {
$dest = 'yumupdate';
$dest = 'yumupdate';
if (!$result) {
$res = $c->do_yum('update');
$result .= $res unless $res eq 'OK';
if ( ! $result ) {
$res = $c->do_yum('update');
$result .= $res unless $res eq 'OK';
if ( ! $result ) {
$yum_datas{trt} = 'SUC';
#$result = $c->l('yum_SUCCESS');
}
}
}
if (!$result) {
$yum_datas{trt} = 'SUC';
if ( $trt eq 'INST' ) {
#$result = $c->l('yum_SUCCESS');
} ## end if (!$result)
} ## end if (!$result)
} ## end if ($trt eq 'UPDT')
$dest = 'yuminstall';
if ($trt eq 'INST') {
$dest = 'yuminstall';
if ( ! $result ) {
$res = $c->do_yum('install');
$result .= $res unless $res eq 'OK';
if ( ! $result ) {
$yum_datas{trt} = 'SUC';
#$result = $c->l('yum_SUCCESS');
}
}
}
if (!$result) {
$res = $c->do_yum('install');
$result .= $res unless $res eq 'OK';
if ( $trt eq 'REMO' ) {
if (!$result) {
$yum_datas{trt} = 'SUC';
$dest = 'yumremove';
#$result = $c->l('yum_SUCCESS');
} ## end if (!$result)
} ## end if (!$result)
} ## end if ($trt eq 'INST')
if ( ! $result ) {
$res = $c->do_yum('remove');
$result .= $res unless $res eq 'OK';
if ( ! $result ) {
$yum_datas{trt} = 'SUC';
#$result = $c->l('yum_SUCCESS');
}
}
}
if ($trt eq 'REMO') {
$dest = 'yumremove';
if ( $trt eq 'CONF' ) {
if (!$result) {
$res = $c->do_yum('remove');
$result .= $res unless $res eq 'OK';
$dest = 'yumconfig';
if (!$result) {
$yum_datas{trt} = 'SUC';
if ( ! $result ) {
$res = $c->change_settings();
$result .= $res unless $res eq 'OK';
if ( ! $result ) {
$yum_datas{trt} = 'SUC';
$result = $c->l('yum_SUCCESS');
}
}
}
#$result = $c->l('yum_SUCCESS');
} ## end if (!$result)
} ## end if (!$result)
} ## end if ($trt eq 'REMO')
if ($trt eq 'CONF') {
$dest = 'yumconfig';
if ( $trt eq 'PSTU') {
if (!$result) {
$res = $c->change_settings();
$result .= $res unless $res eq 'OK';
my $reconf = $c->param('reconf') || 'yes';
$dest = 'yumpostupg';
if (!$result) {
$yum_datas{trt} = 'SUC';
$result = $c->l('yum_SUCCESS');
}
} ## end if (!$result)
} ## end if ($trt eq 'CONF')
# effective reconfigure and reboot required
if ( $reconf eq 'yes' ) {
$res = $c->post_upgrade_reboot();
$result .= $res unless $res eq 'OK';
if ( ! $result ) {
$yum_datas{trt} = 'SUC';
$result = $c->l('yum_SYSTEM_BEING_RECONFIGURED');
}
} else {
$yum_datas{trt} = 'SUC';
$result = $c->l('yum_UPDATE_SUCCESS');
}
}
if ($trt eq 'PSTU') {
my $reconf = $c->param('reconf') || 'yes';
$dest = 'yumpostupg';
# effective reconfigure and reboot required
if ($reconf eq 'yes') {
$res = $c->post_upgrade_reboot();
$result .= $res unless $res eq 'OK';
if ( $trt eq 'LOGF' ) {
$dest = 'yumlogfile';
if ( ! -e "/var/run/yum.pid") {
$yum_datas{trt} = 'SUC';
$result = $c->l('yum_SUCCESS');
if (!$result) {
$yum_datas{trt} = 'SUC';
$result = $c->l('yum_SYSTEM_BEING_RECONFIGURED');
}
} else {
$yum_datas{trt} = 'SUC';
$result = $c->l('yum_UPDATE_SUCCESS');
}
}
} ## end if ($trt eq 'PSTU')
if ($trt eq 'LOGF') {
$dest = 'yumlogfile';
if (!$c->is_dnf_running()) {
$yum_datas{trt} = 'SUC';
$result = $c->l('yum_SUCCESS');
}
} ## end if ($trt eq 'LOGF')
# do_yum ended (no message) --> forced to LOGFile
if ( ! $result ) {
$dest = 'yumlogfile';
$yum_datas{trt} = 'LOGF';
if (!$result) {
$dest = 'yumlogfile';
$yum_datas{trt} = 'LOGF';
}
$c->stash(title => $title, notif => $result, yum_datas => \%yum_datas);
$c->stash( title => $title, notif => $result, yum_datas => \%yum_datas );
if ($yum_datas{trt} ne 'SUC') {
return $c->render(template => $dest);
return $c->render(template => $dest);
}
my $message = "'Yum' $trt update DONE";
$c->app->log->info($message);
$c->flash(success => $result) if $result;
$c->redirect_to("/yum");
} ## end sub do_update
};
sub get_dnf_status {
#interrogate status file created and maintained by smeserver.py plugin for dnf.
my ($c) = @_;
my $file_name = $dnf_status_file;
my $content = "resolved";
if (-e "$file_name") {
open my $fh, '<', $file_name or die "Can't open file: $!";
$content = <$fh>;
close $fh;
} ## end if (-e "$file_name")
return $content;
} ## end sub get_dnf_status
sub is_dnf_running {
my ($c) = @_;
my $dnf_status = $c->get_dnf_status();
return $dnf_status ne "resolved" && $dnf_status ne "config" && $dnf_status ne "sack";
} ## end sub is_dnf_running
sub is_empty {
my ($c, $yumdb) = @_;
my $groups = $dbs{$yumdb}->get_all_by_prop(type => 'group') || 'none';
my $groups = $dbs{$yumdb}->get_all_by_prop(type => 'group') || 'none';
my $packages = $dbs{$yumdb}->get_all_by_prop(type => 'package') || 'none';
#Show no updates if both = none
@@ -260,301 +249,208 @@ sub is_empty {
#else return here
return;
}
} ## end sub is_empty
sub non_empty {
my ($c, $yumdb, $type) = @_;
$type ||= 'both';
return 0 unless (exists $dbs{$yumdb});
my $groups = scalar $dbs{$yumdb}->get_all_by_prop(type => 'group');
my $groups = scalar $dbs{$yumdb}->get_all_by_prop(type => 'group');
return $groups if ($type eq 'group');
my $packages = scalar $dbs{$yumdb}->get_all_by_prop(type => 'package');
if ($type eq 'package')
{
return $c->package_functions_enabled ? $packages : 0;
if ($type eq 'package') {
return $c->package_functions_enabled ? $packages : 0;
}
return ($c->package_functions_enabled or $yumdb eq 'updates') ?
($groups || $packages) : $groups;
}
return ($c->package_functions_enabled or $yumdb eq 'updates') ? ($groups || $packages) : $groups;
} ## end sub non_empty
sub package_functions_enabled {
my ($c) = @_;
return ($cdb->get_prop("yum", "PackageFunctions") eq "enabled");
return ($cdb->get_prop("dnf", "PackageFunctions") eq "enabled");
}
sub get_status {
my ($c, $prop, $localise) = @_;
my $status = $cdb->get_prop("yum", $prop) || 'disabled';
my $status = $cdb->get_prop("dnf", $prop) || 'disabled';
return $status unless $localise;
return $c->l($status eq 'enabled' ? 'ENABLED' : 'DISABLED');
}
} ## end sub get_status
sub get_options {
my ($c, $yumdb, $type) = @_;
my %options;
for ($dbs{$yumdb}->get_all_by_prop(type => $type))
{
$options{$_->key} = $_->key . " " . $_->prop("Version") . " - " .
$_->prop("Repo");
for ($dbs{$yumdb}->get_all_by_prop(type => $type)) {
$options{ $_->key } = $_->key . " " . $_->prop("Version") . " - " . $_->prop("Repo");
}
return \%options;
}
} ## end sub get_options
sub get_options2 {
my ($c, $yumdb, $type) = @_;
my @options;
for ($dbs{$yumdb}->get_all_by_prop(type => $type))
{
push @options, [ $_->key . " " . $_->prop("Version") . " - " .
$_->prop("Repo") => $_->key ];
for ($dbs{$yumdb}->get_all_by_prop(type => $type)) {
push @options, [ $_->key . " " . $_->prop("Version") . " - " . $_->prop("Repo") => $_->key ];
}
return \@options;
}
} ## end sub get_options2
sub get_names {
return [ keys %{get_options(@_)} ];
return [ keys %{ get_options(@_) } ];
}
sub get_names2 {
my ($c, $yumdb, $type) = @_;
my @selected;
for ($dbs{$yumdb}->get_all_by_prop(type => $type)) {
push @selected, $_->key;
}
return \@selected;
# return [ values @{get_options2(@_)} ];
}
# return [ values @{get_options2(@_)} ];
} ## end sub get_names2
sub get_repository_options2 {
my $c = shift;
my @options;
foreach my $repos (
$dbs{repositories}->get_all_by_prop(type => "repository") )
{
next unless ($repos->prop('Visible') eq 'yes'
or $repos->prop('status') eq 'enabled');
foreach my $repos ($dbs{repositories}->get_all_by_prop(type => "repository")) {
next unless ($repos->prop('Visible') eq 'yes'
or $repos->prop('status') eq 'enabled');
push @options, [ $repos->prop('Name') => $repos->key ];
}
} ## end foreach my $repos ($dbs{repositories...})
my @opts = sort { $a->[0] cmp $b->[0] } @options;
return \@opts;
}
} ## end sub get_repository_options2
sub get_repository_current_options
{
sub get_repository_current_options {
my $c = shift;
my @selected;
foreach my $repos (
$dbs{repositories}->get_all_by_prop( type => "repository" ) )
{
next unless ($repos->prop('Visible') eq 'yes'
or $repos->prop('status') eq 'enabled');
foreach my $repos ($dbs{repositories}->get_all_by_prop(type => "repository")) {
next unless ($repos->prop('Visible') eq 'yes'
or $repos->prop('status') eq 'enabled');
push @selected, $repos->key if ($repos->prop('status') eq 'enabled');
}
} ## end foreach my $repos ($dbs{repositories...})
return \@selected;
}
} ## end sub get_repository_current_options
sub get_avail2 {
my ($c, $yumdb, $type) = @_;
return $c->get_options2("available", "package");
}
sub get_check_freq_opt {
my ($c) = @_;
return [[ $c->l('DISABLED') => 'disabled'],
[ $c->l('yum_1DAILY') => 'daily'],
[ $c->l('yum_2WEEKLY') => 'weekly'],
[ $c->l('yum_3MONTHLY') => 'monthly']];
}
return [
[ $c->l('DISABLED') => 'disabled' ],
[ $c->l('yum_1DAILY') => 'daily' ],
[ $c->l('yum_2WEEKLY') => 'weekly' ],
[ $c->l('yum_3MONTHLY') => 'monthly' ]
];
} ## end sub get_check_freq_opt
sub print_skip_header {
my ($c) = shift;
return "<INPUT TYPE=\"hidden\" NAME=\"skip_header\" VALUE=\"1\">\n";
}
sub change_settings {
my ($c) = @_;
for my $param ( qw(
PackageFunctions
) )
for my $param (
qw(
PackageFunctions
)
)
{
$cdb->set_prop('yum', $param, $c->param("yum_$param"));
}
$cdb->set_prop("dnf", $param, $c->param("yum_$param"));
} ## end for my $param (qw( PackageFunctions...))
my $check4updates = $c->param("yum_check4updates");
my $status = 'disabled';
my $status = 'disabled';
if ($check4updates ne 'disabled') { $status = 'enabled'; }
$cdb->set_prop('yum', 'check4updates', $check4updates);
$cdb->set_prop("dnf", 'check4updates', $check4updates);
my $deltarpm = $c->param("yum_DeltaRpmProcess");
$cdb->set_prop('yum', 'DeltaRpmProcess', $deltarpm);
$cdb->set_prop("dnf", 'DeltaRpmProcess', $deltarpm);
my $downloadonly = $c->param("yum_DownloadOnly");
if ($downloadonly ne 'disabled') { $status = 'enabled'; }
$cdb->set_prop('yum', 'DownloadOnly', $downloadonly);
$cdb->set_prop("dnf", 'DownloadOnly', $downloadonly);
my $AutoInstallUpdates = $c->param("yum_AutoInstallUpdates");
if ($AutoInstallUpdates ne 'disabled') { $status = 'enabled'; }
$cdb->set_prop("dnf", 'AutoInstallUpdates', $AutoInstallUpdates);
$cdb->set_prop("dnf", 'status', $status);
my %selected = map { $_ => 1 } @{ $c->every_param('SelectedRepositories') };
$cdb->set_prop('yum', 'AutoInstallUpdates', $AutoInstallUpdates);
$cdb->set_prop('yum', 'status', $status);
my %selected = map {$_ => 1} @{$c->every_param('SelectedRepositories')};
foreach my $repos (
$dbs{repositories}->get_all_by_prop(type => "repository") )
{
$repos->set_prop("status",
exists $selected{$repos->key} ? 'enabled' : 'disabled');
foreach my $repos ($dbs{repositories}->get_all_by_prop(type => "repository")) {
$repos->set_prop("status", exists $selected{ $repos->key } ? 'enabled' : 'disabled');
}
$dbs{repositories}->reload;
unless ( system( "/sbin/e-smith/signal-event", "yum-modify" ) == 0 )
{
return $c->l('yum_ERROR_UPDATING_CONFIGURATION');
unless (system("/sbin/e-smith/signal-event", "dnf-modify") == 0) {
return $c->l('yum_ERROR_UPDATING_CONFIGURATION');
}
return 'OK';
}
} ## end sub change_settings
sub do_yum {
my ($c, $function) = @_;
for ( qw(SelectedGroups SelectedPackages) )
{
$cdb->set_prop("yum", $_, join(',', (@{$c->every_param($_)} )));
for (qw(SelectedGroups SelectedPackages)) {
$cdb->set_prop("dnf", $_, join(',', (@{ $c->every_param($_) })));
}
esmith::util::backgroundCommand(0, "/sbin/e-smith/signal-event", "dnf-$function");
esmith::util::backgroundCommand(0,
"/sbin/e-smith/signal-event", "yum-$function");
for ( qw(available installed updates) ) {
$dbs{$_}->reload;
for (qw(available installed updates)) {
$dbs{$_}->reload;
}
return 'OK';
}
} ## end sub do_yum
sub get_yum_status_page {
my ($c) = @_;
my $yum_status;
open(YUM_STATUS, "</var/run/yum.status");
$yum_status = <YUM_STATUS>;
close(YUM_STATUS);
return $yum_status;
}
} ## end sub get_yum_status_page
sub format_yum_log {
my $c = shift;
$cdb->reload;
my $filepage = $cdb->get_prop('yum', 'LogFile');
return '' unless $filepage and ( -e "$filepage" );
my $filepage = $cdb->get_prop('dnf', 'LogFile');
return '' unless $filepage and (-e "$filepage");
my $out = sprintf "<PRE>";
open (FILE, "$filepage");
open(FILE, "$filepage");
while (<FILE>) {
$out .= sprintf("%s", $_);
$out .= sprintf("%s", $_);
}
close FILE;
$out .= sprintf "</PRE>";
undef $filepage;
return $out;
}
} ## end sub format_yum_log
sub post_upgrade_reboot {
my $c = shift;
$cdb->get_prop_and_delete('yum', 'LogFile');
$cdb->get_prop_and_delete('dnf', 'LogFile');
$cdb->reload;
if (fork == 0) {
exec "/sbin/e-smith/signal-event post-upgrade; /sbin/e-smith/signal-event reboot";
die "Exec failed";
}
return 'OK'
}
return 'OK';
} ## end sub post_upgrade_reboot
sub show_yum_log {
my $c = shift;
my $out = $c->format_yum_log();
my $yum_log = $cdb->get_prop_and_delete('yum', 'LogFile');
my $c = shift;
my $out = $c->format_yum_log();
my $yum_log = $cdb->get_prop_and_delete('dnf', 'LogFile');
return $out;
}
} ## end sub show_yum_log
1;

View File

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

View File

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

View File

@@ -0,0 +1,73 @@
package SrvMngr::Plugin::Cache;
use Mojo::Base -base;
=head1 NAME
Mojolicious::Plugin::Renderer::WithoutCache::Cache - Mojo::Cache that doesn't cache
=head1 VERSION
Version 0.04
=cut
our $VERSION = '0.04';
$VERSION = eval $VERSION;
=head1 SYNOPSIS
You probably don't want to use this directly.
my $cache = Mojolicious::Plugin::Renderer::WithoutCache::Cache->new;
# this cache does nothing
=head1 DESCRIPTION
A cache object that's compatible to Mojo::Cache but does nothing. It does
not save or return any values. It's always empty.
=head1 METHODS
=head2 get
Does nothing. Returns C<undef>.
=cut
sub get {}
=head2 set
Does nothing. Returns C<$self> so chaining is possible.
=cut
sub set { shift; }
=head2 max_keys
Always returns zero. Can't be set. We don't want any keys.
=cut
sub max_keys { 0 }
=head1 AUTHOR
simbabque, C<< <simbabque at cpan.org> >>
=head1 BUGS
Please report any bugs or feature requests through an issue
on github at L<https://github.com/simbabque/Mojolicious-Plugin-Renderer-WithoutCache/issues>.
=head1 LICENSE
Copyright (C) simbabque.
This library is free software; you can redistribute it and/or modify
it under the same terms as Perl itself.
=cut
1;

View File

@@ -0,0 +1,94 @@
package SrvMngr::Plugin::WithoutCache;
use Mojo::Base 'Mojolicious::Plugin';
use SrvMngr::Plugin::Cache;
=head1 NAME
Mojolicious::Plugin::Renderer::WithoutCache - Disable the template cache in your Mojo app
=begin html
<p>
<a href="https://travis-ci.org/simbabque/Mojolicious-Plugin-Renderer-WithoutCache"><img src="https://travis-ci.org/simbabque/Mojolicious-Plugin-Renderer-WithoutCache.svg?branch=master"></a>
<a href='https://coveralls.io/github/simbabque/Mojolicious-Plugin-Renderer-WithoutCache?branch=master'><img src='https://coveralls.io/repos/github/simbabque/Mojolicious-Plugin-Renderer-WithoutCache/badge.svg?branch=master' alt='Coverage Status' /></a>
</p>
=end html
=head1 VERSION
Version 0.04
=cut
our $VERSION = '0.04';
$VERSION = eval $VERSION;
=head1 SYNOPSIS
This plugin turns off the renderer's cache in L<Mojolicious> and L<Mojo::Lite> applications.
use Mojolicious::Lite;
plugin 'Renderer::WithoutCache';
=head1 DESCRIPTION
This does what it says on the box. It turns off caching for the L<Mojolicious::Renderer>
or any other renderer that's inside C<$app-E<gt>renderer> by injecting a cache object that
does not do anything. This is superior to setting the C<max_keys> of L<Mojo::Cache>
to C<0> if you plan to do a lot of uncached requests, because L<Mojolicious::Renderer>
will still try to cache, and every time L<Mojo::Cache> sets a value in the cache it
looks at the C<max_keys>, and then stops.
Doing nothing at all is cheaper. But not a lot really.
=head1 METHODS
=head2 register
Register the plugin in a L<Mojolicious> application.
$plugin->register(Mojolicious->new);
=cut
sub register {
my ( $self, $app ) = @_;
$app->renderer->cache( SrvMngr::Plugin::Cache->new );
}
=head1 AUTHOR
simbabque, C<< <simbabque at cpan.org> >>
=head1 BUGS
Please report any bugs or feature requests through an issue
on github at L<https://github.com/simbabque/Mojolicious-Plugin-Renderer-WithoutCache/issues>.
=head1 SUPPORT
You can find documentation for this module with the perldoc command.
perldoc Mojolicious::Plugin::Renderer::WithoutCache
=head2 Why would I want to turn off the cache?
I don't know.
=head1 ACKNOWLEDGEMENTS
This plugin was inspired by Tom Hunt asking about turning the cache off
on L<Stack Overflow|http://stackoverflow.com/q/41750243/1331451>.
=head1 LICENSE
Copyright (C) simbabque.
This library is free software; you can redistribute it and/or modify
it under the same terms as Perl itself.
=cut
1;

View File

@@ -9,7 +9,7 @@ use esmith::util;
BEGIN
{
$0 =~ /^(.+)$/ms; $0 = $1; # Untaint script name
$ENV{'PATH'} = '/bin:/usr/bin:/usr/local/bin';
$ENV{'PATH'} = '/usr/sbin:/usr/bin:/usr/local/bin';
$ENV{'SHELL'} = '/bin/bash';
$ENV{'HOME'} = '/usr/share/smanager';
delete $ENV{'ENV'};

File diff suppressed because one or more lines are too long

View File

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

View File

@@ -0,0 +1,17 @@
/* 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 */
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.2 KiB

View File

@@ -1,63 +1,278 @@
document.addEventListener('DOMContentLoaded', () => {
const flagContainer = document.getElementById('flag-container');
// Function to get the browser's locale
function getBrowserLocale() {
return navigator.language || navigator.userLanguage;
}
async function getCountryName(countryCode) {
try {
const response = await fetch(`https://restcountries.com/v3.1/alpha/${countryCode}`);
if (!response.ok) throw new Error('Country not found');
const data = await response.json();
// Return the name in the native language
return data[0].name.common;
} catch (error) {
console.error(error);
return 'Unknown Country';
}
}
// Function to map locale to country code
function getCountryCodeFromLocale(locale) {
const localeParts = locale.split('-');
return localeParts.length > 1 ? localeParts[1] : localeParts[0];
}
function getFlagEmoji(locale) {
// Split the locale to get the language and country code
const parts = locale.split('-');
let countryCode;
// Function to fetch country names from a CDN
async function fetchCountryNames() {
const response = await fetch('https://restcountries.com/v3.1/all');
const countries = await response.json();
const countryNames = {};
for (const country of countries) {
const code = country.cca2.toLowerCase(); // Country code (ISO 3166-1 alpha-2)
const name = country.name.common; // Common name of the country
countryNames[code] = name;
}
return countryNames;
}
// Handle single subtag (language only) or double subtag (language-country)
if (parts.length === 1) {
countryCode = getCountryCodeFromLanguage(parts[0]);
} else if (parts.length === 2) {
countryCode = parts[1].toLowerCase(); // Use the country code
}
// Function to create and display the flag icon
function displayFlagIcon(countryCode, countryName) {
const flagIcon = document.createElement('span');
flagIcon.className = `flag-icon flag-icon-${countryCode.toLowerCase()}`;
flagIcon.id = 'flag-icon';
flagIcon.title = countryName; // Set the title for the tooltip
// If country code is not found, set a fallback output
if (!countryCode) {
const fallback = `? ${locale.toUpperCase()}`; // Just a question mark and the full locale
return { flag: fallback, isUnknown: true, countryName: 'Unknown Country' };
}
// If you want a custom tooltip instead (uncomment the lines below):
/*
const tooltip = document.createElement('span');
tooltip.className = 'tooltip';
tooltip.innerText = countryName;
flagIcon.appendChild(tooltip);
// Convert the country code to a flag emoji
return {
flag: String.fromCodePoint(...[...countryCode.toUpperCase()].map(char => 0x1F1E6 + char.charCodeAt(0) - 'A'.charCodeAt(0))),
isUnknown: false,
countryCode: countryCode
};
}
flagIcon.addEventListener('mouseenter', () => {
tooltip.style.display = 'block';
});
function getCountryCodeFromLanguage(language) {
// Map languages to countries (this is an example, extend as needed)
const languageToCountryMap = {
// Add more mappings as needed
"af": "NA",
"agq": "CM",
"ak": "GH",
"am": "ET",
"ar": "01",
"as": "IN",
"asa": "TZ",
"ast": "ES",
"az": "rl",
"bas": "CM",
"be": "BY",
"bem": "ZM",
"bez": "TZ",
"bg": "BG",
"bm": "ML",
"bn": "BD",
"bo": "CN",
"br": "FR",
"brx": "IN",
"bs": "rl",
"ca": "AD",
"ccp": "BD",
"ce": "RU",
"cgg": "UG",
"chr": "US",
"ckb": "IQ",
"cs": "CZ",
"cy": "GB",
"da": "DK",
"dav": "KE",
"de": "DE",
"dje": "NE",
"dsb": "DE",
"dua": "CM",
"dyo": "SN",
"dz": "BT",
"ebu": "KE",
"ee": "GH",
"el": "CY",
"en": "01",
"es": "ES",
"et": "EE",
"eu": "ES",
"ewo": "CM",
"fa": "AF",
"ff": "CM",
"fi": "FI",
"fil": "PH",
"fo": "FO",
"fr": "FR",
"fur": "IT",
"fy": "NL",
"ga": "IE",
"gd": "GB",
"gl": "ES",
"gsw": "CH",
"gu": "IN",
"guz": "KE",
"gv": "IM",
"ha": "GH",
"haw": "US",
"he": "IL",
"hi": "IN",
"hr": "HR",
"hsb": "DE",
"hu": "HU",
"hy": "AM",
"id": "ID",
"ig": "NG",
"ii": "CN",
"is": "IS",
"it": "IT",
"ja": "JP",
"jgo": "CM",
"jmc": "TZ",
"ka": "GE",
"kab": "DZ",
"kam": "KE",
"kde": "TZ",
"kea": "CV",
"khq": "ML",
"ki": "KE",
"kk": "KZ",
"kkj": "CM",
"kl": "GL",
"kln": "KE",
"km": "KH",
"kn": "IN",
"ko": "KP",
"kok": "IN",
"ks": "IN",
"ksb": "TZ",
"ksf": "CM",
"ksh": "DE",
"kw": "GB",
"ky": "KG",
"lag": "TZ",
"lb": "LU",
"lg": "UG",
"lkt": "US",
"ln": "AO",
"lo": "LA",
"lrc": "IQ",
"lt": "LT",
"lu": "CD",
"luo": "KE",
"Luo": "KE",
"luy": "KE",
"lv": "LV",
"mas": "KE",
"mer": "KE",
"mfe": "MU",
"mg": "MG",
"mgh": "MZ",
"mgo": "CM",
"mk": "MK",
"ml": "IN",
"mn": "MN",
"mr": "IN",
"ms": "BN",
"mt": "MT",
"mua": "CM",
"my": "MM",
"mzn": "IR",
"naq": "NA",
"nb": "NO",
"nd": "ZW",
"nds": "DE",
"ne": "IN",
"nl": "NL",
"nmg": "CM",
"nn": "NO",
"nnh": "CM",
"nus": "SS",
"nyn": "UG",
"om": "ET",
"or": "IN",
"os": "GE",
"pa": "ab",
"pl": "PL",
"ps": "AF",
"pt": "PT",
"qu": "BO",
"rm": "CH",
"rn": "BI",
"ro": "RO",
"rof": "TZ",
"ru": "RU",
"rw": "RW",
"rwk": "TZ",
"sah": "RU",
"saq": "KE",
"sbp": "TZ",
"se": "SE",
"seh": "MZ",
"ses": "ML",
"sg": "CF",
"shi": "tn",
"si": "LK",
"sk": "SK",
"sl": "SI",
"smn": "FI",
"sn": "ZW",
"so": "SO",
"sq": "AL",
"sr": "rl",
"sv": "AX",
"sw": "CD",
"ta": "IN",
"te": "IN",
"teo": "KE",
"tg": "TJ",
"th": "TH",
"ti": "ER",
"to": "TO",
"tr": "TR",
"tt": "RU",
"twq": "NE",
"tzm": "MA",
"ug": "CN",
"uk": "UA",
"ur": "IN",
"uz": "ab",
"vai": "tn",
"Vai": "tn",
"vi": "VN",
"vun": "TZ",
"wae": "CH",
"wo": "SN",
"xog": "UG",
"yav": "CM",
"yi": "01",
"yo": "BJ",
"yue": "ns",
"zgh": "MA",
"zh": "ns",
"zu": "ZA"
flagIcon.addEventListener('mouseleave', () => {
tooltip.style.display = 'none';
});
*/
flagContainer.appendChild(flagIcon);
}
};
// Main logic
(async () => {
const locale = getBrowserLocale();
const countryCode = getCountryCodeFromLocale(locale);
const countryNames = await fetchCountryNames(); // Fetch country names
return languageToCountryMap[language] || null;
}
const countryName = countryNames[countryCode.toLowerCase()] || 'Unknown Country'; // Get the country name
displayFlagIcon(countryCode, countryName); // Display the flag with country name
})();
async function displayLocaleAndFlag() {
// Get the browser locale
const userLocale = navigator.language || navigator.userLanguage;
const { flag, isUnknown, countryCode } = getFlagEmoji(userLocale);
// Display the locale and the corresponding flag (or fallback)
//document.getElementById('locale').textContent = `Your Locale: ${userLocale}`;
if (isUnknown) {
const fallbackDiv = document.createElement('div');
fallbackDiv.className = 'fallback-box';
fallbackDiv.textContent = `? ${userLocale.toUpperCase()}`; // Only show ? and locale code inside the box
//document.getElementById('flag-container').textContent = "Flag: ";
document.getElementById('flag-container').appendChild(fallbackDiv);
// Tooltip for fallback
fallbackDiv.title = "Unknown Country"; // Tooltip for fallback
} else {
const countryName = await getCountryName(countryCode);
const flagSpan = document.createElement('span');
flagSpan.textContent = flag; // Use flag emoji
flagSpan.title = countryName; // Tooltip for the flag in country language
//document.getElementById('flag-container').textContent = "Flag: ";
document.getElementById('flag-container').appendChild(flagSpan);
}
}
displayLocaleAndFlag();
});

View File

@@ -0,0 +1,31 @@
// js/sme-password.js
$(document).ready(function() {
// For each password input
$('.sme-password').each(function() {
// Create a new container
//alert("sme-password");
var $inputContainer = $('<div class="input-container"></div>');
// Move the input into the new container
$(this).wrap($inputContainer);
// Create the toggle image
var $togglePassword = $('<img src="images/visible.png" alt="Show Password" class="toggle-password" />');
// Append the toggle image to the container
$(this).after($togglePassword);
});
$('.toggle-password').on('click', function() {
// Find the associated password field
var input = $(this).siblings('.sme-password');
// Toggle the type attribute between password and text
var inputType = input.attr('type') === 'password' ? 'text' : 'password';
input.attr('type', inputType);
// Toggle the icon source based on the input type
var iconSrc = inputType === 'password' ? 'images/visible.png' : 'images/visible-slash.png';
$(this).attr('src', iconSrc);
});
});

View File

@@ -3,7 +3,7 @@
% content_for 'module' => begin
<div id='module' class='module back_tape_configure-panel'>
% if ($config->{debug} == 1) {
% if (config->{debug} == 1) {
<p>
%= dumper $c->current_route
%= dumper $bac_datas

View File

@@ -3,7 +3,7 @@
% content_for 'module' => begin
<div id='module' class='module back_tape_restore-panel'>
% if ($config->{debug} == 1) {
% if (config->{debug} == 1) {
<p>
%= dumper $c->current_route
%= dumper $bac_datas

View File

@@ -3,7 +3,7 @@
% content_for 'module' => begin
<div id='module' class='module back_workstn_configure-panel'>
% if ($config->{debug} == 1) {
% if (config->{debug} == 1) {
<p>
%= dumper $c->current_route
%= dumper $bac_datas

View File

@@ -3,7 +3,7 @@
% content_for 'module' => begin
<div id='module' class='module back_workstn_configure1-panel'>
% if ($config->{debug} == 1) {
% if (config->{debug} == 1) {
<p>
%= dumper $c->current_route
%= dumper $bac_datas

View File

@@ -3,7 +3,7 @@
% content_for 'module' => begin
<div id='module' class='module back_workstn_restore-panel'>
% if ($config->{debug} == 1) {
% if (config->{debug} == 1) {
<p>
%= dumper $c->current_route
%= dumper $bac_datas

View File

@@ -3,7 +3,7 @@
% content_for 'module' => begin
<div id='module' class='module back_workstn_restore1-panel'>
% if ($config->{debug} == 1) {
% if (config->{debug} == 1) {
<p>
%= dumper $c->current_route
%= dumper $bac_datas

View File

@@ -3,7 +3,7 @@
% content_for 'module' => begin
<div id='module' class='module back_workstn_sel_restore-panel'>
% if ($config->{debug} == 1) {
% if (config->{debug} == 1) {
<p>
%= dumper $c->current_route
%= dumper $bac_datas

View File

@@ -3,7 +3,7 @@
% content_for 'module' => begin
<div id='module' class='module back_workstn_sel_restore1-panel'>
% if ($config->{debug} == 1) {
% if (config->{debug} == 1) {
<p>
%= dumper $c->current_route
%= dumper $bac_datas

View File

@@ -3,7 +3,7 @@
% content_for 'module' => begin
<div id='module' class='module back_workstn_sel_restore2-panel'>
% if ($config->{debug} == 1) {
% if (config->{debug} == 1) {
<p>
%= dumper $c->current_route
%= dumper $bac_datas

View File

@@ -2,7 +2,7 @@
% content_for 'module' => begin
<div id='module' class='module back_workstn_verify-panel'>
% if ($config->{debug} == 1) {
% if (config->{debug} == 1) {
<p>
%= dumper $c->current_route
%= dumper $bac_datas

View File

@@ -2,7 +2,7 @@
% content_for 'module' => begin
<div id='module' class='module back_workstn_verify1-panel'>
% if ($config->{debug} == 1) {
% if (config->{debug} == 1) {
<p>
%= dumper $c->current_route
%= dumper $bac_datas->{function}

View File

@@ -3,7 +3,7 @@
% content_for 'module' => begin
<div id='module' class='module backup-panel'>
% if ($config->{debug} == 1) {
% if (config->{debug} == 1) {
<p>
%= dumper $c->current_route
%= dumper $bac_datas

View File

@@ -4,7 +4,7 @@
<div id='module' class='module bugreport-panel'>
% if ($config->{debug} == 1) {
% if (config->{debug} == 1) {
<p>
(DBG)route: <%= $c->current_route %><br>
(DBG)trt: <%= $bugr_datas->{trt} %><br>
@@ -13,11 +13,10 @@
<h1><%= $title %></h1>
<!--br><%= $modul %><br-->
<p>
<p><b>
<b>
%=l ('bugr_DO_NOT_PANIC')
</b></p>
</b>
<p>
%=l ('bugr_SME_EXPERIENCE')
</p><p>
@@ -49,7 +48,7 @@
%=l ('bugr_YUM_REPOS')
</li><br></ul>
%=l ('bugr_PRIVACY')
</p><p>
</p>
<% my $btn = l('bugr_CREATE_REPORT'); %>
@@ -57,7 +56,7 @@
%= submit_button "$btn", class => 'action'
% end
</p><p><b>
<p><b>
%=l ('bugr_DONATING')
</b><br><br>
%=l ('bugr_AWARE_SME')
@@ -66,6 +65,7 @@
</b><br><br>
%=l ('bugr_CONSIDER_DONATING')
<br><br>
</p>
%= link_to 'https://wiki.koozali.org/Donate' => begin
%= image '/images/btn_donateCC_LG.gif'
@@ -76,8 +76,7 @@
<br>
%=l ('bugr_THANK_YOU')
</p>
</div>
%end
%end

View File

@@ -4,7 +4,7 @@
<div id='module' class='module bugreport2-panel'>
% if ($config->{debug} == 1) {
% if (config->{debug} == 1) {
<p>
(DBG)route: <%= $c->current_route %><br>
(DBG)trt: <%= $bugr_datas->{trt} %><br>
@@ -15,7 +15,6 @@
<br><%= $modul %><br>
<p>
<% my $btn = l('bugr_Download this report'); %>
%= form_for 'bugreportD' => (method => 'POST') => begin
@@ -25,4 +24,4 @@
</div>
%end
%end

View File

@@ -2,7 +2,7 @@
% content_for 'module' => begin
<div id='module' class='module clamav-panel'>
%if ($config->{debug} == 1) {
%if (config->{debug} == 1) {
<p>(DBG)route: <%= $c->current_route %><br>
(DBG)FsS stat: <%= $clm_datas->{FilesystemScan}%> <br>
(DBG)Quar stat: <%=$clm_datas->{Quarantine} %>

View File

@@ -3,7 +3,7 @@
% content_for 'module' => begin
<div id='module' class='module datetime-panel'>
% if ($config->{debug} == 1) {
% if (config->{debug} == 1) {
<p>
%= dumper $c->current_route
%= dumper $dat_datas
@@ -45,6 +45,7 @@
%= $dat_datas->{now_string}
</b>
</p>
<p>
<br>
<span class=label>
%=l 'dat_NTP_SERVER'
@@ -121,4 +122,4 @@
% end
</div>
%end
%end

View File

@@ -3,7 +3,7 @@
% content_for 'module' => begin
<div id='module' class='module directory-panel'>
%if ($config->{debug} == 1) {
%if (config->{debug} == 1) {
<p>
(DBG)route: <%= $c->current_route %><br>
(DBG)dir. access: <%= $dir_datas->{access}%><br>
@@ -44,25 +44,25 @@
</span><span class=data>
%= text_field 'department' => $dir_datas->{department}, class => 'input'
</span>
</p>
</p><p>
<span class=label>
%=l 'dir_COMPANY', class => 'label'
</span><span class=data>
%= text_field 'company', $dir_datas->{company}, class => 'input'
</span>
</p>
</p><p>
<span class=label>
%=l 'dir_STREET', class => 'label'
</span><span class=data>
%= text_field 'street' => $dir_datas->{street}, class => 'input'
</span>
</p>
</p><p>
<span class=label>
%=l 'dir_CITY', class => 'label'
</span><span class=data>
%= text_field 'city', $dir_datas->{city}, class => 'input'
</span>
</p>
</p><p>
<span class=label>
%=l 'dir_PHONENUMBER', class => 'label'
</span><span class=data>
@@ -85,4 +85,4 @@
% end
</div>
%end
%end

View File

@@ -3,7 +3,7 @@
% content_for 'module' => begin
<div id='module' class='module domains-panel'>
% if ($config->{debug} == 1) {
% if (config->{debug} == 1) {
<p>
%= dumper $c->current_route
%= dumper $dom_datas

View File

@@ -3,7 +3,7 @@
% content_for 'module' => begin
<div id='module' class='module emailaccess-panel'>
% if ($config->{debug} == 1) {
% if (config->{debug} == 1) {
<p>
%= dumper $c->current_route
%= dumper $mai_datas

View File

@@ -3,7 +3,7 @@
% content_for 'module' => begin
<div id='module' class='module emaildeliver-panel'>
% if ($config->{debug} == 1) {
% if (config->{debug} == 1) {
<p>
%= dumper $c->current_route
%= dumper $mai_datas

View File

@@ -3,7 +3,7 @@
% content_for 'module' => begin
<div id='module' class='module emailfilter-panel'>
% if ($config->{debug} == 1) {
% if (config->{debug} == 1) {
<p>
%= dumper $c->current_route
%= dumper $mai_datas
@@ -34,8 +34,8 @@
<p><span class=label>
%=l 'mai_LABEL_SPAM_SCAN'
</span><span class=input>
% param 'SpamStatus' => $mai_datas->{spamstatus} unless param 'SpamStatus';
%= select_field 'SpamStatus' => [[(l 'DISABLED') => 'disabled'], [ (l 'ENABLED') => 'enabled']], class => 'input'
% param 'Spamstatus' => $mai_datas->{spamstatus} unless param 'Spamstatus';
%= select_field 'Spamstatus' => [[(l 'DISABLED') => 'disabled'], [ (l 'ENABLED') => 'enabled']], class => 'input'
</span></p>
<p><span class=label>
@@ -98,4 +98,4 @@
% end
</div>
%end
%end

View File

@@ -1,12 +1,17 @@
% layout 'default', title => "Sme server 2 - emailreceive";
% content_for 'module' => begin
% use constant FALSE => 0;
% use constant TRUE => 1;
<div id='module' class='module emailreceive-panel'>
% if ($config->{debug} == 1) {
% if (config->{debug} == 1) {
<p>
%= dumper $c->current_route
%= dumper $mai_datas
%= dumper $c->param('SMTPAuth')
</p>
% }
@@ -26,16 +31,65 @@
%=l 'mai_LABEL_MODE'
</span><span class=input>
% param 'FetchmailMethod' => $mai_datas->{fetchmailmethod} unless param 'FetchmailMethod';
<!--
<pre>
%= dumper $mai_datas->{fetchmailmethod}
%= dumper $c->get_retrieval_opt()
%= param 'FetchmailMethod'
</pre>
-->
%= select_field 'FetchmailMethod' => $c->get_retrieval_opt(), class => 'input'
</span></p>
%=l 'mai_DESC_SMTP_AUTH_CONTROL'
%#=l 'mai_DESC_SMTP_AUTH_CONTROL'
<br />
%= l "SMTP port (25) main purpose is to receive emails from another server, STARTTLS is always offered, but auth if offered is only if STARTTLS is also used by client."
<br />
%= l "SMTPS port (465) will require implicit SSL/TLS then authenticate to send."
<br />
%= l "SMTP Submission port (587) will require STARTTLS, then authenticate to send."
<br />
% my $smtp_mesg=l('SMTP port %u allow client to authenticate:');
<p><span class=label>
%=l 'mai_LABEL_SMTP_AUTH_CONTROL'
%= sprintf($smtp_mesg,$c->get_db_prop('qpsmtpd','TCPPort',25));
</span><span class=input>
% param 'SMTPAuth' => $c->get_current_smtp_auth() unless param 'SMTPAuth';
%= select_field 'SMTPAuth' => $c->get_smtp_auth_opt(), class => 'input'
% param 'SMTPAuth' => $c->get_current_smtp_auth( FALSE ) unless param 'SMTPAuth';
<!--
<pre>
%= dumper $c->get_smtp_auth_opt()
%= dumper $c->get_current_smtp_auth(FALSE)
%= dumper $c->get_db_prop("qpsmtpd","Authentication")
%= param 'SMTPAuth'
</pre>
-->
%= select_field 'SMTPAuth' => $c->get_smtp_auth_opt(), class => 'input'
</span></p>
% my $smtp_mesg=l('SMTPS SSL/TLS auth: port %u status:');
<p><span class=label>
%= sprintf($smtp_mesg,$c->get_db_prop('sqpsmtpd','TCPPort',465));
</span><span class=input>
% param 'sSMTPAuth' => $c->get_current_smtp_ssl_auth(FALSE,'s', TRUE) unless param 'sSMTPAuth';
%= select_field 'sSMTPAuth' => $c->get_smtp_ssl_auth_opt(), class => 'input'
</span></p>
%my $smtp_mesg=l('Submission port %u status:');
<p><span class=label>
%= sprintf($smtp_mesg,$c->get_db_prop('uqpsmtpd','TCPPort',587));
</span><span class=input>
% param 'uSMTPAuth' => $c->get_current_smtp_ssl_auth(FALSE,'u', TRUE) unless param 'uSMTPAuth';
<!--
<pre>
%= dumper $c->get_smtp_ssl_auth_opt()
%= dumper $c->get_current_smtp_ssl_auth(FALSE,'s', TRUE)
%= dumper $c->get_current_smtp_ssl_auth(FALSE,'u', TRUE)
%= dumper $c->get_db_prop("uqpsmtpd","access")
%= param 'uSMTPAuth'
</pre>
-->
%= select_field 'uSMTPAuth' => $c->get_smtp_ssl_auth_opt(), class => 'input'
</span></p>
<hr class="sectionbar" />
@@ -110,4 +164,4 @@
% end
</div>
%end
%end

View File

@@ -1,9 +1,13 @@
% layout 'default', title => "Sme server 2 - emailsettings";
% content_for 'module' => begin
% use constant FALSE => 0;
% use constant TRUE => 1;
<div id='module' class='module emailsettings-panel'>
% if ($config->{debug} == 1) {
% if (config->{debug} == TRUE) {
<p>
%= dumper $c->current_route
%= dumper $mai_datas
@@ -22,19 +26,19 @@
<p><span class=label>
%=l 'mai_LABEL_POP_ACCESS_CONTROL'
</span><span class=data2>
%= $c->get_current_pop3_access( 1 )
%= $c->get_current_pop3_access( TRUE )
</span></p>
<p><span class=label>
%=l 'mai_LABEL_IMAP_ACCESS_CONTROL'
</span><span class=data2>
%= $c->get_current_imap_access( 1 )
%= $c->get_current_imap_access( TRUE )
</span></p>
<p><span class=label>
%=l 'mai_LABEL_WEBMAIL'
</span><span class=data2>
%= $c->get_current_webmail_status( 1 )
%= $c->get_current_webmail_status( TRUE )
</span></p>
% my $btn = l('mai_DESC_STATE_ACCESS_BUTTON');
@@ -51,19 +55,19 @@
<p><span class=label>
%=l 'mai_LABEL_VIRUS_SCAN'
</span><span class=data2>
%= $c->get_virus_status(1)
%= $c->get_virus_status(TRUE)
</span></p>
<p><span class=label>
%=l 'mai_LABEL_SPAM_SCAN'
</span><span class=data2>
%= $c->get_spam_status(1)
%= $c->get_spam_status(TRUE)
</span></p>
<p><span class=label>
%=l 'mai_LABEL_BLOCK_EXECUTABLE_CONTENT'
</span><span class=data2>
%= $c->get_patterns_status(1)
%= $c->get_patterns_status(TRUE)
</span></p>
% my $btn = l('mai_DESC_STATE_FILTERING_BUTTON');
@@ -82,14 +86,32 @@
</span><span class=data2>
%= $mai_datas->{fetchmailmethod}
</span></p>
% my $smtp_mesg;
% $smtp_mesg=l('SMTP port %u allow client to authenticate:');
<p><span class=label>
%=l 'mai_LABEL_SMTP_AUTH_CONTROL'
%= sprintf($smtp_mesg,$c->get_db_prop('qpsmtpd','TCPPort',25));
</span><span class=data2>
%= $c->get_current_smtp_auth( 1 )
%= $c->get_current_smtp_auth( TRUE )
</span></p>
% my $btn = l('mai_DESC_STATE_RECEPTION_BUTTON');
% $smtp_mesg=l('SMTPS SSL/TLS auth: port %u status:');
<p><span class=label>
%= sprintf($smtp_mesg,$c->get_db_prop('sqpsmtpd','TCPPort',465));
</span><span class=data2>
%= $c->get_current_smtp_ssl_auth( TRUE, 's', FALSE )
</span></p>
% $smtp_mesg=l 'Submission port %u status:';
<p><span class=label>
%= sprintf($smtp_mesg,$c->get_db_prop('uqpsmtpd','TCPPort',587));
</span><span class=data2>
%= $c->get_current_smtp_ssl_auth( TRUE,'u', FALSE )
</span></p>
<br />
% my $btn = l('mai_DESC_STATE_RECEPTION_BUTTON');
<div class='center'>
%= submit_button "$btn", class => 'action'
</div>
@@ -103,7 +125,7 @@
<p><span class=label>
%=l 'mai_LABEL_UNKNOWN'
</span><span class=data2>
%= $c->get_emailunknownuser_status( 1 )
%= $c->get_emailunknownuser_status( TRUE )
</span></p>
<p><span class=label>
@@ -127,4 +149,4 @@
% end
</div>
%end
%end

View File

@@ -3,7 +3,7 @@
% content_for 'module' => begin
<div id='module' class='module module-panel'>
% if ($config->{debug} == 1) {
% if (config->{debug} == 1) {
<p>
%= dumper $c->current_route
</p>

View File

@@ -3,7 +3,7 @@
% content_for 'module' => begin
<div id='module' class='module groups-panel'>
% if ($config->{debug} == 1) {
% if (config->{debug} == 1) {
<p>
%= dumper $c->current_route
%= dumper $grp_datas

View File

@@ -3,7 +3,7 @@
% content_for 'module' => begin
<div id='module' class='module hostentries-panel'>
% if ($config->{debug} == 1) {
% if (config->{debug} == 1) {
<p>
%= dumper $c->current_route
%= dumper $hos_datas

View File

@@ -3,7 +3,7 @@
% content_for 'module' => begin
<div id='module' class='module ibays-panel'>
% if ($config->{debug} == 1) {
% if (config->{debug} == 1) {
<p>
%= dumper $c->current_route
%= dumper $iba_datas

View File

@@ -2,7 +2,7 @@
% content_for 'module' => begin
% if ($config->{debug} == 1) {
% if (config->{debug} == 1) {
<p>
%= dumper $c->current_route
</p>
@@ -25,4 +25,4 @@
</p>
</div>
% end
% end

View File

@@ -5,12 +5,13 @@
<!-- default +jquery -->
<head>
<title><%= $title %></title>
<link rev="made" href="mailto:bugs%40koozali.org">
<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'
%= content_for 'head_contrib'
% if (config 'hasJquery') {
%= include 'partials/_js_imports'
@@ -32,9 +33,23 @@
%= javascript '/js/buttons.html5.min.js'
%= javascript '/js/buttons.print.min.js'
%= javascript '/js/flag-by-locale.js'
%= javascript '/js/sme-password.js'
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/flag-icon-css/3.5.0/css/flag-icon.min.css">
<link rel="stylesheet" href="/smanager/css/flag-icon.min.css">
%= stylesheet '/css/sme-jquery-overrides.css'
<style>
#busy-indicator {
display: none;
margin-top: 10px;
font-weight: bold;
color: red;
}
.busy {
cursor: wait; /* Change the cursor to a 'wait' cursor */
}
</style>
</head>
@@ -94,6 +109,22 @@
% }
%= javascript '/js/sme-dataTable-setup.js'
<script>
$(document).ready(function() {
// Handle form submission for any form
$('form').on('submit', function(event) {
// Disable the submit button
$(this).find('button[type="submit"], input[type="submit"]').prop('disabled', true);
// Show the busy indicator
// $('#busy-indicator').show();
// Change the cursor to "wait"
$('body').addClass('busy');
});
});
</script>
</body>
</html>
</html>

View File

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

View File

@@ -3,7 +3,7 @@
% content_for 'module' => begin
<div id='module' class='module localnetworks-panel'>
% if ($config->{debug} == 1) {
% if (config->{debug} == 1) {
<p>
%= dumper $c->current_route
%= dumper $c->stash("ret")

View File

@@ -43,9 +43,9 @@
<p><span class=label>
%=l 'PASSWORD'
</span><span class=input>
%= password_field 'Password', id => 'id_password', autocomplete => 'current-password'
%= password_field 'Password', id => 'id_password', autocomplete => 'current-password', class=>'sme-password'
% if (config 'hasJquery') {
<a href='#' id='togglePassword' class='toggle-password tg-icon'> <img src="images/visible.png" height="16" alt="Visible"></a>
%#<a href='#' id='togglePassword' class='toggle-password tg-icon'> <img src="images/visible.png" height="16" alt="Visible"></a>
% }
</span></p>
%}
@@ -66,4 +66,4 @@
% end
</div>
%end
%end

View File

@@ -3,7 +3,7 @@
% content_for 'module' => begin
<div id='module' class='module module-panel'>
% if ($config->{debug} == 1) {
% if (config->{debug} == 1) {
<p>
%= dumper $c->current_route
</p>

View File

@@ -46,19 +46,36 @@
%= t td => (class => 'sme-border') => $domain->{'Content'}
%= t td => (class => 'sme-border') => l('dom_' . $domain->{'Nameservers'})
% my $actionModify = "<a href='domains2?CsrfDef=TOKEN&trt=UPD&Domain=" . $domain->{Domain} . "'>" . "<button class='sme-modify-button' title=".l('MODIFY').">".l('MODIFY')."</button>" . "</a>";
% my $removable = ($domain->{Removable} || 'yes');
% my $actionRemove = '&nbsp;';
% if ($removable eq 'yes') {
% $actionRemove = "<a href='domains2?CsrfDef=TOKEN&trt=DEL&Domain=" . $domain->{Domain} . "'>" . "<button class='sme-remove-button' title=".l('REMOVE').">".l('REMOVE')."</button>" . "</a>";
% }
<td class='sme-border' style="min-width:15em">
<%= $c->render_to_string(inline => $actionModify) %> <%= $c->render_to_string(inline => $actionRemove) %>
</td>
</tr>
%# my $actionModify = "<a href='domains2?CsrfDef=TOKEN&trt=UPD&Domain=" . $domain->{Domain} . "'>" . "<button class='sme-modify-button' title=".l('MODIFY').">".l('MODIFY')."</button>" . "</a>";
%my $modify_text = l('MODIFY'); # Localized text
%my $csrf_token = "TOKEN"; # CSRF token for security
%my $domain_name = $domain->{Domain}; # Domain name extracted from the data structure
%my $actionModify = qq{
% <a href="domains2?CsrfDef=$csrf_token&trt=UPD&Domain=$domain_name">
% <button type='button' class='sme-modify-button' title='$modify_text' >
% $modify_text
% </button>
% </a>
%};
%my $removable = ($domain->{Removable} || 'yes');
%my $actionRemove = '&nbsp;';
%if ($removable eq 'yes') {
%my $remove_text = l('REMOVE'); # Localized text
%my $csrf_token = "TOKEN"; # CSRF token for security
%my $domain_name = $domain->{Domain}; # Domain name extracted from the data structure
%$actionRemove = qq{
% <a href="domains2?CsrfDef=$csrf_token&trt=DEL&Domain=$domain_name">
% <button type='button' class='sme-remove-button' title='$remove_text' >
% $remove_text
% </button>
% </a>
%};
%# $actionRemove = "<a href='domains2?CsrfDef=TOKEN&trt=DEL&Domain=" . $domain->{Domain} . "'>" . "<button class='sme-remove-button' title=".l('REMOVE').">".l('REMOVE')."</button>" . "</a>";
%};
<td class='sme-border' style="min-width:15em">
<%= $c->render_to_string(inline => $actionModify) %> <%= $c->render_to_string(inline => $actionRemove) %>
</td>
</tr>
% }
</tbody>

View File

@@ -1,12 +1,12 @@
<div id="footer" width=100%>
<div id="footer">
<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 ) {
SME Server <%= session 'releaseVersion' %> - Manager <%= $c->app->VERSION %>
SME Server <%= session 'releaseVersion' %>-<%= $c->app->VERSION %> Manager II
(Mojo:<%= Mojolicious->VERSION %>)
% }
<br>Copyright 1999-2006 Mitel Corporation<br>
%= session 'copyRight'
<br>Copyright (c) 2013-2024 Koozali Foundation Inc.<br>
</font>

View File

@@ -39,8 +39,27 @@
%= t td => (class => 'sme-border') => $group->key
%= t td => (class => 'sme-border') => $group->prop('Description')
<td class='sme-border' style="min-width:15em">
<a href='groups2?CsrfDef=TOKEN&trt=UPD&group=<%= $group->key%>'><button class='sme-modify-button' title=<%=l('MODIFY')%>><%=l('MODIFY') %></button></a>
<a href='groups2?CsrfDef=TOKEN&trt=DEL&group=<%= $group->key%>'><button class='sme-remove-button' title=<%=l('REMOVE')%>><%=l('REMOVE') %></button></a>
%my $modify_text = l('MODIFY'); # Localized text
%my $csrf_token = "TOKEN"; # CSRF token for security
%my $group_name = $group->key; # group name extracted from the data structure
%my $actionModify = qq{
% <a href="groups2?CsrfDef=$csrf_token&trt=UPD&group=$group_name">
% <button type='button' class='sme-modify-button' title='$modify_text' >
% $modify_text
% </button>
% </a>
%};
%my $remove_text = l('REMOVE'); # Localized text
%my $csrf_token = "TOKEN"; # CSRF token for security
%my $group_name = $group->key; # group name extracted from the data structure
%my $actionRemove = qq{
% <a href="groups2?CsrfDef=$csrf_token&trt=DEL&group=$group_name">
% <button type='button' class='sme-remove-button' title='$remove_text' >
% $remove_text
% </button>
% </a>
%};
<%= $c->render_to_string(inline => $actionModify) %> <%= $c->render_to_string(inline => $actionRemove) %>
</td>
</tr>
% }

View File

@@ -68,7 +68,7 @@
.login-button {
background-color: #98d36e; /* Button background color */
font-weight: bold; /* Bold text */
xxcolor: #ffffff; /* Button text color */
color: #ffffff; /* Button text color */
padding: 8px 12px; /* Adjust padding for button height */
border: none; /* Remove default border */
border-radius: 4px; /* Rounded corners */
@@ -100,17 +100,17 @@
</div>
<div id="h2e22">
<a id="help-button" target="_parent" href="manual"><button> ? </button></a>
<button type='button'class="login-button"><a id="help-button" target="_parent" href="manual">?</a></button>
</div>
<div id="h2e12">
<a id="legacy-button" href="/server-manager" target='_blank'><button>Legacy SM</button></a>
<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} ) {
<a target="_parent" href="login"><button class="login-button">Login</button></a>
<button type='button' class="login-button"><a target="_parent" href="login">Login</a></button>
% } else {
<a target="_parent" href="logout"><button class="login-button"><%= $c->session->{username} %> Logout</button></a>
<button type='button' class="login-button"><a target="_parent" href="logout"><%= $c->session->{username} %> Logout</a></button>
% }
</div>
<div id="flag-container">

View File

@@ -49,25 +49,36 @@
%= t td => (class => 'sme-border') => $_->{'IP'};
%= t td => (class => 'sme-border') => $_->{'MACAddress'};
%= t td => (class => 'sme-border') => $_->{'Comment'};
% my ($actionModify, $actionRemove) = '&nbsp;';
% if ($_->{'static'} ne 'yes') {
% $actionModify = "<a href='hostentriesd?CsrfDef=TOKEN&trt=UPD&Hostname=" . $_->{'HostName'} . "'>" . "<button class='sme-modify-button' title=".l('MODIFY').">".l('MODIFY')."</button>" . "</a>";
% $actionRemove = "<a href='hostentriesd?CsrfDef=TOKEN&trt=DEL&Hostname=" . $_->{'HostName'} . "'>" . "<button class='sme-remove-button' title=".l('REMOVE').">".l('REMOVE')."</button>" . "</a>";
% }
<td class='sme-border' style="min-width:15em">
<%= $c->render_to_string(inline => $actionModify) %>
<%= $c->render_to_string(inline => $actionRemove) %>
%my ($actionModify, $actionRemove) = '&nbsp;';
%my $static = $_->{'static'} || "no";
%if ($static ne 'yes') {
%my $modify_text = l('MODIFY'); # Localized text
%my $csrf_token = "TOKEN"; # CSRF token for security
%my $hostentries_name = $_->{'HostName'}; # hostentries name extracted from the data structure
%$actionModify = qq{
% <a href="hostentriesd?CsrfDef=$csrf_token&trt=UPD&Hostname=$hostentries_name">
% <button type='button' class='sme-modify-button' title='$modify_text' >
% $modify_text
% </button>
% </a>
%};
%my $remove_text = l('REMOVE'); # Localized text
%my $csrf_token = "TOKEN"; # CSRF token for security
%#my $hostentries_name = $_->{'HostName'}; # hostentries name extracted from the data structure
%$actionRemove = qq{
% <a href="hostentriesd?CsrfDef=$csrf_token&trt=DEL&Hostname=$hostentries_name">
% <button type='button' class='sme-remove-button' title='$remove_text' >
% $remove_text
% </button>
% </a>
%};
%}
<%= $c->render_to_string(inline => $actionModify) %> <%= $c->render_to_string(inline => $actionRemove) %>
</td>
</tr>
% }
</tbody>
</table>
</p>
% }
</tbody>
</table>
% }
</div>

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