ljr/ljcom/bin/machine_config.pl

663 lines
18 KiB
Perl
Executable File

#!/usr/bin/perl
#
# <LJDEP>
# lib: Sys::Hostname, Getopt::Long, Fcntl::, POSIX::
# </LJDEP>
use strict;
use Sys::Hostname;
use Getopt::Long;
use Fcntl;
use POSIX qw(tmpnam);
my %DEFAULT = (
'search' => 'lj',
'ns1' => '10.2.0.1',
);
my %MACHINE = (
"stan" => {
'ipco' => '10.0.0.3',
'do_web' => 1,
'web_slave' => 1,
'paid_web_slave' => 1,
},
"kyle" => {
'ipco' => '10.0.0.4',
'do_web' => 1,
'web_slave' => 1,
'web_master' => 1,
},
"wendy" => {
'ipco' => '10.0.0.5',
'do_web' => 1,
'web_slave' => 1,
},
"bebe" => {
'ipco' => '10.0.0.6',
'do_web' => 1,
'web_slave' => 1,
},
"terrance" => {
'ipco' => '10.0.0.7',
'do_web' => 1,
'web_slave' => 1,
},
"phillip" => {
'ipco' => '10.0.0.8',
'do_web' => 1,
'web_slave' => 1,
'paid_web_slave' => 1,
},
"ike" => {
'ipco' => '10.0.0.11',
'do_web' => 1,
'web_slave' => 1,
},
"pip" => {
'ipco' => '10.0.0.12',
'do_web' => 1,
'web_slave' => 1,
},
"kenny" => {
'ipco' => '10.0.0.1',
'db_slave' => 1,
},
"cartman" => {
'ipco' => '10.0.0.2',
'db_master' => 1,
},
"mackey" => {
'ipco' => '10.0.0.9',
'db_slave' => 1,
},
"hat" => {
'ipco' => '10.0.0.10',
'db_slave' => 1,
},
"marklar" => {
'ip' => '216.231.32.128',
'ipco' => '10.0.0.15',
'db_slave' => 1,
},
);
my $machine = hostname();
unless ($machine =~ /^lj-(\w+)(\.livejournal\.com)?$/) {
die "Weird hostname.\n";
}
$machine = $1;
my $DRY = 0;
my $HELP = 0;
exit 1 unless GetOptions(
'dryrun|n' => \$DRY,
'help' => \$HELP,
);
if ($HELP || ! defined $MACHINE{$machine}) {
die("Usage: machine_config.pl [opts]\n\nWhere opts can be:\n".
"--dryrun -n Don't change any config files; just show changes.\n".
"--help -h This message.\n");
}
my $host = { %DEFAULT };
$host->{'name'} = $machine;
foreach (keys %{$MACHINE{$machine}}) {
$host->{$_} = $MACHINE{$machine}->{$_};
}
print "Host information: ($host->{'name'})\n";
foreach (sort keys %{$host}) {
printf " %10s : %s\n", $_, $host->{$_};
}
setup_resolve_conf($host);
setup_hosts($host);
setup_httpd($host) if ($host->{'do_web'});
#####################
sub write_file
{
my $file = shift;
my $new = shift;
my $old;
open (IN, $file);
while (<IN>) {
$old .= $_;
}
close IN;
if ($new ne $old) {
if ($DRY) {
my $tmp = tmpnam();
die "temp file exists!\n" if (-e $tmp);
print "$file needs updating!\n";
open (OUT, ">$tmp");
print OUT $new;
close OUT;
print `diff -u $file $tmp`;
unlink $tmp;
} else {
print "Updating: $file\n";
open (OUT, ">$file");
print OUT $new;
close OUT;
}
}
}
sub setup_resolve_conf
{
my $host = shift;
my $file = "/etc/resolv.conf";
my $new;
if (exists($host->{'search'})) {
$new .= "search\t$host->{'search'}\n";
}
foreach my $ns (qw(ns1)) {
next unless ($host->{$ns});
$new .= "nameserver\t$host->{$ns}\n";
}
write_file($file, $new);
}
# NOTE: this used to do a lot more, before we had DNS running
# internally.
sub setup_hosts
{
my $host = shift;
my $file = "/etc/hosts";
my $new;
$new .= "127.0.0.1\tlocalhost\n";
write_file($file, $new);
}
sub setup_httpd
{
my $host = shift;
my $file = "/usr/local/apache/conf/httpd.conf";
my $new;
$new .= <<"END_CONF";
ServerType standalone
ServerRoot "/usr/local/apache"
PidFile /usr/local/apache/logs/httpd.pid
ScoreBoardFile /usr/local/apache/logs/httpd.scoreboard
Timeout 30
## keep-alive
KeepAlive Off
MaxKeepAliveRequests 200
KeepAliveTimeout 50
MinSpareServers 15
MaxSpareServers 40
StartServers 170
MaxClients 255
MaxRequestsPerChild 0
# Dynamic Shared Object (DSO) Support
# Note: The order is which modules are loaded is important. Don't change
# the order below without expert advice.
LoadModule vhost_alias_module libexec/mod_vhost_alias.so
LoadModule env_module libexec/mod_env.so
LoadModule config_log_module libexec/mod_log_config.so
#LoadModule mime_magic_module libexec/mod_mime_magic.so
LoadModule mime_module libexec/mod_mime.so
#LoadModule negotiation_module libexec/mod_negotiation.so
LoadModule status_module libexec/mod_status.so
LoadModule info_module libexec/mod_info.so
LoadModule includes_module libexec/mod_include.so
LoadModule autoindex_module libexec/mod_autoindex.so
LoadModule dir_module libexec/mod_dir.so
LoadModule cgi_module libexec/mod_cgi.so
#LoadModule asis_module libexec/mod_asis.so
#LoadModule imap_module libexec/mod_imap.so
LoadModule action_module libexec/mod_actions.so
#LoadModule speling_module libexec/mod_speling.so
#LoadModule userdir_module libexec/mod_userdir.so
LoadModule alias_module libexec/mod_alias.so
LoadModule rewrite_module libexec/mod_rewrite.so
LoadModule access_module libexec/mod_access.so
LoadModule auth_module libexec/mod_auth.so
#LoadModule anon_auth_module libexec/mod_auth_anon.so
#LoadModule dbm_auth_module libexec/mod_auth_dbm.so
#LoadModule digest_module libexec/mod_digest.so
#LoadModule proxy_module libexec/libproxy.so
#LoadModule cern_meta_module libexec/mod_cern_meta.so
LoadModule expires_module libexec/mod_expires.so
#LoadModule headers_module libexec/mod_headers.so
LoadModule usertrack_module libexec/mod_usertrack.so
LoadModule unique_id_module libexec/mod_unique_id.so
LoadModule setenvif_module libexec/mod_setenvif.so
LoadModule fastcgi_module libexec/mod_fastcgi.so
#LoadModule php4_module libexec/libphp4.so
# Reconstruction of the complete module list from all available modules
# (static and shared ones) to achieve correct module execution order.
# [WHENEVER YOU CHANGE THE LOADMODULE SECTION ABOVE UPDATE THIS, TOO]
ClearModuleList
AddModule mod_vhost_alias.c
AddModule mod_env.c
AddModule mod_log_config.c
#AddModule mod_mime_magic.c
AddModule mod_mime.c
#AddModule mod_negotiation.c
AddModule mod_status.c
AddModule mod_info.c
AddModule mod_include.c
AddModule mod_autoindex.c
AddModule mod_dir.c
AddModule mod_cgi.c
#AddModule mod_asis.c
#AddModule mod_imap.c
AddModule mod_actions.c
#AddModule mod_speling.c
#AddModule mod_userdir.c
AddModule mod_alias.c
AddModule mod_rewrite.c
AddModule mod_access.c
AddModule mod_auth.c
#AddModule mod_auth_anon.c
#AddModule mod_auth_dbm.c
#AddModule mod_digest.c
#AddModule mod_proxy.c
#AddModule mod_cern_meta.c
AddModule mod_expires.c
#AddModule mod_headers.c
AddModule mod_usertrack.c
AddModule mod_unique_id.c
AddModule mod_so.c
AddModule mod_setenvif.c
AddModule mod_fastcgi.c
#AddModule mod_php4.c
ExtendedStatus On
Port 80
END_CONF
if ($host->{'ip'} && ! $host->{'web_slave'}) {
$new .= "Listen $host->{'ip'}:80\n";
}
$new .= <<"END_CONF";
Listen $host->{'ipco'}:80
User lj
Group lj
ServerAdmin webmaster\@livejournal.com
ServerName lj-$host->{'name'}.livejournal.com
DocumentRoot "/usr/local/apache/htdocs"
<Location /status>
SetHandler server-status
Order deny,allow
Deny from all
Allow from 10.0 66.31.142.7
</Location>
<IfModule mod_dir.c>
DirectoryIndex index.html index.bml
</IfModule>
<Directory "/home/lj">
Options Indexes FollowSymLinks ExecCGI
#for speed, instead of "All"
AllowOverride None
Order allow,deny
Allow from all
</Directory>
SendBufferSize 131072
#######################################
END_CONF
if ($host->{'ip'} && ! $host->{'web_slave'}) {
$new .= "NameVirtualHost $host->{'ip'}:80\n";
}
$new .= <<"END_CONF";
NameVirtualHost $host->{'ipco'}:80
FastCgiSuexec Off
FastCgiConfig -maxClassProcesses 10 -startDelay 1 -idle-timeout 20
END_CONF
if ($host->{'web_master'}) {
$new .= <<"END_CONF";
# site's down message.
Listen 10.0.0.4:81
NameVirtualHost 10.0.0.4:81
<VirtualHost 10.0.0.4:81>
SetEnv LJHOME /home/lj
FastCgiServer /home/lj/sites/sitedown/index.cgi -processes 1
ServerName livejournal.com
ServerAlias *.livejournal.com
DocumentRoot /home/lj/sites/sitedown/
DirectoryIndex index.cgi
ErrorDocument 404 /index.cgi
<Location /index.cgi>
SetHandler fastcgi-script
</Location>
</VirtualHost>
### mrtg.livejournal.com
Listen 10.0.0.4:88
NameVirtualHost 10.0.0.4:88
<VirtualHost 10.0.0.4:88>
SetEnv LJHOME /home/lj
ServerName mrtg.livejournal.com
ServerAlias mrtg.livejournal.com
ServerAdmin webmaster\@livejournal.com
DocumentRoot /home/lj/sites/mrtg/
DirectoryIndex index.cgi
AddHandler cgi-script .cgi
Options -Indexes +ExecCGI
# Putting netsaint's aliases here for now.
Alias /netsaint/ /usr/local/netsaint/share/
ScriptAlias /cgi-bin/netsaint/ /usr/local/netsaint/sbin/
ErrorLog /dev/null
TransferLog /dev/null
</VirtualHost>
END_CONF
}
$new .= " <VirtualHost";
if ($host->{'ip'} && $host->{'web_master'}) {
$new .= " $host->{'ip'}:80";
}
$new .= " $host->{'ipco'}:80>\n";
$new .=" SetEnv LJHOME /home/lj\n";
{
my %fcgi = ('/home/lj/htdocs/users' => 10,
'/home/lj/cgi-bin/log.cgi' => 4,
'/home/lj/cgi-bin/404notfound.cgi' => 1,
'/home/lj/htdocs/customview.cgi' => 4,
'/home/lj/cgi-bin/bmlp.pl' => 7,
'/home/lj/cgi-bin/sbmlp.pl' => 3,
'/home/lj/htdocs/userpic' => 1);
if ($host->{'name'} eq "kenny") {
$fcgi{'/home/lj/htdocs/users'} = 5;
$fcgi{'/home/lj/htdocs/customview.cgi'} = 2;
$fcgi{'/home/lj/cgi-bin/bmlp.pl'} = 4;
$fcgi{'/home/lj/cgi-bin/sbmlp.pl'} = 2;
$fcgi{'/home/lj/cgi-bin/log.cgi'} = 2;
}
foreach my $app (sort keys %fcgi)
{
$new .= " FastCgiServer $app -processes $fcgi{$app} -initial-env LJHOME=/home/lj\n";
}
}
########## rewrite stuff. no interpolation.
$new .= <<'END_CONF';
RewriteEngine on
RewriteLog /home/lj/logs/rewrite.log
RewriteLogLevel 0
RewriteCond %{HTTP_HOST} ^(www\.)?livejournal\.com$ [NC]
RewriteRule ^/~([a-z0-9_]+)(/?.*)$ /users/$1$2 [L,PT,NS]
RewriteCond %{REQUEST_URI} !\.bml
RewriteRule ^/community/([a-z0-9_]+)(/?.*)$ /users/$1$2 [L,PT,NS]
RewriteCond %{HTTP_HOST} ^([a-z0-9_\-]+)\.livejournal\.com$ [NC]
RewriteCond %1 !^www$ [NC]
RewriteRule ^(.+) %{HTTP_HOST}$1 [C]
RewriteRule ^([a-z0-9_\-]+)\.livejournal\.com(.+) /users/$1$2 [L,PT,NS]
RewriteCond %{HTTP_HOST} ^(www\.)?livejournal\.com$ [NC]
RewriteRule ^/confirm/([a-z0-9]+\.[a-z0-9]+) http://www.livejournal.com/register.bml?$1 [L,R]
# if they send any Host header with letters (an IP address or blank
# is okay) then it has to be www.livejournal.com or livejournal.com
# (optional port, too)
RewriteCond %{HTTP_HOST} [a-z] [NC]
RewriteCond %{HTTP_HOST} !^(www\.)?livejournal\.com(:[0-9]+)?$ [NC]
RewriteRule . . [F]
END_CONF
$new .= <<"END_CONF";
AddType text/rdf rdf
AddType text/plain TCL
AddType application/x-httpd-cgi CGI
Options +ExecCGI
ServerName lj-$host->{'name'}.livejournal.com
ServerAlias livejournal.com *.livejournal.com
ServerAdmin webmaster\@livejournal.com
DocumentRoot /home/lj/htdocs/
ScriptAlias /cgi-bin/ /home/lj/cgi-bin/
ErrorDocument 403 /403.html
END_CONF
if ($host->{'paid_web_slave'}) {
$new .= " ErrorDocument 500 /500-paid.html\n";
} else {
$new .= " ErrorDocument 500 /500.html\n";
}
$new .= <<"END_CONF";
ErrorDocument 404 /cgi-bin/404notfound.cgi
# RedirectMatch 301 ^/users/?\$ http://www.livejournal.com/directory.bml
AddType text/bml BML
Action text/bml /cgi-bin/bmlp.pl
AddType text/sbml SBML
Action text/sbml /cgi-bin/sbmlp.pl
DirectoryIndex index.html index.bml
SetEnvIf Request_URI "^/img/" no-log
SetEnvIf Request_URI "^/userpic/" no-log
SetEnvIf Request_URI "^/status" no-log
LogFormat "%h %l %u %t \\"%r\\" %s %b \\"%{Referer}i\\" \\"%{User-Agent}i\\" \\"%{Host}i\\"" ljlog
ErrorLog "|/usr/local/apache/bin/rotatelogs /home/lj/logs/error-$host->{'name'} 3600"
CustomLog "|/usr/local/apache/bin/rotatelogs /home/lj/logs/access-$host->{'name'} 3600" ljlog env=!no-log
<Location /cgi-bin/404notfound.cgi>
SetHandler fastcgi-script
</Location>
<Location /userpic>
SetHandler fastcgi-script
</Location>
<Location /users>
SetHandler fastcgi-script
</Location>
<Location /cgi-bin/log.cgi>
ErrorDocument 500 /500-log.html
SetHandler fastcgi-script
</Location>
<Location /cgi-bin/bmlp.pl>
SetHandler fastcgi-script
</Location>
<Location /cgi-bin/sbmlp.pl>
SetHandler fastcgi-script
</Location>
<Location /customview.cgi>
SetHandler fastcgi-script
</Location>
<Directory /home/lj/htdocs/img>
AllowOverride None
Options None
ExpiresActive on
ExpiresByType image/gif "access plus 1 month"
ExpiresByType image/jpeg "access plus 1 month"
</Directory>
<FilesMatch "~\$">
Deny from all
</FilesMatch>
<Directory /home/lj/htdocs/inc/>
Deny from all
</Directory>
<Directory /home/lj/htdocs/admin/brad/>
AuthUserFile /home/lj/pass-gen.txt
AuthName "Brad only area"
AuthType Basic
require user bradfitz
Options +Indexes
</Directory>
<Directory /home/lj/htdocs/files/>
Options -ExecCGI
</Directory>
</VirtualHost>
# backup image server (load balancer will prefer thttpd/tux/etc first)
Listen $host->{'ipco'}:8081
NameVirtualHost $host->{'ipco'}:8081
<VirtualHost $host->{'ipco'}:8081>
ServerName img.livejournal.com
DocumentRoot /home/lj/htdocs/img
DirectoryIndex index.html
Options -ExecCGI
</VirtualHost>
# AccessFileName: The name of the file to look for in each directory
# for access control information.
#
AccessFileName .htaccess
<Files ~ "^\\.ht">
Order allow,deny
Deny from all
</Files>
<Files ~ "~\$">
Order allow,deny
Deny from all
</Files>
<Files ~ "\\.core\$">
Order allow,deny
Deny from all
</Files>
UseCanonicalName Off
<IfModule mod_mime.c>
TypesConfig /usr/local/apache/conf/mime.types
</IfModule>
## MIME
DefaultType text/plain
<IfModule mod_mime_magic.c>
MIMEMagicFile /usr/local/apache/conf/magic
</IfModule>
HostnameLookups Off
ErrorLog "|/usr/local/apache/bin/rotatelogs /usr/local/apache/logs/error_log 86400"
LogLevel error
CustomLog /dev/null common
ServerSignature On
<IfModule mod_alias.c>
Alias /icons/ "/usr/local/apache/icons/"
<Directory "/usr/local/apache/icons">
Options Indexes
AllowOverride None
Order allow,deny
Allow from all
</Directory>
</IfModule>
<IfModule mod_autoindex.c>
#
# FancyIndexing is whether you want fancy directory indexing or standard
#
IndexOptions FancyIndexing SuppressDescription SuppressColumnSorting FoldersFirst NameWidth=*
#
# AddIcon* directives tell the server which icon to show for different
# files or filename extensions. These are only displayed for
# FancyIndexed directories.
#
AddIconByEncoding (CMP,/icons/compressed.gif) x-compress x-gzip
AddIconByType (TXT,/icons/text.gif) text/*
AddIconByType (IMG,/icons/image2.gif) image/*
AddIconByType (SND,/icons/sound2.gif) audio/*
AddIconByType (VID,/icons/movie.gif) video/*
AddIcon /icons/rpm.gif .rpm
AddIcon /icons/debian.gif .deb
AddIcon /icons/binary.gif .bin .exe
AddIcon /icons/binhex.gif .hqx
AddIcon /icons/tar.gif .tar
AddIcon /icons/world2.gif .wrl .wrl.gz .vrml .vrm .iv
AddIcon /icons/compressed.gif .Z .z .tgz .gz .zip
AddIcon /icons/a.gif .ps .ai .eps
AddIcon /icons/layout.gif .html .shtml .htm .pdf
AddIcon /icons/text.gif .txt
AddIcon /icons/c.gif .c
AddIcon /icons/p.gif .pl .py
AddIcon /icons/f.gif .for
AddIcon /icons/dvi.gif .dvi
AddIcon /icons/uuencoded.gif .uu
AddIcon /icons/script.gif .conf .sh .shar .csh .ksh .tcl
AddIcon /icons/tex.gif .tex
AddIcon /icons/bomb.gif core
AddIcon /icons/back.gif ..
AddIcon /icons/hand.right.gif README
AddIcon /icons/folder.gif ^^DIRECTORY^^
AddIcon /icons/blank.gif ^^BLANKICON^^
#
# DefaultIcon is which icon to show for files which do not have an icon
# explicitly set.
#
DefaultIcon /icons/unknown.gif
ReadmeName README
HeaderName HEADER
IndexIgnore .??* *~ *# HEADER* RCS CVS *,v *,t
</IfModule>
<IfModule mod_mime.c>
AddEncoding x-compress Z
AddEncoding x-gzip gz tgz
AddType application/x-httpd-php .php
AddType application/x-httpd-php-source .phps
AddType application/x-tar .tgz
</IfModule>
<IfModule mod_setenvif.c>
BrowserMatch "Mozilla/2" nokeepalive
BrowserMatch "MSIE 4\.0b2;" nokeepalive downgrade-1.0 force-response-1.0
BrowserMatch "RealPlayer 4\.0" force-response-1.0
BrowserMatch "Java/1\.0" force-response-1.0
BrowserMatch "JDK/1\.0" force-response-1.0
</IfModule>
END_CONF
write_file($file, $new);
}