X-Git-Url: https://the.earth.li/gitweb/?a=blobdiff_plain;f=autodns.pl;h=cfa9510286d8bf178dda0fe4ad94d1933107fad8;hb=7cff990ef4df44469d5bed817fda2292931a74ae;hp=9a739d0c16be5a08035975984ac2a6c3738c6d72;hpb=69f62eb3272157eca2f045f051c44a95efca1279;p=autodns.git diff --git a/autodns.pl b/autodns.pl index 9a739d0..cfa9510 100755 --- a/autodns.pl +++ b/autodns.pl @@ -1,13 +1,18 @@ #!/usr/bin/perl -Tw -# autodns 0.0.5 -# Copyright 1999-2001 Project Purple. Written by Jonathan McDowell +# autodns 0.0.7 +# Copyright 1999-2004 Project Purple. Written by Jonathan McDowell # See ACKNOWLEDGEMENTS file for full details of contributors. # http://www.earth.li/projectpurple/progs/autodns.html # Released under the GPL. +# +# $Id: autodns.pl,v 1.7 2005/04/08 11:45:12 noodles Exp $ +# use strict; -use IPC::Open3; use Fcntl qw(:flock); +use File::Temp qw(tempfile); +use IPC::Open3; +use MIME::Parser; $ENV{'PATH'}="/usr/local/bin:/usr/bin:/bin:/usr/sbin"; @@ -16,39 +21,18 @@ my ($user, $server, $inprocess, $delcount, $addcount, $reload_command); my ($domain, @MAIL, @GPGERROR, @COMMANDS, %zones); my ($me, $ccreply, $conffile, $domainlistroot, @cfgfiles, $VERSION); -$VERSION="0.0.5"; +$VERSION="0.0.7"; # -# Local configuration here (until it gets moved to a config file). +# Load our config # -# These are sort of suitable for a Debian setup. -# - -# Who I should reply as. -$me="autodns\@earth.li"; - -# Who replies should be CCed to. -$ccreply="noodles\@earth.li"; - -# Where to look for zones we're already hosting. -@cfgfiles=("/etc/bind/named.conf", - "/etc/bind/named.secondary.conf"); - -# The file we should add/delete domains from. -$conffile="/etc/bind/named.secondary.conf"; - -# The file that contains details of the authorized users. -$usersfile="/etc/bind/autodns.users"; - -# Base file name to for list of users domains. -$domainlistroot="/etc/bind/domains."; - -# The lockfile we use to ensure we have exclusive access to the -# $domainlistroot$user files and $conffile. -$lockfile="/etc/bind/autodns.lck"; - -# The command to reload the nameserver domains list. -$reload_command="sudo ndc reconfig 2>&1"; +my $file = '/etc/bind/autodns.conf'; +unless (my $ret = do $file) { + warn "Couldn't parse $file\n" if $@; + warn "Couldn't do $file\n" unless defined $ret; + warn "Couldn't run $file\n" unless $ret; + die "Problem reading config file!\n"; +} ### ### There should be no need to edit anything below (unless you're not @@ -84,13 +68,15 @@ sub getzones { # These are: a-z, 0-9, - or . # sub valid_domain { - my $domain = shift; - $domain = lc $domain; - if ($domain =~ /^(?:[a-z0-9-]+\.)+[a-z]{2,4}$/) { - return 1; - } else { - return 0; - } + my $domain = shift; + $domain = lc $domain; + if ($domain =~ /^(?:[a-z0-9-]+\.)+[a-z]{2,4}$/) { + return 1; + } elsif ($domain =~ /^(?:[0-9\/-]+\.)+in-addr.arpa$/) { + return 1; + } else { + return 0; + } } # @@ -200,27 +186,78 @@ print REPLY <output_to_core(1); # No temporary files +my $entity = $parser->parse_data(\@MAIL); + +# +# Make sure locale is set to C so we get messages in English as we expect. # $ENV{'LC_ALL'}="C"; -open3(\*GPGIN, \*GPGOUT, \*GPGERR, "gpg --batch"); -# Feed it the mail. -print GPGIN @MAIL; -close GPGIN; +if ($entity->parts) { + # MIME + + my ($got_sig, $got_text) = (0, 0); + my ($sig_name,$sig_fh,$text_name,$text_fh); + ($sig_fh, $sig_name) = tempfile(); + ($text_fh, $text_name) = tempfile(); + + foreach my $subent ($entity->parts) { + if ($subent->effective_type eq "text/plain") { + @COMMANDS = split /\n/,$subent->bodyhandle->as_string; + + my $str = $subent->as_string; + $str =~ s/=\n$//; + $str =~ s/\n/\r\n/g; + print $text_fh $str; + close($text_fh); + $got_text++; + } elsif ($subent->effective_type eq + "application/pgp-signature") { + print $sig_fh $subent->as_string; + close($sig_fh); + $got_sig++; + } + } + + if ($got_sig && $got_text) { + open3(\*GPGIN, \*GPGOUT, \*GPGERR, "gpg --batch --verify ". + $sig_name." ".$text_name); + + close GPGIN; + + @GPGERROR=; + my @GPGOUTPUT=; + close GPGERR; + close GPGOUT; + + unlink($text_name); + unlink($sig_name); + } +} else { + # Clear text. + + open3(\*GPGIN, \*GPGOUT, \*GPGERR, "gpg --batch"); + + # Feed it the mail. + print GPGIN @MAIL; + close GPGIN; -# And grab what it has to say. -@GPGERROR=; -@COMMANDS=; -close GPGERR; -close GPGOUT; + # And grab what it has to say. + @GPGERROR=; + @COMMANDS=; + close GPGERR; + close GPGOUT; +} # Check who it's from and if the signature was a good one. $gpggood=1; @@ -278,6 +315,13 @@ foreach my $cfgfile (@cfgfiles) { getzones($cfgfile); } +# Force existance of the $domainlistroot$user file +if (! -e $domainlistroot.$user) { + open (DOMAINLIST, ">>$domainlistroot$user") or + &fatalerror("Couldn't create domains file.\n"); + close DOMAINLIST; +} + foreach (@COMMANDS) { # Remove trailing CRs and leading/trailing whitespace chomp; @@ -311,6 +355,9 @@ foreach (@COMMANDS) { print REPLY "Adding domain $domain\n"; $zones{$domain}=1; + my $df = $domain; + $df =~ tr,/,:,; + open (DOMAINSFILE, ">>$conffile"); print DOMAINSFILE " ### Domain added for '$user' @@ -318,7 +365,7 @@ foreach (@COMMANDS) { zone \"$domain\" { type slave; masters { $server; }; - file \"secondary/$user/$domain\"; + file \"secondary/$user/$df\"; allow-transfer { none; }; allow-query { any; }; };\n";