aboutsummaryrefslogtreecommitdiff
path: root/contrib/psycfilemonitor
blob: d7606fab391a821ae323c1f0157d9ef8640db1e2 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
#!/usr/bin/perl -I/usr/depot/lib/perl5

# notifies a PSYC target about changes in a filesystem.	-lynX 2005
# currently using famd as Inotify.pm isn't really ready yet.
# the script will report content changes to files in the directory.
#
# a different approach would be to implement a fuse user-space filesystem
# which generates psyc notifications as it is being used and does some
# extra useful jobs like store the files in some smart way (compressed,
# encrypted, databased, replicated, psyc-synchronized) ...
#	see http://fuse.sourceforge.net/
#	and http://about.psyc.eu/Software_Projects
#		on Multicast Filesystems
# this again only works for limited file spaces, not entire systems
# 
# GENERAL
# ~*~*~*~
# If you don't own an always running PSYC server yet, visit 
# www.psyc.eu and consider using the PSYCdevs' brain community.
# Or get your very own psyced from http://www.psyced.org


$target  = shift;
$base  = shift;

die <<X unless $base;
please provide target and directory to monitor as parameters, as in
    $0 psyc://psyced.org/\@files /tmp
X

$mc = '_notice_update_file_';

use Net::PSYC;

$user = $ENV{'USER'};
$host = $ENV{'HOST'};
chdir($base);
$base .= '/' unless $base =~ m#/$#;

use SGI::FAM;

my $fam=new SGI::FAM;
$fam->monitor($base);

my $event=$fam->next_event;
print "In ", $event->filename, " we find:\n\n   ";

while (1) {
    my $event=$fam->next_event;
    last if $event->type eq 'end_exist';
    print ' ', $event->filename;
}
print "\n\nNow waiting for changes.\n";

while (1) {
    my $event=$fam->next_event; # blocks. see manual for async interface.
    $_ = $event->filename;
    print "$_ [", $event->type, "]\n";
    next if /\.swp/;	# ignore vim swap files

    sendmsg($target, $mc.$event->type,
	      "([_nick_host]File) [_operation]: " .
	      "[_path_file][_name_file] ([_size_file])", {
	_nick_user => $user, _nick_host => $host, _path_file => $base,
	_operation => $event->type, _name_file => $_, _size_file => (-s $_)
    } );
}