From 9690a31f1976582995aae259c35e760d15e32c38 Mon Sep 17 00:00:00 2001 From: Oliver Gorwits Date: Mon, 6 May 2013 22:01:13 +0100 Subject: [PATCH] complete Manage Pseudo Devices --- Netdisco/Changes | 1 + Netdisco/lib/App/Netdisco/Web/AdminTask.pm | 6 ++ .../Web/Plugin/AdminTask/PseudoDevice.pm | 58 +++++++++++++++++++ Netdisco/lib/App/Netdisco/Web/PortControl.pm | 2 + .../views/ajax/admintask/pseudodevice.tt | 5 ++ TODO | 1 - 6 files changed, 72 insertions(+), 1 deletion(-) diff --git a/Netdisco/Changes b/Netdisco/Changes index bb104f4b..96f9204e 100644 --- a/Netdisco/Changes +++ b/Netdisco/Changes @@ -7,6 +7,7 @@ * The netdisco-do script can run any one-off job * Select MAC Address display format on Node and Device Port search * Helper script to import the Netdisco 1.x Topology file to the database + * Support for pseudo devices (useful for dummy device links) [ENHANCEMENTS] diff --git a/Netdisco/lib/App/Netdisco/Web/AdminTask.pm b/Netdisco/lib/App/Netdisco/Web/AdminTask.pm index 5316e8eb..bf72aa96 100644 --- a/Netdisco/lib/App/Netdisco/Web/AdminTask.pm +++ b/Netdisco/lib/App/Netdisco/Web/AdminTask.pm @@ -5,6 +5,12 @@ use Dancer ':syntax'; get '/admin/*' => sub { my ($tag) = splat; + if (! var('user')->admin) { + status(302); + header(Location => uri_for('/')->path_query()); + return; + } + # trick the ajax into working as if this were a tabbed page params->{tab} = $tag; diff --git a/Netdisco/lib/App/Netdisco/Web/Plugin/AdminTask/PseudoDevice.pm b/Netdisco/lib/App/Netdisco/Web/Plugin/AdminTask/PseudoDevice.pm index 5a41bca7..5b62f5f4 100644 --- a/Netdisco/lib/App/Netdisco/Web/Plugin/AdminTask/PseudoDevice.pm +++ b/Netdisco/lib/App/Netdisco/Web/Plugin/AdminTask/PseudoDevice.pm @@ -17,6 +17,8 @@ sub _sanity_ok { my $happy = 0; try { + return 0 unless var('user')->admin; + return 0 unless length param('dns') and param('dns') =~ m/^[[:print:]]+$/ and param('dns') !~ m/[[:space:]]/; @@ -57,7 +59,63 @@ ajax '/ajax/content/admin/pseudodevice/add' => sub { forward '/ajax/content/admin/pseudodevice'; }; +ajax '/ajax/content/admin/pseudodevice/del' => sub { + forward '/ajax/content/admin/pseudodevice' + unless _sanity_ok(); + + try { + schema('netdisco')->txn_do(sub { + my $device = schema('netdisco')->resultset('Device') + ->find({ip => param('ip')}); + + $device->ports->delete; + $device->delete; + }); + }; + + forward '/ajax/content/admin/pseudodevice'; +}; + +ajax '/ajax/content/admin/pseudodevice/update' => sub { + forward '/ajax/content/admin/pseudodevice' + unless _sanity_ok(); + + try { + schema('netdisco')->txn_do(sub { + my $device = schema('netdisco')->resultset('Device') + ->with_port_count->find({ip => param('ip')}); + my $count = $device->port_count; + + if (param('ports') > $count) { + my $start = $count + 1; + try { + schema('netdisco')->txn_do(sub { + $device->ports->populate([ + ['port'], + map {["Port$_"]} @{[$start .. param('ports')]}, + ]); + }); + }; + } + elsif (param('ports') < $count) { + my $start = param('ports') + 1; + try { + schema('netdisco')->txn_do(sub { + $device->ports + ->single({port => "Port$_"})->delete + for ($start .. $count); + }); + }; + } + }); + }; + + forward '/ajax/content/admin/pseudodevice'; +}; + ajax '/ajax/content/admin/pseudodevice' => sub { + return unless var('user')->admin; + my $set = schema('netdisco')->resultset('Device') ->search( {vendor => 'netdisco'}, diff --git a/Netdisco/lib/App/Netdisco/Web/PortControl.pm b/Netdisco/lib/App/Netdisco/Web/PortControl.pm index ef126dd1..92b937cb 100644 --- a/Netdisco/lib/App/Netdisco/Web/PortControl.pm +++ b/Netdisco/lib/App/Netdisco/Web/PortControl.pm @@ -7,6 +7,8 @@ use Dancer::Plugin::DBIC; use Try::Tiny; ajax '/ajax/portcontrol' => sub { + return unless var('user')->port_control; + try { my $log = sprintf 'd:[%s] p:[%s] f:[%s]. a:[%s] v[%s]', param('device'), (param('port') || ''), param('field'), diff --git a/Netdisco/share/views/ajax/admintask/pseudodevice.tt b/Netdisco/share/views/ajax/admintask/pseudodevice.tt index a0be74e2..6545061f 100644 --- a/Netdisco/share/views/ajax/admintask/pseudodevice.tt +++ b/Netdisco/share/views/ajax/admintask/pseudodevice.tt @@ -26,9 +26,14 @@ [% row.ip | html_entity %] + +
+ + +
diff --git a/TODO b/TODO index 822a86e0..f5417a4b 100644 --- a/TODO +++ b/TODO @@ -17,7 +17,6 @@ DAEMON CORE ==== -* pseudo-device support * VRF support DOCS