use Sys::Hostname qw(hostname);
use Tie::File;
-my $VERSION = '0.05';
+my $VERSION = '0.06';
my $conf_file = catfile($Bin, 'client.conf');
+sub _die { die "$0: [client] $_[0]" }
+
sub usage
{
+ warn "$_[0]\n" if defined $_[0];
print <<"USAGE";
-Usage: $0
+Usage: $0 [options]
-d, --debug server debugging
-h, --help this help screen
-i, --init initialize session data
+ -l, --list list remote entries
USAGE
exit;
}
my %opts;
-GetOptions(\%opts, qw(d|debug h|help i|init)) or usage();
+GetOptions(\%opts, qw(d|debug h|help i|init l|list)) or usage();
usage() if $opts{h};
+usage('Cannot combine --init and --list') if $opts{i} && $opts{l};
+
my $config = Config::Tiny->new;
$config = Config::Tiny->read($conf_file);
{
my ($section, $options) = @_;
- die "$0: Section $section missing in $conf_file\n" unless exists $config->{$section};
+ _die "Section '$section' missing in $conf_file\n" unless exists $config->{$section};
my %options;
@options{@$options} = @{$config->{$section}}{@$options};
foreach my $option (@$options) {
- die "$0: Option $option not set in $conf_file\n" unless defined $options{$option} && length $options{$option};
+ _die "Option '$option' not set in $conf_file\n" unless defined $options{$option} && length $options{$option};
}
return @options{@$options};
{
my ($session) = @_;
- open(my $fh, '>', $session_file) or die "Cannot open client-side $session_file for writing: $!\n";
+ open(my $fh, '>', $session_file) or _die "Cannot open $session_file for writing: $!\n";
print {$fh} "$session\n";
close($fh);
};
my $get_session = sub
{
- open(my $fh, '<', $session_file) or die "Cannot open client-side $session_file for reading: $!\nPerhaps try running --init\n";
+ open(my $fh, '<', $session_file) or _die "Cannot open $session_file for reading: $!\nPerhaps try running --init\n";
my $session = do { local $/; <$fh> };
chomp $session;
close($fh);
name => $name,
debug => $opts{d} || false,
init => $opts{i} || false,
+ list => $opts{l} || false,
session => $session,
);
$data = decode_json($response->decoded_content);
} or exit;
- die "$0: $data->{error}" if defined $data->{error};
-
- $save_session->($session) if $opts{i};
+ die "$0: [server] $data->{error}" if defined $data->{error};
- my %list;
- foreach my $entry (@{$data->{entries}}) {
- my $host = "$entry->{ip}\t" . join '.', @$entry{qw(name pc netz)};
- push @{$list{$entry->{netz}}}, $host;
+ if ($opts{i}) {
+ $save_session->($session);
}
+ elsif ($opts{l}) {
+ format STDOUT_TOP =
+IP Name PC Netz
+=============================================================================
+.
+ foreach my $entry (sort { $a->{netz} cmp $b->{netz} } @{$data->{entries}}) {
+ format STDOUT =
+@<<<<<<<<<<<<<< @<<<<<<<<<<<<<< @<<<<<<<<<<<<<<<<<<< @<<<<<<<<<<<<<<
+@$entry{qw(ip name pc netz)}
+.
+ write;
+ }
+ }
+ else {
+ my %list;
+ foreach my $entry (@{$data->{entries}}) {
+ my $host = "$entry->{ip}\t" . join '.', @$entry{qw(name pc netz)};
+ push @{$list{$entry->{netz}}}, $host;
+ }
- my $o = tie my @hosts, 'Tie::File', $hosts_file or die "$0: Cannot tie $hosts_file: $!\n";
- $o->flock(LOCK_EX);
-
- foreach my $network (keys %list) {
- my %indexes;
- for (my $i = 0; $i < @hosts; $i++) {
- if ($hosts[$i] =~ /^\#$network\#$/i) {
- $indexes{start} = $i;
- }
- elsif (exists $indexes{start} && $hosts[$i] =~ /^\#\/$network\#$/i) {
- $indexes{end} = $i;
- my $count = ($indexes{end} - $indexes{start} > 1)
- ? $indexes{end} - $indexes{start} - 1
- : 0;
- splice @hosts, $indexes{start} + 1, $count, @{$list{$network}};
- last;
+ my $o = tie my @hosts, 'Tie::File', $hosts_file or _die "Cannot tie $hosts_file: $!\n";
+ $o->flock(LOCK_EX);
+
+ foreach my $network (keys %list) {
+ my %indexes;
+ for (my $i = 0; $i < @hosts; $i++) {
+ if ($hosts[$i] =~ /^\#$network\#$/i) {
+ $indexes{start} = $i;
+ }
+ elsif (exists $indexes{start} && $hosts[$i] =~ /^\#\/$network\#$/i) {
+ $indexes{end} = $i;
+ my $count = ($indexes{end} - $indexes{start} > 1)
+ ? $indexes{end} - $indexes{start} - 1
+ : 0;
+ splice @hosts, $indexes{start} + 1, $count, @{$list{$network}};
+ last;
+ }
}
}
- }
- undef $o;
- untie @hosts;
+ undef $o;
+ untie @hosts;
+ }
}
else {
warn $response->status_line, "\n";