#!/bin/bash # //////////////////////////////////////////////////////////////////////////////// # //BOCA Online Contest Administrator # // Copyright (C) 2003-2014 by BOCA Development Team (bocasystem@gmail.com) # // # // This program is free software: you can redistribute it and/or modify # // it under the terms of the GNU General Public License as published by # // the Free Software Foundation, either version 3 of the License, or # // (at your option) any later version. # // # // This program is distributed in the hope that it will be useful, # // but WITHOUT ANY WARRANTY; without even the implied warranty of # // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # // GNU General Public License for more details. # // You should have received a copy of the GNU General Public License # // along with this program. If not, see . # //////////////////////////////////////////////////////////////////////////////// # // Last modified 15/aug/2014 by cassio@ime.usp.br for i in id chown chmod cut awk grep cat sed makepasswd ifconfig iptables php touch mkdir update-rc.d su rm mv; do p=`which $i` if [ -x "$p" ]; then echo -n "" else echo command "$i" not found exit 1 fi done bkpserver=0 if [ "$1" == "bkp" ]; then if [ "$2" == "" ]; then echo "Usage $0 bkp " exit 1 else bkpserver=$2 fi fi if [ "`id -u`" != "0" ]; then echo "Must be run as root" exit 1 fi bocadir=/var/www/boca [ -r /etc/boca.conf ] && . /etc/boca.conf privatedir=$bocadir/src/private if [ ! -d $privatedir ]; then echo "Could not find directory $privatedir" exit 1 fi apacheuser= [ -r /etc/icpc/apacheuser ] && apacheuser=`cat /etc/icpc/apacheuser | sed 's/ \t\n//g'` [ "$apacheuser" == "" ] && apacheuser=www-data id -u $apacheuser >/dev/null 2>/dev/null if [ $? != 0 ]; then echo "User $apacheuser not found -- error to set permissions with chown/chmod" apacheuser=root fi postgresuser=postgres id -u $postgresuser >/dev/null 2>/dev/null if [ $? != 0 ]; then echo "User $postgresuser not found -- maybe you use another name (then update this script) or postgres is not installed" exit 1 fi grep -iq "iface.*eth0.*inet.*static" /etc/network/interfaces if [ $? != 0 ]; then echo "*****************************************" echo "IMPORTANT NOTICE ************************" echo "Network interface eth0 has to be set with" echo "a static IP address for this computer to " echo "be a proper server -- DO IT ASAP ********" echo "*****************************************" sleep 2 fi BOCASERVER=localhost if [ -f /etc/icpc/postgresql.version ]; then . /etc/icpc/postgresql.version else POSTGRESV="" if [ ! -f /etc/init.d/postgresql ]; then POSTGRESV="-8.4" fi fi if [ ! -f /etc/init.d/postgresql$POSTGRESV ]; then echo "I did not find the correct version of postgres -- please check it and update this script" exit 1 fi for i in `ls /etc/postgresql/*/main/pg_hba.conf`; do grep -q "host.*bocadb.*bocauser" $i if [ $? != 0 ]; then echo "############" echo "I AM GIVING ACCESS TO THE DATABASE FROM ANY IP (AS LONG AS THE PASSWORD IS OK)" echo "In order to improve security, it is possible to alter the file $i" echo "and perform a finer tune. Nevertheless, if the password of the DB is safe, there is no big threat" echo "For doing that, I am using the line:" echo "" echo -e "echo \"host bocadb bocauser 0/0 md5\" >> $i" echo -e "echo \"host postgres replication 0/0 md5\" >> $i" echo "" echo "==> IDEALLY FOR IMPROVED SECURITY, REPLACE THE FIRST 0/0 ABOVE (IN THAT FILE) WITH THE IP ADDRESS OF THE AUTOJUDGE MACHINE <==" echo "==> IF YOU HAVE MULTIPLE AUTOJUDGE MACHINES, WRITE ONE LINE FOR EACH IP ADDRESS THERE IN THE FILE <==" echo "==> IDEALLY FOR IMPROVED SECURITY, REPLACE THE SECOND 0/0 ABOVE (FOR REPLICATION) WITH THE IP ADDRESS OF THE REPLICATION MACHINE <==" echo "############" echo "host bocadb bocauser 0/0 md5" >> $i echo "host postgres replication 0/0 md5" >> $i else echo "############" echo "IT SEEMS YOU ALREADY HAVE MODIFIED THE FILE $i WITH BOCA'S INFORMATION" echo "I WOULD USE THE LINE:" echo "" echo -e "echo \"host bocadb bocauser 0/0 md5\" >> $i" echo -e "echo \"host postgres replication 0/0 md5\" >> $i" echo "" echo "to give access to the database to other computers, but" echo ">>> I'M NOT DOING IT -- PLEASE CHECK IT <<<" echo "############" fi done for i in `ls /etc/postgresql/*/main/postgresql.conf`; do grep -q "^[^\#]*listen_addresses" $i if [ $? != 0 ]; then echo "listen_addresses = '*'" >> $i fi done for i in `ls /etc/postgresql/*/main/postgresql.conf`; do grep -q "^[^\#]*max_connections" $i if [ $? != 0 ]; then echo "max_connections = 100" >> $i fi done for i in `ls /etc/postgresql/*/main/postgresql.conf`; do grep -q "^[^\#]*maintenance_work_mem" $i if [ $? != 0 ]; then echo "maintenance_work_mem = 64MB" >> $i fi done for i in `ls /etc/postgresql/*/main/postgresql.conf`; do grep -q "^[^\#]*shared_buffers" $i if [ $? != 0 ]; then echo "shared_buffers = 128MB" >> $i fi done for i in `ls /etc/postgresql/*/main/postgresql.conf`; do grep -q "^[^\#]*work_mem" $i if [ $? != 0 ]; then echo "work_mem = 4MB" >> $i fi done for i in `ls /etc/postgresql/*/main/postgresql.conf`; do grep -q "^[^\#]*max_wal_senders" $i if [ $? != 0 ]; then echo "max_wal_senders = 3" >> $i fi done for i in `ls /etc/postgresql/*/main/postgresql.conf`; do grep -q "^[^\#]*wal_level" $i if [ $? != 0 ]; then echo "wal_level = hot_standby" >> $i fi done for i in `ls /etc/postgresql/*/main/postgresql.conf`; do grep -q "^[^\#]*wal_keep_segments" $i if [ $? != 0 ]; then echo "wal_keep_segments = 100" >> $i fi done # for i in `ls /etc/postgresql/*/main/postgresql.conf`; do # grep -q "^[^\#]*archive_mode" $i # if [ $? != 0 ]; then # echo "archive_mode = on" >> $i # fi # done # for i in `ls /etc/postgresql/*/main/postgresql.conf`; do # grep -q "^[^\#]*archive_command" $i # if [ $? != 0 ]; then # echo "archive_command = 'test ! -f /var/www/pg_archive/%f.gz && gzip < %p > /var/www/pg_archive/%f.gz && chmod 640 /var/www/pg_archive/%f.gz''" >> $i # fi # done # mkdir -p /var/www/pg_archive # chown postgres:icpcadmin /var/www/pg_archive # chmod 6770 /var/www/pg_archive echo "You need to define a password to be used in the database." echo "IF THIS IS A BKP SERVER, PLEASE USE THE SAME AS IN THE MAIN SERVER." echo -n "It is possible generate a random one. Want a random password " read -p "[Y/n]? " OK if [ "$OK" = "n" ]; then read -p "Enter DB password: " -s PASS else PASS=`makepasswd --char 10` echo "The DB password is $PASS" fi echo "Keep the DB password safe!" echo "The IP address that is computer is using is" echo "(check using the command ifconfig, if desired. Use this address to configure other computers)" ifconfig eth0 | grep -i "inet addr" PASSK=`makepasswd --chars 20` awk -v boca="$BOCASERVER" -v pass="$PASS" -v passk="$PASSK" '{ if(index($0,"[\"dbpass\"]")>0) \ print "$conf[\"dbpass\"]=\"" pass "\";"; \ else if(index($0,"[\"dbhost\"]")>0) print "$conf[\"dbhost\"]=\"" boca "\";"; \ else if(index($0,"[\"dbsuperpass\"]")>0) print "$conf[\"dbsuperpass\"]=\"" pass "\";"; \ else if(index($0,"[\"key\"]")>0) print "$conf[\"key\"]=\"" passk "\";"; else print $0; }' \ < $privatedir/conf.php > $privatedir/conf.php1 mv -f $privatedir/conf.php1 $privatedir/conf.php echo "Deny from all" > $privatedir/.htaccess chown -R $apacheuser.root $privatedir chmod -R u+rw,g+rw,o-rw $privatedir iptables -F echo "BOCASERVER=0/0" > /etc/icpc/bocaserver.sh grep -iq "^[^\#]*ServerName" /etc/apache2/apache2.conf if [ $? != 0 ]; then echo "ServerName boca" >> /etc/apache2/apache2.conf fi /etc/init.d/apache2 restart mkdir -p /var/run/postgresql chown $postgresuser.$postgresuser /var/run/postgresql /etc/init.d/postgresql$POSTGRESV restart update-rc.d apache2 defaults update-rc.d postgresql$POSTGRESV defaults rm -f /tmp/.boca.tmp su - $postgresuser -c "echo select contestnumber from contesttable | psql -d bocadb | grep contestnumber >/tmp/.boca.tmp 2>/tmp/.boca.tmp" su - $postgresuser -c "echo drop user bocauser | psql -d template1 >/dev/null 2>/dev/null" su - $postgresuser -c "echo create user bocauser createdb password \'$PASS\' | psql -d template1" su - $postgresuser -c "echo alter user bocauser createdb password \'$PASS\' | psql -d template1" OK=y grep -qi contestnumber /tmp/.boca.tmp if [ $? == 0 ]; then OK=x while [ "$OK" != "y" -a "$OK" != "n" ]; do echo "====== An old database seems to exist. I can keep it, but it might not work with the version" echo -n "of BOCA being installed. May I erase all the content of the bocadb database [y/n]" OK=x read -p "?" OK done fi if [ "$OK" == "y" ]; then cd $bocadir/src php private/createdb.php cd - >/dev/null 2>/dev/null echo "database renewed. Data on bocadb has been lost" else echo "*** database not erased. Check if BOCA is compatible. You can always erase the database and" echo "*** fix the problem by running (as root) cd $bocadir/src; php private/createdb.php" echo "*** still, all data regarding BOCA in the database will be lost" fi touch /etc/icpc/.isserver if [ "$bkpserver" != "0" ]; then echo "Connecting to main server at $bkpserver to initialize the database -- pay attention in the following messages" for i in `ls -d /var/lib/postgresql/*/main`; do echo "standby_mode = \'on\'" > $i/recovery.conf chmod 600 $i/recovery.conf echo "primary_conninfo = \'host=$bkpserver port=5432 user=postgres password=$PASS\'" >> $i/recovery.conf chown $postgresuser $i/recovery.conf su - $postgresuser -c "pg_basebackup -D $i -w -R --xlog-method=stream --dbname=\'host=$bkpserver user=postgres port=5432 password=$PASS\'" done echo "=-=-=-= CHECK IF THE PREVIOUS MESSAGES HAVE NO ERRORS =-=-=-=" fi echo "configuration finished. Boca should be available at http://localhost/boca/" echo "reboot might not be required, but is advised."