httpd creates a plc.conf that can work with mod_python or mod_wsgi
[myplc.git] / plc.d / httpd
index af5cf70..f218403 100755 (executable)
@@ -74,6 +74,7 @@ case "$1" in
        # 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
@@ -84,12 +85,14 @@ case "$1" in
            http_port=PLC_${server}_PORT
            https_port=PLC_${server}_SSL_PORT
 
-#          # API should always be accessed via SSL
-#          if [ "$server" = "API" ] ; then
-#              https_port=${!http_port}
-#              http_port=
+           # API should always be accessed via SSL
+           if [ "$server" = "API" ] ; then
+               https_port=${!http_port}
+               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
@@ -122,8 +125,9 @@ Listen ${!http_port}
     Redirect /planetlab https://$PLC_WWW_HOST:$PLC_WWW_SSL_PORT/planetlab
 # 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 https://$PLC_WWW_HOST:$PLC_WWW_SSL_PORT/$PLC_API_PATH
+   Redirect /$plc_api_path_noslash https://$PLC_WWW_HOST:$PLC_WWW_SSL_PORT/$plc_api_path_noslash
 </VirtualHost>
+
 EOF
            fi
 
@@ -140,24 +144,46 @@ EOF
            # this is used to locate the right certificates
            server_lower=$(echo $server | tr 'A-Z' 'a-z')
            cat <<EOF
+
 # create wsgi socket where we have the permission
+<IfModule !mod_python.c>
 WSGISocketPrefix run/wsgi
+</IfModule>
 
 <VirtualHost *:${!https_port}>
 
-   WSGIScriptAlias /$PLC_API_PATH /usr/share/plc_api/wsgi/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
-
    # 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
 
+# we prefer mod_python if available, as first attempts at using mod_wsgi
+# turned out less reliable
+<IfModule mod_python.c>
+   <Location /$plc_api_path_noslash>
+      SetHandler mod_python
+      PythonPath "sys.path + ['/usr/share/plc_api']"
+      PythonHandler apache.ModPython
+   </Location>
+</IfModule>
+
+<IfModule !mod_python.c>
+   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>
+</IfModule>
+
 </VirtualHost>
+
 EOF
+
            fi
        done >$plc_conf
 
@@ -173,7 +199,7 @@ EOF
                cat <<EOF
 # mod_wsgi location
 <Location $PLC_API_PATH>
-    Deny from all
+    $(apache_forbid)
 </Location> 
 EOF
            fi