X-Git-Url: http://git.refcnt.org/?p=distdns.git;a=blobdiff_plain;f=server.cgi;h=1adcf0933b6ee9d71425fcd7cf503292e7a7de2a;hp=67b522efb7ebd8c8ae7aeed18ce433409ab04a53;hb=HEAD;hpb=577cd6cddb2b1d6bfa21d682308fde6493d9dab6 diff --git a/server.cgi b/server.cgi index 67b522e..1adcf09 100755 --- a/server.cgi +++ b/server.cgi @@ -28,13 +28,13 @@ use File::Spec::Functions qw(catfile rel2abs); use FindBin qw($Bin); use JSON qw(decode_json encode_json); -my $VERSION = '0.05'; +my $VERSION = '0.06'; my $conf_file = catfile($Bin, 'server.conf'); my $query = CGI->new; -my @params = qw(netz pc name debug init session); +my @params = qw(netz pc name debug init list session); my %params; foreach my $param (@params) { @@ -51,12 +51,18 @@ if ($params{debug}) { }; } +my @missing_params = grep { not defined $params{$_} && length $params{$_} } @params; +if (@missing_params) { + my $missing_params = join ', ', map "'$_'", @missing_params; + die "Incomplete query: param(s) $missing_params missing or not defined\n"; +} + my $config = Config::Tiny->new; $config = Config::Tiny->read($conf_file); my $section = 'path'; -die "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 = qw(json_file session_file); @@ -64,7 +70,7 @@ my %options; @options{@options} = @{$config->{$section}}{@options}; foreach my $option (@options) { - die "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}; } my ($json_file, $session_file) = map rel2abs($options{$_}, $Bin), @options; @@ -75,22 +81,19 @@ if ($params{init}) { open(my $fh, '>', $session_file) or die "Cannot open $session_file for writing: $!\n"; print {$fh} "$params{session}\n"; close($fh); + + print $query->header('application/json'); + print encode_json({ entries => [], error => undef }); + exit; } else { 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; + chomp(my $session = <$fh>); close($fh); die "Session ID mismatch\n" unless $params{session} eq $session; } -my @missing_params = grep { not defined $params{$_} && length $params{$_} } @params; -if (@missing_params) { - my $missing_params = join ', ', map "'$_'", @missing_params; - die "Incomplete query: param(s) $missing_params missing or not defined\n"; -} - my %access; my $access_file = "$params{netz}.conf"; @@ -115,26 +118,35 @@ if (exists $access{$params{name}} && grep /^$params{pc}$/i, @{$access{$params{na my $data = defined $json && length $json ? decode_json($json) : []; - for (my $i = 0; $i < @$data; $i++) { - if ($params{netz} eq $data->[$i]->{netz} - && $params{pc} eq $data->[$i]->{pc} - && $params{name} eq $data->[$i]->{name}) { - splice @$data, $i--, 1; - } + if ($params{list}) { + close($fh); + + print $query->header('application/json'); + print encode_json({ entries => $data, error => undef }); } - push @$data, { map { $_ => $params{$_} } qw(netz pc name ip) }; + else { + for (my $i = 0; $i < @$data; $i++) { + if ($params{netz} eq $data->[$i]->{netz} + && $params{pc} eq $data->[$i]->{pc} + && $params{name} eq $data->[$i]->{name}) { + splice @$data, $i--, 1; + } + } + push @$data, { map { $_ => $params{$_} } qw(netz pc name ip) }; + $data->[-1]->{time} = time; - seek($fh, 0, 0) or die "Cannot seek to start of $json_file: $!\n"; - truncate($fh, 0) or die "Cannot truncate $json_file: $!\n"; + seek($fh, 0, 0) or die "Cannot seek to start of $json_file: $!\n"; + truncate($fh, 0) or die "Cannot truncate $json_file: $!\n"; - print {$fh} encode_json($data); + print {$fh} encode_json($data); - close($fh); + close($fh); - my @data = grep $_->{netz} eq $params{netz}, @$data; + my @data = grep $_->{netz} eq $params{netz}, @$data; - print $query->header('application/json'); - print encode_json({ entries => \@data, error => undef }); + print $query->header('application/json'); + print encode_json({ entries => \@data, error => undef }); + } } else { die "Access not permitted\n";