Category: Console Admin
Author/Contact Info Graciliano M. P.
Description: This will configure the server (tested on RedHat) for a new site. It create the domain, or cname, on named, the directory and log dir for the site, enable it on apache (httpd.conf), and restart named and apache. To run just follow the prompt.
#!/usr/local/bin/perl

##################################
# ADDSITE 1.5                    #
##################################
# By: Graciliano Monteiro Passos #
# E-mail: gm@...spam_sux.......  #
# URL: www.virtuasites.com.br    #
#                                #
# Created 09/06/2000 14:51h      #
#                                #
# Copyright 2002 Virtua Sites.   #
# All rights reserved.           #
##################################

########
# VARS #
########

$ip_srv = "200.168.x.x" ;
$ns_srv = domain.com' ;

$httpd_conf = '/etc/httpd/conf/httpd.conf' ;
$httpd_dir = '/home/httpd' ;
$httpd_html_dir = "$httpd_dir/html" ;
$httpd_log_dir = "$httpd_dir/logs" ;

$named_conf = '/etc/named.conf' ;
$named_dir = '/var/named' ;

########
# INIT #
########

  $|=1;

  print "ADD SITE 1.5\n\n";
  
  print "Nome do site: ";
  chop($name = <STDIN>);
  
  print "Domínio do site: ";
  chop($domain = <STDIN>);
  
  $domain = "\L$domain\E" ;
  if ( $name !~ /\w/ ) { $name = $domain ;}
  
  if ( $domain !~ /^[\w-\.]+\.[\w]+$/i ) {
    print "** Erro: domínio inválido! <$domain>\n";
    exit ;
  }
  
  my ($domain , $domain_cname , $domain_full) = &domain_path($domain) 
+;

  $domain_dir = $domain ;
  if ( $domain_cname !~ /^www$/i ) { $domain_dir = $domain_full ;}


  
  print "\nDomain: $domain\n";
  print "Cname: $domain_cname\n";
  print "OK? " ;

  my ($dm_is_ok,$dm_is_q) ;

  chop($dm_is_q = <STDIN>);
  $dm_is_q =~ s/\s//gs ;
  if ($dm_is_q =~ /^(1|y\w*|s\w*|ok|)$/si) { $dm_is_ok = 1 ;}
  
  while (! $dm_is_ok) {
    my ($dm,$dm_cname,$dm_full) ;
    
    my $def = (split(/\./,$domain_cname))[-1] . '.' . $domain ;
    
    print "\nDomain ($def)? " ;
    chop($dm = <STDIN>); $dm =~ s/[^\w\.]//gs ;
    if ($dm eq '') { $dm = $def ;}
    
    $def = 'www' ;
    
    print "Cname ($def)? " ;
    chop($dm_cname = <STDIN>); $dm_cname =~ s/[^\w\.]//gs ;
    if ($dm_cname eq '') { $dm_cname = $def ;}
    
    
    $dm_full = "$dm_cname.$dm" ;
    print "Full Domain: $dm_full? " ;

    chop($dm_is_q = <STDIN>) ;
    $dm_is_q =~ s/\s//gs ;
    if ($dm_is_q =~ /^(1|y\w*|s\w*|ok)$/si) {
      $dm_is_ok = 1 ;
      $domain = $dm ;
      $domain_cname = $dm_cname ;
      $domain_full = "$domain_cname.$domain" ;
    }

  }
  
  print "\n ($domain_cname , $domain , $domain_full)\n" ;
  
  ######
  # DO #
  ######
  
  &make_dirs($domain_dir) ;
  &add_site($domain_dir,$domain_full,$name) ;
  &add_domain($domain,$domain_cname,$domain_full);
  &add_httpd ($domain,$domain_full,$domain_dir) ;
  
  &kill_hup ;
  
  print "\nSite adicionado!\n";
  print "      Nome: $name\n";
  print "   Domínio: $domain\n";


exit;

##############
# ADD_DOMAIN #
##############

