wgnd-watch.pl
changeset 14 7b4903ebdee8
parent 13 71d654155a56
child 19 a9b77650cbc4
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/wgnd-watch.pl	Mon Apr 30 11:18:51 2012 +0200
@@ -0,0 +1,159 @@
+#!/usr/bin/perl
+
+#    Copyright (C) 2012  Matthias Förste
+#
+#    This program is free software: you can redistribute it and/or modify
+#    it under the terms of the GNU General Public License as published by
+#    the Free Software Foundation, either version 3 of the License, or
+#    (at your option) any later version.
+#
+#    This program is distributed in the hope that it will be useful,
+#    but WITHOUT ANY WARRANTY; without even the implied warranty of
+#    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+#    GNU General Public License for more details.
+#
+#    You should have received a copy of the GNU General Public License
+#    along with this program.  If not, see <http://www.gnu.org/licenses/>.
+#
+#    Matthias Förste <foerste@schlittermann.de>
+
+=encoding utf8
+=cut
+
+use strict;
+use warnings;
+
+my $VERSION = '0.1';
+my $ME = $0;
+use Getopt::Long;
+use Pod::Usage;
+use Linux::Inotify2;
+# File::Rsync in squeeze does not support --xattrs yet
+#use File::Rsync;
+
+my $map = 'wgnd-watch.map.pl';
+
+BEGIN {
+
+    use Sys::Syslog;
+    openlog($ME, 'ndelay,nowait,pid', 'LOG_USER');
+    $SIG{__WARN__} = sub {
+        warn @_ if not defined $^S;
+        print STDERR "@_";
+        syslog('warning', "@_");
+    };
+    $SIG{__DIE__} = sub {
+        die @_ if not defined $^S;
+        print STDERR "@_";
+        syslog('err', "@_");
+        exit $?;
+    };
+
+    sub dolog { print "@_"; syslog('info', "@_"); }
+    sub trace { print @_ if $ENV{DEBUG}; }
+
+}
+
+GetOptions(
+    "map=s"  => \$map,
+    "h|help" => sub { pod2usage( -verbose => 0, -exitval => 0 ) },
+    "m|man"  => sub {
+        pod2usage(
+            -verbose   => 2,
+            -exitval   => 0,
+            -noperldoc => ( `perldoc -V 2>/dev/null`, $? != 0 )[-1]
+        );
+    },
+) or pod2usage();
+
+our $source;
+use lib ('.', $ENV{HOME}, '/etc'); 
+require $map;
+
+my $inotify = new Linux::Inotify2
+    or die "Can't create new inotify object: $!";
+my @rsync = qw(/usr/bin/rsync -ihv -aAX);
+
+for (keys %{$source}) {
+
+    # add watchers
+    $inotify->watch ("$_", IN_CREATE, sub {
+
+            my $pid = fork;
+
+            if (not defined $pid) {
+                warn "Can't fork: $!\n";
+            } elsif ($pid == 0) {
+                my $e = shift;
+                my $name = $e->fullname;
+                dolog "$name was created\n" if $e->IN_CREATE;
+                dolog "$name is no longer mounted\n" if $e->IN_UNMOUNT;
+                dolog "$name is gone\n" if $e->IN_IGNORED;
+                dolog "events for $name have been lost\n" if $e->IN_Q_OVERFLOW;
+                exec @rsync, $source->{$e->{w}->{name}}, $name;
+                warn "Can't exec: $!\n";
+            }
+
+        }) or die "Can't add watch: $!\n";
+}
+
+while (1) {
+
+    $inotify->poll;
+    while (-1 != (my $pid = wait)) {
+        my $e = $? >> 8;
+        dolog "child ${ME}[$pid]: exit $e\n";
+    }
+
+}
+
+END {
+    closelog;
+}
+
+__END__
+
+=pod
+
+=head1 NAME
+
+wgnd-watch - inotify actions for wiegand
+
+=head1 SYNOPSIS
+
+wgnd-watch [--map filename]
+
+wgnd-watch -m|--man
+           -h|--help
+
+=head1 DESCRIPTION
+
+wgnd-watch currently watches some directories for newly created subdirectories
+and synchronises these from a given template directory.
+
+=head1 OPTIONS
+
+=over
+
+=item B<--map> I<filename>
+
+Name of a file containing mappings between templates and directories. Defaults
+to F<wgnd-watch.map.pl>.
+
+=back
+
+=head1 FILES
+
+=over
+
+=item F<wgnd-watch.map.pl>
+
+default for B<--map>
+
+=back
+
+=head1 AUTHOR
+
+Matthias Förste <foerste@schlittermann.de>
+
+=cut