Browse Source

apache plugin

neil 9 years ago
parent
commit
9a76ef2f32
1 changed files with 106 additions and 6 deletions
  1. 106 6
      le.sh

+ 106 - 6
le.sh

@@ -234,7 +234,7 @@ _stopserver() {
 
 _initpath() {
   if [ -z "$WORKING_DIR" ]; then
-    WORKING_DIR=~/.le
+    WORKING_DIR=$HOME/.le
   fi
   
   domain="$1"
@@ -256,8 +256,95 @@ _initpath() {
   CERT_PATH="$WORKING_DIR/$domain/$domain.cer"
   
   CA_CERT_PATH="$WORKING_DIR/$domain/ca.cer"
+  
+  if [ -z "$ACME_DIR" ] ; then
+    ACME_DIR="/home/.acme"
+  fi
+  
+  if [ -z "$APACHE_CONF_BACKUP_DIR" ] ; then
+    APACHE_CONF_BACKUP_DIR="$WORKING_DIR/"
+  fi
+  
+}
+
+
+_apachePath() {
+  httpdroot="$(apachectl -V | grep HTTPD_ROOT= | cut -d = -f 2 | sed s/\"//g)"
+  httpdconfname="$(apachectl -V | grep SERVER_CONFIG_FILE= | cut -d = -f 2 | sed s/\"//g)"
+  httpdconf="$httpdroot/$httpdconfname"
+  if [ ! -f $httpdconf ] ; then
+    _err "Apache Config file not found" $httpdconf
+    return 1
+  fi
+  return 0
 }
 
+_restoreApache() {
+  if ! _apachePath ; then
+    return 1
+  fi
+  
+  if [ ! -f "$APACHE_CONF_BACKUP_DIR/$httpdconfname" ] ; then
+    _debug "No config file to restore."
+    return 0
+  fi
+  
+  cp -p "$APACHE_CONF_BACKUP_DIR/$httpdconfname" "$httpdconf"
+  if ! apachectl  -t ; then
+    _err "Sorry, restore apache config error, please contact me."
+    _restoreApache
+    return 1;
+  fi
+  rm -f "$APACHE_CONF_BACKUP_DIR/$httpdconfname"
+  return 0  
+}
+
+_setApache() {
+  if ! _apachePath ; then
+    return 1
+  fi
+
+  #backup the conf
+  _debug "Backup apache config file" $httpdconf
+  cp -p $httpdconf $APACHE_CONF_BACKUP_DIR/
+  _info "JFYI, Config file $httpdconf is backuped to $APACHE_CONF_BACKUP_DIR/$httpdconfname"
+  _info "In case there is an error that can not be restored automatically, you may try restore it yourself."
+  _info "The backup file will be deleted on sucess, just forget it."
+  
+  #add alias
+  echo "
+Alias /.well-known/acme-challenge/  $ACME_DIR
+
+<Directory $ACME_DIR >
+Order allow,deny
+Allow from all
+</Directory>
+  " >> $httpdconf
+  
+  if ! apachectl  -t ; then
+    _err "Sorry, apache config error, please contact me."
+    _restoreApache
+    return 1;
+  fi
+  
+  if [ ! -d "$ACME_DIR" ] ; then
+    mkdir -p "$ACME_DIR"
+    chmod 755 "$ACME_DIR"
+  fi
+  
+  if ! apachectl  graceful ; then
+    _err "Sorry, apachectl  graceful error, please contact me."
+    _restoreApache
+    return 1;
+  fi
+  
+  return 0
+}
+
+_clearup () {
+  _stopserver $serverproc
+  _restoreApache
+}
 
 issue() {
   if [ -z "$1" ] ; then
@@ -330,6 +417,14 @@ issue() {
       return 1
     fi
   fi
+  
+  if [ "$Le_Webroot" == "apache" ] ; then
+    if ! _setApache ; then
+      _err "set up apache error. Report error to me."
+      return 1
+    fi
+    wellknown_path="$ACME_DIR"
+  fi
 
   createAccountKey $Le_Domain $Le_Keylength
   
@@ -373,6 +468,7 @@ issue() {
     _info "Already registered"
   else
     _err "Register account Error."
+    _clearup
     return 1
   fi
   
@@ -388,6 +484,7 @@ issue() {
  
     if [ ! -z "$code" ] && [ ! "$code" == '201' ] ; then
       _err "new-authz error: $response"
+      _clearup
       return 1
     fi
     
@@ -410,7 +507,9 @@ issue() {
       sleep 2
       _debug serverproc $serverproc
     else
-      wellknown_path="$Le_Webroot/.well-known/acme-challenge"
+      if [ -z "$wellknown_path" ] ; then
+        wellknown_path="$Le_Webroot/.well-known/acme-challenge"
+      fi
       _debug wellknown_path "$wellknown_path"
       
       mkdir -p "$wellknown_path"
@@ -425,7 +524,7 @@ issue() {
     
     if [ ! -z "$code" ] && [ ! "$code" == '202' ] ; then
       _err "$d:Challenge error: $resource"
-      _stopserver $serverproc
+      _clearup
       return 1
     fi
     
@@ -436,7 +535,7 @@ issue() {
       
       if ! _get $uri ; then
         _err "$d:Verify error:$resource"
-        _stopserver $serverproc
+        _clearup
         return 1
       fi
       
@@ -449,7 +548,7 @@ issue() {
       if [ "$status" == "invalid" ] ; then
          error=$(echo $response | egrep -o '"error":{[^}]*}' | grep -o '"detail":"[^"]*"' | cut -d '"' -f 4)
         _err "$d:Verify error:$error"
-        _stopserver $serverproc
+        _clearup
         return 1;
       fi
       
@@ -457,7 +556,7 @@ issue() {
         _info "Pending"
       else
         _err "$d:Verify error:$response" 
-        _stopserver $serverproc
+        _clearup
         return 1
       fi
       
@@ -488,6 +587,7 @@ issue() {
   if [ -z "$Le_LinkCert" ] ; then
     response="$(echo $response | base64 -d)"
     _err "Sign failed: $(echo "$response" | grep -o  '"detail":"[^"]*"')"
+    _clearup
     return 1
   fi