From d74ccac4f62cd0d46c6d70444c8833988a243cdc Mon Sep 17 00:00:00 2001 From: Oliver Gorwits Date: Sat, 6 May 2017 16:40:48 +0100 Subject: [PATCH] rename *-daemon apps to be *-backend Squashed commit of the following: commit 39b438aa4b926e724d8aeabb1151e9ab0b9845a5 Author: Oliver Gorwits Date: Sat May 6 16:40:11 2017 +0100 add release notes commit ca4ea90d358416850c5f7eba468cac71a8d2e862 Author: Oliver Gorwits Date: Sat May 6 16:32:06 2017 +0100 update distmeta commit 4e35b904b0198b4b5082784d5c19cd879c0698ea Author: Oliver Gorwits Date: Sat May 6 16:30:22 2017 +0100 rename files from Daemon to Backend commit 86a605ba68532d1dd2f9875e7b20c3a81c9f5d31 Author: Oliver Gorwits Date: Sat May 6 16:26:43 2017 +0100 rename daemon to backend in code commit ffe8fc180f23a451c744df95d9223911df60eee2 Author: Oliver Gorwits Date: Sat May 6 16:15:57 2017 +0100 add daemon files which exec to backend equivalents commit 53e041594ef5cf60a85d420b8ad9cd20ed5085e2 Author: Oliver Gorwits Date: Sat May 6 15:32:49 2017 +0100 rename netdisco-daemon to netdisco-backend --- Build.PL | 2 + MANIFEST | 49 +++-- META.json | 90 ++++----- META.yml | 60 +++--- bin/netdisco-backend | 186 +++++++++++++++++ bin/netdisco-backend-fg | 109 ++++++++++ bin/netdisco-daemon | 189 +----------------- bin/netdisco-daemon-fg | 110 +--------- bin/netdisco-do | 18 +- lib/App/Netdisco.pm | 15 +- lib/App/Netdisco/{Daemon => Backend}/Job.pm | 2 +- lib/App/Netdisco/{Daemon => Backend}/Util.pm | 4 +- .../{Daemon => Backend}/Worker/Common.pm | 10 +- .../Worker/Interactive/DeviceActions.pm | 4 +- .../Worker/Interactive/PortActions.pm | 4 +- .../{Daemon => Backend}/Worker/Manager.pm | 10 +- lib/App/Netdisco/Backend/Worker/Poller.pm | 18 ++ .../Worker/Poller/Arpnip.pm | 4 +- .../Worker/Poller/Common.pm | 4 +- .../Worker/Poller/Device.pm | 4 +- .../Worker/Poller/Expiry.pm | 4 +- .../Worker/Poller/Macsuck.pm | 4 +- .../Worker/Poller/Nbtstat.pm | 6 +- .../{Daemon => Backend}/Worker/Scheduler.pm | 10 +- lib/App/Netdisco/Daemon/Worker/Poller.pm | 18 -- lib/App/Netdisco/JobQueue/PostgreSQL.pm | 6 +- lib/App/Netdisco/Manual/Deployment.pod | 2 +- lib/App/Netdisco/Manual/Developing.pod | 14 +- lib/App/Netdisco/Manual/ReleaseNotes.pod | 16 ++ lib/App/Netdisco/Manual/Systemd.pod | 20 +- .../Netdisco/Util/{Daemon.pm => Backend.pm} | 2 +- share/config.yml | 2 +- share/environments/deployment.yml | 2 +- 33 files changed, 537 insertions(+), 461 deletions(-) create mode 100755 bin/netdisco-backend create mode 100755 bin/netdisco-backend-fg rename lib/App/Netdisco/{Daemon => Backend}/Job.pm (94%) rename lib/App/Netdisco/{Daemon => Backend}/Util.pm (78%) rename lib/App/Netdisco/{Daemon => Backend}/Worker/Common.pm (82%) rename lib/App/Netdisco/{Daemon => Backend}/Worker/Interactive/DeviceActions.pm (91%) rename lib/App/Netdisco/{Daemon => Backend}/Worker/Interactive/PortActions.pm (97%) rename lib/App/Netdisco/{Daemon => Backend}/Worker/Manager.pm (87%) create mode 100644 lib/App/Netdisco/Backend/Worker/Poller.pm rename lib/App/Netdisco/{Daemon => Backend}/Worker/Poller/Arpnip.pm (75%) rename lib/App/Netdisco/{Daemon => Backend}/Worker/Poller/Common.pm (96%) rename lib/App/Netdisco/{Daemon => Backend}/Worker/Poller/Device.pm (96%) rename lib/App/Netdisco/{Daemon => Backend}/Worker/Poller/Expiry.pm (95%) rename lib/App/Netdisco/{Daemon => Backend}/Worker/Poller/Macsuck.pm (75%) rename lib/App/Netdisco/{Daemon => Backend}/Worker/Poller/Nbtstat.pm (92%) rename lib/App/Netdisco/{Daemon => Backend}/Worker/Scheduler.pm (86%) delete mode 100644 lib/App/Netdisco/Daemon/Worker/Poller.pm rename lib/App/Netdisco/Util/{Daemon.pm => Backend.pm} (94%) diff --git a/Build.PL b/Build.PL index c890744d..dad71c53 100644 --- a/Build.PL +++ b/Build.PL @@ -89,6 +89,8 @@ Module::Build->new( 'bin/netdisco-db-deploy', 'bin/netdisco-deploy', 'bin/netdisco-do', + 'bin/netdisco-backend-fg', + 'bin/netdisco-backend', 'bin/netdisco-daemon-fg', 'bin/netdisco-daemon', 'bin/netdisco-web-fg', diff --git a/MANIFEST b/MANIFEST index d05a392c..4bda32d6 100644 --- a/MANIFEST +++ b/MANIFEST @@ -1,10 +1,13 @@ bin/nd-dbic-versions bin/nd-import-topology +bin/netdisco-backend +bin/netdisco-backend-fg bin/netdisco-daemon bin/netdisco-daemon-fg bin/netdisco-db-deploy bin/netdisco-deploy bin/netdisco-do +bin/netdisco-do-e bin/netdisco-rancid-export bin/netdisco-sshcollector bin/netdisco-web @@ -13,25 +16,39 @@ Build.PL Changes lib/App/Netdisco.pm lib/App/Netdisco/AnyEvent/Nbtstat.pm +lib/App/Netdisco/Backend/Job.pm +lib/App/Netdisco/Backend/Job.pm-e +lib/App/Netdisco/Backend/Util.pm +lib/App/Netdisco/Backend/Util.pm-e +lib/App/Netdisco/Backend/Worker/Common.pm +lib/App/Netdisco/Backend/Worker/Common.pm-e +lib/App/Netdisco/Backend/Worker/Interactive/DeviceActions.pm +lib/App/Netdisco/Backend/Worker/Interactive/DeviceActions.pm-e +lib/App/Netdisco/Backend/Worker/Interactive/PortActions.pm +lib/App/Netdisco/Backend/Worker/Interactive/PortActions.pm-e +lib/App/Netdisco/Backend/Worker/Manager.pm +lib/App/Netdisco/Backend/Worker/Manager.pm-e +lib/App/Netdisco/Backend/Worker/Poller.pm +lib/App/Netdisco/Backend/Worker/Poller.pm-e +lib/App/Netdisco/Backend/Worker/Poller/Arpnip.pm +lib/App/Netdisco/Backend/Worker/Poller/Arpnip.pm-e +lib/App/Netdisco/Backend/Worker/Poller/Common.pm +lib/App/Netdisco/Backend/Worker/Poller/Common.pm-e +lib/App/Netdisco/Backend/Worker/Poller/Device.pm +lib/App/Netdisco/Backend/Worker/Poller/Device.pm-e +lib/App/Netdisco/Backend/Worker/Poller/Expiry.pm +lib/App/Netdisco/Backend/Worker/Poller/Expiry.pm-e +lib/App/Netdisco/Backend/Worker/Poller/Macsuck.pm +lib/App/Netdisco/Backend/Worker/Poller/Macsuck.pm-e +lib/App/Netdisco/Backend/Worker/Poller/Nbtstat.pm +lib/App/Netdisco/Backend/Worker/Poller/Nbtstat.pm-e +lib/App/Netdisco/Backend/Worker/Scheduler.pm +lib/App/Netdisco/Backend/Worker/Scheduler.pm-e lib/App/Netdisco/Configuration.pm lib/App/Netdisco/Core/Arpnip.pm lib/App/Netdisco/Core/Discover.pm lib/App/Netdisco/Core/Macsuck.pm lib/App/Netdisco/Core/Nbtstat.pm -lib/App/Netdisco/Daemon/Job.pm -lib/App/Netdisco/Daemon/Util.pm -lib/App/Netdisco/Daemon/Worker/Common.pm -lib/App/Netdisco/Daemon/Worker/Interactive/DeviceActions.pm -lib/App/Netdisco/Daemon/Worker/Interactive/PortActions.pm -lib/App/Netdisco/Daemon/Worker/Manager.pm -lib/App/Netdisco/Daemon/Worker/Poller.pm -lib/App/Netdisco/Daemon/Worker/Poller/Arpnip.pm -lib/App/Netdisco/Daemon/Worker/Poller/Common.pm -lib/App/Netdisco/Daemon/Worker/Poller/Device.pm -lib/App/Netdisco/Daemon/Worker/Poller/Expiry.pm -lib/App/Netdisco/Daemon/Worker/Poller/Macsuck.pm -lib/App/Netdisco/Daemon/Worker/Poller/Nbtstat.pm -lib/App/Netdisco/Daemon/Worker/Scheduler.pm lib/App/Netdisco/DB.pm lib/App/Netdisco/DB/ExplicitLocking.pm lib/App/Netdisco/DB/Result/Admin.pm @@ -102,6 +119,7 @@ lib/App/Netdisco/GenericDB.pm lib/App/Netdisco/GenericDB/Result/Virtual/GenericReport.pm lib/App/Netdisco/JobQueue.pm lib/App/Netdisco/JobQueue/PostgreSQL.pm +lib/App/Netdisco/JobQueue/PostgreSQL.pm-e lib/App/Netdisco/Manual/BSDInstall.pod lib/App/Netdisco/Manual/Configuration.pod lib/App/Netdisco/Manual/Deployment.pod @@ -122,7 +140,7 @@ lib/App/Netdisco/SSHCollector/Platform/IOSXR.pm lib/App/Netdisco/SSHCollector/Platform/Linux.pm lib/App/Netdisco/SSHCollector/Platform/NXOS.pm lib/App/Netdisco/SSHCollector/Platform/PaloAlto.pm -lib/App/Netdisco/Util/Daemon.pm +lib/App/Netdisco/Util/Backend.pm lib/App/Netdisco/Util/Device.pm lib/App/Netdisco/Util/DNS.pm lib/App/Netdisco/Util/ExpandParams.pm @@ -420,6 +438,7 @@ share/views/sidebar/report/subnets.tt share/views/sidebar/search/device.tt share/views/sidebar/search/node.tt share/views/sidebar/search/port.tt +t/20-checkacl.t xt/10-sort_port.t xt/11-portsort.t xt/20-checkacl.t diff --git a/META.json b/META.json index ff9a2893..16398b81 100644 --- a/META.json +++ b/META.json @@ -104,6 +104,48 @@ "App::Netdisco::AnyEvent::Nbtstat" : { "file" : "lib/App/Netdisco/AnyEvent/Nbtstat.pm" }, + "App::Netdisco::Backend::Job" : { + "file" : "lib/App/Netdisco/Backend/Job.pm" + }, + "App::Netdisco::Backend::Util" : { + "file" : "lib/App/Netdisco/Backend/Util.pm" + }, + "App::Netdisco::Backend::Worker::Common" : { + "file" : "lib/App/Netdisco/Backend/Worker/Common.pm" + }, + "App::Netdisco::Backend::Worker::Interactive::DeviceActions" : { + "file" : "lib/App/Netdisco/Backend/Worker/Interactive/DeviceActions.pm" + }, + "App::Netdisco::Backend::Worker::Interactive::PortActions" : { + "file" : "lib/App/Netdisco/Backend/Worker/Interactive/PortActions.pm" + }, + "App::Netdisco::Backend::Worker::Manager" : { + "file" : "lib/App/Netdisco/Backend/Worker/Manager.pm" + }, + "App::Netdisco::Backend::Worker::Poller" : { + "file" : "lib/App/Netdisco/Backend/Worker/Poller.pm" + }, + "App::Netdisco::Backend::Worker::Poller::Arpnip" : { + "file" : "lib/App/Netdisco/Backend/Worker/Poller/Arpnip.pm" + }, + "App::Netdisco::Backend::Worker::Poller::Common" : { + "file" : "lib/App/Netdisco/Backend/Worker/Poller/Common.pm" + }, + "App::Netdisco::Backend::Worker::Poller::Device" : { + "file" : "lib/App/Netdisco/Backend/Worker/Poller/Device.pm" + }, + "App::Netdisco::Backend::Worker::Poller::Expiry" : { + "file" : "lib/App/Netdisco/Backend/Worker/Poller/Expiry.pm" + }, + "App::Netdisco::Backend::Worker::Poller::Macsuck" : { + "file" : "lib/App/Netdisco/Backend/Worker/Poller/Macsuck.pm" + }, + "App::Netdisco::Backend::Worker::Poller::Nbtstat" : { + "file" : "lib/App/Netdisco/Backend/Worker/Poller/Nbtstat.pm" + }, + "App::Netdisco::Backend::Worker::Scheduler" : { + "file" : "lib/App/Netdisco/Backend/Worker/Scheduler.pm" + }, "App::Netdisco::Configuration" : { "file" : "lib/App/Netdisco/Configuration.pm" }, @@ -315,48 +357,6 @@ "App::Netdisco::DB::ResultSet::Subnet" : { "file" : "lib/App/Netdisco/DB/ResultSet/Subnet.pm" }, - "App::Netdisco::Daemon::Job" : { - "file" : "lib/App/Netdisco/Daemon/Job.pm" - }, - "App::Netdisco::Daemon::Util" : { - "file" : "lib/App/Netdisco/Daemon/Util.pm" - }, - "App::Netdisco::Daemon::Worker::Common" : { - "file" : "lib/App/Netdisco/Daemon/Worker/Common.pm" - }, - "App::Netdisco::Daemon::Worker::Interactive::DeviceActions" : { - "file" : "lib/App/Netdisco/Daemon/Worker/Interactive/DeviceActions.pm" - }, - "App::Netdisco::Daemon::Worker::Interactive::PortActions" : { - "file" : "lib/App/Netdisco/Daemon/Worker/Interactive/PortActions.pm" - }, - "App::Netdisco::Daemon::Worker::Manager" : { - "file" : "lib/App/Netdisco/Daemon/Worker/Manager.pm" - }, - "App::Netdisco::Daemon::Worker::Poller" : { - "file" : "lib/App/Netdisco/Daemon/Worker/Poller.pm" - }, - "App::Netdisco::Daemon::Worker::Poller::Arpnip" : { - "file" : "lib/App/Netdisco/Daemon/Worker/Poller/Arpnip.pm" - }, - "App::Netdisco::Daemon::Worker::Poller::Common" : { - "file" : "lib/App/Netdisco/Daemon/Worker/Poller/Common.pm" - }, - "App::Netdisco::Daemon::Worker::Poller::Device" : { - "file" : "lib/App/Netdisco/Daemon/Worker/Poller/Device.pm" - }, - "App::Netdisco::Daemon::Worker::Poller::Expiry" : { - "file" : "lib/App/Netdisco/Daemon/Worker/Poller/Expiry.pm" - }, - "App::Netdisco::Daemon::Worker::Poller::Macsuck" : { - "file" : "lib/App/Netdisco/Daemon/Worker/Poller/Macsuck.pm" - }, - "App::Netdisco::Daemon::Worker::Poller::Nbtstat" : { - "file" : "lib/App/Netdisco/Daemon/Worker/Poller/Nbtstat.pm" - }, - "App::Netdisco::Daemon::Worker::Scheduler" : { - "file" : "lib/App/Netdisco/Daemon/Worker/Scheduler.pm" - }, "App::Netdisco::Environment" : { "file" : "lib/App/Netdisco/Environment.pm" }, @@ -405,12 +405,12 @@ "App::Netdisco::SSHCollector::Platform::PaloAlto" : { "file" : "lib/App/Netdisco/SSHCollector/Platform/PaloAlto.pm" }, + "App::Netdisco::Util::Backend" : { + "file" : "lib/App/Netdisco/Util/Backend.pm" + }, "App::Netdisco::Util::DNS" : { "file" : "lib/App/Netdisco/Util/DNS.pm" }, - "App::Netdisco::Util::Daemon" : { - "file" : "lib/App/Netdisco/Util/Daemon.pm" - }, "App::Netdisco::Util::Device" : { "file" : "lib/App/Netdisco/Util/Device.pm" }, diff --git a/META.yml b/META.yml index 268c4a07..adb8cc8f 100644 --- a/META.yml +++ b/META.yml @@ -21,6 +21,34 @@ provides: version: '2.035006' App::Netdisco::AnyEvent::Nbtstat: file: lib/App/Netdisco/AnyEvent/Nbtstat.pm + App::Netdisco::Backend::Job: + file: lib/App/Netdisco/Backend/Job.pm + App::Netdisco::Backend::Util: + file: lib/App/Netdisco/Backend/Util.pm + App::Netdisco::Backend::Worker::Common: + file: lib/App/Netdisco/Backend/Worker/Common.pm + App::Netdisco::Backend::Worker::Interactive::DeviceActions: + file: lib/App/Netdisco/Backend/Worker/Interactive/DeviceActions.pm + App::Netdisco::Backend::Worker::Interactive::PortActions: + file: lib/App/Netdisco/Backend/Worker/Interactive/PortActions.pm + App::Netdisco::Backend::Worker::Manager: + file: lib/App/Netdisco/Backend/Worker/Manager.pm + App::Netdisco::Backend::Worker::Poller: + file: lib/App/Netdisco/Backend/Worker/Poller.pm + App::Netdisco::Backend::Worker::Poller::Arpnip: + file: lib/App/Netdisco/Backend/Worker/Poller/Arpnip.pm + App::Netdisco::Backend::Worker::Poller::Common: + file: lib/App/Netdisco/Backend/Worker/Poller/Common.pm + App::Netdisco::Backend::Worker::Poller::Device: + file: lib/App/Netdisco/Backend/Worker/Poller/Device.pm + App::Netdisco::Backend::Worker::Poller::Expiry: + file: lib/App/Netdisco/Backend/Worker/Poller/Expiry.pm + App::Netdisco::Backend::Worker::Poller::Macsuck: + file: lib/App/Netdisco/Backend/Worker/Poller/Macsuck.pm + App::Netdisco::Backend::Worker::Poller::Nbtstat: + file: lib/App/Netdisco/Backend/Worker/Poller/Nbtstat.pm + App::Netdisco::Backend::Worker::Scheduler: + file: lib/App/Netdisco/Backend/Worker/Scheduler.pm App::Netdisco::Configuration: file: lib/App/Netdisco/Configuration.pm App::Netdisco::Core::Arpnip: @@ -162,34 +190,6 @@ provides: file: lib/App/Netdisco/DB/ResultSet/NodeWireless.pm App::Netdisco::DB::ResultSet::Subnet: file: lib/App/Netdisco/DB/ResultSet/Subnet.pm - App::Netdisco::Daemon::Job: - file: lib/App/Netdisco/Daemon/Job.pm - App::Netdisco::Daemon::Util: - file: lib/App/Netdisco/Daemon/Util.pm - App::Netdisco::Daemon::Worker::Common: - file: lib/App/Netdisco/Daemon/Worker/Common.pm - App::Netdisco::Daemon::Worker::Interactive::DeviceActions: - file: lib/App/Netdisco/Daemon/Worker/Interactive/DeviceActions.pm - App::Netdisco::Daemon::Worker::Interactive::PortActions: - file: lib/App/Netdisco/Daemon/Worker/Interactive/PortActions.pm - App::Netdisco::Daemon::Worker::Manager: - file: lib/App/Netdisco/Daemon/Worker/Manager.pm - App::Netdisco::Daemon::Worker::Poller: - file: lib/App/Netdisco/Daemon/Worker/Poller.pm - App::Netdisco::Daemon::Worker::Poller::Arpnip: - file: lib/App/Netdisco/Daemon/Worker/Poller/Arpnip.pm - App::Netdisco::Daemon::Worker::Poller::Common: - file: lib/App/Netdisco/Daemon/Worker/Poller/Common.pm - App::Netdisco::Daemon::Worker::Poller::Device: - file: lib/App/Netdisco/Daemon/Worker/Poller/Device.pm - App::Netdisco::Daemon::Worker::Poller::Expiry: - file: lib/App/Netdisco/Daemon/Worker/Poller/Expiry.pm - App::Netdisco::Daemon::Worker::Poller::Macsuck: - file: lib/App/Netdisco/Daemon/Worker/Poller/Macsuck.pm - App::Netdisco::Daemon::Worker::Poller::Nbtstat: - file: lib/App/Netdisco/Daemon/Worker/Poller/Nbtstat.pm - App::Netdisco::Daemon::Worker::Scheduler: - file: lib/App/Netdisco/Daemon/Worker/Scheduler.pm App::Netdisco::Environment: file: lib/App/Netdisco/Environment.pm App::Netdisco::GenericDB: @@ -222,10 +222,10 @@ provides: file: lib/App/Netdisco/SSHCollector/Platform/NXOS.pm App::Netdisco::SSHCollector::Platform::PaloAlto: file: lib/App/Netdisco/SSHCollector/Platform/PaloAlto.pm + App::Netdisco::Util::Backend: + file: lib/App/Netdisco/Util/Backend.pm App::Netdisco::Util::DNS: file: lib/App/Netdisco/Util/DNS.pm - App::Netdisco::Util::Daemon: - file: lib/App/Netdisco/Util/Daemon.pm App::Netdisco::Util::Device: file: lib/App/Netdisco/Util/Device.pm App::Netdisco::Util::ExpandParams: diff --git a/bin/netdisco-backend b/bin/netdisco-backend new file mode 100755 index 00000000..7f43b614 --- /dev/null +++ b/bin/netdisco-backend @@ -0,0 +1,186 @@ +#!/usr/bin/env perl + +use strict; +use warnings; + +our $home; + +BEGIN { + use FindBin; + FindBin::again(); + + my $me = File::Spec->catfile($FindBin::RealBin, $FindBin::RealScript); + my $uid = (stat($me))[4] || 0; + + $home = ($ENV{NETDISCO_HOME} || (getpwuid($uid))[7] || $ENV{HOME}); + + # try to find a localenv if one isn't already in place. + if (!exists $ENV{PERL_LOCAL_LIB_ROOT}) { + use File::Spec; + my $localenv = File::Spec->catfile($FindBin::Bin, 'localenv'); + exec($localenv, $0, @ARGV) if -f $localenv; + $localenv = File::Spec->catfile($home, 'perl5', 'bin', 'localenv'); + exec($localenv, $0, @ARGV) if -f $localenv; + + die "Sorry, can't find libs required for App::Netdisco.\n" + if !exists $ENV{PERLBREW_PERL}; + } +} + +BEGIN { + use Path::Class; + + # stuff useful locations into @INC and $PATH + unshift @INC, + dir($FindBin::RealBin)->parent->subdir('lib')->stringify, + dir($FindBin::RealBin, 'lib')->stringify; + + use Config; + $ENV{PATH} = $FindBin::RealBin . $Config{path_sep} . $ENV{PATH}; +} + +use Daemon::Control; +use Filesys::Notify::Simple; +use File::Copy; + +use App::Netdisco::Environment; +my $config = ($ENV{PLACK_ENV} || $ENV{DANCER_ENVIRONMENT}) .'.yml'; + +my $netdisco = file($FindBin::RealBin, 'netdisco-backend-fg'); +my @args = (scalar @ARGV > 1 ? @ARGV[1 .. $#ARGV] : ()); + +my $log_dir = dir($home, 'logs'); +mkdir $log_dir if ! -d $log_dir; +my $log_file = file($log_dir, 'netdisco-backend.log'); + +my $uid = (stat($netdisco->stringify))[4] || 0; +my $gid = (stat($netdisco->stringify))[5] || 0; + +Daemon::Control->new({ + name => 'Netdisco Backend', + program => \&restarter, + program_args => [@args], + pid_file => file($home, 'netdisco-backend.pid'), + stderr_file => $log_file, + stdout_file => $log_file, + redirect_before_fork => 0, + uid => $uid, gid => $gid, +})->run; + +# the guts of this are borrowed from Plack::Loader::Restarter - many thanks!! +my $child = 0; + +sub restarter { + my ($daemon, @program_args) = @_; + $0 = 'netdisco-backend'; + + $child = fork_and_start($daemon, @program_args); + exit(1) unless $child; + + my $watcher = Filesys::Notify::Simple->new([$ENV{DANCER_ENVDIR}, $log_dir]); + warn "config watcher: watching $ENV{DANCER_ENVDIR} for updates.\n"; + + local $SIG{TERM} = sub { $child = signal_child('TERM', $child); exit(0); }; + + while (1) { + my @restart; + + # this is blocking + $watcher->wait(sub { + my @events = @_; + @events = grep {$_->{path} eq $log_file or + file($_->{path})->basename eq $config} @events; + return unless @events; + @restart = @events; + }); + + my ($hupit, $rotate) = (0, 0); + next unless @restart; + + foreach my $f (@restart) { + if ($f->{path} eq $log_file) { + ++$rotate; + } + else { + warn "-- $f->{path} updated.\n"; + ++$hupit; + } + } + + rotate_logs($child, $daemon, @program_args) if $rotate; + if ($hupit) { + signal_child('TERM', $child); + $child = fork_and_start($daemon, @program_args); + exit(1) unless $child; + } + } +} + +sub fork_and_start { + my ($daemon, @daemon_args) = @_; + my $pid = fork; + die "Can't fork: $!" unless defined $pid; + + if ($pid == 0) { # child + $daemon->redirect_filehandles; + exec( $netdisco->stringify, @daemon_args ); + } + else { + return $pid; + } +} + +sub signal_child { + my ($signal, $pid) = @_; + return unless $signal and $pid; + warn "config watcher: sending $signal to the server (pid:$pid)...\n"; + kill $signal => $pid; + waitpid($pid, 0); +} + +sub rotate_logs { + my $child = shift; + + return unless (-f $log_file) and + ((-s $log_file) > (10 * 1024768)); + + my @files = glob file($log_dir, '*'); + foreach my $f (reverse sort @files) { + next unless $f =~ m/$log_file\.(\d)$/; + my $pos = $1; + unlink $f if $pos == 7; + my $next = $pos + 1; + (my $newf = $f) =~ s/\.$pos$/.$next/; + rename $f, $newf; + } + + # if the log file's about 10M then the race condition in copy/truncate + # has a low risk of data loss. if the file's larger, then we rename and + # kill. + if ((-s $log_file) > (12 * 1024768)) { + rename $log_file, $log_file .'.1'; + signal_child('TERM', $child); + $child = fork_and_start(@_); + exit(1) unless $child; + } + else { + copy $log_file, $log_file .'.1'; + truncate $log_file, 0; + } +} + +=head1 NAME + +netdisco-backend - Job Control Daemon for Netdisco + +=head1 SEE ALSO + +=over 4 + +=item * + +L + +=back + +=cut diff --git a/bin/netdisco-backend-fg b/bin/netdisco-backend-fg new file mode 100755 index 00000000..f2c2a05d --- /dev/null +++ b/bin/netdisco-backend-fg @@ -0,0 +1,109 @@ +#!/usr/bin/env perl + +use strict; +use warnings; + +use FindBin; +FindBin::again(); +use Path::Class 'dir'; + +# get a segfault if we load this later +use if $^O eq 'linux', 'Sys::Proctitle'; + +BEGIN { + # stuff useful locations into @INC + unshift @INC, + dir($FindBin::RealBin)->parent->subdir('lib')->stringify, + dir($FindBin::RealBin, 'lib')->stringify; + + unshift @INC, + split m/:/, ($ENV{NETDISCO_INC} || ''); +} + +use App::Netdisco; +use Dancer qw/:moose :script/; +warning sprintf "App::Netdisco %s backend", ($App::Netdisco::VERSION || 'HEAD'); + +use App::Netdisco::Util::Backend; +use NetAddr::IP::Lite ':lower'; # to quench AF_INET6 symbol errors +use Role::Tiny::With; + +# preload all worker modules into shared memory +use App::Netdisco::Backend::Job (); +use App::Netdisco::Backend::Util (); +use App::Netdisco::Backend::Worker::Common (); +use App::Netdisco::Backend::Worker::Interactive::DeviceActions (); +use App::Netdisco::Backend::Worker::Interactive::PortActions (); +use App::Netdisco::Backend::Worker::Manager (); +use App::Netdisco::Backend::Worker::Poller::Arpnip (); +use App::Netdisco::Backend::Worker::Poller::Common (); +use App::Netdisco::Backend::Worker::Poller::Device (); +use App::Netdisco::Backend::Worker::Poller::Expiry (); +use App::Netdisco::Backend::Worker::Poller::Macsuck (); +use App::Netdisco::Backend::Worker::Poller::Nbtstat (); +use App::Netdisco::Backend::Worker::Poller (); +use App::Netdisco::Backend::Worker::Scheduler (); + +use MCE::Signal '-setpgrp'; +use MCE::Flow Sereal => 1; +use MCE::Queue; + +# set temporary MCE files' location in home directory +my $home = ($ENV{NETDISCO_HOME} || $ENV{HOME}); +my $tmp_dir = ($ENV{NETDISCO_TEMP} || dir($home, 'tmp')); +mkdir $tmp_dir if ! -d $tmp_dir; + +# process-table text +prctl 'netdisco-backend: master'; + +# shared local job queue +my $queue = MCE::Queue->new; + +# support a scheduler-only node +setting('workers')->{'no_manager'} = 1 + if setting('workers')->{tasks} eq '0'; + +# MCE::Util has a limit of ncpu if AUTO is used in max_workers, +# so we parse the field ourselves. +my $max_workers = parse_max_workers( setting('workers')->{tasks} ) || 0; + +mce_flow { + task_name => [qw/ scheduler manager poller /], + max_workers => [ 1, 1, $max_workers ], + tmp_dir => $tmp_dir, + on_post_exit => sub { MCE->restart_worker }, +}, _mk_wkr('Scheduler'), _mk_wkr('Manager'), _mk_wkr('Poller'); + +sub _mk_wkr { + my $role = shift; + return sub { + my $self = shift; + $self->{queue} = $queue; + + prctl sprintf 'netdisco-backend: worker #%s %s: init', MCE->wid, lc($role); + info sprintf 'applying role %s to worker %s', $role, MCE->wid; + + # post-fork, become manager, scheduler, poller, etc + Role::Tiny->apply_roles_to_object( + $self => "App::Netdisco::Backend::Worker::$role"); + + $self->worker_begin if $self->can('worker_begin'); + $self->worker_body; + }; +} + +=head1 NAME + +netdisco-backend-fg - Job Control for Netdisco + +=head1 SEE ALSO + +=over 4 + +=item * + +L + +=back + +=cut diff --git a/bin/netdisco-daemon b/bin/netdisco-daemon index a21e554b..7591827e 100755 --- a/bin/netdisco-daemon +++ b/bin/netdisco-daemon @@ -3,184 +3,17 @@ use strict; use warnings; -our $home; +use File::Spec; +use Cwd 'realpath'; -BEGIN { - use FindBin; - FindBin::again(); +use FindBin; +FindBin::again(); - my $me = File::Spec->catfile($FindBin::RealBin, $FindBin::RealScript); - my $uid = (stat($me))[4] || 0; +my $backend = + File::Spec->catfile( + (File::Spec->splitpath( + realpath(File::Spec->catfile( $FindBin::RealBin, $FindBin::RealScript )) + ))[1], + 'netdisco-backend'); - $home = ($ENV{NETDISCO_HOME} || (getpwuid($uid))[7] || $ENV{HOME}); - - # try to find a localenv if one isn't already in place. - if (!exists $ENV{PERL_LOCAL_LIB_ROOT}) { - use File::Spec; - my $localenv = File::Spec->catfile($FindBin::Bin, 'localenv'); - exec($localenv, $0, @ARGV) if -f $localenv; - $localenv = File::Spec->catfile($home, 'perl5', 'bin', 'localenv'); - exec($localenv, $0, @ARGV) if -f $localenv; - - die "Sorry, can't find libs required for App::Netdisco.\n" - if !exists $ENV{PERLBREW_PERL}; - } -} - -BEGIN { - use Path::Class; - - # stuff useful locations into @INC and $PATH - unshift @INC, - dir($FindBin::RealBin)->parent->subdir('lib')->stringify, - dir($FindBin::RealBin, 'lib')->stringify; - - use Config; - $ENV{PATH} = $FindBin::RealBin . $Config{path_sep} . $ENV{PATH}; -} - -use Daemon::Control; -use Filesys::Notify::Simple; -use File::Copy; - -use App::Netdisco::Environment; -my $config = ($ENV{PLACK_ENV} || $ENV{DANCER_ENVIRONMENT}) .'.yml'; - -my $netdisco = file($FindBin::RealBin, 'netdisco-daemon-fg'); -my @args = (scalar @ARGV > 1 ? @ARGV[1 .. $#ARGV] : ()); - -my $log_dir = dir($home, 'logs'); -mkdir $log_dir if ! -d $log_dir; -my $log_file = file($log_dir, 'netdisco-daemon.log'); - -my $uid = (stat($netdisco->stringify))[4] || 0; -my $gid = (stat($netdisco->stringify))[5] || 0; - -Daemon::Control->new({ - name => 'Netdisco Daemon', - program => \&restarter, - program_args => [@args], - pid_file => file($home, 'netdisco-daemon.pid'), - stderr_file => $log_file, - stdout_file => $log_file, - redirect_before_fork => 0, - uid => $uid, gid => $gid, -})->run; - -# the guts of this are borrowed from Plack::Loader::Restarter - many thanks!! -my $child = 0; - -sub restarter { - my ($daemon, @program_args) = @_; - $0 = 'netdisco-daemon'; - - $child = fork_and_start($daemon, @program_args); - exit(1) unless $child; - - my $watcher = Filesys::Notify::Simple->new([$ENV{DANCER_ENVDIR}, $log_dir]); - warn "config watcher: watching $ENV{DANCER_ENVDIR} for updates.\n"; - - local $SIG{TERM} = sub { $child = signal_child('TERM', $child); exit(0); }; - - while (1) { - my @restart; - - # this is blocking - $watcher->wait(sub { - my @events = @_; - @events = grep {$_->{path} eq $log_file or - file($_->{path})->basename eq $config} @events; - return unless @events; - @restart = @events; - }); - - my ($hupit, $rotate) = (0, 0); - next unless @restart; - - foreach my $f (@restart) { - if ($f->{path} eq $log_file) { - ++$rotate; - } - else { - warn "-- $f->{path} updated.\n"; - ++$hupit; - } - } - - rotate_logs($child, $daemon, @program_args) if $rotate; - if ($hupit) { - signal_child('TERM', $child); - $child = fork_and_start($daemon, @program_args); - exit(1) unless $child; - } - } -} - -sub fork_and_start { - my ($daemon, @daemon_args) = @_; - my $pid = fork; - die "Can't fork: $!" unless defined $pid; - - if ($pid == 0) { # child - $daemon->redirect_filehandles; - exec( $netdisco->stringify, @daemon_args ); - } - else { - return $pid; - } -} - -sub signal_child { - my ($signal, $pid) = @_; - return unless $signal and $pid; - warn "config watcher: sending $signal to the server (pid:$pid)...\n"; - kill $signal => $pid; - waitpid($pid, 0); -} - -sub rotate_logs { - my $child = shift; - - return unless (-f $log_file) and - ((-s $log_file) > (10 * 1024768)); - - my @files = glob file($log_dir, '*'); - foreach my $f (reverse sort @files) { - next unless $f =~ m/$log_file\.(\d)$/; - my $pos = $1; - unlink $f if $pos == 7; - my $next = $pos + 1; - (my $newf = $f) =~ s/\.$pos$/.$next/; - rename $f, $newf; - } - - # if the log file's about 10M then the race condition in copy/truncate - # has a low risk of data loss. if the file's larger, then we rename and - # kill. - if ((-s $log_file) > (12 * 1024768)) { - rename $log_file, $log_file .'.1'; - signal_child('TERM', $child); - $child = fork_and_start(@_); - exit(1) unless $child; - } - else { - copy $log_file, $log_file .'.1'; - truncate $log_file, 0; - } -} - -=head1 NAME - -netdisco-daemon - Job Control Daemon for Netdisco - -=head1 SEE ALSO - -=over 4 - -=item * - -L - -=back - -=cut +exec {$backend} 'netdisco-backend', @ARGV; diff --git a/bin/netdisco-daemon-fg b/bin/netdisco-daemon-fg index 17e6aebd..fefbe258 100755 --- a/bin/netdisco-daemon-fg +++ b/bin/netdisco-daemon-fg @@ -3,107 +3,17 @@ use strict; use warnings; +use File::Spec; +use Cwd 'realpath'; + use FindBin; FindBin::again(); -use Path::Class 'dir'; -# get a segfault if we load this later -use if $^O eq 'linux', 'Sys::Proctitle'; +my $backend = + File::Spec->catfile( + (File::Spec->splitpath( + realpath(File::Spec->catfile( $FindBin::RealBin, $FindBin::RealScript )) + ))[1], + 'netdisco-backend-fg'); -BEGIN { - # stuff useful locations into @INC - unshift @INC, - dir($FindBin::RealBin)->parent->subdir('lib')->stringify, - dir($FindBin::RealBin, 'lib')->stringify; - - unshift @INC, - split m/:/, ($ENV{NETDISCO_INC} || ''); -} - -use App::Netdisco; -use Dancer qw/:moose :script/; -warning sprintf "App::Netdisco %s backend", ($App::Netdisco::VERSION || 'HEAD'); - -use App::Netdisco::Util::Daemon; -use NetAddr::IP::Lite ':lower'; # to quench AF_INET6 symbol errors -use Role::Tiny::With; - -# preload all worker modules into shared memory -use App::Netdisco::Daemon::Job (); -use App::Netdisco::Daemon::Util (); -use App::Netdisco::Daemon::Worker::Common (); -use App::Netdisco::Daemon::Worker::Interactive::DeviceActions (); -use App::Netdisco::Daemon::Worker::Interactive::PortActions (); -use App::Netdisco::Daemon::Worker::Manager (); -use App::Netdisco::Daemon::Worker::Poller::Arpnip (); -use App::Netdisco::Daemon::Worker::Poller::Common (); -use App::Netdisco::Daemon::Worker::Poller::Device (); -use App::Netdisco::Daemon::Worker::Poller::Expiry (); -use App::Netdisco::Daemon::Worker::Poller::Macsuck (); -use App::Netdisco::Daemon::Worker::Poller::Nbtstat (); -use App::Netdisco::Daemon::Worker::Poller (); -use App::Netdisco::Daemon::Worker::Scheduler (); - -use MCE::Signal '-setpgrp'; -use MCE::Flow Sereal => 1; -use MCE::Queue; - -# set temporary MCE files' location in home directory -my $home = ($ENV{NETDISCO_HOME} || $ENV{HOME}); -my $tmp_dir = ($ENV{NETDISCO_TEMP} || dir($home, 'tmp')); -mkdir $tmp_dir if ! -d $tmp_dir; - -# process-table text -prctl 'netdisco-daemon: master'; - -# shared local job queue -my $queue = MCE::Queue->new; - -# support a scheduler-only node -setting('workers')->{'no_manager'} = 1 - if setting('workers')->{tasks} eq '0'; - -# MCE::Util has a limit of ncpu if AUTO is used in max_workers, -# so we parse the field ourselves. -my $max_workers = parse_max_workers( setting('workers')->{tasks} ) || 0; - -mce_flow { - task_name => [qw/ scheduler manager poller /], - max_workers => [ 1, 1, $max_workers ], - tmp_dir => $tmp_dir, - on_post_exit => sub { MCE->restart_worker }, -}, _mk_wkr('Scheduler'), _mk_wkr('Manager'), _mk_wkr('Poller'); - -sub _mk_wkr { - my $role = shift; - return sub { - my $self = shift; - $self->{queue} = $queue; - - prctl sprintf 'netdisco-daemon: worker #%s %s: init', MCE->wid, lc($role); - info sprintf 'applying role %s to worker %s', $role, MCE->wid; - - # post-fork, become manager, scheduler, poller, etc - Role::Tiny->apply_roles_to_object( - $self => "App::Netdisco::Daemon::Worker::$role"); - - $self->worker_begin if $self->can('worker_begin'); - $self->worker_body; - }; -} - -=head1 NAME - -netdisco-daemon-fg - Job Control for Netdisco - -=head1 SEE ALSO - -=over 4 - -=item * - -L - -=back - -=cut +exec {$backend} 'netdisco-backend-fg', @ARGV; diff --git a/bin/netdisco-do b/bin/netdisco-do index 9be32cd4..71de8748 100755 --- a/bin/netdisco-do +++ b/bin/netdisco-do @@ -35,7 +35,7 @@ BEGIN { # for netdisco app config use App::Netdisco; -use App::Netdisco::Daemon::Job; +use App::Netdisco::Backend::Job; use Dancer qw/:moose :script/; info "App::Netdisco version $App::Netdisco::VERSION loaded."; @@ -104,13 +104,13 @@ unless ($action) { use App::Netdisco::Util::Device qw/get_device delete_device renumber_device/; - with 'App::Netdisco::Daemon::Worker::Poller::Device'; - with 'App::Netdisco::Daemon::Worker::Poller::Arpnip'; - with 'App::Netdisco::Daemon::Worker::Poller::Macsuck'; - with 'App::Netdisco::Daemon::Worker::Poller::Nbtstat'; - with 'App::Netdisco::Daemon::Worker::Poller::Expiry'; - with 'App::Netdisco::Daemon::Worker::Interactive::DeviceActions'; - with 'App::Netdisco::Daemon::Worker::Interactive::PortActions'; + with 'App::Netdisco::Backend::Worker::Poller::Device'; + with 'App::Netdisco::Backend::Worker::Poller::Arpnip'; + with 'App::Netdisco::Backend::Worker::Poller::Macsuck'; + with 'App::Netdisco::Backend::Worker::Poller::Nbtstat'; + with 'App::Netdisco::Backend::Worker::Poller::Expiry'; + with 'App::Netdisco::Backend::Worker::Interactive::DeviceActions'; + with 'App::Netdisco::Backend::Worker::Interactive::PortActions'; eval { Module::Load::load 'App::Netdisco::Util::Graph' }; sub graph { @@ -233,7 +233,7 @@ foreach my $host (@hostlist) { } # what job are we asked to do? - my $job = App::Netdisco::Daemon::Job->new({ + my $job = App::Netdisco::Backend::Job->new({ job => 0, action => $action, device => $dev, diff --git a/lib/App/Netdisco.pm b/lib/App/Netdisco.pm index d88c98da..7f20a2ca 100644 --- a/lib/App/Netdisco.pm +++ b/lib/App/Netdisco.pm @@ -134,10 +134,10 @@ Link some of the newly installed apps into a handy location: ln -s ~/perl5/bin/{localenv,netdisco-*} ~/bin/ Test the installation by running the following command, which should only -produce a status message (it's just a test - you'll start the daemon properly, -later on): +produce a status message (it's just a test - you'll start the daemons +properly, later on): - ~/bin/netdisco-daemon status + ~/bin/netdisco-backend status =head1 Configuration @@ -167,8 +167,8 @@ details. The database either needs configuring if new, or updating from the current release of Netdisco (1.x). You also need vendor MAC address prefixes (OUI -data) and some MIBs if you want to run the daemon. The following script will -take care of all this for you: +data) and some MIBs if you want to run the backend daemon. The following +script will take care of all this for you: ~/bin/netdisco-deploy @@ -185,7 +185,7 @@ Run the following command to start the web-app server as a backgrounded daemon Run the following command to start the job control daemon (port control, etc): - ~/bin/netdisco-daemon start + ~/bin/netdisco-backend start You should take care not to run this Netdisco daemon and the Netdisco 1.x daemon at the same time. Similarly, if you use the device discovery with @@ -207,6 +207,7 @@ Notes|App::Netdisco::Manual::ReleaseNotes>. Then, the process is as follows: # upgrade Netdisco ~/bin/localenv cpanm --notest App::Netdisco + ln -s ~/perl5/bin/{localenv,netdisco-*} ~/bin/ # apply database schema updates ~/bin/netdisco-deploy @@ -215,7 +216,7 @@ Notes|App::Netdisco::Manual::ReleaseNotes>. Then, the process is as follows: ~/bin/netdisco-web restart # restart job daemon (if you use it) - ~/bin/netdisco-daemon restart + ~/bin/netdisco-backend restart =head1 Tips and Tricks diff --git a/lib/App/Netdisco/Daemon/Job.pm b/lib/App/Netdisco/Backend/Job.pm similarity index 94% rename from lib/App/Netdisco/Daemon/Job.pm rename to lib/App/Netdisco/Backend/Job.pm index 3c078fa8..b4c27ccc 100644 --- a/lib/App/Netdisco/Daemon/Job.pm +++ b/lib/App/Netdisco/Backend/Job.pm @@ -1,4 +1,4 @@ -package App::Netdisco::Daemon::Job; +package App::Netdisco::Backend::Job; use Moo; use namespace::clean; diff --git a/lib/App/Netdisco/Daemon/Util.pm b/lib/App/Netdisco/Backend/Util.pm similarity index 78% rename from lib/App/Netdisco/Daemon/Util.pm rename to lib/App/Netdisco/Backend/Util.pm index 3c241adb..a957d5e6 100644 --- a/lib/App/Netdisco/Daemon/Util.pm +++ b/lib/App/Netdisco/Backend/Util.pm @@ -1,9 +1,9 @@ -package App::Netdisco::Daemon::Util; +package App::Netdisco::Backend::Util; use strict; use warnings; -# support utilities for Daemon Actions +# support utilities for Backend Actions use base 'Exporter'; our @EXPORT = (); diff --git a/lib/App/Netdisco/Daemon/Worker/Common.pm b/lib/App/Netdisco/Backend/Worker/Common.pm similarity index 82% rename from lib/App/Netdisco/Daemon/Worker/Common.pm rename to lib/App/Netdisco/Backend/Worker/Common.pm index 93df83d4..d9d5b299 100644 --- a/lib/App/Netdisco/Daemon/Worker/Common.pm +++ b/lib/App/Netdisco/Backend/Worker/Common.pm @@ -1,9 +1,9 @@ -package App::Netdisco::Daemon::Worker::Common; +package App::Netdisco::Backend::Worker::Common; use Dancer qw/:moose :syntax :script/; use Try::Tiny; -use App::Netdisco::Util::Daemon; +use App::Netdisco::Util::Backend; use Role::Tiny; use namespace::clean; @@ -18,7 +18,7 @@ sub worker_body { my $wid = $self->wid; while (1) { - prctl sprintf 'netdisco-daemon: worker #%s poller: idle', $wid; + prctl sprintf 'netdisco-backend: worker #%s poller: idle', $wid; my $job = $self->{queue}->dequeue(1); next unless defined $job; @@ -26,7 +26,7 @@ sub worker_body { try { $job->started(scalar localtime); - prctl sprintf 'netdisco-daemon: worker #%s poller: working on #%s: %s', + prctl sprintf 'netdisco-backend: worker #%s poller: working on #%s: %s', $wid, $job->job, $job->summary; info sprintf "pol (%s): starting %s job(%s) at %s", $wid, $action, $job->job, $job->started; @@ -50,7 +50,7 @@ sub close_job { my ($self, $job) = @_; my $now = scalar localtime; - prctl sprintf 'netdisco-daemon: worker #%s poller: wrapping up %s #%s: %s', + prctl sprintf 'netdisco-backend: worker #%s poller: wrapping up %s #%s: %s', $self->wid, $job->action, $job->job, $job->status; info sprintf "pol (%s): wrapping up %s job(%s) - status %s at %s", $self->wid, $job->action, $job->job, $job->status, $now; diff --git a/lib/App/Netdisco/Daemon/Worker/Interactive/DeviceActions.pm b/lib/App/Netdisco/Backend/Worker/Interactive/DeviceActions.pm similarity index 91% rename from lib/App/Netdisco/Daemon/Worker/Interactive/DeviceActions.pm rename to lib/App/Netdisco/Backend/Worker/Interactive/DeviceActions.pm index 5aa2a9d4..62bfbe6c 100644 --- a/lib/App/Netdisco/Daemon/Worker/Interactive/DeviceActions.pm +++ b/lib/App/Netdisco/Backend/Worker/Interactive/DeviceActions.pm @@ -1,8 +1,8 @@ -package App::Netdisco::Daemon::Worker::Interactive::DeviceActions; +package App::Netdisco::Backend::Worker::Interactive::DeviceActions; use App::Netdisco::Util::SNMP 'snmp_connect_rw'; use App::Netdisco::Util::Device 'get_device'; -use App::Netdisco::Daemon::Util ':all'; +use App::Netdisco::Backend::Util ':all'; use Role::Tiny; use namespace::clean; diff --git a/lib/App/Netdisco/Daemon/Worker/Interactive/PortActions.pm b/lib/App/Netdisco/Backend/Worker/Interactive/PortActions.pm similarity index 97% rename from lib/App/Netdisco/Daemon/Worker/Interactive/PortActions.pm rename to lib/App/Netdisco/Backend/Worker/Interactive/PortActions.pm index 3ab5048c..e34d49e4 100644 --- a/lib/App/Netdisco/Daemon/Worker/Interactive/PortActions.pm +++ b/lib/App/Netdisco/Backend/Worker/Interactive/PortActions.pm @@ -1,9 +1,9 @@ -package App::Netdisco::Daemon::Worker::Interactive::PortActions; +package App::Netdisco::Backend::Worker::Interactive::PortActions; use App::Netdisco::Util::Port ':all'; use App::Netdisco::Util::SNMP 'snmp_connect_rw'; use App::Netdisco::Util::Device 'get_device'; -use App::Netdisco::Daemon::Util ':all'; +use App::Netdisco::Backend::Util ':all'; use Role::Tiny; use namespace::clean; diff --git a/lib/App/Netdisco/Daemon/Worker/Manager.pm b/lib/App/Netdisco/Backend/Worker/Manager.pm similarity index 87% rename from lib/App/Netdisco/Daemon/Worker/Manager.pm rename to lib/App/Netdisco/Backend/Worker/Manager.pm index 93badee3..58b5bb76 100644 --- a/lib/App/Netdisco/Daemon/Worker/Manager.pm +++ b/lib/App/Netdisco/Backend/Worker/Manager.pm @@ -1,9 +1,9 @@ -package App::Netdisco::Daemon::Worker::Manager; +package App::Netdisco::Backend::Worker::Manager; use Dancer qw/:moose :syntax :script/; use List::Util 'sum'; -use App::Netdisco::Util::Daemon; +use App::Netdisco::Util::Backend; use Role::Tiny; use namespace::clean; @@ -35,12 +35,12 @@ sub worker_body { my $wid = $self->wid; if (setting('workers')->{'no_manager'}) { - prctl sprintf 'netdisco-daemon: worker #%s manager: inactive', $wid; + prctl sprintf 'netdisco-backend: worker #%s manager: inactive', $wid; return debug "mgr ($wid): no need for manager... quitting" } while (1) { - prctl sprintf 'netdisco-daemon: worker #%s manager: gathering', $wid; + prctl sprintf 'netdisco-backend: worker #%s manager: gathering', $wid; my $num_slots = 0; $num_slots = parse_max_workers( setting('workers')->{tasks} ) @@ -78,7 +78,7 @@ sub worker_body { } debug "mgr ($wid): sleeping now..."; - prctl sprintf 'netdisco-daemon: worker #%s manager: idle', $wid; + prctl sprintf 'netdisco-backend: worker #%s manager: idle', $wid; sleep( setting('workers')->{sleep_time} || 1 ); } } diff --git a/lib/App/Netdisco/Backend/Worker/Poller.pm b/lib/App/Netdisco/Backend/Worker/Poller.pm new file mode 100644 index 00000000..1e62d61b --- /dev/null +++ b/lib/App/Netdisco/Backend/Worker/Poller.pm @@ -0,0 +1,18 @@ +package App::Netdisco::Backend::Worker::Poller; + +use Role::Tiny; +use namespace::clean; + +# main worker body +with 'App::Netdisco::Backend::Worker::Common'; + +# add dispatch methods for poller tasks +with 'App::Netdisco::Backend::Worker::Poller::Device', + 'App::Netdisco::Backend::Worker::Poller::Arpnip', + 'App::Netdisco::Backend::Worker::Poller::Macsuck', + 'App::Netdisco::Backend::Worker::Poller::Nbtstat', + 'App::Netdisco::Backend::Worker::Poller::Expiry', + 'App::Netdisco::Backend::Worker::Interactive::DeviceActions', + 'App::Netdisco::Backend::Worker::Interactive::PortActions'; + +1; diff --git a/lib/App/Netdisco/Daemon/Worker/Poller/Arpnip.pm b/lib/App/Netdisco/Backend/Worker/Poller/Arpnip.pm similarity index 75% rename from lib/App/Netdisco/Daemon/Worker/Poller/Arpnip.pm rename to lib/App/Netdisco/Backend/Worker/Poller/Arpnip.pm index d511c1b4..e132eb33 100644 --- a/lib/App/Netdisco/Daemon/Worker/Poller/Arpnip.pm +++ b/lib/App/Netdisco/Backend/Worker/Poller/Arpnip.pm @@ -1,4 +1,4 @@ -package App::Netdisco::Daemon::Worker::Poller::Arpnip; +package App::Netdisco::Backend::Worker::Poller::Arpnip; use App::Netdisco::Core::Arpnip 'do_arpnip'; use App::Netdisco::Util::Device 'is_arpnipable'; @@ -6,7 +6,7 @@ use App::Netdisco::Util::Device 'is_arpnipable'; use Role::Tiny; use namespace::clean; -with 'App::Netdisco::Daemon::Worker::Poller::Common'; +with 'App::Netdisco::Backend::Worker::Poller::Common'; sub arpnip_action { \&do_arpnip } sub arpnip_filter { \&is_arpnipable } diff --git a/lib/App/Netdisco/Daemon/Worker/Poller/Common.pm b/lib/App/Netdisco/Backend/Worker/Poller/Common.pm similarity index 96% rename from lib/App/Netdisco/Daemon/Worker/Poller/Common.pm rename to lib/App/Netdisco/Backend/Worker/Poller/Common.pm index bc41c13f..8c08dea2 100644 --- a/lib/App/Netdisco/Daemon/Worker/Poller/Common.pm +++ b/lib/App/Netdisco/Backend/Worker/Poller/Common.pm @@ -1,10 +1,10 @@ -package App::Netdisco::Daemon::Worker::Poller::Common; +package App::Netdisco::Backend::Worker::Poller::Common; use Dancer qw/:moose :syntax :script/; use App::Netdisco::Util::SNMP 'snmp_connect'; use App::Netdisco::Util::Device 'get_device'; -use App::Netdisco::Daemon::Util ':all'; +use App::Netdisco::Backend::Util ':all'; use App::Netdisco::JobQueue qw/jq_queued jq_insert/; use Dancer::Plugin::DBIC 'schema'; diff --git a/lib/App/Netdisco/Daemon/Worker/Poller/Device.pm b/lib/App/Netdisco/Backend/Worker/Poller/Device.pm similarity index 96% rename from lib/App/Netdisco/Daemon/Worker/Poller/Device.pm rename to lib/App/Netdisco/Backend/Worker/Poller/Device.pm index 23950bff..52f3d7c3 100644 --- a/lib/App/Netdisco/Daemon/Worker/Poller/Device.pm +++ b/lib/App/Netdisco/Backend/Worker/Poller/Device.pm @@ -1,11 +1,11 @@ -package App::Netdisco::Daemon::Worker::Poller::Device; +package App::Netdisco::Backend::Worker::Poller::Device; use Dancer qw/:moose :syntax :script/; use App::Netdisco::Util::SNMP 'snmp_connect'; use App::Netdisco::Util::Device qw/get_device is_discoverable/; use App::Netdisco::Core::Discover ':all'; -use App::Netdisco::Daemon::Util ':all'; +use App::Netdisco::Backend::Util ':all'; use App::Netdisco::JobQueue qw/jq_queued jq_insert/; use Dancer::Plugin::DBIC 'schema'; diff --git a/lib/App/Netdisco/Daemon/Worker/Poller/Expiry.pm b/lib/App/Netdisco/Backend/Worker/Poller/Expiry.pm similarity index 95% rename from lib/App/Netdisco/Daemon/Worker/Poller/Expiry.pm rename to lib/App/Netdisco/Backend/Worker/Poller/Expiry.pm index c154f356..09818046 100644 --- a/lib/App/Netdisco/Daemon/Worker/Poller/Expiry.pm +++ b/lib/App/Netdisco/Backend/Worker/Poller/Expiry.pm @@ -1,9 +1,9 @@ -package App::Netdisco::Daemon::Worker::Poller::Expiry; +package App::Netdisco::Backend::Worker::Poller::Expiry; use Dancer qw/:moose :syntax :script/; use Dancer::Plugin::DBIC 'schema'; -use App::Netdisco::Daemon::Util ':all'; +use App::Netdisco::Backend::Util ':all'; use Role::Tiny; use namespace::clean; diff --git a/lib/App/Netdisco/Daemon/Worker/Poller/Macsuck.pm b/lib/App/Netdisco/Backend/Worker/Poller/Macsuck.pm similarity index 75% rename from lib/App/Netdisco/Daemon/Worker/Poller/Macsuck.pm rename to lib/App/Netdisco/Backend/Worker/Poller/Macsuck.pm index 62458f9c..373ceaa3 100644 --- a/lib/App/Netdisco/Daemon/Worker/Poller/Macsuck.pm +++ b/lib/App/Netdisco/Backend/Worker/Poller/Macsuck.pm @@ -1,4 +1,4 @@ -package App::Netdisco::Daemon::Worker::Poller::Macsuck; +package App::Netdisco::Backend::Worker::Poller::Macsuck; use App::Netdisco::Core::Macsuck 'do_macsuck'; use App::Netdisco::Util::Device 'is_macsuckable'; @@ -6,7 +6,7 @@ use App::Netdisco::Util::Device 'is_macsuckable'; use Role::Tiny; use namespace::clean; -with 'App::Netdisco::Daemon::Worker::Poller::Common'; +with 'App::Netdisco::Backend::Worker::Poller::Common'; sub macsuck_action { \&do_macsuck } sub macsuck_filter { \&is_macsuckable } diff --git a/lib/App/Netdisco/Daemon/Worker/Poller/Nbtstat.pm b/lib/App/Netdisco/Backend/Worker/Poller/Nbtstat.pm similarity index 92% rename from lib/App/Netdisco/Daemon/Worker/Poller/Nbtstat.pm rename to lib/App/Netdisco/Backend/Worker/Poller/Nbtstat.pm index 52acc991..e89a05c4 100644 --- a/lib/App/Netdisco/Daemon/Worker/Poller/Nbtstat.pm +++ b/lib/App/Netdisco/Backend/Worker/Poller/Nbtstat.pm @@ -1,4 +1,4 @@ -package App::Netdisco::Daemon::Worker::Poller::Nbtstat; +package App::Netdisco::Backend::Worker::Poller::Nbtstat; use Dancer qw/:moose :syntax :script/; use Dancer::Plugin::DBIC 'schema'; @@ -6,7 +6,7 @@ use Dancer::Plugin::DBIC 'schema'; use App::Netdisco::Core::Nbtstat qw/nbtstat_resolve_async store_nbt/; use App::Netdisco::Util::Node 'is_nbtstatable'; use App::Netdisco::Util::Device qw/get_device is_discoverable/; -use App::Netdisco::Daemon::Util ':all'; +use App::Netdisco::Backend::Util ':all'; use NetAddr::IP::Lite ':lower'; use Time::HiRes 'gettimeofday'; @@ -14,7 +14,7 @@ use Time::HiRes 'gettimeofday'; use Role::Tiny; use namespace::clean; -with 'App::Netdisco::Daemon::Worker::Poller::Common'; +with 'App::Netdisco::Backend::Worker::Poller::Common'; sub nbtstat_action { \&do_nbtstat } sub nbtstat_filter { \&is_nbtstatable } diff --git a/lib/App/Netdisco/Daemon/Worker/Scheduler.pm b/lib/App/Netdisco/Backend/Worker/Scheduler.pm similarity index 86% rename from lib/App/Netdisco/Daemon/Worker/Scheduler.pm rename to lib/App/Netdisco/Backend/Worker/Scheduler.pm index a622fdbf..12c610d6 100644 --- a/lib/App/Netdisco/Daemon/Worker/Scheduler.pm +++ b/lib/App/Netdisco/Backend/Worker/Scheduler.pm @@ -1,9 +1,9 @@ -package App::Netdisco::Daemon::Worker::Scheduler; +package App::Netdisco::Backend::Worker::Scheduler; use Dancer qw/:moose :syntax :script/; use Algorithm::Cron; -use App::Netdisco::Util::Daemon; +use App::Netdisco::Util::Backend; use Role::Tiny; use namespace::clean; @@ -39,7 +39,7 @@ sub worker_body { my $wid = $self->wid; unless (setting('schedule')) { - prctl sprintf 'netdisco-daemon: worker #%s scheduler: inactive', $wid; + prctl sprintf 'netdisco-backend: worker #%s scheduler: inactive', $wid; return debug "sch ($wid): no need for scheduler... quitting" } @@ -47,11 +47,11 @@ sub worker_body { # sleep until some point in the next minute my $naptime = 60 - (time % 60) + int(rand(45)); - prctl sprintf 'netdisco-daemon: worker #%s scheduler: idle', $wid; + prctl sprintf 'netdisco-backend: worker #%s scheduler: idle', $wid; debug "sched ($wid): sleeping for $naptime seconds"; sleep $naptime; - prctl sprintf 'netdisco-daemon: worker #%s scheduler: queueing', $wid; + prctl sprintf 'netdisco-backend: worker #%s scheduler: queueing', $wid; # NB next_time() returns the next *after* win_start my $win_start = time - (time % 60) - 1; diff --git a/lib/App/Netdisco/Daemon/Worker/Poller.pm b/lib/App/Netdisco/Daemon/Worker/Poller.pm deleted file mode 100644 index 001c327a..00000000 --- a/lib/App/Netdisco/Daemon/Worker/Poller.pm +++ /dev/null @@ -1,18 +0,0 @@ -package App::Netdisco::Daemon::Worker::Poller; - -use Role::Tiny; -use namespace::clean; - -# main worker body -with 'App::Netdisco::Daemon::Worker::Common'; - -# add dispatch methods for poller tasks -with 'App::Netdisco::Daemon::Worker::Poller::Device', - 'App::Netdisco::Daemon::Worker::Poller::Arpnip', - 'App::Netdisco::Daemon::Worker::Poller::Macsuck', - 'App::Netdisco::Daemon::Worker::Poller::Nbtstat', - 'App::Netdisco::Daemon::Worker::Poller::Expiry', - 'App::Netdisco::Daemon::Worker::Interactive::DeviceActions', - 'App::Netdisco::Daemon::Worker::Interactive::PortActions'; - -1; diff --git a/lib/App/Netdisco/JobQueue/PostgreSQL.pm b/lib/App/Netdisco/JobQueue/PostgreSQL.pm index 78e57578..efcc15a1 100644 --- a/lib/App/Netdisco/JobQueue/PostgreSQL.pm +++ b/lib/App/Netdisco/JobQueue/PostgreSQL.pm @@ -3,7 +3,7 @@ package App::Netdisco::JobQueue::PostgreSQL; use Dancer qw/:moose :syntax :script/; use Dancer::Plugin::DBIC 'schema'; -use App::Netdisco::Daemon::Job; +use App::Netdisco::Backend::Job; use Net::Domain 'hostfqdn'; use Module::Load (); use Try::Tiny; @@ -38,7 +38,7 @@ sub _getsome { my @returned = (); while (my $job = $rs->next) { - push @returned, App::Netdisco::Daemon::Job->new({ $job->get_columns }); + push @returned, App::Netdisco::Backend::Job->new({ $job->get_columns }); } return @returned; } @@ -68,7 +68,7 @@ sub jq_locked { ->search({status => "queued-$fqdn"}); while (my $job = $rs->next) { - push @returned, App::Netdisco::Daemon::Job->new({ $job->get_columns }); + push @returned, App::Netdisco::Backend::Job->new({ $job->get_columns }); } return @returned; } diff --git a/lib/App/Netdisco/Manual/Deployment.pod b/lib/App/Netdisco/Manual/Deployment.pod index 1aaa315e..bb2b01f9 100644 --- a/lib/App/Netdisco/Manual/Deployment.pod +++ b/lib/App/Netdisco/Manual/Deployment.pod @@ -7,7 +7,7 @@ App::Netdisco::Manual::Deployment - Tips and Tricks for Deployment The Netdisco applications will generate RC scripts suitable for Linux systems: bin/netdisco-web get_init_file - bin/netdisco-daemon get_init_file + bin/netdisco-backend get_init_file On C-based systems please see L. diff --git a/lib/App/Netdisco/Manual/Developing.pod b/lib/App/Netdisco/Manual/Developing.pod index 2ef40ab8..b580b281 100644 --- a/lib/App/Netdisco/Manual/Developing.pod +++ b/lib/App/Netdisco/Manual/Developing.pod @@ -51,14 +51,14 @@ directory You might also want to set C to C in your config to quieten some of the web client callbacks. -For the daemon, it's very similar: +For the backend daemon, it's very similar: - DBIC_TRACE=1 ~/bin/localenv bin/netdisco-daemon-fg + DBIC_TRACE=1 ~/bin/localenv bin/netdisco-backend-fg You can point at a different database without editing C: NETDISCO_DBNAME=testdb DBIC_TRACE=1 ~/bin/localenv plackup -R share,lib -p 5001 bin/netdisco-web-fg - NETDISCO_DBNAME=testdb DBIC_TRACE=1 ~/bin/localenv bin/netdisco-daemon-fg + NETDISCO_DBNAME=testdb DBIC_TRACE=1 ~/bin/localenv bin/netdisco-backend-fg It's recommended to delete the "C<~/perl5/lib/perl5/App/Netdisco>" directory to avoid accidentally picking up old Netdisco code. For working on @@ -398,7 +398,7 @@ database connection management features mentioned above. The job daemon is backwards compatible with the old Netdisco database job requests table. All code for the job daemon lives under the -L namespace and like the rest of Netdisco is broken +L namespace and like the rest of Netdisco is broken down into manageable chunks. =head2 Running the Job Daemon @@ -407,10 +407,10 @@ Like the web application, the job daemon is fully self contained and runs via two simple scripts shipped with the distribution - one for foreground and one for background execution (see the user docs for instructions). -The C script uses L to daemonize so you can +The C script uses L to daemonize so you can fire-and-forget the Netdisco job daemon without much trouble at all. This -script in turn calls C which is the real application, that -runs in the foreground if called on its own. +script in turn calls C which is the real application, +that runs in the foreground if called on its own. =head2 Daemon Engineering diff --git a/lib/App/Netdisco/Manual/ReleaseNotes.pod b/lib/App/Netdisco/Manual/ReleaseNotes.pod index 214d28d2..ec6b8a0a 100644 --- a/lib/App/Netdisco/Manual/ReleaseNotes.pod +++ b/lib/App/Netdisco/Manual/ReleaseNotes.pod @@ -35,6 +35,22 @@ deploy script for App::Netdisco will make some schema changes to the database, but they are backwards compatible. =back +=head1 2.036000 + +=head2 Health Advice + +In this release the apps C and C have +been renamed to C and C respectively. + +This better reflects the function of the two programs. If you still have +scripts using C or C commands, they +should continue to work, as these apps still exist and simply exec() to the +new scripts on start. + +However, it would be best if you replace any custom management config to +point to the new app names, going forward. Remember to do this on upgrade: + + ln -s ~/perl5/bin/{localenv,netdisco-*} ~/bin/ =head1 2.035007 diff --git a/lib/App/Netdisco/Manual/Systemd.pod b/lib/App/Netdisco/Manual/Systemd.pod index 38b10aad..9fde22e9 100644 --- a/lib/App/Netdisco/Manual/Systemd.pod +++ b/lib/App/Netdisco/Manual/Systemd.pod @@ -10,21 +10,21 @@ instructions apply to your local installation and use at your own risk. =head1 Files -=head2 C<< /etc/systemd/system/netdisco-daemon.service >> +=head2 C<< /etc/systemd/system/netdisco-backend.service >> This should be set mode 644 and owned by user and group C. [Unit] - Description=Netdisco Daemon Service - AssertFileIsExecutable=/home/netdisco/bin/netdisco-daemon + Description=Netdisco Backend Service + AssertFileIsExecutable=/home/netdisco/bin/netdisco-backend After=syslog.target network-online.target [Service] Type=forking User=netdisco Group=netdisco - ExecStart=/home/netdisco/bin/netdisco-daemon start - ExecStop=/home/netdisco/bin/netdisco-daemon stop + ExecStart=/home/netdisco/bin/netdisco-backend start + ExecStop=/home/netdisco/bin/netdisco-backend stop Restart=on-failure RestartSec=60 @@ -38,7 +38,7 @@ This should be set mode 644 and owned by user and group C. [Unit] Description=Netdisco Web Service AssertFileIsExecutable=/home/netdisco/bin/netdisco-web - After=syslog.target network-online.target netdisco-daemon.service + After=syslog.target network-online.target netdisco-backend.service [Service] Type=forking @@ -56,15 +56,15 @@ This should be set mode 644 and owned by user and group C. To enable Netdisco in systemd: - systemctl enable netdisco-daemon.service + systemctl enable netdisco-backend.service systemctl enable netdisco-web.service To start Netdisco: - systemctl start netdisco-daemon.service + systemctl start netdisco-backend.service systemctl start netdisco-web.service -May also need to run C depending on the order you do -these steps. +May also need to run C depending on the +order you do these steps. =cut diff --git a/lib/App/Netdisco/Util/Daemon.pm b/lib/App/Netdisco/Util/Backend.pm similarity index 94% rename from lib/App/Netdisco/Util/Daemon.pm rename to lib/App/Netdisco/Util/Backend.pm index 9234c5b0..f441a24a 100644 --- a/lib/App/Netdisco/Util/Daemon.pm +++ b/lib/App/Netdisco/Util/Backend.pm @@ -1,4 +1,4 @@ -package App::Netdisco::Util::Daemon; +package App::Netdisco::Util::Backend; use strict; use warnings; diff --git a/share/config.yml b/share/config.yml index 9c47e011..3715392c 100644 --- a/share/config.yml +++ b/share/config.yml @@ -1,4 +1,4 @@ -# This is the main configuration file for Netdisco web and daemon apps +# This is the main configuration file for Netdisco web and backend apps # # DO NOT EDIT THIS FILE # diff --git a/share/environments/deployment.yml b/share/environments/deployment.yml index 501caac5..fa41ac7e 100644 --- a/share/environments/deployment.yml +++ b/share/environments/deployment.yml @@ -64,7 +64,7 @@ discover_no_type: - '(?i)phone' - '(?i)(?:wap|wireless)' -# number of SNMP workers to run in parallel (in netdisco-daemon). +# number of SNMP workers to run in parallel (in netdisco-backend). # the default is twice the number of CPU cores. increase this if # your system has few cores and the schedule is taking too long. # ```````````````````````````````````````````````````````````````