Compare commits
5 Commits
1_0-23_el8
...
master
| Author | SHA1 | Date | |
|---|---|---|---|
| a2c3f3cdb4 | |||
| 367e4da9e8 | |||
| 5858500b80 | |||
| 2e7e5047d8 | |||
| bd88797db8 |
@@ -15,443 +15,410 @@ package SrvMngr::Controller::Wireguard;
|
||||
use strict;
|
||||
use warnings;
|
||||
use Mojo::Base 'Mojolicious::Controller';
|
||||
|
||||
use Locale::gettext;
|
||||
use SrvMngr::I18N;
|
||||
use SrvMngr qw( theme_list init_session is_normal_password );
|
||||
|
||||
use esmith::ConfigDB;
|
||||
use esmith::ConfigDB::UTF8;
|
||||
use Net::IP;
|
||||
|
||||
our $adb = esmith::AccountsDB->open() || die "Couldn't open accounts DB\ndb";
|
||||
our $cdb = esmith::ConfigDB->open() || die "Couldn't open config DB\n";
|
||||
our $wdb = esmith::ConfigDB->open('wireguard') || esmith::ConfigDB->create('wireguard');
|
||||
our $ndb = esmith::NetworksDB->open_ro || die "Error opening networks DB\n";
|
||||
|
||||
my $adb;
|
||||
my $cdb;
|
||||
my $wdb;
|
||||
my $ndb;
|
||||
|
||||
sub main {
|
||||
|
||||
my $c = shift;
|
||||
$c->app->log->info($c->log_req);
|
||||
|
||||
my %wrg_datas = ();
|
||||
$wdb = esmith::ConfigDB::UTF8->open('wireguard') || esmith::ConfigDB::UTF8->create('wireguard');
|
||||
my $title = $c->l('wrg_FORM_TITLE');
|
||||
|
||||
$wrg_datas{'trt'} = 'LST';
|
||||
|
||||
$cdb = esmith::ConfigDB->open() || die "Couldn't open config DB\n";
|
||||
$cdb = esmith::ConfigDB::UTF8->open() || die "Couldn't open config DB\n";
|
||||
my $wg = $cdb->get('wg-quick@wg0');
|
||||
|
||||
$wrg_datas{'wgpub'} = $wg->prop('public');
|
||||
$wrg_datas{'wgip'} = $wg->prop('ip');
|
||||
$wrg_datas{'wgmask'} = $wg->prop('mask');
|
||||
$wrg_datas{'wgport'} = $wg->prop('UDPPort');
|
||||
$wrg_datas{'sstatus'} = $wg->prop('status');
|
||||
|
||||
$wrg_datas{'wgpub'} = $wg->prop('public');
|
||||
$wrg_datas{'wgip'} = $wg->prop('ip');
|
||||
$wrg_datas{'wgmask'} = $wg->prop('mask');
|
||||
$wrg_datas{'wgport'} = $wg->prop('UDPPort');
|
||||
$wrg_datas{'sstatus'} = $wg->prop('status');
|
||||
my @wgstatus = `/usr/bin/wg show wg0 dump`;
|
||||
|
||||
my $type = 'wg0';
|
||||
my @wgconf = $wdb->get_all_by_prop(type=>$type);
|
||||
|
||||
$c->stash( title => $title, wrg_datas => \%wrg_datas,
|
||||
wgstatus => \@wgstatus, wgconf => \@wgconf );
|
||||
|
||||
my $type = 'wg0';
|
||||
my @wgconf = $wdb->get_all_by_prop(type => $type);
|
||||
$c->stash(
|
||||
title => $title,
|
||||
wrg_datas => \%wrg_datas,
|
||||
wgstatus => \@wgstatus,
|
||||
wgconf => \@wgconf
|
||||
);
|
||||
$c->render(template => 'wireguard');
|
||||
|
||||
};
|
||||
|
||||
} ## end sub main
|
||||
|
||||
sub do_display {
|
||||
|
||||
my $c = shift;
|
||||
$c->app->log->info($c->log_req);
|
||||
|
||||
my $rt = $c->current_route;
|
||||
my $trt = ($c->param('trt') || '');
|
||||
my $wgconf = $c->param('Wgconf') || '';
|
||||
|
||||
my $rt = $c->current_route;
|
||||
my $trt = ($c->param('trt') || '');
|
||||
my $wgconf = $c->param('Wgconf') || '';
|
||||
my %wrg_datas = ();
|
||||
my $title = $c->l('wrg_FORM_TITLE');
|
||||
my $modul = '';
|
||||
my $title = $c->l('wrg_FORM_TITLE');
|
||||
my $modul = '';
|
||||
$adb = esmith::AccountsDB->open() || die "Couldn't open accounts DB\ndb";
|
||||
$cdb = esmith::ConfigDB::UTF8->open() || die "Couldn't open config DB\n";
|
||||
$wdb = esmith::ConfigDB::UTF8->open('wireguard') || esmith::ConfigDB::UTF8->create('wireguard');
|
||||
|
||||
#$ndb = esmith::NetworksDB->open_ro || die "Error opening networks DB\n";
|
||||
$wrg_datas{'trt'} = $trt;
|
||||
|
||||
if ( $trt eq 'QRC' ) {
|
||||
$wrg_datas{'wgconf'} = $wgconf;
|
||||
}
|
||||
if ($trt eq 'QRC') {
|
||||
$wrg_datas{'wgconf'} = $wgconf;
|
||||
}
|
||||
|
||||
if ( $trt eq 'MOD' ) {
|
||||
$wrg_datas{'wgconf'} = $wgconf;
|
||||
my $rec = $wdb->get($wgconf);
|
||||
if ( $rec ) {
|
||||
$wrg_datas{'info'} = $rec->prop('info') || '';
|
||||
$wrg_datas{'allowedips'} = $rec->prop('allowedips') || '';
|
||||
$wrg_datas{'private'} = $rec->prop('private') || '';
|
||||
$wrg_datas{'public'} = $rec->prop('public') || '';
|
||||
$wrg_datas{'account'} = $rec->prop('user') || '';
|
||||
$wrg_datas{'status'} = $rec->prop('status') || '';
|
||||
$wrg_datas{'dns'} = $rec->prop('dns') || '';
|
||||
}
|
||||
}
|
||||
if ($trt eq 'MOD') {
|
||||
$wrg_datas{'wgconf'} = $wgconf;
|
||||
my $rec = $wdb->get($wgconf);
|
||||
|
||||
if ( $trt eq 'REM' ) {
|
||||
$wrg_datas{'wgconf'} = $wgconf;
|
||||
my $rec = $wdb->get($wgconf);
|
||||
$wrg_datas{'wgcomment'} = $rec->prop('info') || '';
|
||||
}
|
||||
if ($rec) {
|
||||
$wrg_datas{'info'} = $rec->prop('info') || '';
|
||||
$wrg_datas{'allowedips'} = $rec->prop('allowedips') || '';
|
||||
$wrg_datas{'private'} = $rec->prop('private') || '';
|
||||
$wrg_datas{'public'} = $rec->prop('public') || '';
|
||||
$wrg_datas{'account'} = $rec->prop('user') || '';
|
||||
$wrg_datas{'status'} = $rec->prop('status') || '';
|
||||
$wrg_datas{'dns'} = $rec->prop('dns') || '';
|
||||
} ## end if ($rec)
|
||||
} ## end if ($trt eq 'MOD')
|
||||
|
||||
if ( $trt eq 'NEW' ) {
|
||||
# nothing for a new client
|
||||
}
|
||||
if ($trt eq 'REM') {
|
||||
$wrg_datas{'wgconf'} = $wgconf;
|
||||
my $rec = $wdb->get($wgconf);
|
||||
$wrg_datas{'wgcomment'} = $rec->prop('info') || '';
|
||||
}
|
||||
|
||||
if ( $trt eq 'UPD' ) {
|
||||
my $wg = $cdb->get('wg-quick@wg0');
|
||||
$wrg_datas{'ip'} = $wg->prop('ip');
|
||||
$wrg_datas{'mask'} = $wg->prop('mask');
|
||||
$wrg_datas{'private'} = $wg->prop('private');
|
||||
$wrg_datas{'public'} = $wg->prop('public');
|
||||
$wrg_datas{'status'} = $wg->prop('status');
|
||||
}
|
||||
if ($trt eq 'NEW') {
|
||||
|
||||
if ( $trt eq 'LST' ) {
|
||||
my @wgss = $adb->wgss();
|
||||
$c->stash( wgss => \@wgss );
|
||||
}
|
||||
# nothing for a new client
|
||||
}
|
||||
|
||||
$c->stash( title => $title, modul => $modul, wrg_datas => \%wrg_datas );
|
||||
$c->render( template => 'wireguard' );
|
||||
|
||||
};
|
||||
if ($trt eq 'UPD') {
|
||||
my $wg = $cdb->get('wg-quick@wg0');
|
||||
$wrg_datas{'ip'} = $wg->prop('ip');
|
||||
$wrg_datas{'mask'} = $wg->prop('mask');
|
||||
$wrg_datas{'private'} = $wg->prop('private');
|
||||
$wrg_datas{'public'} = $wg->prop('public');
|
||||
$wrg_datas{'status'} = $wg->prop('status');
|
||||
} ## end if ($trt eq 'UPD')
|
||||
|
||||
if ($trt eq 'LST') {
|
||||
my @wgss = $adb->wgss();
|
||||
$c->stash(wgss => \@wgss);
|
||||
}
|
||||
$c->stash(title => $title, modul => $modul, wrg_datas => \%wrg_datas);
|
||||
$c->render(template => 'wireguard');
|
||||
} ## end sub do_display
|
||||
|
||||
sub do_action {
|
||||
|
||||
my $c = shift;
|
||||
$c->app->log->info($c->log_req);
|
||||
|
||||
my $rt = $c->current_route;
|
||||
my $trt = ($c->param('trt') || '');
|
||||
|
||||
my $rt = $c->current_route;
|
||||
my $trt = ($c->param('trt') || '');
|
||||
my %wrg_datas = ();
|
||||
my $title = $c->l('wrg_FORM_TITLE');
|
||||
|
||||
my $title = $c->l('wrg_FORM_TITLE');
|
||||
$wrg_datas{'trt'} = $trt;
|
||||
|
||||
my $result = '';
|
||||
my $res = '';
|
||||
my $res = '';
|
||||
$adb = esmith::AccountsDB->open() || die "Couldn't open accounts DB\ndb";
|
||||
$cdb = esmith::ConfigDB::UTF8->open() || die "Couldn't open config DB\n";
|
||||
$wdb = esmith::ConfigDB::UTF8->open('wireguard') || esmith::ConfigDB::UTF8->create('wireguard');
|
||||
$ndb = esmith::NetworksDB->open_ro || die "Error opening networks DB\n";
|
||||
|
||||
if ( $trt eq 'QRC' ) {
|
||||
# NEVER
|
||||
if ($trt eq 'QRC') {
|
||||
|
||||
# NEVER
|
||||
}
|
||||
|
||||
if ( $trt eq 'LST' ) {
|
||||
# NEVER
|
||||
if ($trt eq 'LST') {
|
||||
|
||||
# NEVER
|
||||
}
|
||||
|
||||
if ( $trt eq 'MOD' ) {
|
||||
$wrg_datas{'wgconf'} = $c->param('Wgconf');
|
||||
# controls
|
||||
$res = 'OK'; # no controls here...
|
||||
$result .= $res unless $res eq 'OK';
|
||||
if ( ! $result ) {
|
||||
$res = performModifyClient( $c );
|
||||
$result .= $res unless $res eq 'OK';
|
||||
if ( ! $result ) {
|
||||
$result = $c->l('wrg_SUCCESSFULLY_MODIFIED_CONF');
|
||||
}
|
||||
}
|
||||
}
|
||||
if ($trt eq 'MOD') {
|
||||
$wrg_datas{'wgconf'} = $c->param('Wgconf');
|
||||
|
||||
if ( $trt eq 'REM' ) {
|
||||
if ($c->param("cancel")) {
|
||||
$c->stash( error => $c->l('wrg_CANCELLED') );
|
||||
$c->redirect_to('/wireguard');
|
||||
}
|
||||
# controls
|
||||
$res = 'OK'; # no controls here...
|
||||
$result .= $res unless $res eq 'OK';
|
||||
if ( ! $result ) {
|
||||
$res = performRemoveClient( $c );
|
||||
$result .= $res unless $res eq 'OK';
|
||||
if ( ! $result ) {
|
||||
$result = $c->l('wrg_SUCCESSFULLY_REMOVED_CONF');
|
||||
}
|
||||
}
|
||||
}
|
||||
# controls
|
||||
$res = 'OK'; # no controls here...
|
||||
$result .= $res unless $res eq 'OK';
|
||||
|
||||
if ( $trt eq 'NEW' ) {
|
||||
if (!$result) {
|
||||
$res = performModifyClient($c);
|
||||
$result .= $res unless $res eq 'OK';
|
||||
|
||||
# controls
|
||||
$res = 'OK'; # no controls here...
|
||||
$result .= $res unless $res eq 'OK';
|
||||
if ( ! $result ) {
|
||||
$res = performCreateClient( $c );
|
||||
$result .= $res unless $res eq 'OK';
|
||||
if ( ! $result ) {
|
||||
$result = $c->l('wrg_SUCCESSFULLY_ADDED_CONF');
|
||||
}
|
||||
}
|
||||
}
|
||||
if (!$result) {
|
||||
$result = $c->l('wrg_SUCCESSFULLY_MODIFIED_CONF');
|
||||
}
|
||||
} ## end if (!$result)
|
||||
} ## end if ($trt eq 'MOD')
|
||||
|
||||
if ( $trt eq 'UPD' ) {
|
||||
if ($trt eq 'REM') {
|
||||
if ($c->param("cancel")) {
|
||||
$c->stash(error => $c->l('wrg_CANCELLED'));
|
||||
$c->redirect_to('/wireguard');
|
||||
}
|
||||
|
||||
# controls
|
||||
$res = 'OK'; # no controls here...
|
||||
$result .= $res unless $res eq 'OK';
|
||||
if ( ! $result ) {
|
||||
$res = performUpdateConfig( $c );
|
||||
$result .= $res unless $res eq 'OK';
|
||||
if ( ! $result ) {
|
||||
$result = $c->l('wrg_SUCCESSFULLY_UPDATED_CONF');
|
||||
}
|
||||
}
|
||||
}
|
||||
# controls
|
||||
$res = 'OK'; # no controls here...
|
||||
$result .= $res unless $res eq 'OK';
|
||||
|
||||
if (!$result) {
|
||||
$res = performRemoveClient($c);
|
||||
$result .= $res unless $res eq 'OK';
|
||||
|
||||
if (!$result) {
|
||||
$result = $c->l('wrg_SUCCESSFULLY_REMOVED_CONF');
|
||||
}
|
||||
} ## end if (!$result)
|
||||
} ## end if ($trt eq 'REM')
|
||||
|
||||
if ($trt eq 'NEW') {
|
||||
|
||||
# controls
|
||||
$res = 'OK'; # no controls here...
|
||||
$result .= $res unless $res eq 'OK';
|
||||
|
||||
if (!$result) {
|
||||
$res = performCreateClient($c);
|
||||
$result .= $res unless $res eq 'OK';
|
||||
|
||||
if (!$result) {
|
||||
$result = $c->l('wrg_SUCCESSFULLY_ADDED_CONF');
|
||||
}
|
||||
} ## end if (!$result)
|
||||
} ## end if ($trt eq 'NEW')
|
||||
|
||||
if ($trt eq 'UPD') {
|
||||
|
||||
# controls
|
||||
$res = 'OK'; # no controls here...
|
||||
$result .= $res unless $res eq 'OK';
|
||||
|
||||
if (!$result) {
|
||||
$res = performUpdateConfig($c);
|
||||
$result .= $res unless $res eq 'OK';
|
||||
|
||||
if (!$result) {
|
||||
$result = $c->l('wrg_SUCCESSFULLY_UPDATED_CONF');
|
||||
}
|
||||
} ## end if (!$result)
|
||||
} ## end if ($trt eq 'UPD')
|
||||
|
||||
# common parts
|
||||
|
||||
if ($res ne 'OK') {
|
||||
$c->stash( error => $result );
|
||||
$c->stash( title => $title, wrg_datas => \%wrg_datas );
|
||||
return $c->render('wireguard');
|
||||
$c->stash(error => $result);
|
||||
$c->stash(title => $title, wrg_datas => \%wrg_datas);
|
||||
return $c->render('wireguard');
|
||||
}
|
||||
|
||||
#force reload as successfull (for Main)
|
||||
$wdb = esmith::ConfigDB->open('wireguard');
|
||||
|
||||
$wdb = esmith::ConfigDB::UTF8->open('wireguard');
|
||||
my $message = "'Wireguard' update ($trt) DONE";
|
||||
$c->app->log->info($message);
|
||||
$c->flash( success => $result );
|
||||
|
||||
$c->flash(success => $result);
|
||||
$c->redirect_to('/wireguard');
|
||||
}
|
||||
|
||||
} ## end sub do_action
|
||||
|
||||
# action for 'MOD'
|
||||
sub performModifyClient{
|
||||
|
||||
my $c = shift;
|
||||
my $msg = "OK";
|
||||
|
||||
my $wgacc = $c->param('Wgconf');
|
||||
my $account = $c->param('Account');
|
||||
my $private = $c->param('Private') || '';
|
||||
my $public = $c->param('Public') || '';
|
||||
my $info = $c->param('Info');
|
||||
my $status = $c->param('Status') || 'disabled';
|
||||
my $allowedips = $c->param('Allowedips') || '';
|
||||
sub performModifyClient {
|
||||
my $c = shift;
|
||||
my $msg = "OK";
|
||||
my $wgacc = $c->param('Wgconf');
|
||||
my $account = $c->param('Account');
|
||||
my $private = $c->param('Private') || '';
|
||||
my $public = $c->param('Public') || '';
|
||||
my $info = $c->param('Info');
|
||||
my $status = $c->param('Status') || 'disabled';
|
||||
my $allowedips = $c->param('Allowedips') || '';
|
||||
|
||||
#todo validate fields
|
||||
|
||||
# Untaint info and account before use in system()
|
||||
# Untaint info and account before use in system()
|
||||
($info) = $info =~ /([A-Za-z0-9_\-. ]+)/;
|
||||
# trim both ends
|
||||
|
||||
# trim both ends
|
||||
$info =~ s/^ +| +$//g;
|
||||
($account) = $account =~ /([A-Za-z0-9_-]+)/;
|
||||
|
||||
return $c->l('wrg_ERROR_FIELD_CONTENT') unless ($account and $info);
|
||||
|
||||
my %props = ('user' => $account
|
||||
,'private' => $private
|
||||
,'public' => $public
|
||||
,'info' => $info
|
||||
,'status' => $status
|
||||
,'allowedips' => $allowedips
|
||||
);
|
||||
|
||||
my %props = (
|
||||
'user' => $account,
|
||||
'private' => $private,
|
||||
'public' => $public,
|
||||
'info' => $info,
|
||||
'status' => $status,
|
||||
'allowedips' => $allowedips
|
||||
);
|
||||
$wdb->get($wgacc)->merge_props(%props)
|
||||
or $msg = "Error occurred while modifying pseudonym in database.";
|
||||
|
||||
# Untaint before use in system()
|
||||
($wgacc) = ($wgacc =~ /(\d+\.+\d+\.+\d+\.+\d+\.+\/\d+\.+)/);
|
||||
system( "/sbin/e-smith/signal-event", "wireguard-user-modify", "$wgacc",)
|
||||
== 0 or $msg = "Error occurred while modifying wirequard account.";
|
||||
|
||||
return "$msg"
|
||||
|
||||
}
|
||||
|
||||
system("/sbin/e-smith/signal-event", "wireguard-user-modify", "$wgacc",) == 0
|
||||
or $msg = "Error occurred while modifying wirequard account.";
|
||||
return "$msg";
|
||||
} ## end sub performModifyClient
|
||||
|
||||
# action for 'NEW'
|
||||
sub performCreateClient {
|
||||
|
||||
my $c = shift;
|
||||
my $type = shift;
|
||||
|
||||
my $c = shift;
|
||||
my $type = shift;
|
||||
my $username = $c->param('Account');
|
||||
my $info = $c->param('Info');
|
||||
my $info = $c->param('Info');
|
||||
|
||||
# Untaint info and account before use in system()
|
||||
# Untaint info and account before use in system()
|
||||
($info) = $info =~ /([A-Za-z0-9_\-. ]+)/;
|
||||
# trim both ends
|
||||
|
||||
# trim both ends
|
||||
$info =~ s/^ +| +$//g;
|
||||
|
||||
($username) = $username =~ /([A-Za-z0-9_-]+)/;
|
||||
|
||||
return $c->l('wrg_ERROR_FIELD_CONTENT') unless ($username and $info);
|
||||
|
||||
#get username
|
||||
my $user = $adb->get($username) or return "$username does not exist";
|
||||
my $user = $adb->get($username) or return "$username does not exist";
|
||||
return $c->l('wrg_ERROR_WRONG_ACCT_TYPE') unless $user->prop("type") eq "user" or $user->key eq "admin";
|
||||
$username = $user->key;
|
||||
|
||||
# execute the event wireguard-user-create username info
|
||||
unless ( system ("/sbin/e-smith/signal-event", "wireguard-user-create", "$username" , "$info") == 0 ){
|
||||
unless (system("/sbin/e-smith/signal-event", "wireguard-user-create", "$username", "$info") == 0) {
|
||||
return $c->error('wrg_ERROR_OCCURED');
|
||||
}
|
||||
|
||||
return 'OK';
|
||||
}
|
||||
|
||||
} ## end sub performCreateClient
|
||||
|
||||
# action for 'UPD'
|
||||
sub performUpdateConfig {
|
||||
|
||||
my $c = shift;
|
||||
my $msg = "OK";
|
||||
|
||||
my $ip = $c->param('Ip');
|
||||
my $mask = $c->param('Mask');
|
||||
my $c = shift;
|
||||
my $msg = "OK";
|
||||
my $ip = $c->param('Ip');
|
||||
my $mask = $c->param('Mask');
|
||||
my $private = $c->param('Private');
|
||||
my $public = $c->param('Public');
|
||||
my $status = $c->param('Status');
|
||||
my $public = $c->param('Public');
|
||||
my $status = $c->param('Status');
|
||||
|
||||
unless (defined $private) {
|
||||
$private =`/usr/bin/wg genkey`;
|
||||
($private) = ($private =~ /(\w+)/);
|
||||
$public = `/usr/bin/echo $private | /usr/bin/wg pubkey`;
|
||||
$private = `/usr/bin/wg genkey`;
|
||||
($private) = ($private =~ /(\w+)/);
|
||||
$public = `/usr/bin/echo $private | /usr/bin/wg pubkey`;
|
||||
}
|
||||
|
||||
# we get number of entries in wireguard db
|
||||
my @num=$wdb->get_all_by_prop(type=>"wg0");
|
||||
if ( scalar @num >0 ) {
|
||||
# we get current values
|
||||
my $pprivate=$cdb->get('wg-quick@wg0')->prop('private');
|
||||
my $ppublic=$cdb->get('wg-quick@wg0')->prop('public');
|
||||
my $pip=$cdb->get('wg-quick@wg0')->prop('ip');
|
||||
my $pmask=$cdb->get('wg-quick@wg0')->prop('mask');
|
||||
# if # entries >0 and private |public | ip is chnaged then we push an error and stop
|
||||
if ($pprivate ne $private || $ppublic ne $public || $pip ne $ip || $mask ne $pmask) {
|
||||
return $c->l('wrg_CLIENTS_ALREADY_CONFIGURED');
|
||||
}
|
||||
}
|
||||
my @num = $wdb->get_all_by_prop(type => "wg0");
|
||||
|
||||
if (scalar @num > 0) {
|
||||
|
||||
# we get current values
|
||||
my $pprivate = $cdb->get('wg-quick@wg0')->prop('private');
|
||||
my $ppublic = $cdb->get('wg-quick@wg0')->prop('public');
|
||||
my $pip = $cdb->get('wg-quick@wg0')->prop('ip');
|
||||
my $pmask = $cdb->get('wg-quick@wg0')->prop('mask');
|
||||
|
||||
# if # entries >0 and private |public | ip is chnaged then we push an error and stop
|
||||
if ($pprivate ne $private || $ppublic ne $public || $pip ne $ip || $mask ne $pmask) {
|
||||
return $c->l('wrg_CLIENTS_ALREADY_CONFIGURED');
|
||||
}
|
||||
} ## end if (scalar @num > 0)
|
||||
|
||||
#todo validate fields
|
||||
|
||||
my %props = ('ip' => $ip
|
||||
,'mask' => $mask
|
||||
,'private' => $private
|
||||
,'public' => $public
|
||||
,'status' => $status
|
||||
);
|
||||
my %props = (
|
||||
'ip' => $ip,
|
||||
'mask' => $mask,
|
||||
'private' => $private,
|
||||
'public' => $public,
|
||||
'status' => $status
|
||||
);
|
||||
|
||||
# Test Ip is inside CIDR
|
||||
if (!test_for_private_ip($ip,$mask)) {
|
||||
if (!test_for_private_ip($ip, $mask)) {
|
||||
$msg = "IP must be in private range";
|
||||
|
||||
#$fm->error($msg);return;
|
||||
}
|
||||
|
||||
$cdb->get('wg-quick@wg0')->merge_props(%props)
|
||||
or $msg = "Error occurred while modifying server details.";
|
||||
|
||||
if ($msg eq "OK") {
|
||||
|
||||
if ($msg eq "OK"){
|
||||
# Untaint before use in system()
|
||||
($ip) = ($ip =~ /(\d+\.+\d+\.+\d+\.+\d+\.+\/\d+\.+)/);
|
||||
system( "/sbin/e-smith/signal-event", "wireguard-conf-modify", "$ip",)
|
||||
== 0 or $msg = "Error occurred while modifying wireguard conf.";
|
||||
}
|
||||
|
||||
# Untaint before use in system()
|
||||
($ip) = ($ip =~ /(\d+\.+\d+\.+\d+\.+\d+\.+\/\d+\.+)/);
|
||||
system("/sbin/e-smith/signal-event", "wireguard-conf-modify", "$ip",) == 0
|
||||
or $msg = "Error occurred while modifying wireguard conf.";
|
||||
} ## end if ($msg eq "OK")
|
||||
return "$msg";
|
||||
|
||||
}
|
||||
|
||||
} ## end sub performUpdateConfig
|
||||
|
||||
# action for 'REM'
|
||||
sub performRemoveClient{
|
||||
|
||||
sub performRemoveClient {
|
||||
my ($c) = @_;
|
||||
|
||||
my $conf = $c->param('Wgconf');
|
||||
if ($c->param("remove")){
|
||||
unless ($wdb->get($conf)->delete()){
|
||||
return $c->l('wrg_ERROR_OCCURED');
|
||||
|
||||
if ($c->param("remove")) {
|
||||
unless ($wdb->get($conf)->delete()) {
|
||||
return $c->l('wrg_ERROR_OCCURED');
|
||||
}
|
||||
unless (system ("/sbin/e-smith/signal-event", "wireguard-user-delete") == 0 ){
|
||||
return $c->l('wrg_ERROR_OCCURED');
|
||||
|
||||
unless (system("/sbin/e-smith/signal-event", "wireguard-user-delete") == 0) {
|
||||
return $c->l('wrg_ERROR_OCCURED');
|
||||
}
|
||||
return 'OK';
|
||||
}
|
||||
return 'OK';
|
||||
} ## end if ($c->param("remove"...))
|
||||
return $c->l('wrg_CANCELLED');
|
||||
|
||||
}
|
||||
|
||||
} ## end sub performRemoveClient
|
||||
|
||||
# called from templates
|
||||
sub get_existing_accounts {
|
||||
|
||||
my $c = shift;
|
||||
my $c = shift;
|
||||
my @existingAccounts = ('Administrator');
|
||||
|
||||
foreach my $account ($adb->get_all_by_prop(type=>'user')) {
|
||||
push @existingAccounts, $account->key;
|
||||
foreach my $account ($adb->get_all_by_prop(type => 'user')) {
|
||||
push @existingAccounts, $account->key;
|
||||
}
|
||||
return \@existingAccounts;
|
||||
|
||||
}
|
||||
|
||||
} ## end sub get_existing_accounts
|
||||
|
||||
# called from templates
|
||||
sub get_wgs_info {
|
||||
|
||||
my ($c, $attr, $data) = @_;
|
||||
|
||||
return undef if ( not defined $attr or not defined $data );
|
||||
|
||||
return undef if (not defined $attr or not defined $data);
|
||||
my $value;
|
||||
$value = $wdb->get("$data")->prop('info') if ( $attr eq 'info' and $wdb->get("$data") );
|
||||
$value = $wdb->get("$data")->prop('user') if ( $attr eq 'user' and $wdb->get("$data") );
|
||||
|
||||
$value = $wdb->get("$data")->prop('info') if ($attr eq 'info' and $wdb->get("$data"));
|
||||
$value = $wdb->get("$data")->prop('user') if ($attr eq 'user' and $wdb->get("$data"));
|
||||
return $value;
|
||||
|
||||
}
|
||||
|
||||
} ## end sub get_wgs_info
|
||||
|
||||
# called from templates
|
||||
sub get_conf_info {
|
||||
|
||||
my ( $c, $ipacc ) = @_;
|
||||
my ($c, $ipacc) = @_;
|
||||
##my $ipacc = $c->param('Wgconf');
|
||||
|
||||
#untaint
|
||||
($ipacc) = $ipacc =~ /(\d+\.\d+\.\d+\.\d+\/\d+)/;
|
||||
#get from db
|
||||
($ipacc) = $ipacc =~ /(\d+\.\d+\.\d+\.\d+\/\d+)/;
|
||||
|
||||
#get from db
|
||||
# return if does not exist
|
||||
my $acc = $wdb->get($ipacc) or return undef;
|
||||
|
||||
# return if current user is not admin or the user
|
||||
return undef unless $c->is_admin;
|
||||
|
||||
my $key = $acc->key;
|
||||
my $info = $acc->prop('info');
|
||||
my $private = $acc->prop('private');
|
||||
my $wg0 = $cdb->get('wg-quick@wg0');
|
||||
my $key = $acc->key;
|
||||
my $info = $acc->prop('info');
|
||||
my $private = $acc->prop('private');
|
||||
my $wg0 = $cdb->get('wg-quick@wg0');
|
||||
my $ServPublic = $wg0->prop('public');
|
||||
my $Port = $wg0->prop('UDPPort');
|
||||
my $Port = $wg0->prop('UDPPort');
|
||||
my $allowedips = $acc->prop('allowedips') || "0.0.0.0/0";
|
||||
|
||||
#here we guess wan IP
|
||||
# are we server-gateway mode ? so external lan, should do
|
||||
# are we server-gateway mode ? so external lan, should do
|
||||
# else we should guess from an external service
|
||||
my $ExternalIP = $cdb->get('ExternalInterface')->prop('IPAddress');
|
||||
$ExternalIP = get_internet_ip_address() unless defined $ExternalIP;
|
||||
|
||||
#DNS
|
||||
my $IPAddress = $cdb->get('InternalInterface')->prop('IPAddress');
|
||||
my $dns = ($allowedips =~ /0.0.0.0\/0/)? "DNS = $IPAddress" : "" ;
|
||||
|
||||
my $fulltext ="#configuration for $key $info
|
||||
my $dns = ($allowedips =~ /0.0.0.0\/0/) ? "DNS = $IPAddress" : "";
|
||||
my $fulltext = "#configuration for $key $info
|
||||
[Interface]
|
||||
PrivateKey = $private
|
||||
Address = $key
|
||||
@@ -462,114 +429,99 @@ PublicKey = $ServPublic
|
||||
AllowedIPs = $allowedips
|
||||
Endpoint = $ExternalIP:$Port
|
||||
";
|
||||
my @fulltext = split( "\n", $fulltext);
|
||||
|
||||
my @fulltext = split("\n", $fulltext);
|
||||
return \@fulltext;
|
||||
|
||||
}
|
||||
|
||||
} ## end sub get_conf_info
|
||||
|
||||
# called from templates
|
||||
sub get_conf_qr {
|
||||
|
||||
my ( $c, $fulltext, $type) = @_;
|
||||
|
||||
my $qr=`echo "$fulltext" |qrencode -t PNG -o - |base64`;
|
||||
|
||||
my ($c, $fulltext, $type) = @_;
|
||||
my $qr = `echo "$fulltext" |qrencode -t PNG -o - |base64`;
|
||||
return $qr;
|
||||
|
||||
}
|
||||
|
||||
|
||||
sub get_internet_ip_address {
|
||||
|
||||
#we could use DNS to do this faster but some provider will block DNS
|
||||
#dig +short myip.opendns.com @resolver1.opendns.com
|
||||
#also resolver1.opendns.com resolver2.opendns.com resolver3.opendns.com
|
||||
#here a list of available site with https
|
||||
use Net::DNS;
|
||||
use LWP::Simple;
|
||||
my $timeout=1;
|
||||
#we could use DNS to do this faster but some provider will block DNS
|
||||
#dig +short myip.opendns.com @resolver1.opendns.com
|
||||
#also resolver1.opendns.com resolver2.opendns.com resolver3.opendns.com
|
||||
#here a list of available site with https
|
||||
use Net::DNS;
|
||||
use LWP::Simple;
|
||||
my $timeout = 1;
|
||||
my @httpslist = qw(
|
||||
checkip.amazonaws.com
|
||||
myexternalip.com/raw
|
||||
ifconfig.me/
|
||||
icanhazip.com/
|
||||
ident.me/
|
||||
tnx.nl/ip
|
||||
ipecho.net/plain
|
||||
wgetip.com/
|
||||
ip.tyk.nu/
|
||||
bot.whatismyipaddress.com/
|
||||
ipof.in/txt
|
||||
l2.io/ip
|
||||
eth0.me/ );
|
||||
my @dns = (
|
||||
[ 'myip.opendns.com', 'resolver1.opendns.com', 'A' ],
|
||||
[ 'myip.opendns.com', 'resolver2.opendns.com', 'A' ],
|
||||
[ 'myip.opendns.com', 'resolver3.opendns.com', 'A' ],
|
||||
[ 'myip.opendns.com', 'resolver4.opendns.com', 'A' ],
|
||||
[ 'whoami.akamai.net', 'ns1-1.akamaitech.net', 'A' ],
|
||||
[ 'o-o.myaddr.l.google.com', 'ns1.google.com', 'TXT' ]
|
||||
);
|
||||
my $ip;
|
||||
|
||||
my @httpslist=qw(
|
||||
checkip.amazonaws.com
|
||||
myexternalip.com/raw
|
||||
ifconfig.me/
|
||||
icanhazip.com/
|
||||
ident.me/
|
||||
tnx.nl/ip
|
||||
ipecho.net/plain
|
||||
wgetip.com/
|
||||
ip.tyk.nu/
|
||||
bot.whatismyipaddress.com/
|
||||
ipof.in/txt
|
||||
l2.io/ip
|
||||
eth0.me/ );
|
||||
my @dns = (
|
||||
['myip.opendns.com', 'resolver1.opendns.com', 'A'],
|
||||
['myip.opendns.com', 'resolver2.opendns.com', 'A'],
|
||||
['myip.opendns.com', 'resolver3.opendns.com', 'A'],
|
||||
['myip.opendns.com', 'resolver4.opendns.com', 'A'],
|
||||
['whoami.akamai.net', 'ns1-1.akamaitech.net', 'A'],
|
||||
['o-o.myaddr.l.google.com', 'ns1.google.com', 'TXT']
|
||||
|
||||
);
|
||||
|
||||
my $ip;
|
||||
|
||||
#foreach my $i ( 0 .. $#dns) {
|
||||
# dns calls; test only one random...
|
||||
my $i = rand(@httpslist);
|
||||
my $res = Net::DNS::Resolver->new(
|
||||
#foreach my $i ( 0 .. $#dns) {
|
||||
# dns calls; test only one random...
|
||||
my $i = rand(@httpslist);
|
||||
my $res = Net::DNS::Resolver->new(
|
||||
nameservers => [ $dns[$i][1] ],
|
||||
udp_timeout => $timeout,
|
||||
tcp_timeout => $timeout
|
||||
);
|
||||
);
|
||||
my $reply = $res->search($dns[$i][0], $dns[$i][2]);
|
||||
|
||||
my $reply = $res->search($dns[$i][0], $dns[$i][2]);
|
||||
if ($reply) {
|
||||
foreach my $rr ($reply->answer) {
|
||||
$ip= $rr->txtdata if $rr->can("txtdata");
|
||||
$ip= $rr->address if $rr->can("address");
|
||||
# untaint, dns output is tainted
|
||||
($ip) = $ip =~ /(\d+\.\d+\.\d+\.\d+)/;
|
||||
return $ip if $ip =~ /(\d+\.\d+\.\d+\.\d+)/;
|
||||
if ($reply) {
|
||||
foreach my $rr ($reply->answer) {
|
||||
$ip = $rr->txtdata if $rr->can("txtdata");
|
||||
$ip = $rr->address if $rr->can("address");
|
||||
|
||||
# untaint, dns output is tainted
|
||||
($ip) = $ip =~ /(\d+\.\d+\.\d+\.\d+)/;
|
||||
return $ip if $ip =~ /(\d+\.\d+\.\d+\.\d+)/;
|
||||
} ## end foreach my $rr ($reply->answer)
|
||||
} else {
|
||||
warn "query failed: ", $res->errorstring, "\n";
|
||||
}
|
||||
} else {
|
||||
warn "query failed: ", $res->errorstring, "\n";
|
||||
}
|
||||
#}
|
||||
|
||||
# https calls
|
||||
my $ii=0;
|
||||
my $service;
|
||||
while ( $ii <5 ) {
|
||||
$service=$httpslist[rand(@httpslist)];
|
||||
$ip = (get "https://$service" );
|
||||
chomp $ip;
|
||||
$ii++;
|
||||
last if $ip =~ /(\d+\.\d+\.\d+\.\d+)/;
|
||||
}
|
||||
# not needed but in case, untaint
|
||||
($ip) = $ip =~ /(\d+\.\d+\.\d+\.\d+)/;
|
||||
return $ip;
|
||||
#}
|
||||
# https calls
|
||||
my $ii = 0;
|
||||
my $service;
|
||||
|
||||
}
|
||||
while ($ii < 5) {
|
||||
$service = $httpslist[ rand(@httpslist) ];
|
||||
$ip = (get "https://$service");
|
||||
chomp $ip;
|
||||
$ii++;
|
||||
last if $ip =~ /(\d+\.\d+\.\d+\.\d+)/;
|
||||
} ## end while ($ii < 5)
|
||||
|
||||
# not needed but in case, untaint
|
||||
($ip) = $ip =~ /(\d+\.\d+\.\d+\.\d+)/;
|
||||
return $ip;
|
||||
} ## end sub get_internet_ip_address
|
||||
|
||||
sub test_for_private_ip {
|
||||
|
||||
use NetAddr::IP;
|
||||
$_ = shift;
|
||||
my $mask = shift;
|
||||
return unless /(\d+\.\d+\.\d+\.\d+)/;
|
||||
my $iprange = NetAddr::IP->new($1,"$mask");
|
||||
return unless $iprange;
|
||||
return ($iprange->first()->is_rfc1918() and $iprange->last()->is_rfc1918());
|
||||
|
||||
}
|
||||
|
||||
|
||||
use NetAddr::IP;
|
||||
$_ = shift;
|
||||
my $mask = shift;
|
||||
return unless /(\d+\.\d+\.\d+\.\d+)/;
|
||||
my $iprange = NetAddr::IP->new($1, "$mask");
|
||||
return unless $iprange;
|
||||
return ($iprange->first()->is_rfc1918() and $iprange->last()->is_rfc1918());
|
||||
} ## end sub test_for_private_ip
|
||||
1
|
||||
|
||||
__END__
|
||||
__END__
|
||||
@@ -46,10 +46,10 @@
|
||||
'wrg_ERROR_WRONG_ACCT_TYPE' => 'The associated account shoult be a user or admin account.',
|
||||
'wrg_ERROR_OCCURED' => 'An error occured',
|
||||
'wrg_CLIENTS_ALREADY_CONFIGURED' => 'You can not alter the server ip, mask, private and public key as there are already some clients configured.',
|
||||
'wrg_NO_CONF' => 'No configured client',
|
||||
'wrg_NO_CONF' => 'No configured clients',
|
||||
'wrg_INTERFACE' => 'Interface',
|
||||
'wrg_CANCELLED' => 'Operation cancelled',
|
||||
'wrg_SUCCESSFULLY_MODIFIED_CONF' => 'Client configuration successfully modified',
|
||||
'wrg_SUCCESSFULLY_REMOVED_CONF' => 'Client successfully removed',
|
||||
'wrg_SUCCESSFULLY_ADDED_CONF' => 'New client successfully added',
|
||||
'wrg_SUCCESSFULLY_UPDATED_CONF' => 'Server configuration successfully modified',
|
||||
'wrg_SUCCESSFULLY_UPDATED_CONF' => 'Server configuration successfully modified',
|
||||
@@ -1,73 +1,74 @@
|
||||
<div id='wrg_list'>
|
||||
|
||||
<p><%=l 'wrg_DESC_MAIN_PAGE'%><br></p>
|
||||
<p><%= l 'wrg_DESC_MAIN_PAGE' %><br></p>
|
||||
|
||||
%= form_for 'wireguard' => (method => 'POST') => begin
|
||||
%= hidden_field 'trt' => 'UPD'
|
||||
<p><%=l 'wrg_LABEL_CONFIG'%><br><br></p>
|
||||
%= submit_button l('wrg_EDIT_CONFIG'), class => 'action'
|
||||
% end
|
||||
%= form_for 'wireguard' => (method => 'POST') => begin
|
||||
%= hidden_field 'trt' => 'UPD'
|
||||
<p><%= l 'wrg_LABEL_CONFIG' %><br><br></p>
|
||||
%= submit_button l('wrg_EDIT_CONFIG'), class => 'action'
|
||||
% end
|
||||
|
||||
<p><span class=label>
|
||||
%=l 'wrg_INTERFACE'
|
||||
</span> wg0<br></p>
|
||||
<p><span class=label>
|
||||
%= l 'wrg_INTERFACE'
|
||||
</span> wg0<br></p>
|
||||
|
||||
<p><span class=label>
|
||||
%=l 'wrg_LABEL_STATUS'
|
||||
</span>
|
||||
%= $wrg_datas->{sstatus}
|
||||
<br></p>
|
||||
<p><span class=label>
|
||||
%= l 'wrg_LABEL_STATUS'
|
||||
</span>
|
||||
%= $wrg_datas->{sstatus}
|
||||
<br></p>
|
||||
|
||||
<p><span class=label>
|
||||
%=l 'wrg_PUBLIC_KEY'
|
||||
</span>
|
||||
%= $wrg_datas->{wgpub}
|
||||
<br></p>
|
||||
<p><span class=label>
|
||||
%= l 'wrg_PUBLIC_KEY'
|
||||
</span>
|
||||
%= $wrg_datas->{wgpub}
|
||||
<br></p>
|
||||
|
||||
<p><span class=label>
|
||||
%=l 'wrg_IP'
|
||||
</span>
|
||||
%= $wrg_datas->{wgip}.'/'.$wrg_datas->{wgmask}
|
||||
<br></p>
|
||||
<p><span class=label>
|
||||
%= l 'wrg_IP'
|
||||
</span>
|
||||
%= $wrg_datas->{wgip}.'/'.$wrg_datas->{wgmask}
|
||||
<br></p>
|
||||
|
||||
<p><span class=label>
|
||||
%=l 'wrg_PORT'
|
||||
</span>
|
||||
%= $wrg_datas->{wgport}
|
||||
<br></p>
|
||||
<p><span class=label>
|
||||
%= l 'wrg_PORT'
|
||||
</span>
|
||||
%= $wrg_datas->{wgport}
|
||||
<br></p>
|
||||
<br />
|
||||
|
||||
<table class="sme-border"><tbody>
|
||||
<tr>
|
||||
<th class='sme-border'>
|
||||
%=l 'wrg_PUBLIC_KEY'
|
||||
</th><th class='sme-border'>
|
||||
%=l 'wrg_INFO'
|
||||
</th><th class='sme-border'>
|
||||
%=l 'wrg_ENDPOINT'
|
||||
</th><th class='sme-border'>
|
||||
%=l 'wrg_VPN_IP'
|
||||
</th><th class='sme-border'>
|
||||
%=l 'wrg_LATEST_HANDSHAKE'
|
||||
</th><th class='sme-border'>
|
||||
%=l 'wrg_RECEIVED'
|
||||
</th><th class='sme-border'>
|
||||
%=l 'wrg_SENT'
|
||||
</th><th class='sme-border'>
|
||||
%=l 'wrg_KEEPALIVE'
|
||||
</th>
|
||||
</tr>
|
||||
<table class="sme-border"><tbody>
|
||||
<tr>
|
||||
<th class='sme-border'>
|
||||
%= l 'wrg_PUBLIC_KEY'
|
||||
</th><th class='sme-border'>
|
||||
%= l 'wrg_INFO'
|
||||
</th><th class='sme-border'>
|
||||
%= l 'wrg_ENDPOINT'
|
||||
</th><th class='sme-border'>
|
||||
%= l 'wrg_VPN_IP'
|
||||
</th><th class='sme-border'>
|
||||
%= l 'wrg_LATEST_HANDSHAKE'
|
||||
</th><th class='sme-border'>
|
||||
%= l 'wrg_RECEIVED'
|
||||
</th><th class='sme-border'>
|
||||
%= l 'wrg_SENT'
|
||||
</th><th class='sme-border'>
|
||||
%= l 'wrg_KEEPALIVE'
|
||||
</th>
|
||||
</tr>
|
||||
|
||||
% if (scalar @$wgstatus > 0) {
|
||||
% foreach my $list (@$wgstatus) {
|
||||
% #public-key | private-key | listen-port |persistent-keepalive
|
||||
% my @line = split(' ',$list);
|
||||
% next if $line[1] eq $wrg_datas->{wgpub};
|
||||
% my ($ginfo, $user);
|
||||
% $ginfo = $c->get_wgs_info('info', "$line[3]");
|
||||
% $user = $c->get_wgs_info('user', "$line[3]");
|
||||
% use POSIX qw( strftime );
|
||||
% my $dateR= ($line[4] ) ? strftime("%Y-%m-%d %H:%M:%S", localtime($line[4])) : " ";
|
||||
<tr>
|
||||
% if (scalar @$wgstatus > 0) {
|
||||
% foreach my $list (@$wgstatus) {
|
||||
% #public-key | private-key | listen-port |persistent-keepalive
|
||||
% my @line = split(' ',$list);
|
||||
% next if $line[1] eq $wrg_datas->{wgpub};
|
||||
% my ($ginfo, $user);
|
||||
% $ginfo = $c->get_wgs_info('info', "$line[3]");
|
||||
% $user = $c->get_wgs_info('user', "$line[3]");
|
||||
% use POSIX qw( strftime );
|
||||
% my $dateR= ($line[4] ) ? strftime("%Y-%m-%d %H:%M:%S", localtime($line[4])) : " ";
|
||||
<tr>
|
||||
%= t td => (class => 'sme-border') => $line[0]
|
||||
%= t td => (class => 'sme-border') => "$user : $ginfo"
|
||||
%= t td => (class => 'sme-border') => $line[2]
|
||||
@@ -76,55 +77,56 @@
|
||||
%= t td => (class => 'sme-border') => $line[5]
|
||||
%= t td => (class => 'sme-border') => $line[6]
|
||||
%= t td => (class => 'sme-border') => $line[7]
|
||||
</tr>
|
||||
% }
|
||||
% }
|
||||
</tbody></table>
|
||||
</tr>
|
||||
% }
|
||||
% }
|
||||
</tbody></table>
|
||||
|
||||
%= form_for 'wireguard' => (method => 'POST') => begin
|
||||
<hr class='sectionbar'/>
|
||||
<p><%=l 'wrg_LABEL_CLIENTS'%><br><br></p>
|
||||
%= hidden_field 'trt' => 'NEW'
|
||||
%= submit_button l('wrg_ADD_CLIENT'), class => 'action'
|
||||
% end
|
||||
|
||||
% if ( scalar @$wgconf == 0 ) {
|
||||
%=l 'wrg_NO_CONF'
|
||||
% } else {
|
||||
<table class="sme-border"><tbody>
|
||||
<tr>
|
||||
<th class='sme-border'>
|
||||
%=l 'wrg_CONF_NAME'
|
||||
</th><th class='sme-border'>
|
||||
%=l 'wrg_USER'
|
||||
</th><th class='sme-border'>
|
||||
%=l 'wrg_INFO'
|
||||
</th><th class='sme-border'>
|
||||
%=l 'wrg_LABEL_STATUS'
|
||||
</th><th class='sme-border' colspan='3'>
|
||||
%=l 'ACTION'
|
||||
</th>
|
||||
</tr>
|
||||
% foreach my $conf (@$wgconf) {
|
||||
% my $status = $c->l(uc($conf->prop('status') || 'enabled'));
|
||||
<tr>
|
||||
%= t td => (class => 'sme-border') => $conf->key
|
||||
%= t td => (class => 'sme-border') => $conf->prop('user') || ''
|
||||
%= t td => (class => 'sme-border') => $conf->prop('info') || ''
|
||||
%= t td => (class => 'sme-border') => $status
|
||||
% my $action =
|
||||
% "<a href='wireguard2?CsrfDef=TOKEN&trt=QRC&Wgconf=" . $conf->key . "'>" . l('wrg_QRCODE') . "</a>";
|
||||
<td class='sme-border'><%= $c->render_to_string(inline => $action) %></td>
|
||||
% $action =
|
||||
% "<a href='wireguard2?CsrfDef=TOKEN&trt=MOD&Wgconf=" . $conf->key . "'>" . l('MODIFY') . "</a>";
|
||||
<td class='sme-border'><%= $c->render_to_string(inline => $action) %></td>
|
||||
% $action =
|
||||
% "<a href='wireguard2?CsrfDef=TOKEN&trt=REM&Wgconf=" . $conf->key . "'>" . l('REMOVE') . "</a>";
|
||||
<td class='sme-border'><%= $c->render_to_string(inline => $action) %></td>
|
||||
</tr>
|
||||
% }
|
||||
</tbody>
|
||||
</table>
|
||||
%}
|
||||
%= form_for 'wireguard' => (method => 'POST') => begin
|
||||
<hr class='sectionbar'/>
|
||||
</div>
|
||||
<p><%= l 'wrg_LABEL_CLIENTS' %><br><br></p>
|
||||
%= hidden_field 'trt' => 'NEW'
|
||||
%= submit_button l('wrg_ADD_CLIENT'), class => 'action'
|
||||
% end
|
||||
|
||||
% if ( scalar @$wgconf == 0 ) {
|
||||
%= l 'wrg_NO_CONF'
|
||||
% } else {
|
||||
<br />
|
||||
<table class="sme-border"><tbody>
|
||||
<tr>
|
||||
<th class='sme-border'>
|
||||
%= l 'wrg_CONF_NAME'
|
||||
</th><th class='sme-border'>
|
||||
%= l 'wrg_USER'
|
||||
</th><th class='sme-border'>
|
||||
%= l 'wrg_INFO'
|
||||
</th><th class='sme-border'>
|
||||
%= l 'wrg_LABEL_STATUS'
|
||||
</th><th class='sme-border' colspan='3'>
|
||||
%= l 'ACTION'
|
||||
</th>
|
||||
</tr>
|
||||
% foreach my $conf (@$wgconf) {
|
||||
% my $status = $c->l(uc($conf->prop('status') || 'enabled'));
|
||||
<tr>
|
||||
%= t td => (class => 'sme-border') => $conf->key
|
||||
%= t td => (class => 'sme-border') => $conf->prop('user') || ''
|
||||
%= t td => (class => 'sme-border') => $conf->prop('info') || ''
|
||||
%= t td => (class => 'sme-border') => $status
|
||||
% my $action =
|
||||
% "<a href='wireguard2?CsrfDef=TOKEN&trt=QRC&Wgconf=" . $conf->key . "'>" . l('wrg_QRCODE') . "</a>";
|
||||
<td class='sme-border'><%= $c->render_to_string(inline => $action) %></td>
|
||||
% $action =
|
||||
% "<a href='wireguard2?CsrfDef=TOKEN&trt=MOD&Wgconf=" . $conf->key . "'>" . l('MODIFY') . "</a>";
|
||||
<td class='sme-border'><%= $c->render_to_string(inline => $action) %></td>
|
||||
% $action =
|
||||
% "<a href='wireguard2?CsrfDef=TOKEN&trt=REM&Wgconf=" . $conf->key . "'>" . l('REMOVE') . "</a>";
|
||||
<td class='sme-border'><%= $c->render_to_string(inline => $action) %></td>
|
||||
</tr>
|
||||
% }
|
||||
</tbody>
|
||||
</table>
|
||||
% }
|
||||
<hr class='sectionbar'/>
|
||||
</div>
|
||||
@@ -1,94 +1,103 @@
|
||||
|
||||
Mojolicious Template Code Formatter vmojofmt 0.1.9
|
||||
Input data:
|
||||
Upload a file:
|
||||
(none)
|
||||
Remove empty lines from output
|
||||
Formatted Output:
|
||||
Output Syntax:
|
||||
|
||||
<div id='wrg_mod'>
|
||||
|
||||
%= form_for '/wireguard2' => (method => 'POST') => begin
|
||||
<p>
|
||||
%=l 'wrg_DESC_MODIFY_CLIENT_PAGE'
|
||||
</p>
|
||||
<hr class='sectionbar'/>
|
||||
%= form_for '/wireguard2' => (method => 'POST') => begin
|
||||
<p>
|
||||
%= l 'wrg_DESC_MODIFY_CLIENT_PAGE'
|
||||
</p>
|
||||
<hr class='sectionbar'/>
|
||||
|
||||
<p>
|
||||
%=l 'wrg_DESC_CONF_NAME'
|
||||
</p>
|
||||
<p>
|
||||
%= l 'wrg_DESC_CONF_NAME'
|
||||
</p>
|
||||
|
||||
<p><span class=label>
|
||||
%=l 'wrg_CONF_NAME'
|
||||
</span>
|
||||
%= $wrg_datas->{wgconf}
|
||||
<br></p>
|
||||
<p><span class=label>
|
||||
%= l 'wrg_CONF_NAME'
|
||||
</span>
|
||||
%= $wrg_datas->{wgconf}
|
||||
<br></p>
|
||||
|
||||
<p>
|
||||
%=l 'wrg_DESC_SELECT_ACCOUNT'
|
||||
</p>
|
||||
<p>
|
||||
%= l 'wrg_DESC_SELECT_ACCOUNT'
|
||||
</p>
|
||||
|
||||
<p><span class=label>
|
||||
%=l 'wrg_SELECT_ACCOUNT'
|
||||
</span><span class=data>
|
||||
% param 'Account' => $wrg_datas->{account} unless param 'Account';
|
||||
%= select_field 'Account' => $c->get_existing_accounts(), class => 'input'
|
||||
<br></span></p>
|
||||
<p><span class=label>
|
||||
%= l 'wrg_SELECT_ACCOUNT'
|
||||
</span><span class=data>
|
||||
% param 'Account' => $wrg_datas->{account} unless param 'Account';
|
||||
%= select_field 'Account' => $c->get_existing_accounts(), class => 'input'
|
||||
<br></span></p>
|
||||
|
||||
<p>
|
||||
%=l 'wrg_DESC_INFO_ACC_WIREGUARD'
|
||||
</p>
|
||||
<p>
|
||||
%= l 'wrg_DESC_INFO_ACC_WIREGUARD'
|
||||
</p>
|
||||
|
||||
<p><span class=label>
|
||||
%=l 'wrg_INFO_ACC_WIREGUARD'
|
||||
</span><span class=data>
|
||||
% param 'Info' => $wrg_datas->{info} unless param 'Info';
|
||||
%=text_field 'Info' => size => '45', class => 'input'
|
||||
<br></span></p>
|
||||
|
||||
<p>
|
||||
%=l 'wrg_DESC_PRIVATE'
|
||||
</p>
|
||||
<p><span class=label>
|
||||
%= l 'wrg_INFO_ACC_WIREGUARD'
|
||||
</span><span class=data>
|
||||
% param 'Info' => $wrg_datas->{info} unless param 'Info';
|
||||
%= text_field 'Info' => size => '45', class => 'input'
|
||||
<br></span></p>
|
||||
|
||||
<p><span class=label>
|
||||
%=l 'wrg_LABEL_PRIVATE'
|
||||
</span><span class=data>
|
||||
% param 'Private' => $wrg_datas->{private} unless param 'Private';
|
||||
%=text_field 'Private' => size => '45', class => 'input'
|
||||
<br></span></p>
|
||||
|
||||
<p>
|
||||
%=l 'wrg_DESC_PUBLIC'
|
||||
</p>
|
||||
<p>
|
||||
%= l 'wrg_DESC_PRIVATE'
|
||||
</p>
|
||||
|
||||
<p><span class=label>
|
||||
%=l 'wrg_LABEL_PUBLIC'
|
||||
</span><span class=data>
|
||||
% param 'Public' => $wrg_datas->{public} unless param 'Public';
|
||||
%=text_field 'Public' => size => '45', class => 'input'
|
||||
<br></span></p>
|
||||
|
||||
<p>
|
||||
%=l 'wrg_DESC_STATUS'
|
||||
</p>
|
||||
<p><span class=label>
|
||||
%= l 'wrg_LABEL_PRIVATE'
|
||||
</span><span class=data>
|
||||
% param 'Private' => $wrg_datas->{private} unless param 'Private';
|
||||
%= text_field 'Private' => size => '45', class => 'input'
|
||||
<br></span></p>
|
||||
|
||||
<p><span class=label>
|
||||
%=l 'wrg_LABEL_STATUS'
|
||||
</span><span class=data>
|
||||
% param 'Status' => $wrg_datas->{status} unless param 'Status';
|
||||
%= select_field 'Status' => [[ (l 'DISABLED') => 'disabled'], [ (l 'ENABLED') => 'enabled']], class => 'input'
|
||||
<br></span></p>
|
||||
<p>
|
||||
%= l 'wrg_DESC_PUBLIC'
|
||||
</p>
|
||||
|
||||
<p>
|
||||
%=l 'wrg_DESC_ALLOWEDIPS'
|
||||
</p>
|
||||
<p><span class=label>
|
||||
%= l 'wrg_LABEL_PUBLIC'
|
||||
</span><span class=data>
|
||||
% param 'Public' => $wrg_datas->{public} unless param 'Public';
|
||||
%= text_field 'Public' => size => '45', class => 'input'
|
||||
<br></span></p>
|
||||
|
||||
<p><span class=label>
|
||||
%=l 'wrg_LABEL_ALLOWEDIPS'
|
||||
</span><span class=data>
|
||||
% param 'Allowedips' => $wrg_datas->{allowedips} unless param 'Allowedips';
|
||||
%=text_field 'Allowedips' => size => '45', class => 'input'
|
||||
<br></span></p>
|
||||
|
||||
<div class='center'>
|
||||
%= submit_button l('MODIFY'), name => 'modify', class => 'action'
|
||||
</div>
|
||||
<p>
|
||||
%= l 'wrg_DESC_STATUS'
|
||||
</p>
|
||||
|
||||
%= hidden_field 'trt' => $wrg_datas->{trt}
|
||||
%= hidden_field 'Wgconf' => $wrg_datas->{wgconf}
|
||||
|
||||
% end
|
||||
<p><span class=label>
|
||||
%= l 'wrg_LABEL_STATUS'
|
||||
</span><span class=data>
|
||||
% param 'Status' => $wrg_datas->{status} unless param 'Status';
|
||||
%= select_field 'Status' => [[ (l 'DISABLED') => 'disabled'], [ (l 'ENABLED') => 'enabled']], class => 'input'
|
||||
<br></span></p>
|
||||
|
||||
</div>
|
||||
<p>
|
||||
%= l 'wrg_DESC_ALLOWEDIPS'
|
||||
</p>
|
||||
|
||||
<p><span class=label>
|
||||
%= l 'wrg_LABEL_ALLOWEDIPS'
|
||||
</span><span class=data>
|
||||
% param 'Allowedips' => $wrg_datas->{allowedips} unless param 'Allowedips';
|
||||
%= text_field 'Allowedips' => size => '45', class => 'input'
|
||||
<br></span></p>
|
||||
|
||||
<div class='center'>
|
||||
%= submit_button l('MODIFY'), name => 'modify', class => 'action'
|
||||
</div>
|
||||
|
||||
%= hidden_field 'trt' => $wrg_datas->{trt}
|
||||
%= hidden_field 'Wgconf' => $wrg_datas->{wgconf}
|
||||
|
||||
% end
|
||||
|
||||
</div>
|
||||
@@ -1,30 +1,38 @@
|
||||
<div id='wrg_rem'>
|
||||
|
||||
%= form_for '/wireguard2' => (method => 'POST') => begin
|
||||
<p>
|
||||
%=l 'wrg_DESC_REMOVE_CLIENT'
|
||||
</p>
|
||||
%= form_for '/wireguard2' => (method => 'POST') => begin
|
||||
<p>
|
||||
%= l 'wrg_DESC_REMOVE_CLIENT'
|
||||
</p>
|
||||
|
||||
<p><br><span class=label>
|
||||
%=l 'wrg_CONF_NAME'
|
||||
</span>
|
||||
%= $wrg_datas->{wgconf}
|
||||
<br></p>
|
||||
<p><span class=label>
|
||||
%= l 'wrg_USER'
|
||||
</span><span class=data>
|
||||
%= $wrg_datas->{account}
|
||||
</p>
|
||||
|
||||
<p><span class=label>
|
||||
%=l 'COMMENT'
|
||||
</span>
|
||||
%= $wrg_datas->{wgcomment}
|
||||
<br></p>
|
||||
<p><span class=label>
|
||||
%= l 'wrg_CONF_NAME'
|
||||
</span><span class=data>
|
||||
%= $wrg_datas->{wgconf}
|
||||
</span>
|
||||
</p>
|
||||
|
||||
<div class='center'>
|
||||
%= submit_button l('CANCEL'), name => 'cancel', class => 'action'
|
||||
%= submit_button l('REMOVE'), name => 'remove', class => 'action'
|
||||
</div>
|
||||
<p><span class=label>
|
||||
%= l 'COMMENT'
|
||||
</span><span class=data>
|
||||
%= $wrg_datas->{wgcomment}
|
||||
</span>
|
||||
</p>
|
||||
|
||||
<div class="center">
|
||||
%= submit_button l('REMOVE'), name => 'remove', class => 'action left-btn'
|
||||
%= submit_button l('CANCEL'), name => 'cancel', class => 'action center-btn'
|
||||
</div>
|
||||
|
||||
%= hidden_field 'trt' => $wrg_datas->{trt}
|
||||
%= hidden_field 'Wgconf' => $wrg_datas->{wgconf}
|
||||
|
||||
%= hidden_field 'trt' => $wrg_datas->{trt}
|
||||
%= hidden_field 'Wgconf' => $wrg_datas->{wgconf}
|
||||
|
||||
% end
|
||||
|
||||
</div>
|
||||
</div>
|
||||
@@ -1,4 +1,4 @@
|
||||
%define release 23
|
||||
%define release 28
|
||||
%define version 1.0
|
||||
%define debug_package %{nil}
|
||||
|
||||
@@ -54,13 +54,24 @@ cat %{name}-%{version}-filelist
|
||||
#%doc COPYING
|
||||
|
||||
%post
|
||||
if (systemctl list-unit-files |grep smanager) then
|
||||
echo "Smanager restart in spec file"
|
||||
/sbin/e-smith/signal-event smanager-refresh;
|
||||
fi
|
||||
|
||||
|
||||
%changelog
|
||||
* Fri Oct 03 2025 Brian Read <brianr@koozali.org> 1.0-28.sme
|
||||
- Add in UTF8 to ConfigDB open [SME: 13209]
|
||||
|
||||
* Fri Oct 03 2025 Brian Read <brianr@koozali.org> 1.0-27.sme
|
||||
- Remove smanager-refresh from spec file [SME: 13212]
|
||||
|
||||
* Fri Sep 26 2025 Brian Read <brianr@koozali.org> 1.0-26.sme
|
||||
- Fix remove logic, add in user name to rem panel re-format templates, add space to list panel [SME: 13168]
|
||||
|
||||
* Thu Sep 25 2025 Brian Read <brianr@koozali.org> 1.0-25.sme
|
||||
- Sort outy Remove panel placement and operation of buttons [SME: 13168]
|
||||
|
||||
* Wed Sep 24 2025 Brian Read <brianr@koozali.org> 1.0-24.sme
|
||||
- Sort out access to DB vis a vis caching [SME: 13168]
|
||||
|
||||
* Mon Sep 22 2025 Brian Read <brianr@koozali.org> 1.0-23.sme
|
||||
- add debuginfo define to suppress it [SME: 13168]
|
||||
- Fix config call in layout [SME: 13168]
|
||||
|
||||
Reference in New Issue
Block a user