#!/usr/bin/perl use Switch; use File::Copy; # Configuration ################### $host_path = "/server/hosts"; $host_conf = "/server/httpd/conf/hosts.conf"; $owner = "apache"; $httpd_path = "/server/httpd/bin"; $httpd_opt = "-DDAV -DSecurity"; # Main Program ################### sub header{ if(unixcompatible()){ system('clear'); }else{ system('cls'); } print "#####################################\n"; print "# Virtual Host Manager #\n"; print "# By Jorge Schrauwen 2006 #\n"; print "#####################################\n"; } sub unixcompatible{ $UNIX = `perl -v`; if($UNIX=~m/(darwin|(li|u)n(i|u)x|\s*bsd\s)/i){ return 1; }else{ return 0; } } sub main{ print "1) Create Virtual Host\n"; print "2) Remove Virtual Host\n"; print "3) Change Virtual Host\n"; print "4) List Virtual Hosts\n\n"; print "0) Exit\n\n"; print "Select: "; chomp($opt = ); switch ($opt){ case 1 { mkhost(); } case 2 { rmhost(); } case 3 { chhost(); } case 4 { listhost(); } case 0 { } else { main(); } } } sub mkhost{ header(); # get data print "Create Host: "; chomp($fqdn = ); print "DAV Username: "; chomp($davuser = ); print "DAV Password: "; chomp($davpass = ); header(); if(!-d "$host_path/$fqdn"){ print "Creating directories...\n"; mkdir("$host_path/$fqdn", 0755); mkdir("$host_path/$fqdn/_server", 0755); mkdir("$host_path/$fqdn/_server/logs", 0755); mkdir("$host_path/$fqdn/_server/ssl", 0755); mkdir("$host_path/$fqdn/_server/tmp", 0755); #for php temp directory mkdir("$host_path/$fqdn/_server/sessions", 0755); #for php sessions directory mkdir("$host_path/$fqdn/httpdocs", 0755); #mkdir("$host_path/$fqdn/httpsdocs", 0755); mkdir("$host_path/$fqdn/cgi-bin", 0755); print "Creating users.db...\n"; htpasswd('add', $davuser, $davpass, "$host_path/$fqdn/_server/users.db"); print "Updating configuration files...\n"; configure(1, 1, 1, "$host_path/$fqdn/_server/host_settings.conf"); updatehost(1, $fqdn); if(unixcompatible()){ system("sudo chown -R $owner:$owner $host_path/$fqdn"); system("sudo chmod -R 0775 $host_path/$fqdn"); } print "Restarting httpd server...\n"; httpdmanage("restart"); $msg = "Successfully created $fqdn!\n\n"; }else{ $msg = "$fqdn allready exists!\n\n"; } header(); print $msg; main(); } sub rmhost{ header(); print "Remove Host: "; chomp($fqdn = ); if(-d "$host_path/$fqdn"){ print "Remove $fqdn and all its files? (y/N): "; chomp($confirm = ); if(lc($confirm) eq "y"){ $confirm = 1; }else{ $confirm = 0; } if($confirm){ print "Updating configuration files...\n"; updatehost(0, $fqdn); print "Restarting httpd server...\n"; httpdmanage("restart"); print "Removing directories...\n"; rmdir_r("$host_path/$fqdn"); $msg = "Successfully removed $fqdn!\n\n"; }else{ $msg = "$fqdn was not removed!\n\n"; } }else{ $msg = "$fqdn doesn't exists!\n\n"; } header(); print $msg; main(); } sub chhost{ header(); print "Host Domain: "; chomp($fqdn = ); if(-d "$host_path/$fqdn"){ chhost_menu($fqdn); }else{ header(); print "$fqdn doesn't exists!\n\n"; main(); } } sub chhost_menu{ $fqdn=$_[0]; header(); print "1) Update Configuration\n"; print "2) Manage DAV Users\n\n"; print "0) Back\n\n"; print "Select: "; chomp($opt = ); switch ($opt){ case 1 { chhost_config($fqdn); } case 2 { chhost_dav_menu($fqdn); } case 0 { header(); main(); } else { chhost_menu($fqdn); } } } sub chhost_config{ $fqdn=$_[0]; header(); # get data print "Enable PHP (Y/n): "; chomp($php = ); if(lc($php) eq "n"){ $php = 0; }else{ $php = 1; } print "Enable Perl (Y/n): "; chomp($perl = ); if(lc($perl) eq "n"){ $perl = 0; }else{ $perl = 1; } print "Enable SSI (Y/n): "; chomp($ssi = ); if(lc($ssi) eq "n"){ $ssi = 0; }else{ $ssi = 1; } header(); print "Updating configuration files...\n"; $msg = configure($php, $perl, $ssi, "$host_path/$fqdn/_server/host_settings.conf"); print "Restarting httpd server...\n"; httpdmanage("restart"); header(); if($msg == 1){ print "$fqdn has been updated!\n\n"; }else{ print "$msg\n\n"; } main(); } sub chhost_dav_menu{ $fqdn=$_[0]; header(); print "1) Add/Update User\n"; print "2) Remove User\n"; print "3) List Users\n\n"; print "0) Back\n\n"; print "Select: "; chomp($opt = ); switch ($opt){ case 1 { dav_add($fqdn); } case 2 { dav_remove($fqdn); } case 3 { dav_list($fqdn); } case 0 { chhost_menu($fqdn); } else { chhost_dav_menu($fqdn); } } } sub dav_add{ $fqdn=$_[0]; header(); print "Username: "; chomp($davuser = ); print "Password: "; chomp($davpass = ); htpasswd('add', $davuser, $davpass, "$host_path/$fqdn/_server/users.db"); chhost_dav_menu($fqdn); } sub dav_remove{ $fqdn=$_[0]; header(); print "Username: "; chomp($davuser = ); htpasswd('rm', $davuser, '', "$host_path/$fqdn/_server/users.db"); chhost_dav_menu($fqdn); } sub dav_list{ $fqdn=$_[0]; header(); open (USERFILE, "$host_path/$fqdn/_server/users.db"); $i = 0; while ($uline = ) { $i++; @user = split(':', $uline); print "$i. @user[0]\n"; } close(USERFILE); print "\nManage DAV Users>"; ; chhost_dav_menu($fqdn); } sub listhost{ $fqdn=$_[0]; header(); opendir(HDIR, $host_path); $i = 0; while (my $file = readdir(HDIR)) { if(($file ne '.') and ($file ne '..')){ if(-d "$host_path/$file"){ $i++; print "$i. $file\n"; } } } closedir(HDIR); print "\nManage Hosts>"; ; header(); main(); } sub configure{ # get variables $php=$_[0]; $perl=$_[1]; $ssi=$_[2]; $conf_path=$_[3]; # gen host_settings open(HCONF,">$conf_path") or return 'Failed to open configuration file!'; print HCONF "# Host Configuration\n"; if($ssi){ print HCONF "Use EnableSSI\n"; } if($perl){ print HCONF "Use EnableCGI\n"; } if($php){ print HCONF "Use EnablePHP\n"; } close(HCONF); } sub updatehost{ # get variables $action=$_[0]; $host=$_[1]; # edit hosts.conf open (HOSTFILE, $host_conf) or die('Failed to open host file!'); open (HOSTFILE_NEW,">".$host_conf."_new"); if($action){ while ($hline = ) { print HOSTFILE_NEW $hline; } print HOSTFILE_NEW "Use VirtualHost $host\n"; }else{ while ($hline = ) { @chunks = split(' ', $hline); if(lc(@chunks[0]) ne 'use'){ print HOSTFILE_NEW $hline; }else{ $chost = lc(@chunks[2]); chomp($chost); if($chost ne $host){ print HOSTFILE_NEW $hline; } } } } close(HOSTFILE); close(HOSTFILE_NEW); unlink("$host_conf"); move($host_conf."_new", "$host_conf"); } sub htpasswd{ # get variables $action=lc($_[0]); $user=$_[1]; $pass=$_[2]; $htpassfile=$_[3]; # create users.db $htpasswdcmd = "$httpd_path/htpasswd -"; if(!-e $htpassfile){ $htpasswdcmd .= "c"; } if($action eq 'add'){ $htpasswdcmd .= "sb ".$htpassfile." ".$user." ".$pass; } if($action eq 'rm'){ $htpasswdcmd .= "D ".$htpassfile." ".$user; } system($htpasswdcmd); } sub httpdmanage{ if(-e "$httpd_path/apachectl"){ $httpdcmd = "sudo $httpd_path/apachectl $httpd_opt -k "; }else{ $httpdcmd = "$httpd_path/httpd $httpd_opt -k "; } $httpdcmd .= $_[0]; system($httpdcmd); } sub rmdir_r{ my $dir = shift; local *DIR; opendir DIR, $dir or die "opendir $dir: $!"; my $found = 0; while ($_ = readdir DIR) { next if /^\.{1,2}$/; my $path = "$dir/$_"; unlink $path if -f $path; rmdir_r($path) if -d $path; } closedir DIR; rmdir $dir or print "error - $!"; } # init ################### header(); main();