Reformat Controller perl code using perltidy

This commit is contained in:
Brian Read 2025-01-14 12:49:31 +00:00
parent 7ff51625c0
commit c1915a722b
38 changed files with 5870 additions and 7437 deletions

File diff suppressed because it is too large Load Diff

View File

@ -4,21 +4,17 @@ package SrvMngr::Controller::Bugreport;
# heading : Investigation # heading : Investigation
# description : Report a bug # description : Report a bug
# navigation : 7000 500 # navigation : 7000 500
# routes : end # routes : end
#------------------------------ #------------------------------
use strict; use strict;
use warnings; use warnings;
use Mojo::Base 'Mojolicious::Controller'; use Mojo::Base 'Mojolicious::Controller';
use Locale::gettext; use Locale::gettext;
use SrvMngr::I18N; use SrvMngr::I18N;
use SrvMngr qw(theme_list init_session); use SrvMngr qw(theme_list init_session);
use Text::Template; use Text::Template;
use File::Basename; use File::Basename;
use esmith::FormMagick qw( gen_locale_date_string ); use esmith::FormMagick qw( gen_locale_date_string );
our $cdb = esmith::ConfigDB->open or die "Couldn't open ConfigDB\n"; our $cdb = esmith::ConfigDB->open or die "Couldn't open ConfigDB\n";
# Get some basic info on the current SME install # Get some basic info on the current SME install
@ -31,47 +27,34 @@ our $releaseversion = $sysconfig->prop('ReleaseVersion');
our $templatefile = '/tmp/bugreport_template.txt'; our $templatefile = '/tmp/bugreport_template.txt';
our $configreportfile = '/tmp/configreport.txt'; our $configreportfile = '/tmp/configreport.txt';
sub main { sub main {
my $c = shift; my $c = shift;
$c->app->log->info($c->log_req); $c->app->log->info($c->log_req);
my %bugr_datas = (); my %bugr_datas = ();
my $title = $c->l('bugr_FORM_TITLE'); my $title = $c->l('bugr_FORM_TITLE');
my $modul = $c->render_to_string(inline => $c->l('bugr_DESCRIPTION')); my $modul = $c->render_to_string(inline => $c->l('bugr_DESCRIPTION'));
$bugr_datas{'trt'} = 'SHOW'; $bugr_datas{'trt'} = 'SHOW';
$c->stash(title => $title, modul => $modul, bugr_datas => \%bugr_datas); $c->stash(title => $title, modul => $modul, bugr_datas => \%bugr_datas);
$c->render(template => 'bugreport'); $c->render(template => 'bugreport');
}; } ## end sub main
sub do_report { sub do_report {
my $c = shift; my $c = shift;
$c->app->log->info($c->log_req); $c->app->log->info($c->log_req);
my $title = $c->l('bugr_FORM_TITLE'); my $title = $c->l('bugr_FORM_TITLE');
my $trt = $c->param('trt') || 'SHOW'; my $trt = $c->param('trt') || 'SHOW';
my %bugr_datas = (); my %bugr_datas = ();
$bugr_datas{'trt'} = $trt; $bugr_datas{'trt'} = $trt;
if ($trt eq 'SHOW') { if ($trt eq 'SHOW') {
create_configuration_report(); create_configuration_report();
my $out = $c->render_to_string(inline => show_config_report()); my $out = $c->render_to_string(inline => show_config_report());
$bugr_datas{'trt'} = 'DOWN'; $bugr_datas{'trt'} = 'DOWN';
$c->stash(title => $title, modul => $out, bugr_datas => \%bugr_datas); $c->stash(title => $title, modul => $out, bugr_datas => \%bugr_datas);
$c->render(template => 'bugreport2'); $c->render(template => 'bugreport2');
} } ## end if ($trt eq 'SHOW')
if ($trt eq 'DOWN') { if ($trt eq 'DOWN') {
my $modul = 'Bug report download'; my $modul = 'Bug report download';
# $c->render_file( # $c->render_file(
@ -80,25 +63,24 @@ sub do_report {
# 'content_disposition' => 'attachment', # 'content_disposition' => 'attachment',
# 'cleanup' => 1, # 'cleanup' => 1,
# ); # );
# the following in this sub will not be used !!! # the following in this sub will not be used !!!
# $bugr_datas{'trt'} = 'DOWN'; # $bugr_datas{'trt'} = 'DOWN';
# $c->stash(title => $title, modul => $modul, bugr_datas => \%bugr_datas); # $c->stash(title => $title, modul => $modul, bugr_datas => \%bugr_datas);
# $c->render(template => 'bugreport'); # $c->render(template => 'bugreport');
} } ## end if ($trt eq 'DOWN')
}; } ## end sub do_report
sub create_configuration_report { sub create_configuration_report {
my $c = shift; my $c = shift;
# TBD: possibly check $q for a boolean value eg. from a checkbox # TBD: possibly check $q for a boolean value eg. from a checkbox
# indicating the user has read privacy warning etc. # indicating the user has read privacy warning etc.
# create the reporting template # 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; my $report_creation_time = gen_locale_date_string;
# curent kernel # curent kernel
@ -109,17 +91,17 @@ sub create_configuration_report {
# get additional Repositories # get additional Repositories
my @repositories = `/sbin/e-smith/audittools/repositories`; my @repositories = `/sbin/e-smith/audittools/repositories`;
#print @repositories;
#print @repositories;
# get templates # get templates
my @templates = `/sbin/e-smith/audittools/templates`; my @templates = `/sbin/e-smith/audittools/templates`;
# get events # get events
my @events = `/sbin/e-smith/audittools/events`; my @events = `/sbin/e-smith/audittools/events`;
# set template variables # set template variables
my %vars = (report_creation_time => \$report_creation_time, my %vars = (
report_creation_time => \$report_creation_time,
releaseversion => \$releaseversion, releaseversion => \$releaseversion,
curkernel => \$curkernel, curkernel => \$curkernel,
systemmode => \$systemmode, systemmode => \$systemmode,
@ -137,39 +119,28 @@ sub create_configuration_report {
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; print $cfgrep $result;
close $cfgrep; close $cfgrep;
} } ## end sub create_configuration_report
sub show_config_report { sub show_config_report {
my $c = shift; my $c = shift;
my $out = ''; my $out = '';
$out .= sprintf "<PRE>"; $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>) { while (<$cfgrep>) {
$out .= sprintf("%s", $_); $out .= sprintf("%s", $_);
} }
$out .= sprintf "</PRE>"; $out .= sprintf "</PRE>";
return $out; return $out;
} ## end sub show_config_report
}
sub download_config_report { sub download_config_report {
my $c = shift; my $c = shift;
$c->render_file( $c->render_file(
'filepath' => "$configreportfile", 'filepath' => "$configreportfile",
'format' => 'x-download', 'format' => 'x-download',
'content_disposition' => 'attachment', 'content_disposition' => 'attachment',
'cleanup' => 1, 'cleanup' => 1,
); );
} } ## end sub download_config_report
1; 1;

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -11,16 +11,12 @@ package SrvMngr::Controller::Hostentries;
use strict; use strict;
use warnings; use warnings;
use Mojo::Base 'Mojolicious::Controller'; use Mojo::Base 'Mojolicious::Controller';
use Locale::gettext; use Locale::gettext;
use SrvMngr::I18N; use SrvMngr::I18N;
use SrvMngr qw(theme_list init_session); use SrvMngr qw(theme_list init_session);
#use Data::Dumper; #use Data::Dumper;
#use esmith::FormMagick::Panel::hostentries; #use esmith::FormMagick::Panel::hostentries;
use esmith::DomainsDB; use esmith::DomainsDB;
use esmith::AccountsDB; use esmith::AccountsDB;
use esmith::HostsDB; use esmith::HostsDB;
@ -29,23 +25,18 @@ use HTML::Entities;
use Net::IPv4Addr qw(ipv4_in_network); use Net::IPv4Addr qw(ipv4_in_network);
#use URI::Escape; #use URI::Escape;
our $ddb = esmith::DomainsDB->open || die "Couldn't open hostentries db"; our $ddb = esmith::DomainsDB->open || die "Couldn't open hostentries db";
our $cdb = esmith::ConfigDB->open || die "Couldn't open configuration db"; our $cdb = esmith::ConfigDB->open || die "Couldn't open configuration db";
our $hdb = esmith::HostsDB->open || die "Couldn't open hosts db"; our $hdb = esmith::HostsDB->open || die "Couldn't open hosts db";
our $ndb = esmith::NetworksDB->open || die "Couldn't open networks db"; our $ndb = esmith::NetworksDB->open || die "Couldn't open networks db";
sub main { sub main {
my $c = shift; my $c = shift;
$c->app->log->info($c->log_req); $c->app->log->info($c->log_req);
my %hos_datas = (); my %hos_datas = ();
my $title = $c->l('hos_FORM_TITLE'); my $title = $c->l('hos_FORM_TITLE');
my $notif = ''; my $notif = '';
$hos_datas{trt} = 'LIST'; $hos_datas{trt} = 'LIST';
my %dom_hosts = (); my %dom_hosts = ();
foreach my $d (@{ domains_list() }) { foreach my $d (@{ domains_list() }) {
@ -56,9 +47,8 @@ sub main {
# my @entries; # my @entries;
push @{ $dom_hosts{$d}{'HOSTS'} }, host_data($_) foreach (@hosts); push @{ $dom_hosts{$d}{'HOSTS'} }, host_data($_) foreach (@hosts);
} } ## end if (my @hosts = $hdb->...)
} } ## end foreach my $d (@{ domains_list...})
$c->stash( $c->stash(
title => $title, title => $title,
notif => $notif, notif => $notif,
@ -66,52 +56,42 @@ sub main {
dom_hosts => \%dom_hosts dom_hosts => \%dom_hosts
); );
$c->render(template => 'hostentries'); $c->render(template => 'hostentries');
} ## end sub main
}
sub do_display { sub do_display {
my $c = shift; my $c = shift;
$c->app->log->info($c->log_req); $c->app->log->info($c->log_req);
my $rt = $c->current_route; my $rt = $c->current_route;
my $trt = $c->param('trt') || 'LST'; my $trt = $c->param('trt') || 'LST';
my $hostname = $c->param('Hostname') || ''; my $hostname = $c->param('Hostname') || '';
$trt = 'ADD' if ($rt eq 'hostentryadd'); $trt = 'ADD' if ($rt eq 'hostentryadd');
$trt = 'LST' if ($trt ne 'DEL' && $trt ne 'UPD' && $trt ne 'ADD'); $trt = 'LST' if ($trt ne 'DEL' && $trt ne 'UPD' && $trt ne 'ADD');
my %hos_datas = (); my %hos_datas = ();
my $title = $c->l('hos_FORM_TITLE'); my $title = $c->l('hos_FORM_TITLE');
my $notif = ''; my $notif = '';
$hos_datas{'trt'} = $trt; $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); my $rec = $hdb->get($hostname);
if ($rec) { if ($rec) {
$hos_datas{hostname} = $rec->key; $hos_datas{hostname} = $rec->key;
( $hos_datas{name}, $hos_datas{domain} ) = ($hos_datas{name}, $hos_datas{domain})
split_hostname($hostname); = split_hostname($hostname);
$hos_datas{internalip} = $rec->prop('InternalIP') || ''; $hos_datas{internalip} = $rec->prop('InternalIP') || '';
$hos_datas{externalip} = $rec->prop('ExternalIP') || ''; $hos_datas{externalip} = $rec->prop('ExternalIP') || '';
$hos_datas{macaddress} = $rec->prop('MACAddress') || ''; $hos_datas{macaddress} = $rec->prop('MACAddress') || '';
$hos_datas{hosttype} = $rec->prop('HostType'); $hos_datas{hosttype} = $rec->prop('HostType');
$hos_datas{comment} = $hos_datas{comment} = HTML::Entities::encode($rec->prop('Comment'));
HTML::Entities::encode( $rec->prop('Comment') ); } else {
}
else {
$notif = "Hostname $hostname not found !"; $notif = "Hostname $hostname not found !";
} }
} } ## end if ($trt eq 'UPD' or $trt...)
#if ( $trt eq 'DEL' ) { #if ( $trt eq 'DEL' ) {
# my $rec = $hdb->get($hostname); # my $rec = $hdb->get($hostname);
# if ( $rec ) { # if ( $rec ) {
# get_hos_datas( $rec, %hos_datas ); # get_hos_datas( $rec, %hos_datas );
@ -119,29 +99,21 @@ sub do_display {
# $notif = "Hostname $hostname not found !" # $notif = "Hostname $hostname not found !"
# } # }
#} #}
if ($trt eq 'LIST') { if ($trt eq 'LIST') {
} }
$c->stash(title => $title, notif => $notif, hos_datas => \%hos_datas); $c->stash(title => $title, notif => $notif, hos_datas => \%hos_datas);
$c->render(template => 'hostentries'); $c->render(template => 'hostentries');
} ## end sub do_display
}
sub do_update { sub do_update {
my $c = shift; my $c = shift;
$c->app->log->info($c->log_req); $c->app->log->info($c->log_req);
my $rt = $c->current_route; my $rt = $c->current_route;
my $trt = ($c->param('trt') || 'LIST'); my $trt = ($c->param('trt') || 'LIST');
my %hos_datas = (); my %hos_datas = ();
my $title = $c->l('hos_FORM_TITLE'); my $title = $c->l('hos_FORM_TITLE');
my $notif = ''; my $notif = '';
my $result = ''; my $result = '';
$hos_datas{'name'} = lc $c->param('Name'); $hos_datas{'name'} = lc $c->param('Name');
$hos_datas{'domain'} = lc $c->param('Domain'); $hos_datas{'domain'} = lc $c->param('Domain');
$hos_datas{'hostname'} = $c->param('Hostname'); $hos_datas{'hostname'} = $c->param('Hostname');
@ -151,12 +123,13 @@ sub do_update {
$hos_datas{'macaddress'} = $c->param('Macaddress'); $hos_datas{'macaddress'} = $c->param('Macaddress');
$hos_datas{'externalip'} = $c->param('Externalip'); $hos_datas{'externalip'} = $c->param('Externalip');
my $hostname = "$hos_datas{'name'}.$hos_datas{'domain'}"; my $hostname = "$hos_datas{'name'}.$hos_datas{'domain'}";
if ( $trt eq 'ADD' ) {
if ($trt eq 'ADD') {
$hos_datas{'hostname'} = $hostname; $hos_datas{'hostname'} = $hostname;
# controls # controls
my $res = ''; 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>'; $result .= $c->l('hos_HOSTNAME_VALIDATOR_ERROR') . '<br>';
} }
@ -165,43 +138,41 @@ sub do_update {
|| $hos_datas{comment} eq '') || $hos_datas{comment} eq '')
{ {
$result .= $c->l('hos_HOSTNAME_COMMENT_ERROR') . '<br>'; $result .= $c->l('hos_HOSTNAME_COMMENT_ERROR') . '<br>';
} } ## end unless ($hos_datas{comment...})
# Look for duplicate hosts. # Look for duplicate hosts.
my $hostrec = undef; my $hostrec = undef;
if ($hostrec = $hdb->get($hostname)) { if ($hostrec = $hdb->get($hostname)) {
$result .= $c->l( $result .= $c->l(
'hos_HOSTNAME_EXISTS_ERROR', 'hos_HOSTNAME_EXISTS_ERROR',
{ { fullHostName => $hostname,
fullHostName => $hostname,
type => $hostrec->prop('HostType') type => $hostrec->prop('HostType')
} }
) . '<br>',; ) . '<br>',;
} } ## end if ($hostrec = $hdb->get...)
if (!$result and $hos_datas{hosttype} ne 'Self') { if (!$result and $hos_datas{hosttype} ne 'Self') {
if ($hos_datas{hosttype} eq 'Local') { if ($hos_datas{hosttype} eq 'Local') {
$hos_datas{'trt'} = 'ALC'; # ADD/LOCAL $hos_datas{'trt'} = 'ALC'; # ADD/LOCAL
} } else {
else {
$hos_datas{'trt'} = 'ARM'; # ADD/REMOVE $hos_datas{'trt'} = 'ARM'; # ADD/REMOVE
} }
$c->stash(title => $title, notif => '', hos_datas => \%hos_datas); $c->stash(title => $title, notif => '', hos_datas => \%hos_datas);
return $c->render(template => 'hostentries'); return $c->render(template => 'hostentries');
} } ## end if (!$result and $hos_datas...)
#!#$result .= ' blocked'; #!#$result .= ' blocked';
if (!$result) { if (!$result) {
$res = create_modify_hostentry($c, $trt, %hos_datas); $res = create_modify_hostentry($c, $trt, %hos_datas);
$result .= $res unless $res eq 'OK'; $result .= $res unless $res eq 'OK';
} }
if (!$result) { if (!$result) {
$result = $c->l('hos_CREATE_OR_MODIFY_SUCCEEDED') . ' ' . $hostname; $result = $c->l('hos_CREATE_OR_MODIFY_SUCCEEDED') . ' ' . $hostname;
$trt = 'SUC'; $trt = 'SUC';
} }
} } ## end if ($trt eq 'ADD')
if ($trt eq 'UPD') { if ($trt eq 'UPD') {
@ -210,7 +181,6 @@ sub do_update {
#$res = validate_description( $c, $account ); #$res = validate_description( $c, $account );
#$result .= $res unless $res eq 'OK'; #$result .= $res unless $res eq 'OK';
unless ($hos_datas{comment} =~ /^([a-zA-Z0-9][\_\.\-,A-Za-z0-9\s]*)$/ unless ($hos_datas{comment} =~ /^([a-zA-Z0-9][\_\.\-,A-Za-z0-9\s]*)$/
|| $hos_datas{comment} eq '') || $hos_datas{comment} eq '')
{ {
@ -220,17 +190,14 @@ sub do_update {
if (!$result and $hos_datas{hosttype} ne 'Self') { if (!$result and $hos_datas{hosttype} ne 'Self') {
if ($hos_datas{hosttype} eq 'Local') { if ($hos_datas{hosttype} eq 'Local') {
$hos_datas{'trt'} = 'ULC'; # UPDATE/LOCAL $hos_datas{'trt'} = 'ULC'; # UPDATE/LOCAL
} } else {
else {
$hos_datas{'trt'} = 'URM'; # UPDATE/REMOVE $hos_datas{'trt'} = 'URM'; # UPDATE/REMOVE
} }
$c->stash(title => $title, notif => '', hos_datas => \%hos_datas); $c->stash(title => $title, notif => '', hos_datas => \%hos_datas);
return $c->render(template => 'hostentries'); return $c->render(template => 'hostentries');
} } ## end if (!$result and $hos_datas...)
#!#$result .= 'blocked'; #!#$result .= 'blocked';
if (!$result) { if (!$result) {
$res = create_modify_hostentry($c, $trt, %hos_datas); $res = create_modify_hostentry($c, $trt, %hos_datas);
$result .= $res unless $res eq 'OK'; $result .= $res unless $res eq 'OK';
@ -240,7 +207,7 @@ sub do_update {
$result = $c->l('hos_MODIFY_SUCCEEDED') . ' ' . $hostname; $result = $c->l('hos_MODIFY_SUCCEEDED') . ' ' . $hostname;
$trt = 'SUC'; $trt = 'SUC';
} }
} } ## end if ($trt eq 'UPD')
if ($trt =~ /^.LC$/) { if ($trt =~ /^.LC$/) {
@ -248,21 +215,16 @@ sub do_update {
my $res = ''; my $res = '';
$res = ip_number($c, $hos_datas{internalip}); $res = ip_number($c, $hos_datas{internalip});
$result .= $res . ' ' unless $res eq 'OK'; $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'; $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'; $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'; $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 .= $res . ' ' unless $res eq 'OK';
#!#$result .= 'blocked'; #!#$result .= 'blocked';
if (!$result) { if (!$result) {
$res = create_modify_hostentry($c, $trt, %hos_datas); $res = create_modify_hostentry($c, $trt, %hos_datas);
$result .= $res unless $res eq 'OK'; $result .= $res unless $res eq 'OK';
@ -272,7 +234,7 @@ sub do_update {
$result = $c->l('hos_MODIFY_SUCCEEDED') . ' ' . $hostname; $result = $c->l('hos_MODIFY_SUCCEEDED') . ' ' . $hostname;
$trt = 'SUC'; $trt = 'SUC';
} }
} } ## end if ($trt =~ /^.LC$/)
if ($trt =~ /^.RM$/) { if ($trt =~ /^.RM$/) {
@ -282,7 +244,6 @@ sub do_update {
$result .= $res . '<br>' unless $res eq 'OK'; $result .= $res . '<br>' unless $res eq 'OK';
#!#$result .= 'blocked'; #!#$result .= 'blocked';
if (!$result) { if (!$result) {
$res = create_modify_hostentry($c, $trt, %hos_datas); $res = create_modify_hostentry($c, $trt, %hos_datas);
$result .= $res unless $res eq 'OK'; $result .= $res unless $res eq 'OK';
@ -292,15 +253,12 @@ sub do_update {
$result = $c->l('hos_MODIFY_SUCCEEDED') . ' ' . $hostname; $result = $c->l('hos_MODIFY_SUCCEEDED') . ' ' . $hostname;
$trt = 'SUC'; $trt = 'SUC';
} }
} ## end if ($trt =~ /^.RM$/)
}
#if ( $trt eq 'ULC' ) { #if ( $trt eq 'ULC' ) {
#} #}
#if ( $trt eq 'URM' ) { #if ( $trt eq 'URM' ) {
#} #}
if ($trt eq 'DEL') { if ($trt eq 'DEL') {
# controls # controls
@ -308,41 +266,36 @@ sub do_update {
#$res = validate_is_hostentry($c, $hostname); #$res = validate_is_hostentry($c, $hostname);
#$result .= $res unless $res eq 'OK'; #$result .= $res unless $res eq 'OK';
#!#$result .= 'blocked'; #!#$result .= 'blocked';
if (!$result) { if (!$result) {
my $res = delete_hostentry($c, $hos_datas{hostname}); my $res = delete_hostentry($c, $hos_datas{hostname});
$result .= $res unless $res eq 'OK'; $result .= $res unless $res eq 'OK';
} }
if (!$result) { if (!$result) {
$result = $c->l('hos_REMOVE_SUCCEEDED') . ' ' . $hostname; $result = $c->l('hos_REMOVE_SUCCEEDED') . ' ' . $hostname;
$trt = 'SUC'; $trt = 'SUC';
} }
} } ## end if ($trt eq 'DEL')
$hos_datas{'hostname'} = $hostname; $hos_datas{'hostname'} = $hostname;
$hos_datas{'trt'} = $trt; $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') { if ($hos_datas{trt} ne 'SUC') {
return $c->render(template => 'hostentries'); return $c->render(template => 'hostentries');
} }
$c->redirect_to('/hostentries'); $c->redirect_to('/hostentries');
} ## end sub do_update
}
sub create_modify_hostentry { sub create_modify_hostentry {
my ($c, $trt, %hos_datas) = @_; my ($c, $trt, %hos_datas) = @_;
my $hostname = $hos_datas{hostname}; my $hostname = $hos_datas{hostname};
my $action; 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'; $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'; $action = 'modify';
} }
@ -353,20 +306,20 @@ sub create_modify_hostentry {
? $c->l('hos_ERROR_CREATING_HOST') ? $c->l('hos_ERROR_CREATING_HOST')
: $c->l('hos_ERROR_MODIFYING_HOST') : $c->l('hos_ERROR_MODIFYING_HOST')
); );
} } ## end unless ($hostname)
# Untaint and lowercase $hostname # Untaint and lowercase $hostname
$hostname =~ /([\w\.-]+)/; $hostname =~ /([\w\.-]+)/;
$hostname = lc($1); $hostname = lc($1);
my $rec = $hdb->get($hostname); 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'); 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'); return $c->l('hos_NONEXISTENT_HOSTNAME_ERROR');
} }
my %props = ( my %props = (
type => 'host', type => 'host',
HostType => $hos_datas{hosttype}, HostType => $hos_datas{hosttype},
@ -378,77 +331,60 @@ sub create_modify_hostentry {
if ($action eq 'create') { if ($action eq 'create') {
if ($hdb->new_record($hostname, \%props)) { if ($hdb->new_record($hostname, \%props)) {
if (
system( "/sbin/e-smith/signal-event", "host-$action", if (system("/sbin/e-smith/signal-event", "host-$action", $hostname) != 0) {
$hostname ) != 0
)
{
return $c->l('hos_ERROR_WHILE_CREATING_HOST'); return $c->l('hos_ERROR_WHILE_CREATING_HOST');
} }
} } ## end if ($hdb->new_record($hostname...))
} } ## end if ($action eq 'create')
if ($action eq 'modify') { if ($action eq 'modify') {
if ($rec->merge_props(%props)) { if ($rec->merge_props(%props)) {
if (
system( "/sbin/e-smith/signal-event", "host-$action", if (system("/sbin/e-smith/signal-event", "host-$action", $hostname) != 0) {
$hostname ) != 0
)
{
rturn $c->l('hos_ERROR_WHILE_MODIFYING_HOST'); rturn $c->l('hos_ERROR_WHILE_MODIFYING_HOST');
} }
} } ## end if ($rec->merge_props(...))
} } ## end if ($action eq 'modify')
return 'OK'; return 'OK';
} ## end sub create_modify_hostentry
}
sub delete_hostentry { sub delete_hostentry {
my ($c, $hostname) = @_; my ($c, $hostname) = @_;
# Untaint $hostname before use in system() # Untaint $hostname before use in system()
$hostname =~ /([\w\.-]+)/; $hostname =~ /([\w\.-]+)/;
$hostname = $1; $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); 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 ($rec->delete()) {
if ( if (system("/sbin/e-smith/signal-event", "host-delete", "$hostname") == 0) {
system( "/sbin/e-smith/signal-event", "host-delete", "$hostname" )
== 0 )
{
return 'OK'; return 'OK';
} }
} } ## end if ($rec->delete())
return ($c->l('hos_ERROR_WHILE_DELETING_HOST')); return ($c->l('hos_ERROR_WHILE_DELETING_HOST'));
} } ## end sub delete_hostentry
sub domains_list { sub domains_list {
my $d = esmith::DomainsDB->open_ro() or die "Couldn't open DomainsDB"; my $d = esmith::DomainsDB->open_ro() or die "Couldn't open DomainsDB";
my @domains; my @domains;
for ($d->domains) { for ($d->domains) {
my $ns = $_->prop("Nameservers") || 'localhost'; my $ns = $_->prop("Nameservers") || 'localhost';
push @domains, $_->key if ($ns eq 'localhost'); push @domains, $_->key if ($ns eq 'localhost');
} }
return \@domains; return \@domains;
} } ## end sub domains_list
sub host_data { sub host_data {
my $host_record = shift; my $host_record = shift;
my $ht = $host_record->prop('HostType'); my $ht = $host_record->prop('HostType');
my $ip = my $ip
( $ht eq 'Self' ) ? $cdb->get_value('LocalIP') = ($ht eq 'Self') ? $cdb->get_value('LocalIP')
: ($ht eq 'Remote') ? $host_record->prop('ExternalIP') : ($ht eq 'Remote') ? $host_record->prop('ExternalIP')
: $host_record->prop('InternalIP'); : $host_record->prop('InternalIP');
my %data = ( my %data = (
'IP' => $ip, 'IP' => $ip,
'HostName' => $host_record->key(), 'HostName' => $host_record->key(),
@ -457,19 +393,12 @@ sub host_data {
'Comment' => ($host_record->prop('Comment') || ''), 'Comment' => ($host_record->prop('Comment') || ''),
'static' => ($host_record->prop('static') || 'no') 'static' => ($host_record->prop('static') || 'no')
); );
return \%data return \%data;
} ## end sub host_data
}
sub hosttype_list { sub hosttype_list {
my $c = shift; 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 { sub split_hostname {
@ -481,86 +410,67 @@ sub mac_address_or_blank {
my ($c, $data) = @_; my ($c, $data) = @_;
return "OK" unless $data; return "OK" unless $data;
return mac_address($c, $data); return mac_address($c, $data);
} } ## end sub mac_address_or_blank
sub mac_address { sub mac_address {
# from CGI::FormMagick::Validator::Network # from CGI::FormMagick::Validator::Network
my ($c, $data) = @_; my ($c, $data) = @_;
$_ = lc $data; # easier to match on $_ $_ = lc $data; # easier to match on $_
if (not defined $_) { if (not defined $_) {
return $c->l('FM_MAC_ADDRESS1'); 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"; return "OK";
} } else {
else {
return $c->l('FM_MAC_ADDRESS2'); return $c->l('FM_MAC_ADDRESS2');
} }
} } ## end sub mac_address
sub ip_number_or_blank { sub ip_number_or_blank {
# XXX - FIXME - we should push this down into CGI::FormMagick # XXX - FIXME - we should push this down into CGI::FormMagick
my $c = shift; my $c = shift;
my $ip = shift; my $ip = shift;
if (!defined($ip) || $ip eq "") { if (!defined($ip) || $ip eq "") {
return 'OK'; return 'OK';
} }
return ip_number($c, $ip); return ip_number($c, $ip);
} } ## end sub ip_number_or_blank
sub ip_number { sub ip_number {
# from CGI::FormMagick::Validator qw( ip_number ); # from CGI::FormMagick::Validator qw( ip_number );
my ($c, $data) = @_; my ($c, $data) = @_;
return undef unless defined $data; return undef unless defined $data;
return $c->l('FM_IP_NUMBER1') unless $data =~ /^[\d.]+$/; return $c->l('FM_IP_NUMBER1') unless $data =~ /^[\d.]+$/;
my @octets = split /\./, $data; my @octets = split /\./, $data;
my $dots = ($data =~ tr/.//); my $dots = ($data =~ tr/.//);
return $c->l('FM_IP_NUMBER2') unless (scalar @octets == 4 and $dots == 3); return $c->l('FM_IP_NUMBER2') unless (scalar @octets == 4 and $dots == 3);
foreach my $octet (@octets) { 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'; return 'OK';
} } ## end sub ip_number
sub not_in_dhcp_range { sub not_in_dhcp_range {
my $c = shift; my $c = shift;
my $address = 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"; return 'OK' unless $status eq "enabled";
my $start = $cdb->get('dhcpd')->prop('start'); my $start = $cdb->get('dhcpd')->prop('start');
my $end = $cdb->get('dhcpd')->prop('end'); my $end = $cdb->get('dhcpd')->prop('end');
return ( esmith::util::IPquadToAddr($start) <= esmith::util::IPquadToAddr($address)
return ( esmith::util::IPquadToAddr($start) <= && esmith::util::IPquadToAddr($address) <= esmith::util::IPquadToAddr($end))
esmith::util::IPquadToAddr($address)
&& esmith::util::IPquadToAddr($address) <=
esmith::util::IPquadToAddr($end) )
? $c->l('hos_ADDR_IN_DHCP_RANGE') ? $c->l('hos_ADDR_IN_DHCP_RANGE')
: 'OK'; : 'OK';
} } ## end sub not_in_dhcp_range
sub not_taken { sub not_taken {
my $c = shift; my $c = shift;
my $localip = shift; my $localip = shift;
my $server_localip = $cdb->get_value('LocalIP') || ''; my $server_localip = $cdb->get_value('LocalIP') || '';
my $server_gateway = $cdb->get_value('GatewayIP') || ''; my $server_gateway = $cdb->get_value('GatewayIP') || '';
my $server_extip = $cdb->get_value('ExternalIP') || ''; my $server_extip = $cdb->get_value('ExternalIP') || '';
@ -569,7 +479,6 @@ sub not_taken {
#$c->debug_msg("\$server_localip is $server_localip"); #$c->debug_msg("\$server_localip is $server_localip");
#$c->debug_msg("\$server_gateway is $server_gateway"); #$c->debug_msg("\$server_gateway is $server_gateway");
#$c->debug_msg("\$server_extip is $server_extip"); #$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'); return $c->l('hos_ERR_IP_IS_LOCAL_OR_GATEWAY');
} }
@ -582,18 +491,16 @@ sub not_taken {
&& ($server_extip eq $localip)) && ($server_extip eq $localip))
{ {
return $c->l('hos_ERR_IP_IS_LOCAL_OR_GATEWAY'); 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'); return $c->l('hos_ERR_IP_IS_LOCAL_OR_GATEWAY');
} } else {
else {
return 'OK'; return 'OK';
} }
} } ## end sub not_taken
sub must_be_local { sub must_be_local {
my $c = shift; my $c = shift;
my $localip = shift; my $localip = shift;
@ -603,13 +510,13 @@ sub must_be_local {
foreach my $spec (@local_list) { foreach my $spec (@local_list) {
next if $spec eq '127.0.0.1'; 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'; return 'OK';
} }
} } ## end foreach my $spec (@local_list)
# Not OK. The IP is not on any of our local networks. # Not OK. The IP is not on any of our local networks.
return $c->l('hos_ERR_IP_NOT_LOCAL'); return $c->l('hos_ERR_IP_NOT_LOCAL');
} } ## end sub must_be_local
1; 1;

View File

@ -11,61 +11,46 @@ package SrvMngr::Controller::Ibays;
use strict; use strict;
use warnings; use warnings;
use Mojo::Base 'Mojolicious::Controller'; use Mojo::Base 'Mojolicious::Controller';
use Locale::gettext; use Locale::gettext;
use SrvMngr::I18N; use SrvMngr::I18N;
use SrvMngr qw( theme_list init_session is_normal_password ); use SrvMngr qw( theme_list init_session is_normal_password );
use esmith::AccountsDB; use esmith::AccountsDB;
use esmith::ConfigDB; use esmith::ConfigDB;
use esmith::DomainsDB; use esmith::DomainsDB;
#use esmith::FormMagick::Panel::ibays; #use esmith::FormMagick::Panel::ibays;
our $adb = esmith::AccountsDB->open || die "Couldn't open accounts db"; our $adb = esmith::AccountsDB->open || die "Couldn't open accounts db";
our $cdb = esmith::ConfigDB->open() || die "Couldn't open config db"; our $cdb = esmith::ConfigDB->open() || die "Couldn't open config db";
sub main { sub main {
my $c = shift; my $c = shift;
$c->app->log->info($c->log_req); $c->app->log->info($c->log_req);
my %iba_datas = (); my %iba_datas = ();
my $title = $c->l('iba_FORM_TITLE'); my $title = $c->l('iba_FORM_TITLE');
$iba_datas{'trt'} = 'LIST'; $iba_datas{'trt'} = 'LIST';
my @ibays; my @ibays;
if ($adb)
{ if ($adb) {
@ibays = $adb->ibays(); @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'); $c->render(template => 'ibays');
} ## end sub main
};
sub do_display { sub do_display {
my $c = shift; my $c = shift;
my $rt = $c->current_route; my $rt = $c->current_route;
my $trt = ($c->param('trt') || 'LIST'); my $trt = ($c->param('trt') || 'LIST');
my $ibay = $c->param('ibay') || ''; my $ibay = $c->param('ibay') || '';
#$trt = 'DEL' if ( $ibay ); #$trt = 'DEL' if ( $ibay );
#$trt = 'ADD' if ( $rt eq 'ibayadd' ); #$trt = 'ADD' if ( $rt eq 'ibayadd' );
my %iba_datas = (); my %iba_datas = ();
my $title = $c->l('iba_FORM_TITLE'); my $title = $c->l('iba_FORM_TITLE');
my $modul = ''; my $modul = '';
$iba_datas{'trt'} = $trt; $iba_datas{'trt'} = $trt;
if ($trt eq 'ADD') { if ($trt eq 'ADD') {
$iba_datas{ibay} = ''; $iba_datas{ibay} = '';
$iba_datas{description} = ''; $iba_datas{description} = '';
$iba_datas{group} = ''; $iba_datas{group} = '';
@ -73,12 +58,11 @@ sub do_display {
$iba_datas{publicAccess} = ''; $iba_datas{publicAccess} = '';
$iba_datas{CgiBin} = ''; $iba_datas{CgiBin} = '';
$iba_datas{SSL} = ''; $iba_datas{SSL} = '';
} ## end if ($trt eq 'ADD')
}
if ($trt eq 'UPD') { if ($trt eq 'UPD') {
my $rec = $adb->get($ibay); my $rec = $adb->get($ibay);
if ($rec and $rec->prop('type') eq 'ibay') { if ($rec and $rec->prop('type') eq 'ibay') {
$iba_datas{ibay} = $ibay; $iba_datas{ibay} = $ibay;
$iba_datas{description} = $rec->prop('Name') || ''; $iba_datas{description} = $rec->prop('Name') || '';
@ -87,65 +71,53 @@ sub do_display {
$iba_datas{publicAccess} = $rec->prop('PublicAccess') || ''; $iba_datas{publicAccess} = $rec->prop('PublicAccess') || '';
$iba_datas{CgiBin} = $rec->prop('CgiBin') || 'disabled'; $iba_datas{CgiBin} = $rec->prop('CgiBin') || 'disabled';
$iba_datas{SSL} = $rec->prop('SSL') || 'disabled'; $iba_datas{SSL} = $rec->prop('SSL') || 'disabled';
} } ## end if ($rec and $rec->prop...)
} } ## end if ($trt eq 'UPD')
if ($trt eq 'DEL') { if ($trt eq 'DEL') {
my $rec = $adb->get($ibay); my $rec = $adb->get($ibay);
if ($rec and $rec->prop('type') eq 'ibay') { if ($rec and $rec->prop('type') eq 'ibay') {
$iba_datas{ibay} = $ibay; $iba_datas{ibay} = $ibay;
$iba_datas{description} = $rec->prop('Name') || ''; $iba_datas{description} = $rec->prop('Name') || '';
$modul .= print_vhost_message($c, $ibay); $modul .= print_vhost_message($c, $ibay);
} } ## end if ($rec and $rec->prop...)
} ## end if ($trt eq 'DEL')
}
if ($trt eq 'PWD') { if ($trt eq 'PWD') {
my $rec = $adb->get($ibay); my $rec = $adb->get($ibay);
if ($rec and $rec->prop('type') eq 'ibay') { if ($rec and $rec->prop('type') eq 'ibay') {
$iba_datas{ibay} = $ibay; $iba_datas{ibay} = $ibay;
$iba_datas{description} = $rec->prop('Name') || ''; $iba_datas{description} = $rec->prop('Name') || '';
} }
} ## end if ($trt eq 'PWD')
}
if ($trt eq 'LIST') { if ($trt eq 'LIST') {
my @ibays; my @ibays;
$adb = esmith::AccountsDB->open || die "Couldn't open accounts db"; $adb = esmith::AccountsDB->open || die "Couldn't open accounts db";
if ($adb)
{ if ($adb) {
@ibays = $adb->ibays(); @ibays = $adb->ibays();
} }
$c->stash(ibays => \@ibays); $c->stash(ibays => \@ibays);
} ## end if ($trt eq 'LIST')
}
$c->stash(title => $title, modul => $modul, iba_datas => \%iba_datas); $c->stash(title => $title, modul => $modul, iba_datas => \%iba_datas);
$c->render(template => 'ibays'); $c->render(template => 'ibays');
} ## end sub do_display
};
sub do_update { sub do_update {
my $c = shift; my $c = shift;
$c->app->log->info($c->log_req); $c->app->log->info($c->log_req);
my $rt = $c->current_route; my $rt = $c->current_route;
my $trt = ($c->param('trt') || 'LIST'); my $trt = ($c->param('trt') || 'LIST');
my %iba_datas = (); my %iba_datas = ();
my $title = $c->l('iba_FORM_TITLE'); my $title = $c->l('iba_FORM_TITLE');
$iba_datas{'trt'} = $trt; $iba_datas{'trt'} = $trt;
my $result = ''; my $result = '';
my $res; my $res;
if ($trt eq 'ADD') { if ($trt eq 'ADD') {
my $name = ($c->param('ibay') || ''); my $name = ($c->param('ibay') || '');
# controls # controls
@ -155,15 +127,15 @@ sub do_update {
if (!$result) { if (!$result) {
$res = create_ibay($c, $name); $res = create_ibay($c, $name);
$result .= $res unless $res eq 'OK'; $result .= $res unless $res eq 'OK';
if (!$result) { if (!$result) {
$result = $c->l('iba_SUCCESSFULLY_CREATED_IBAY') . ' ' . $name; $result = $c->l('iba_SUCCESSFULLY_CREATED_IBAY') . ' ' . $name;
$iba_datas{trt} = 'LST'; $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 # controls
@ -172,15 +144,15 @@ sub do_update {
if (!$result) { if (!$result) {
$res = modify_ibay($c, $name); $res = modify_ibay($c, $name);
$result .= $res unless $res eq 'OK'; $result .= $res unless $res eq 'OK';
if (!$result) { if (!$result) {
$result = $c->l('iba_SUCCESSFULLY_MODIFIED_IBAY') . ' ' . $name; $result = $c->l('iba_SUCCESSFULLY_MODIFIED_IBAY') . ' ' . $name;
$iba_datas{trt} = 'LST'; $iba_datas{trt} = 'LST';
} }
} } ## end if (!$result)
} } ## end if ($trt eq 'UPD')
if ($trt eq 'PWD') { if ($trt eq 'PWD') {
my $ibay = ($c->param('ibay') || ''); my $ibay = ($c->param('ibay') || '');
my $pass1 = ($c->param('newPass') || ''); my $pass1 = ($c->param('newPass') || '');
my $pass2 = ($c->param('newPassVerify') || ''); my $pass2 = ($c->param('newPassVerify') || '');
@ -189,22 +161,21 @@ sub do_update {
unless ($pass1 eq $pass2) { unless ($pass1 eq $pass2) {
$result .= $c->l('iba_IBAY_PASSWD_VERIFY_ERROR') . ' - '; $result .= $c->l('iba_IBAY_PASSWD_VERIFY_ERROR') . ' - ';
} }
$res = check_password($c, $pass1); $res = check_password($c, $pass1);
$result .= $res unless $res eq 'OK'; $result .= $res unless $res eq 'OK';
if (!$result) { if (!$result) {
$res = reset_password($c, $ibay, $pass1); $res = reset_password($c, $ibay, $pass1);
$result .= $res unless $res eq 'OK'; $result .= $res unless $res eq 'OK';
if (!$result) { if (!$result) {
$result = $c->l('iba_SUCCESSFULLY_RESET_PASSWORD') . ' ' . $ibay; $result = $c->l('iba_SUCCESSFULLY_RESET_PASSWORD') . ' ' . $ibay;
$iba_datas{trt} = 'LST'; $iba_datas{trt} = 'LST';
} }
} } ## end if (!$result)
} } ## end if ($trt eq 'PWD')
if ($trt eq 'DEL') { if ($trt eq 'DEL') {
my $ibay = $c->param('ibay'); my $ibay = $c->param('ibay');
if ($ibay =~ /^([a-z][a-z0-9]*)$/) { if ($ibay =~ /^([a-z][a-z0-9]*)$/) {
@ -216,63 +187,54 @@ sub do_update {
if (!$result) { if (!$result) {
$res = remove_ibay($c, $ibay); $res = remove_ibay($c, $ibay);
$result .= $res unless $res eq 'OK'; $result .= $res unless $res eq 'OK';
if (!$result) { if (!$result) {
$result = $c->l('iba_SUCCESSFULLY_DELETED_IBAY') . ' ' . $ibay; $result = $c->l('iba_SUCCESSFULLY_DELETED_IBAY') . ' ' . $ibay;
$iba_datas{trt} = 'LST'; $iba_datas{trt} = 'LST';
} }
} } ## end if (!$result)
} } ## end if ($trt eq 'DEL')
# common parts # common parts
if ($res ne 'OK') { if ($res ne 'OK') {
$c->stash(error => $result); $c->stash(error => $result);
$c->stash(title => $title, iba_datas => \%iba_datas); $c->stash(title => $title, iba_datas => \%iba_datas);
return $c->render('ibays'); return $c->render('ibays');
} }
my $message = "'Ibays' updates ($trt) DONE"; my $message = "'Ibays' updates ($trt) DONE";
$c->app->log->info($message); $c->app->log->info($message);
$c->flash(success => $result); $c->flash(success => $result);
$c->redirect_to('/ibays'); $c->redirect_to('/ibays');
}; } ## end sub do_update
sub validate_ibay { sub validate_ibay {
my ($c, $name) = @_; my ($c, $name) = @_;
my $msg = validate_name($c, $name); my $msg = validate_name($c, $name);
unless ($msg eq "OK")
{ unless ($msg eq "OK") {
return ($msg); return ($msg);
} }
$msg = max_ibay_name_length($c, $name); $msg = max_ibay_name_length($c, $name);
unless ($msg eq "OK")
{ unless ($msg eq "OK") {
return ($msg); return ($msg);
} }
$msg = conflict_check($c, $name); $msg = conflict_check($c, $name);
unless ($msg eq "OK")
{ unless ($msg eq "OK") {
return ($msg); return ($msg);
} }
return ('OK'); return ('OK');
} } ## end sub validate_ibay
sub create_ibay { sub create_ibay {
my ($c, $name) = @_; my ($c, $name) = @_;
my $msg; my $msg;
my $uid = $adb->get_next_uid(); my $uid = $adb->get_next_uid();
if (my $acct = $adb->new_record($name, {
Name => $c->param('ibayDesc'), if (my $acct = $adb->new_record(
$name,
{ Name => $c->param('ibayDesc'),
CgiBin => $c->param('CgiBin'), CgiBin => $c->param('CgiBin'),
Group => $c->param('group'), Group => $c->param('group'),
PublicAccess => $c->param('publicAccess'), PublicAccess => $c->param('publicAccess'),
@ -282,10 +244,14 @@ sub create_ibay {
Gid => $uid, Gid => $uid,
PasswordSet => 'no', PasswordSet => 'no',
type => 'ibay', type => 'ibay',
}) ) }
)
)
{ {
# Untaint $name before use in system() # Untaint $name before use in system()
$name =~ /(.+)/; $name = $1; $name =~ /(.+)/;
$name = $1;
if (system("/sbin/e-smith/signal-event", "ibay-create", $name) == 0) { if (system("/sbin/e-smith/signal-event", "ibay-create", $name) == 0) {
$msg = 'OK'; $msg = 'OK';
} else { } else {
@ -295,14 +261,12 @@ sub create_ibay {
$msg = $c->l('iba_CANT_CREATE_IBAY'); $msg = $c->l('iba_CANT_CREATE_IBAY');
} }
return $msg; return $msg;
} ## end sub create_ibay
}
sub modify_ibay { sub modify_ibay {
my ($c, $name) = @_; my ($c, $name) = @_;
my $msg; my $msg;
if (my $acct = $adb->get($name)) { if (my $acct = $adb->get($name)) {
if ($acct->prop('type') eq 'ibay') { if ($acct->prop('type') eq 'ibay') {
$acct->merge_props( $acct->merge_props(
@ -315,10 +279,10 @@ sub modify_ibay {
); );
# Untaint $name before use in system() # Untaint $name before use in system()
$name =~ /(.+)/; $name = $1; $name =~ /(.+)/;
if (system ("/sbin/e-smith/signal-event", "ibay-modify", $name = $1;
$name) == 0)
{ if (system("/sbin/e-smith/signal-event", "ibay-modify", $name) == 0) {
$msg = 'OK'; $msg = 'OK';
} else { } else {
$msg = $c->l('iba_ERROR_WHILE_MODIFYING_IBAY'); $msg = $c->l('iba_ERROR_WHILE_MODIFYING_IBAY');
@ -329,53 +293,47 @@ sub modify_ibay {
} else { } else {
$msg = $c->l('iba_CANT_FIND_IBAY'); $msg = $c->l('iba_CANT_FIND_IBAY');
} }
return $msg; return $msg;
} ## end sub modify_ibay
}
sub print_vhost_message { sub print_vhost_message {
my $c = shift; my $c = shift;
my $name = $c->param('ibay'); my $name = $c->param('ibay');
my $result = ''; my $result = '';
my $domaindb = esmith::DomainsDB->open(); my $domaindb = esmith::DomainsDB->open();
my @domains = $domaindb->get_all_by_prop(Content => $name); my @domains = $domaindb->get_all_by_prop(Content => $name);
my $vhostListItems = join "\n", my $vhostListItems = join "\n", (map ($_->key . " " . $_->prop('Description'), @domains));
(map ($_->key." ".$_->prop('Description'), @domains));
if ($vhostListItems) if ($vhostListItems) {
{
$result = $c->l('iba_VHOST_MESSAGE') . "<br><ul>"; $result = $c->l('iba_VHOST_MESSAGE') . "<br><ul>";
foreach ($vhostListItems) { foreach ($vhostListItems) {
$result .= "<li> $_ </li>"; $result .= "<li> $_ </li>";
} }
$result .= '</ul>' $result .= '</ul>';
} } ## end if ($vhostListItems)
return $result; return $result;
} } ## end sub print_vhost_message
sub remove_ibay { sub remove_ibay {
my ($c, $name) = @_; my ($c, $name) = @_;
my $msg = ''; my $msg = '';
if (my $acct = $adb->get($name)) { if (my $acct = $adb->get($name)) {
if ($acct->prop('type') eq 'ibay') { if ($acct->prop('type') eq 'ibay') {
$acct->set_prop('type', 'ibay-deleted'); $acct->set_prop('type', 'ibay-deleted');
my $domains_db = esmith::DomainsDB->open(); 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) { foreach my $d (@domains) {
$d->set_prop(Content => 'Primary'); $d->set_prop(Content => 'Primary');
} }
# Untaint $name before use in system() # Untaint $name before use in system()
$name =~ /(.+)/; $name = $1; $name =~ /(.+)/;
if (system ("/sbin/e-smith/signal-event", "ibay-delete", $name = $1;
$name) == 0)
{ if (system("/sbin/e-smith/signal-event", "ibay-delete", $name) == 0) {
$msg = 'OK'; $msg = 'OK';
$acct->delete(); $acct->delete();
} else { } else {
@ -384,27 +342,25 @@ sub remove_ibay {
} else { } else {
$msg = $c->l('iba_CANT_FIND_IBAY'); $msg = $c->l('iba_CANT_FIND_IBAY');
} }
} else { } else {
$msg = $c->l('iba_CANT_FIND_IBAY'); $msg = $c->l('iba_CANT_FIND_IBAY');
} }
return $msg; return $msg;
} } ## end sub remove_ibay
sub reset_password { sub reset_password {
my ($c, $name, $newPass) = @_; my ($c, $name, $newPass) = @_;
my ($msg, $acct); my ($msg, $acct);
if (($acct = $adb->get($name)) && ($acct->prop('type') eq 'ibay')) { 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'); $acct->set_prop('PasswordSet', 'yes');
# Untaint $name before use in system() # Untaint $name before use in system()
$name =~ /(.+)/; $name = $1; $name =~ /(.+)/;
if (system ("/sbin/e-smith/signal-event", "password-modify", $name = $1;
$name) == 0)
{ if (system("/sbin/e-smith/signal-event", "password-modify", $name) == 0) {
$msg = 'OK'; $msg = 'OK';
} else { } else {
$msg = $c->l('iba_ERROR_WHILE_RESETTING_PASSWORD'); $msg = $c->l('iba_ERROR_WHILE_RESETTING_PASSWORD');
@ -413,34 +369,25 @@ sub reset_password {
$msg = $c->l('iba_CANT_FIND_IBAY'); $msg = $c->l('iba_CANT_FIND_IBAY');
} }
return $msg; return $msg;
} } ## end sub reset_password
sub check_password { sub check_password {
my ($c, $password) = @_; my ($c, $password) = @_;
my $strength; my $strength;
my $rec = $cdb->get('passwordstrength'); my $rec = $cdb->get('passwordstrength');
$strength = ($rec ? ($rec->prop('Ibays') || 'none') : 'none'); $strength = ($rec ? ($rec->prop('Ibays') || 'none') : 'none');
return validate_password($c, $strength, $password); return validate_password($c, $strength, $password);
} } ## end sub check_password
sub validate_password { sub validate_password {
my ($c, $strength, $pass) = @_; my ($c, $strength, $pass) = @_;
use Crypt::Cracklib; use Crypt::Cracklib;
my $reason; my $reason;
if ($strength eq "none") { if ($strength eq "none") {
return $c->l("Passwords must be at least 7 characters long") unless (length($pass) > 6); return $c->l("Passwords must be at least 7 characters long") unless (length($pass) > 6);
return "OK"; return "OK";
} }
$reason = is_normal_password($c, $pass, undef); $reason = is_normal_password($c, $pass, undef);
return $reason unless ($reason eq "OK"); return $reason unless ($reason eq "OK");
return "OK" unless ($strength eq "strong"); return "OK" unless ($strength eq "strong");
@ -451,14 +398,12 @@ sub validate_password {
$reason = fascist_check($pass, '/usr/lib/cracklib_dict'); $reason = fascist_check($pass, '/usr/lib/cracklib_dict');
} }
$reason ||= "Software error: password check failed"; $reason ||= "Software error: password check failed";
return "OK" if ($reason eq "ok"); return "OK" if ($reason eq "ok");
return
return $c->l("Bad Password Choice") . ": " $c->l("Bad Password Choice") . ": "
. $c->l("The password you have chosen is not a good choice, because") . $c->l("The password you have chosen is not a good choice, because") . " "
. " " . $c->($reason) . "."; . $c->($reason) . ".";
} } ## end sub validate_password
=head2 group_list() =head2 group_list()
@ -468,18 +413,14 @@ drop down list.
=cut =cut
sub group_list_m { sub group_list_m {
my @groups = $adb->groups(); my @groups = $adb->groups();
my @grps = ([ 'Admin' => 'admin' ], [ 'Everyone' => 'shared' ]); my @grps = ([ 'Admin' => 'admin' ], [ 'Everyone' => 'shared' ]);
foreach my $g (@groups) { foreach my $g (@groups) {
push @grps, [ $g->prop('Description') . " (" . $g->key . ")", $g->key() ]; push @grps, [ $g->prop('Description') . " (" . $g->key . ")", $g->key() ];
} }
return \@grps; return \@grps;
} } ## end sub group_list_m
=head2 userAccess_list =head2 userAccess_list
@ -489,13 +430,13 @@ drop down list.
=cut =cut
sub userAccess_list_m { sub userAccess_list_m {
my $c = shift; my $c = shift;
return [[ $c->l('WARG') => 'wr-admin-rd-group'], return [
[ $c->l('WARG') => 'wr-admin-rd-group' ],
[ $c->l('WGRE') => 'wr-group-rd-everyone' ], [ $c->l('WGRE') => 'wr-group-rd-everyone' ],
[ $c->l('WGRG') => 'wr-group-rd-group']]; [ $c->l('WGRG') => 'wr-group-rd-group' ]
];
} } ## end sub userAccess_list_m
=head2 publicAccess_list =head2 publicAccess_list
@ -505,19 +446,18 @@ access drop down list.
=cut =cut
sub publicAccess_list_m { sub publicAccess_list_m {
my $c = shift; my $c = shift;
return [[ $c->l('NONE') => 'none'], return [
[ $c->l('NONE') => 'none' ],
[ $c->l('LOCAL_NETWORK_NO_PASSWORD') => 'local' ], [ $c->l('LOCAL_NETWORK_NO_PASSWORD') => 'local' ],
[ $c->l('LOCAL_NETWORK_PASSWORD') => 'local-pw' ], [ $c->l('LOCAL_NETWORK_PASSWORD') => 'local-pw' ],
[ $c->l('ENTIRE_INTERNET_NO_PASSWORD') => 'global' ], [ $c->l('ENTIRE_INTERNET_NO_PASSWORD') => 'global' ],
[ $c->l('ENTIRE_INTERNET_PASSWORD') => 'global-pw' ], [ $c->l('ENTIRE_INTERNET_PASSWORD') => 'global-pw' ],
[ $c->l('ENTIRE_INTERNET_PASSWORD_REMOTE') => 'global-pw-remote']]; [ $c->l('ENTIRE_INTERNET_PASSWORD_REMOTE') => 'global-pw-remote' ]
} ];
} ## end sub publicAccess_list_m
sub max_ibay_name_length { sub max_ibay_name_length {
my ($c, $data) = @_; my ($c, $data) = @_;
$cdb->reload(); $cdb->reload();
my $max = $cdb->get('maxIbayNameLength')->value; my $max = $cdb->get('maxIbayNameLength')->value;
@ -526,52 +466,42 @@ sub max_ibay_name_length {
return "OK"; return "OK";
} else { } else {
return $c->l('iba_MAX_IBAY_NAME_LENGTH_ERROR', $data, $max, $max); return $c->l('iba_MAX_IBAY_NAME_LENGTH_ERROR', $data, $max, $max);
# {acctName => $data, # {acctName => $data,
# maxIbayNameLength => $max, # maxIbayNameLength => $max,
# maxLength => $max}); # maxLength => $max});
} } ## end else [ if (length($data) <= $max)]
} } ## end sub max_ibay_name_length
sub conflict_check { sub conflict_check {
my ($c, $name) = @_; my ($c, $name) = @_;
my $rec = $adb->get($name); my $rec = $adb->get($name);
my $type; my $type;
if (defined $rec)
{ if (defined $rec) {
my $type = $rec->prop('type'); my $type = $rec->prop('type');
if ($type eq "pseudonym")
{ if ($type eq "pseudonym") {
my $acct = $rec->prop("Account"); my $acct = $rec->prop("Account");
my $acct_type = $adb->get($acct)->prop('type'); my $acct_type = $adb->get($acct)->prop('type');
return $c->l('iba_ACCT_CLASHES_WITH_PSEUDONYM', $name, $acct_type, $acct); return $c->l('iba_ACCT_CLASHES_WITH_PSEUDONYM', $name, $acct_type, $acct);
} } ## end if ($type eq "pseudonym")
} } elsif (defined getpwnam($name) || defined getgrnam($name)) {
elsif (defined getpwnam($name) || defined getgrnam($name))
{
$type = 'system'; $type = 'system';
} } else {
else
{
# No account record and no account # No account record and no account
return 'OK'; return 'OK';
} }
return $c->l('iba_ACCOUNT_EXISTS', $name, $type); return $c->l('iba_ACCOUNT_EXISTS', $name, $type);
} } ## end sub conflict_check
sub validate_name { sub validate_name {
my ($c, $acctName) = @_; 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 $c->l('iba_ACCT_NAME_HAS_INVALID_CHARS', $acctName);
} }
return "OK"; return "OK";
} } ## end sub validate_name
1 1

View File

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

View File

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

View File

@ -12,11 +12,9 @@ use esmith::HostsDB;
use esmith::AccountsDB; use esmith::AccountsDB;
use esmith::NetworksDB; use esmith::NetworksDB;
use esmith::DomainsDB; use esmith::DomainsDB;
use constant FALSE => 0; use constant FALSE => 0;
use constant TRUE => 1; use constant TRUE => 1;
#The most common ones #The most common ones
our $cdb = esmith::ConfigDB->open() || die("Couldn't open config db"); our $cdb = 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");
@ -25,7 +23,6 @@ our $hdb = esmith::HostsDB->open() || die("Couldn't open Hosts db");
our $ddb = esmith::DomainsDB->open() || die("Couldn't open Domains db"); our $ddb = esmith::DomainsDB->open() || die("Couldn't open Domains db");
# Validation routines - parameters for each panel # Validation routines - parameters for each panel
sub validate_LIST { sub validate_LIST {
my $c = shift; my $c = shift;
my $prefix_data = shift; #Data hash as parameter my $prefix_data = shift; #Data hash as parameter
@ -33,45 +30,86 @@ our $ddb = esmith::DomainsDB->open() || die("Couldn't open Domains db");
my $ret = ""; my $ret = "";
if (!TRUE) #validate $c->param('InternalIP') if (!TRUE) #validate $c->param('InternalIP')
{$ret .= 'Validation for InternalIP failed';} {
$ret .= 'Validation for InternalIP failed';
}
if (!TRUE) #validate $c->param('ExternalIP') if (!TRUE) #validate $c->param('ExternalIP')
{$ret .= 'Validation for ExternalIP failed';} {
$ret .= 'Validation for ExternalIP failed';
}
if (!TRUE) #validate $c->param('InternetIP') if (!TRUE) #validate $c->param('InternetIP')
{$ret .= 'Validation for InternetIP failed';} {
$ret .= 'Validation for InternetIP failed';
}
if (!TRUE) #validate $c->param('Issuer') if (!TRUE) #validate $c->param('Issuer')
{$ret .= 'Validation for Issuer failed';} {
$ret .= 'Validation for Issuer failed';
}
if (!TRUE) #validate $c->param('Expiry') if (!TRUE) #validate $c->param('Expiry')
{$ret .= 'Validation for Expiry failed';} {
$ret .= 'Validation for Expiry failed';
}
if (!TRUE) #validate $c->param('NotBefore') if (!TRUE) #validate $c->param('NotBefore')
{$ret .= 'Validation for NotBefore failed';} {
$ret .= 'Validation for NotBefore failed';
}
if ($ret eq "") { $ret = 'ok'; } if ($ret eq "") { $ret = 'ok'; }
return $ret; return $ret;
} } ## end sub validate_LIST
sub validate_PARAMS { sub validate_PARAMS {
my $c = shift; my $c = shift;
my $prefix_data = shift; #Data hash as parameter my $prefix_data = shift; #Data hash as parameter
# Validation for each field # Validation for each field
my $ret = ""; my $ret = "";
if (!TRUE) #validate $c->param('status') if (!TRUE) #validate $c->param('status')
{$ret .= 'Validation for status failed';} {
$ret .= 'Validation for status failed';
}
if (!TRUE) #validate $c->param('hookScript') if (!TRUE) #validate $c->param('hookScript')
{$ret .= 'Validation for hookScript failed';} {
$ret .= 'Validation for hookScript failed';
}
if (!TRUE) #validate $c->param('hostOverride') if (!TRUE) #validate $c->param('hostOverride')
{$ret .= 'Validation for hostOverride failed';} {
$ret .= 'Validation for hostOverride failed';
}
if (!TRUE) #validate $c->param('ACCEPT_TERMS') if (!TRUE) #validate $c->param('ACCEPT_TERMS')
{$ret .= 'Validation for ACCEPT_TERMS failed';} {
$ret .= 'Validation for ACCEPT_TERMS failed';
}
if (!TRUE) #validate $c->param('API') if (!TRUE) #validate $c->param('API')
{$ret .= 'Validation for API failed';} {
$ret .= 'Validation for API failed';
}
if (!TRUE) #validate $c->param('keysize') if (!TRUE) #validate $c->param('keysize')
{$ret .= 'Validation for keysize failed';} {
$ret .= 'Validation for keysize failed';
}
if (!TRUE) #validate $c->param('configure') if (!TRUE) #validate $c->param('configure')
{$ret .= 'Validation for configure failed';} {
$ret .= 'Validation for configure failed';
}
if (!TRUE) #validate $c->param('Email') if (!TRUE) #validate $c->param('Email')
{$ret .= 'Validation for Email failed';} {
$ret .= 'Validation for Email failed';
}
if ($ret eq "") { $ret = 'ok'; } if ($ret eq "") { $ret = 'ok'; }
return $ret; return $ret;
} } ## end sub validate_PARAMS
sub validate_CHECKALLDOMAINS { sub validate_CHECKALLDOMAINS {
my $c = shift; my $c = shift;
@ -80,10 +118,12 @@ our $ddb = esmith::DomainsDB->open() || die("Couldn't open Domains db");
my $ret = ""; my $ret = "";
if (!TRUE) #validate $c->param('AllDomainsCheck') if (!TRUE) #validate $c->param('AllDomainsCheck')
{$ret .= 'Validation for AllDomainsCheck failed';} {
$ret .= 'Validation for AllDomainsCheck failed';
}
if ($ret eq "") { $ret = 'ok'; } if ($ret eq "") { $ret = 'ok'; }
return $ret; return $ret;
} } ## end sub validate_CHECKALLDOMAINS
sub validate_CHECKALLENABLEDDOMAINS { sub validate_CHECKALLENABLEDDOMAINS {
my $c = shift; my $c = shift;
@ -92,10 +132,12 @@ our $ddb = esmith::DomainsDB->open() || die("Couldn't open Domains db");
my $ret = ""; my $ret = "";
if (!TRUE) #validate $c->param('EnabledDomainsCheck') if (!TRUE) #validate $c->param('EnabledDomainsCheck')
{$ret .= 'Validation for EnabledDomainsCheck failed';} {
$ret .= 'Validation for EnabledDomainsCheck failed';
}
if ($ret eq "") { $ret = 'ok'; } if ($ret eq "") { $ret = 'ok'; }
return $ret; return $ret;
} } ## end sub validate_CHECKALLENABLEDDOMAINS
sub validate_CHECKONEDOMAIN { sub validate_CHECKONEDOMAIN {
my $c = shift; my $c = shift;
@ -104,24 +146,28 @@ our $ddb = esmith::DomainsDB->open() || die("Couldn't open Domains db");
my $ret = ""; my $ret = "";
if (!TRUE) #validate $c->param('OneDomainToCheck') if (!TRUE) #validate $c->param('OneDomainToCheck')
{$ret .= 'Validation for OneDomainToCheck failed';} {
if (! TRUE) #validate $c->param('OneDomainsCheck') $ret .= 'Validation for OneDomainToCheck failed';
{$ret .= 'Validation for OneDomainsCheck failed';}
if ($ret eq "") {$ret = 'ok';}
return $ret;
} }
if (!TRUE) #validate $c->param('OneDomainsCheck')
{
$ret .= 'Validation for OneDomainsCheck failed';
}
if ($ret eq "") { $ret = 'ok'; }
return $ret;
} ## end sub validate_CHECKONEDOMAIN
# Get singleton data for each panel # Get singleton data for each panel
sub get_data_for_panel_LIST { sub get_data_for_panel_LIST {
# Return a hash with the fields required which will be loaded into the shared data # Return a hash with the fields required which will be loaded into the shared data
my $c = shift; my $c = shift;
# my ($reply, $err, $server_cert) = Net::SSLeay::sslcat('localhost', 443, '/'); # my ($reply, $err, $server_cert) = Net::SSLeay::sslcat('localhost', 443, '/');
# my $issuer = Net::SSLeay::X509_NAME_oneline(Net::SSLeay::X509_get_issuer_name($server_cert)); # my $issuer = Net::SSLeay::X509_NAME_oneline(Net::SSLeay::X509_get_issuer_name($server_cert));
# my $before = Net::SSLeay::P_ASN1_TIME_get_isotime(Net::SSLeay::X509_get_notBefore($server_cert)); # my $before = Net::SSLeay::P_ASN1_TIME_get_isotime(Net::SSLeay::X509_get_notBefore($server_cert));
# my $expiry = Net::SSLeay::P_ASN1_TIME_get_isotime(Net::SSLeay::X509_get_notAfter($server_cert)); # my $expiry = Net::SSLeay::P_ASN1_TIME_get_isotime(Net::SSLeay::X509_get_notAfter($server_cert));
my %ret = ( my %ret = (
'Data1' => 'Data for LIST', #Example 'Data1' => 'Data for LIST', #Example
# fields from Inputs in LIST $fields['LIST'] # fields from Inputs in LIST $fields['LIST']
@ -133,9 +179,10 @@ our $ddb = esmith::DomainsDB->open() || die("Couldn't open Domains db");
'NotBefore' => '$before', 'NotBefore' => '$before',
); );
return %ret; return %ret;
} } ## end sub get_data_for_panel_LIST
sub get_data_for_panel_PARAMS { sub get_data_for_panel_PARAMS {
# Return a hash with the fields required which will be loaded into the shared data # Return a hash with the fields required which will be loaded into the shared data
my $c = shift; my $c = shift;
my %ret = ( my %ret = (
@ -151,33 +198,34 @@ our $ddb = esmith::DomainsDB->open() || die("Couldn't open Domains db");
'email' => $cdb->get_prop('letsencrypt', 'email') 'email' => $cdb->get_prop('letsencrypt', 'email')
); );
return %ret; return %ret;
} } ## end sub get_data_for_panel_PARAMS
sub get_data_for_panel_CHECKALLDOMAINS { sub get_data_for_panel_CHECKALLDOMAINS {
# Return a hash with the fields required which will be loaded into the shared data # Return a hash with the fields required which will be loaded into the shared data
my $c = shift; my $c = shift;
my %ret = ( my %ret = (
'Data1' => 'Data for CHECKALLDOMAINS', #Example 'Data1' => 'Data for CHECKALLDOMAINS', #Example
# fields from Inputs in CHECKALLDOMAINS $fields['CHECKALLDOMAINS'] # fields from Inputs in CHECKALLDOMAINS $fields['CHECKALLDOMAINS']
'AllDomainsCheck' => $c->update_all_domains(), 'AllDomainsCheck' => $c->update_all_domains(),
); );
return %ret; return %ret;
} } ## end sub get_data_for_panel_CHECKALLDOMAINS
sub get_data_for_panel_CHECKALLENABLEDDOMAINS { sub get_data_for_panel_CHECKALLENABLEDDOMAINS {
# Return a hash with the fields required which will be loaded into the shared data # Return a hash with the fields required which will be loaded into the shared data
my $c = shift; my $c = shift;
my %ret = ( my %ret = (
'Data1' => 'Data for CHECKALLENABLEDDOMAINS', #Example 'Data1' => 'Data for CHECKALLENABLEDDOMAINS', #Example
# fields from Inputs in CHECKALLENABLEDDOMAINS $fields['CHECKALLENABLEDDOMAINS'] # fields from Inputs in CHECKALLENABLEDDOMAINS $fields['CHECKALLENABLEDDOMAINS']
'EnabledDomainsCheck' => $c->update_enabled_domains(), 'EnabledDomainsCheck' => $c->update_enabled_domains(),
); );
return %ret; return %ret;
} } ## end sub get_data_for_panel_CHECKALLENABLEDDOMAINS
sub get_data_for_panel_CHECKONEDOMAIN { sub get_data_for_panel_CHECKONEDOMAIN {
# Return a hash with the fields required which will be loaded into the shared data # Return a hash with the fields required which will be loaded into the shared data
my $c = shift; my $c = shift;
my %ret = ( my %ret = (
@ -187,12 +235,9 @@ our $ddb = esmith::DomainsDB->open() || die("Couldn't open Domains db");
'OneDomainsCheck' => $c->update_one_domain($c->param("CHECKONEDOMAIN")) 'OneDomainsCheck' => $c->update_one_domain($c->param("CHECKONEDOMAIN"))
); );
return %ret; return %ret;
} } ## end sub get_data_for_panel_CHECKONEDOMAIN
# Get control data for table(s) # Get control data for table(s)
# Define a constant hash for field name mapping # Define a constant hash for field name mapping
use constant DomainList_FIELD_MAPPING => ( use constant DomainList_FIELD_MAPPING => (
'Table1-Domain name / HOSTNAME' => 'Domain', 'Table1-Domain name / HOSTNAME' => 'Domain',
@ -203,22 +248,24 @@ our $ddb = esmith::DomainsDB->open() || die("Couldn't open Domains db");
'Table1-LABEL_LECERT' => 'letsencryptSSLcert', 'Table1-LABEL_LECERT' => 'letsencryptSSLcert',
'Table1-IS_IN_CERT' => 'isincert', 'Table1-IS_IN_CERT' => 'isincert',
'Table1-CHECK' => 'Check' 'Table1-CHECK' => 'Check'
#'target_field2' => 'source_field2', #'target_field2' => 'source_field2',
# Add more mappings as needed # Add more mappings as needed
); );
use constant TEST_DOMAIN_LIST => ( use constant TEST_DOMAIN_LIST => (
{ "domain" => "Domain1", "fred" => "fred1", "description" => "Description1" }, { "domain" => "Domain1", "fred" => "fred1", "description" => "Description1" },
{ "domain" => "Domain2", "fred" => "fred2", "description" => "Description2" }, { "domain" => "Domain2", "fred" => "fred2", "description" => "Description2" },
{ "domain" => "Domain3", "fred" => "fred3", "description" => "Description3" }, { "domain" => "Domain3", "fred" => "fred3", "description" => "Description3" },
# Add more test entries as needed # Add more test entries as needed
); );
sub actual_DomainList { sub actual_DomainList {
my $c = shift; my $c = shift;
# Actual code for extracting DomainList # Actual code for extracting DomainList
my @list = (); my @list = ();
# my @rv = Net::SSLeay::X509_get_subjectAltNames($server_cert); # my @rv = Net::SSLeay::X509_get_subjectAltNames($server_cert);
# foreach my $element (@rv) { # foreach my $element (@rv) {
# next if $element =~ /^\d+$/; ; # next if $element =~ /^\d+$/; ;
@ -227,81 +274,88 @@ sub actual_DomainList {
# } # }
my @data = (); my @data = ();
my $check = $c->l('Check Domain'); my $check = $c->l('Check Domain');
for ($ddb->domains)
{ for ($ddb->domains) {
my $ns = $_->prop('Nameservers') || 'internet'; my $ns = $_->prop('Nameservers') || 'internet';
my $le = $_->prop('letsencryptSSLcert') || 'disabled'; #letsencrypt configure all my $le = $_->prop('letsencryptSSLcert') || 'disabled'; #letsencrypt configure all
my $dname = $_->key; my $dname = $_->key;
my $isincert = "N"; my $isincert = "N";
my $link = $c->create_link("letsencryptd", "CHECKONEDOMAIN", ""); my $link = $c->create_link("letsencryptd", "CHECKONEDOMAIN", "");
my $checklink = "<a href='" . $link . "&CHECKONEDOMAIN=" . $_->key . "'>" . $check . "</a>"; my $checklink = "<a href='" . $link . "&CHECKONEDOMAIN=" . $_->key . "'>" . $check . "</a>";
#my $checklink = "<a href=''>check</a>"; #my $checklink = "<a href=''>check</a>";
$isincert = "Y" if ($dname ~~ @list); $isincert = "Y" if ($dname ~~ @list);
# domain # domain
push @data, push @data,
{ Domain => $_->key, {
Domain => $_->key,
$_->props, $_->props,
letsencryptSSLcert => $le, letsencryptSSLcert => $le,
isincert => $isincert, isincert => $isincert,
Check => $checklink, Check => $checklink,
Nameservers => $ns, Nameservers => $ns,
}; };
#and hosts #and hosts
for my $h ($hdb->get_hosts_by_domain($dname)) for my $h ($hdb->get_hosts_by_domain($dname)) {
{
next if $ddb->get($h->key); next if $ddb->get($h->key);
next unless ($h->prop('HostType') eq "Self" || $h->prop('HostType') eq "Local"); next unless ($h->prop('HostType') eq "Self" || $h->prop('HostType') eq "Local");
$le = $h->prop('letsencryptSSLcert') || 'disabled'; #letsencrypt configure all $le = $h->prop('letsencryptSSLcert') || 'disabled'; #letsencrypt configure all
$isincert = "N"; $isincert = "N";
$isincert = "Y" if ($h->key ~~ @list); $isincert = "Y" if ($h->key ~~ @list);
push @data, push @data, {
{ Domain => "--> ". $h->key, Domain => "--> " . $h->key,
$h->props, $h->props,
Description => $h->prop('ExternalIP') || $h->prop('InternalIP') || "", Description => $h->prop('ExternalIP') || $h->prop('InternalIP') || "",
Content => $h->prop('HostType'), Content => $h->prop('HostType'),
isincert => $isincert, isincert => $isincert,
Check => "", #$checklink Check => "", #$checklink
Nameservers => $c->l($ns), Nameservers => $c->l($ns),
} };
} } ## end for my $h ($hdb->get_hosts_by_domain...)
} } ## end for ($ddb->domains)
return @data; return @data;
} } ## end sub actual_DomainList
sub get_DomainList { sub get_DomainList {
# Return an array of hashes of the contents for each row and column for DomainList # Return an array of hashes of the contents for each row and column for DomainList
my $c = shift; my $c = shift;
my @source_records = $c->actual_DomainList(); #TEST_DOMAIN_LIST #Replace by code or call to produce contents of table; my @source_records
= $c->actual_DomainList(); #TEST_DOMAIN_LIST #Replace by code or call to produce contents of table;
my @transformed_records; my @transformed_records;
my %Field_Mapping = DomainList_FIELD_MAPPING; my %Field_Mapping = DomainList_FIELD_MAPPING;
# Iterate over each record in the source array # Iterate over each record in the source array
for my $source_record (@source_records) { for my $source_record (@source_records) {
my %transformed_record; my %transformed_record;
# Iterate over each key-value pair in the $Field_Mapping constant # Iterate over each key-value pair in the $Field_Mapping constant
while (my ($target, $source) = each %Field_Mapping) { while (my ($target, $source) = each %Field_Mapping) {
# Check if the source field exists in the source record # Check if the source field exists in the source record
if (exists $source_record->{$source}) { if (exists $source_record->{$source}) {
# Assign the source field value to the target field in the transformed record # Assign the source field value to the target field in the transformed record
$transformed_record{$target} = $source_record->{$source}; $transformed_record{$target} = $source_record->{$source};
} }
} } ## end while (my ($target, $source...))
# Add transformed record to the array if it's not empty # Add transformed record to the array if it's not empty
push @transformed_records, \%transformed_record if %transformed_record; push @transformed_records, \%transformed_record if %transformed_record;
} } ## end for my $source_record (...)
return \@transformed_records; return \@transformed_records;
} } ## end sub get_DomainList
# Return hash with values from row in which link clicked on table # Return hash with values from row in which link clicked on table
sub get_selected_LIST { sub get_selected_LIST {
my $c = shift; my $c = shift;
my $selected = shift; #Parameter is name of selected row. my $selected = shift; #Parameter is name of selected row.
my $is_new_record = shift; #Indicates new record required (defaults) my $is_new_record = shift; #Indicates new record required (defaults)
my %ret = {}; my %ret = {};
return $ret; return $ret;
} } ## end sub get_selected_LIST
sub get_selected_PARAMS { sub get_selected_PARAMS {
my $c = shift; my $c = shift;
@ -309,7 +363,7 @@ sub get_DomainList {
my $is_new_record = shift; #Indicates new record required (defaults) my $is_new_record = shift; #Indicates new record required (defaults)
my %ret = {}; my %ret = {};
return $ret; return $ret;
} } ## end sub get_selected_PARAMS
sub get_selected_CHECKALLDOMAINS { sub get_selected_CHECKALLDOMAINS {
my $c = shift; my $c = shift;
@ -317,7 +371,7 @@ sub get_DomainList {
my $is_new_record = shift; #Indicates new record required (defaults) my $is_new_record = shift; #Indicates new record required (defaults)
my %ret = {}; my %ret = {};
return $ret; return $ret;
} } ## end sub get_selected_CHECKALLDOMAINS
sub get_selected_CHECKALLENABLEDDOMAINS { sub get_selected_CHECKALLENABLEDDOMAINS {
my $c = shift; my $c = shift;
@ -325,7 +379,7 @@ sub get_DomainList {
my $is_new_record = shift; #Indicates new record required (defaults) my $is_new_record = shift; #Indicates new record required (defaults)
my %ret = {}; my %ret = {};
return $ret; return $ret;
} } ## end sub get_selected_CHECKALLENABLEDDOMAINS
sub get_selected_CHECKONEDOMAIN { sub get_selected_CHECKONEDOMAIN {
my $c = shift; my $c = shift;
@ -333,11 +387,9 @@ sub get_DomainList {
my $is_new_record = shift; #Indicates new record required (defaults) my $is_new_record = shift; #Indicates new record required (defaults)
my %ret = {}; my %ret = {};
return $ret; return $ret;
} } ## end sub get_selected_CHECKONEDOMAIN
#after sucessful modify or create or whatever and submit then perfom (if the params validate) #after sucessful modify or create or whatever and submit then perfom (if the params validate)
sub perform_LIST { sub perform_LIST {
my $c = shift; my $c = shift;
my $prefix_data = shift; #Data hash as parameter my $prefix_data = shift; #Data hash as parameter
@ -345,21 +397,44 @@ sub get_DomainList {
my $db = $cdb; #maybe one of the others my $db = $cdb; #maybe one of the others
my $dbkey = 'ChangeThis'; my $dbkey = 'ChangeThis';
if (! TRUE) #copy or perform with value: InternalIP e.g. $db->set_prop($dbkey,'InternalIP',$c->param('InternalIP'),type=>'service')) if (!TRUE
{$ret .= 'Perform/save failed for InternalIP';} ) #copy or perform with value: InternalIP e.g. $db->set_prop($dbkey,'InternalIP',$c->param('InternalIP'),type=>'service'))
if (! TRUE) #copy or perform with value: ExternalIP e.g. $db->set_prop($dbkey,'ExternalIP',$c->param('ExternalIP'),type=>'service')) {
{$ret .= 'Perform/save failed for ExternalIP';} $ret .= 'Perform/save failed for InternalIP';
if (! TRUE) #copy or perform with value: InternetIP e.g. $db->set_prop($dbkey,'InternetIP',$c->param('InternetIP'),type=>'service')) } ## end if (!TRUE)
{$ret .= 'Perform/save failed for InternetIP';}
if (! TRUE) #copy or perform with value: Issuer e.g. $db->set_prop($dbkey,'Issuer',$c->param('Issuer'),type=>'service')) if (!TRUE
{$ret .= 'Perform/save failed for Issuer';} ) #copy or perform with value: ExternalIP e.g. $db->set_prop($dbkey,'ExternalIP',$c->param('ExternalIP'),type=>'service'))
if (! TRUE) #copy or perform with value: Expiry e.g. $db->set_prop($dbkey,'Expiry',$c->param('Expiry'),type=>'service')) {
{$ret .= 'Perform/save failed for Expiry';} $ret .= 'Perform/save failed for ExternalIP';
if (! TRUE) #copy or perform with value: NotBefore e.g. $db->set_prop($dbkey,'NotBefore',$c->param('NotBefore'),type=>'service')) } ## end if (!TRUE)
{$ret .= 'Perform/save failed for NotBefore';}
if (!TRUE
) #copy or perform with value: InternetIP e.g. $db->set_prop($dbkey,'InternetIP',$c->param('InternetIP'),type=>'service'))
{
$ret .= 'Perform/save failed for InternetIP';
} ## end if (!TRUE)
if (!TRUE
) #copy or perform with value: Issuer e.g. $db->set_prop($dbkey,'Issuer',$c->param('Issuer'),type=>'service'))
{
$ret .= 'Perform/save failed for Issuer';
} ## end if (!TRUE)
if (!TRUE
) #copy or perform with value: Expiry e.g. $db->set_prop($dbkey,'Expiry',$c->param('Expiry'),type=>'service'))
{
$ret .= 'Perform/save failed for Expiry';
} ## end if (!TRUE)
if (!TRUE
) #copy or perform with value: NotBefore e.g. $db->set_prop($dbkey,'NotBefore',$c->param('NotBefore'),type=>'service'))
{
$ret .= 'Perform/save failed for NotBefore';
} ## end if (!TRUE)
if ($ret eq "") { $ret = 'ok'; } if ($ret eq "") { $ret = 'ok'; }
return $ret; return $ret;
} } ## end sub perform_LIST
sub perform_PARAMS { sub perform_PARAMS {
my $c = shift; my $c = shift;
@ -367,27 +442,39 @@ sub get_DomainList {
my $ret = ""; my $ret = "";
my $db = $cdb; #maybe one of the others my $db = $cdb; #maybe one of the others
my $dbkey = 'letsencrypt'; my $dbkey = 'letsencrypt';
# To make it write to DB as comment, delete this (regex) string in each if statement "TRUE\) \#copy or perform with value: .* e.g."
if (! $db->set_prop($dbkey,'status',$c->param('status'),type=>'service')) # To make it write to DB as comment, delete this (regex) string in each if statement "TRUE\) \#copy or perform with value: .* e.g."
{$ret .= 'Perform/save failed for status';} if (!$db->set_prop($dbkey, 'status', $c->param('status'), type => 'service')) {
if (! $db->set_prop($dbkey,'hookScript',$c->param('hookScript'),type=>'service')) $ret .= 'Perform/save failed for status';
{$ret .= 'Perform/save failed for hookScript';} }
if (! $db->set_prop($dbkey,'hostOverride',$c->param('hostOverride'),type=>'service'))
{$ret .= 'Perform/save failed for hostOverride';} if (!$db->set_prop($dbkey, 'hookScript', $c->param('hookScript'), type => 'service')) {
if (! $db->set_prop($dbkey,'ACCEPT_TERMS',$c->param('ACCEPT_TERMS'),type=>'service')) $ret .= 'Perform/save failed for hookScript';
{$ret .= 'Perform/save failed for ACCEPT_TERMS';} }
if (! $db->set_prop($dbkey,'API',$c->param('API'),type=>'service'))
{$ret .= 'Perform/save failed for API';} if (!$db->set_prop($dbkey, 'hostOverride', $c->param('hostOverride'), type => 'service')) {
if (! $db->set_prop($dbkey,'keysize',$c->param('keysize'),type=>'service')) $ret .= 'Perform/save failed for hostOverride';
{$ret .= 'Perform/save failed for keysize';} }
if (! $db->set_prop($dbkey,'configure',$c->param('configure'),type=>'service'))
{$ret .= 'Perform/save failed for configure';} if (!$db->set_prop($dbkey, 'ACCEPT_TERMS', $c->param('ACCEPT_TERMS'), type => 'service')) {
if (! $db->set_prop($dbkey,'email',$c->param('email'),type=>'service')) $ret .= 'Perform/save failed for ACCEPT_TERMS';
{$ret .= 'Perform/save failed for email';} }
if (!$db->set_prop($dbkey, 'API', $c->param('API'), type => 'service')) { $ret .= 'Perform/save failed for API'; }
if (!$db->set_prop($dbkey, 'keysize', $c->param('keysize'), type => 'service')) {
$ret .= 'Perform/save failed for keysize';
}
if (!$db->set_prop($dbkey, 'configure', $c->param('configure'), type => 'service')) {
$ret .= 'Perform/save failed for configure';
}
if (!$db->set_prop($dbkey, 'email', $c->param('email'), type => 'service')) {
$ret .= 'Perform/save failed for email';
}
if ($ret eq "") { $ret = 'ok'; } if ($ret eq "") { $ret = 'ok'; }
return $ret; return $ret;
} } ## end sub perform_PARAMS
sub perform_CHECKALLDOMAINS { sub perform_CHECKALLDOMAINS {
my $c = shift; my $c = shift;
@ -396,11 +483,14 @@ sub get_DomainList {
my $db = $cdb; #maybe one of the others my $db = $cdb; #maybe one of the others
my $dbkey = 'ChangeThis'; my $dbkey = 'ChangeThis';
if (! TRUE) #copy or perform with value: AllDomainsCheck e.g. $db->set_prop($dbkey,'AllDomainsCheck',$c->param('AllDomainsCheck'),type=>'service')) if (!TRUE
{$ret .= 'Perform/save failed for AllDomainsCheck';} ) #copy or perform with value: AllDomainsCheck e.g. $db->set_prop($dbkey,'AllDomainsCheck',$c->param('AllDomainsCheck'),type=>'service'))
{
$ret .= 'Perform/save failed for AllDomainsCheck';
} ## end if (!TRUE)
if ($ret eq "") { $ret = 'ok'; } if ($ret eq "") { $ret = 'ok'; }
return $ret; return $ret;
} } ## end sub perform_CHECKALLDOMAINS
sub perform_CHECKALLENABLEDDOMAINS { sub perform_CHECKALLENABLEDDOMAINS {
my $c = shift; my $c = shift;
@ -409,11 +499,14 @@ sub get_DomainList {
my $db = $cdb; #maybe one of the others my $db = $cdb; #maybe one of the others
my $dbkey = 'ChangeThis'; my $dbkey = 'ChangeThis';
if (! TRUE) #copy or perform with value: EnabledDomainsCheck e.g. $db->set_prop($dbkey,'EnabledDomainsCheck',$c->param('EnabledDomainsCheck'),type=>'service')) if (!TRUE
{$ret .= 'Perform/save failed for EnabledDomainsCheck';} ) #copy or perform with value: EnabledDomainsCheck e.g. $db->set_prop($dbkey,'EnabledDomainsCheck',$c->param('EnabledDomainsCheck'),type=>'service'))
{
$ret .= 'Perform/save failed for EnabledDomainsCheck';
} ## end if (!TRUE)
if ($ret eq "") { $ret = 'ok'; } if ($ret eq "") { $ret = 'ok'; }
return $ret; return $ret;
} } ## end sub perform_CHECKALLENABLEDDOMAINS
sub perform_CHECKONEDOMAIN { sub perform_CHECKONEDOMAIN {
my $c = shift; my $c = shift;
@ -422,51 +515,52 @@ sub get_DomainList {
my $db = $cdb; #maybe one of the others my $db = $cdb; #maybe one of the others
my $dbkey = 'ChangeThis'; my $dbkey = 'ChangeThis';
if (! TRUE) #copy or perform with value: OneDomainToCheck e.g. $db->set_prop($dbkey,'OneDomainToCheck',$c->param('OneDomainToCheck'),type=>'service')) if (!TRUE
{$ret .= 'Perform/save failed for OneDomainToCheck';} ) #copy or perform with value: OneDomainToCheck e.g. $db->set_prop($dbkey,'OneDomainToCheck',$c->param('OneDomainToCheck'),type=>'service'))
if (! TRUE) #copy or perform with value: OneDomainsCheck e.g. $db->set_prop($dbkey,'OneDomainsCheck',$c->param('OneDomainsCheck'),type=>'service')) {
{$ret .= 'Perform/save failed for OneDomainsCheck';} $ret .= 'Perform/save failed for OneDomainToCheck';
} ## end if (!TRUE)
if (!TRUE
) #copy or perform with value: OneDomainsCheck e.g. $db->set_prop($dbkey,'OneDomainsCheck',$c->param('OneDomainsCheck'),type=>'service'))
{
$ret .= 'Perform/save failed for OneDomainsCheck';
} ## end if (!TRUE)
if ($ret eq "") { $ret = 'ok'; } if ($ret eq "") { $ret = 'ok'; }
return $ret; return $ret;
} } ## end sub perform_CHECKONEDOMAIN
sub create_link { sub create_link {
# WIP # WIP
my ($c, $route, $panel, $index) = @_; my ($c, $route, $panel, $index) = @_;
my $link = "$route?trt=$panel&Selected=$index"; my $link = "$route?trt=$panel&Selected=$index";
return $link; return $link;
} } ## end sub create_link
sub get_my_ip sub get_my_ip {
{
my ($self, $item, $prop, $default) = @_; my ($self, $item, $prop, $default) = @_;
my $output = `/usr/sbin/e-smith/getmyip`; my $output = `/usr/sbin/e-smith/getmyip`;
return $output || "IP"; return $output || "IP";
} } ## end sub get_my_ip
sub update_one_domain sub update_one_domain {
{
my ($self, $domain) = @_; my ($self, $domain) = @_;
return "$domain not domain" unless ($ddb->get($domain) || $hdb->get($domain)); return "$domain not domain" unless ($ddb->get($domain) || $hdb->get($domain));
($domain) = ($domain =~ /([\w\p{L}.]+)/); ($domain) = ($domain =~ /([\w\p{L}.]+)/);
my $output = `/etc/e-smith/events/actions/letsencrypt-setdomains " " $domain `; my $output = `/etc/e-smith/events/actions/letsencrypt-setdomains " " $domain `;
return $output || "-empty-"; return $output || "-empty-";
} } ## end sub update_one_domain
sub update_all_domains sub update_all_domains {
{
my $self = shift; my $self = shift;
my $output = `/etc/e-smith/events/actions/letsencrypt-setdomains "" "" all `; my $output = `/etc/e-smith/events/actions/letsencrypt-setdomains "" "" all `;
return $output || "-empty-"; return $output || "-empty-";
} } ## end sub update_all_domains
sub update_enabled_domains sub update_enabled_domains {
{
my $self = shift; my $self = shift;
my $output = `/etc/e-smith/events/actions/letsencrypt-setdomains "" "" enabled `; my $output = `/etc/e-smith/events/actions/letsencrypt-setdomains "" "" enabled `;
return $output || "-empty-"; return $output || "-empty-";
} } ## end sub update_enabled_domains
1; 1;

View File

@ -15,25 +15,19 @@ package SrvMngr::Controller::Letsencrypt;
# #
# Documentation: https://wiki.contribs.org/Letsencrypt # Documentation: https://wiki.contribs.org/Letsencrypt
#---------------------------------------------------------------------- #----------------------------------------------------------------------
# #
# Scheme of things: # Scheme of things:
# #
# TBA!! # TBA!!
use strict; use strict;
use warnings; use warnings;
use Mojo::Base 'Mojolicious::Controller'; use Mojo::Base 'Mojolicious::Controller';
use constant FALSE => 0; use constant FALSE => 0;
use constant TRUE => 1; use constant TRUE => 1;
use Locale::gettext; use Locale::gettext;
use SrvMngr::I18N; use SrvMngr::I18N;
use SrvMngr qw(theme_list init_session); use SrvMngr qw(theme_list init_session);
use Data::Dumper; use Data::Dumper;
use esmith::util; use esmith::util;
use esmith::util::network; use esmith::util::network;
use esmith::ConfigDB; use esmith::ConfigDB;
@ -41,10 +35,8 @@ use esmith::AccountsDB;
use esmith::NetworksDB; use esmith::NetworksDB;
use esmith::HostsDB; use esmith::HostsDB;
use esmith::DomainsDB; use esmith::DomainsDB;
require
'/usr/share/smanager/lib/SrvMngr/Controller/Letsencrypt-Custom.pm'; #The code that is to be added by the developer
require '/usr/share/smanager/lib/SrvMngr/Controller/Letsencrypt-Custom.pm'; #The code that is to be added by the developer
sub main { sub main {
# #
@ -57,7 +49,6 @@ sub main {
#load up stash with pointer(s) to control fields hash(= get-)) #load up stash with pointer(s) to control fields hash(= get-))
#and a pointer to the prefix_data hash #and a pointer to the prefix_data hash
#render initial panel #render initial panel
my $c = shift; my $c = shift;
$c->app->log->info($c->log_req); $c->app->log->info($c->log_req);
@ -67,21 +58,16 @@ sub main {
my $ndb = esmith::NetworksDB->open() || die("Couldn't open Network db"); my $ndb = esmith::NetworksDB->open() || die("Couldn't open Network db");
my $hdb = esmith::HostsDB->open() || die("Couldn't open Hosts db"); my $hdb = esmith::HostsDB->open() || die("Couldn't open Hosts db");
my $ddb = esmith::DomainsDB->open() || die("Couldn't open Domains db"); my $ddb = esmith::DomainsDB->open() || die("Couldn't open Domains db");
my %lets_data = (); my %lets_data = ();
my $title = $c->l('lets_Letsencrypt_certificate'); my $title = $c->l('lets_Letsencrypt_certificate');
my $modul = ''; my $modul = '';
$lets_data{'trt'} = 'LIST'; $lets_data{'trt'} = 'LIST';
#Load any DB entries into the <prefix>_data area so as they are preset in the form #Load any DB entries into the <prefix>_data area so as they are preset in the form
# which DB - this only really works if the initial panel is a PARAMS type panel and not a TABLE # which DB - this only really works if the initial panel is a PARAMS type panel and not a TABLE
my $db = $cdb; #pickup local or global db or Default to config my $db = $cdb; #pickup local or global db or Default to config
$c->do_display($lets_data{'trt'}); $c->do_display($lets_data{'trt'});
} ## end sub main
}
# Post request with params - submit from the form # Post request with params - submit from the form
sub do_update { sub do_update {
@ -92,7 +78,6 @@ sub do_update {
#load up all params into prefix_data hash: #load up all params into prefix_data hash:
#By panel (series of if statements - only one executed): #By panel (series of if statements - only one executed):
#call validate-PANEL() - return ret = ok or error message #call validate-PANEL() - return ret = ok or error message
#if validation not ok: #if validation not ok:
#render back to current panel with error message in stash #render back to current panel with error message in stash
#otherwise: #otherwise:
@ -108,7 +93,6 @@ sub do_update {
#else #else
#set nextpanel #set nextpanel
#call render #call render
my $c = shift; my $c = shift;
$c->app->log->info($c->log_req); $c->app->log->info($c->log_req);
my $modul = ''; my $modul = '';
@ -119,7 +103,6 @@ sub do_update {
my $ndb = esmith::NetworksDB->open() || die("Couldn't open Network db"); my $ndb = esmith::NetworksDB->open() || die("Couldn't open Network db");
my $hdb = esmith::HostsDB->open() || die("Couldn't open Hosts db"); my $hdb = esmith::HostsDB->open() || die("Couldn't open Hosts db");
my $ddb = esmith::DomainsDB->open() || die("Couldn't open Domains db"); my $ddb = esmith::DomainsDB->open() || die("Couldn't open Domains db");
my %lets_data = (); my %lets_data = ();
my $title = $c->l('lets_Letsencrypt_certificate'); my $title = $c->l('lets_Letsencrypt_certificate');
@ -133,7 +116,6 @@ sub do_update {
#while (my ($key, $value) = each %{$c->req->params->to_hash}) { #while (my ($key, $value) = each %{$c->req->params->to_hash}) {
# $lets_data{$key} = $value; # $lets_data{$key} = $value;
#} #}
# the value of trt will tell you which panel has returned # the value of trt will tell you which panel has returned
my $trt = $c->param('trt') || 'LIST'; #hidden control on every form. my $trt = $c->param('trt') || 'LIST'; #hidden control on every form.
my $ret = 'ok'; my $ret = 'ok';
@ -142,45 +124,52 @@ sub do_update {
my $thispanel; my $thispanel;
if ($trt eq 'LIST') { if ($trt eq 'LIST') {
#Validate form parameters for panel LIST #Validate form parameters for panel LIST
$ret = $c->validate_LIST(\%lets_data); $ret = $c->validate_LIST(\%lets_data);
$thispanel = 'LIST'; $thispanel = 'LIST';
} } ## end if ($trt eq 'LIST')
if ($trt eq 'PARAMS') { if ($trt eq 'PARAMS') {
#Validate form parameters for panel PARAMS #Validate form parameters for panel PARAMS
$ret = $c->validate_PARAMS(\%lets_data); $ret = $c->validate_PARAMS(\%lets_data);
$thispanel = 'PARAMS'; $thispanel = 'PARAMS';
} } ## end if ($trt eq 'PARAMS')
if ($trt eq 'CHECKALLDOMAINS') { if ($trt eq 'CHECKALLDOMAINS') {
#Validate form parameters for panel CHECKALLDOMAINS #Validate form parameters for panel CHECKALLDOMAINS
$ret = $c->validate_CHECKALLDOMAINS(\%lets_data); $ret = $c->validate_CHECKALLDOMAINS(\%lets_data);
$thispanel = 'CHECKALLDOMAINS'; $thispanel = 'CHECKALLDOMAINS';
} } ## end if ($trt eq 'CHECKALLDOMAINS')
if ($trt eq 'CHECKALLENABLEDDOMAINS') { if ($trt eq 'CHECKALLENABLEDDOMAINS') {
#Validate form parameters for panel CHECKALLENABLEDDOMAINS #Validate form parameters for panel CHECKALLENABLEDDOMAINS
$ret = $c->validate_CHECKALLENABLEDDOMAINS(\%lets_data); $ret = $c->validate_CHECKALLENABLEDDOMAINS(\%lets_data);
$thispanel = 'CHECKALLENABLEDDOMAINS'; $thispanel = 'CHECKALLENABLEDDOMAINS';
} } ## end if ($trt eq 'CHECKALLENABLEDDOMAINS')
if ($trt eq 'CHECKONEDOMAIN') { if ($trt eq 'CHECKONEDOMAIN') {
#Validate form parameters for panel CHECKONEDOMAIN #Validate form parameters for panel CHECKONEDOMAIN
$ret = $c->validate_CHECKONEDOMAIN(\%lets_data); $ret = $c->validate_CHECKONEDOMAIN(\%lets_data);
$thispanel = 'CHECKONEDOMAIN'; $thispanel = 'CHECKONEDOMAIN';
} } ## end if ($trt eq 'CHECKONEDOMAIN')
if ($ret ne "ok") { if ($ret ne "ok") {
$c->do_display($thispanel); $c->do_display($thispanel);
} else { } else {
#Do whatever is needed, including writing values to the DB #Do whatever is needed, including writing values to the DB
if ($trt eq 'LIST') { if ($trt eq 'LIST') {
#do whatever is required ... #do whatever is required ...
$ret = $c->perform_LIST(\%lets_data); $ret = $c->perform_LIST(\%lets_data);
if ($ret ne "ok") { if ($ret ne "ok") {
# return to the panel with error message # return to the panel with error message
$c->stash(error => $c->l($ret)); $c->stash(error => $c->l($ret));
$c->stash( $c->stash(
@ -190,14 +179,18 @@ sub do_update {
); );
$c->render(template => "letsencrypt"); $c->render(template => "letsencrypt");
} else { } else {
$c->stash( success => $c->l('lets_LIST_panel_action_was_successful')); #A bit bland - edit it in the lex file $c->stash(success => $c->l('lets_LIST_panel_action_was_successful'))
} ; #A bit bland - edit it in the lex file
} }
} ## end if ($trt eq 'LIST')
if ($trt eq 'PARAMS') { if ($trt eq 'PARAMS') {
#do whatever is required ... #do whatever is required ...
$ret = $c->perform_PARAMS(\%lets_data); $ret = $c->perform_PARAMS(\%lets_data);
if ($ret ne "ok") { if ($ret ne "ok") {
# return to the panel with error message # return to the panel with error message
$c->stash(error => $c->l($ret)); $c->stash(error => $c->l($ret));
$c->stash( $c->stash(
@ -207,14 +200,18 @@ sub do_update {
); );
$c->render(template => "letsencrypt"); $c->render(template => "letsencrypt");
} else { } else {
$c->stash( success => $c->l('lets_PARAMS_panel_action_was_successful')); #A bit bland - edit it in the lex file $c->stash(success => $c->l('lets_PARAMS_panel_action_was_successful'))
} ; #A bit bland - edit it in the lex file
} }
} ## end if ($trt eq 'PARAMS')
if ($trt eq 'CHECKALLDOMAINS') { if ($trt eq 'CHECKALLDOMAINS') {
#do whatever is required ... #do whatever is required ...
$ret = $c->perform_CHECKALLDOMAINS(\%lets_data); $ret = $c->perform_CHECKALLDOMAINS(\%lets_data);
if ($ret ne "ok") { if ($ret ne "ok") {
# return to the panel with error message # return to the panel with error message
$c->stash(error => $c->l($ret)); $c->stash(error => $c->l($ret));
$c->stash( $c->stash(
@ -224,14 +221,18 @@ sub do_update {
); );
$c->render(template => "letsencrypt"); $c->render(template => "letsencrypt");
} else { } else {
$c->stash( success => $c->l('lets_CHECKALLDOMAINS_panel_action_was_successful')); #A bit bland - edit it in the lex file $c->stash(success => $c->l('lets_CHECKALLDOMAINS_panel_action_was_successful'))
} ; #A bit bland - edit it in the lex file
} }
} ## end if ($trt eq 'CHECKALLDOMAINS')
if ($trt eq 'CHECKALLENABLEDDOMAINS') { if ($trt eq 'CHECKALLENABLEDDOMAINS') {
#do whatever is required ... #do whatever is required ...
$ret = $c->perform_CHECKALLENABLEDDOMAINS(\%lets_data); $ret = $c->perform_CHECKALLENABLEDDOMAINS(\%lets_data);
if ($ret ne "ok") { if ($ret ne "ok") {
# return to the panel with error message # return to the panel with error message
$c->stash(error => $c->l($ret)); $c->stash(error => $c->l($ret));
$c->stash( $c->stash(
@ -241,14 +242,18 @@ sub do_update {
); );
$c->render(template => "letsencrypt"); $c->render(template => "letsencrypt");
} else { } else {
$c->stash( success => $c->l('lets_CHECKALLENABLEDDOMAINS_panel_action_was_successful')); #A bit bland - edit it in the lex file $c->stash(success => $c->l('lets_CHECKALLENABLEDDOMAINS_panel_action_was_successful'))
} ; #A bit bland - edit it in the lex file
} }
} ## end if ($trt eq 'CHECKALLENABLEDDOMAINS')
if ($trt eq 'CHECKONEDOMAIN') { if ($trt eq 'CHECKONEDOMAIN') {
#do whatever is required ... #do whatever is required ...
$ret = $c->perform_CHECKONEDOMAIN(\%lets_data); $ret = $c->perform_CHECKONEDOMAIN(\%lets_data);
if ($ret ne "ok") { if ($ret ne "ok") {
# return to the panel with error message # return to the panel with error message
$c->stash(error => $c->l($ret)); $c->stash(error => $c->l($ret));
$c->stash( $c->stash(
@ -258,9 +263,10 @@ sub do_update {
); );
$c->render(template => "letsencrypt"); $c->render(template => "letsencrypt");
} else { } else {
$c->stash( success => $c->l('lets_CHECKONEDOMAIN_panel_action_was_successful')); #A bit bland - edit it in the lex file $c->stash(success => $c->l('lets_CHECKONEDOMAIN_panel_action_was_successful'))
} ; #A bit bland - edit it in the lex file
} }
} ## end if ($trt eq 'CHECKONEDOMAIN')
# and call any signal-events needed # and call any signal-events needed
#TBD #TBD
@ -271,8 +277,8 @@ sub do_update {
$lets_data{'trt'} = 'none'; $lets_data{'trt'} = 'none';
} }
$c->do_display($lets_data{'trt'}); $c->do_display($lets_data{'trt'});
} } ## end else [ if ($ret ne "ok") ]
} } ## end sub do_update
sub do_display { sub do_display {
# #
@ -285,7 +291,6 @@ sub do_display {
#call get-selected-PANEL() - returns hash of all relevent parameters #call get-selected-PANEL() - returns hash of all relevent parameters
#load up returned hash into prefix_data #load up returned hash into prefix_data
#render - to called panel #render - to called panel
my ($c, $trt) = @_; my ($c, $trt) = @_;
$c->app->log->info($c->log_req); $c->app->log->info($c->log_req);
@ -295,7 +300,6 @@ sub do_display {
my $ndb = esmith::NetworksDB->open() || die("Couldn't open Network db"); my $ndb = esmith::NetworksDB->open() || die("Couldn't open Network db");
my $hdb = esmith::HostsDB->open() || die("Couldn't open Hosts db"); my $hdb = esmith::HostsDB->open() || die("Couldn't open Hosts db");
my $ddb = esmith::DomainsDB->open() || die("Couldn't open Domains db"); my $ddb = esmith::DomainsDB->open() || die("Couldn't open Domains db");
my %lets_data = (); my %lets_data = ();
my $title = $c->l('lets_Letsencrypt_certificate'); my $title = $c->l('lets_Letsencrypt_certificate');
my $modul = ""; my $modul = "";
@ -313,111 +317,126 @@ sub do_display {
#while (my ($key, $value) = each %{$c->req->params->to_hash}) { #while (my ($key, $value) = each %{$c->req->params->to_hash}) {
# $lets_data{$key} = $value; # $lets_data{$key} = $value;
#} #}
# the value of trt will tell you which panel has returned # the value of trt will tell you which panel has returned
if (!$trt) { if (!$trt) {
$trt = $c->param('trt') || 'LIST'; #Indicates where to go now $trt = $c->param('trt') || 'LIST'; #Indicates where to go now
} }
# Now add in the params from the selected row from the table # Now add in the params from the selected row from the table
my %selectedrow; my %selectedrow;
if ($trt eq 'LIST') { if ($trt eq 'LIST') {
#Validate Get selected row (if applicable) LIST #Validate Get selected row (if applicable) LIST
%selectedrow = $c->get_selected_LIST($lets_data{'Selected'}, $is_new_record); %selectedrow = $c->get_selected_LIST($lets_data{'Selected'}, $is_new_record);
} } ## end if ($trt eq 'LIST')
if ($trt eq 'PARAMS') { if ($trt eq 'PARAMS') {
#Validate Get selected row (if applicable) PARAMS #Validate Get selected row (if applicable) PARAMS
%selectedrow = $c->get_selected_PARAMS($lets_data{'Selected'}, $is_new_record); %selectedrow = $c->get_selected_PARAMS($lets_data{'Selected'}, $is_new_record);
} } ## end if ($trt eq 'PARAMS')
if ($trt eq 'CHECKALLDOMAINS') { if ($trt eq 'CHECKALLDOMAINS') {
#Validate Get selected row (if applicable) CHECKALLDOMAINS #Validate Get selected row (if applicable) CHECKALLDOMAINS
%selectedrow = $c->get_selected_CHECKALLDOMAINS($lets_data{'Selected'}, $is_new_record); %selectedrow = $c->get_selected_CHECKALLDOMAINS($lets_data{'Selected'}, $is_new_record);
} } ## end if ($trt eq 'CHECKALLDOMAINS')
if ($trt eq 'CHECKALLENABLEDDOMAINS') { if ($trt eq 'CHECKALLENABLEDDOMAINS') {
#Validate Get selected row (if applicable) CHECKALLENABLEDDOMAINS #Validate Get selected row (if applicable) CHECKALLENABLEDDOMAINS
%selectedrow = $c->get_selected_CHECKALLENABLEDDOMAINS($lets_data{'Selected'}, $is_new_record); %selectedrow = $c->get_selected_CHECKALLENABLEDDOMAINS($lets_data{'Selected'}, $is_new_record);
} } ## end if ($trt eq 'CHECKALLENABLEDDOMAINS')
if ($trt eq 'CHECKONEDOMAIN') { if ($trt eq 'CHECKONEDOMAIN') {
#Validate Get selected row (if applicable) CHECKONEDOMAIN #Validate Get selected row (if applicable) CHECKONEDOMAIN
%selectedrow = $c->get_selected_CHECKONEDOMAIN($lets_data{'Selected'}, $is_new_record); %selectedrow = $c->get_selected_CHECKONEDOMAIN($lets_data{'Selected'}, $is_new_record);
} } ## end if ($trt eq 'CHECKONEDOMAIN')
#Copy in the selected row params to the prefix_data hash to pass to the panel #Copy in the selected row params to the prefix_data hash to pass to the panel
while (my ($key, $value) = each %selectedrow) { while (my ($key, $value) = each %selectedrow) {
$lets_data{$key} = $value; $lets_data{$key} = $value;
} }
# Where to go now # Where to go now
$lets_data{'trt'} = $trt; $lets_data{'trt'} = $trt;
# Set up other shared data according to the panel to go to # Set up other shared data according to the panel to go to
if ($trt eq 'LIST') { if ($trt eq 'LIST') {
# pickup any other contents needed and load them into hash shared with panel # pickup any other contents needed and load them into hash shared with panel
my %returned_hash; my %returned_hash;
# subroutine returns a hash directly # subroutine returns a hash directly
%returned_hash = $c->get_data_for_panel_LIST(); %returned_hash = $c->get_data_for_panel_LIST();
# Copy each key-value pair from the returned hash to the prefix data hash # Copy each key-value pair from the returned hash to the prefix data hash
while (my ($key, $value) = each %returned_hash) { while (my ($key, $value) = each %returned_hash) {
$lets_data{$key} = $value; $lets_data{$key} = $value;
} }
} } ## end if ($trt eq 'LIST')
if ($trt eq 'PARAMS') { if ($trt eq 'PARAMS') {
# pickup any other contents needed and load them into hash shared with panel # pickup any other contents needed and load them into hash shared with panel
my %returned_hash; my %returned_hash;
# subroutine returns a hash directly # subroutine returns a hash directly
%returned_hash = $c->get_data_for_panel_PARAMS(); %returned_hash = $c->get_data_for_panel_PARAMS();
# Copy each key-value pair from the returned hash to the prefix data hash # Copy each key-value pair from the returned hash to the prefix data hash
while (my ($key, $value) = each %returned_hash) { while (my ($key, $value) = each %returned_hash) {
$lets_data{$key} = $value; $lets_data{$key} = $value;
} }
} } ## end if ($trt eq 'PARAMS')
if ($trt eq 'CHECKALLDOMAINS') { if ($trt eq 'CHECKALLDOMAINS') {
# pickup any other contents needed and load them into hash shared with panel # pickup any other contents needed and load them into hash shared with panel
my %returned_hash; my %returned_hash;
# subroutine returns a hash directly # subroutine returns a hash directly
%returned_hash = $c->get_data_for_panel_CHECKALLDOMAINS(); %returned_hash = $c->get_data_for_panel_CHECKALLDOMAINS();
# Copy each key-value pair from the returned hash to the prefix data hash # Copy each key-value pair from the returned hash to the prefix data hash
while (my ($key, $value) = each %returned_hash) { while (my ($key, $value) = each %returned_hash) {
$lets_data{$key} = $value; $lets_data{$key} = $value;
} }
} } ## end if ($trt eq 'CHECKALLDOMAINS')
if ($trt eq 'CHECKALLENABLEDDOMAINS') { if ($trt eq 'CHECKALLENABLEDDOMAINS') {
# pickup any other contents needed and load them into hash shared with panel # pickup any other contents needed and load them into hash shared with panel
my %returned_hash; my %returned_hash;
# subroutine returns a hash directly # subroutine returns a hash directly
%returned_hash = $c->get_data_for_panel_CHECKALLENABLEDDOMAINS(); %returned_hash = $c->get_data_for_panel_CHECKALLENABLEDDOMAINS();
# Copy each key-value pair from the returned hash to the prefix data hash # Copy each key-value pair from the returned hash to the prefix data hash
while (my ($key, $value) = each %returned_hash) { while (my ($key, $value) = each %returned_hash) {
$lets_data{$key} = $value; $lets_data{$key} = $value;
} }
} } ## end if ($trt eq 'CHECKALLENABLEDDOMAINS')
if ($trt eq 'CHECKONEDOMAIN') { if ($trt eq 'CHECKONEDOMAIN') {
# pickup any other contents needed and load them into hash shared with panel # pickup any other contents needed and load them into hash shared with panel
my %returned_hash; my %returned_hash;
# subroutine returns a hash directly # subroutine returns a hash directly
%returned_hash = $c->get_data_for_panel_CHECKONEDOMAIN(); %returned_hash = $c->get_data_for_panel_CHECKONEDOMAIN();
# Copy each key-value pair from the returned hash to the prefix data hash # Copy each key-value pair from the returned hash to the prefix data hash
while (my ($key, $value) = each %returned_hash) { while (my ($key, $value) = each %returned_hash) {
$lets_data{$key} = $value; $lets_data{$key} = $value;
} }
} } ## end if ($trt eq 'CHECKONEDOMAIN')
# and table control fields # and table control fields
$c->stash(DomainList => $c->get_DomainList()); $c->stash(DomainList => $c->get_DomainList());
# Data for panel # Data for panel
$c->stash( $c->stash(
title => $title, title => $title,
@ -425,5 +444,5 @@ sub do_display {
lets_data => \%lets_data lets_data => \%lets_data
); );
$c->render(template => "letsencrypt"); $c->render(template => "letsencrypt");
} } ## end sub do_display
1; 1;

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -11,65 +11,50 @@ package SrvMngr::Controller::Proxy;
use strict; use strict;
use warnings; use warnings;
use Mojo::Base 'Mojolicious::Controller'; use Mojo::Base 'Mojolicious::Controller';
use Locale::gettext; use Locale::gettext;
use SrvMngr::I18N; use SrvMngr::I18N;
use SrvMngr qw(theme_list init_session); use SrvMngr qw(theme_list init_session);
our $db = esmith::ConfigDB->open || die "Couldn't open config db"; our $db = esmith::ConfigDB->open || die "Couldn't open config db";
sub main { sub main {
my $c = shift; my $c = shift;
$c->app->log->info($c->log_req); $c->app->log->info($c->log_req);
my %prx_datas = (); my %prx_datas = ();
my $title = $c->l('prx_TITLE'); my $title = $c->l('prx_TITLE');
my $modul = $c->render_to_string(inline => $c->l('prx_FIRST_PAGE_DESCRIPTION')); my $modul = $c->render_to_string(inline => $c->l('prx_FIRST_PAGE_DESCRIPTION'));
$prx_datas{'http_proxy_status'} = ($db->get_prop('squid', 'status')) || 'disabled'; $prx_datas{'http_proxy_status'} = ($db->get_prop('squid', 'status')) || 'disabled';
#if (system('/bin/rpm -q e-smith-email > /dev/null') == 0) #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) ? #(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'); $c->render(template => 'proxy');
}; } ## end sub main
sub do_update { sub do_update {
my $c = shift; my $c = shift;
$c->app->log->info($c->log_req); $c->app->log->info($c->log_req);
my $http_proxy_status = $c->param('http_proxy_status') || 'disabled'; my $http_proxy_status = $c->param('http_proxy_status') || 'disabled';
my $smtp_proxy_status = $c->param('smtp_proxy_status') || ''; 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'); 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 # smtpd is allowed to not exist, as the relevant packages may not be
# installed. # installed.
my $smtpd = $db->get('qpsmtpd') || undef; my $smtpd = $db->get('qpsmtpd') || undef;
$squid->set_prop('status', $http_proxy_status); $squid->set_prop('status', $http_proxy_status);
$smtpd->set_prop('Proxy', $smtp_proxy_status) if $smtpd; $smtpd->set_prop('Proxy', $smtp_proxy_status) if $smtpd;
# #
# Update the system # Update the system
# #
system("/sbin/e-smith/signal-event proxy-update") == 0 system("/sbin/e-smith/signal-event proxy-update") == 0
or $result = $c->l('prx_ERR_PROXY_UPDATE_FAILED'); or $result = $c->l('prx_ERR_PROXY_UPDATE_FAILED');
my $title = $c->l('prx_TITLE'); my $title = $c->l('prx_TITLE');
if ($result eq '') { $result = $c->l('prx_SUCCESS'); } if ($result eq '') { $result = $c->l('prx_SUCCESS'); }
$c->stash(title => $title, modul => $result); $c->stash(title => $title, modul => $result);
$c->render(template => 'module'); $c->render(template => 'module');
}; } ## end sub do_update
1; 1;

View File

@ -11,112 +11,89 @@ package SrvMngr::Controller::Pseudonyms;
use strict; use strict;
use warnings; use warnings;
use Mojo::Base 'Mojolicious::Controller'; use Mojo::Base 'Mojolicious::Controller';
use Locale::gettext; use Locale::gettext;
use SrvMngr::I18N; use SrvMngr::I18N;
use SrvMngr qw(theme_list init_session); use SrvMngr qw(theme_list init_session);
#use Data::Dumper; #use Data::Dumper;
#use esmith::FormMagick::Panel::pseudonyms; #use esmith::FormMagick::Panel::pseudonyms;
use esmith::AccountsDB; use esmith::AccountsDB;
#use URI::Escape; #use URI::Escape;
our $cdb = esmith::ConfigDB->open || die "Couldn't open configuration db"; our $cdb = esmith::ConfigDB->open || die "Couldn't open configuration db";
our $adb = esmith::AccountsDB->open || die "Couldn't open accounts db"; our $adb = esmith::AccountsDB->open || die "Couldn't open accounts db";
sub main { sub main {
my $c = shift; my $c = shift;
$c->app->log->info($c->log_req); $c->app->log->info($c->log_req);
my %pse_datas = (); my %pse_datas = ();
my $title = $c->l('pse_FORM_TITLE'); my $title = $c->l('pse_FORM_TITLE');
my $notif = ''; my $notif = '';
$pse_datas{trt} = 'LST'; $pse_datas{trt} = 'LST';
my @pseudonyms; my @pseudonyms;
if ($adb)
{ if ($adb) {
@pseudonyms = $adb->pseudonyms(); @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'); $c->render(template => 'pseudonyms');
} ## end sub main
};
sub do_display { sub do_display {
my $c = shift; my $c = shift;
$c->app->log->info($c->log_req); $c->app->log->info($c->log_req);
my $rt = $c->current_route; my $rt = $c->current_route;
my $trt = ($c->param('trt') || 'LST'); my $trt = ($c->param('trt') || 'LST');
my $pseudonym = $c->param('pseudonym') || ''; my $pseudonym = $c->param('pseudonym') || '';
my $title = $c->l('pse_FORM_TITLE'); my $title = $c->l('pse_FORM_TITLE');
my %pse_datas = (); my %pse_datas = ();
$pse_datas{'trt'} = $trt; $pse_datas{'trt'} = $trt;
if ($trt eq 'ADD') { if ($trt eq 'ADD') {
#nothing #nothing
} }
if ($trt eq 'UPD') { if ($trt eq 'UPD') {
my $rec = $adb->get($pseudonym); my $rec = $adb->get($pseudonym);
if ($rec and $rec->prop('type') eq 'pseudonym') {
if ($rec and $rec->prop('type') eq 'pseudonym') {
$pse_datas{pseudonym} = $pseudonym; $pse_datas{pseudonym} = $pseudonym;
$pse_datas{account} = $rec->prop('Account') || ''; $pse_datas{account} = $rec->prop('Account') || '';
$pse_datas{internal} = is_pseudonym_internal($pseudonym); $pse_datas{internal} = is_pseudonym_internal($pseudonym);
} } ## end if ($rec and $rec->prop...)
} } ## end if ($trt eq 'UPD')
if ($trt eq 'DEL') { if ($trt eq 'DEL') {
my $rec = $adb->get($pseudonym); my $rec = $adb->get($pseudonym);
if ($rec and $rec->prop('type') eq 'pseudonym') {
if ($rec and $rec->prop('type') eq 'pseudonym') {
$pse_datas{pseudonym} = $pseudonym; $pse_datas{pseudonym} = $pseudonym;
$pse_datas{account} = $rec->prop('Account') || ''; $pse_datas{account} = $rec->prop('Account') || '';
$pse_datas{internal} = is_pseudonym_internal($pseudonym); $pse_datas{internal} = is_pseudonym_internal($pseudonym);
} ## end if ($rec and $rec->prop...)
} } ## end if ($trt eq 'DEL')
}
if ($trt eq 'LST') { if ($trt eq 'LST') {
my @pseudonyms; my @pseudonyms;
if ($adb) { if ($adb) {
@pseudonyms = $adb->pseudonyms(); @pseudonyms = $adb->pseudonyms();
} }
$c->stash(pseudonyms => \@pseudonyms); $c->stash(pseudonyms => \@pseudonyms);
} ## end if ($trt eq 'LST')
}
$c->stash(title => $title, pse_datas => \%pse_datas); $c->stash(title => $title, pse_datas => \%pse_datas);
$c->render(template => 'pseudonyms'); $c->render(template => 'pseudonyms');
} ## end sub do_display
};
sub do_update { sub do_update {
my $c = shift; my $c = shift;
$c->app->log->info($c->log_req); $c->app->log->info($c->log_req);
my $rt = $c->current_route; my $rt = $c->current_route;
my $trt = ($c->param('trt') || 'LST'); my $trt = ($c->param('trt') || 'LST');
my $title = $c->l('pse_FORM_TITLE'); my $title = $c->l('pse_FORM_TITLE');
my %pse_datas = (); my %pse_datas = ();
$pse_datas{'trt'} = $trt; $pse_datas{'trt'} = $trt;
my ($res, $result) = ''; my ($res, $result) = '';
#my $pseudonym = uri_unescape($c->param('Pseudonym')); #my $pseudonym = uri_unescape($c->param('Pseudonym'));
@ -124,7 +101,6 @@ sub do_update {
$pse_datas{'pseudonym'} = $pseudonym; $pse_datas{'pseudonym'} = $pseudonym;
if ($trt eq 'ADD') { if ($trt eq 'ADD') {
my $account = $c->param('Account'); my $account = $c->param('Account');
# controls # controls
@ -132,29 +108,32 @@ sub do_update {
$result .= $res unless $res eq 'OK'; $result .= $res unless $res eq 'OK';
#$result .= ' blocked'; #$result .= ' blocked';
$res = ''; $res = '';
if (!$result) { if (!$result) {
$adb->new_record( $pseudonym, { type => 'pseudonym', $adb->new_record(
Account => $account} ) $pseudonym,
or $result .= "Error occurred while creating pseudonym in database."; { type => 'pseudonym',
Account => $account
}
) or $result .= "Error occurred while creating pseudonym in database.";
# Untaint $pseudonym before use in system() # Untaint $pseudonym before use in system()
($pseudonym) = ($pseudonym =~ /(.+)/); ($pseudonym) = ($pseudonym =~ /(.+)/);
system( "/sbin/e-smith/signal-event", "pseudonym-create", "$pseudonym",) system("/sbin/e-smith/signal-event", "pseudonym-create", "$pseudonym",) == 0
== 0 or $result .= 'pse_CREATE_ERROR.'; or $result .= 'pse_CREATE_ERROR.';
} } ## end if (!$result)
if (!$result) { if (!$result) {
$res = 'OK'; $res = 'OK';
$result = $c->l('pse_CREATE_SUCCEEDED') . ' ' . $pseudonym; $result = $c->l('pse_CREATE_SUCCEEDED') . ' ' . $pseudonym;
} }
} } ## end if ($trt eq 'ADD')
if ($trt eq 'UPD') { if ($trt eq 'UPD') {
my $account = $c->param('Account'); my $account = $c->param('Account');
my $internal = $c->param('Internal') || 'NO'; my $internal = $c->param('Internal') || 'NO';
my $removable = $adb->get($pseudonym)->prop('Removable') || 'yes'; my $removable = $adb->get($pseudonym)->prop('Removable') || 'yes';
my %props = ('Account' => $account); my %props = ('Account' => $account);
if ($removable eq 'yes') { if ($removable eq 'yes') {
@ -166,23 +145,24 @@ sub do_update {
#$res = ''; #$res = '';
#$res = validate_description( $c, $account ); #$res = validate_description( $c, $account );
#$result .= $res unless $res eq 'OK'; #$result .= $res unless $res eq 'OK';
#$result .= 'blocked'; #$result .= 'blocked';
$res = ''; $res = '';
if (!$result) { if (!$result) {
$adb->get($pseudonym)->merge_props(%props) $adb->get($pseudonym)->merge_props(%props)
or $result .= "Error occurred while modifying pseudonym in database."; or $result .= "Error occurred while modifying pseudonym in database.";
# Untaint $pseudonym before use in system() # Untaint $pseudonym before use in system()
($pseudonym) = ($pseudonym =~ /(.+)/); ($pseudonym) = ($pseudonym =~ /(.+)/);
system( "/sbin/e-smith/signal-event", "pseudonym-modify", "$pseudonym",) system("/sbin/e-smith/signal-event", "pseudonym-modify", "$pseudonym",) == 0
== 0 or $result .= "Error occurred while modifying pseudonym."; or $result .= "Error occurred while modifying pseudonym.";
} } ## end if (!$result)
if (!$result) { if (!$result) {
$res = 'OK'; $res = 'OK';
$result = $c->l('pse_MODIFY_SUCCEEDED') . ' ' . $pseudonym; $result = $c->l('pse_MODIFY_SUCCEEDED') . ' ' . $pseudonym;
} }
} } ## end if ($trt eq 'UPD')
if ($trt eq 'DEL') { if ($trt eq 'DEL') {
@ -192,45 +172,39 @@ sub do_update {
$result .= $res unless $res eq 'OK'; $result .= $res unless $res eq 'OK';
#$result .= 'blocked'; #$result .= 'blocked';
$res = ''; $res = '';
if (!$result) { if (!$result) {
$res = $c->delete_pseudonym($pseudonym); $res = $c->delete_pseudonym($pseudonym);
$result .= $res unless $res eq 'OK'; $result .= $res unless $res eq 'OK';
if (!$result) { if (!$result) {
$res = 'OK'; $res = 'OK';
$result = $c->l('pse_REMOVE_SUCCEEDED') . ' ' . $pseudonym; $result = $c->l('pse_REMOVE_SUCCEEDED') . ' ' . $pseudonym;
} }
} } ## end if (!$result)
} } ## end if ($trt eq 'DEL')
# common parts # common parts
if ($res ne 'OK') { if ($res ne 'OK') {
$c->stash(error => $result); $c->stash(error => $result);
$c->stash(title => $title, pse_datas => \%pse_datas); $c->stash(title => $title, pse_datas => \%pse_datas);
return $c->render('pseudonyms'); return $c->render('pseudonyms');
} }
my $message = "'Pseudonyms' updates $trt DONE"; my $message = "'Pseudonyms' updates $trt DONE";
$c->app->log->info($message); $c->app->log->info($message);
$c->flash(success => $result); $c->flash(success => $result);
$c->redirect_to('/pseudonyms'); $c->redirect_to('/pseudonyms');
} ## end sub do_update
};
sub delete_pseudonym { sub delete_pseudonym {
my ($c, $pseudonym) = @_; my ($c, $pseudonym) = @_;
my $msg = ''; my $msg = '';
#------------------------------------------------------------ #------------------------------------------------------------
# Make the pseudonym inactive, signal pseudonym-delete event # Make the pseudonym inactive, signal pseudonym-delete event
# and then delete it # and then delete it
#------------------------------------------------------------ #------------------------------------------------------------
my @pseudonyms = $adb->pseudonyms(); my @pseudonyms = $adb->pseudonyms();
foreach my $p_rec (@pseudonyms) { foreach my $p_rec (@pseudonyms) {
@ -238,8 +212,7 @@ sub delete_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."; or $msg .= "Error occurred while changing pseudonym type.";
} }
} } ## end foreach my $p_rec (@pseudonyms)
$adb->get($pseudonym)->set_prop('type', 'pseudonym-deleted') $adb->get($pseudonym)->set_prop('type', 'pseudonym-deleted')
or $msg .= "Error occurred while changing pseudonym type."; or $msg .= "Error occurred while changing pseudonym type.";
@ -250,49 +223,40 @@ sub delete_pseudonym {
#TODO: is it ->delete or get()->delete #TODO: is it ->delete or get()->delete
foreach my $p_rec (@pseudonyms) { foreach my $p_rec (@pseudonyms) {
if ($p_rec->prop("Account") eq $pseudonym) { if ($p_rec->prop("Account") eq $pseudonym) {
$adb->get($p_rec->key)->delete() $adb->get($p_rec->key)->delete()
or $msg .= "Error occurred while deleting pseudonym from database."; or $msg .= "Error occurred while deleting pseudonym from database.";
} }
} } ## end foreach my $p_rec (@pseudonyms)
$adb->get($pseudonym)->delete() $adb->get($pseudonym)->delete()
or $msg .= "Error occurred while deleting pseudonym from database."; or $msg .= "Error occurred while deleting pseudonym from database.";
return $msg unless $msg; return $msg unless $msg;
return 'OK'; return 'OK';
} } ## end sub delete_pseudonym
sub existing_accounts_list { sub existing_accounts_list {
my $c = shift; my $c = shift;
my @existingAccounts = ([ 'Administrator' => 'admin' ]); my @existingAccounts = ([ 'Administrator' => 'admin' ]);
foreach my $a ($adb->get_all) { foreach my $a ($adb->get_all) {
if ($a->prop('type') =~ /(user|group)/) { if ($a->prop('type') =~ /(user|group)/) {
push @existingAccounts, [ $a->key => $a->key ]; push @existingAccounts, [ $a->key => $a->key ];
} }
if ($a->prop('type') eq "pseudonym") { if ($a->prop('type') eq "pseudonym") {
my $target = $adb->get($a->prop('Account')); my $target = $adb->get($a->prop('Account'));
unless ($target) unless ($target) {
{ warn "WARNING: pseudonym (" . $a->key . ") => missing Account(" . $a->prop('Account') . ")\n";
warn "WARNING: pseudonym (" . $a->key . ") => missing Account("
. $a->prop('Account') . ")\n";
next; next;
} }
push @existingAccounts, [ $a->key, $a->key ] push @existingAccounts, [ $a->key, $a->key ]
unless ($target->prop('type') eq "pseudonym"); unless ($target->prop('type') eq "pseudonym");
} } ## end if ($a->prop('type') eq...)
} } ## end foreach my $a ($adb->get_all)
return (\@existingAccounts); return (\@existingAccounts);
} } ## end sub existing_accounts_list
=head2 get_pseudonym_account =head2 get_pseudonym_account
@ -303,15 +267,15 @@ Returns the current Account property for this pseudonym
sub get_pseudonym_account { sub get_pseudonym_account {
my $c = shift; my $c = shift;
my $pseudonym = shift; my $pseudonym = shift;
my $a = $adb->get($pseudonym)->prop('Account'); my $a = $adb->get($pseudonym)->prop('Account');
if ($a eq "admin") { if ($a eq "admin") {
$a = "Administrator"; $a = "Administrator";
} elsif ($a eq "shared") { } 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 =head2 is_pseudonym_not_removable
@ -322,11 +286,10 @@ Returns 1 if the current Account is not removable, 0 otherwise
sub is_pseudonym_not_removable { sub is_pseudonym_not_removable {
my $c = shift; my $c = shift;
my $pseudonym = shift; my $pseudonym = shift;
my $removable = $adb->get($pseudonym)->prop('Removable') || 'yes'; my $removable = $adb->get($pseudonym)->prop('Removable') || 'yes';
return 1 if ($removable eq 'yes'); return 1 if ($removable eq 'yes');
return 0; return 0;
} } ## end sub is_pseudonym_not_removable
=head2 is_pseudonym_internal =head2 is_pseudonym_internal
@ -335,13 +298,13 @@ Returns YES if the current Account property Visible is 'internal'
=cut =cut
sub is_pseudonym_internal { sub is_pseudonym_internal {
# my $c = shift; # my $c = shift;
my $pseudonym = shift; my $pseudonym = shift;
my $visible = $adb->get($pseudonym)->prop('Visible') || ''; my $visible = $adb->get($pseudonym)->prop('Visible') || '';
return 'YES' if ($visible eq 'internal'); return 'YES' if ($visible eq 'internal');
return 'NO'; return 'NO';
} } ## end sub is_pseudonym_internal
=head2 validate_new_pseudonym_name FM PSEUDONYM =head2 validate_new_pseudonym_name FM PSEUDONYM
@ -355,14 +318,11 @@ Returns "NAME_IN_USE" if this pseudonym is taken.
=cut =cut
sub validate_new_pseudonym_name { sub validate_new_pseudonym_name {
my ($c, $pseudonym, $account) = @_; my ($c, $pseudonym, $account) = @_;
my $acct = $adb->get($pseudonym); my $acct = $adb->get($pseudonym);
if (defined $acct) { if (defined $acct) {
return ($c->l('pse_NAME_IN_USE')); return ($c->l('pse_NAME_IN_USE'));
} elsif ($pseudonym =~ /@/) { } elsif ($pseudonym =~ /@/) {
use esmith::DomainsDB; use esmith::DomainsDB;
my $ddb = esmith::DomainsDB->open_ro my $ddb = esmith::DomainsDB->open_ro
@ -371,14 +331,12 @@ sub validate_new_pseudonym_name {
return ($c->l('pse_PSEUDONYM_INVALID_DOMAIN')) unless ($ddb->get($rhs)); return ($c->l('pse_PSEUDONYM_INVALID_DOMAIN')) unless ($ddb->get($rhs));
return ($c->l('pse_PSEUDONYM_INVALID_SAMEACCT')) if ($lhs eq $account); return ($c->l('pse_PSEUDONYM_INVALID_SAMEACCT')) if ($lhs eq $account);
return ('OK'); # p:' . $pseudonym . ' a:' . $account); return ('OK'); # p:' . $pseudonym . ' a:' . $account);
} elsif ($pseudonym !~ /^([a-z0-9][a-z0-9\.\-_!#\?~\$\^\+&`%\/\*]*)$/) { } elsif ($pseudonym !~ /^([a-z0-9][a-z0-9\.\-_!#\?~\$\^\+&`%\/\*]*)$/) {
return ($c->l('pse_VALID_PSEUDONYM_NAMES')); return ($c->l('pse_VALID_PSEUDONYM_NAMES'));
} else { } else {
return ('OK'); return ('OK');
} }
} } ## end sub validate_new_pseudonym_name
=head2 validate_is_pseudonym FM NAME =head2 validate_is_pseudonym FM NAME
@ -390,17 +348,13 @@ returns "NOT_A_PSEUDONYM" if the name in question isn't an existing pseudonym
sub validate_is_pseudonym { sub validate_is_pseudonym {
my $c = shift; my $c = shift;
my $pseudonym = shift; my $pseudonym = shift;
$pseudonym = $adb->get($pseudonym); $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'); my $type = $pseudonym->prop('type');
unless (defined $type && ($type eq 'pseudonym')) { unless (defined $type && ($type eq 'pseudonym')) {
return ($c->l('NOT_A_PSEUDONYM')); return ($c->l('NOT_A_PSEUDONYM'));
} }
return ('OK'); return ('OK');
} } ## end sub validate_is_pseudonym
1; 1;

View File

@ -10,127 +10,91 @@ package SrvMngr::Controller::Qmailanalog;
use strict; use strict;
use warnings; use warnings;
use Mojo::Base 'Mojolicious::Controller'; use Mojo::Base 'Mojolicious::Controller';
use esmith::FormMagick qw(gen_locale_date_string); use esmith::FormMagick qw(gen_locale_date_string);
use Locale::gettext; use Locale::gettext;
use SrvMngr::I18N; use SrvMngr::I18N;
use SrvMngr qw(theme_list init_session); use SrvMngr qw(theme_list init_session);
sub main { sub main {
my $c = shift; my $c = shift;
$c->app->log->info($c->log_req); $c->app->log->info($c->log_req);
my $title = $c->l('qma_FORM_TITLE'); my $title = $c->l('qma_FORM_TITLE');
my $modul = $c->render_to_string(inline => $c->l('qma_INITIAL_DESC')); 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'); $c->render(template => 'qmailanalog');
}; } ## end sub main
sub do_update { sub do_update {
my $c = shift; my $c = shift;
$c->app->log->info($c->log_req); $c->app->log->info($c->log_req);
my $result = ""; my $result = "";
my $report_type = $c->param('report_type'); my $report_type = $c->param('report_type');
if ($report_type =~ /^(\S+)$/) if ($report_type =~ /^(\S+)$/) {
{
$report_type = $1; $report_type = $1;
} } elsif ($report_type =~ /^\s*$/) {
elsif ($report_type =~ /^\s*$/)
{
$report_type = "zoverall"; $report_type = "zoverall";
} else { } else {
$result = $c->l('INVALID_REPORT_TYPE') . $report_type; $result = $c->l('INVALID_REPORT_TYPE') . $report_type;
$report_type = undef; $report_type = undef;
} }
my $title = $c->l('qma_FORM_TITLE'); my $title = $c->l('qma_FORM_TITLE');
$result = $c->render_to_string(inline => generateReport($c, $report_type)) if $report_type; $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'); $c->render(template => 'module');
}; } ## end sub do_update
sub generateReport { sub generateReport {
my $c = shift; my $c = shift;
my $report_type = shift; my $report_type = shift;
my $out = ''; my $out = '';
#------------------------------------------------------------ #------------------------------------------------------------
# Looks good; go ahead and generate the report. # Looks good; go ahead and generate the report.
#------------------------------------------------------------ #------------------------------------------------------------
# $| = 1; # $| = 1;
my $now_string = $c->gen_locale_date_string(); my $now_string = $c->gen_locale_date_string();
$out .= sprintf("<h3>%s %s </h3>", $c->l('REPORT_GENERATED'), $now_string); $out .= sprintf("<h3>%s %s </h3>", $c->l('REPORT_GENERATED'), $now_string);
if ($report_type =~ /^qmail-q/) if ($report_type =~ /^qmail-q/) {
{
open(QMAILQUEUEREPORT, "/var/qmail/bin/$report_type |"); open(QMAILQUEUEREPORT, "/var/qmail/bin/$report_type |");
$out .= sprintf "<pre>"; $out .= sprintf "<pre>";
while (<QMAILQUEUEREPORT>) while (<QMAILQUEUEREPORT>) {
{
$out .= sprintf("%s", $_); $out .= sprintf("%s", $_);
} }
close QMAILQUEUEREPORT; close QMAILQUEUEREPORT;
$out .= sprintf "</pre>"; $out .= sprintf "</pre>";
$out .= sprintf("<h3>%s</h3>", $c->l('END_OF_REPORT')); $out .= sprintf("<h3>%s</h3>", $c->l('END_OF_REPORT'));
return ''; return '';
} } ## end if ($report_type =~ /^qmail-q/)
chdir "/var/log/qmail"; chdir "/var/log/qmail";
open(QMAILANALOG, open(QMAILANALOG,
"/bin/cat \@* current 2>/dev/null" "/bin/cat \@* current 2>/dev/null"
. "| /usr/local/bin/tai64nunix" . "| /usr/local/bin/tai64nunix"
. "| /usr/local/qmailanalog/bin/matchup 5>/dev/null" . "| /usr/local/qmailanalog/bin/matchup 5>/dev/null"
. "| /usr/local/qmailanalog/bin/$report_type |" . "| /usr/local/qmailanalog/bin/$report_type |");
);
$out .= sprintf "<pre>"; $out .= sprintf "<pre>";
while (<QMAILANALOG>) while (<QMAILANALOG>) {
{
# Cook any special HTML characters
# Cook any special HTML characters
s/\&/\&amp;/g; s/\&/\&amp;/g;
s/\"/\&quot;/g; s/\"/\&quot;/g;
s/\>/\&gt;/g; s/\>/\&gt;/g;
s/\</\&lt;/g; s/\</\&lt;/g;
$out .= sprintf("%s", $_); $out .= sprintf("%s", $_);
} } ## end while (<QMAILANALOG>)
close QMAILANALOG; close QMAILANALOG;
$out .= sprintf "</pre>"; $out .= sprintf "</pre>";
$out .= sprintf("<h3>%s</h3>", $c->l('END_OF_REPORT')); $out .= sprintf("<h3>%s</h3>", $c->l('END_OF_REPORT'));
return $out; return $out;
} ## end sub generateReport
}
sub reportType_list { sub reportType_list {
my $c = shift; my $c = shift;
my @array = ( my @array = (
# [ $c->l('qma_LIST_OUTGOING') => 'qmail-qread' ], # [ $c->l('qma_LIST_OUTGOING') => 'qmail-qread' ],
# [ $c->l('qma_SUMMARIZE_QUEUE') => 'qmail-qstat' ], # [ $c->l('qma_SUMMARIZE_QUEUE') => 'qmail-qstat' ],
[ $c->l('qma_SUCCESSFUL_DELIVERY_DELAY') => 'zddist' ], [ $c->l('qma_SUCCESSFUL_DELIVERY_DELAY') => 'zddist' ],
@ -147,6 +111,5 @@ sub reportType_list {
); );
my @sorted_array = sort { $a->[0] cmp $b->[0] } @array; my @sorted_array = sort { $a->[0] cmp $b->[0] } @array;
return \@sorted_array; return \@sorted_array;
} } ## end sub reportType_list
1; 1;

View File

@ -11,60 +11,45 @@ package SrvMngr::Controller::Quota;
use strict; use strict;
use warnings; use warnings;
use Mojo::Base 'Mojolicious::Controller'; use Mojo::Base 'Mojolicious::Controller';
use esmith::FormMagick::Panel::quota; use esmith::FormMagick::Panel::quota;
#use esmith::TestUtils; #use esmith::TestUtils;
use Scalar::Util qw(looks_like_number); use Scalar::Util qw(looks_like_number);
use Locale::gettext; use Locale::gettext;
use SrvMngr::I18N; use SrvMngr::I18N;
use SrvMngr qw(theme_list init_session); use SrvMngr qw(theme_list init_session);
#our $db = esmith::ConfigDB->open || die "Couldn't open config db"; #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";
sub main { sub main {
my $c = shift; my $c = shift;
$c->app->log->info($c->log_req); $c->app->log->info($c->log_req);
my %quo_datas = (); my %quo_datas = ();
my $title = $c->l('quo_FORM_TITLE'); my $title = $c->l('quo_FORM_TITLE');
$quo_datas{'trt'} = 'LIST'; $quo_datas{'trt'} = 'LIST';
my @userAccounts; my @userAccounts;
if ($adb) { if ($adb) {
@userAccounts = $adb->users(); @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'); $c->render(template => 'quota');
} ## end sub main
};
sub do_display { sub do_display {
my $c = shift; my $c = shift;
my $rt = $c->current_route; my $rt = $c->current_route;
my $trt = ($c->param('trt') || 'LIST'); my $trt = ($c->param('trt') || 'LIST');
my $user = $c->param('user') || ''; my $user = $c->param('user') || '';
$trt = 'UPD' if ($user); $trt = 'UPD' if ($user);
my %quo_datas = (); my %quo_datas = ();
my $title = $c->l('quo_FORM_TITLE'); my $title = $c->l('quo_FORM_TITLE');
$quo_datas{'trt'} = $trt; $quo_datas{'trt'} = $trt;
if ($trt eq 'UPD') { if ($trt eq 'UPD') {
my $rec = $adb->get($user); my $rec = $adb->get($user);
if ($rec and $rec->prop('type') eq 'user') { if ($rec and $rec->prop('type') eq 'user') {
$quo_datas{user} = $user; $quo_datas{user} = $user;
$quo_datas{userRec} = $rec; $quo_datas{userRec} = $rec;
@ -72,33 +57,24 @@ sub do_display {
$quo_datas{hardlim} = $max; $quo_datas{hardlim} = $max;
$max = esmith::FormMagick::Panel::quota->toBestUnit($rec->prop('MaxBlocksSoftLim')); $max = esmith::FormMagick::Panel::quota->toBestUnit($rec->prop('MaxBlocksSoftLim'));
$quo_datas{softlim} = $max; $quo_datas{softlim} = $max;
} } ## end if ($rec and $rec->prop...)
} ## end if ($trt eq 'UPD')
}
$c->stash(title => $title, quo_datas => \%quo_datas); $c->stash(title => $title, quo_datas => \%quo_datas);
$c->render(template => 'quota'); $c->render(template => 'quota');
} ## end sub do_display
};
sub do_update { sub do_update {
my $c = shift; my $c = shift;
$c->app->log->info($c->log_req); $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 %quo_datas = ();
my $rt = $c->current_route; my $rt = $c->current_route;
my $trt = ($c->param('trt') || 'LIST'); my $trt = ($c->param('trt') || 'LIST');
$quo_datas{trt} = $trt; $quo_datas{trt} = $trt;
my $result = ''; my $result = '';
my $res; my $res;
if ($trt eq 'UPD') { if ($trt eq 'UPD') {
$quo_datas{user} = ($c->param('user') || ''); $quo_datas{user} = ($c->param('user') || '');
$quo_datas{softlim} = ($c->param('Soft') || ''); $quo_datas{softlim} = ($c->param('Soft') || '');
$quo_datas{hardlim} = ($c->param('Hard') || ''); $quo_datas{hardlim} = ($c->param('Hard') || '');
@ -112,33 +88,27 @@ sub do_update {
} else { } else {
$quo_datas{userRec} = $adb->get($quo_datas{user}) || undef; $quo_datas{userRec} = $adb->get($quo_datas{user}) || undef;
} }
} } ## end if ($trt eq 'UPD')
# common parts # common parts
if ($res ne 'OK') { if ($res ne 'OK') {
$c->stash(error => $result); $c->stash(error => $result);
$c->stash(title => $title, quo_datas => \%quo_datas); $c->stash(title => $title, quo_datas => \%quo_datas);
return $c->render('quota'); return $c->render('quota');
} }
my $message = "'Quota' updates ($trt) DONE"; my $message = "'Quota' updates ($trt) DONE";
$c->app->log->info($message); $c->app->log->info($message);
$c->flash(success => $result); $c->flash(success => $result);
$c->redirect_to('/quota'); $c->redirect_to('/quota');
} ## end sub do_update
};
sub validate_quota { sub validate_quota {
my ($c, $acct, $softlim, $hardlim) = @_; my ($c, $acct, $softlim, $hardlim) = @_;
my $msg; my $msg;
my $rec = $adb->get($acct); 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'); my $type = $rec->prop('type');
unless ($type eq "user") { unless ($type eq "user") {
$msg = $c->l('quo_ERR_NOT_A_USER_ACCT') . $acct . $c->l('quo_ACCOUNT_IS_TYPE') . $type; $msg = $c->l('quo_ERR_NOT_A_USER_ACCT') . $acct . $c->l('quo_ACCOUNT_IS_TYPE') . $type;
return $msg; return $msg;
@ -149,8 +119,8 @@ sub validate_quota {
if (($softlim !~ /^(.+?)\s*([KMGT])?$/) || (!looks_like_number($1))) { if (($softlim !~ /^(.+?)\s*([KMGT])?$/) || (!looks_like_number($1))) {
return $c->l('quo_SOFT_VAL_MUST_BE_NUMBER'); return $c->l('quo_SOFT_VAL_MUST_BE_NUMBER');
} }
my $exponent = 1; # Entries with no suffix are assumed to be in megabytes. my $exponent = 1; # Entries with no suffix are assumed to be in megabytes.
if (defined($2)) { if (defined($2)) {
$exponent = index("KMGT", $2); $exponent = index("KMGT", $2);
} }
@ -160,8 +130,8 @@ sub validate_quota {
return $c->l('quo_HARD_VAL_MUST_BE_NUMBER'); return $c->l('quo_HARD_VAL_MUST_BE_NUMBER');
} }
$exponent = 1; # Entries with no suffix are assumed to be in megabytes. $exponent = 1; # Entries with no suffix are assumed to be in megabytes.
if (defined ($2))
{ if (defined($2)) {
$exponent = index("KMGT", $2); $exponent = index("KMGT", $2);
} }
$hardlim = ($1 * 1024**$exponent); $hardlim = ($1 * 1024**$exponent);
@ -169,7 +139,6 @@ sub validate_quota {
#------------------------------------------------------------ #------------------------------------------------------------
# Make sure that soft limit is less than hard limit. # Make sure that soft limit is less than hard limit.
#------------------------------------------------------------ #------------------------------------------------------------
unless ($hardlim == 0 or $hardlim > $softlim) { unless ($hardlim == 0 or $hardlim > $softlim) {
return $c->l('quo_ERR_HARD_LT_SOFT'); return $c->l('quo_ERR_HARD_LT_SOFT');
} }
@ -177,17 +146,14 @@ sub validate_quota {
#------------------------------------------------------------ #------------------------------------------------------------
# Update accounts database and signal the user-modify event. # Update accounts database and signal the user-modify event.
#------------------------------------------------------------ #------------------------------------------------------------
$rec->set_prop('MaxBlocks', $hardlim); $rec->set_prop('MaxBlocks', $hardlim);
$rec->set_prop('MaxBlocksSoftLim', $softlim); $rec->set_prop('MaxBlocksSoftLim', $softlim);
# Untaint $acct before using in system(). # Untaint $acct before using in system().
$acct =~ /^(\w[\-\w_\.]*)$/; $acct = $1; $acct =~ /^(\w[\-\w_\.]*)$/;
$acct = $1;
system("/sbin/e-smith/signal-event", "user-modify", "$acct") == 0 system("/sbin/e-smith/signal-event", "user-modify", "$acct") == 0
or die($c->l('quo_ERR_MODIFYING') . "\n"); or die($c->l('quo_ERR_MODIFYING') . "\n");
return 'OK'; return 'OK';
} } ## end sub validate_quota
1 1

View File

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

View File

@ -11,12 +11,9 @@ package SrvMngr::Controller::Remoteaccess;
use strict; use strict;
use warnings; use warnings;
use Mojo::Base 'Mojolicious::Controller'; use Mojo::Base 'Mojolicious::Controller';
use Locale::gettext; use Locale::gettext;
use SrvMngr::I18N; use SrvMngr::I18N;
use SrvMngr qw(theme_list init_session ip_number subnet_mask get_reg_mask); use SrvMngr qw(theme_list init_session ip_number subnet_mask get_reg_mask);
use esmith::ConfigDB; use esmith::ConfigDB;
use esmith::util; use esmith::util;
use File::Basename; use File::Basename;
@ -25,9 +22,7 @@ use Carp;
use Socket qw( inet_aton ); use Socket qw( inet_aton );
#our @ISA = qw(esmith::FormMagick Exporter); #our @ISA = qw(esmith::FormMagick Exporter);
our @EXPORT = qw( networkAccess_list passwordLogin_list get_ssh_permit_root_login get_ssh_access get_telnet_mode
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_ftp_access get_ftp_password_login_access
get_value get_prop get_ssh_password_auth get_value get_prop get_ssh_password_auth
validate_network_and_mask ip_number_or_blank subnet_mask_or_blank validate_network_and_mask ip_number_or_blank subnet_mask_or_blank
@ -35,18 +30,14 @@ our @EXPORT =
); );
# get_pptp_sessions # get_pptp_sessions
our $db = esmith::ConfigDB->open || warn "Couldn't open configuration database"; our $db = esmith::ConfigDB->open || warn "Couldn't open configuration database";
sub main { sub main {
my $c = shift; my $c = shift;
$c->app->log->info($c->log_req); $c->app->log->info($c->log_req);
my $title = $c->l('rma_FORM_TITLE'); my $title = $c->l('rma_FORM_TITLE');
my $notif = ''; my $notif = '';
my %rma_datas = (); my %rma_datas = ();
$db = esmith::ConfigDB->open || warn "Couldn't open configuration database"; $db = esmith::ConfigDB->open || warn "Couldn't open configuration database";
#$rma_datas{ipsecrwSess} = $c->get_ipsecrw_sessions(); #$rma_datas{ipsecrwSess} = $c->get_ipsecrw_sessions();
@ -59,45 +50,32 @@ sub main {
$rma_datas{ftpPasswordAccess} = $c->get_ftp_password_login_access(); $rma_datas{ftpPasswordAccess} = $c->get_ftp_password_login_access();
#$rma_datas{telnetAccess} = $c->get_telnet_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'); $c->render(template => 'remoteaccess');
} ## end sub main
}
sub do_action { sub do_action {
my $c = shift; my $c = shift;
$c->app->log->info($c->log_req); $c->app->log->info($c->log_req);
my $title = $c->l('rma_FORM_TITLE'); my $title = $c->l('rma_FORM_TITLE');
my ($result, $res, $trt) = ''; my ($result, $res, $trt) = '';
my %rma_datas = (); my %rma_datas = ();
$db = esmith::ConfigDB->open || warn "Couldn't open configuration database"; $db = esmith::ConfigDB->open || warn "Couldn't open configuration database";
$rma_datas{ipsecrwSess} = ($c->param('IpsecrwSess') || ''); $rma_datas{ipsecrwSess} = ($c->param('IpsecrwSess') || '');
$rma_datas{ipsecrwReset} = ($c->param('IpsecrwReset') || ''); $rma_datas{ipsecrwReset} = ($c->param('IpsecrwReset') || '');
#$rma_datas{pptpSessions} = ($c->param ('PptpSessions') || '0'); #$rma_datas{pptpSessions} = ($c->param ('PptpSessions') || '0');
$rma_datas{validFromNetwork} = ($c->param('ValidFromNetwork') || ''); $rma_datas{validFromNetwork} = ($c->param('ValidFromNetwork') || '');
$rma_datas{validFromMask} = ($c->param('ValidFromMask') || ''); $rma_datas{validFromMask} = ($c->param('ValidFromMask') || '');
## my @remove = $q->param('validFromRemove'); ???????? the first one only !! ## 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{remove_nets} = join ',', @vals;
$rma_datas{sshaccess} = ($c->param('SshAccess') || 'off'); $rma_datas{sshaccess} = ($c->param('SshAccess') || 'off');
$rma_datas{sshPermitRootLogin} = $rma_datas{sshPermitRootLogin} = ($c->param('SshPermitRootLogin') || 'no');
( $c->param('SshPermitRootLogin') || 'no' ); $rma_datas{sshPasswordAuthentication} = ($c->param('SshPasswordAuthentication') || 'no');
$rma_datas{sshPasswordAuthentication} =
( $c->param('SshPasswordAuthentication') || 'no' );
$rma_datas{sshTCPPort} = ($c->param('SshTCPPort') || '22'); $rma_datas{sshTCPPort} = ($c->param('SshTCPPort') || '22');
$rma_datas{ftpAccess} = ($c->param('FtpAccess') || 'off'); $rma_datas{ftpAccess} = ($c->param('FtpAccess') || 'off');
$rma_datas{ftpPasswordAccess} = $rma_datas{ftpPasswordAccess} = ($c->param('FtpPasswordAccess') || 'private');
( $c->param('FtpPasswordAccess') || 'private' );
$rma_datas{telnetAccess} = ($c->param('TelnetAccess') || 'off'); $rma_datas{telnetAccess} = ($c->param('TelnetAccess') || 'off');
# validate # validate
@ -108,11 +86,11 @@ sub do_action {
if ($c->param('ValidFromNetwork') ne "") { if ($c->param('ValidFromNetwork') ne "") {
$v->optional('ValidFromNetwork')->size(7, 15)->is_valid; $v->optional('ValidFromNetwork')->size(7, 15)->is_valid;
} }
if ($c->param('ValidFromMask') ne "") { if ($c->param('ValidFromMask') ne "") {
$v->optional('ValidFromMask')->size(7, 15)->is_valid; $v->optional('ValidFromMask')->size(7, 15)->is_valid;
} }
$v->required('SshTCPPort')->num(1, 65535)->is_valid; $v->required('SshTCPPort')->num(1, 65535)->is_valid;
$result .= 'field validation error' if $v->has_error; $result .= 'field validation error' if $v->has_error;
if (!$result) { if (!$result) {
@ -120,22 +98,15 @@ sub do_action {
# controls # controls
#$res = pptp_and_dhcp_range( $c, $rma_datas{pptpSessions} ); #$res = pptp_and_dhcp_range( $c, $rma_datas{pptpSessions} );
#$result .= $res . ' ' unless $res eq 'OK'; #$result .= $res . ' ' unless $res eq 'OK';
$res = ip_number_or_blank($c, $rma_datas{validFromNetwork}); $res = ip_number_or_blank($c, $rma_datas{validFromNetwork});
$result .= $res . ' ' unless $res eq 'OK'; $result .= $res . ' ' unless $res eq 'OK';
$res = subnet_mask_or_blank($c, $rma_datas{validFromMask}); $res = subnet_mask_or_blank($c, $rma_datas{validFromMask});
$result .= $res . ' ' unless $res eq 'OK'; $result .= $res . ' ' unless $res eq 'OK';
$res = validate_network_and_mask($c, $rma_datas{validFromNetwork}, $rma_datas{validFromMask});
$res = validate_network_and_mask(
$c,
$rma_datas{validFromNetwork},
$rma_datas{validFromMask}
);
$result .= $res . ' ' unless $res eq 'OK'; $result .= $res . ' ' unless $res eq 'OK';
#$result .= ' blocked for testing !' . $rma_datas{remove_nets}; #$result .= ' blocked for testing !' . $rma_datas{remove_nets};
} } ## end if (!$result)
if (!$result) { if (!$result) {
$res = change_settings($c, %rma_datas); $res = change_settings($c, %rma_datas);
@ -149,16 +120,14 @@ sub do_action {
$c->stash(title => $title, notif => $result, rma_datas => \%rma_datas); $c->stash(title => $title, notif => $result, rma_datas => \%rma_datas);
#return $c->render( template => 'remoteaccess' ); #return $c->render( template => 'remoteaccess' );
if ($trt eq 'SUC') { if ($trt eq 'SUC') {
$c->stash(title => $title, modul => $result); $c->stash(title => $title, modul => $result);
return $c->render(template => 'module'); return $c->render(template => 'module');
} }
return $c->render(template => 'remoteaccess'); return $c->render(template => 'remoteaccess');
#$c->redirect_to('/remoteaccess');
} #$c->redirect_to('/remoteaccess');
} ## end sub do_action
sub networkAccess_list { sub networkAccess_list {
my $c = shift; my $c = shift;
@ -167,40 +136,33 @@ sub networkAccess_list {
[ $c->l('NETWORKS_ALLOW_LOCAL') => 'private' ], [ $c->l('NETWORKS_ALLOW_LOCAL') => 'private' ],
[ $c->l('NETWORKS_ALLOW_PUBLIC') => 'public' ] [ $c->l('NETWORKS_ALLOW_PUBLIC') => 'public' ]
]; ];
} } ## end sub networkAccess_list
sub passwordLogin_list { sub passwordLogin_list {
my $c = shift; my $c = shift;
return [ return [ [ $c->l('rma_PASSWORD_LOGIN_PRIVATE') => 'private' ], [ $c->l('rma_PASSWORD_LOGIN_PUBLIC') => 'public' ] ];
[ $c->l('rma_PASSWORD_LOGIN_PRIVATE') => 'private' ],
[ $c->l('rma_PASSWORD_LOGIN_PUBLIC') => 'public' ]
];
} }
sub get_prop { sub get_prop {
my ($c, $item, $prop) = @_; my ($c, $item, $prop) = @_;
warn "You must specify a record key" unless $item; warn "You must specify a record key" unless $item;
warn "You must specify a property name" unless $prop; warn "You must specify a property name" unless $prop;
my $record = $db->get($item) or warn "Couldn't get record for $item"; my $record = $db->get($item) or warn "Couldn't get record for $item";
return $record ? $record->prop($prop) : undef; return $record ? $record->prop($prop) : undef;
} } ## end sub get_prop
sub get_value { sub get_value {
my $c = shift; my $c = shift;
my $item = shift; my $item = shift;
return ($db->get($item)->value()); return ($db->get($item)->value());
} } ## end sub get_value
sub get_ftp_access { sub get_ftp_access {
my $status = get_prop('', 'ftp', 'status') || 'disabled'; my $status = get_prop('', 'ftp', 'status') || 'disabled';
return 'off' unless $status eq 'enabled'; return 'off' unless $status eq 'enabled';
my $access = get_prop('', 'ftp', 'access') || 'private'; my $access = get_prop('', 'ftp', 'access') || 'private';
return ($access eq 'public') ? 'normal' : 'private'; return ($access eq 'public') ? 'normal' : 'private';
} } ## end sub get_ftp_access
#sub get_pptp_sessions { #sub get_pptp_sessions {
# my $status = get_prop('','pptpd','status'); # my $status = get_prop('','pptpd','status');
@ -208,7 +170,6 @@ sub get_ftp_access {
# return(get_prop('','pptpd','sessions') || 'no'); # return(get_prop('','pptpd','sessions') || 'no');
# return '0'; # return '0';
#} #}
sub get_ssh_permit_root_login { sub get_ssh_permit_root_login {
return (get_prop('', 'sshd', 'PermitRootLogin') || 'no'); return (get_prop('', 'sshd', 'PermitRootLogin') || 'no');
} }
@ -218,62 +179,53 @@ sub get_ssh_password_auth {
} }
sub get_ssh_access { sub get_ssh_access {
my $status = get_prop('', 'sshd', 'status'); my $status = get_prop('', 'sshd', 'status');
if (defined($status) && ($status eq 'enabled')) { if (defined($status) && ($status eq 'enabled')) {
my $access = get_prop('', 'sshd', 'access'); my $access = get_prop('', 'sshd', 'access');
$access = ($access eq 'public') ? 'public' : 'private'; $access = ($access eq 'public') ? 'public' : 'private';
return ($access); return ($access);
} } else {
else {
return ('off'); return ('off');
} }
} } ## end sub get_ssh_access
sub get_ssh_port { sub get_ssh_port {
return (get_prop('$c', 'sshd', 'TCPPort') || '22'); return (get_prop('$c', 'sshd', 'TCPPort') || '22');
} }
sub get_ftp_password_login_access { 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'; return 'private' unless $status eq 'enabled';
my $access = get_prop('', 'ftp', 'LoginAccess') || 'private'; my $access = get_prop('', 'ftp', 'LoginAccess') || 'private';
return ($access eq 'public') ? 'public' : 'private'; return ($access eq 'public') ? 'public' : 'private';
} } ## end sub get_ftp_password_login_access
sub get_telnet_mode { sub get_telnet_mode {
my $telnet = $db->get('telnet'); my $telnet = $db->get('telnet');
return ('off') unless $telnet; return ('off') unless $telnet;
my $status = $telnet->prop('status') || 'disabled'; my $status = $telnet->prop('status') || 'disabled';
return ('off') unless $status eq 'enabled'; return ('off') unless $status eq 'enabled';
my $access = $telnet->prop('access') || 'private'; my $access = $telnet->prop('access') || 'private';
return ($access eq "public") ? "public" : "private"; return ($access eq "public") ? "public" : "private";
} } ## end sub get_telnet_mode
sub get_ipsecrw_sessions { sub get_ipsecrw_sessions {
my $status = $db->get('ipsec')->prop('RoadWarriorStatus'); my $status = $db->get('ipsec')->prop('RoadWarriorStatus');
if (defined($status) && ($status eq 'enabled')) { if (defined($status) && ($status eq 'enabled')) {
return ($db->get('ipsec')->prop('RoadWarriorSessions') || '0'); return ($db->get('ipsec')->prop('RoadWarriorSessions') || '0');
} } else {
else {
return ('0'); return ('0');
} }
} } ## end sub get_ipsecrw_sessions
sub get_ipsecrw_status { sub get_ipsecrw_status {
return undef unless ($db->get('ipsec')); return undef unless ($db->get('ipsec'));
return $db->get('ipsec')->prop('RoadWarriorStatus'); return $db->get('ipsec')->prop('RoadWarriorStatus');
} }
sub pptp_and_dhcp_range { sub pptp_and_dhcp_range {
my $c = shift; my $c = shift;
my $val = shift || 0; my $val = shift || 0;
my $dhcp_status = $db->get_prop('dhcpd', 'status') || 'disabled'; my $dhcp_status = $db->get_prop('dhcpd', 'status') || 'disabled';
@ -285,27 +237,21 @@ sub pptp_and_dhcp_range {
my $ip_end = unpack 'N', inet_aton($dhcp_end); my $ip_end = unpack 'N', inet_aton($dhcp_end);
my $ip_count = $ip_end - $ip_start; my $ip_count = $ip_end - $ip_start;
return 'OK' if ($val < $ip_count); return 'OK' if ($val < $ip_count);
return $c->l( return $c->l('rma_NUMBER_OF_PPTP_CLIENTS_MUST_BE_LESSER_THAN_NUMBER_OF_IP_IN_DHCP_RANGE');
'rma_NUMBER_OF_PPTP_CLIENTS_MUST_BE_LESSER_THAN_NUMBER_OF_IP_IN_DHCP_RANGE' } else {
);
}
else {
return 'OK'; return 'OK';
} }
} } ## end sub pptp_and_dhcp_range
sub _get_valid_from { sub _get_valid_from {
my $c = shift; my $c = shift;
my $rec = $db->get('httpd-admin'); my $rec = $db->get('httpd-admin');
return undef unless ($rec); return undef unless ($rec);
my @vals = (split ',', ($rec->prop('ValidFrom') || '')); my @vals = (split ',', ($rec->prop('ValidFrom') || ''));
return @vals; return @vals;
} } ## end sub _get_valid_from
sub ip_number_or_blank { sub ip_number_or_blank {
my $c = shift; my $c = shift;
my $ip = shift; my $ip = shift;
@ -313,83 +259,71 @@ sub ip_number_or_blank {
return 'OK'; return 'OK';
} }
return ip_number($c, $ip); return ip_number($c, $ip);
} } ## end sub ip_number_or_blank
sub subnet_mask_or_blank { sub subnet_mask_or_blank {
my $c = shift; my $c = shift;
my $mask = shift; my $mask = shift;
if (!defined($mask) || $mask eq "") { if (!defined($mask) || $mask eq "") {
return "OK"; return "OK";
} }
chomp $mask; chomp $mask;
return (subnet_mask($mask) ne 'OK') return (subnet_mask($mask) ne 'OK')
? $c->l('rma_INVALID_SUBNET_MASK') . " (" . $mask . ")" ? $c->l('rma_INVALID_SUBNET_MASK') . " (" . $mask . ")"
: 'OK'; : 'OK';
} } ## end sub subnet_mask_or_blank
sub validate_network_and_mask { sub validate_network_and_mask {
my $c = shift; my $c = shift;
my $net = shift || ""; my $net = shift || "";
my $mask = shift || ""; my $mask = shift || "";
if ($net xor $mask) { if ($net xor $mask) {
return $c->l( return $c->l('rma_ERR_INVALID_PARAMS' . " (" . $net . "/" . $mask . ")");
'rma_ERR_INVALID_PARAMS' . " (" . $net . "/" . $mask . ")" );
} }
return 'OK'; return 'OK';
} } ## end sub validate_network_and_mask
sub change_settings { sub change_settings {
my ($c, %rma_datas) = @_; my ($c, %rma_datas) = @_;
#------------------------------------------------------------ #------------------------------------------------------------
# good; go ahead and change the access. # good; go ahead and change the access.
#------------------------------------------------------------ #------------------------------------------------------------
my $rec = $db->get('telnet'); my $rec = $db->get('telnet');
if ($rec) { if ($rec) {
if ($rma_datas{telnetAccess} eq "off") { if ($rma_datas{telnetAccess} eq "off") {
$rec->set_prop('status', 'disabled'); $rec->set_prop('status', 'disabled');
} } else {
else {
$rec->set_prop('status', 'enabled'); $rec->set_prop('status', 'enabled');
$rec->set_prop('access', $rma_datas{telnetAccess}); $rec->set_prop('access', $rma_datas{telnetAccess});
} }
} } ## end if ($rec)
$rec = $db->get('sshd') || $db->new_record('sshd', { type => 'service' }); $rec = $db->get('sshd') || $db->new_record('sshd', { type => 'service' });
$rec->set_prop('TCPPort', $rma_datas{sshTCPPort}); $rec->set_prop('TCPPort', $rma_datas{sshTCPPort});
$rec->set_prop( 'status', $rec->set_prop('status', ($rma_datas{sshaccess} eq "off" ? 'disabled' : 'enabled'));
( $rma_datas{sshaccess} eq "off" ? 'disabled' : 'enabled' ) );
$rec->set_prop('access', $rma_datas{sshaccess}); $rec->set_prop('access', $rma_datas{sshaccess});
$rec->set_prop('PermitRootLogin', $rma_datas{sshPermitRootLogin}); $rec->set_prop('PermitRootLogin', $rma_datas{sshPermitRootLogin});
$rec->set_prop( 'PasswordAuthentication', $rec->set_prop('PasswordAuthentication', $rma_datas{sshPasswordAuthentication});
$rma_datas{sshPasswordAuthentication} );
$rec = $db->get('ftp'); $rec = $db->get('ftp');
if ($rec) { if ($rec) {
if ($rma_datas{ftpAccess} eq "off") { if ($rma_datas{ftpAccess} eq "off") {
$rec->set_prop('status', 'disabled'); $rec->set_prop('status', 'disabled');
$rec->set_prop('access', 'private'); $rec->set_prop('access', 'private');
$rec->set_prop('LoginAccess', 'private'); $rec->set_prop('LoginAccess', 'private');
} } elsif ($rma_datas{ftpAccess} eq "normal") {
elsif ( $rma_datas{ftpAccess} eq "normal" ) {
$rec->set_prop('status', 'enabled'); $rec->set_prop('status', 'enabled');
$rec->set_prop('access', 'public'); $rec->set_prop('access', 'public');
$rec->set_prop('LoginAccess', $rma_datas{ftpPasswordAccess}); $rec->set_prop('LoginAccess', $rma_datas{ftpPasswordAccess});
} } else {
else {
$rec->set_prop('status', 'enabled'); $rec->set_prop('status', 'enabled');
$rec->set_prop('access', 'private'); $rec->set_prop('access', 'private');
$rec->set_prop('LoginAccess', $rma_datas{ftpPasswordAccess}); $rec->set_prop('LoginAccess', $rma_datas{ftpPasswordAccess});
} }
} } ## end if ($rec)
# if ($rma_datas{pptpSessions} == 0) { # if ($rma_datas{pptpSessions} == 0) {
# $db->get('pptpd')->set_prop('status', 'disabled'); # $db->get('pptpd')->set_prop('status', 'disabled');
@ -397,25 +331,18 @@ sub change_settings {
# $db->get('pptpd')->set_prop('status', 'enabled'); # $db->get('pptpd')->set_prop('status', 'enabled');
# $db->get('pptpd')->set_prop('sessions', $rma_datas{pptpSessions}); # $db->get('pptpd')->set_prop('sessions', $rma_datas{pptpSessions});
# } # }
if ($rma_datas{validFromNetwork} && $rma_datas{validFromMask}) { if ($rma_datas{validFromNetwork} && $rma_datas{validFromMask}) {
unless (
add_new_valid_from( unless (add_new_valid_from($c, $rma_datas{validFromNetwork}, $rma_datas{validFromMask})) {
$c,
$rma_datas{validFromNetwork},
$rma_datas{validFromMask}
)
)
{
return $c->l('rma_ERROR_UPDATING_CONFIGURATION') . 'new net'; return $c->l('rma_ERROR_UPDATING_CONFIGURATION') . 'new net';
} }
} } ## end if ($rma_datas{validFromNetwork...})
if ($rma_datas{remove_nets}) { if ($rma_datas{remove_nets}) {
unless (remove_valid_from($c, $rma_datas{remove_nets})) { unless (remove_valid_from($c, $rma_datas{remove_nets})) {
return $c->l('rma_ERROR_UPDATING_CONFIGURATION') . 'del net'; return $c->l('rma_ERROR_UPDATING_CONFIGURATION') . 'del net';
} }
} } ## end if ($rma_datas{remove_nets...})
# reset ipsec roadwarrior CA,server,client certificates # reset ipsec roadwarrior CA,server,client certificates
if ($rma_datas{ipsecrwReset}) { if ($rma_datas{ipsecrwReset}) {
@ -427,77 +354,62 @@ sub change_settings {
set_ipsecrw_sessions($c, $rma_datas{ipsecrwSess}); set_ipsecrw_sessions($c, $rma_datas{ipsecrwSess});
} }
unless ( unless (system("/sbin/e-smith/signal-event", "remoteaccess-update") == 0) {
system( "/sbin/e-smith/signal-event", "remoteaccess-update" ) == 0 )
{
return $c->l('rma_ERROR_UPDATING_CONFIGURATION'); return $c->l('rma_ERROR_UPDATING_CONFIGURATION');
} }
return 'OK'; return 'OK';
} } ## end sub change_settings
sub set_ipsecrw_sessions { sub set_ipsecrw_sessions {
my $c = shift; my $c = shift;
my $sessions = shift; my $sessions = shift;
if (defined $sessions) { if (defined $sessions) {
$db->get('ipsec')->set_prop('RoadWarriorSessions', $sessions); $db->get('ipsec')->set_prop('RoadWarriorSessions', $sessions);
if (int($sessions) > 0) { if (int($sessions) > 0) {
$db->get('ipsec')->set_prop('RoadWarriorStatus', 'enabled'); $db->get('ipsec')->set_prop('RoadWarriorStatus', 'enabled');
} }
} } ## end if (defined $sessions)
return ''; return '';
} } ## end sub set_ipsecrw_sessions
sub add_new_valid_from { sub add_new_valid_from {
my $c = shift; my $c = shift;
my $net = shift; my $net = shift;
my $mask = shift; my $mask = shift;
# we transform bit mask to regular mask # we transform bit mask to regular mask
$mask = get_reg_mask($net, $mask); $mask = get_reg_mask($net, $mask);
my $rec = $db->get('httpd-admin'); my $rec = $db->get('httpd-admin');
return $c->error('ERR_NO_RECORD') unless $rec; return $c->error('ERR_NO_RECORD') unless $rec;
my $prop = $rec->prop('ValidFrom') || ''; my $prop = $rec->prop('ValidFrom') || '';
my @vals = split /,/, $prop; my @vals = split /,/, $prop;
return '' if (grep /^$net\/$mask$/, @vals); # already have this entry return '' if (grep /^$net\/$mask$/, @vals); # already have this entry
if ($prop ne '') { if ($prop ne '') {
$prop .= ",$net/$mask"; $prop .= ",$net/$mask";
} } else {
else {
$prop = "$net/$mask"; $prop = "$net/$mask";
} }
$rec->set_prop('ValidFrom', $prop); $rec->set_prop('ValidFrom', $prop);
return 1; return 1;
} } ## end sub add_new_valid_from
sub remove_valid_from { sub remove_valid_from {
my $c = shift; my $c = shift;
my $remove_nets = shift; my $remove_nets = shift;
my @remove = split /,/, $remove_nets; my @remove = split /,/, $remove_nets;
# my @remove = $c->param('Remove_nets'); # my @remove = $c->param('Remove_nets');
my @vals = $c->_get_valid_from(); my @vals = $c->_get_valid_from();
foreach my $entry (@remove) { foreach my $entry (@remove) {
return undef unless $entry; return undef unless $entry;
my ($net, $mask) = split(/\//, $entry); my ($net, $mask) = split(/\//, $entry);
unless (@vals) { unless (@vals) {
print STDERR print STDERR "ERROR: unable to load ValidFrom property from conf db\n";
"ERROR: unable to load ValidFrom property from conf db\n";
return undef; return undef;
} }
@ -507,19 +419,15 @@ sub remove_valid_from {
# is $net alone or $net/255.255.255.255. we have to check for both # is $net alone or $net/255.255.255.255. we have to check for both
# in this special case... # in this special case...
@vals = (grep { $entry ne $_ && $net ne $_ } @vals); @vals = (grep { $entry ne $_ && $net ne $_ } @vals);
} } ## end foreach my $entry (@remove)
my $prop; my $prop;
if (@vals) { if (@vals) {
$prop = join ',', @vals; $prop = join ',', @vals;
} } else {
else {
$prop = ''; $prop = '';
} }
$db->get('httpd-admin')->set_prop('ValidFrom', $prop); $db->get('httpd-admin')->set_prop('ValidFrom', $prop);
return 1; return 1;
} } ## end sub remove_valid_from
1; 1;

View File

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

View File

@ -10,73 +10,56 @@ package SrvMngr::Controller::Review;
# heading-o : Configuration # heading-o : Configuration
# description-o : Review configuration # description-o : Review configuration
# navigation-o : 6000 6800 # navigation-o : 6000 6800
#---------------------------------------------------------------------- #----------------------------------------------------------------------
use strict; use strict;
use warnings; use warnings;
use Mojo::Base 'Mojolicious::Controller'; use Mojo::Base 'Mojolicious::Controller';
use Locale::gettext; use Locale::gettext;
use SrvMngr::I18N; use SrvMngr::I18N;
use SrvMngr qw(theme_list init_session); use SrvMngr qw(theme_list init_session);
#use SrvMngr::Review_sub qw(print_page); #use SrvMngr::Review_sub qw(print_page);
#use smeserver::Panel::review; #use smeserver::Panel::review;
use esmith::FormMagick::Panel::review; use esmith::FormMagick::Panel::review;
our $db = esmith::ConfigDB->open_ro || die "Couldn't open config db"; our $db = esmith::ConfigDB->open_ro || die "Couldn't open config db";
our $domains = esmith::DomainsDB->open_ro || die "Couldn't open domains"; our $domains = esmith::DomainsDB->open_ro || die "Couldn't open domains";
our $networks = esmith::NetworksDB->open_ro || die "Couldn't open networks"; our $networks = esmith::NetworksDB->open_ro || die "Couldn't open networks";
sub main { sub main {
my $c = shift; my $c = shift;
$c->app->log->info($c->log_req); $c->app->log->info($c->log_req);
my $title = $c->l('rvw_FORM_TITLE'); my $title = $c->l('rvw_FORM_TITLE');
my $modul = $c->render_to_string(inline => $c->l('rvw_DESCRIPTION')); my $modul = $c->render_to_string(inline => $c->l('rvw_DESCRIPTION'));
my %rvw_datas = (); my %rvw_datas = ();
$rvw_datas{'servermode'} = (get_value('', 'SystemMode') || ''); $rvw_datas{'servermode'} = (get_value('', 'SystemMode') || '');
$rvw_datas{'localip'} = get_value('$c','LocalIP' ) $rvw_datas{'localip'} = get_value('$c', 'LocalIP') . '/' . get_value('$c', 'LocalNetmask');
.'/'.get_value('$c','LocalNetmask'); $rvw_datas{'publicip'} = esmith::FormMagick::Panel::review->get_public_ip_address($c);
$rvw_datas{'publicip'} = $rvw_datas{'gateway'} = $c->render_to_string(inline => print2_gateway_stanza($c));
esmith::FormMagick::Panel::review->get_public_ip_address($c); $rvw_datas{'serveronly'} = $c->render_to_string(inline => print2_serveronly_stanza($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{'addlocalnetworks'} = get_local_networks($c);
$rvw_datas{'dhcpserver'} = $rvw_datas{'dhcpserver'} = $c->render_to_string(inline => print2_dhcp_stanza($c));
$c->render_to_string(inline => print2_dhcp_stanza($c));
$rvw_datas{'dnsserver'} = (get_value('', 'LocalIP') || ''); $rvw_datas{'dnsserver'} = (get_value('', 'LocalIP') || '');
$rvw_datas{'webserver'} = 'www.' . (get_local_domain()); $rvw_datas{'webserver'} = 'www.' . (get_local_domain());
my $port = $db->get_prop("squid", "TransparentPort") || 3128; my $port = $db->get_prop("squid", "TransparentPort") || 3128;
$rvw_datas{'proxyserver'} = 'proxy.' . get_local_domain() . ":$port"; $rvw_datas{'proxyserver'} = 'proxy.' . get_local_domain() . ":$port";
$rvw_datas{'ftpserver'} = 'ftp.' . get_local_domain(); $rvw_datas{'ftpserver'} = 'ftp.' . get_local_domain();
$rvw_datas{'smtpserver'} = 'mail.' . get_local_domain(); $rvw_datas{'smtpserver'} = 'mail.' . get_local_domain();
$rvw_datas{'domainname'} = (get_value('', 'DomainName') || ''); $rvw_datas{'domainname'} = (get_value('', 'DomainName') || '');
$rvw_datas{'virtualdomains'} = $rvw_datas{'virtualdomains'} = $c->render_to_string(inline => gen2_domains($c));
$c->render_to_string(inline => gen2_domains($c));
$rvw_datas{'primarywebsite'} = 'http://www.' . get_value('', 'DomainName'); $rvw_datas{'primarywebsite'} = 'http://www.' . get_value('', 'DomainName');
$rvw_datas{'servermanager'} = 'https://' . (get_value('', 'SystemName') || 'localhost') . '/server-manager/'; $rvw_datas{'servermanager'} = 'https://' . (get_value('', 'SystemName') || 'localhost') . '/server-manager/';
$rvw_datas{'usermanager'} = 'https://' . (get_value('', 'SystemName') || 'localhost') . '/user-password/'; $rvw_datas{'usermanager'} = 'https://' . (get_value('', 'SystemName') || 'localhost') . '/user-password/';
$rvw_datas{'emailaddresses'} = $rvw_datas{'emailaddresses'} = $c->render_to_string(inline => gen2_email_addresses($c));
$c->render_to_string(inline => gen2_email_addresses($c));
#$c->stash( releaseVersion => $c->session->{releaseVersion}, copyRight => $c->session->{copyRight}, #$c->stash( releaseVersion => $c->session->{releaseVersion}, copyRight => $c->session->{copyRight},
#PwdSet => $c->session->{PwdSet}, Unsafe => $c->session->{Unsafe}, #PwdSet => $c->session->{PwdSet}, Unsafe => $c->session->{Unsafe},
$c->stash( title => $title, modul => $modul, rvw_datas => \%rvw_datas, $c->stash(
title => $title,
modul => $modul,
rvw_datas => \%rvw_datas,
); );
$c->render(template => 'review'); $c->render(template => 'review');
} ## end sub main
}
=head2 gen2_email_addresses =head2 gen2_email_addresses
@ -87,19 +70,27 @@ sub main {
sub gen2_email_addresses { sub gen2_email_addresses {
my $c = shift; my $c = shift;
my $domain = get_value($c, 'DomainName'); my $domain = get_value($c, 'DomainName');
my $useraccount = $c->l("rvw_EMAIL_USERACCOUNT"); my $useraccount = $c->l("rvw_EMAIL_USERACCOUNT");
my $firstname = $c->l("rvw_EMAIL_FIRSTNAME"); my $firstname = $c->l("rvw_EMAIL_FIRSTNAME");
my $lastname = $c->l("rvw_EMAIL_LASTNAME"); my $lastname = $c->l("rvw_EMAIL_LASTNAME");
my $out
my $out = "<I>" . $useraccount . "</I>\@" . $domain . "<BR>" = "<I>"
. "<I>" . $firstname . "</I>.<I>" . $lastname . "</I>\@" . $domain . "<BR>" . $useraccount
. "<I>" . $firstname . "</I>_<I>" . $lastname . "</I>\@" . $domain . "<BR>"; . "</I>\@"
. $domain . "<BR>" . "<I>"
. $firstname
. "</I>.<I>"
. $lastname
. "</I>\@"
. $domain . "<BR>" . "<I>"
. $firstname
. "</I>_<I>"
. $lastname
. "</I>\@"
. $domain . "<BR>";
return $out; return $out;
} } ## end sub gen2_email_addresses
=head2 gen2_domains =head2 gen2_domains
@ -110,25 +101,24 @@ sub gen2_email_addresses {
sub gen2_domains { sub gen2_domains {
my $c = shift; my $c = shift;
my @virtual = $domains->get_all_by_prop(type => 'domain'); my @virtual = $domains->get_all_by_prop(type => 'domain');
my $numvirtual = @virtual; my $numvirtual = @virtual;
if ($numvirtual == 0) { if ($numvirtual == 0) {
$c->localise("NO_VIRTUAL_DOMAINS"); $c->localise("NO_VIRTUAL_DOMAINS");
} } else {
else {
my $out = ""; my $out = "";
my $domain; my $domain;
foreach $domain (sort @virtual) { foreach $domain (sort @virtual) {
if ($out ne "") { if ($out ne "") {
$out .= "<BR>"; $out .= "<BR>";
} }
$out .= $domain->key; $out .= $domain->key;
} } ## end foreach $domain (sort @virtual)
return $out; return $out;
} } ## end else [ if ($numvirtual == 0) ]
} } ## end sub gen2_domains
=head2 get2_local_networks =head2 get2_local_networks
@ -139,32 +129,27 @@ serving. (mojo ver)
sub get2_local_networks { sub get2_local_networks {
my $c = shift; my $c = shift;
my @nets = $networks->get_all_by_prop('type' => 'network'); my @nets = $networks->get_all_by_prop('type' => 'network');
my $numNetworks = @nets; my $numNetworks = @nets;
if ($numNetworks == 0) { if ($numNetworks == 0) {
return $c->l('rvw_NO_NETWORKS'); return $c->l('rvw_NO_NETWORKS');
} } else {
else {
my $out = ""; my $out = "";
foreach my $network (sort @nets) { foreach my $network (sort @nets) {
if ($out ne "") { if ($out ne "") {
$out .= "<BR>"; $out .= "<BR>";
} }
$out .= $network->key . "/" . get_net_prop($c, $network->key, 'Mask'); $out .= $network->key . "/" . get_net_prop($c, $network->key, 'Mask');
if (defined get_net_prop($c, $network->key, 'Router')) { if (defined get_net_prop($c, $network->key, 'Router')) {
$out .= " via " . get_net_prop($c, $network->key, 'Router'); $out .= " via " . get_net_prop($c, $network->key, 'Router');
} }
} } ## end foreach my $network (sort @nets)
return $out; return $out;
} } ## end else [ if ($numNetworks == 0)]
} ## end sub get2_local_networks
}
=head2 print2_gateway_stanza =head2 print2_gateway_stanza
@ -172,28 +157,28 @@ If this system is a server gateway, show the external ip and gateway ip (mojo ve
=cut =cut
sub print2_gateway_stanza sub print2_gateway_stanza {
{
my $c = shift; my $c = shift;
if (get_value($c,'SystemMode') =~ /servergateway/)
{ if (get_value($c, 'SystemMode') =~ /servergateway/) {
my $ip = get_value($c, 'ExternalIP'); my $ip = get_value($c, 'ExternalIP');
my $static = my $static
(get_value($c, 'AccessType') eq 'dedicated') && = (get_value($c, 'AccessType') eq 'dedicated')
(get_value($c, 'ExternalDHCP') eq 'off') && && (get_value($c, 'ExternalDHCP') eq 'off')
(get_prop($c, 'pppoe', 'status') eq 'disabled'); && (get_prop($c, 'pppoe', 'status') eq 'disabled');
if ($static)
{ if ($static) {
$ip .= "/" . get_value($c, 'ExternalNetmask'); $ip .= "/" . get_value($c, 'ExternalNetmask');
} }
my $out = $c->l('rvw_EXTERNAL_IP_ADDRESS_SUBNET_MASK') . ':' . $ip; my $out = $c->l('rvw_EXTERNAL_IP_ADDRESS_SUBNET_MASK') . ':' . $ip;
if ($static)
{ if ($static) {
$out .= $c->l('rvw_GATEWAY') . ':' . get_value($c, 'GatewayIP'); $out .= $c->l('rvw_GATEWAY') . ':' . get_value($c, 'GatewayIP');
} }
return $out return $out;
} } ## end if (get_value($c, 'SystemMode'...))
} } ## end sub print2_gateway_stanza
=head2 print2_serveronly_stanza =head2 print2_serveronly_stanza
If this system is a standalone server with net access, show the external If this system is a standalone server with net access, show the external
@ -203,13 +188,14 @@ gateway IP (mojo ver)
sub print2_serveronly_stanza { sub print2_serveronly_stanza {
my $c = shift; 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') );
}
} 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 =head2 print2_dhcp_stanza
@ -227,9 +213,7 @@ sub print2_dhcp_stanza {
$out .= (get_prop($c, 'dhcpd', 'start') || '') . '<br>'; $out .= (get_prop($c, 'dhcpd', 'start') || '') . '<br>';
$out .= $c->l('rvw_END_OF_DHCP_ADDRESS_RANGE') . ':'; $out .= $c->l('rvw_END_OF_DHCP_ADDRESS_RANGE') . ':';
$out .= (get_prop($c, 'dhcpd', 'end') || ''); $out .= (get_prop($c, 'dhcpd', 'end') || '');
} } ## end if (get_prop($c, 'dhcpd'...))
return $out; return $out;
} } ## end sub print2_dhcp_stanza
1; 1;

View File

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

View File

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

View File

@ -1,29 +1,23 @@
package SrvMngr::Controller::Swttheme; package SrvMngr::Controller::Swttheme;
# #
# routes : end # routes : end
#---------------------------------------------------------------------- #----------------------------------------------------------------------
use strict; use strict;
use warnings; use warnings;
use Mojo::Base 'Mojolicious::Controller'; use Mojo::Base 'Mojolicious::Controller';
#use SrvMngr qw(theme_list init_session); #use SrvMngr qw(theme_list init_session);
our $db = esmith::ConfigDB->open() || die "Couldn't open config db"; our $db = esmith::ConfigDB->open() || die "Couldn't open config db";
sub main { sub main {
my $c = shift; my $c = shift;
my $from = $c->param('From') || '/'; my $from = $c->param('From') || '/';
my $theme = $c->param('Theme'); my $theme = $c->param('Theme');
$c->app->log->info(" swt theme '$from' '$theme' "); $c->app->log->info(" swt theme '$from' '$theme' ");
my $oldTheme = $c->session->{CurrentTheme}; my $oldTheme = $c->session->{CurrentTheme};
if ($theme ne $oldTheme) { if ($theme ne $oldTheme) {
# $c->app->renderer->paths([$c->app->home->rel_file('themes/default/templates')]); # $c->app->renderer->paths([$c->app->home->rel_file('themes/default/templates')]);
# $c->app->static->paths([$c->app->home->rel_file('themes/default/public')]); # $c->app->static->paths([$c->app->home->rel_file('themes/default/public')]);
# if ( $theme ne 'default' ) { # if ( $theme ne 'default' ) {
@ -33,19 +27,13 @@ sub main {
# unshift @{$c->app->static->paths}, $t_path.'/public' if -d $t_path.'/public'; # unshift @{$c->app->static->paths}, $t_path.'/public' if -d $t_path.'/public';
# } # }
$c->session->{CurrentTheme} = $theme; $c->session->{CurrentTheme} = $theme;
$db->get('smanager')->set_prop('Theme', $theme); $db->get('smanager')->set_prop('Theme', $theme);
system("/sbin/e-smith/signal-event smanager-theme-change") == 0 system("/sbin/e-smith/signal-event smanager-theme-change") == 0
or warn "$c->l('ERROR_UPDATING')"; or warn "$c->l('ERROR_UPDATING')";
} } ## end if ($theme ne $oldTheme)
## (not sure) $c->flash( warning => $c->l('swt_LOGIN_AGAIN') ); ## (not sure) $c->flash( warning => $c->l('swt_LOGIN_AGAIN') );
$from = '/initial' if $from eq '/'; $from = '/initial' if $from eq '/';
$from = '/' . $from if ($from !~ m|^\/|); $from = '/' . $from if ($from !~ m|^\/|);
$c->redirect_to($from); $c->redirect_to($from);
} ## end sub main
}
1; 1;

View File

@ -11,7 +11,6 @@ package SrvMngr::Controller::Useraccounts;
use strict; use strict;
use warnings; use warnings;
use Mojo::Base 'Mojolicious::Controller'; use Mojo::Base 'Mojolicious::Controller';
use Locale::gettext; use Locale::gettext;
use SrvMngr::I18N; use SrvMngr::I18N;
use SrvMngr qw(theme_list init_session use SrvMngr qw(theme_list init_session
@ -19,7 +18,6 @@ use SrvMngr qw(theme_list init_session
#use esmith::FormMagick qw( validate_password ); #use esmith::FormMagick qw( validate_password );
#use CGI::FormMagick::Validator qw( call_fm_validation ); #use CGI::FormMagick::Validator qw( call_fm_validation );
use esmith::AccountsDB; use esmith::AccountsDB;
use esmith::ConfigDB; use esmith::ConfigDB;
use esmith::util; use esmith::util;
@ -29,48 +27,34 @@ use esmith::util;
#use File::Basename; #use File::Basename;
#use Exporter; #use Exporter;
#use Carp qw(verbose); #use Carp qw(verbose);
#use esmith::FormMagick::Panel::useraccounts; #use esmith::FormMagick::Panel::useraccounts;
our $adb = esmith::AccountsDB->open || die "Couldn't open accounts db"; our $adb = esmith::AccountsDB->open || die "Couldn't open accounts db";
our $cdb = esmith::ConfigDB->open() || die "Couldn't open config db"; our $cdb = esmith::ConfigDB->open() || die "Couldn't open config db";
sub main { sub main {
my $c = shift; my $c = shift;
$c->app->log->info($c->log_req); $c->app->log->info($c->log_req);
my $notif = ''; my $notif = '';
my %usr_datas = (); my %usr_datas = ();
my $title = $c->l('usr_FORM_TITLE'); my $title = $c->l('usr_FORM_TITLE');
$usr_datas{'trt'} = 'LIST'; $usr_datas{'trt'} = 'LIST';
my @users = $adb->get('admin'); my @users = $adb->get('admin');
push @users, $adb->users(); push @users, $adb->users();
$c->stash(title => $title, notif => $notif, usr_datas => \%usr_datas, users => \@users); $c->stash(title => $title, notif => $notif, usr_datas => \%usr_datas, users => \@users);
$c->render(template => 'useraccounts'); $c->render(template => 'useraccounts');
} ## end sub main
};
sub do_display { sub do_display {
my $c = shift; my $c = shift;
my $rt = $c->current_route; my $rt = $c->current_route;
my $trt = ($c->param('trt') || 'ADD'); my $trt = ($c->param('trt') || 'ADD');
my $user = ($c->param('user') || ''); my $user = ($c->param('user') || '');
my %usr_datas = (); my %usr_datas = ();
my $title = $c->l('usr_FORM_TITLE'); my $title = $c->l('usr_FORM_TITLE');
my ($notif, $modul) = ''; my ($notif, $modul) = '';
$usr_datas{'trt'} = $trt; $usr_datas{'trt'} = $trt;
if ($trt eq 'ADD') { if ($trt eq 'ADD') {
$usr_datas{user} = ''; $usr_datas{user} = '';
$usr_datas{firstname} = ''; $usr_datas{firstname} = '';
$usr_datas{lastname} = ''; $usr_datas{lastname} = '';
@ -79,12 +63,12 @@ sub do_display {
$usr_datas{street} = $c->get_ldap_value('Street'); $usr_datas{street} = $c->get_ldap_value('Street');
$usr_datas{city} = $c->get_ldap_value('City'); $usr_datas{city} = $c->get_ldap_value('City');
$usr_datas{phone} = $c->get_ldap_value('Phone'); $usr_datas{phone} = $c->get_ldap_value('Phone');
} } ## end if ($trt eq 'ADD')
if ($trt eq 'UPD' or $trt eq 'UPS') { if ($trt eq 'UPD' or $trt eq 'UPS') {
my $rec = $adb->get($user); my $rec = $adb->get($user);
my $type = ($trt eq 'UPS') ? 'system' : 'user'; my $type = ($trt eq 'UPS') ? 'system' : 'user';
if ($rec and $rec->prop('type') eq $type) { if ($rec and $rec->prop('type') eq $type) {
$usr_datas{user} = $user; $usr_datas{user} = $user;
$usr_datas{firstname} = $rec->prop('FirstName'); $usr_datas{firstname} = $rec->prop('FirstName');
@ -92,86 +76,72 @@ sub do_display {
$usr_datas{vpnclientaccess} = $rec->prop('VPNClientAccess'); $usr_datas{vpnclientaccess} = $rec->prop('VPNClientAccess');
$usr_datas{emailforward} = $rec->prop('EmailForward'); $usr_datas{emailforward} = $rec->prop('EmailForward');
$usr_datas{forwardaddress} = $rec->prop('ForwardAddress'); $usr_datas{forwardaddress} = $rec->prop('ForwardAddress');
if ($trt eq 'UPD') { if ($trt eq 'UPD') {
$usr_datas{dept} = $rec->prop('Dept'); $usr_datas{dept} = $rec->prop('Dept');
$usr_datas{company} = $rec->prop('Company'); $usr_datas{company} = $rec->prop('Company');
$usr_datas{street} = $rec->prop('Street'); $usr_datas{street} = $rec->prop('Street');
$usr_datas{city} = $rec->prop('City'); $usr_datas{city} = $rec->prop('City');
$usr_datas{phone} = $rec->prop('Phone'); $usr_datas{phone} = $rec->prop('Phone');
} } ## end if ($trt eq 'UPD')
} } ## end if ($rec and $rec->prop...)
} } ## end if ($trt eq 'UPD' or $trt...)
if ($trt eq 'DEL') { if ($trt eq 'DEL') {
my $rec = $adb->get($user); my $rec = $adb->get($user);
if ($rec and $rec->prop('type') eq 'user') { if ($rec and $rec->prop('type') eq 'user') {
$usr_datas{user} = $user; $usr_datas{user} = $user;
$usr_datas{name} = $c->get_user_name($user); $usr_datas{name} = $c->get_user_name($user);
} }
} ## end if ($trt eq 'DEL')
}
if ($trt eq 'PWD' or $trt eq 'PWS') { if ($trt eq 'PWD' or $trt eq 'PWS') {
my $rec = $adb->get($user); my $rec = $adb->get($user);
my $type = ($trt eq 'PWS') ? 'system' : 'user'; my $type = ($trt eq 'PWS') ? 'system' : 'user';
if ($rec and $rec->prop('type') eq $type) { if ($rec and $rec->prop('type') eq $type) {
$usr_datas{user} = $user; $usr_datas{user} = $user;
$usr_datas{name} = $c->get_user_name($user); $usr_datas{name} = $c->get_user_name($user);
} }
} ## end if ($trt eq 'PWD' or $trt...)
}
if ($trt eq 'LCK') { if ($trt eq 'LCK') {
my $rec = $adb->get($user); my $rec = $adb->get($user);
if ($rec and $rec->prop('type') eq 'user') { if ($rec and $rec->prop('type') eq 'user') {
$usr_datas{user} = $user; $usr_datas{user} = $user;
$usr_datas{name} = $c->get_user_name($user); $usr_datas{name} = $c->get_user_name($user);
} }
} ## end if ($trt eq 'LCK')
}
if ($trt eq 'LIST') { if ($trt eq 'LIST') {
my @useraccounts; my @useraccounts;
if ($adb)
{ if ($adb) {
@useraccounts = $adb->useraccounts(); @useraccounts = $adb->useraccounts();
} }
$c->stash(useraccounts => \@useraccounts); $c->stash(useraccounts => \@useraccounts);
} ## end if ($trt eq 'LIST')
}
$c->stash(title => $title, notif => $notif, usr_datas => \%usr_datas); $c->stash(title => $title, notif => $notif, usr_datas => \%usr_datas);
$c->render(template => 'useraccounts'); $c->render(template => 'useraccounts');
} ## end sub do_display
};
sub do_update { sub do_update {
my $c = shift; my $c = shift;
$c->app->log->info($c->log_req); $c->app->log->info($c->log_req);
my $rt = $c->current_route; my $rt = $c->current_route;
my $trt = ($c->param('trt') || 'LIST'); my $trt = ($c->param('trt') || 'LIST');
my $user = ($c->param('user') || ''); my $user = ($c->param('user') || '');
my $name = ($c->param('name') || ''); my $name = ($c->param('name') || '');
my %usr_datas = (); my %usr_datas = ();
$usr_datas{trt} = $trt; $usr_datas{trt} = $trt;
my $title = $c->l('usr_FORM_TITLE'); my $title = $c->l('usr_FORM_TITLE');
my ($res, $result) = ''; my ($res, $result) = '';
if ($trt eq 'ADD') { if ($trt eq 'ADD') {
# controls # controls
my $first = $c->param('FirstName'); my $first = $c->param('FirstName');
my $last = $c->param('LastName'); my $last = $c->param('LastName');
my $mail = $c->param('ForwardAddress'); my $mail = $c->param('ForwardAddress');
@ -179,22 +149,20 @@ sub do_update {
unless ($first) { unless ($first) {
$result .= $c->l('FM_NONBLANK') . ' - '; $result .= $c->l('FM_NONBLANK') . ' - ';
} }
unless ($last) { unless ($last) {
$result .= $c->l('FM_NONBLANK') . ' - '; $result .= $c->l('FM_NONBLANK') . ' - ';
} }
#unless ( $mail ) { #unless ( $mail ) {
# $result .= $c->l('FM_NONBLANK') . ' - '; # $result .= $c->l('FM_NONBLANK') . ' - ';
#} #}
$res = $c->validate_acctName($user); $res = $c->validate_acctName($user);
$result .= $res unless $res eq 'OK'; $result .= $res unless $res eq 'OK';
$res = $c->validate_acctName_length($user); $res = $c->validate_acctName_length($user);
$result .= $res unless $res eq 'OK'; $result .= $res unless $res eq 'OK';
$res = $c->validate_acctName_conflict($user); $res = $c->validate_acctName_conflict($user);
$result .= $res unless $res eq 'OK'; $result .= $res unless $res eq 'OK';
$res = $c->pseudonym_clash($first); $res = $c->pseudonym_clash($first);
$result .= $res unless $res eq 'OK'; $result .= $res unless $res eq 'OK';
@ -204,22 +172,20 @@ sub do_update {
} }
#$result .= 'Blocked for testing'; #$result .= 'Blocked for testing';
if (!$result) { if (!$result) {
$res = create_user($c, $user); $res = create_user($c, $user);
$result .= $res unless $res eq 'OK'; $result .= $res unless $res eq 'OK';
if (!$result) { if (!$result) {
$result = $c->l('usrUSER_CREATED') . ' ' . $user; $result = $c->l('usrUSER_CREATED') . ' ' . $user;
$usr_datas{trt} = 'SUC'; $usr_datas{trt} = 'SUC';
} }
} } ## end if (!$result)
} } ## end if ($trt eq 'ADD')
if ($trt eq 'UPD' or $trt eq 'UPS') { if ($trt eq 'UPD' or $trt eq 'UPS') {
# controls # controls
my $first = $c->param('FirstName'); my $first = $c->param('FirstName');
my $last = $c->param('LastName'); my $last = $c->param('LastName');
my $mail = $c->param('ForwardAddress'); my $mail = $c->param('ForwardAddress');
@ -227,6 +193,7 @@ sub do_update {
unless ($first) { unless ($first) {
$result .= $c->l('FM_NONBLANK') . ' - '; $result .= $c->l('FM_NONBLANK') . ' - ';
} }
unless ($last) { unless ($last) {
$result .= $c->l('FM_NONBLANK') . ' - '; $result .= $c->l('FM_NONBLANK') . ' - ';
} }
@ -234,7 +201,6 @@ sub do_update {
#unless ( $mail ) { #unless ( $mail ) {
# $result .= $c->l('FM_NONBLANK') . ' - '; # $result .= $c->l('FM_NONBLANK') . ' - ';
#} #}
$res = $c->pseudonym_clash($first); $res = $c->pseudonym_clash($first);
$result .= $res unless $res eq 'OK'; $result .= $res unless $res eq 'OK';
@ -243,27 +209,24 @@ sub do_update {
$result .= $res unless $res eq 'OK'; $result .= $res unless $res eq 'OK';
} }
#$result .= 'Blocked for testing'; #$result .= 'Blocked for testing';
if (!$result) { if (!$result) {
if ($trt eq 'UPS') { if ($trt eq 'UPS') {
$res = $c->modify_admin(); $res = $c->modify_admin();
} else { } else {
$res = $c->modify_user($user); $res = $c->modify_user($user);
} }
$result .= $res unless $res eq 'OK'; $result .= $res unless $res eq 'OK';
if (!$result) { if (!$result) {
$result = $c->l('usr_USER_MODIFIED') . ' ' . $user; $result = $c->l('usr_USER_MODIFIED') . ' ' . $user;
$usr_datas{trt} = 'SUC'; $usr_datas{trt} = 'SUC';
} }
} } ## end if (!$result)
} } ## end if ($trt eq 'UPD' or $trt...)
if ($trt eq 'PWD') { if ($trt eq 'PWD') {
my $pass1 = $c->param('newPass'); my $pass1 = $c->param('newPass');
my $pass2 = $c->param('newPassVerify'); my $pass2 = $c->param('newPassVerify');
@ -271,6 +234,7 @@ sub do_update {
unless ($pass1) { unless ($pass1) {
$result .= $c->l('FM_NONBLANK') . ' - '; $result .= $c->l('FM_NONBLANK') . ' - ';
} }
unless ($pass1 eq $pass2) { unless ($pass1 eq $pass2) {
$result .= $c->l('PASSWORD_VERIFY_ERROR') . ' - '; $result .= $c->l('PASSWORD_VERIFY_ERROR') . ' - ';
} }
@ -283,20 +247,20 @@ sub do_update {
if ($user eq 'admin') { if ($user eq 'admin') {
$result .= "System password should not be reset here !"; $result .= "System password should not be reset here !";
} }
#$result .= 'Blocked for testing';
#$result .= 'Blocked for testing';
if (!$result) { if (!$result) {
my $res = $c->reset_password($user, $pass1); my $res = $c->reset_password($user, $pass1);
$result .= $res unless $res eq 'OK'; $result .= $res unless $res eq 'OK';
if (!$result) { if (!$result) {
$result = $c->l('usr_PASSWORD_CHANGE_SUCCEEDED', $user); $result = $c->l('usr_PASSWORD_CHANGE_SUCCEEDED', $user);
$usr_datas{trt} = 'SUC'; $usr_datas{trt} = 'SUC';
} }
} } ## end if (!$result)
} } ## end if ($trt eq 'PWD')
if ($trt eq 'PWS') { # system password reset (admin) if ($trt eq 'PWS') { # system password reset (admin)
my $curpass = $c->param('CurPass'); my $curpass = $c->param('CurPass');
my $pass1 = $c->param('Pass'); my $pass1 = $c->param('Pass');
my $pass2 = $c->param('PassVerify'); my $pass2 = $c->param('PassVerify');
@ -320,85 +284,77 @@ sub do_update {
if (!$result) { if (!$result) {
$res = $c->system_validate_password($pass1); $res = $c->system_validate_password($pass1);
$result .= $res unless $res eq 'OK'; $result .= $res unless $res eq 'OK';
$res = $c->system_check_password($pass1); $res = $c->system_check_password($pass1);
$result .= $res unless $res eq 'OK'; $result .= $res unless $res eq 'OK';
} } ## end if (!$result)
#$result .= 'Blocked for testing'; #$result .= 'Blocked for testing';
if (!$result) { if (!$result) {
my $res = $c->system_change_password(); my $res = $c->system_change_password();
$result .= $res unless $res eq 'OK'; $result .= $res unless $res eq 'OK';
if (!$result) { if (!$result) {
$result = $c->l('usr_SYSTEM_PASSWORD_CHANGED', $user); $result = $c->l('usr_SYSTEM_PASSWORD_CHANGED', $user);
$usr_datas{trt} = 'SUC'; $usr_datas{trt} = 'SUC';
} }
} } ## end if (!$result)
} } ## end if ($trt eq 'PWS')
if ($trt eq 'LCK') { if ($trt eq 'LCK') {
# controls # controls
#$res = xxxxxxxxxxx(); #$res = xxxxxxxxxxx();
#$result .= $res unless $res eq 'OK'; #$result .= $res unless $res eq 'OK';
#$result .= 'Blocked for testing'; #$result .= 'Blocked for testing';
if (!$result) { if (!$result) {
my $res = $c->lock_account($user); my $res = $c->lock_account($user);
$result .= $res unless $res eq 'OK'; $result .= $res unless $res eq 'OK';
if (!$result) { if (!$result) {
$result = $c->l('usr_LOCKED_ACCOUNT', $user); $result = $c->l('usr_LOCKED_ACCOUNT', $user);
$usr_datas{trt} = 'SUC'; $usr_datas{trt} = 'SUC';
} }
} } ## end if (!$result)
} } ## end if ($trt eq 'LCK')
if ($trt eq 'DEL') { if ($trt eq 'DEL') {
# controls # controls
#$res = xxxxxxxxxxx(); #$res = xxxxxxxxxxx();
#$result .= $res unless $res eq 'OK'; #$result .= $res unless $res eq 'OK';
#$result .= 'Blocked for testing'; #$result .= 'Blocked for testing';
if (!$result) { if (!$result) {
my $res = $c->remove_account($user); my $res = $c->remove_account($user);
$result .= $res unless $res eq 'OK'; $result .= $res unless $res eq 'OK';
if (!$result) { if (!$result) {
$result = $c->l('usr_SUCCESSFULLY_DELETED_USER') . ' ' . $user; $result = $c->l('usr_SUCCESSFULLY_DELETED_USER') . ' ' . $user;
$usr_datas{trt} = 'SUC'; $usr_datas{trt} = 'SUC';
} }
} } ## end if (!$result)
} } ## end if ($trt eq 'DEL')
$usr_datas{'user'} = $user; $usr_datas{'user'} = $user;
$usr_datas{'name'} = $name; $usr_datas{'name'} = $name;
$c->stash(title => $title, notif => $result, usr_datas => \%usr_datas); $c->stash(title => $title, notif => $result, usr_datas => \%usr_datas);
if ($usr_datas{trt} ne 'SUC') { if ($usr_datas{trt} ne 'SUC') {
return $c->render(template => 'useraccounts'); return $c->render(template => 'useraccounts');
} }
$c->redirect_to('/useraccounts'); $c->redirect_to('/useraccounts');
} ## end sub do_update
};
sub lock_account { sub lock_account {
my $c = shift; my $c = shift;
my $user = $c->param('user'); my $user = $c->param('user');
my $acct = $adb->get($user); my $acct = $adb->get($user);
if ($acct->prop('type') eq "user") { if ($acct->prop('type') eq "user") {
undef $adb; undef $adb;
# Untaint the username before use in system() # Untaint the username before use in system()
$user =~ /^(\w[\-\w_\.]*)$/; $user =~ /^(\w[\-\w_\.]*)$/;
$user = $1; $user = $1;
if (system("/sbin/e-smith/signal-event", "user-lock", $user)) { if (system("/sbin/e-smith/signal-event", "user-lock", $user)) {
$adb = esmith::AccountsDB->open(); $adb = esmith::AccountsDB->open();
return $c->l("usr_ERR_OCCURRED_LOCKING"); return $c->l("usr_ERR_OCCURRED_LOCKING");
@ -408,36 +364,32 @@ sub lock_account {
} else { } else {
return $c->l('NO_SUCH_USER', $user); return $c->l('NO_SUCH_USER', $user);
} }
} } ## end sub lock_account
sub remove_account { sub remove_account {
my ($c) = @_; my ($c) = @_;
my $user = $c->param('user'); my $user = $c->param('user');
my $acct = $adb->get($user); my $acct = $adb->get($user);
if ($acct->prop('type') eq 'user') { if ($acct->prop('type') eq 'user') {
$acct->set_prop('type', 'user-deleted'); $acct->set_prop('type', 'user-deleted');
undef $adb; undef $adb;
# Untaint the username before use in system() # Untaint the username before use in system()
$user =~ /^(\w[\-\w_\.]*)$/; $user =~ /^(\w[\-\w_\.]*)$/;
$user = $1; $user = $1;
if (system ("/sbin/e-smith/signal-event", "user-delete", $user))
{ if (system("/sbin/e-smith/signal-event", "user-delete", $user)) {
$adb = esmith::AccountsDB->open(); $adb = esmith::AccountsDB->open();
return $c->l("ERR_OCCURRED_DELETING"); return $c->l("ERR_OCCURRED_DELETING");
} }
$adb = esmith::AccountsDB->open(); $adb = esmith::AccountsDB->open();
$adb->get($user)->delete; $adb->get($user)->delete;
return 'OK'; return 'OK';
} else { } else {
return $c->l('NO_SUCH_USER', $user); return $c->l('NO_SUCH_USER', $user);
} }
} } ## end sub remove_account
sub reset_password { sub reset_password {
my ($c, $user, $passw1) = @_; my ($c, $user, $passw1) = @_;
@ -446,56 +398,43 @@ sub reset_password {
return $c->l('usr_TAINTED_USER'); return $c->l('usr_TAINTED_USER');
} }
$user = $1; $user = $1;
my $acct = $adb->get($user); my $acct = $adb->get($user);
if ($acct->prop('type') eq "user") { if ($acct->prop('type') eq "user") {
esmith::util::setUserPassword($user, $passw1); esmith::util::setUserPassword($user, $passw1);
$acct->set_prop("PasswordSet", "yes"); $acct->set_prop("PasswordSet", "yes");
undef $adb; undef $adb;
if (system("/sbin/e-smith/signal-event", "password-modify", $user)) if (system("/sbin/e-smith/signal-event", "password-modify", $user)) {
{
$adb = esmith::AccountsDB->open(); $adb = esmith::AccountsDB->open();
return $c->l("usr_ERR_OCCURRED_MODIFYING_PASSWORD"); return $c->l("usr_ERR_OCCURRED_MODIFYING_PASSWORD");
} }
$adb = esmith::AccountsDB->open(); $adb = esmith::AccountsDB->open();
return 'OK'; return 'OK';
} else { } else {
return $c->l('NO_SUCH_USER', $user); return $c->l('NO_SUCH_USER', $user);
} }
} } ## end sub reset_password
sub check_password { sub check_password {
my $c = shift; my $c = shift;
my $pass1 = shift; my $pass1 = shift;
my $check_type; my $check_type;
my $rec = $cdb->get('passwordstrength'); my $rec = $cdb->get('passwordstrength');
$check_type = ($rec ? ($rec->prop('Users') || 'none') : 'none'); $check_type = ($rec ? ($rec->prop('Users') || 'none') : 'none');
return validate_password($c, $check_type, $pass1); return validate_password($c, $check_type, $pass1);
} } ## end sub check_password
sub validate_password { sub validate_password {
my ($c, $strength, $pass) = @_; my ($c, $strength, $pass) = @_;
use Crypt::Cracklib; use Crypt::Cracklib;
my $reason; my $reason;
if ($strength eq "none") { if ($strength eq "none") {
return $c->l("Passwords must be at least 7 characters long") unless (length($pass) > 6); return $c->l("Passwords must be at least 7 characters long") unless (length($pass) > 6);
return "OK"; return "OK";
} }
$reason = is_normal_password($c, $pass, undef); $reason = is_normal_password($c, $pass, undef);
return $reason unless ($reason eq "OK"); return $reason unless ($reason eq "OK");
return "OK" unless ($strength eq "strong"); return "OK" unless ($strength eq "strong");
@ -505,28 +444,24 @@ sub validate_password {
$reason = fascist_check($pass, '/usr/lib/cracklib_dict'); $reason = fascist_check($pass, '/usr/lib/cracklib_dict');
} }
$reason ||= "Software error: password check failed"; $reason ||= "Software error: password check failed";
return "OK" if ($reason eq "ok"); return "OK" if ($reason eq "ok");
return
return $c->l("Bad Password Choice") . ": " $c->l("Bad Password Choice") . ": "
. $c->l("The password you have chosen is not a good choice, because") . $c->l("The password you have chosen is not a good choice, because") . " "
. " " . $c->($reason) . "."; . $c->($reason) . ".";
} } ## end sub validate_password
sub emailForward_list { sub emailForward_list {
my $c = shift; my $c = shift;
return [
return [[ $c->l('usr_DELIVER_EMAIL_LOCALLY') => 'local'], [ $c->l('usr_DELIVER_EMAIL_LOCALLY') => 'local' ],
[ $c->l('usr_FORWARD_EMAIL') => 'forward' ], [ $c->l('usr_FORWARD_EMAIL') => 'forward' ],
[ $c->l('usr_DELIVER_AND_FORWARD') => 'both']]; [ $c->l('usr_DELIVER_AND_FORWARD') => 'both' ]
} ];
} ## end sub emailForward_list
sub max_user_name_length { sub max_user_name_length {
my ($c, $data) = @_; my ($c, $data) = @_;
$cdb->reload(); $cdb->reload();
my $max = $cdb->get('maxuserNameLength')->value; my $max = $cdb->get('maxuserNameLength')->value;
@ -535,39 +470,32 @@ sub max_user_name_length {
} else { } else {
return $c->l('usr_MAX_user_NAME_LENGTH_ERROR', $data, $max, $max); return $c->l('usr_MAX_user_NAME_LENGTH_ERROR', $data, $max, $max);
} }
} } ## end sub max_user_name_length
sub validate_acctName { sub validate_acctName {
my ($c, $acctName) = @_; my ($c, $acctName) = @_;
unless ($adb->validate_account_name($acctName)) { unless ($adb->validate_account_name($acctName)) {
return $c->l('usr_ACCT_NAME_HAS_INVALID_CHARS', $acctName); return $c->l('usr_ACCT_NAME_HAS_INVALID_CHARS', $acctName);
} }
return "OK"; return "OK";
} } ## end sub validate_acctName
sub validate_acctName_length { sub validate_acctName_length {
my $c = shift; my $c = shift;
my $acctName = shift; my $acctName = shift;
my $maxAcctNameLength = ($cdb->get('maxAcctNameLength') ? $cdb->get('maxAcctNameLength')->prop('type') : "") || 12;
my $maxAcctNameLength = ($cdb->get('maxAcctNameLength')
? $cdb->get('maxAcctNameLength')->prop('type') : "") || 12;
if (length $acctName > $maxAcctNameLength) { if (length $acctName > $maxAcctNameLength) {
return $c->l('usr_ACCOUNT_TOO_LONG', $maxAcctNameLength); return $c->l('usr_ACCOUNT_TOO_LONG', $maxAcctNameLength);
} else { } else {
return ('OK'); return ('OK');
} }
} } ## end sub validate_acctName_length
sub validate_acctName_conflict { sub validate_acctName_conflict {
my $c = shift; my $c = shift;
my $acctName = shift; my $acctName = shift;
my $account = $adb->get($acctName); my $account = $adb->get($acctName);
my $type; my $type;
@ -579,23 +507,14 @@ sub validate_acctName_conflict {
return ('OK'); return ('OK');
} }
return $c->l('usr_ACCOUNT_CONFLICT', $acctName, $type); return $c->l('usr_ACCOUNT_CONFLICT', $acctName, $type);
} ## end sub validate_acctName_conflict
}
sub get_user_name { sub get_user_name {
my ($c, $acctName) = @_; my ($c, $acctName) = @_;
my $usr = $adb->get($acctName); my $usr = $adb->get($acctName);
return '' unless $usr; return '' unless $usr;
return $usr->prop('FirstName') . " " . $usr->prop('LastName'); return $usr->prop('FirstName') . " " . $usr->prop('LastName');
} ## end sub get_user_name
}
sub get_ldap_value { sub get_ldap_value {
my ($c, $field) = @_; my ($c, $field) = @_;
@ -604,7 +523,6 @@ sub get_ldap_value {
if ($c->param('user')) { if ($c->param('user')) {
return $c->param($field); return $c->param($field);
} }
my %CGIParam2DBfield = ( my %CGIParam2DBfield = (
Dept => 'defaultDepartment', Dept => 'defaultDepartment',
Company => 'defaultCompany', Company => 'defaultCompany',
@ -612,54 +530,47 @@ sub get_ldap_value {
City => 'defaultCity', City => 'defaultCity',
Phone => 'defaultPhoneNumber' Phone => 'defaultPhoneNumber'
); );
return $cdb->get('ldap')->prop($CGIParam2DBfield{$field}); return $cdb->get('ldap')->prop($CGIParam2DBfield{$field});
} } ## end sub get_ldap_value
sub get_pptp_value { sub get_pptp_value {
return $cdb->get('pptpd')->prop('AccessDefault') || 'no'; return $cdb->get('pptpd')->prop('AccessDefault') || 'no';
} }
sub pseudonym_clash { sub pseudonym_clash {
my ($c, $first) = @_; my ($c, $first) = @_;
$first ||= ""; $first ||= "";
my $last = $c->param('LastName') || ""; my $last = $c->param('LastName') || "";
my $acctName = $c->param('user') || ""; my $acctName = $c->param('user') || "";
my $up = "$first $last"; my $up = "$first $last";
$up =~ s/^\s+//; $up =~ s/^\s+//;
$up =~ s/\s+$//; $up =~ s/\s+$//;
$up =~ s/\s+/ /g; $up =~ s/\s+/ /g;
$up =~ s/\s/_/g; $up =~ s/\s/_/g;
my $dp = $up; my $dp = $up;
$dp =~ s/_/./g; $dp =~ s/_/./g;
$dp = $adb->get($dp); $dp = $adb->get($dp);
$up = $adb->get($up); $up = $adb->get($up);
my $da = $dp->prop('Account') if $dp; my $da = $dp->prop('Account') if $dp;
my $ua = $up->prop('Account') if $up; my $ua = $up->prop('Account') if $up;
if ($dp and $da and $da ne $acctName) { if ($dp and $da and $da ne $acctName) {
return $c->l('usr_PSEUDONYM_CLASH', return $c->l('usr_PSEUDONYM_CLASH', $acctName, $da, $dp->key);
$acctName, $da, $dp->key);
} elsif ($up and $ua and $ua ne $acctName) { } elsif ($up and $ua and $ua ne $acctName) {
return $c->l('usr_PSEUDONYM_CLASH', return $c->l('usr_PSEUDONYM_CLASH', $acctName, $ua, $up->key);
$acctName, $ua, $up->key );
} else { } else {
return "OK"; return "OK";
} }
} } ## end sub pseudonym_clash
sub emailforward { sub emailforward {
my ($c, $data) = @_; my ($c, $data) = @_;
my $response = $c->email_simple($data); my $response = $c->email_simple($data);
if ($response eq "OK") { if ($response eq "OK") {
return "OK"; return "OK";
} elsif ($data eq "") { } elsif ($data eq "") {
# Blank is ok, only if we're not forwarding, which means that the # Blank is ok, only if we're not forwarding, which means that the
# EmailForward param must be set to 'local'. # EmailForward param must be set to 'local'.
my $email_forward = $c->param('EmailForward') || ''; my $email_forward = $c->param('EmailForward') || '';
@ -669,23 +580,20 @@ sub emailforward {
} else { } else {
return $c->l('usr_CANNOT_CONTAIN_WHITESPACE') return $c->l('usr_CANNOT_CONTAIN_WHITESPACE')
if ($data =~ /\s+/); if ($data =~ /\s+/);
# Permit a local address. # Permit a local address.
return "OK" if $data =~ /^[a-zA-Z][a-zA-Z0-9\._\-]*$/; return "OK" if $data =~ /^[a-zA-Z][a-zA-Z0-9\._\-]*$/;
return $c->l('usr_UNACCEPTABLE_CHARS'); return $c->l('usr_UNACCEPTABLE_CHARS');
} } ## end else [ if ($response eq "OK")]
} } ## end sub emailforward
sub get_groups { sub get_groups {
my ($c) = shift; my ($c) = shift;
my @groups = $adb->groups(); my @groups = $adb->groups();
return \@groups; return \@groups;
} } ## end sub get_groups
sub ipsec_for_acct { sub ipsec_for_acct {
my $c = shift; my $c = shift;
# Don't show ipsecrw setting unless the status property exists # Don't show ipsecrw setting unless the status property exists
@ -694,65 +602,52 @@ sub ipsec_for_acct {
# Don't show ipsecrw setting unless /sbin/e-smith/roadwarrior exists # Don't show ipsecrw setting unless /sbin/e-smith/roadwarrior exists
return '' unless -x '/sbin/e-smith/roadwarrior'; return '' unless -x '/sbin/e-smith/roadwarrior';
my $user = $c->param('user'); my $user = $c->param('user');
return '' unless $user; return '' unless $user;
my $rec = $adb->get($user); my $rec = $adb->get($user);
if ($rec) { if ($rec) {
my $pwset = $rec->prop('PasswordSet') || 'no'; my $pwset = $rec->prop('PasswordSet') || 'no';
my $VPNaccess = $rec->prop('VPNClientAccess') || 'no'; my $VPNaccess = $rec->prop('VPNClientAccess') || 'no';
if ($pwset eq 'yes' and $VPNaccess eq 'yes') { if ($pwset eq 'yes' and $VPNaccess eq 'yes') {
return 'OK'; return 'OK';
} }
} } ## end if ($rec)
return ''; return '';
} } ## end sub ipsec_for_acct
sub is_user_in_group { sub is_user_in_group {
my $c = shift; my $c = shift;
my $user = shift || ''; my $user = shift || '';
my $group = shift || ''; my $group = shift || '';
return '' unless ($user and $group); return '' unless ($user and $group);
return ($adb->is_user_in_group($user, $group)) ? 'OK' : ''; return ($adb->is_user_in_group($user, $group)) ? 'OK' : '';
} ## end sub is_user_in_group
}
sub get_ipsec_client_cert { sub get_ipsec_client_cert {
my $c = shift; my $c = shift;
my $user = $c->param('user'); my $user = $c->param('user');
($user) = ($user =~ /^(.*)$/); ($user) = ($user =~ /^(.*)$/);
die "Invalid user: $user\n" unless getpwnam($user); die "Invalid user: $user\n" unless getpwnam($user);
open(KID, "/sbin/e-smith/roadwarrior get_client_cert $user |") open(KID, "/sbin/e-smith/roadwarrior get_client_cert $user |")
or die "Can't fork: $!"; or die "Can't fork: $!";
my $certfile = <KID>; my $certfile = <KID>;
close KID; close KID;
require File::Basename; require File::Basename;
my $certname = File::Basename::basename($certfile); my $certname = File::Basename::basename($certfile);
print "Expires: 0\n"; print "Expires: 0\n";
print "Content-type: application/x-pkcs12\n"; print "Content-type: application/x-pkcs12\n";
print "Content-disposition: inline; filename=$certname\n"; print "Content-disposition: inline; filename=$certname\n";
print "\n"; print "\n";
open(CERT, "<$certfile"); open(CERT, "<$certfile");
while (<CERT>)
{ while (<CERT>) {
print; print;
} }
close CERT; close CERT;
return ''; return '';
} } ## end sub get_ipsec_client_cert
sub modify_user { sub modify_user {
my ($c) = @_; my ($c) = @_;
@ -761,14 +656,13 @@ sub modify_user {
unless (($acctName) = ($acctName =~ /^(\w[\-\w_\.]*)$/)) { unless (($acctName) = ($acctName =~ /^(\w[\-\w_\.]*)$/)) {
return $c->l('usr_TAINTED_USER', $acctName); return $c->l('usr_TAINTED_USER', $acctName);
} }
# Untaint the username before use in system() # Untaint the username before use in system()
$acctName = $1; $acctName = $1;
my $acct = $adb->get($acctName); my $acct = $adb->get($acctName);
my $acctType = $acct->prop('type'); my $acctType = $acct->prop('type');
if ($acctType eq "user") if ($acctType eq "user") {
{
$adb->remove_user_auto_pseudonyms($acctName); $adb->remove_user_auto_pseudonyms($acctName);
my %newProperties = ( my %newProperties = (
'FirstName' => $c->param('FirstName'), 'FirstName' => $c->param('FirstName'),
@ -782,96 +676,72 @@ sub modify_user {
'ForwardAddress' => $c->param('ForwardAddress'), 'ForwardAddress' => $c->param('ForwardAddress'),
'VPNClientAccess' => $c->param('VPNClientAccess'), 'VPNClientAccess' => $c->param('VPNClientAccess'),
); );
$acct->merge_props(%newProperties); $acct->merge_props(%newProperties);
$adb->create_user_auto_pseudonyms($acctName) $adb->create_user_auto_pseudonyms($acctName)
if (($cdb->get_prop('pseudonyms', 'create') || 'enabled') eq 'enabled'); if (($cdb->get_prop('pseudonyms', 'create') || 'enabled') eq 'enabled');
my @old_groups = $adb->user_group_list($acctName); my @old_groups = $adb->user_group_list($acctName);
my @new_groups = @{ $c->every_param("groupMemberships") }; my @new_groups = @{ $c->every_param("groupMemberships") };
# $c->app->log->info($c->dumper("groups: Old " . @old_groups .' New '. @new_groups)); # $c->app->log->info($c->dumper("groups: Old " . @old_groups .' New '. @new_groups));
$adb->remove_user_from_groups($acctName, @old_groups); $adb->remove_user_from_groups($acctName, @old_groups);
$adb->add_user_to_groups($acctName, @new_groups); $adb->add_user_to_groups($acctName, @new_groups);
undef $adb; undef $adb;
unless (system ("/sbin/e-smith/signal-event", "user-modify", unless (system("/sbin/e-smith/signal-event", "user-modify", $acctName) == 0) {
$acctName) == 0) {
$adb = esmith::AccountsDB->open(); $adb = esmith::AccountsDB->open();
return $c->l('usr_CANNOT_MODIFY_USER'); return $c->l('usr_CANNOT_MODIFY_USER');
} }
$adb = esmith::AccountsDB->open(); $adb = esmith::AccountsDB->open();
} } ## end if ($acctType eq "user")
return 'OK'; return 'OK';
} } ## end sub modify_user
sub create_user { sub create_user {
my $c = shift; my $c = shift;
my $acctName = $c->param('user'); my $acctName = $c->param('user');
my %userprops; my %userprops;
foreach my $field ( qw( FirstName LastName Phone Company Dept foreach my $field (
City Street EmailForward ForwardAddress VPNClientAccess) ) qw( FirstName LastName Phone Company Dept
City Street EmailForward ForwardAddress VPNClientAccess)
)
{ {
$userprops{$field} = $c->param($field); $userprops{$field} = $c->param($field);
} } ## end foreach my $field (qw( FirstName LastName Phone Company Dept...))
$userprops{'PasswordSet'} = "no"; $userprops{'PasswordSet'} = "no";
$userprops{'type'} = 'user'; $userprops{'type'} = 'user';
my $acct = $adb->new_record($acctName) my $acct = $adb->new_record($acctName)
or warn "Can't create new account for $acctName (does it already exist?)\n"; or warn "Can't create new account for $acctName (does it already exist?)\n";
$acct->reset_props(%userprops); $acct->reset_props(%userprops);
$adb->create_user_auto_pseudonyms($acctName) $adb->create_user_auto_pseudonyms($acctName)
if (($cdb->get_prop('pseudonyms', 'create') || 'enabled') eq 'enabled'); if (($cdb->get_prop('pseudonyms', 'create') || 'enabled') eq 'enabled');
my @groups = @{ $c->every_param("groupMemberships") }; my @groups = @{ $c->every_param("groupMemberships") };
$adb->add_user_to_groups($acctName, @groups); $adb->add_user_to_groups($acctName, @groups);
undef $adb; undef $adb;
# Untaint the username before use in system() # Untaint the username before use in system()
$acctName =~ /^(\w[\-\w_\.]*)$/; $acctName =~ /^(\w[\-\w_\.]*)$/;
$acctName = $1; $acctName = $1;
if (system ("/sbin/e-smith/signal-event", "user-create", $acctName)) if (system("/sbin/e-smith/signal-event", "user-create", $acctName)) {
{
$adb = esmith::AccountsDB->open(); $adb = esmith::AccountsDB->open();
return $c->l("usr_ERR_OCCURRED_CREATING"); return $c->l("usr_ERR_OCCURRED_CREATING");
} }
$adb = esmith::AccountsDB->open(); $adb = esmith::AccountsDB->open();
$c->set_groups(); $c->set_groups();
return 'OK'; return 'OK';
} ## end sub create_user
}
sub set_groups { sub set_groups {
my $c = shift; my $c = shift;
my $acctName = $c->param('user'); my $acctName = $c->param('user');
my @groups = @{ $c->every_param("groupMemberships") }; my @groups = @{ $c->every_param("groupMemberships") };
$adb->set_user_groups($acctName, @groups); $adb->set_user_groups($acctName, @groups);
} ## end sub set_groups
}
sub modify_admin { sub modify_admin {
my ($c) = @_; my ($c) = @_;
my $acct = $adb->get('admin'); my $acct = $adb->get('admin');
my %newProperties = ( my %newProperties = (
'FirstName' => $c->param('FirstName'), 'FirstName' => $c->param('FirstName'),
'LastName' => $c->param('LastName'), 'LastName' => $c->param('LastName'),
@ -879,14 +749,9 @@ sub modify_admin {
'ForwardAddress' => $c->param('ForwardAddress'), 'ForwardAddress' => $c->param('ForwardAddress'),
'VPNClientAccess' => $c->param('VPNClientAccess'), 'VPNClientAccess' => $c->param('VPNClientAccess'),
); );
$acct->merge_props(%newProperties); $acct->merge_props(%newProperties);
undef $adb; undef $adb;
my $status = system("/sbin/e-smith/signal-event", "user-modify-admin", 'admin');
my $status =
system ("/sbin/e-smith/signal-event", "user-modify-admin", 'admin');
$adb = esmith::AccountsDB->open(); $adb = esmith::AccountsDB->open();
if ($status == 0) { if ($status == 0) {
@ -894,60 +759,56 @@ sub modify_admin {
} else { } else {
return $c->l('usr_CANNOT_MODIFY_USER', 'First'); return $c->l('usr_CANNOT_MODIFY_USER', 'First');
} }
} } ## end sub modify_admin
sub system_validate_password { sub system_validate_password {
my $c = shift; my $c = shift;
my $pass1 = shift; my $pass1 = shift;
# If the password contains one or more printable character # If the password contains one or more printable character
if ($pass1 =~ /^([ -~]+)$/) { if ($pass1 =~ /^([ -~]+)$/) {
return ('OK'); return ('OK');
} else { } else {
return $c->l('usr_SYSTEM_PASSWORD_UNPRINTABLES_IN_PASS'); return $c->l('usr_SYSTEM_PASSWORD_UNPRINTABLES_IN_PASS');
} }
} } ## end sub system_validate_password
sub system_check_password { sub system_check_password {
my $c = shift; my $c = shift;
my $pass1 = shift; my $pass1 = shift;
use esmith::ConfigDB; use esmith::ConfigDB;
my $conf = esmith::ConfigDB->open(); my $conf = esmith::ConfigDB->open();
my ($check_type, $rec); my ($check_type, $rec);
if ($conf) { if ($conf) {
$rec = $conf->get('passwordstrength'); $rec = $conf->get('passwordstrength');
} }
$check_type = ($rec ? ($rec->prop('Admin') || 'strong') : 'strong'); $check_type = ($rec ? ($rec->prop('Admin') || 'strong') : 'strong');
return $c->validate_password($check_type, $pass1); return $c->validate_password($check_type, $pass1);
} } ## end sub system_check_password
sub system_authenticate_password { sub system_authenticate_password {
my $c = shift; my $c = shift;
my $pass = shift; my $pass = shift;
if (esmith::util::authenticateUnixPassword( ($cdb->get_value("AdminIsNotRoot") eq 'enabled') ? 'admin' : 'root', $pass)) { if (esmith::util::authenticateUnixPassword(
($cdb->get_value("AdminIsNotRoot") eq 'enabled') ? 'admin' : 'root', $pass
)
)
{
return "OK"; return "OK";
} else { } else {
return $c->l("usr_SYSTEM_PASSWORD_AUTH_ERROR"); return $c->l("usr_SYSTEM_PASSWORD_AUTH_ERROR");
} }
} } ## end sub system_authenticate_password
sub system_change_password { sub system_change_password {
my ($c) = @_; my ($c) = @_;
my $pass = $c->param('Pass'); my $pass = $c->param('Pass');
($cdb->get_value("AdminIsNotRoot") eq 'enabled')
($cdb->get_value("AdminIsNotRoot") eq 'enabled') ? esmith::util::setUnixPassword('admin',$pass) : esmith::util::setUnixSystemPassword($pass); ? esmith::util::setUnixPassword('admin', $pass)
: esmith::util::setUnixSystemPassword($pass);
esmith::util::setServerSystemPassword($pass); esmith::util::setServerSystemPassword($pass);
my $result = system("/sbin/e-smith/signal-event password-modify admin"); my $result = system("/sbin/e-smith/signal-event password-modify admin");
if ($result == 0) { if ($result == 0) {
@ -955,7 +816,5 @@ sub system_change_password {
} else { } else {
return $c->l("Error occurred while modifying password for admin.", 'First'); return $c->l("Error occurred while modifying password for admin.", 'First');
} }
} } ## end sub system_change_password
1 1

View File

@ -8,25 +8,19 @@ package SrvMngr::Controller::Userpassword;
# #
# routes : end # routes : end
#---------------------------------------------------------------------- #----------------------------------------------------------------------
use strict; use strict;
use warnings; use warnings;
use Mojo::Base 'Mojolicious::Controller'; use Mojo::Base 'Mojolicious::Controller';
use esmith::util; use esmith::util;
use esmith::ConfigDB; use esmith::ConfigDB;
use esmith::AccountsDB; use esmith::AccountsDB;
use Locale::gettext; use Locale::gettext;
use SrvMngr::I18N; use SrvMngr::I18N;
use SrvMngr qw( theme_list init_session is_normal_password ); use SrvMngr qw( theme_list init_session is_normal_password );
our $cdb = esmith::ConfigDB->open_ro || die "Couldn't open configuration db"; our $cdb = esmith::ConfigDB->open_ro || die "Couldn't open configuration db";
sub main { sub main {
my $c = shift; my $c = shift;
my %pwd_datas = (); my %pwd_datas = ();
if ($c->is_logged_in) { if ($c->is_logged_in) {
@ -37,7 +31,6 @@ sub main {
my $mess = ''; my $mess = '';
my $jwt = $c->param('jwt') || ''; my $jwt = $c->param('jwt') || '';
my $name = $c->jwt->decode($jwt)->{username} || ''; 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 # request already treated or outdated
@ -56,51 +49,49 @@ sub main {
$pwd_datas{trt} = 'RESET'; $pwd_datas{trt} = 'RESET';
$pwd_datas{jwt} = $jwt; $pwd_datas{jwt} = $jwt;
$c->flash(success => $c->l('use_OK_FOR_RESET')); $c->flash(success => $c->l('use_OK_FOR_RESET'));
} } ## end else [ if ($c->is_logged_in) ]
$c->stash(pwd_datas => \%pwd_datas); $c->stash(pwd_datas => \%pwd_datas);
$c->render('userpassword'); $c->render('userpassword');
} } ## end sub main
sub change_password { sub change_password {
my $c = shift; my $c = shift;
my $result; my $result;
my $res; my $res;
my %pwd_datas = (); my %pwd_datas = ();
my $trt = $c->param('Trt'); my $trt = $c->param('Trt');
my $acctName = $c->param('User'); my $acctName = $c->param('User');
my $oldPass = $c->param('Oldpass') || ''; my $oldPass = $c->param('Oldpass') || '';
my $pass = $c->param('Pass'); my $pass = $c->param('Pass');
my $passVerify = $c->param('Passverify'); my $passVerify = $c->param('Passverify');
my $jwt = $c->param('jwt') || ''; my $jwt = $c->param('jwt') || '';
my $rt = $c->current_route; my $rt = $c->current_route;
my $mess = ''; my $name = ''; my $mess = '';
my $name = '';
$name = $c->jwt->decode($jwt)->{username} if $jwt; $name = $c->jwt->decode($jwt)->{username} if $jwt;
if ($trt eq 'RESET') { if ($trt eq 'RESET') {
$mess = 'Invalid state' unless ($jwt and $name and ($rt eq 'upwdreset2')); $mess = 'Invalid state' unless ($jwt and $name and ($rt eq 'upwdreset2'));
# request already treated or outdated # request already treated or outdated
if ($c->pwdrst->{$name}{confirmed} != 2 or $c->pwdrst->{$name}{date} < time()) { if ($c->pwdrst->{$name}{confirmed} != 2 or $c->pwdrst->{$name}{date} < time()) {
$mess = $c->l('use_INVALID_REQUEST') . ' -step 2-'; $mess = $c->l('use_INVALID_REQUEST') . ' -step 2-';
} }
if (!$name or $c->is_logged_in or $name ne $acctName) { if (!$name or $c->is_logged_in or $name ne $acctName) {
$mess = 'Invalid reset state'; $mess = 'Invalid reset state';
} }
} else { } else {
if ($name or $jwt or !$c->is_logged_in) { if ($name or $jwt or !$c->is_logged_in) {
$mess = 'Invalid update state'; $mess = 'Invalid update state';
} }
} } ## end else [ if ($trt eq 'RESET') ]
if ($mess) { if ($mess) {
$c->stash(error => $mess); $c->stash(error => $mess);
return $c->redirect_to($c->home_page); return $c->redirect_to($c->home_page);
} }
$pwd_datas{Account} = $acctName; $pwd_datas{Account} = $acctName;
$pwd_datas{trt} = $trt; $pwd_datas{trt} = $trt;
@ -108,13 +99,14 @@ sub change_password {
if ($acctName eq 'admin') { if ($acctName eq 'admin') {
$result .= "Admin password should not be reset here !"; $result .= "Admin password should not be reset here !";
} else { } else {
unless ($pass && $passVerify) { unless ($pass && $passVerify) {
$result .= $c->l('pwd_FIELDS_REQUIRED') . "<br>"; $result .= $c->l('pwd_FIELDS_REQUIRED') . "<br>";
} else { } else {
$result .= $c->l('pwd_PASSWORD_INVALID_CHARS') . "<br>" unless (($pass) = ($pass =~ /^([ -~]+)$/)); $result .= $c->l('pwd_PASSWORD_INVALID_CHARS') . "<br>" unless (($pass) = ($pass =~ /^([ -~]+)$/));
$result .= $c->l('pwd_PASSWORD_VERIFY_ERROR') . "<br>" unless ($pass eq $passVerify); $result .= $c->l('pwd_PASSWORD_VERIFY_ERROR') . "<br>" unless ($pass eq $passVerify);
} }
} } ## end else [ if ($acctName eq 'admin')]
if ($result ne '') { if ($result ne '') {
$c->stash(error => $result, pwd_datas => \%pwd_datas); $c->stash(error => $result, pwd_datas => \%pwd_datas);
@ -127,6 +119,7 @@ sub change_password {
# controls old password # controls old password
if ($trt ne 'RESET') { if ($trt ne 'RESET') {
unless ($oldPass) { unless ($oldPass) {
$result .= $c->l('pwd_FIELDS_REQUIRED') . "<br>" unless $trt eq 'RESET'; $result .= $c->l('pwd_FIELDS_REQUIRED') . "<br>" unless $trt eq 'RESET';
} else { } else {
@ -143,10 +136,9 @@ sub change_password {
$result .= $c->l('pwd_ERROR_PASSWORD_CHANGE') . "<br>" $result .= $c->l('pwd_ERROR_PASSWORD_CHANGE') . "<br>"
unless (SrvMngr::Model::Main->check_credentials($acctName, $oldPass)); unless (SrvMngr::Model::Main->check_credentials($acctName, $oldPass));
} }
} } ## end if ($trt ne 'RESET')
# $result .= 'Blocked for test (prevents updates)<br>'; # $result .= 'Blocked for test (prevents updates)<br>';
if (!$result) { if (!$result) {
my $res = $c->reset_password($trt, $acctName, $pass, $oldPass); my $res = $c->reset_password($trt, $acctName, $pass, $oldPass);
$result .= $res unless $res eq 'OK'; $result .= $res unless $res eq 'OK';
@ -156,34 +148,25 @@ sub change_password {
record_password_change_attempt($c, 'FAILED'); record_password_change_attempt($c, 'FAILED');
$c->stash(error => $result, pwd_datas => \%pwd_datas); $c->stash(error => $result, pwd_datas => \%pwd_datas);
return $c->render('userpassword'); return $c->render('userpassword');
} } ## end if ($result)
$c->pwdrst->{$name}{confirmed} = 9 if $trt eq 'RESET'; $c->pwdrst->{$name}{confirmed} = 9 if $trt eq 'RESET';
record_password_change_attempt($c, 'SUCCESS'); record_password_change_attempt($c, 'SUCCESS');
$result .= $c->l('pwd_PASSWORD_CHANGE_SUCCESS'); $result .= $c->l('pwd_PASSWORD_CHANGE_SUCCESS');
$c->flash(success => $result); $c->flash(success => $result);
$c->redirect_to($c->home_page); $c->redirect_to($c->home_page);
} } ## end sub change_password
sub reset_password { sub reset_password {
my ($c, $trt, $user, $password, $oldpassword) = @_; my ($c, $trt, $user, $password, $oldpassword) = @_;
my $ret; my $ret;
return $c->l('usr_TAINTED_USER') unless (($user) = ($user =~ /^(\w[\-\w_\.]*)$/)); return $c->l('usr_TAINTED_USER') unless (($user) = ($user =~ /^(\w[\-\w_\.]*)$/));
$user = $1; $user = $1;
my $adb = esmith::AccountsDB->open(); my $adb = esmith::AccountsDB->open();
my $acct = $adb->get($user); my $acct = $adb->get($user);
return $c->l('NO_SUCH_USER', $user) unless ($acct->prop('type') eq '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::setUserPasswordRequirePrevious($user, $oldpassword, $password) if $trt ne 'RESET';
$ret = esmith::util::setUserPassword($user, $password) if $trt eq 'RESET'; $ret = esmith::util::setUserPassword($user, $password) if $trt eq 'RESET';
return $c->l('pwd_ERROR_PASSWORD_CHANGE') . ' ' . $trt unless $ret; return $c->l('pwd_ERROR_PASSWORD_CHANGE') . ' ' . $trt unless $ret;
$acct->set_prop("PasswordSet", "yes"); $acct->set_prop("PasswordSet", "yes");
undef $adb; undef $adb;
@ -192,15 +175,11 @@ sub reset_password {
return $c->l("usr_ERR_OCCURRED_MODIFYING_PASSWORD"); return $c->l("usr_ERR_OCCURRED_MODIFYING_PASSWORD");
} }
$adb = esmith::AccountsDB->open(); $adb = esmith::AccountsDB->open();
return 'OK'; return 'OK';
} } ## end sub reset_password
sub record_password_change_attempt { sub record_password_change_attempt {
my ($c, $result) = @_; my ($c, $result) = @_;
my $user = $c->param('User'); my $user = $c->param('User');
my $ip_address = $c->tx->remote_address; my $ip_address = $c->tx->remote_address;
@ -209,32 +188,25 @@ sub record_password_change_attempt {
} else { } else {
$c->app->log->info(join "\t", "Password change FAILED: $user", $ip_address); $c->app->log->info(join "\t", "Password change FAILED: $user", $ip_address);
} }
} } ## end sub record_password_change_attempt
sub check_password { sub check_password {
my $c = shift; my $c = shift;
my $password = shift; my $password = shift;
my $strength; my $strength;
my $rec = $cdb->get('passwordstrength'); my $rec = $cdb->get('passwordstrength');
$strength = ($rec ? ($rec->prop('Users') || 'none') : 'none'); $strength = ($rec ? ($rec->prop('Users') || 'none') : 'none');
return validate_password($c, $strength, $password); return validate_password($c, $strength, $password);
} } ## end sub check_password
sub validate_password { sub validate_password {
my ($c, $strength, $pass) = @_; my ($c, $strength, $pass) = @_;
use Crypt::Cracklib; use Crypt::Cracklib;
if ($strength eq "none") { if ($strength eq "none") {
return $c->l("Passwords must be at least 7 characters long") unless (length($pass) > 6); return $c->l("Passwords must be at least 7 characters long") unless (length($pass) > 6);
return "OK"; return "OK";
} }
my $reason = is_normal_password($c, $pass, undef); my $reason = is_normal_password($c, $pass, undef);
return $reason unless ($reason eq "OK"); return $reason unless ($reason eq "OK");
return "OK" unless ($strength eq "strong"); return "OK" unless ($strength eq "strong");
@ -245,13 +217,10 @@ sub validate_password {
$reason = fascist_check($pass, '/usr/lib/cracklib_dict'); $reason = fascist_check($pass, '/usr/lib/cracklib_dict');
} }
$reason ||= "Software error: password check failed"; $reason ||= "Software error: password check failed";
return "OK" if ($reason eq "ok"); return "OK" if ($reason eq "ok");
return
return $c->l("Bad Password Choice") . ": " $c->l("Bad Password Choice") . ": "
. $c->l("The password you have chosen is not a good choice, because") . $c->l("The password you have chosen is not a good choice, because") . " "
. " " . $c->($reason) . "."; . $c->($reason) . ".";
} } ## end sub validate_password
1; 1;

View File

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

View File

@ -10,40 +10,30 @@ package SrvMngr::Controller::Workgroup;
use strict; use strict;
use warnings; use warnings;
use Mojo::Base 'Mojolicious::Controller'; use Mojo::Base 'Mojolicious::Controller';
use Locale::gettext; use Locale::gettext;
use SrvMngr::I18N; use SrvMngr::I18N;
use SrvMngr qw(theme_list init_session); use SrvMngr qw(theme_list init_session);
use esmith::FormMagick::Panel::workgroup; use esmith::FormMagick::Panel::workgroup;
our $db = esmith::ConfigDB->open || die "Couldn't open config db"; our $db = esmith::ConfigDB->open || die "Couldn't open config db";
sub main { sub main {
my $c = shift; my $c = shift;
$c->app->log->info($c->log_req); $c->app->log->info($c->log_req);
my %wkg_datas = (); my %wkg_datas = ();
my $title = $c->l('wkg_FORM_TITLE'); my $title = $c->l('wkg_FORM_TITLE');
my $modul = ''; my $modul = '';
$wkg_datas{'Workgroup'} = ($db->get_prop('smb', 'Workgroup')) || ''; $wkg_datas{'Workgroup'} = ($db->get_prop('smb', 'Workgroup')) || '';
$wkg_datas{'ServerName'} = ($db->get_prop('smb', 'ServerName')) || ''; $wkg_datas{'ServerName'} = ($db->get_prop('smb', 'ServerName')) || '';
$wkg_datas{'ServerRole'} = ($db->get_prop('smb', 'ServerRole')) || ''; $wkg_datas{'ServerRole'} = ($db->get_prop('smb', 'ServerRole')) || '';
$wkg_datas{'RoamingProfiles'} = ($db->get_prop('smb', 'RoamingProfiles')) || ''; $wkg_datas{'RoamingProfiles'} = ($db->get_prop('smb', 'RoamingProfiles')) || '';
$c->stash(title => $title, modul => $modul, wkg_datas => \%wkg_datas); $c->stash(title => $title, modul => $modul, wkg_datas => \%wkg_datas);
$c->render(template => 'workgroup'); $c->render(template => 'workgroup');
}; } ## end sub main
sub do_update { sub do_update {
my $c = shift; my $c = shift;
$c->app->log->info($c->log_req); $c->app->log->info($c->log_req);
my $result = ""; my $result = "";
my $workgroup = ($c->param('Workgroup') || 'no'); my $workgroup = ($c->param('Workgroup') || 'no');
my $servername = ($c->param('ServerName') || 'WS'); my $servername = ($c->param('ServerName') || 'WS');
my $roamingprofiles = ($c->param('RoamingProfiles') || 'no'); my $roamingprofiles = ($c->param('RoamingProfiles') || 'no');
@ -52,7 +42,6 @@ sub do_update {
# controls # controls
my $res = validate2_workgroup($c, $workgroup, $servername); my $res = validate2_workgroup($c, $workgroup, $servername);
$result .= $res unless $res eq 'OK'; $result .= $res unless $res eq 'OK';
$res = validate2_servername($c, $servername); $res = validate2_servername($c, $servername);
$result .= $res unless $res eq 'OK'; $result .= $res unless $res eq 'OK';
@ -61,43 +50,31 @@ sub do_update {
$db->get('smb')->set_prop('ServerRole', $serverrole); $db->get('smb')->set_prop('ServerRole', $serverrole);
$db->get('smb')->set_prop('ServerName', $servername); $db->get('smb')->set_prop('ServerName', $servername);
$db->get('smb')->set_prop('RoamingProfiles', $roamingprofiles); $db->get('smb')->set_prop('RoamingProfiles', $roamingprofiles);
} } ## end if ($result eq '')
system("/sbin/e-smith/signal-event", "workgroup-update") == 0 system("/sbin/e-smith/signal-event", "workgroup-update") == 0
or $result = $c->l('ERROR_UPDATING') . " system"; or $result = $c->l('ERROR_UPDATING') . " system";
my $title = $c->l('wkg_FORM_TITLE'); my $title = $c->l('wkg_FORM_TITLE');
if ($result eq '') { $result = $c->l('wkg_SUCCESS'); } if ($result eq '') { $result = $c->l('wkg_SUCCESS'); }
$c->stash(title => $title, modul => $result); $c->stash(title => $title, modul => $result);
$c->render(template => 'module'); $c->render(template => 'module');
} ## end sub do_update
};
sub validate2_servername { sub validate2_servername {
my $c = shift; my $c = shift;
my $servername = 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'); return $c->l('INVALID_SERVERNAME');
} } ## end sub validate2_servername
sub validate2_workgroup { sub validate2_workgroup {
my $c = shift; my $c = shift;
my $workgroup = lc(shift); my $workgroup = lc(shift);
my $servername = lc(shift); my $servername = lc(shift);
# my $workgroup = $c->l(shift); # my $workgroup = $c->l(shift);
# my $servername = $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') unless ($workgroup =~ /^([a-zA-Z0-9][\-\w\.]*)$/);
return $c->l('INVALID_WORKGROUP_MATCHES_SERVERNAME') if ($servername eq $workgroup); return $c->l('INVALID_WORKGROUP_MATCHES_SERVERNAME') if ($servername eq $workgroup);
return ('OK'); return ('OK');
} ## end sub validate2_workgroup
}
1; 1;

View File

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

View File

@ -2,7 +2,7 @@ Summary: Sme server navigation module : manager 2
%define name smeserver-manager %define name smeserver-manager
Name: %{name} Name: %{name}
%define version 11.0.0 %define version 11.0.0
%define release 38 %define release 39
Version: %{version} Version: %{version}
Release: %{release}%{?dist} Release: %{release}%{?dist}
License: GPL License: GPL
@ -115,6 +115,9 @@ true
%defattr(-,root,root) %defattr(-,root,root)
%changelog %changelog
* Tue Jan 14 2025 Brian Read <brianr@koozali.org> 11.0.0-39.sme
- Apply perltidy to all Controller files, add .perltidy to directory and .gitignore for .tdy files (just incase) [SME: 12485]
* Sat Jan 11 2025 Brian Read <brianr@koozali.org> 11.0.0-38.sme * Sat Jan 11 2025 Brian Read <brianr@koozali.org> 11.0.0-38.sme
- Fix password reset for admin in user panel [SME: 12655] - Fix password reset for admin in user panel [SME: 12655]