diff -r 5bb3d096ca22 -r 0ed7846bef6f wgnd-mkstruct.pl --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/wgnd-mkstruct.pl Thu Apr 26 11:32:55 2012 +0200 @@ -0,0 +1,137 @@ +#!/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 . +# +# Matthias Förste + +=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-mkstruct.map.pl'; + +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; + print "$name was created\n" if $e->IN_CREATE; + print "$name is no longer mounted\n" if $e->IN_UNMOUNT; + print "$name is gone\n" if $e->IN_IGNORED; + print "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; + print "${ME}[$pid]: exit $e\n"; + } + +} + + +__END__ + +=pod + +=head1 NAME + +wgnd-mkstruct - instantiate a directory structure template + +=head1 SYNOPSIS + +wgnd-mkstruct [--map filename] + +wgnd-mkstruct -m|--man + -h|--help + +=head1 DESCRIPTION + +wgnd-mkstruct watches some directories for newly created subdirectories and +synchronises these from a given template directory. + +=head1 OPTIONS + +=over + +=item B<--map> I + +Name of a file containing mappings between templates and directories. Defaults +to F. + +=back + +=head1 FILES + +=over + +=item F + +default for B<--map> + +=back + +=head1 AUTHOR + +Matthias Förste + +=cut