#!/bin/sh # # Copyright (c) 2000 Carnegie Mellon University. All rights reserved. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions # are met: # # 1. Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # # 2. Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in # the documentation and/or other materials provided with the # distribution. # # 3. The name "Carnegie Mellon University" must not be used to # endorse or promote products derived from this software without # prior written permission. For permission or any other legal # details, please contact # Office of Technology Transfer # Carnegie Mellon University # 5000 Forbes Avenue # Pittsburgh, PA 15213-3890 # (412) 268-4387, fax: (412) 268-7395 # tech-transfer@andrew.cmu.edu # # 4. Redistributions of any form whatsoever must retain the following # acknowledgment: # "This product includes software developed by Computing Services # at Carnegie Mellon University (http://www.cmu.edu/computing/)." # # CARNEGIE MELLON UNIVERSITY DISCLAIMS ALL WARRANTIES WITH REGARD TO # THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY # AND FITNESS, IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY BE LIABLE # FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES # WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN # AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING # OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. # exec perl -x -S $0 ${1+"$@"} # -*-perl-*- #!perl -w # # Script for mass compilation of sieve scripts. # # $Id: masssievec,v 1.3 2005/03/05 00:37:39 dasenbro Exp $ if ($] !~ /^5\..*/) { # uh-oh. this isn't perl 5. foreach (split(/:/, $ENV{PATH})) { # try to find "perl5". exec("$_/perl5", "-x", "-S", $0, @ARGV) if (-x "$_/perl5"); } # we failed. bail. die "Your perl is too old; I need perl 5.\n"; } # load the real script. this is isolated in an 'eval' so perl4 won't # choke on the perl5-isms. eval join("\n", ); if ($@) { die "$@"; } __END__ require 5; $| = 1; die "must not run as root" if ($< == 0); if(@ARGV < 1) { print "usage: masssievec [imapd.conf]\n"; exit; } $SIEVEC = shift @ARGV; $imapdconf = shift @ARGV; if(!defined($imapdconf)) { $imapdconf = "/etc/imapd.conf"; } $sievedir = "/usr/sieve"; if(! -x $SIEVEC) { print "$SIEVEC is not executable\n"; exit; } if($SIEVEC !~ /^\//) { print "$SIEVEC is not an absolute path\n"; exit; } open CONF, $imapdconf or die "can't open $imapdconf"; while () { if (/^sieveusehomedir:\s+(1|t|yes|on)/) { $nosievedir = 1; print "you are storing sieve scripts in user's home directories, this script cannot deal with that\n"; exit; } if (/^sievedir:\s+(.*)$/) { $sievedir = $1; } } close CONF; print "you are using $sievedir as your sieve directory.\n"; opendir TOP, $sievedir; while (defined($s = readdir TOP)) { next if ($s eq "." || $s eq ".."); chdir $sievedir . "/$s"; opendir THISONE, "."; while(defined($t = readdir THISONE)) { next if ($t eq "." || $t eq ".."); print "processing user $t\n"; chdir $t; opendir USER, "."; while(defined($u = readdir USER)) { next if ($u eq "." || $u eq ".."); if($u eq "default" && -l $u) { # special case $dest = readlink $u; next unless($dest =~ m/\.script$/); $dest =~ s/\.script$//; symlink "$dest.bc", "defaultbc" || warn "can't symlink $dest.bc to defaultbc: $!"; unlink ("default"); } elsif ($u eq "default.bc" && -l $u) { # slightly different upgrade foramt $dest = readlink $u; next unless($dest =~ m/\.bc$/ && $dest ne "default.bc"); symlink "$dest", "defaultbc" || warn "can't symlink $dest to defaultbc: $!"; unlink ("default.bc"); } elsif ($u eq "default" || $u eq "default.bc") { warn "$u is not a symlink"; } else { next unless($u =~ m/\.script$/); $out = $u; $out =~ s/\.script$//; FORK: { if($pid = fork()) { #parent, do nothing waitpid $pid, 0; } elsif (defined $pid) { # child exec $SIEVEC, $u, "$out.bc"; die "souldn't be here"; } elsif ($! =~ /No more process/) { # EAGAIN sleep 5; redo FORK; } else { die "cant fork: $!"; } } $rc = $? & 0xff00; $rc >>= 8; if($rc) { print "got error compiling $u.\n"; } } } chdir $sievedir . "/$s"; } closedir THISONE; } closedir TOP