From 717d34a53d04e266219e86379e979f2897fc2de6 Mon Sep 17 00:00:00 2001
From: Brian Read
Date: Thu, 3 Jul 2025 10:18:28 +0100
Subject: [PATCH] * Thu Jul 03 2025 Brian Read
11.0.0-102.sme - Local Network panel: Make DEL and ADD robust even if called
more than once by browser [SME: 13065]
---
.../lib/SrvMngr/Controller/Localnetworks.pm | 95 ++++++++++++-------
.../templates/partials/_ln_del.html.ep | 14 +--
.../templates/partials/_ln_list.html.ep | 4 +-
smeserver-manager.spec | 5 +-
4 files changed, 76 insertions(+), 42 deletions(-)
diff --git a/root/usr/share/smanager/lib/SrvMngr/Controller/Localnetworks.pm b/root/usr/share/smanager/lib/SrvMngr/Controller/Localnetworks.pm
index de3c381..f11e54d 100644
--- a/root/usr/share/smanager/lib/SrvMngr/Controller/Localnetworks.pm
+++ b/root/usr/share/smanager/lib/SrvMngr/Controller/Localnetworks.pm
@@ -5,6 +5,12 @@ package SrvMngr::Controller::Localnetworks;
# description : Local networks
# navigation : 6000 500
#
+#$if_admin->get('/localnetworks')->to('localnetworks#main')->name('localnetworks');
+#$if_admin->post('/localnetworks')->to('localnetworks#do_display')->name('localnetworks');
+#$if_admin->post('/localnetworksa')->to('localnetworks#do_display')->name('localnetworksadd');
+#$if_admin->post('/localnetworksb')->to('localnetworks#do_display')->name('localnetworksadd1');
+#$if_admin->get('/localnetworksd')->to('localnetworks#do_display')->name('localnetworksdel');
+#$if_admin->post('/localnetworkse')->to('localnetworks#do_display')->name('localnetworksdel1');
# routes : end
#----------------------------------------------------------------------
use strict;
@@ -53,6 +59,7 @@ sub do_display {
$trt = 'ADD' if ($rt eq 'localnetworksadd');
$trt = 'ADD1' if ($rt eq 'localnetworksadd1');
$trt = 'DEL1' if ($rt eq 'localnetworksdel1');
+ $c->app->log->info("Localnetworks:trt:$trt");
my %ln_datas = ();
my $title = $c->l('ln_LOCAL NETWORKS');
my $modul = '';
@@ -83,16 +90,21 @@ sub do_display {
if ($trt eq 'DEL1') {
#After Remove clicked on Delete network panel
- #$network_db = esmith::NetworksDB::UTF8->open() || die("Failed to open Networkdb-1");
+ #$network_db = esmith::NetworksDB::UTF8->open() || die("Failed to open Networkdb-1");
my $localnetwork = $c->param("localnetwork");
- my $delete_hosts = $c->param("deletehost") || "1"; #default to deleting them.
- my $rec = $network_db->get($localnetwork) || die("Failed to find network on db:$localnetwork");
-
- if ($rec and $rec->prop('type') eq 'localnetwork') {
- $ln_datas{localnetwork} = $localnetwork;
- }
- my %ret = remove_network($localnetwork, $delete_hosts);
- #$network_db = esmith::NetworksDB::UTF8->open() || die("Failed to open Networkdb-2"); #Refresh the network DB
+ my $delete_hosts = $c->param("deletehost") || "1"; #default to deleting them.
+ $c->app->log->info("Localnetworks:deleting $localnetwork");
+ my ($rec,%ret);
+ if ($rec = $network_db->get($localnetwork)){ #|| die("Failed to find network on db:$localnetwork");
+ if ($rec and $rec->prop('type') eq 'localnetwork') {
+ $ln_datas{localnetwork} = $localnetwork;
+ }
+ %ret = $c->remove_network($localnetwork, $delete_hosts);
+ } else {
+ $c->app->log->info("Local network: delete failed to find network in db: $localnetwork");
+ %ret = ();
+ }
+ #$network_db = esmith::NetworksDB::UTF8->open() || die("Failed to open Networkdb-2"); #Refresh the network DB
my @localnetworks;
if ($network_db) {
@@ -100,8 +112,10 @@ sub do_display {
}
# Load up ln_datas with values need by template
- $ln_datas{subnet} = $rec->prop('Mask');
- $ln_datas{router} = $rec->prop('Router');
+ if ($rec){
+ $ln_datas{subnet} = $rec->prop('Mask');
+ $ln_datas{router} = $rec->prop('Router');
+ }
$c->stash(ln_datas => \%ln_datas, localnetworks => \@localnetworks, ret => \%ret);
} ## end if ($trt eq 'DEL1')
@@ -109,14 +123,20 @@ sub do_display {
#Initial delete panel requiring confirmation
my $localnetwork = $c->param("localnetwork") || '';
+ my ($rec,%ret);
$c->stash(localnetwork => $localnetwork);
- my $rec = $network_db->get($localnetwork) || die("Failed to get local network in db::$localnetwork");
- my $subnet = $rec->prop('Mask');
- $ln_datas{subnet} = $subnet;
- $ln_datas{router} = $rec->prop('Router');
- my $numhosts = hosts_on_network($localnetwork, $subnet);
- $ln_datas{localnetwork} = $localnetwork;
- $ln_datas{deletehosts} = $numhosts > 0 ? 1 : 0;
+ if ($rec = $network_db->get($localnetwork)){
+ my $subnet = $rec->prop('Mask');
+ $ln_datas{subnet} = $subnet;
+ $ln_datas{router} = $rec->prop('Router');
+ my $numhosts =$c->hosts_on_network($localnetwork, $subnet);
+ $ln_datas{localnetwork} = $localnetwork;
+ $ln_datas{deletehosts} = $numhosts > 0 ? 1 : 0;
+ } else {
+ $c->app->log->info("Local network:Initial Failed to find network in Db: $localnetwork");
+ $c->flash('error',$c->l('ln_Failed to find network in Db'));
+ $trt = 'LIST';
+ }
} ## end if ($trt eq 'DEL')
if ($trt eq 'LIST') {
@@ -136,6 +156,7 @@ sub do_display {
} ## end sub do_display
sub remove_network {
+ my $c = shift;
my $network = shift;
$network_db = esmith::NetworksDB::UTF8->open();
my $record = $network_db->get($network);
@@ -152,7 +173,7 @@ sub remove_network {
if (system("/sbin/e-smith/signal-event", "network-delete", $network) == 0) {
if ($delete_hosts) {
- my @hosts_to_delete = hosts_on_network($network, $subnet);
+ my @hosts_to_delete = $c->hosts_on_network($network, $subnet);
foreach my $host (@hosts_to_delete) {
$host->delete;
@@ -169,6 +190,7 @@ sub remove_network {
} ## end sub remove_network
sub hosts_on_network {
+ my $c = shift;
my $network = shift;
my $netmask = shift;
die if not $network and $netmask;
@@ -191,17 +213,20 @@ sub hosts_on_network {
} ## end sub hosts_on_network
sub add_network {
- my ($fm) = @_;
- my $networkAddress = $fm->param('networkAddress');
- my $networkMask = $fm->param('networkMask');
- my $networkRouter = $fm->param('networkRouter');
+ my ($c) = @_;
+ my $networkAddress = $c->param('networkAddress');
+ my $networkMask = $c->param('networkMask');
+ my $networkRouter = $c->param('networkRouter');
+
+ #Start by checking that the network does not already exist
+
#Validate Ips and subnet mask
- my $res = ip_number($fm, $networkAddress);
+ my $res = ip_number($c, $networkAddress);
return (ret => 'ln_INVALID_IP_ADDRESS', vars => "Network Address $res") unless $res eq 'OK';
$res = subnet_mask($networkMask);
return (ret => 'ln_INVALID_SUBNET_MASK', vars => "$networkMask") unless $res eq 'OK';
- $res = ip_number($fm, $networkRouter);
+ $res = ip_number($c, $networkRouter);
return (ret => 'ln_INVALID_IP_ADDRESS', vars => "Routeur Address $res") unless $res eq 'OK';
# we transform bit mask to regular mask
@@ -234,19 +259,25 @@ sub add_network {
if ($network_db->get($network)) {
return (ret => 'ln_NETWORK_ALREADY_ADDED', vars => "$network,$networkMask,$networkRouter");
}
- $network_db->new_record(
+ $res = $network_db->new_record(
$network,
{ Mask => $networkMask,
Router => $networkRouter,
type => 'network',
}
);
-
- # Untaint $network before use in system()
- $network =~ /(.+)/;
- $network = $1;
- system("/sbin/e-smith/signal-event", "network-create", $network) == 0
- or (return (ret => 'ln_ERROR_CREATING_NETWORK', vars => "$network,$networkMask,$networkRouter"));
+ if (! $res) {
+ #Record already existed
+ $c->app->log->info("Local Network:Network already exists:$network");
+ #return success message
+ } else {
+ #Only call underlying batch if new record created
+ # Untaint $network before use in system()
+ $network =~ /(.+)/;
+ $network = $1;
+ system("/sbin/e-smith/signal-event", "network-create", $network) == 0
+ or (return (ret => 'ln_ERROR_CREATING_NETWORK', vars => "$network,$networkMask,$networkRouter"));
+ }
my ($totalHosts, $firstAddr, $lastAddr) = esmith::util::computeHostRange($network, $networkMask);
my $msg;
diff --git a/root/usr/share/smanager/themes/default/templates/partials/_ln_del.html.ep b/root/usr/share/smanager/themes/default/templates/partials/_ln_del.html.ep
index 738ae37..8c2e1ae 100644
--- a/root/usr/share/smanager/themes/default/templates/partials/_ln_del.html.ep
+++ b/root/usr/share/smanager/themes/default/templates/partials/_ln_del.html.ep
@@ -6,12 +6,12 @@
% my $router = $ln_datas->{router};
% if (config->{debug} == 1) {
-
- %= dumper $c->current_route
- %= dumper $c->stash("ret")
- %= dumper %$ln_datas
- %= dumper $deletehosts
-
+
+ %= dumper $c->current_route
+ %= dumper $c->stash("ret")
+ %= dumper %$ln_datas
+ %= dumper $deletehosts
+
% }
%= form_for '/localnetworkse' => (method => 'POST') => begin
@@ -56,4 +56,4 @@
%end
-
+
\ No newline at end of file
diff --git a/root/usr/share/smanager/themes/default/templates/partials/_ln_list.html.ep b/root/usr/share/smanager/themes/default/templates/partials/_ln_list.html.ep
index b9c2814..5ee0697 100644
--- a/root/usr/share/smanager/themes/default/templates/partials/_ln_list.html.ep
+++ b/root/usr/share/smanager/themes/default/templates/partials/_ln_list.html.ep
@@ -8,9 +8,9 @@
% my ($var1, $var2, $var3, $var4, $var5, $var6, $var7) = @vars;
% if ($c->app->config->{debug}) {
-
+
%= dumper { ret_data => \%ret }
-
+
% }
% if ($ret{ret} eq "") {
diff --git a/smeserver-manager.spec b/smeserver-manager.spec
index 42d36c0..6b6d7de 100644
--- a/smeserver-manager.spec
+++ b/smeserver-manager.spec
@@ -2,7 +2,7 @@ Summary: Sme server navigation module : manager 2
%define name smeserver-manager
Name: %{name}
%define version 11.0.0
-%define release 101
+%define release 102
Version: %{version}
Release: %{release}%{?dist}
License: GPL
@@ -146,6 +146,9 @@ true
%defattr(-,root,root)
%changelog
+* Thu Jul 03 2025 Brian Read 11.0.0-102.sme
+- Local Network panel: Make DEL and ADD robust even if called more than once by browser [SME: 13065]
+
* Wed Jul 02 2025 Brian Read 11.0.0-101.sme
- Fix busy cursor, csp intervened. [SME: 13064]