added --full option to vacuumdb
[myplc.git] / plc.d / ssl
1 #!/bin/bash
2 #
3 # priority: 400
4 #
5 # Generate SSL certificates
6 #
7 # Mark Huang <mlhuang@cs.princeton.edu>
8 # Copyright (C) 2006 The Trustees of Princeton University
9 #
10 # $Id$
11 #
12
13 # Source function library and configuration
14 . /etc/plc.d/functions
15 . /etc/planetlab/plc_config
16
17 # Be verbose
18 set -x
19
20 # Print the CNAME of an SSL certificate
21 ssl_cname ()
22 {
23     openssl x509 -noout -in $1 -subject | \
24         sed -n -e 's@.*/CN=\([^/]*\).*@\1@p' | \
25         lower
26 }
27
28 # Verify a certificate. If invalid, generate a new self-signed
29 # certificate.
30 verify_or_generate_certificate() {
31     crt=$1
32     key=$2
33     ca=$3
34     cname=$(lower $4)
35
36     # If the CA certificate does not exist, assume that the
37     # certificate is self-signed.
38     if [ ! -f $ca ] ; then
39         cp -a $crt $ca
40     fi
41
42     if [ -f $crt ] ; then
43         # Check if certificate is valid
44         verify=$(openssl verify -CAfile $ca $crt)
45         # Delete if invalid or if the subject has changed
46         if grep -q "error" <<<$verify || \
47             [ "$(ssl_cname $crt)" != "$cname" ] ; then
48             rm -f $crt $ca
49         fi
50     fi
51
52     if [ ! -f $crt ] ; then
53         # Set subject
54         subj=
55         if [ -n "$cname" ] ; then
56             subj="$subj/CN=$cname"
57         fi
58
59         # Generate new self-signed certificate
60         mkdir -p $(dirname $crt)
61         openssl req -new -x509 -days 3650 -set_serial $RANDOM \
62             -batch -subj "$subj" \
63             -nodes -keyout $key -out $crt
64         check
65
66         # The certificate it self-signed, so it is its own CA
67         cp -a $crt $ca
68     fi
69
70     # Fix permissions
71     chmod 644 $crt $ca
72 }
73
74 case "$1" in
75     start)
76
77         # Generate HTTPS certificates if necessary. We generate a
78         # certificate for each enabled server with a different
79         # hostname. These self-signed certificates may be overridden
80         # later.
81         MESSAGE=$"Generating SSL certificates for"
82         dialog "$MESSAGE"
83
84         for server in WWW API BOOT ; do
85             eval "a=\$PLC_${server}_ENABLED"
86             echo $a
87             if [ "$a" -ne 1 ] ; then
88                 echo "Skipping"
89                 continue
90             fi
91             dialog "$server"
92         ssl_key=PLC_${server}_SSL_KEY
93             ssl_crt=PLC_${server}_SSL_CRT
94             ca_ssl_crt=PLC_${server}_CA_SSL_CRT
95             hostname=PLC_${server}_HOST
96
97             # Check if we have already generated a certificate for
98             # the same hostname.
99             for previous_server in WWW API BOOT ; do
100                 if [ "$server" = "$previous_server" ] ; then
101                     break
102                 fi
103                 previous_ssl_key=PLC_${previous_server}_SSL_KEY
104                 previous_ssl_crt=PLC_${previous_server}_SSL_CRT
105                 previous_ca_ssl_crt=PLC_${previous_server}_CA_SSL_CRT
106                 previous_hostname=PLC_${previous_server}_HOST
107
108                 if [ -f ${!previous_ssl_crt} ] && \
109                     [ "$(ssl_cname ${!previous_ssl_crt})" = "${!hostname}" ] ; then
110                     cp -a ${!previous_ssl_key} ${!ssl_key}
111                     cp -a ${!previous_ssl_crt} ${!ssl_crt}
112                     cp -a ${!previous_ca_ssl_crt} ${!ca_ssl_crt}
113                     break
114                 fi
115             done
116
117             verify_or_generate_certificate \
118                 ${!ssl_crt} ${!ssl_key} ${!ca_ssl_crt} \
119                 ${!hostname}
120         done
121
122         # Install HTTPS certificates into both /etc/pki (Fedora Core
123         # 4) and /etc/httpd/conf (Fedora Core 2). If the API, boot,
124         # and web servers are all running on the same machine, the web
125         # server certificate takes precedence.
126         for server in API BOOT WWW ; do
127             enabled=PLC_${server}_ENABLED
128             if [ "${!enabled}" != "1" ] ; then
129                 continue
130             fi
131             ssl_key=PLC_${server}_SSL_KEY
132             ssl_crt=PLC_${server}_SSL_CRT
133
134             symlink ${!ssl_crt} /etc/pki/tls/certs/localhost.crt
135             symlink ${!ssl_key} /etc/pki/tls/private/localhost.key
136             symlink ${!ssl_crt} /etc/httpd/conf/ssl.crt/server.crt
137             symlink ${!ssl_key} /etc/httpd/conf/ssl.key/server.key
138         done
139
140         result "$MESSAGE"
141         ;;
142 esac
143
144 exit $ERRORS