7 Commits

Author SHA1 Message Date
367e4da9e8 * Fri Oct 03 2025 Brian Read <brianr@koozali.org> 1.0-27.sme
- Remove smanager-refresh from spec file [SME: 13212]
2025-10-03 13:10:43 +01:00
5858500b80 * 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]
2025-09-26 11:16:13 +01:00
2e7e5047d8 * Thu Sep 25 2025 Brian Read <brianr@koozali.org> 1.0-25.sme
- Sort outy Remove panel placement and operation of buttons [SME: 13168]
2025-09-25 19:02:35 +01:00
bd88797db8 * Wed Sep 24 2025 Brian Read <brianr@koozali.org> 1.0-24.sme
- Sort out access to DB vis a vis caching [SME: 13168]
2025-09-24 15:04:09 +01:00
03a5304866 * 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]
2025-09-22 16:45:10 +01:00
12516e2505 Update README with specific Bugzilla links 2024-10-27 15:58:05 +00:00
f053c60040 Map e-smith package names to smeserver 2024-09-08 15:37:22 +01:00
11 changed files with 594 additions and 622 deletions

1
.gitignore vendored
View File

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

View File

@@ -6,7 +6,14 @@ SMEServer Koozali developed git repo for smeserver-wireguard smecontribs
<br />https://wiki.koozali.org/Wireguard <br />https://wiki.koozali.org/Wireguard
## Bugzilla ## Bugzilla
Show list of outstanding bugs: [here](https://bugs.koozali.org/buglist.cgi?component=smeserver-wireguard&product=SME%20Contribs&query_format=advanced&limit=0&bug_status=UNCONFIRMED&bug_status=NEW&bug_status=ASSIGNED&bug_status=REOPENED&bug_status=CONFIRMED) Show list of outstanding bugs:
[All](https://bugs.koozali.org/buglist.cgi?action=wrap&bug_status=UNCONFIRMED&bug_status=CONFIRMED&bug_status=NEEDINFO&bug_status=IN_PROGRESS&bug_status=RESOLVED&bug_status=VERIFIED&classification=Contribs&component=smeserver-wireguard&list_id=105781&order=changeddate+DESC%2Ccomponent%2Cpriority%2Cbug_severity&product=SME+Contribs&query_format=advanced)
[Confirmed](https://bugs.koozali.org/buglist.cgi?action=wrap&bug_status=CONFIRMED&classification=Contribs&component=smeserver-wireguard&list_id=105781&order=changeddate+DESC%2Ccomponent%2Cpriority%2Cbug_severity&product=SME+Contribs&query_format=advanced)
[Unconfirmed](https://bugs.koozali.org/buglist.cgi?action=wrap&bug_status=UNCONFIRMED&classification=Contribs&component=smeserver-wireguard&list_id=105781&order=changeddate+DESC%2Ccomponent%2Cpriority%2Cbug_severity&product=SME+Contribs&query_format=advanced)
[Need Info](https://bugs.koozali.org/buglist.cgi?action=wrap&bug_status=NEEDINFO&classification=Contribs&component=smeserver-wireguard&list_id=105781&order=changeddate+DESC%2Ccomponent%2Cpriority%2Cbug_severity&product=SME+Contribs&query_format=advanced)
[In Progress](https://bugs.koozali.org/buglist.cgi?action=wrap&bug_status=IN_PROGRESS&classification=Contribs&component=smeserver-wireguard&list_id=105781&order=changeddate+DESC%2Ccomponent%2Cpriority%2Cbug_severity&product=SME+Contribs&query_format=advanced)
[Verified](https://bugs.koozali.org/buglist.cgi?action=wrap&bug_status=VERIFIED&classification=Contribs&component=smeserver-wireguard&list_id=105781&order=changeddate+DESC%2Ccomponent%2Cpriority%2Cbug_severity&product=SME+Contribs&query_format=advanced)
[Resolved](https://bugs.koozali.org/buglist.cgi?action=wrap&bug_status=RESOLVED&classification=Contribs&component=smeserver-wireguard&list_id=105781&order=changeddate+DESC%2Ccomponent%2Cpriority%2Cbug_severity&product=SME+Contribs&query_format=advanced)
## Description ## Description

View File

@@ -1,23 +0,0 @@
#!/usr/bin/perl -w
use esmith::Build::CreateLinks qw(:all);
panel_link("webhosting", "manager");
for my $event (qw(
webhosting-modify smeserver-webhosting-update
))
{
#we can avoid those 2 as we are tricking ourself as ibay-modify and it will do those and php
#templates2events("/etc/httpd/conf/httpd.conf", $event);
#safe_symlink("sigusr1", "root/etc/e-smith/events/$event/services2adjust/httpd-e-smith");
event_link("webhosting-php-expand", $event, "05");
event_link("webhosting-php-adjust", $event, "90");
}
$event="smeserver-webhosting-update";
event_link("navigation-conf", $event, "70");
# for smeserver-manager
safe_symlink('restart', "root/etc/e-smith/events/$event/services2adjust/smanager");
event_link('navigation2-conf', "$event", '80');
event_link('routes2-conf', "$event", '80');
event_link('locales2-conf', "$event", '80');

View File

@@ -15,443 +15,410 @@ package SrvMngr::Controller::Wireguard;
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::ConfigDB; use esmith::ConfigDB;
use Net::IP; use Net::IP;
my $adb;
our $adb = esmith::AccountsDB->open() || die "Couldn't open accounts DB\ndb"; my $cdb;
our $cdb = esmith::ConfigDB->open() || die "Couldn't open config DB\n"; my $wdb;
our $wdb = esmith::ConfigDB->open('wireguard') || esmith::ConfigDB->create('wireguard'); my $ndb;
our $ndb = esmith::NetworksDB->open_ro || die "Error opening networks 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 %wrg_datas = (); my %wrg_datas = ();
$wdb = esmith::ConfigDB->open('wireguard') || esmith::ConfigDB->create('wireguard');
my $title = $c->l('wrg_FORM_TITLE'); my $title = $c->l('wrg_FORM_TITLE');
$wrg_datas{'trt'} = 'LST'; $wrg_datas{'trt'} = 'LST';
$cdb = esmith::ConfigDB->open() || die "Couldn't open config DB\n"; $cdb = esmith::ConfigDB->open() || die "Couldn't open config DB\n";
my $wg = $cdb->get('wg-quick@wg0'); my $wg = $cdb->get('wg-quick@wg0');
$wrg_datas{'wgpub'} = $wg->prop('public');
$wrg_datas{'wgpub'} = $wg->prop('public'); $wrg_datas{'wgip'} = $wg->prop('ip');
$wrg_datas{'wgip'} = $wg->prop('ip'); $wrg_datas{'wgmask'} = $wg->prop('mask');
$wrg_datas{'wgmask'} = $wg->prop('mask'); $wrg_datas{'wgport'} = $wg->prop('UDPPort');
$wrg_datas{'wgport'} = $wg->prop('UDPPort'); $wrg_datas{'sstatus'} = $wg->prop('status');
$wrg_datas{'sstatus'} = $wg->prop('status');
my @wgstatus = `/usr/bin/wg show wg0 dump`; my @wgstatus = `/usr/bin/wg show wg0 dump`;
my $type = 'wg0';
my $type = 'wg0'; my @wgconf = $wdb->get_all_by_prop(type => $type);
my @wgconf = $wdb->get_all_by_prop(type=>$type); $c->stash(
title => $title,
$c->stash( title => $title, wrg_datas => \%wrg_datas, wrg_datas => \%wrg_datas,
wgstatus => \@wgstatus, wgconf => \@wgconf ); wgstatus => \@wgstatus,
wgconf => \@wgconf
);
$c->render(template => 'wireguard'); $c->render(template => 'wireguard');
} ## 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 $wgconf = $c->param('Wgconf') || '';
my $wgconf = $c->param('Wgconf') || '';
my %wrg_datas = (); my %wrg_datas = ();
my $title = $c->l('wrg_FORM_TITLE'); my $title = $c->l('wrg_FORM_TITLE');
my $modul = ''; my $modul = '';
$adb = esmith::AccountsDB->open() || die "Couldn't open accounts DB\ndb";
$cdb = esmith::ConfigDB->open() || die "Couldn't open config DB\n";
$wdb = esmith::ConfigDB->open('wireguard') || esmith::ConfigDB->create('wireguard');
#$ndb = esmith::NetworksDB->open_ro || die "Error opening networks DB\n";
$wrg_datas{'trt'} = $trt; $wrg_datas{'trt'} = $trt;
if ( $trt eq 'QRC' ) { if ($trt eq 'QRC') {
$wrg_datas{'wgconf'} = $wgconf; $wrg_datas{'wgconf'} = $wgconf;
} }
if ( $trt eq 'MOD' ) { if ($trt eq 'MOD') {
$wrg_datas{'wgconf'} = $wgconf; $wrg_datas{'wgconf'} = $wgconf;
my $rec = $wdb->get($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 'REM' ) { if ($rec) {
$wrg_datas{'wgconf'} = $wgconf; $wrg_datas{'info'} = $rec->prop('info') || '';
my $rec = $wdb->get($wgconf); $wrg_datas{'allowedips'} = $rec->prop('allowedips') || '';
$wrg_datas{'wgcomment'} = $rec->prop('info') || ''; $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' ) { if ($trt eq 'REM') {
# nothing for a new client $wrg_datas{'wgconf'} = $wgconf;
} my $rec = $wdb->get($wgconf);
$wrg_datas{'wgcomment'} = $rec->prop('info') || '';
}
if ( $trt eq 'UPD' ) { if ($trt eq 'NEW') {
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 'LST' ) { # nothing for a new client
my @wgss = $adb->wgss(); }
$c->stash( wgss => \@wgss );
}
$c->stash( title => $title, modul => $modul, wrg_datas => \%wrg_datas ); if ($trt eq 'UPD') {
$c->render( template => 'wireguard' ); 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 { sub do_action {
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 %wrg_datas = (); my %wrg_datas = ();
my $title = $c->l('wrg_FORM_TITLE'); my $title = $c->l('wrg_FORM_TITLE');
$wrg_datas{'trt'} = $trt; $wrg_datas{'trt'} = $trt;
my $result = ''; my $result = '';
my $res = ''; my $res = '';
$adb = esmith::AccountsDB->open() || die "Couldn't open accounts DB\ndb";
$cdb = esmith::ConfigDB->open() || die "Couldn't open config DB\n";
$wdb = esmith::ConfigDB->open('wireguard') || esmith::ConfigDB->create('wireguard');
$ndb = esmith::NetworksDB->open_ro || die "Error opening networks DB\n";
if ( $trt eq 'QRC' ) { if ($trt eq 'QRC') {
# NEVER
# NEVER
} }
if ( $trt eq 'LST' ) { if ($trt eq 'LST') {
# NEVER
# NEVER
} }
if ( $trt eq 'MOD' ) { if ($trt eq 'MOD') {
$wrg_datas{'wgconf'} = $c->param('Wgconf'); $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 'REM' ) { # controls
if ($c->param("cancel")) { $res = 'OK'; # no controls here...
$c->stash( error => $c->l('wrg_CANCELLED') ); $result .= $res unless $res eq 'OK';
$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');
}
}
}
if ( $trt eq 'NEW' ) { if (!$result) {
$res = performModifyClient($c);
$result .= $res unless $res eq 'OK';
# controls if (!$result) {
$res = 'OK'; # no controls here... $result = $c->l('wrg_SUCCESSFULLY_MODIFIED_CONF');
$result .= $res unless $res eq 'OK'; }
if ( ! $result ) { } ## end if (!$result)
$res = performCreateClient( $c ); } ## end if ($trt eq 'MOD')
$result .= $res unless $res eq 'OK';
if ( ! $result ) {
$result = $c->l('wrg_SUCCESSFULLY_ADDED_CONF');
}
}
}
if ( $trt eq 'UPD' ) { if ($trt eq 'REM') {
if ($c->param("cancel")) {
$c->stash(error => $c->l('wrg_CANCELLED'));
$c->redirect_to('/wireguard');
}
# controls # controls
$res = 'OK'; # no controls here... $res = 'OK'; # no controls here...
$result .= $res unless $res eq 'OK'; $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');
}
}
}
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 # common parts
if ($res ne 'OK') { if ($res ne 'OK') {
$c->stash( error => $result ); $c->stash(error => $result);
$c->stash( title => $title, wrg_datas => \%wrg_datas ); $c->stash(title => $title, wrg_datas => \%wrg_datas);
return $c->render('wireguard'); return $c->render('wireguard');
} }
#force reload as successfull (for Main) #force reload as successfull (for Main)
$wdb = esmith::ConfigDB->open('wireguard'); $wdb = esmith::ConfigDB->open('wireguard');
my $message = "'Wireguard' update ($trt) DONE"; my $message = "'Wireguard' update ($trt) DONE";
$c->app->log->info($message); $c->app->log->info($message);
$c->flash( success => $result ); $c->flash(success => $result);
$c->redirect_to('/wireguard'); $c->redirect_to('/wireguard');
} } ## end sub do_action
# action for 'MOD' # action for 'MOD'
sub performModifyClient{ sub performModifyClient {
my $c = shift;
my $c = shift; my $msg = "OK";
my $msg = "OK"; my $wgacc = $c->param('Wgconf');
my $account = $c->param('Account');
my $wgacc = $c->param('Wgconf'); my $private = $c->param('Private') || '';
my $account = $c->param('Account'); my $public = $c->param('Public') || '';
my $private = $c->param('Private') || ''; my $info = $c->param('Info');
my $public = $c->param('Public') || ''; my $status = $c->param('Status') || 'disabled';
my $info = $c->param('Info'); my $allowedips = $c->param('Allowedips') || '';
my $status = $c->param('Status') || 'disabled';
my $allowedips = $c->param('Allowedips') || '';
#todo validate fields #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_\-. ]+)/; ($info) = $info =~ /([A-Za-z0-9_\-. ]+)/;
# trim both ends
# trim both ends
$info =~ s/^ +| +$//g; $info =~ s/^ +| +$//g;
($account) = $account =~ /([A-Za-z0-9_-]+)/; ($account) = $account =~ /([A-Za-z0-9_-]+)/;
return $c->l('wrg_ERROR_FIELD_CONTENT') unless ($account and $info); return $c->l('wrg_ERROR_FIELD_CONTENT') unless ($account and $info);
my %props = (
my %props = ('user' => $account 'user' => $account,
,'private' => $private 'private' => $private,
,'public' => $public 'public' => $public,
,'info' => $info 'info' => $info,
,'status' => $status 'status' => $status,
,'allowedips' => $allowedips 'allowedips' => $allowedips
); );
$wdb->get($wgacc)->merge_props(%props) $wdb->get($wgacc)->merge_props(%props)
or $msg = "Error occurred while modifying pseudonym in database."; or $msg = "Error occurred while modifying pseudonym in database.";
# Untaint before use in system() # Untaint before use in system()
($wgacc) = ($wgacc =~ /(\d+\.+\d+\.+\d+\.+\d+\.+\/\d+\.+)/); ($wgacc) = ($wgacc =~ /(\d+\.+\d+\.+\d+\.+\d+\.+\/\d+\.+)/);
system( "/sbin/e-smith/signal-event", "wireguard-user-modify", "$wgacc",) system("/sbin/e-smith/signal-event", "wireguard-user-modify", "$wgacc",) == 0
== 0 or $msg = "Error occurred while modifying wirequard account."; or $msg = "Error occurred while modifying wirequard account.";
return "$msg";
return "$msg" } ## end sub performModifyClient
}
# action for 'NEW' # action for 'NEW'
sub performCreateClient { sub performCreateClient {
my $c = shift;
my $c = shift; my $type = shift;
my $type = shift;
my $username = $c->param('Account'); 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_\-. ]+)/; ($info) = $info =~ /([A-Za-z0-9_\-. ]+)/;
# trim both ends
# trim both ends
$info =~ s/^ +| +$//g; $info =~ s/^ +| +$//g;
($username) = $username =~ /([A-Za-z0-9_-]+)/; ($username) = $username =~ /([A-Za-z0-9_-]+)/;
return $c->l('wrg_ERROR_FIELD_CONTENT') unless ($username and $info); return $c->l('wrg_ERROR_FIELD_CONTENT') unless ($username and $info);
#get username #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"; return $c->l('wrg_ERROR_WRONG_ACCT_TYPE') unless $user->prop("type") eq "user" or $user->key eq "admin";
$username = $user->key; $username = $user->key;
# execute the event wireguard-user-create username info # 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 $c->error('wrg_ERROR_OCCURED');
} }
return 'OK'; return 'OK';
} } ## end sub performCreateClient
# action for 'UPD' # action for 'UPD'
sub performUpdateConfig { sub performUpdateConfig {
my $c = shift;
my $c = shift; my $msg = "OK";
my $msg = "OK"; my $ip = $c->param('Ip');
my $mask = $c->param('Mask');
my $ip = $c->param('Ip');
my $mask = $c->param('Mask');
my $private = $c->param('Private'); my $private = $c->param('Private');
my $public = $c->param('Public'); my $public = $c->param('Public');
my $status = $c->param('Status'); my $status = $c->param('Status');
unless (defined $private) { unless (defined $private) {
$private =`/usr/bin/wg genkey`; $private = `/usr/bin/wg genkey`;
($private) = ($private =~ /(\w+)/); ($private) = ($private =~ /(\w+)/);
$public = `/usr/bin/echo $private | /usr/bin/wg pubkey`; $public = `/usr/bin/echo $private | /usr/bin/wg pubkey`;
} }
# we get number of entries in wireguard db # we get number of entries in wireguard db
my @num=$wdb->get_all_by_prop(type=>"wg0"); my @num = $wdb->get_all_by_prop(type => "wg0");
if ( scalar @num >0 ) {
# we get current values if (scalar @num > 0) {
my $pprivate=$cdb->get('wg-quick@wg0')->prop('private');
my $ppublic=$cdb->get('wg-quick@wg0')->prop('public'); # we get current values
my $pip=$cdb->get('wg-quick@wg0')->prop('ip'); my $pprivate = $cdb->get('wg-quick@wg0')->prop('private');
my $pmask=$cdb->get('wg-quick@wg0')->prop('mask'); my $ppublic = $cdb->get('wg-quick@wg0')->prop('public');
# if # entries >0 and private |public | ip is chnaged then we push an error and stop my $pip = $cdb->get('wg-quick@wg0')->prop('ip');
if ($pprivate ne $private || $ppublic ne $public || $pip ne $ip || $mask ne $pmask) { my $pmask = $cdb->get('wg-quick@wg0')->prop('mask');
return $c->l('wrg_CLIENTS_ALREADY_CONFIGURED');
} # 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 #todo validate fields
my %props = (
my %props = ('ip' => $ip 'ip' => $ip,
,'mask' => $mask 'mask' => $mask,
,'private' => $private 'private' => $private,
,'public' => $public 'public' => $public,
,'status' => $status 'status' => $status
); );
# Test Ip is inside CIDR # 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"; $msg = "IP must be in private range";
#$fm->error($msg);return; #$fm->error($msg);return;
} }
$cdb->get('wg-quick@wg0')->merge_props(%props) $cdb->get('wg-quick@wg0')->merge_props(%props)
or $msg = "Error occurred while modifying server details."; or $msg = "Error occurred while modifying server details.";
if ($msg eq "OK") {
if ($msg eq "OK"){ # Untaint before use in system()
# Untaint before use in system() ($ip) = ($ip =~ /(\d+\.+\d+\.+\d+\.+\d+\.+\/\d+\.+)/);
($ip) = ($ip =~ /(\d+\.+\d+\.+\d+\.+\d+\.+\/\d+\.+)/); system("/sbin/e-smith/signal-event", "wireguard-conf-modify", "$ip",) == 0
system( "/sbin/e-smith/signal-event", "wireguard-conf-modify", "$ip",) or $msg = "Error occurred while modifying wireguard conf.";
== 0 or $msg = "Error occurred while modifying wireguard conf."; } ## end if ($msg eq "OK")
}
return "$msg"; return "$msg";
} ## end sub performUpdateConfig
}
# action for 'REM' # action for 'REM'
sub performRemoveClient{ sub performRemoveClient {
my ($c) = @_; my ($c) = @_;
my $conf = $c->param('Wgconf'); my $conf = $c->param('Wgconf');
if ($c->param("remove")){
unless ($wdb->get($conf)->delete()){ if ($c->param("remove")) {
return $c->l('wrg_ERROR_OCCURED'); 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'); return $c->l('wrg_CANCELLED');
} ## end sub performRemoveClient
}
# called from templates # called from templates
sub get_existing_accounts { sub get_existing_accounts {
my $c = shift;
my $c = shift;
my @existingAccounts = ('Administrator'); my @existingAccounts = ('Administrator');
foreach my $account ($adb->get_all_by_prop(type=>'user')) { foreach my $account ($adb->get_all_by_prop(type => 'user')) {
push @existingAccounts, $account->key; push @existingAccounts, $account->key;
} }
return \@existingAccounts; return \@existingAccounts;
} ## end sub get_existing_accounts
}
# called from templates # called from templates
sub get_wgs_info { sub get_wgs_info {
my ($c, $attr, $data) = @_; 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; my $value;
$value = $wdb->get("$data")->prop('info') if ( $attr eq 'info' 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") ); $value = $wdb->get("$data")->prop('user') if ($attr eq 'user' and $wdb->get("$data"));
return $value; return $value;
} ## end sub get_wgs_info
}
# called from templates # called from templates
sub get_conf_info { sub get_conf_info {
my ($c, $ipacc) = @_;
my ( $c, $ipacc ) = @_;
##my $ipacc = $c->param('Wgconf'); ##my $ipacc = $c->param('Wgconf');
#untaint #untaint
($ipacc) = $ipacc =~ /(\d+\.\d+\.\d+\.\d+\/\d+)/; ($ipacc) = $ipacc =~ /(\d+\.\d+\.\d+\.\d+\/\d+)/;
#get from db
#get from db
# return if does not exist # return if does not exist
my $acc = $wdb->get($ipacc) or return undef; my $acc = $wdb->get($ipacc) or return undef;
# return if current user is not admin or the user # return if current user is not admin or the user
return undef unless $c->is_admin; return undef unless $c->is_admin;
my $key = $acc->key;
my $key = $acc->key; my $info = $acc->prop('info');
my $info = $acc->prop('info'); my $private = $acc->prop('private');
my $private = $acc->prop('private'); my $wg0 = $cdb->get('wg-quick@wg0');
my $wg0 = $cdb->get('wg-quick@wg0');
my $ServPublic = $wg0->prop('public'); 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"; my $allowedips = $acc->prop('allowedips') || "0.0.0.0/0";
#here we guess wan IP #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 # else we should guess from an external service
my $ExternalIP = $cdb->get('ExternalInterface')->prop('IPAddress'); my $ExternalIP = $cdb->get('ExternalInterface')->prop('IPAddress');
$ExternalIP = get_internet_ip_address() unless defined $ExternalIP; $ExternalIP = get_internet_ip_address() unless defined $ExternalIP;
#DNS #DNS
my $IPAddress = $cdb->get('InternalInterface')->prop('IPAddress'); my $IPAddress = $cdb->get('InternalInterface')->prop('IPAddress');
my $dns = ($allowedips =~ /0.0.0.0\/0/)? "DNS = $IPAddress" : "" ; my $dns = ($allowedips =~ /0.0.0.0\/0/) ? "DNS = $IPAddress" : "";
my $fulltext = "#configuration for $key $info
my $fulltext ="#configuration for $key $info
[Interface] [Interface]
PrivateKey = $private PrivateKey = $private
Address = $key Address = $key
@@ -462,114 +429,99 @@ PublicKey = $ServPublic
AllowedIPs = $allowedips AllowedIPs = $allowedips
Endpoint = $ExternalIP:$Port Endpoint = $ExternalIP:$Port
"; ";
my @fulltext = split( "\n", $fulltext); my @fulltext = split("\n", $fulltext);
return \@fulltext; return \@fulltext;
} ## end sub get_conf_info
}
# called from templates # called from templates
sub get_conf_qr { sub get_conf_qr {
my ($c, $fulltext, $type) = @_;
my ( $c, $fulltext, $type) = @_; my $qr = `echo "$fulltext" |qrencode -t PNG -o - |base64`;
my $qr=`echo "$fulltext" |qrencode -t PNG -o - |base64`;
return $qr; return $qr;
} }
sub get_internet_ip_address { sub get_internet_ip_address {
#we could use DNS to do this faster but some provider will block DNS #we could use DNS to do this faster but some provider will block DNS
#dig +short myip.opendns.com @resolver1.opendns.com #dig +short myip.opendns.com @resolver1.opendns.com
#also resolver1.opendns.com resolver2.opendns.com resolver3.opendns.com #also resolver1.opendns.com resolver2.opendns.com resolver3.opendns.com
#here a list of available site with https #here a list of available site with https
use Net::DNS; use Net::DNS;
use LWP::Simple; use LWP::Simple;
my $timeout=1; 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( #foreach my $i ( 0 .. $#dns) {
checkip.amazonaws.com # dns calls; test only one random...
myexternalip.com/raw my $i = rand(@httpslist);
ifconfig.me/ my $res = Net::DNS::Resolver->new(
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(
nameservers => [ $dns[$i][1] ], nameservers => [ $dns[$i][1] ],
udp_timeout => $timeout, udp_timeout => $timeout,
tcp_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) {
if ($reply) { foreach my $rr ($reply->answer) {
foreach my $rr ($reply->answer) { $ip = $rr->txtdata if $rr->can("txtdata");
$ip= $rr->txtdata if $rr->can("txtdata"); $ip = $rr->address if $rr->can("address");
$ip= $rr->address if $rr->can("address");
# untaint, dns output is tainted # untaint, dns output is tainted
($ip) = $ip =~ /(\d+\.\d+\.\d+\.\d+)/; ($ip) = $ip =~ /(\d+\.\d+\.\d+\.\d+)/;
return $ip if $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; # https calls
my $service; my $ii = 0;
while ( $ii <5 ) { my $service;
$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;
} 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 { sub test_for_private_ip {
use NetAddr::IP;
use NetAddr::IP; $_ = shift;
$_ = shift; my $mask = shift;
my $mask = shift; return unless /(\d+\.\d+\.\d+\.\d+)/;
return unless /(\d+\.\d+\.\d+\.\d+)/; my $iprange = NetAddr::IP->new($1, "$mask");
my $iprange = NetAddr::IP->new($1,"$mask"); return unless $iprange;
return unless $iprange; return ($iprange->first()->is_rfc1918() and $iprange->last()->is_rfc1918());
return ($iprange->first()->is_rfc1918() and $iprange->last()->is_rfc1918()); } ## end sub test_for_private_ip
}
1 1
__END__
__END__

View File

@@ -46,10 +46,10 @@
'wrg_ERROR_WRONG_ACCT_TYPE' => 'The associated account shoult be a user or admin account.', 'wrg_ERROR_WRONG_ACCT_TYPE' => 'The associated account shoult be a user or admin account.',
'wrg_ERROR_OCCURED' => 'An error occured', '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_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_INTERFACE' => 'Interface',
'wrg_CANCELLED' => 'Operation cancelled', 'wrg_CANCELLED' => 'Operation cancelled',
'wrg_SUCCESSFULLY_MODIFIED_CONF' => 'Client configuration successfully modified', 'wrg_SUCCESSFULLY_MODIFIED_CONF' => 'Client configuration successfully modified',
'wrg_SUCCESSFULLY_REMOVED_CONF' => 'Client successfully removed', 'wrg_SUCCESSFULLY_REMOVED_CONF' => 'Client successfully removed',
'wrg_SUCCESSFULLY_ADDED_CONF' => 'New client successfully added', 'wrg_SUCCESSFULLY_ADDED_CONF' => 'New client successfully added',
'wrg_SUCCESSFULLY_UPDATED_CONF' => 'Server configuration successfully modified', 'wrg_SUCCESSFULLY_UPDATED_CONF' => 'Server configuration successfully modified',

View File

@@ -1,73 +1,74 @@
<div id='wrg_list'> <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 %= form_for 'wireguard' => (method => 'POST') => begin
%= hidden_field 'trt' => 'UPD' %= hidden_field 'trt' => 'UPD'
<p><%=l 'wrg_LABEL_CONFIG'%><br><br></p> <p><%= l 'wrg_LABEL_CONFIG' %><br><br></p>
%= submit_button l('wrg_EDIT_CONFIG'), class => 'action' %= submit_button l('wrg_EDIT_CONFIG'), class => 'action'
% end % end
<p><span class=label> <p><span class=label>
%=l 'wrg_INTERFACE' %= l 'wrg_INTERFACE'
</span> wg0<br></p> </span> wg0<br></p>
<p><span class=label> <p><span class=label>
%=l 'wrg_LABEL_STATUS' %= l 'wrg_LABEL_STATUS'
</span> </span>
%= $wrg_datas->{sstatus} %= $wrg_datas->{sstatus}
<br></p> <br></p>
<p><span class=label> <p><span class=label>
%=l 'wrg_PUBLIC_KEY' %= l 'wrg_PUBLIC_KEY'
</span> </span>
%= $wrg_datas->{wgpub} %= $wrg_datas->{wgpub}
<br></p> <br></p>
<p><span class=label> <p><span class=label>
%=l 'wrg_IP' %= l 'wrg_IP'
</span> </span>
%= $wrg_datas->{wgip}.'/'.$wrg_datas->{wgmask} %= $wrg_datas->{wgip}.'/'.$wrg_datas->{wgmask}
<br></p> <br></p>
<p><span class=label> <p><span class=label>
%=l 'wrg_PORT' %= l 'wrg_PORT'
</span> </span>
%= $wrg_datas->{wgport} %= $wrg_datas->{wgport}
<br></p> <br></p>
<br />
<table class="sme-border"><tbody> <table class="sme-border"><tbody>
<tr> <tr>
<th class='sme-border'> <th class='sme-border'>
%=l 'wrg_PUBLIC_KEY' %= l 'wrg_PUBLIC_KEY'
</th><th class='sme-border'> </th><th class='sme-border'>
%=l 'wrg_INFO' %= l 'wrg_INFO'
</th><th class='sme-border'> </th><th class='sme-border'>
%=l 'wrg_ENDPOINT' %= l 'wrg_ENDPOINT'
</th><th class='sme-border'> </th><th class='sme-border'>
%=l 'wrg_VPN_IP' %= l 'wrg_VPN_IP'
</th><th class='sme-border'> </th><th class='sme-border'>
%=l 'wrg_LATEST_HANDSHAKE' %= l 'wrg_LATEST_HANDSHAKE'
</th><th class='sme-border'> </th><th class='sme-border'>
%=l 'wrg_RECEIVED' %= l 'wrg_RECEIVED'
</th><th class='sme-border'> </th><th class='sme-border'>
%=l 'wrg_SENT' %= l 'wrg_SENT'
</th><th class='sme-border'> </th><th class='sme-border'>
%=l 'wrg_KEEPALIVE' %= l 'wrg_KEEPALIVE'
</th> </th>
</tr> </tr>
% if (scalar @$wgstatus > 0) { % if (scalar @$wgstatus > 0) {
% foreach my $list (@$wgstatus) { % foreach my $list (@$wgstatus) {
% #public-key | private-key | listen-port |persistent-keepalive % #public-key | private-key | listen-port |persistent-keepalive
% my @line = split(' ',$list); % my @line = split(' ',$list);
% next if $line[1] eq $wrg_datas->{wgpub}; % next if $line[1] eq $wrg_datas->{wgpub};
% my ($ginfo, $user); % my ($ginfo, $user);
% $ginfo = $c->get_wgs_info('info', "$line[3]"); % $ginfo = $c->get_wgs_info('info', "$line[3]");
% $user = $c->get_wgs_info('user', "$line[3]"); % $user = $c->get_wgs_info('user', "$line[3]");
% use POSIX qw( strftime ); % use POSIX qw( strftime );
% my $dateR= ($line[4] ) ? strftime("%Y-%m-%d %H:%M:%S", localtime($line[4])) : " "; % my $dateR= ($line[4] ) ? strftime("%Y-%m-%d %H:%M:%S", localtime($line[4])) : " ";
<tr> <tr>
%= t td => (class => 'sme-border') => $line[0] %= t td => (class => 'sme-border') => $line[0]
%= t td => (class => 'sme-border') => "$user : $ginfo" %= t td => (class => 'sme-border') => "$user : $ginfo"
%= t td => (class => 'sme-border') => $line[2] %= t td => (class => 'sme-border') => $line[2]
@@ -76,55 +77,56 @@
%= t td => (class => 'sme-border') => $line[5] %= t td => (class => 'sme-border') => $line[5]
%= t td => (class => 'sme-border') => $line[6] %= t td => (class => 'sme-border') => $line[6]
%= t td => (class => 'sme-border') => $line[7] %= t td => (class => 'sme-border') => $line[7]
</tr> </tr>
% } % }
% } % }
</tbody></table> </tbody></table>
%= form_for 'wireguard' => (method => 'POST') => begin %= 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>
%}
<hr class='sectionbar'/> <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>

View File

@@ -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'> <div id='wrg_mod'>
%= form_for '/wireguard2' => (method => 'POST') => begin %= form_for '/wireguard2' => (method => 'POST') => begin
<p> <p>
%=l 'wrg_DESC_MODIFY_CLIENT_PAGE' %= l 'wrg_DESC_MODIFY_CLIENT_PAGE'
</p> </p>
<hr class='sectionbar'/> <hr class='sectionbar'/>
<p> <p>
%=l 'wrg_DESC_CONF_NAME' %= l 'wrg_DESC_CONF_NAME'
</p> </p>
<p><span class=label> <p><span class=label>
%=l 'wrg_CONF_NAME' %= l 'wrg_CONF_NAME'
</span> </span>
%= $wrg_datas->{wgconf} %= $wrg_datas->{wgconf}
<br></p> <br></p>
<p> <p>
%=l 'wrg_DESC_SELECT_ACCOUNT' %= l 'wrg_DESC_SELECT_ACCOUNT'
</p> </p>
<p><span class=label> <p><span class=label>
%=l 'wrg_SELECT_ACCOUNT' %= l 'wrg_SELECT_ACCOUNT'
</span><span class=data> </span><span class=data>
% param 'Account' => $wrg_datas->{account} unless param 'Account'; % param 'Account' => $wrg_datas->{account} unless param 'Account';
%= select_field 'Account' => $c->get_existing_accounts(), class => 'input' %= select_field 'Account' => $c->get_existing_accounts(), class => 'input'
<br></span></p> <br></span></p>
<p> <p>
%=l 'wrg_DESC_INFO_ACC_WIREGUARD' %= l 'wrg_DESC_INFO_ACC_WIREGUARD'
</p> </p>
<p><span class=label> <p><span class=label>
%=l 'wrg_INFO_ACC_WIREGUARD' %= l 'wrg_INFO_ACC_WIREGUARD'
</span><span class=data> </span><span class=data>
% param 'Info' => $wrg_datas->{info} unless param 'Info'; % param 'Info' => $wrg_datas->{info} unless param 'Info';
%=text_field 'Info' => size => '45', class => 'input' %= text_field 'Info' => size => '45', class => 'input'
<br></span></p> <br></span></p>
<p>
%=l 'wrg_DESC_PRIVATE'
</p>
<p><span class=label> <p>
%=l 'wrg_LABEL_PRIVATE' %= l 'wrg_DESC_PRIVATE'
</span><span class=data> </p>
% 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><span class=label> <p><span class=label>
%=l 'wrg_LABEL_PUBLIC' %= l 'wrg_LABEL_PRIVATE'
</span><span class=data> </span><span class=data>
% param 'Public' => $wrg_datas->{public} unless param 'Public'; % param 'Private' => $wrg_datas->{private} unless param 'Private';
%=text_field 'Public' => size => '45', class => 'input' %= text_field 'Private' => size => '45', class => 'input'
<br></span></p> <br></span></p>
<p>
%=l 'wrg_DESC_STATUS'
</p>
<p><span class=label> <p>
%=l 'wrg_LABEL_STATUS' %= l 'wrg_DESC_PUBLIC'
</span><span class=data> </p>
% param 'Status' => $wrg_datas->{status} unless param 'Status';
%= select_field 'Status' => [[ (l 'DISABLED') => 'disabled'], [ (l 'ENABLED') => 'enabled']], class => 'input'
<br></span></p>
<p> <p><span class=label>
%=l 'wrg_DESC_ALLOWEDIPS' %= l 'wrg_LABEL_PUBLIC'
</p> </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> <p>
%=l 'wrg_LABEL_ALLOWEDIPS' %= l 'wrg_DESC_STATUS'
</span><span class=data> </p>
% 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} <p><span class=label>
%= hidden_field 'Wgconf' => $wrg_datas->{wgconf} %= l 'wrg_LABEL_STATUS'
</span><span class=data>
% end % 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>

View File

@@ -1,30 +1,38 @@
<div id='wrg_rem'> <div id='wrg_rem'>
%= form_for '/wireguard2' => (method => 'POST') => begin %= form_for '/wireguard2' => (method => 'POST') => begin
<p> <p>
%=l 'wrg_DESC_REMOVE_CLIENT' %= l 'wrg_DESC_REMOVE_CLIENT'
</p> </p>
<p><br><span class=label> <p><span class=label>
%=l 'wrg_CONF_NAME' %= l 'wrg_USER'
</span> </span><span class=data>
%= $wrg_datas->{wgconf} %= $wrg_datas->{account}
<br></p> </p>
<p><span class=label> <p><span class=label>
%=l 'COMMENT' %= l 'wrg_CONF_NAME'
</span> </span><span class=data>
%= $wrg_datas->{wgcomment} %= $wrg_datas->{wgconf}
<br></p> </span>
</p>
<div class='center'> <p><span class=label>
%= submit_button l('CANCEL'), name => 'cancel', class => 'action' %= l 'COMMENT'
%= submit_button l('REMOVE'), name => 'remove', class => 'action' </span><span class=data>
</div> %= $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 % end
</div> </div>

View File

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

View File

@@ -1,5 +1,6 @@
%define release 21 %define release 27
%define version 1.0 %define version 1.0
%define debug_package %{nil}
Name: smeserver-wireguard Name: smeserver-wireguard
Version: %{version} Version: %{version}
@@ -11,14 +12,14 @@ License: GPL
URL: https://wiki.koozali.org/Wireguard URL: https://wiki.koozali.org/Wireguard
Source0: smeserver-wireguard-1.0.tar.xz Source0: smeserver-wireguard-1.0.tar.xz
BuildRequires: e-smith-devtools BuildRequires: smeserver-devtools
Requires: wireguard-tools Requires: wireguard-tools
Requires: kmod-wireguard Requires: kmod-wireguard
Requires: smeserver-release >= 10 Requires: smeserver-release >= 10
Requires: qrencode Requires: qrencode
Requires: perl-Net-Netmask Requires: perl-Net-Netmask
Requires: e-smith-base >= 5.8.1-2 Requires: smeserver-base >= 5.8.1-2
Requires: e-smith-lib >= 2.6.0-15 Requires: smeserver-lib >= 2.6.0-15
AutoReqProv: no AutoReqProv: no
@@ -36,7 +37,7 @@ This package provides the Koozali SME SERVER configuration for controlling WireG
%setup -q %setup -q
%build %build
perl createlink perl createlinks
%install %install
@@ -53,13 +54,28 @@ cat %{name}-%{version}-filelist
#%doc COPYING #%doc COPYING
%post %post
if (systemctl list-unit-files |grep smanager) then
echo "Smanager restart in spec file"
/sbin/e-smith/signal-event smanager-refresh;
fi
%changelog %changelog
* 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]
* Sun Sep 08 2024 Brian Read <brianr@koozali.org> 1.0-22.sme
- Map e-smith package names to smeserver
* Sat Sep 07 2024 cvs2git.sh aka Brian Read <brianr@koozali.org> 1.0-21.sme * Sat Sep 07 2024 cvs2git.sh aka Brian Read <brianr@koozali.org> 1.0-21.sme
- Roll up patches and move to git repo [SME: 12338] - Roll up patches and move to git repo [SME: 12338]