#!/bin/bash
#
-# priority: 700
+# priority: 600
#
# Configure Apache web server
#
# Mark Huang <mlhuang@cs.princeton.edu>
# Copyright (C) 2006 The Trustees of Princeton University
#
-# $Id: httpd,v 1.10 2007/02/05 19:56:26 mlhuang Exp $
-#
# Source function library and configuration
. /etc/plc.d/functions
ssl_conf=/etc/httpd/conf.d/ssl.conf
plc_conf=/etc/httpd/conf.d/plc.conf
+function disable_file () {
+ file=$1; shift
+ [ -f $file ] && mv -f $file $file.disabled
+}
+function enable_file () {
+ file=$1; shift
+ [ ! -f $file ] && mv -f $file.disabled $file
+}
+
case "$1" in
start)
if [ "$PLC_API_ENABLED" != "1" -a \
MESSAGE=$"Starting web server"
dialog "$MESSAGE"
- # Set the document root to /data/var/www/html (static files
- # only, no Drupal or admin pages) if the web server should not
- # run on this machine.
+ # set document root - not really useful on fedora but just in case
+ sed -i -e "s@^DocumentRoot.*@DocumentRoot \"$DocumentRoot\"@" $httpd_conf
+ # whether WWW is enabled or not :
if [ "$PLC_WWW_ENABLED" != "1" ] ; then
- sed -i -e "s@^DocumentRoot.*@DocumentRoot \"/data$DocumentRoot\"@" $httpd_conf
+ # avoid hitting drupal, that would try to connect to the db and create noise
+ disable_file $DocumentRoot/index.php
else
- sed -i -e "s@^DocumentRoot.*@DocumentRoot \"$DocumentRoot\"@" $httpd_conf
+ enable_file $DocumentRoot/index.php
fi
# Set the default include path
- include_path=".:$DocumentRoot/planetlab/includes:$DocumentRoot/generated:/etc/planetlab/php:/usr/share/plc_api/php"
+ include_path=".:$DocumentRoot/planetlab/includes:$DocumentRoot/plekit/php:$DocumentRoot/generated:/etc/planetlab/php:/usr/share/plc_api/php"
sed -i -e "s@[;]*include_path = \"\.:.*\"@include_path = \"$include_path\"@" $php_ini
+ # Set open_basedir so as to avoid leaks
+ open_basedir="$DocumentRoot:/etc/planetlab/php:/usr/share/plc_api/php:/var/log/myslice:/var/tmp/bootmedium:/var/log/bm:/tmp"
+ sed -i -e "s@[;]*open_basedir =.*@open_basedir = \"$open_basedir\"@" $php_ini
+
+ # for php-5.3 under fedora12, otherwise issues tons of warning messages
+ # Set timezone in php.ini if not already there
+ if grep '^;date.timezone' $php_ini >& /dev/null; then
+ dialog 'Setting PHP timezone to GMT'
+ sed -i -e 's,^;date.timezone.*,date.timezone = GMT,' $php_ini
+ fi
+
+ if grep '^short_open_tag = Off' $php_ini >& /dev/null; then
+ sed -i -e 's,^short_open_tag = Off,short_open_tag = On,' $php_ini
+ fi
+
# Disable default Listen directive
sed -i -e '/^Listen/d' $httpd_conf
+ plc_api_path_noslash=$(echo $PLC_API_PATH | sed -e s,/,,g)
# Set the port numbers
for server in WWW API BOOT ; do
enabled=PLC_${server}_ENABLED
http_port=
fi
+ echo "# DBG server=$server hostname=${!hostname} http_port=${!http_port} https_port=${!https_port}"
+
# Check if we are already listening on these ports
skip_http=0
skip_https=0
if [ $skip_http -eq 0 -a -n "${!http_port}" ] ; then
cat <<EOF
Listen ${!http_port}
-# Make sure that the admin web pages and API are always accessed via SSL
<VirtualHost *:${!http_port}>
+ # Make sure that the admin web pages are always accessed via SSL
Redirect /db https://$PLC_WWW_HOST:$PLC_WWW_SSL_PORT/db
Redirect /planetlab https://$PLC_WWW_HOST:$PLC_WWW_SSL_PORT/planetlab
- Redirect /$PLC_API_PATH https://$PLC_API_HOST:$PLC_API_PORT/$PLC_API_PATH
+# as a matter of fact most xmlrpc clients won't follow the redirection
+# so this is mostly rethorical, but just in case...
+ Redirect /$plc_api_path_noslash https://$PLC_WWW_HOST:$PLC_WWW_SSL_PORT/$plc_api_path_noslash
</VirtualHost>
+
EOF
fi
-e "s/^Listen .*/Listen ${!https_port}/" \
-e "s/<VirtualHost _default_:.*>/<VirtualHost _default_:${!https_port}>/" \
$ssl_conf
+ # this is used to locate the right certificates
+ server_lower=$(echo $server | tr 'A-Z' 'a-z')
+
+ # which one is used is currently configured in myplc.spec,
+ # with mod_python preferred
+ if rpm -q mod_python >& /dev/null ; then
+ configure_for_mod_python=true
+ elif rpm -q mod_wsgi >& /dev/null ; then
+ configure_for_mod_wsgi=true
+ else
+ echo "Requires mod_python or mod_wsgi.... exiting"
+ exit 1
+ fi
+
+ # It would be tempting to use <IfModule> here
+ # but early tests showed this could be tricky/fragile
+ # So let's hard-wire it for one module
+ # A lot of trial-and -error was involved in getting this that way...
+
+ if [ -n "$configure_for_mod_python" ] ; then
+#################### for mod_python
+ cat <<EOF
+# mod_python location
+<Location /PLCAPI/>
+ SetHandler mod_python
+ PythonPath "sys.path + ['/usr/share/plc_api']"
+ PythonHandler apache.ModPython
+</Location>
+EOF
+
+ elif [ -n "$configure_for_mod_wsgi" ] ; then
+#################### for mod_wsgi
+ cat <<EOF
+# create wsgi socket where we have the permission
+WSGISocketPrefix run/wsgi
+
+<VirtualHost *:${!https_port}>
+
+ # SSL
+ SSLEngine On
+ SSLCertificateFile /etc/planetlab/${server_lower}_ssl.crt
+ SSLCertificateKeyFile /etc/planetlab/${server_lower}_ssl.key
+ SSLCertificateChainFile /etc/planetlab/${server_lower}_ca_ssl.crt
+
+ WSGIScriptAlias /$plc_api_path_noslash /usr/share/plc_api/apache/plc.wsgi
+# xxx would be cool to be able to tweak this through config
+ WSGIDaemonProcess plcapi-wsgi-ssl user=apache group=apache processes=1 threads=25
+ WSGIProcessGroup plcapi-wsgi-ssl
+
+ <Directory "/usr/share/plc_api/apache">
+ Options +ExecCGI
+ $(apache_allow)
+ </Directory>
+
+</VirtualHost>
+EOF
+ fi
fi
done >$plc_conf
# Set custom Apache directives
(
- if [ "$PLC_API_ENABLED" = "1" ] ; then
- cat <<EOF
-<Location $PLC_API_PATH>
- SetHandler mod_python
- PythonPath "sys.path + ['/usr/share/plc_api']"
- PythonHandler ModPython
-</Location>
+ # could be restricted to boot boxes but harmless..
+ cat <<EOF
+AddType application/octet-stream .iso
+AddType application/octet-stream .usb
EOF
- else
+ # make sure /PLCAPI can't get accessed if API not enabled here
+ if [ "$PLC_API_ENABLED" != "1" ] ; then
cat <<EOF
+# mod_wsgi location
<Location $PLC_API_PATH>
- Deny from all
-</Location>
+ $(apache_forbid)
+</Location>
EOF
fi
+ # redirect www requests if not on the right server
if [ "$PLC_WWW_ENABLED" != "1" ] ; then
cat <<EOF
-<Location /db>
- Deny from all
-</Location>
-<Location /planetlab>
- Deny from all
-</Location>
-Redirect /index.php http://$PLC_WWW_HOST:$PLC_WWW_PORT/
+Redirect /index.html http://$PLC_WWW_HOST:$PLC_WWW_PORT/
EOF
fi
) >>$plc_conf
?>
EOF
+ ## patch php.ini
+ # memory limit
+ sed -i -e 's,^memory_limit = 32M *;,memory_limit = 80M ; patch myplc -- ,' $php_ini
+ # log_errors : is On by default
+ # error_log
+ if ! grep '^error_log *=' $php_ini > /dev/null ; then
+ echo 'error_log = /var/log/php.log' >> $php_ini
+ touch /var/log/php.log
+ chmod 666 /var/log/php.log
+ fi
+
plc_daemon httpd
check