| #!/usr/bin/env perl | 
 |  | 
 | use strict; | 
 |  | 
 | my $operation = shift @ARGV; | 
 |  | 
 | if ($operation !~ m/^(install|uninstall)$/) { | 
 |     print STDERR "$0: unknown operation $operation\n"; | 
 |     exit(1); | 
 | } | 
 |  | 
 | my %options = (); | 
 |  | 
 | for my $arg (@ARGV) { | 
 |     if ($arg =~ m/([^=]*)=(.*)/) { | 
 |         $options{$1} = $2; | 
 |     } | 
 |     else { | 
 |         print STDERR "$0: can't parse option [$arg]\n"; | 
 |         exit(1); | 
 |     } | 
 | } | 
 |  | 
 | for my $option (qw(command directory extension file)) { | 
 |     unless (defined($options{$option})) { | 
 |         print STDERR "$0: required variable $option not provided\n"; | 
 |         exit(1); | 
 |     } | 
 | } | 
 |  | 
 | my $fh; | 
 | unless (open $fh, '<', $options{file}) { | 
 |     print STDERR "$0: can't open links file '$options{file}': $!"; | 
 |     exit(1); | 
 | } | 
 |  | 
 | my @cmd = split /\s+/, $options{command}; | 
 |  | 
 | while (my $line = <$fh>) { | 
 |     chomp $line; | 
 |     my @args = split /\s+/, $line; | 
 |  | 
 |     process(@args); | 
 | } | 
 |  | 
 | sub process { | 
 |     my ($source, @destinations) = @_; | 
 |  | 
 |     my @args = (@cmd); | 
 |  | 
 |     if ($operation eq 'install') { | 
 |         push @args, "$options{directory}/$source.$options{extension}"; | 
 |     } | 
 |  | 
 |     for my $destination (@destinations) { | 
 |         push @args, "$options{directory}/$destination.$options{extension}"; | 
 |         run_command(@args); | 
 |         pop @args; | 
 |     } | 
 | } | 
 |  | 
 | sub run_command { | 
 |     print (join ' ', @_); | 
 |     print "\n"; | 
 |  | 
 |     my $ret = system(@_); | 
 |  | 
 |     if ($ret != 0) { | 
 |         print STDERR "$0: command failed: $?\n"; | 
 |         exit(1); | 
 |     } | 
 |  | 
 |     return 1; | 
 | } |