#!/usr/local/bin/perl # Convert /etc/aliases to ~alias/.qmail-* # (C)1999 by HIROSE Yuuji [yuuji@itc.keio.ac.jp] # # Usage: # ./etcaliases2dot-qmail [options] AliasFile # Optinos are... # -n No-exec, only display convert assumption # -s Create symlink for :include: instead of copying its contents # -q Quiet # AliasFile of sendmail can contain pipe, file, and :include: notations. $left = $right = ''; $symlink = 0; while ($_ = $ARGV[0], /^-.+/ && shift) { if (/^-n/) { $noexec++; print "x\n"; } elsif (/^-s/) { $symlink++; } elsif (/^-q/) { $quiet++; } } while (<>) { next if /^\s*#/; next if /^\s*$/; chop; ($left, $right) = /([^:]+):\s*(.*)/; if (/include/) { &do_include; } elsif (/"\|.*"/) { $right =~ s/^"(.*)"/\1/; &put($left, $right); } elsif ($right =~ m,^[/|],) { s/^\s*//; s/\s*$//; &put($left, $_); } else { local(@tmp) = split(/,/, $right); grep({s/^\s*//, s/\s*$//}, @tmp); grep({s/^/\&/}, @tmp); &put($left, join("\n", @tmp)); } } sub do_include { local($file) = ($right =~ /include\s*:\s*(\S+)/); if ($symlink) { local $qfile = ".qmail-\L$left\E"; unlink($qfile); symlink($file, $qfile); } else { local(@list) = &parse_file($file); if (@list) { &put($left, join("\n", @list)); } } } sub parse_file { local($file) = @_; local(@stuff); if (open(INCLUDE, $file)) { while () { next if /^\s*#/; next if /^\s*$/; s/^\s*//; s/\s*$//; s/^"(\|.*)"/\1/; if (/include\s*:\s*(\S+)/) { push(@stuff, &parse_file($1)); } elsif (m,^[/|],) { push(@stuff, $_); } else { push(@stuff, "&$_"); } } close(INCLUDE); return @stuff; } else { print STDERR "Cannot open include file [$file]\n"; return (); } } sub put { local($addr, $forward) = @_; local $file = ".qmail-\L$addr\E"; unless ($noexec) { open(DOTQMAIL, "> $file") or die "Cannot output to [$file]\n"; print DOTQMAIL "$forward\n"; close(DOTQMAIL); } print "[$file]\n$forward\n" unless ($quiet); }