sub add_domain {
my ($domain , $domain_cname , $domain_full) = @_ ;

  open (LOG,"$named_conf") ;
  my $named_log = join '' , <LOG> ;
  close (LOG) ;
  
  $named_log =~ s/\n[\r \t]*#[^\n]*/\n/gs ;
  
  if ( $named_log !~ /zone\s+["']$domain["']\s*{/i ) {
    open (LOG,">>$named_conf");
    print LOG "zone \"$domain\"\{\n";
    print LOG "        type master;\n";
    print LOG "        file \"named.$domain\";\n";
    print LOG "\};\n";
    close (LOG) ;
    
    print "  ** $named_conf: added zone\n" ;
  }
  
  my $named_var_file = "$named_dir/named.$domain" ;
  
  if (-e $named_var_file) {
    open (LOG,"$named_var_file") ;
    my $named_log = join '' , <LOG> ;
    close (LOG) ;
    
    $named_log =~ s/\n[\r \t]*#[^\n]*/\n/gs ;
          
    if ( $named_log !~ /$domain_cname\s+IN\s+CNAME\s+$domain./is ) {
      open (LOG,">>$named_var_file");
      if ( $named_log !~ /\r?\n$/s ) { print "\n" ;}
      print LOG "$domain_cname          IN      CNAME   $domain.\n";
      close (LOG) ;
      print "  ** $named_var_file: CNAME $domain_cname\n" ;
    }
  
  }
  else {
    my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localti
+me(time);
    $year += 1900 ;
    $mon++ ;
    if ($mon < 10) { $mon = "0$mon" ;}
    if ($mday < 10) { $mday = "0$mday" ;}
    my $id = '01' ;
    
    open (LOG,">$named_var_file");
    print LOG "\@           IN      SOA     $domain.        root\@$dom
+ain. (\n";
    print LOG "                     $year$mon$mday$id ; serial\n";
    print LOG "                     600 ; refresh\n";
    print LOG "                     450 ; retry\n";
    print LOG "                     37800 ; expire\n";
    print LOG "                     5700 ; default_ttl\n";
    print LOG "                     )\n";
    print LOG "\@           IN      NS      ns.$ns_srv.\n";
    print LOG "\@           IN      NS      ns1.$ns_srv.\n";
    print LOG "\@           IN      NS      ns2.$ns_srv.\n";
    print LOG "\@           IN      A       $ip_srv\n";
    print LOG "\@           IN      MX      10      mail.$domain.\n";
    print LOG "ftp          IN      CNAME   $domain.\n";
    print LOG "irc          IN      CNAME   $domain.\n";
    print LOG "pop          IN      CNAME   $domain.\n";
    print LOG "pop3         IN      CNAME   $domain.\n";
    print LOG "smtp         IN      CNAME   $domain.\n";
    print LOG "mail         IN      CNAME   $domain.\n";
    print LOG "www          IN      CNAME   $domain.\n";
    if ( $domain_cname !~ /^www$/i ) {
      print LOG "$domain_cname          IN      CNAME   $domain.\n";
    }
    close (LOG) ;
    print "  ** $named_var_file: created!\n" ;
  }

}

#############
# ADD_HTTPD #
#############

sub add_httpd {
  my ( $domain , $domain_full , $domain_dir) = @_ ;
  
  open (LOG,"$httpd_conf") ;
  my $httpd_log = join '' , <LOG> ;
  close (LOG) ;
  
  $httpd_log =~ s/\n[\r \t]*#[^\n]*/\n/gs ;
  
  if ( $httpd_log !~ /<VirtualHost\s+$domain_full>/is ) {
    open (LOG,">>$httpd_conf");
    print LOG "\n\n<VirtualHost $domain_full> \n";
    print LOG "        ServerName $domain_full\n";
    print LOG "        ServerAdmin webmaster\@$domain\n";
    print LOG "        NameVirtualHost $ip_srv\n";
    print LOG "        ServerName $domain_full\n";
    print LOG "        DocumentRoot $httpd_html_dir/$domain_dir/\n";
    print LOG "        ErrorLog $httpd_log_dir/$domain_dir/error.log\n
+";
    print LOG "        RefererLog $httpd_log_dir/$domain_dir/referer.l
+og\n";
    print LOG "        TransferLog $httpd_log_dir/$domain_dir/transfer
+.log\n";
    print LOG "        AgentLog $httpd_log_dir/$domain_dir/agent.log\n
+";
    print LOG "        ScriptAlias /cgi-bin $httpd_html_dir/$domain_di
+r/cgi-bin/\n";
    print LOG "        Options ExecCgi\n";
    print LOG "</VirtualHost>\n";
    close (LOG) ;
    print "  ** $httpd_conf: added <VirtualHost $domain_full>!\n" ;
  }

}

############
# ADD_SITE #
############

sub add_site {
  my ( $domain_dir , $domain_full , $name ) = @_ ;
  
  open (LOG,"$httpd_html_dir/$ns_srv/index.htm");
  my @index_log = <LOG> ;
  close (LOG) ;
  
  open (LOG,">$httpd_html_dir/$ns_srv/index.htm");
    foreach my $index_log_i ( @index_log  ) {
      if ($index_log_i =~ "<!-- SITES END -->") {
      print LOG "     <a href=\"http://$domain_full\">$name </a><BR><B
+R>\n";
      }
      print LOG "$index_log_i";
    }
  close (LOG) ;
  print "  ** $httpd_html_dir/$ns_srv/index.htm: Link added!\n" ;
  
  my $index_fl = "$httpd_html_dir/$domain_dir/index.htm" ;
  
  if (! -e $index_fl) {
    open (LOG,">$index_fl");
    print LOG "<html>\n";
    print LOG "<head>\n";
    print LOG "<title>$name</title>\n";
    print LOG "</head>\n";
    print LOG "<body>\n";
    print LOG "<p align=\"center\">&nbsp;</p>\n";
    print LOG "<p align=\"center\"><font face=\"Arial\" size=\"6\">$na
+me</font></p>\n";
    print LOG "</body>\n";
    print LOG "</html>\n";
    close (LOG) ;
    print "  ** $index_fl: index created!\n" ;
  }

}

############
# KILL_HUP #
############

sub kill_hup {
  open (CMD,"|killall -HUP named"); close (CMD) ;
  open (CMD,"|killall -HUP httpd"); close (CMD) ;
  print "  ** HUP!\n" ;
}

#############
# MAKE_DIRS #
#############

sub make_dirs {
  my ( $domain_dir ) = @_ ;
  $dir_path = "$httpd_html_dir/$domain_dir" ;
  $log_path = "$httpd_log_dir/$domain_dir" ;
  mkdir($dir_path , 0755) if (! -e $dir_path) ;
  mkdir($log_path , 0755) if (! -e $log_path) ;
  print "  ** $dir_path: dir created!\n" ;
  print "  ** $log_path: dir created!\n" ;
}

###############
# DOMAIN_PATH #
###############

sub domain_path {
  my ( $domain ) = @_ ;
  
  $domain = "\L$domain\E" ;
  $domain =~ s/^\s+//g ;
  $domain =~ s/\s+$//g ;

  my $countrys = ' af al dz as ad ao ai aq ag ar am aw au at az bs bh 
+bd bb by be bz bj bm bt bo ba bw bv br io bn bg bf bi kh cm ca cv ky 
+cf td cl cn cx cc co km cg cd ck cr ci hr cu cy cz dk dj dm do tp ec 
+eg sv gq er ee et fk fo fj fi fr fx gf pf tf ga gm ge de gh gi gr gl 
+gd gp gu gt gn gw gy ht hm va hn hk hu is in id ir iq ie il it jm jp 
+jo kz ke ki kp kr kw kg la lv lb ls lr ly li lt lu mo mk mg mw my mv 
+ml mt mh mq mr mu yt mx fm md mc mn ms ma mz mm na nr np nl an nc nz 
+ni ne ng nu nf mp no om pk pw pa pg py pe ph pn pl pt pr qa re ro ru 
+rw kn lc vc ws sm st sa sn sc sl sg sk si sb so za gs es lk sh pm sd 
+sr sj sz se ch sy tw tj tz th tg tk to tt tn tr tm tc tv ug uk ae gb 
+us um uy uz vu ve vn vg vi wf eh ye yu zm zw ' ;
  my $sufixs = ' com net org mil gov edu co ' ;

  my @subs = split(/\./ , $domain) ;
  
  my ($domain_base,$domain_cname) ;

  if ( $#subs < 1) {
    $domain_base = $domain ;
    $domain_cname = "www" ;
  }
  elsif ( $countrys =~ / $subs[-1] /i ) {
    if ( $sufixs =~ / $subs[-2] / ) {
      $domain_base = join (".", @subs[($#subs-2)..$#subs]) ;
      $domain_cname = join (".", @subs[0..($#subs-3)]) ;
      if (@subs[0] !~ /^www$/i && $#subs <= 2) { $domain_cname = "www"
+ ;}
    }
    else {
      $domain_base = join (".", @subs[($#subs-1)..$#subs]) ;
      $domain_cname = join (".", @subs[0..($#subs-2)]) ;    
      if ( @subs[0] !~ /^www$/i && $#subs <= 1 ) { $domain_cname = "ww
+w" ;}
    }
  }
  else {
    $domain_base = join (".", @subs[($#subs-1)..$#subs]) ;
    $domain_cname = join (".", @subs[0..($#subs-2)]) ;    
    if ( @subs[0] !~ /^www$/i && $#subs <= 1 ) { $domain_cname = "www"
+ ;}
  }
  
  my $domain_full = "$domain_cname.$domain_base" ;

  if ( wantarray ) { return( $domain_base , $domain_cname , $domain_fu
+ll ) ;}
  else { return( $domain_full ) ;}
}

#######
# END #
#######

# Send your feedback!
#
# "The creativity is the expression of the liberty".