#!/usr/bin/perl

BEGIN {
   push(@INC,"/scripts");
}

use SafeFile;


if (! -e "/usr/local/apache/libexec/mod_mono.so") {
   print "Sorry you must install the cPanel mod_mono addon module.\n";
   exit;
}


$ip = $ARGV[0];
$ip =~ s/\n//g;

$| = 1;

if ($ip eq "") {
   if (-t STDIN) {
      print "What is the domainname you want to setup? ";
      $ip = <STDIN>;
      chomp($ip);
   } else { die "stdin is not a tty and no domain was given to us"; }
}

$ip =~ s/^www\.//g;
print "Scanning httpd.conf.";




die if (! -e "/usr/local/apache/conf/httpd.conf");

$addedhost = 0;
$conflock = SafeFile::safeopen(\*HC,"+<","/usr/local/apache/conf/httpd.conf");
while(<HC>) {
   push(@HC,$_);
}
seek(HC,0,0);
foreach(@HC) {
   if (!/^#/) {
      if (/<virtualhost/i) {
         $bh = 1;
         $ivh = 1;
      }
      if (/<\/virtualhost/i) {
         if ($bh) {
            $owner = getdomainowner($sn);
            $homedir = gethomedir($owner);
            print HC "\nMonoApplications \"${homedir}/public_html/aspx/\"\n" .
               "<Directory \"${homedir}/public_html/aspx/\">\n" .
               "   Options Indexes\n   AllowOverride None\n   AddHandler mono .aspx .ascx .asax .ashx .config .cs .asmx\n</Directory>\n\n";
            mkdir("${homedir}/public_html/aspx");
		    chown("${owner}","${owner}","${homedir}/public_html/aspx/");
                    chmod("0755","${homedir}/public_html/aspx/");
		    $addedhost = 1;
         }
         $ivh = 0;
      }
      if ($ivh) {
         if (/MonoApplications/i) {
            $bh = 0;
         }
         if (/ServerName (\S+)/i) {
            $sn = $1;
            $sn =~ s/^www\.//g;
            if ($sn ne $ip) { $bh = 0; }
         }
      }
   }
  print HC $_;
}
truncate(HC,tell(HC));

SafeFile::safeclose(\*HC,$conflock);


if ($addedhost) {
   safeaprestart();
   print ".aspx support installed in ${ip}/aspx/!\n";
} else {
   print "\n$ip not found or .aspx already installed!\n";
}

sub safeaprestart {
   if (-x "/usr/local/cpanel/bin/safeapacherestart") {
      system("/usr/local/cpanel/bin/safeapacherestart");
   } else {
      if (-x "/usr/bin/killall") {
         system("/usr/bin/killall","-USR1","httpd");
      } elsif (-x "/usr/sbin/killall") {
         system("/usr/sbin/killall","-USR1","httpd");
      } elsif (-x "/sbin/killall") {
         system("/sbin/killall","-USR1","httpd");
      } elsif (-x "/bin/killall") {
         system("/bin/killall","-USR1","httpd");
      } elsif (-x "/usr/local/bin/killall") {
         system("/usr/local/bin/killall","-USR1","httpd");
      } elsif (-x "/usr/local/sbin/killall") {
         system("/usr/local/sbin/killall","-USR1","httpd");
      }
   }
}

sub gethomedir {
   local $_;
   my($user) = @_;
   my($homedir);
   open(PASSWD,"/etc/passwd");
   while(<PASSWD>) {
      if (/^$user:/) {
         (undef,undef,undef,undef,undef,$homedir,undef) = split(/:/, $_,  7);
         while(-l $homedir) {
                $homedir = readlink($homedir);
         }
         close(PASSWD);
         #$_ = "";
         return($homedir);
      }
   }
   close(PASSWD);


}

sub getdomainowner {
   local $_;
   my($domain) = @_;
   my($user) = '';
   open(USERDOMS,"/etc/userdomains");
   seek(USERDOMS,0,0);
   while(<USERDOMS>) {
      s/\n//g;
      if (/^$domain: (\S+)/) {
         $user = $1;
         last;
      }
   }
   close(USERDOMS);
   return $user;
}

