use strict;
use warnings;
+use lib qw(lib);
use CGI ();
+use Config::Tiny ();
use Fcntl ':flock';
+use File::Spec::Functions qw(catfile rel2abs);
+use FindBin qw($Bin);
use JSON qw(decode_json encode_json);
-my $VERSION = '0.04';
+my $VERSION = '0.06';
-#-----------------------
-# Start of configuration
-#-----------------------
-
-my $json_file = 'data.json';
-my $session_file = 'session.dat';
-
-#---------------------
-# End of configuration
-#---------------------
+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) {
};
}
+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};
+
+my @options = qw(json_file session_file);
+
+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};
+}
+
+my ($json_file, $session_file) = map rel2abs($options{$_}, $Bin), @options;
+
if ($params{init}) {
- die "Delete server-side $session_file first\n" if -e $session_file;
+ die "Delete $session_file first\n" if -e $session_file;
- open(my $fh, '>', $session_file) or die "Cannot open server-side $session_file for writing: $!\n";
+ open(my $fh, '>', $session_file) or die "Cannot open $session_file for writing: $!\n";
print {$fh} "$params{session}\n";
close($fh);
}
else {
- open(my $fh, '<', $session_file) or die "Cannot open server-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);
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";
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) };
- 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";