summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJon duSaint2022-07-17 10:48:29 -0700
committerJon duSaint2022-07-17 10:48:29 -0700
commit6ea9831e0d7616640fb6dfd25835959715ebe8d9 (patch)
tree2f00ad98b7842547d58088f68517a9eb4b5e459d
parentd77975cb1c7b9ed5571fc1e700a3a4e281b0a47d (diff)

reolink: Add spool retention policy

Default now is to keep images in spool only for 24 hours. This can be changed via a client command or the config file.

-rwxr-xr-xreolink/reolink34
-rw-r--r--reolink/reolink.82
-rw-r--r--reolink/reolink.conf3
-rw-r--r--reolink/reolink.conf.52
4 files changed, 38 insertions, 3 deletions
diff --git a/reolink/reolink b/reolink/reolink
index d950852..8d24810 100755
--- a/reolink/reolink
+++ b/reolink/reolink
@@ -21,6 +21,8 @@ my $global_config = \%default_config;
# 30s is 1920 shots over 16 hours. At 24fps, this makes a 1:20 video.
my ($min_interval, $interval, $max_interval) = (10, 30, 600);
+# Retain images in the spool 24 hours by default
+my $spool_retention_time = 24;
my $default_video_range = '0530-2130';
my %commands = (
@@ -35,6 +37,12 @@ my %commands = (
server => \&Server::snapshot,
help => 'Take a snapshot now'
},
+ spooltime => {
+ args => 1,
+ server => \&Server::set_spooltime,
+ validate => sub { $_[0] > 0 && int($_[0]) == $_[0] },
+ help => 'Set spool retention time (in hours)'
+ },
status => {
args => 0,
server => \&Server::server_status,
@@ -80,6 +88,8 @@ sub load_params {
$params->{interval} = $value;
} elsif ($key =~ m/^spool(?:_dir)?$/) {
$params->{spool_dir} = $value;
+ } elsif ($key =~ m/^spool[-_]time$/ and $commands{spooltime}->{validate} ($value)) {
+ $params->{spooltime} = $value;
} elsif ($key =~ m/^(?:reolink|camera)(?:_ip)?$/) {
$params->{reolink_ip} = $value;
} elsif ($key =~ m/^video(?:[-_]?times?)?$/ and $commands{video}->{validate} ($value)) {
@@ -100,7 +110,7 @@ use Getopt::Long;
use IO::Select;
use OpenBSD::Pledge;
use OpenBSD::Unveil;
-use POSIX qw(setsid :sys_wait_h);
+use POSIX qw(mktime setsid :sys_wait_h);
use Socket;
use Sys::Syslog qw/:standard :macros/;
@@ -118,6 +128,7 @@ BEGIN {
my %server_params = (interval => $interval,
reolink_ip => '192.168.127.1',
+ spooltime => $spool_retention_time,
video => $default_video_range);
my $camera_host = '192.168.127.10';
my ($debug, $local) = (0, 0);
@@ -151,6 +162,7 @@ sub save_params {
print $fh "# Autogenerated ".localtime.".\n";
print $fh "interval: $server_params{interval}\n";
print $fh "spool_dir: $server_params{spool_dir}\n";
+ print $fh "spool_time: $server_params{spooltime}\n";
print $fh "reolink_ip: $server_params{reolink_ip}\n";
print $fh "video: $server_params{video}\n";
@@ -213,6 +225,12 @@ sub set_interval {
"ok";
}
+sub set_spooltime {
+ $server_params{spooltime} = $_[1];
+ save_params;
+ "ok";
+}
+
sub video {
$server_params{video} = $_[1];
save_params;
@@ -316,7 +334,7 @@ sub maybe_generate_video {
my @t = localtime;
my $time = sprintf ('%d%02d', $t[2], $t[1]);
if ($time < $end_time) {
- debug ("too early ($time < $end_time)");
+ debug ("too early to generate video ($time < $end_time)");
return;
}
@@ -358,7 +376,17 @@ sub maybe_generate_video {
sub respool {
# Retain only past 24 hours of stills
-
+ my $t = time - $server_params{spooltime} * 60 * 60;
+
+ foreach my $image (<"$server_params{spool_dir}/*.jpg">) {
+ if ($image =~ m/(\d{4})(\d{2})(\d{2})-(\d{2})(\d{2})(\d{2})\.jpg/) {
+ my $file_time = mktime ($6, $5, $4, $3, $2 - 1, $1 - 1900);
+ if ($file_time < $t) {
+ debug ("delete $image ($file_time $t)");
+ unlink $image;
+ }
+ }
+ }
}
sub upload {
diff --git a/reolink/reolink.8 b/reolink/reolink.8
index 1494381..ccd702b 100644
--- a/reolink/reolink.8
+++ b/reolink/reolink.8
@@ -53,6 +53,8 @@ Set snapshot interval
Send the pid of the server
.It snapshot Ta
Take a snapshot now
+.It spooltime Ta
+Set spool retention time (in hours)
.It status Ta
Send status of the server
.It ping Ta
diff --git a/reolink/reolink.conf b/reolink/reolink.conf
index b2abe00..cf37f2d 100644
--- a/reolink/reolink.conf
+++ b/reolink/reolink.conf
@@ -8,6 +8,9 @@ interval: 30
# Where to store snapshots and videos
spool_dir: /var/spool/reolink
+# Retain images in the spool for 24 hours
+spool_time: 24
+
# IP address of camera
reolink_ip: 192.168.127.10
diff --git a/reolink/reolink.conf.5 b/reolink/reolink.conf.5
index aefcde8..a034b6d 100644
--- a/reolink/reolink.conf.5
+++ b/reolink/reolink.conf.5
@@ -23,6 +23,8 @@ Unknown directives are ignored. Known directives are:
How often to take a snapshot
.It spool_dir Ta
Where to store snapshots and videos
+.It spool_time Ta
+How long, in hours, to retain images in the spool
.It reolink_ip Ta
IP address of camera
.It video Ta