Compare commits
83 Commits
11_0_0-13_
...
11_0_0-60_
| Author | SHA1 | Date | |
|---|---|---|---|
| 1731f75cba | |||
| 5fe285f9f2 | |||
| 1c93be6e8a | |||
| ce96f72726 | |||
| 0fd7137edd | |||
| d179b06f69 | |||
| c2427189d5 | |||
| 887af04bfe | |||
| 34b85b1cde | |||
| a5758b4431 | |||
| 58aa423089 | |||
| c0b4d1f90e | |||
| a979d472e8 | |||
| d776f20736 | |||
| a4668da720 | |||
| 7ad224998c | |||
| 3070e0656c | |||
| 642d013437 | |||
| a62968d2d9 | |||
| 0e777fd51a | |||
| eee68afa2b | |||
| c2d677594b | |||
| f6fe2216a0 | |||
| 6d3f8f48c2 | |||
| f8d9ec34e3 | |||
| 835d439e42 | |||
| 4797a1b189 | |||
| 1e4ec809b5 | |||
| d1197f55cf | |||
| b5d6de3bcf | |||
| ec4f515012 | |||
| 9b03d377e2 | |||
| 957d2ada21 | |||
| be49419eba | |||
| c1915a722b | |||
| 7ff51625c0 | |||
| 18c95a9021 | |||
| 5ef3a00a05 | |||
| 174e140a04 | |||
| d77b9bd341 | |||
| 746609ced0 | |||
| 9380ac0264 | |||
| a07bdf4aa5 | |||
| 4270814afc | |||
| 58c3f2348a | |||
| b58f82a332 | |||
| 8db1279a3e | |||
| 1d3d59b5c1 | |||
| ff9a84dd29 | |||
| 34e7331845 | |||
| dfda47882d | |||
| 55269fd685 | |||
| 1b1b99955b | |||
| c6eb08a727 | |||
| 8e70adc797 | |||
| 2424684d35 | |||
| 78bb7743c1 | |||
| 87f6a46502 | |||
| a08767919c | |||
| 2b83be6d70 | |||
| 6c1b6ed1f4 | |||
| 3fa8ab5eda | |||
| 55465e3081 | |||
| e5b9a012d9 | |||
| fbdf3170ec | |||
| 87d1d072c0 | |||
| d49db26f26 | |||
| c4f9d67abc | |||
| fe62bd3e39 | |||
| df6d21dbc9 | |||
| 9c9592f861 | |||
| 4d2097d2da | |||
| 44a9ecc0e1 | |||
| 785ebcfaaf | |||
| 127ea74a8b | |||
| b9f6392c1d | |||
| 659f060eb6 | |||
| 1087a8a5a2 | |||
| 6a5a756438 | |||
| 91ca26de27 | |||
| 8b93232bbe | |||
| ed1c3e13b1 | |||
| 095a0a1499 |
1
.gitignore
vendored
1
.gitignore
vendored
@@ -2,3 +2,4 @@
|
||||
*.log
|
||||
*spec-20*
|
||||
*.tar.xz
|
||||
*.bak
|
||||
|
||||
15
README.md
15
README.md
@@ -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.
|
||||
|
||||
@@ -45,6 +45,7 @@ for my $event ( qw( smeserver-manager-update smanager-refresh bootstrap-console-
|
||||
event_link('locales2-conf', "$event", '80');
|
||||
}
|
||||
|
||||
event_link('post-upgrade-and-reboot','post-upgrade-and-reboot',80);
|
||||
event_link('systemd-default', "smeserver-manager-update", '88');
|
||||
event_link('systemd-reload', "smeserver-manager-update", '89');
|
||||
templates2events("/etc/rsyslog.conf", "smeserver-manager-update");
|
||||
|
||||
1
root/etc/e-smith/events/actions/.perltidyrc
Normal file
1
root/etc/e-smith/events/actions/.perltidyrc
Normal file
@@ -0,0 +1 @@
|
||||
-pbp -nst -nse -l=120 -ce -csc -pt=2 -kbl=0 -mbl=1 -lbl=1
|
||||
@@ -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
|
||||
3
root/etc/e-smith/events/actions/post-upgrade-and-reboot
Executable file
3
root/etc/e-smith/events/actions/post-upgrade-and-reboot
Executable file
@@ -0,0 +1,3 @@
|
||||
#!/bin/bash
|
||||
/usr/sbin/e-smith/signal-event post-upgrade
|
||||
/usr/sbin/e-smith/signal-event reboot
|
||||
@@ -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";
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@@ -67,5 +67,30 @@ hr.sme-copyrightbar {
|
||||
color: #8ebe43;
|
||||
background-color: #8ebe43;
|
||||
}
|
||||
HERE
|
||||
|
||||
/* flag container*/
|
||||
#flag-container span {
|
||||
font-size: 24px;
|
||||
display: flex; /* Allows for easy centering */
|
||||
justify-content: center; /* Center horizontally */
|
||||
align-items: center; /* Center vertically */
|
||||
width: 100%; /* Full width of parent */
|
||||
height: 24px; /* Set a fixed height */
|
||||
border: 1px solid #ccc; /* Light gray border */
|
||||
border-radius: 5px; /* Rounded corners */
|
||||
cursor: default; /* Prevent text cursor */
|
||||
|
||||
}
|
||||
|
||||
.fallback-box {
|
||||
display: inline-block; /* Make it inline-block to fit around the content */
|
||||
border: 2px solid gray; /* Change the border color as desired */
|
||||
padding: 10px; /* Add some padding */
|
||||
border-radius: 10px; /* Round the corners of the box */
|
||||
font-size: 60px; /* Adjust size if needed */
|
||||
margin-top: 10px; /* Add some margin */
|
||||
text-align: center; /* Center text inside the box */
|
||||
}
|
||||
|
||||
HERE
|
||||
}
|
||||
@@ -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;
|
||||
@@ -273,6 +275,18 @@ a.menu-title {
|
||||
left: 2px;
|
||||
}
|
||||
|
||||
.roundcube div {
|
||||
height:462px;
|
||||
width:85%;
|
||||
margin-bottom:1%;
|
||||
}
|
||||
|
||||
.roundcube object {
|
||||
margin-top:1%;
|
||||
height:95%;
|
||||
width:100%;
|
||||
}
|
||||
|
||||
|
||||
/*end*/
|
||||
EOF
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -17,6 +17,7 @@ use Mojo::Home;
|
||||
|
||||
use DBM::Deep;
|
||||
use Mojo::JWT;
|
||||
use POSIX qw(strftime);
|
||||
|
||||
use Mojolicious::Plugin::Config;
|
||||
#use Mojolicious::Plugin::I18N;
|
||||
@@ -25,16 +26,27 @@ use SrvMngr::Plugin::I18N;
|
||||
use SrvMngr::I18N;
|
||||
use SrvMngr::Model::Main;
|
||||
|
||||
use SrvMngr::Plugin::WithoutCache;
|
||||
|
||||
our $VERSION = '1.420';
|
||||
use esmith::I18N;
|
||||
|
||||
#this is overwrittrn with the "release" by the spec file - release can be "99.el8.sme"
|
||||
our $VERSION = '51.el8.sme';
|
||||
#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';
|
||||
our @EXPORT_OK = qw(
|
||||
init_session get_mod_url theme_list
|
||||
getNavigation ip_number is_normal_password email_simple
|
||||
getNavigation ip_number validate_password is_normal_password email_simple
|
||||
mac_address_or_blank mac_address ip_number_or_blank
|
||||
lang_space get_routes_list subnet_mask get_reg_mask
|
||||
gen_locale_date_string get_public_ip_address
|
||||
);
|
||||
|
||||
has home => sub {
|
||||
@@ -200,6 +212,22 @@ sub setup_helpers {
|
||||
Mojo::JWT->new(secret => shift->app->secrets->[0] || die)
|
||||
});
|
||||
|
||||
$self->helper( selected_field => sub {
|
||||
my $self = shift;
|
||||
my @options = shift;
|
||||
my $selected = shift;
|
||||
my $count = 0;
|
||||
# search for occurence of value $selected in arrays; if found add selected => 'selected'
|
||||
for (my $i = 0; $i <= $#{$options[0]} ; $i++){
|
||||
if (grep /^$selected$/, @{$options[0][$i]}) {
|
||||
push( @{$options[0][$i]} ,'selected', 'selected' );
|
||||
$count++;last;
|
||||
}
|
||||
}
|
||||
push ( @{$options[0]} ,[ ucfirst( $selected), $selected, 'selected', 'selected'] ) if ($count <1);
|
||||
return @options;
|
||||
});
|
||||
|
||||
}
|
||||
|
||||
|
||||
@@ -210,16 +238,18 @@ sub setup_plugins {
|
||||
$self->plugin('TagHelpers');
|
||||
|
||||
$self->plugin('RenderFile');
|
||||
|
||||
$self->plugin('SrvMngr::Plugin::WithoutCache');
|
||||
|
||||
# CSRF protection if production mode
|
||||
# $self->plugin('Mojolicious::Plugin::CSRFDefender' => {
|
||||
# Adapted plugin for use with GET method
|
||||
$self->plugin('SrvMngr::Plugin::CSRFDefender' => {
|
||||
onetime => 1,
|
||||
error_status => 400,
|
||||
error_content => 'Error: CSRF token is invalid or outdated'
|
||||
#$self->plugin('SrvMngr::Plugin::CSRFDefender' => {
|
||||
#onetime => 1,
|
||||
#error_status => 400,
|
||||
#error_content => 'Error: CSRF token is invalid or outdated'
|
||||
#error_template => 'csrf_400'
|
||||
}) if ( $self->mode eq 'production' );
|
||||
#}) if ( $self->mode eq 'production' );
|
||||
|
||||
$self->plugin('SrvMngr::Plugin::I18N' => {namespace => 'SrvMngr::I18N', default => 'en'});
|
||||
|
||||
@@ -758,7 +788,23 @@ sub ip_number {
|
||||
return 'OK';
|
||||
}
|
||||
|
||||
sub validate_password {
|
||||
my ($c, $strength, $pass) = @_;
|
||||
use esmith::util;
|
||||
use POSIX qw(locale_h);
|
||||
use locale;
|
||||
my $old_locale = setlocale(LC_ALL);
|
||||
setlocale(LC_ALL, "en_US");
|
||||
my $reason = esmith::util::validatePassword($pass,$strength);
|
||||
return "OK" if ($reason eq "ok");
|
||||
setlocale(LC_ALL, $old_locale);
|
||||
return
|
||||
$c->l("Bad Password Choice") . ": "
|
||||
. $c->l("The password you have chosen is not a good choice, because") . " "
|
||||
. $c->l($reason). ".";
|
||||
} ## end sub validate_password
|
||||
|
||||
# to deprecate : this is not anymore a way to validate our passwords
|
||||
sub is_normal_password {
|
||||
|
||||
# from CGI::FormMagick::Validator qw( password );
|
||||
@@ -774,6 +820,29 @@ sub is_normal_password {
|
||||
}
|
||||
}
|
||||
|
||||
sub gen_locale_date_string
|
||||
{
|
||||
my $self = shift;
|
||||
my $i18n = esmith::I18N->new();
|
||||
$i18n->setLocale('formmagick', $i18n->preferredLanguage());
|
||||
return strftime "%c", localtime;
|
||||
}
|
||||
|
||||
sub get_public_ip_address
|
||||
{
|
||||
my $self = shift;
|
||||
my $cdb = esmith::ConfigDB->open() || die "Couldn't open config db";
|
||||
my $sysconfig = $cdb->get('sysconfig');
|
||||
if ($sysconfig)
|
||||
{
|
||||
my $publicIP = $sysconfig->prop('PublicIP');
|
||||
if ($publicIP)
|
||||
{
|
||||
return $publicIP;
|
||||
}
|
||||
}
|
||||
return undef;
|
||||
}
|
||||
|
||||
sub email_simple {
|
||||
my ($c, $data) = @_;
|
||||
|
||||
1
root/usr/share/smanager/lib/SrvMngr/Controller/.gitignore
vendored
Normal file
1
root/usr/share/smanager/lib/SrvMngr/Controller/.gitignore
vendored
Normal file
@@ -0,0 +1 @@
|
||||
*.tdy
|
||||
@@ -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
@@ -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 );
|
||||
|
||||
use SrvMngr 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;
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
use SrvMngr qw( gen_locale_date_string );
|
||||
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});
|
||||
|
||||
$dat_datas{'now_string'} = esmith::FormMagick->gen_locale_date_string();
|
||||
|
||||
$c->stash( title => $title, modul => $modul, dat_datas => \%dat_datas );
|
||||
chop($dat_datas{ampm});
|
||||
$dat_datas{'now_string'} = gen_locale_date_string;
|
||||
$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;
|
||||
|
||||
@@ -7,91 +7,87 @@ 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
|
||||
|
||||
};
|
||||
sub get_ldap_base {
|
||||
return esmith::util::ldapBase(get_value('','DomainName'));
|
||||
}
|
||||
|
||||
sub get_value {
|
||||
my $fm = shift;
|
||||
my $item = shift;
|
||||
|
||||
my $record = $db->get($item);
|
||||
if ($record) {
|
||||
return $record->value();
|
||||
}
|
||||
else {
|
||||
return '';
|
||||
}
|
||||
}
|
||||
1;
|
||||
|
||||
@@ -10,493 +10,421 @@ 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 $adb = esmith::AccountsDB->open || die "Couldn't open accounts db";
|
||||
|
||||
my ($ddb,$cdb,$adb);
|
||||
#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');
|
||||
$ddb = esmith::DomainsDB->open || die "Couldn't open domains db";
|
||||
$cdb = esmith::ConfigDB->open || die "Couldn't open configuration db";
|
||||
$adb = esmith::AccountsDB->open || die "Couldn't open accounts db";
|
||||
$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') || '';
|
||||
$ddb = esmith::DomainsDB->open || die "Couldn't open domains db";
|
||||
$cdb = esmith::ConfigDB->open || die "Couldn't open configuration db";
|
||||
$adb = esmith::AccountsDB->open || die "Couldn't open accounts db";
|
||||
|
||||
#$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');
|
||||
$ddb = esmith::DomainsDB->open || die "Couldn't open domains db";
|
||||
$cdb = esmith::ConfigDB->open || die "Couldn't open configuration db";
|
||||
$adb = esmith::AccountsDB->open || die "Couldn't open accounts db";
|
||||
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
@@ -11,329 +11,259 @@ 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 $adb = esmith::AccountsDB->open || die "Couldn't open accounts db";
|
||||
#our $cdb = esmith::ConfigDB->open || die "Couldn't open configuration db";
|
||||
#our $adb = esmith::AccountsDB->open || die "Couldn't open accounts db";
|
||||
my ($cdb,$adb);
|
||||
|
||||
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');
|
||||
$cdb = esmith::ConfigDB->open || die "Couldn't open configuration db";
|
||||
$adb = esmith::AccountsDB->open || die "Couldn't open accounts db";
|
||||
$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');
|
||||
$cdb = esmith::ConfigDB->open || die "Couldn't open configuration db";
|
||||
$adb = esmith::AccountsDB->open || die "Couldn't open accounts db";
|
||||
$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;
|
||||
$cdb = esmith::ConfigDB->open || die "Couldn't open configuration db";
|
||||
$adb = esmith::AccountsDB->open || die "Couldn't open accounts db";
|
||||
$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 +280,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 +301,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 +332,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 +356,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 +390,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 +408,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
|
||||
|
||||
@@ -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,81 @@ 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";
|
||||
#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";
|
||||
my ($ddb,$cdb,$hdb,$ndb);
|
||||
|
||||
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 = '';
|
||||
|
||||
#my $ddb = esmith::DomainsDB->open || die "Couldn't open hostentries db";
|
||||
$cdb = esmith::ConfigDB->open || die "Couldn't open configuration db";
|
||||
$hdb = esmith::HostsDB->open || die "Couldn't open hosts db";
|
||||
$ndb = esmith::NetworksDB->open || die "Couldn't open networks db";
|
||||
$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');
|
||||
$cdb = esmith::ConfigDB->open || die "Couldn't open configuration db";
|
||||
$hdb = esmith::HostsDB->open || die "Couldn't open hosts db";
|
||||
$ndb = esmith::NetworksDB->open || die "Couldn't open networks db";
|
||||
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 +107,24 @@ 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');
|
||||
$cdb = esmith::ConfigDB->open || die "Couldn't open configuration db";
|
||||
$hdb = esmith::HostsDB->open || die "Couldn't open hosts db";
|
||||
$ndb = esmith::NetworksDB->open || die "Couldn't open networks db";
|
||||
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 +134,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 +317,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 +340,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 +521,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;
|
||||
|
||||
@@ -4,289 +4,261 @@ 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 SrvMngr qw( theme_list init_session validate_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";
|
||||
#our $adb = esmith::AccountsDB->open || die "Couldn't open accounts db";
|
||||
#our $cdb = esmith::ConfigDB->open() || die "Couldn't open config db";
|
||||
my ($adb,$cdb);
|
||||
|
||||
sub main {
|
||||
|
||||
my $c = shift;
|
||||
$c->app->log->info($c->log_req);
|
||||
|
||||
my %iba_datas = ();
|
||||
my $title = $c->l('iba_FORM_TITLE');
|
||||
|
||||
$iba_datas{'trt'} = 'LIST';
|
||||
|
||||
my $title = $c->l('iba_FORM_TITLE');
|
||||
$adb = esmith::AccountsDB->open || die "Couldn't open accounts db";
|
||||
$cdb = esmith::ConfigDB->open() || die "Couldn't open config db";
|
||||
$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') || '';
|
||||
$adb = esmith::AccountsDB->open || die "Couldn't open accounts db";
|
||||
$cdb = esmith::ConfigDB->open() || die "Couldn't open config db";
|
||||
|
||||
#$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;
|
||||
$adb = esmith::AccountsDB->open || die "Couldn't open accounts db";
|
||||
$cdb = esmith::ConfigDB->open() || die "Couldn't open config db";
|
||||
|
||||
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 +267,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 +285,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 +299,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 +348,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,51 +375,15 @@ 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 );
|
||||
}
|
||||
|
||||
|
||||
sub validate_password {
|
||||
|
||||
my ($c, $strength, $pass) = @_;
|
||||
|
||||
use Crypt::Cracklib;
|
||||
|
||||
my $reason;
|
||||
|
||||
if ($strength eq "none") {
|
||||
return $c->l("Passwords must be at least 7 characters long") unless (length($pass) > 6);
|
||||
return "OK";
|
||||
}
|
||||
|
||||
$reason = is_normal_password($c, $pass, undef);
|
||||
return $reason unless ($reason eq "OK");
|
||||
return "OK" unless ($strength eq "strong");
|
||||
|
||||
if ( -f '/usr/lib64/cracklib_dict.pwd' ) {
|
||||
$reason = fascist_check($pass, '/usr/lib64/cracklib_dict');
|
||||
} else {
|
||||
$reason = fascist_check($pass, '/usr/lib/cracklib_dict');
|
||||
}
|
||||
$reason ||= "Software error: password check failed";
|
||||
|
||||
return "OK" if ($reason eq "ok");
|
||||
|
||||
return $c->l("Bad Password Choice") . ": "
|
||||
. $c->l("The password you have chosen is not a good choice, because")
|
||||
. " " . $c->($reason) . ".";
|
||||
}
|
||||
return validate_password($c, $strength, $password);
|
||||
} ## end sub check_password
|
||||
|
||||
|
||||
=head2 group_list()
|
||||
@@ -468,18 +394,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 +411,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 +427,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 +447,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
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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,226 @@ 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 $network_db = esmith::NetworksDB->open() || die("Couldn't open networks db");
|
||||
my $ret = "OK";
|
||||
my ($network_db);
|
||||
|
||||
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');
|
||||
$network_db = esmith::NetworksDB->open() || die("Couldn't open networks db");
|
||||
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');
|
||||
$network_db = esmith::NetworksDB->open() || die("Couldn't open networks db");
|
||||
$trt = 'DEL' if ($rt eq 'localnetworksdel');
|
||||
$trt = 'ADD' if ($rt eq 'localnetworksadd');
|
||||
$trt = 'ADD1' if ($rt eq 'localnetworksadd1');
|
||||
$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
|
||||
$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;
|
||||
$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 +245,27 @@ 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
|
||||
1;
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -10,246 +10,251 @@ 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";
|
||||
|
||||
#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 ($cdb,$tcp_db,$udp_db);
|
||||
|
||||
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 = '';
|
||||
|
||||
$cdb = esmith::ConfigDB->open || die "Can't open configuration database: $!\n";
|
||||
$tcp_db = esmith::ConfigDB->open('portforward_tcp') || die "Can't open portforward_tcp database: $!\n";
|
||||
$udp_db = esmith::ConfigDB->open('portforward_udp') || die "Can't open portforward_udp database: $!\n";
|
||||
$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');
|
||||
my $cdb = esmith::ConfigDB->open || die "Can't open configuration database: $!\n";
|
||||
my $tcp_db = esmith::ConfigDB->open('portforward_tcp') || die "Can't open portforward_tcp database: $!\n";
|
||||
my $udp_db = esmith::ConfigDB->open('portforward_udp') || die "Can't open portforward_udp database: $!\n";
|
||||
$trt = 'DEL' if ($rt eq 'portforwardingdel');
|
||||
$trt = 'ADD' if ($rt eq 'portforwardingadd');
|
||||
$trt = 'ADD1' if ($rt eq 'portforwardingadd1');
|
||||
$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");
|
||||
my $c = shift;
|
||||
my $sport = $c->param("sport") || '';
|
||||
my $proto = $c->param("proto") || '';
|
||||
|
||||
#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;
|
||||
sub get_destination_host {
|
||||
my $q = shift;
|
||||
my $dhost = $q->param("dhost");
|
||||
my $localip = $cdb->get_prop('InternalInterface', 'IPAddress');
|
||||
my $external_ip = $cdb->get_prop('ExternalInterface', 'IPAddress') || $localip;
|
||||
|
||||
if ($dhost =~ /^(127.0.0.1|$localip|$external_ip)$/i) {
|
||||
|
||||
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 +264,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 = $cdb->get_prop('InternalInterface', 'IPAddress');
|
||||
my $external_ip = $cdb->get_prop('ExternalInterface', 'IPAddress') || $localip;
|
||||
|
||||
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) {
|
||||
|
||||
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');
|
||||
}
|
||||
|
||||
my $systemmode = $db->get_value('SystemMode');
|
||||
$c->param(-name => 'dhost', -value => 'localhost');
|
||||
return (ret => 'pf_SUCCESS');
|
||||
} ## end if ($dhost =~ /^(localhost|127.0.0.1|$localip|$external_ip)$/i)
|
||||
my $systemmode = $cdb->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;
|
||||
|
||||
@@ -11,236 +11,201 @@ 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";
|
||||
#our $adb = esmith::AccountsDB->open || die "Couldn't open accounts db";
|
||||
my $adb;
|
||||
|
||||
sub main {
|
||||
|
||||
my $c = shift;
|
||||
$c->app->log->info($c->log_req);
|
||||
|
||||
my %prt_datas = ();
|
||||
my $title = $c->l('prt_FORM_TITLE');
|
||||
|
||||
my $title = $c->l('prt_FORM_TITLE');
|
||||
$adb = esmith::AccountsDB->open || die "Couldn't open accounts db";
|
||||
$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') || '';
|
||||
$adb = esmith::AccountsDB->open || die "Couldn't open accounts db";
|
||||
|
||||
#$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');
|
||||
$adb = esmith::AccountsDB->open || die "Couldn't open accounts db";
|
||||
$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 +214,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 +241,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 +307,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
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -11,288 +11,259 @@ 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 $adb = esmith::AccountsDB->open || die "Couldn't open accounts db";
|
||||
#our $cdb = esmith::ConfigDB->open || die "Couldn't open configuration db";
|
||||
#our $adb = esmith::AccountsDB->open || die "Couldn't open accounts db";
|
||||
my ($cdb,$adb);
|
||||
|
||||
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)
|
||||
{
|
||||
#$cdb = esmith::ConfigDB->open || die "Couldn't open configuration db";
|
||||
$adb = esmith::AccountsDB->open || die "Couldn't open accounts db";
|
||||
|
||||
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;
|
||||
#$cdb = esmith::ConfigDB->open || die "Couldn't open configuration db";
|
||||
$adb = esmith::AccountsDB->open || die "Couldn't open accounts db";
|
||||
$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');
|
||||
#$cdb = esmith::ConfigDB->open || die "Couldn't open configuration db";
|
||||
$adb = esmith::AccountsDB->open || die "Couldn't open accounts db";
|
||||
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 +272,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 +291,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 +305,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 +325,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 +353,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;
|
||||
|
||||
@@ -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 SrvMngr 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/\&/\&/g;
|
||||
s/\"/\"/g;
|
||||
s/\>/\>/g;
|
||||
s/\</\</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/\&/\&/g;
|
||||
s/\"/\"/g;
|
||||
s/\>/\>/g;
|
||||
s/\</\</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;
|
||||
|
||||
@@ -12,182 +12,199 @@ 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";
|
||||
|
||||
#our $adb = esmith::AccountsDB->open || die "Couldn't open accounts db";
|
||||
my $adb;
|
||||
|
||||
sub main {
|
||||
|
||||
my $c = shift;
|
||||
$c->app->log->info($c->log_req);
|
||||
|
||||
my %quo_datas = ();
|
||||
my $title = $c->l('quo_FORM_TITLE');
|
||||
|
||||
my $title = $c->l('quo_FORM_TITLE');
|
||||
$adb = esmith::AccountsDB->open || die "Couldn't open accounts db";
|
||||
$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');
|
||||
$adb = esmith::AccountsDB->open || die "Couldn't open accounts db";
|
||||
$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 = $c->toBestUnit($rec->prop('MaxBlocks'));
|
||||
$quo_datas{hardlim} = $max;
|
||||
$max = $c->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;
|
||||
$adb = esmith::AccountsDB->open || die "Couldn't open accounts db";
|
||||
|
||||
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
|
||||
|
||||
sub toMB
|
||||
{
|
||||
my ($self,$kb) = @_;
|
||||
return sprintf("%.2f", $kb / 1024);
|
||||
}
|
||||
|
||||
sub toMBNoDecimalPlaces
|
||||
{
|
||||
my ($self,$kb) = @_;
|
||||
return sprintf("%.0f", $kb / 1024);
|
||||
}
|
||||
|
||||
sub toGBNoDecimalPlaces
|
||||
{
|
||||
my ($self,$kb) = @_;
|
||||
return sprintf("%.0f", $kb / 1024 / 1024);
|
||||
}
|
||||
|
||||
sub toKB
|
||||
{
|
||||
my ($self,$mb) = @_;
|
||||
return sprintf("%.0f", $mb * 1024);
|
||||
}
|
||||
|
||||
|
||||
sub GBtoKB
|
||||
{
|
||||
my ($self,$gb) = @_;
|
||||
return sprintf("%.0f", $gb * 1024 * 1024);
|
||||
}
|
||||
|
||||
sub MBtoKB
|
||||
{
|
||||
my ($self,$mb) = @_;
|
||||
return sprintf("%.0f", $mb * 1024);
|
||||
}
|
||||
|
||||
sub toBestUnit
|
||||
{
|
||||
my ($self,$kb) = @_;
|
||||
return 0 if($kb == 0);
|
||||
return $kb."K" if($kb < 1024);
|
||||
return $kb."K" if($kb > 1024 && $kb < 1048576 && $kb % 1024 != 0);
|
||||
return $self->toMBNoDecimalPlaces($kb)."M" if($kb < 1048576);
|
||||
return $self->toMBNoDecimalPlaces($kb)."M" if($kb > 1048576
|
||||
&& ($kb % 1048576 != 0));
|
||||
return $self->toGBNoDecimalPlaces($kb)."G";
|
||||
}
|
||||
|
||||
1
|
||||
|
||||
@@ -1,87 +1,78 @@
|
||||
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" );
|
||||
esmith::util::backgroundCommand( 1, "/sbin/e-smith/signal-event", "post-upgrade-and-reboot");
|
||||
#system("/sbin/e-smith/signal-event", "post-upgrade") == 0
|
||||
#or die("Error occurred while running post-upgrade.\n");
|
||||
#system("/sbin/e-smith/signal-event", "reboot") == 0
|
||||
#or die("Error occurred while rebooting.\n");
|
||||
} ## end unless ($debug)
|
||||
} ## end elsif ($function eq 'reconfigure')
|
||||
$c->stash(title => $title, modul => $result);
|
||||
$c->render(template => 'module');
|
||||
|
||||
};
|
||||
|
||||
} ## end sub do_action
|
||||
|
||||
sub rebootFunction_list {
|
||||
|
||||
my $c = shift;
|
||||
return [[ $c->l('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;
|
||||
|
||||
@@ -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') => 'normal' ]
|
||||
];
|
||||
} ## 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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -7,76 +7,60 @@ 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 qw(gen_locale_date_string);
|
||||
|
||||
|
||||
#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'} = $c->get_public_ip_address($c);
|
||||
$rvw_datas{'gateway'} = $c->render_to_string(inline => print2_gateway_stanza($c));
|
||||
$rvw_datas{'serveronly'} = $c->render_to_string(inline => print2_serveronly_stanza($c));
|
||||
$rvw_datas{'addlocalnetworks'} = get_local_networks($c);
|
||||
$rvw_datas{'dhcpserver'} =
|
||||
$c->render_to_string(inline => print2_dhcp_stanza($c));
|
||||
|
||||
$rvw_datas{'dnsserver'} = (get_value('','LocalIP' )|| '');
|
||||
$rvw_datas{'webserver'} = 'www.'.(get_local_domain());
|
||||
$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 +70,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 +101,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,13 +129,53 @@ serving. (mojo ver)
|
||||
=cut
|
||||
|
||||
sub get2_local_networks {
|
||||
my $c = shift;
|
||||
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 {
|
||||
my $out = "";
|
||||
|
||||
foreach my $network (sort @nets) {
|
||||
if ($out ne "") {
|
||||
$out .= "<BR>";
|
||||
}
|
||||
$out .= $network->key . "/" . get_net_prop($c, $network->key, 'Mask');
|
||||
|
||||
if (defined get_net_prop($c, $network->key, 'Router')) {
|
||||
$out .= " via " . get_net_prop($c, $network->key, 'Router');
|
||||
}
|
||||
} ## end foreach my $network (sort @nets)
|
||||
return $out;
|
||||
} ## end else [ if ($numNetworks == 0)]
|
||||
} ## end sub get2_local_networks
|
||||
|
||||
sub get_net_prop {
|
||||
my $fm = shift;
|
||||
my $item = shift;
|
||||
my $prop = shift;
|
||||
|
||||
my $record = $networks->get($item);
|
||||
if ($record) {
|
||||
return $record->prop($prop);
|
||||
}
|
||||
else {
|
||||
return '';
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
sub get_local_networks {
|
||||
my $fm = shift;
|
||||
|
||||
my @nets = $networks->get_all_by_prop('type' => 'network');
|
||||
|
||||
my $numNetworks = @nets;
|
||||
if ($numNetworks == 0) {
|
||||
return $c->l('rvw_NO_NETWORKS');
|
||||
return $fm->localise('NO_NETWORKS');
|
||||
}
|
||||
else {
|
||||
my $out = "";
|
||||
@@ -153,10 +184,10 @@ sub get2_local_networks {
|
||||
$out .= "<BR>";
|
||||
}
|
||||
|
||||
$out .= $network->key."/" . get_net_prop($c, $network->key, 'Mask');
|
||||
$out .= $network->key."/" . get_net_prop($fm, $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($fm, $network->key, 'Router') ) {
|
||||
$out .= " via " . get_net_prop ($fm, $network->key, 'Router');
|
||||
}
|
||||
}
|
||||
return $out;
|
||||
@@ -164,6 +195,10 @@ sub get2_local_networks {
|
||||
|
||||
}
|
||||
|
||||
sub get_local_domain
|
||||
{
|
||||
return (get_value('','DomainName'));
|
||||
}
|
||||
|
||||
|
||||
=head2 print2_gateway_stanza
|
||||
@@ -172,28 +207,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 +237,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,15 +256,60 @@ 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
|
||||
|
||||
sub get_value {
|
||||
my $fm = shift;
|
||||
my $item = shift;
|
||||
my $record = $db->get($item);
|
||||
if ($record) {
|
||||
return $record->value();
|
||||
}
|
||||
else {
|
||||
return '';
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
sub get_prop {
|
||||
my $fm = shift if (ref($_[0]) ); # If we're being called in a formmagick context
|
||||
# The first argument will always be a fm.
|
||||
#otherwise, we don't want to grab it
|
||||
my $item = shift;
|
||||
my $prop = shift;
|
||||
|
||||
my $record = $db->get($item);
|
||||
if ($record) {
|
||||
return $record->prop($prop);
|
||||
}
|
||||
else {
|
||||
return '';
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
sub get_public_ip_address
|
||||
{
|
||||
my $self = shift;
|
||||
my $sysconfig = $db->get('sysconfig');
|
||||
if ($sysconfig)
|
||||
{
|
||||
my $publicIP = $sysconfig->prop('PublicIP');
|
||||
if ($publicIP)
|
||||
{
|
||||
return $publicIP;
|
||||
}
|
||||
}
|
||||
return undef;
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -0,0 +1,35 @@
|
||||
package SrvMngr::Controller::Roundcubepanel;
|
||||
|
||||
#----------------------------------------------------------------------
|
||||
# heading : System
|
||||
# description : 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('Webmail');
|
||||
my $roundcube_url = $c->param('url');
|
||||
$c->stash(title => $title, modul => $roundcube_url);
|
||||
$c->render(template => 'roundcube');
|
||||
} ## end sub main
|
||||
|
||||
sub getroundcubeurl {
|
||||
my $c = shift;
|
||||
my $url = shift;
|
||||
return "/smanager/roundcube?url=$url";
|
||||
} ## end sub getroundcubeurl
|
||||
1;
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -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;
|
||||
@@ -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";
|
||||
|
||||
use SrvMngr qw( theme_list init_session validate_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,29 @@ 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 );
|
||||
}
|
||||
|
||||
|
||||
sub validate_password {
|
||||
|
||||
my ($c, $strength, $pass) = @_;
|
||||
|
||||
use Crypt::Cracklib;
|
||||
|
||||
if ($strength eq "none") {
|
||||
return $c->l("Passwords must be at least 7 characters long") unless ( length( $pass ) > 6 );
|
||||
return "OK";
|
||||
}
|
||||
|
||||
my $reason = is_normal_password($c, $pass, undef);
|
||||
return $reason unless ($reason eq "OK");
|
||||
return "OK" unless ($strength eq "strong");
|
||||
|
||||
if ( -f '/usr/lib64/cracklib_dict.pwd' ) {
|
||||
$reason = fascist_check($pass, '/usr/lib64/cracklib_dict');
|
||||
} else {
|
||||
$reason = fascist_check($pass, '/usr/lib/cracklib_dict');
|
||||
}
|
||||
$reason ||= "Software error: password check failed";
|
||||
|
||||
return "OK" if ($reason eq "ok");
|
||||
|
||||
return $c->l("Bad Password Choice") . ": "
|
||||
. $c->l("The password you have chosen is not a good choice, because")
|
||||
. " " . $c->($reason) . ".";
|
||||
}
|
||||
|
||||
my $c = shift;
|
||||
my $password = shift;
|
||||
my $strength;
|
||||
my $cdb = esmith::ConfigDB->open_ro || die "Couldn't open configuration db";
|
||||
my $rec = $cdb->get('passwordstrength');
|
||||
$strength = ($rec ? ($rec->prop('Users') || 'none') : 'none');
|
||||
return validate_password($c, $strength, $password);
|
||||
} ## end sub check_password
|
||||
|
||||
1;
|
||||
|
||||
@@ -12,146 +12,122 @@ use strict;
|
||||
use warnings;
|
||||
use Mojo::Base 'Mojolicious::Controller';
|
||||
|
||||
#use esmith::FormMagick qw(gen_locale_date_string);
|
||||
|
||||
use Locale::gettext;
|
||||
use SrvMngr::I18N;
|
||||
use SrvMngr qw(theme_list init_session);
|
||||
|
||||
use esmith::ConfigDB;
|
||||
use Time::TAI64;
|
||||
use File::Basename;
|
||||
use HTML::Entities;
|
||||
use esmith::FormMagick qw(gen_locale_date_string);
|
||||
use SrvMngr qw(gen_locale_date_string);
|
||||
use File::Temp qw(tempfile);
|
||||
|
||||
use constant TRUE => 1;
|
||||
use constant FALSE => 0;
|
||||
|
||||
our $cdb = esmith::ConfigDB->open() || die "Couldn't open config db";
|
||||
|
||||
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;
|
||||
#} els
|
||||
if (/^([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 +137,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;
|
||||
}
|
||||
|
||||
|
||||
} ## end sub download_logFile
|
||||
1;
|
||||
|
||||
|
||||
@@ -10,94 +10,70 @@ 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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -26,7 +26,9 @@ experienced administrators
|
||||
for remote problem diagnosis and resolution.
|
||||
We recommend leaving this
|
||||
parameter set to "No Access"
|
||||
unless you have a specific reason to do otherwise.',
|
||||
unless you have a specific reason to do otherwise.
|
||||
Note that an "Autoblock" feature is enabled by default when public access is enabled; to disable or tune this feature, refer to the manual at https://wiki.koozali.org/AutoBlock
|
||||
',
|
||||
'rma_TITLE_FTP_ACCESS' => 'FTP Settings',
|
||||
'rma_DESC_FTP_ACCESS' => 'You can also control <b>FTP</b> access to your server. We
|
||||
recommend leaving this parameter set to \'no access\' unless you
|
||||
@@ -90,4 +92,4 @@ to the number 0 unless you require IPSEC client access.',
|
||||
can do so here.<br>Any old certificates will no longer
|
||||
authenticate against the server, so <b><i>all IPSEC clients will
|
||||
need to import a new certificate!</i></b>.',
|
||||
'rma_LABEL_IPSECRW_RESET' => 'Reset digital certificates',
|
||||
'rma_LABEL_IPSECRW_RESET' => 'Reset digital certificates',
|
||||
@@ -43,8 +43,9 @@ sub init_data {
|
||||
sub reconf_needed {
|
||||
|
||||
my $cdb = esmith::ConfigDB->open_ro() or die("can't open Config DB");
|
||||
my $unsafe = ($cdb->get('bootstrap-console') and $cdb->get('bootstrap-console')->prop('Run') eq 'yes') ||
|
||||
($cdb->get('UnsavedChanges') and $cdb->get('UnsavedChanges')->value eq 'yes') || '0';
|
||||
#my $unsafe = ($cdb->get('bootstrap-console') and $cdb->get('bootstrap-console')->prop('Run') eq 'yes') ||
|
||||
# ($cdb->get('UnsavedChanges') and $cdb->get('UnsavedChanges')->value eq 'yes') || '0';
|
||||
my $unsafe = ($cdb->get('UnsavedChanges') and $cdb->get('UnsavedChanges')->value eq 'yes') || '0';
|
||||
return $unsafe;
|
||||
}
|
||||
|
||||
@@ -104,5 +105,4 @@ sub check_adminalias {
|
||||
}
|
||||
|
||||
|
||||
1;
|
||||
|
||||
1;
|
||||
73
root/usr/share/smanager/lib/SrvMngr/Plugin/Cache.pm
Normal file
73
root/usr/share/smanager/lib/SrvMngr/Plugin/Cache.pm
Normal 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;
|
||||
94
root/usr/share/smanager/lib/SrvMngr/Plugin/WithoutCache.pm
Normal file
94
root/usr/share/smanager/lib/SrvMngr/Plugin/WithoutCache.pm
Normal 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;
|
||||
|
||||
@@ -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'};
|
||||
|
||||
1
root/usr/share/smanager/themes/default/public/css/flag-icon.min.css
vendored
Normal file
1
root/usr/share/smanager/themes/default/public/css/flag-icon.min.css
vendored
Normal file
File diff suppressed because one or more lines are too long
@@ -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 |
BIN
root/usr/share/smanager/themes/default/public/images/visible.png
Normal file
BIN
root/usr/share/smanager/themes/default/public/images/visible.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 3.2 KiB |
@@ -1,63 +1,298 @@
|
||||
document.addEventListener('DOMContentLoaded', () => {
|
||||
const flagContainer = document.getElementById('flag-container');
|
||||
const flagContainer = document.getElementById('flag-container');
|
||||
// Mapping of language codes to country codes and their names
|
||||
const languageToCountryMap = {
|
||||
"af": { code: "NA", name: "Namibia" },
|
||||
"agq": { code: "CM", name: "Cameroon" },
|
||||
"ak": { code: "GH", name: "Ghana" },
|
||||
"am": { code: "ET", name: "Ethiopia" },
|
||||
"ar": { code: "SA", name: "Saudi Arabia" },
|
||||
"as": { code: "IN", name: "India" },
|
||||
"asa": { code: "TZ", name: "Tanzania" },
|
||||
"ast": { code: "ES", name: "Spain" },
|
||||
"az": { code: "AZ", name: "Azerbaijan" },
|
||||
"bas": { code: "CM", name: "Cameroon" },
|
||||
"be": { code: "BY", name: "Belarus" },
|
||||
"bem": { code: "ZM", name: "Zambia" },
|
||||
"bez": { code: "TZ", name: "Tanzania" },
|
||||
"bg": { code: "BG", name: "Bulgaria" },
|
||||
"bm": { code: "ML", name: "Mali" },
|
||||
"bn": { code: "BD", name: "Bangladesh" },
|
||||
"bo": { code: "CN", name: "China" },
|
||||
"br": { code: "FR", name: "France" },
|
||||
"brx": { code: "IN", name: "India" },
|
||||
"bs": { code: "BA", name: "Bosnia and Herzegovina" },
|
||||
"ca": { code: "AD", name: "Andorra" },
|
||||
"ccp": { code: "BD", name: "Bangladesh" },
|
||||
"ce": { code: "RU", name: "Russia" },
|
||||
"cgg": { code: "UG", name: "Uganda" },
|
||||
"chr": { code: "US", name: "United States" },
|
||||
"ckb": { code: "IQ", name: "Iraq" },
|
||||
"cs": { code: "CZ", name: "Czech Republic" },
|
||||
"cy": { code: "GB", name: "United Kingdom" },
|
||||
"da": { code: "DK", name: "Denmark" },
|
||||
"dav": { code: "KE", name: "Kenya" },
|
||||
"de": { code: "DE", name: "Germany" },
|
||||
"dje": { code: "NE", name: "Niger" },
|
||||
"dsb": { code: "DE", name: "Germany" },
|
||||
"dua": { code: "CM", name: "Cameroon" },
|
||||
"dyo": { code: "SN", name: "Senegal" },
|
||||
"dz": { code: "BT", name: "Bhutan" },
|
||||
"ebu": { code: "KE", name: "Kenya" },
|
||||
"ee": { code: "GH", name: "Ghana" },
|
||||
"el": { code: "CY", name: "Cyprus" },
|
||||
"en": { code: "US", name: "United States" }, // Assume US for English if unspecified
|
||||
"es": { code: "ES", name: "Spain" },
|
||||
"et": { code: "EE", name: "Estonia" },
|
||||
"eu": { code: "ES", name: "Spain" },
|
||||
"ewo": { code: "CM", name: "Cameroon" },
|
||||
"fa": { code: "AF", name: "Afghanistan" },
|
||||
"ff": { code: "CM", name: "Cameroon" },
|
||||
"fi": { code: "FI", name: "Finland" },
|
||||
"fil": { code: "PH", name: "Philippines" },
|
||||
"fo": { code: "FO", name: "Faroe Islands" },
|
||||
"fr": { code: "FR", name: "France" },
|
||||
"fur": { code: "IT", name: "Italy" },
|
||||
"fy": { code: "NL", name: "Netherlands" },
|
||||
"ga": { code: "IE", name: "Ireland" },
|
||||
"gd": { code: "GB", name: "United Kingdom" },
|
||||
"gl": { code: "ES", name: "Spain" },
|
||||
"gsw": { code: "CH", name: "Switzerland" },
|
||||
"gu": { code: "IN", name: "India" },
|
||||
"guz": { code: "KE", name: "Kenya" },
|
||||
"gv": { code: "IM", name: "Isle of Man" },
|
||||
"ha": { code: "GH", name: "Ghana" },
|
||||
"haw": { code: "US", name: "United States" },
|
||||
"he": { code: "IL", name: "Israel" },
|
||||
"hi": { code: "IN", name: "India" },
|
||||
"hr": { code: "HR", name: "Croatia" },
|
||||
"hsb": { code: "DE", name: "Germany" },
|
||||
"hu": { code: "HU", name: "Hungary" },
|
||||
"hy": { code: "AM", name: "Armenia" },
|
||||
"id": { code: "ID", name: "Indonesia" },
|
||||
"ig": { code: "NG", name: "Nigeria" },
|
||||
"ii": { code: "CN", name: "China" },
|
||||
"is": { code: "IS", name: "Iceland" },
|
||||
"it": { code: "IT", name: "Italy" },
|
||||
"ja": { code: "JP", name: "Japan" },
|
||||
"jgo": { code: "CM", name: "Cameroon" },
|
||||
"jmc": { code: "TZ", name: "Tanzania" },
|
||||
"ka": { code: "GE", name: "Georgia" },
|
||||
"kab": { code: "DZ", name: "Algeria" },
|
||||
"kam": { code: "KE", name: "Kenya" },
|
||||
"kde": { code: "TZ", name: "Tanzania" },
|
||||
"kea": { code: "CV", name: "Cabo Verde" },
|
||||
"khq": { code: "ML", name: "Mali" },
|
||||
"ki": { code: "KE", name: "Kenya" },
|
||||
"kk": { code: "KZ", name: "Kazakhstan" },
|
||||
"kkj": { code: "CM", name: "Cameroon" },
|
||||
"kl": { code: "GL", name: "Greenland" },
|
||||
"kln": { code: "KE", name: "Kenya" },
|
||||
"km": { code: "KH", name: "Cambodia" },
|
||||
"kn": { code: "IN", name: "India" },
|
||||
"ko": { code: "KP", name: "North Korea" },
|
||||
"kok": { code: "IN", name: "India" },
|
||||
"ks": { code: "IN", name: "India" },
|
||||
"ksb": { code: "TZ", name: "Tanzania" },
|
||||
"ksf": { code: "CM", name: "Cameroon" },
|
||||
"ksh": { code: "DE", name: "Germany" },
|
||||
"kw": { code: "GB", name: "United Kingdom" },
|
||||
"ky": { code: "KG", name: "Kyrgyzstan" },
|
||||
"lag": { code: "TZ", name: "Tanzania" },
|
||||
"lb": { code: "LU", name: "Luxembourg" },
|
||||
"lg": { code: "UG", name: "Uganda" },
|
||||
"lkt": { code: "US", name: "United States" },
|
||||
"ln": { code: "AO", name: "Angola" },
|
||||
"lo": { code: "LA", name: "Laos" },
|
||||
"lrc": { code: "IQ", name: "Iraq" },
|
||||
"lt": { code: "LT", name: "Lithuania" },
|
||||
"lu": { code: "CD", name: "Democratic Republic of the Congo" },
|
||||
"luo": { code: "KE", name: "Kenya" },
|
||||
"Luo": { code: "KE", name: "Kenya" },
|
||||
"luy": { code: "KE", name: "Kenya" },
|
||||
"lv": { code: "LV", name: "Latvia" },
|
||||
"mas": { code: "KE", name: "Kenya" },
|
||||
"mer": { code: "KE", name: "Kenya" },
|
||||
"mfe": { code: "MU", name: "Mauritius" },
|
||||
"mg": { code: "MG", name: "Madagascar" },
|
||||
"mgh": { code: "MZ", name: "Mozambique" },
|
||||
"mgo": { code: "CM", name: "Cameroon" },
|
||||
"mk": { code: "MK", name: "North Macedonia" },
|
||||
"ml": { code: "IN", name: "India" },
|
||||
"mn": { code: "MN", name: "Mongolia" },
|
||||
"mr": { code: "IN", name: "India" },
|
||||
"ms": { code: "BN", name: "Brunei" },
|
||||
"mt": { code: "MT", name: "Malta" },
|
||||
"mua": { code: "CM", name: "Cameroon" },
|
||||
"my": { code: "MM", name: "Myanmar" },
|
||||
"mzn": { code: "IR", name: "Iran" },
|
||||
"naq": { code: "NA", name: "Namibia" },
|
||||
"nb": { code: "NO", name: "Norway" },
|
||||
"nd": { code: "ZW", name: "Zimbabwe" },
|
||||
"nds": { code: "DE", name: "Germany" },
|
||||
"ne": { code: "IN", name: "India" },
|
||||
"nl": { code: "NL", name: "Netherlands" },
|
||||
"nmg": { code: "CM", name: "Cameroon" },
|
||||
"nn": { code: "NO", name: "Norway" },
|
||||
"nnh": { code: "CM", name: "Cameroon" },
|
||||
"nus": { code: "SS", name: "South Sudan" },
|
||||
"nyn": { code: "UG", name: "Uganda" },
|
||||
"om": { code: "ET", name: "Ethiopia" },
|
||||
"or": { code: "IN", name: "India" },
|
||||
"os": { code: "GE", name: "Georgia" },
|
||||
"pa": { code: "PK", name: "Pakistan" },
|
||||
"pl": { code: "PL", name: "Poland" },
|
||||
"ps": { code: "AF", name: "Afghanistan" },
|
||||
"pt": { code: "PT", name: "Portugal" },
|
||||
"qu": { code: "BO", name: "Bolivia" },
|
||||
"rm": { code: "CH", name: "Switzerland" },
|
||||
"rn": { code: "BI", name: "Burundi" },
|
||||
"ro": { code: "RO", name: "Romania" },
|
||||
"rof": { code: "TZ", name: "Tanzania" },
|
||||
"ru": { code: "RU", name: "Russia" },
|
||||
"rw": { code: "RW", name: "Rwanda" },
|
||||
"rwk": { code: "TZ", name: "Tanzania" },
|
||||
"sah": { code: "RU", name: "Russia" },
|
||||
"saq": { code: "KE", name: "Kenya" },
|
||||
"sbp": { code: "TZ", name: "Tanzania" },
|
||||
"se": { code: "SE", name: "Sweden" },
|
||||
"seh": { code: "MZ", name: "Mozambique" },
|
||||
"ses": { code: "ML", name: "Mali" },
|
||||
"sg": { code: "CF", name: "Central African Republic" },
|
||||
"shi": { code: "TN", name: "Tunisia" },
|
||||
"si": { code: "LK", name: "Sri Lanka" },
|
||||
"sk": { code: "SK", name: "Slovakia" },
|
||||
"sl": { code: "SI", name: "Slovenia" },
|
||||
"smn": { code: "FI", name: "Finland" },
|
||||
"sn": { code: "ZW", name: "Zimbabwe" },
|
||||
"so": { code: "SO", name: "Somalia" },
|
||||
"sq": { code: "AL", name: "Albania" },
|
||||
"sr": { code: "RS", name: "Serbia" },
|
||||
"sv": { code: "SE", name: "Sweden" },
|
||||
"sw": { code: "CD", name: "Democratic Republic of the Congo" },
|
||||
"ta": { code: "IN", name: "India" },
|
||||
"te": { code: "IN", name: "India" },
|
||||
"teo": { code: "KE", name: "Kenya" },
|
||||
"tg": { code: "TJ", name: "Tajikistan" },
|
||||
"th": { code: "TH", name: "Thailand" },
|
||||
"ti": { code: "ER", name: "Eritrea" },
|
||||
"to": { code: "TO", name: "Tonga" },
|
||||
"tr": { code: "TR", name: "Turkey" },
|
||||
"tt": { code: "RU", name: "Russia" },
|
||||
"twq": { code: "NE", name: "Niger" },
|
||||
"tzm": { code: "MA", name: "Morocco" },
|
||||
"ug": { code: "CN", name: "China" },
|
||||
"uk": { code: "UA", name: "Ukraine" },
|
||||
"ur": { code: "IN", name: "India" },
|
||||
"uz": { code: "UZ", name: "Uzbekistan" },
|
||||
"vai": { code: "TN", name: "Tunisia" },
|
||||
"Vai": { code: "TN", name: "Tunisia" },
|
||||
"vi": { code: "VN", name: "Vietnam" },
|
||||
"vun": { code: "TZ", name: "Tanzania" },
|
||||
"wae": { code: "CH", name: "Switzerland" },
|
||||
"wo": { code: "SN", name: "Senegal" },
|
||||
"xog": { code: "UG", name: "Uganda" },
|
||||
"yav": { code: "CM", name: "Cameroon" },
|
||||
"yi": { code: "01", name: "Unknown" }, // Placeholder for unspecified region
|
||||
"yo": { code: "BJ", name: "Benin" },
|
||||
"yue": { code: "CN", name: "China" },
|
||||
"zgh": { code: "MA", name: "Morocco" },
|
||||
"zh": { code: "CN", name: "China" },
|
||||
"zu": { code: "ZA", name: "South Africa" },
|
||||
};
|
||||
|
||||
// Function to get the browser's locale
|
||||
function getBrowserLocale() {
|
||||
return navigator.language || navigator.userLanguage;
|
||||
}
|
||||
|
||||
// Function to map locale to country code
|
||||
function getCountryCodeFromLocale(locale) {
|
||||
const localeParts = locale.split('-');
|
||||
return localeParts.length > 1 ? localeParts[1] : localeParts[0];
|
||||
}
|
||||
//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 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;
|
||||
function getCountryNameFromLanguage(language) {
|
||||
return languageToCountryMap[language] ? languageToCountryMap[language].name : null;
|
||||
}
|
||||
|
||||
function getCountryCodeFromLanguage(language) {
|
||||
return languageToCountryMap[language] ? languageToCountryMap[language].code : null;
|
||||
}
|
||||
|
||||
function getCountryNameFromCountryCode(countryCode) {
|
||||
//alert(`Country code: ${countryCode}`);
|
||||
for (const language in languageToCountryMap) {
|
||||
if (languageToCountryMap.hasOwnProperty(language)) {
|
||||
if (languageToCountryMap[language].code === countryCode) {
|
||||
return languageToCountryMap[language].name;
|
||||
}
|
||||
}
|
||||
}
|
||||
return null; // Return null if country code not found
|
||||
}
|
||||
|
||||
function getFlagEmoji(locale) {
|
||||
// Split the locale to get the language and country code
|
||||
const parts = locale.split('-');
|
||||
let countryCode;
|
||||
|
||||
// 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
|
||||
}
|
||||
|
||||
// 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' };
|
||||
}
|
||||
|
||||
// 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
|
||||
};
|
||||
}
|
||||
|
||||
function displayLocaleAndFlag() {
|
||||
// Get the browser locale
|
||||
const userLocale = navigator.language || navigator.userLanguage;
|
||||
//alert(`User Locale: ${userLocale}`); // Alert the detected locale
|
||||
|
||||
const { flag, isUnknown, countryCode } = getFlagEmoji(userLocale);
|
||||
|
||||
//alert(`Country Code: ${countryCode}, Is Unknown: ${isUnknown}`); // Debug country code and unknown flag status
|
||||
|
||||
// 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()}`; // Show ? and locale code inside the box
|
||||
document.getElementById('flag-container').appendChild(fallbackDiv);
|
||||
|
||||
// Tooltip for fallback
|
||||
fallbackDiv.title = "Unknown Country"; // Tooltip for fallback
|
||||
//alert('Fallback triggered: Unknown Country'); // Debug fallback
|
||||
} else {
|
||||
const countryName = getCountryNameFromCountryCode(countryCode.toUpperCase());
|
||||
//alert(`Country Name from Country Code: ${countryName}`); // Alert the country name
|
||||
|
||||
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').appendChild(flagSpan);
|
||||
|
||||
//alert(`Flag Emoji: ${flag}`); // Debug flag emoji display
|
||||
}
|
||||
return countryNames;
|
||||
}
|
||||
|
||||
// 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 you want a custom tooltip instead (uncomment the lines below):
|
||||
/*
|
||||
const tooltip = document.createElement('span');
|
||||
tooltip.className = 'tooltip';
|
||||
tooltip.innerText = countryName;
|
||||
flagIcon.appendChild(tooltip);
|
||||
|
||||
flagIcon.addEventListener('mouseenter', () => {
|
||||
tooltip.style.display = 'block';
|
||||
});
|
||||
|
||||
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
|
||||
|
||||
const countryName = countryNames[countryCode.toLowerCase()] || 'Unknown Country'; // Get the country name
|
||||
displayFlagIcon(countryCode, countryName); // Display the flag with country name
|
||||
})();
|
||||
});
|
||||
}
|
||||
displayLocaleAndFlag();
|
||||
});
|
||||
@@ -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);
|
||||
});
|
||||
});
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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}
|
||||
|
||||
@@ -11,42 +11,52 @@
|
||||
# The events handle cases where mysqld is not enabled, and/or is not running.
|
||||
my $status = system("/sbin/e-smith/signal-event", "pre-backup", "desktop");
|
||||
if ($status) {
|
||||
desktopBackupRecordStatus($backup_rec, 'pre-backup', $status);
|
||||
return ($c->l('bac_OPERATION_STATUS_REPORT').
|
||||
$c->l('bac_ERR_PRE_BACKUP'));
|
||||
$c->desktopBackupRecordStatus($backup_rec, 'pre-backup', $status);
|
||||
return ($c->l('bac_OPERATION_STATUS_REPORT').$c->l('bac_ERR_PRE_BACKUP'));
|
||||
}
|
||||
|
||||
my $clvl = $c->stash('compressionlevel');
|
||||
my $cmd = "/bin/tar --directory / --create @{$c->stash('directories')} --file=-"
|
||||
. "@{$c->stash('exclude')} | /usr/bin/gzip $clvl ";
|
||||
my $cmd = "/bin/tar --create --file=- --directory / @{$c->stash('exclude')} "
|
||||
. "@{$c->stash('directories')} | /usr/bin/gzip $clvl ";
|
||||
|
||||
my $success = open my $fh, '-|', $cmd;
|
||||
unless ($success) { return "Error dowload command."; };
|
||||
|
||||
# Write chunk
|
||||
$c->res->headers->content_type('application/x-tar');
|
||||
$c->res->headers->content_disposition(qq/attachment; filename="smeserver.tgz"/);
|
||||
|
||||
my $cb;
|
||||
$cb = sub {
|
||||
my $c = shift;
|
||||
my $size = 500 * 1024;
|
||||
my $length = sysread($fh, my $buffer, $size);
|
||||
unless ($length) {
|
||||
close $fh;
|
||||
undef $cb;
|
||||
$c->finish;
|
||||
return;
|
||||
}
|
||||
$c->write_chunk($buffer, $cb);
|
||||
};
|
||||
$c->$cb;
|
||||
#unless ($success) { return "Error download command."; };
|
||||
if ($success) {
|
||||
# Try with download plugin - seems to fail to complete download and also
|
||||
# name of file deposited is not as required.
|
||||
#my $output = do { local $/; <$fh> };
|
||||
#close $fh;
|
||||
#$c->render_file(
|
||||
#data => $output,
|
||||
#filename => 'output.txt',
|
||||
#content_type => 'text/plain'
|
||||
#);
|
||||
# So organise it ourselves.
|
||||
$c->res->headers->content_type('application/x-tar');
|
||||
$c->res->headers->content_disposition(qq/attachment; filename="smeserver.tgz"/);
|
||||
my $cb;
|
||||
$cb = sub {
|
||||
my $c = shift;
|
||||
my $size = 500 * 1024;
|
||||
my $length = sysread($fh, my $buffer, $size);
|
||||
unless ($length) {
|
||||
close $fh;
|
||||
undef $cb;
|
||||
$c->finish;
|
||||
return;
|
||||
}
|
||||
$c->write_chunk($buffer, $cb);
|
||||
};
|
||||
$c->$cb;
|
||||
} else {
|
||||
$c->render(text => "Failed to execute command: $!", status => 500);
|
||||
}
|
||||
|
||||
# Remove the dumped tables.
|
||||
$status = system("/sbin/e-smith/signal-event", "post-backup", "desktop");
|
||||
if ($status) {
|
||||
desktopBackupRecordStatus($backup_rec, 'post-backup', $status);
|
||||
die ($c->l('bac_ERR_POST_BACKUP'),"\n");
|
||||
$c->desktopBackupRecordStatus($backup_rec, 'post-backup', $status);
|
||||
die ($c->l('bac_ERR_POST_BACKUP'),"\n");
|
||||
}
|
||||
|
||||
$now = time();
|
||||
@@ -54,3 +64,4 @@
|
||||
$backup_rec->set_prop('Result', "0");
|
||||
|
||||
%>
|
||||
1;
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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} %>
|
||||
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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>
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
@@ -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>
|
||||
@@ -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")
|
||||
|
||||
@@ -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
|
||||
@@ -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>
|
||||
|
||||
@@ -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 = ' ';
|
||||
|
||||
% 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 = ' ';
|
||||
%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>
|
||||
|
||||
@@ -1,12 +1,14 @@
|
||||
<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
|
||||
% my $mode;
|
||||
% if (config->{mode} eq 'development'){ $mode = '-dev';} else { $mode = '';}
|
||||
(Mojo:<%= Mojolicious->VERSION %><%= $mode %>)
|
||||
% }
|
||||
<br>Copyright 1999-2006 Mitel Corporation<br>
|
||||
%= session 'copyRight'
|
||||
<br>Copyright (c) 2013-2024 Koozali Foundation Inc.<br>
|
||||
</font>
|
||||
|
||||
</font>
|
||||
@@ -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>
|
||||
% }
|
||||
|
||||
@@ -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">
|
||||
|
||||
@@ -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) = ' ';
|
||||
% 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) = ' ';
|
||||
%my $static = $_->{'static'} || "no";
|
||||
%if ($static ne 'yes') {
|
||||
%my $modify_text = l('MODIFY'); # Localized text
|
||||
%my $csrf_token = "TOKEN"; # CSRF token for security
|
||||
%my $hostentries_name = $_->{'HostName'}; # hostentries name extracted from the data structure
|
||||
%$actionModify = qq{
|
||||
% <a href="hostentriesd?CsrfDef=$csrf_token&trt=UPD&Hostname=$hostentries_name">
|
||||
% <button type='button' class='sme-modify-button' title='$modify_text' >
|
||||
% $modify_text
|
||||
% </button>
|
||||
% </a>
|
||||
%};
|
||||
%my $remove_text = l('REMOVE'); # Localized text
|
||||
%$csrf_token = "TOKEN"; # CSRF token for security
|
||||
%#my $hostentries_name = $_->{'HostName'}; # hostentries name extracted from the data structure
|
||||
%$actionRemove = qq{
|
||||
% <a href="hostentriesd?CsrfDef=$csrf_token&trt=DEL&Hostname=$hostentries_name">
|
||||
% <button type='button' class='sme-remove-button' title='$remove_text' >
|
||||
% $remove_text
|
||||
% </button>
|
||||
% </a>
|
||||
%};
|
||||
%}
|
||||
<%= $c->render_to_string(inline => $actionModify) %> <%= $c->render_to_string(inline => $actionRemove) %>
|
||||
</td>
|
||||
|
||||
</tr>
|
||||
|
||||
% }
|
||||
|
||||
</tbody>
|
||||
</table>
|
||||
</p>
|
||||
|
||||
% }
|
||||
|
||||
|
||||
</tbody>
|
||||
</table>
|
||||
% }
|
||||
</div>
|
||||
|
||||
@@ -46,29 +46,62 @@
|
||||
<tr>
|
||||
%= t td => (class => 'sme-border') => $ibay->key
|
||||
%= t td => (class => 'sme-border') => $ibay->prop('Name')
|
||||
% my ($actionModify, $actionResetPw, $actionRemove) = ' ';
|
||||
% if ($modifiable eq 'yes') {
|
||||
% $actionModify = "<a href='ibaysd?CsrfDef=TOKEN&trt=UPD&ibay=" . $ibay->key . "'>" . "<button class='sme-modify-button' title=".l('MODIFY').">".l('MODIFY')."</button>" . "</a>";
|
||||
% }
|
||||
% if ($passwordable eq 'yes') {
|
||||
% if ($ibay->prop('PasswordSet') ne 'yes' && $needPassword) {
|
||||
%# $actionResetPw .= "<a href='ibaysd?CsrfDef=TOKEN&trt=PWD&ibay=" . $ibay->key . "' class='error'>" . l('PASSWORD_RESET') . "</a>";
|
||||
% $actionResetPw .= "<a href='ibaysd?CsrfDef=TOKEN&trt=PWD&ibay=" . $ibay->key. "'>" . "<button class='sme-password-button' style ='border-color:red;' title=".l("Reset-Password").">".l("Reset-Password")."</button></a>";
|
||||
% } else {
|
||||
% $actionResetPw .= "<a href='ibaysd?CsrfDef=TOKEN&trt=PWD&ibay=" . $ibay->key . "'>" . "<button class='sme-password-button' title=".l("Reset-Password").">".l("Reset-Password")."</button></a>";
|
||||
%# $actionResetPw .= "<a href='ibaysd?CsrfDef=TOKEN&trt=PWD&ibay=" . $ibay->key . "'>" . l('PASSWORD_RESET') . "</a>";
|
||||
% }
|
||||
% $actionResetPw .= ' ';
|
||||
% }
|
||||
% if ($removable eq 'yes') {
|
||||
% $actionRemove = "<a href='ibaysd?CsrfDef=TOKEN&trt=DEL&ibay=" . $ibay->key . "'>" . "<button class='sme-remove-button' title=".l('REMOVE').">".l('REMOVE')."</button>" . "</a>";
|
||||
% }
|
||||
<td class='sme-border' style="min-width:20em">
|
||||
<td class='sme-border' style="min-width:15em">
|
||||
%my ($actionModify, $actionResetPw, $actionRemove) = ' ';
|
||||
%if ($modifiable eq 'yes') {
|
||||
%my $modify_text = l('MODIFY'); # Localized text
|
||||
%my $csrf_token = "TOKEN"; # CSRF token for security
|
||||
%my $ibays_entry_name = $ibay->key; # ibays_entry name extracted from the data structure
|
||||
%$actionModify = qq{
|
||||
% <a href="ibaysd?CsrfDef=$csrf_token&trt=UPD&ibay=$ibays_entry_name">
|
||||
% <button type='button' class='sme-modify-button' title='$modify_text' >
|
||||
% $modify_text
|
||||
% </button>
|
||||
% </a>
|
||||
%};
|
||||
%}
|
||||
|
||||
%if ($passwordable eq 'yes') {
|
||||
%my $password_text = l('PASSWORD_RESET'); # Localized text
|
||||
%my $csrf_token = "TOKEN"; # CSRF token for security
|
||||
%my $ibays_entry_name = $ibay->key; # ibays_entry name extracted from the data structure
|
||||
%if ($ibay->prop('PasswordSet') ne 'yes' && $needPassword) {
|
||||
%$actionResetPw = qq{
|
||||
% <a href="ibaysd?CsrfDef=$csrf_token&trt=PWD&ibay=$ibays_entry_name">
|
||||
% <button type='button' class='sme-password-button unset' title="$password_text - currently unset" style = background:pink; >
|
||||
% $password_text
|
||||
% </button>
|
||||
% </a>
|
||||
%};
|
||||
%} else {
|
||||
%$actionResetPw = qq{
|
||||
% <a href="ibaysd?CsrfDef=$csrf_token&trt=PWD&ibay=$ibays_entry_name">
|
||||
% <button type='button' class='sme-password-button' title='$password_text' >
|
||||
% $password_text
|
||||
% </button>
|
||||
% </a>
|
||||
%};
|
||||
%}
|
||||
|
||||
%}
|
||||
|
||||
%if ($removable eq 'yes') {
|
||||
%my $remove_text = l('REMOVE'); # Localized text
|
||||
%my $csrf_token = "TOKEN"; # CSRF token for security
|
||||
%my $ibays_entry_name = $ibay->key; # ibays_entry name extracted from the data structure
|
||||
%$actionRemove = qq{
|
||||
% <a href="ibaysd?CsrfDef=$csrf_token&trt=DEL&ibay=$ibays_entry_name">
|
||||
% <button type='button' class='sme-remove-button' title='$remove_text' >
|
||||
% $remove_text
|
||||
% </button>
|
||||
% </a>
|
||||
%};
|
||||
%}
|
||||
<%= $c->render_to_string(inline => $actionModify) %>
|
||||
<%= $c->render_to_string(inline => $actionResetPw)%>
|
||||
<%= $c->render_to_string(inline => $actionRemove) %>
|
||||
</td>
|
||||
</tr>
|
||||
</td>
|
||||
</tr>
|
||||
% }
|
||||
</tbody>
|
||||
</table>
|
||||
|
||||
@@ -17,7 +17,7 @@
|
||||
<span class=label>
|
||||
%=l 'PASSWORD_NEW', class => 'label'
|
||||
</span><span class=data>
|
||||
%= password_field 'newPass', class => 'input'
|
||||
%= password_field 'newPass', class => 'input' , class=>'sme-password'
|
||||
</span>
|
||||
</p>
|
||||
|
||||
@@ -25,7 +25,7 @@
|
||||
<span class=label>
|
||||
%=l 'PASSWORD_VERIFY_NEW', class => 'label'
|
||||
</span><span class=data>
|
||||
%= password_field 'newPassVerify', class => 'input'
|
||||
%= password_field 'newPassVerify', class => 'input', class=>'sme-password'
|
||||
</span>
|
||||
</p>
|
||||
|
||||
@@ -39,4 +39,4 @@
|
||||
|
||||
% end
|
||||
|
||||
</div>
|
||||
</div>
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user