mirror of
				https://github.com/hiskang/acme.sh
				synced 2025-10-31 10:27:22 +00:00 
			
		
		
		
	support '--pre-hook', '--post-hook' and '--renew-hook'
This commit is contained in:
		
							parent
							
								
									08ee072f11
								
							
						
					
					
						commit
						b0070f03af
					
				
							
								
								
									
										115
									
								
								acme.sh
									
									
									
									
									
								
							
							
						
						
									
										115
									
								
								acme.sh
									
									
									
									
									
								
							| @ -1,6 +1,6 @@ | |||||||
| #!/usr/bin/env sh | #!/usr/bin/env sh | ||||||
| 
 | 
 | ||||||
| VER=2.4.5 | VER=2.5.0 | ||||||
| 
 | 
 | ||||||
| PROJECT_NAME="acme.sh" | PROJECT_NAME="acme.sh" | ||||||
| 
 | 
 | ||||||
| @ -1573,6 +1573,58 @@ _clearupwebbroot() { | |||||||
| 
 | 
 | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | _on_before_issue() { | ||||||
|  |   #run pre hook | ||||||
|  |   if [ "$Le_PreHook" ] ; then | ||||||
|  |     _info "Run pre hook:'$Le_PreHook'" | ||||||
|  |     if ! ( | ||||||
|  |       cd "$DOMAIN_PATH" && eval "$Le_PreHook" | ||||||
|  |     ) ; then | ||||||
|  |       _err "Error when run pre hook." | ||||||
|  |       return 1 | ||||||
|  |     fi | ||||||
|  |   fi | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | _on_issue_err() { | ||||||
|  |   #run the post hook | ||||||
|  |   if [ "$Le_PostHook" ] ; then | ||||||
|  |     _info "Run post hook:'$Le_PostHook'" | ||||||
|  |     if ! ( | ||||||
|  |       cd "$DOMAIN_PATH" && eval "$Le_PostHook" | ||||||
|  |     ) ; then | ||||||
|  |       _err "Error when run post hook." | ||||||
|  |       return 1 | ||||||
|  |     fi | ||||||
|  |   fi | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | _on_issue_success() { | ||||||
|  |   #run the post hook | ||||||
|  |   if [ "$Le_PostHook" ] ; then | ||||||
|  |     _info "Run post hook:'$Le_PostHook'" | ||||||
|  |     if ! ( | ||||||
|  |       cd "$DOMAIN_PATH" && eval "$Le_PostHook" | ||||||
|  |     ) ; then | ||||||
|  |       _err "Error when run post hook." | ||||||
|  |       return 1 | ||||||
|  |     fi | ||||||
|  |   fi | ||||||
|  |    | ||||||
|  |   #run renew hook | ||||||
|  |   if [ "$IS_RENEW" ] && [ "$Le_RenewHook" ] ; then | ||||||
|  |     _info "Run renew hook:'$Le_RenewHook'" | ||||||
|  |     if ! ( | ||||||
|  |       cd "$DOMAIN_PATH" && eval "$Le_RenewHook" | ||||||
|  |     ) ; then | ||||||
|  |       _err "Error when run renew hook." | ||||||
|  |       return 1 | ||||||
|  |     fi | ||||||
|  |   fi   | ||||||
|  |    | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
| #webroot, domain domainlist  keylength  | #webroot, domain domainlist  keylength  | ||||||
| issue() { | issue() { | ||||||
|   if [ -z "$2" ] ; then |   if [ -z "$2" ] ; then | ||||||
| @ -1588,6 +1640,9 @@ issue() { | |||||||
|   Le_RealCACertPath="$7" |   Le_RealCACertPath="$7" | ||||||
|   Le_ReloadCmd="$8" |   Le_ReloadCmd="$8" | ||||||
|   Le_RealFullChainPath="$9" |   Le_RealFullChainPath="$9" | ||||||
|  |   Le_PreHook="${10}" | ||||||
|  |   Le_PostHook="${11}" | ||||||
|  |   Le_RenewHook="${12}" | ||||||
|    |    | ||||||
|   #remove these later. |   #remove these later. | ||||||
|   if [ "$Le_Webroot" = "dns-cf" ] ; then |   if [ "$Le_Webroot" = "dns-cf" ] ; then | ||||||
| @ -1619,6 +1674,14 @@ issue() { | |||||||
|   _savedomainconf "Le_Alt"          "$Le_Alt" |   _savedomainconf "Le_Alt"          "$Le_Alt" | ||||||
|   _savedomainconf "Le_Webroot"      "$Le_Webroot" |   _savedomainconf "Le_Webroot"      "$Le_Webroot" | ||||||
|    |    | ||||||
|  |   _savedomainconf "Le_PreHook"      "$Le_PreHook" | ||||||
|  |   _savedomainconf "Le_PostHook"     "$Le_PostHook" | ||||||
|  |   _savedomainconf "Le_RenewHook"     "$Le_RenewHook" | ||||||
|  | 
 | ||||||
|  |   if ! _on_before_issue ; then | ||||||
|  |     _err "_on_before_issue." | ||||||
|  |     return 1 | ||||||
|  |   fi | ||||||
| 
 | 
 | ||||||
|   if [ "$Le_Alt" = "no" ] ; then |   if [ "$Le_Alt" = "no" ] ; then | ||||||
|     Le_Alt="" |     Le_Alt="" | ||||||
| @ -1628,6 +1691,7 @@ issue() { | |||||||
|     _info "Standalone mode." |     _info "Standalone mode." | ||||||
|     if ! _exists "nc" ; then |     if ! _exists "nc" ; then | ||||||
|       _err "Please install netcat(nc) tools first." |       _err "Please install netcat(nc) tools first." | ||||||
|  |       _on_issue_err | ||||||
|       return 1 |       return 1 | ||||||
|     fi |     fi | ||||||
|      |      | ||||||
| @ -1642,6 +1706,7 @@ issue() { | |||||||
|       _err "$netprc" |       _err "$netprc" | ||||||
|       _err "tcp port $Le_HTTPPort is already used by $(echo "$netprc" | cut -d :  -f 4)" |       _err "tcp port $Le_HTTPPort is already used by $(echo "$netprc" | cut -d :  -f 4)" | ||||||
|       _err "Please stop it first" |       _err "Please stop it first" | ||||||
|  |       _on_issue_err | ||||||
|       return 1 |       return 1 | ||||||
|     fi |     fi | ||||||
|   fi |   fi | ||||||
| @ -1660,6 +1725,7 @@ issue() { | |||||||
|       _err "$netprc" |       _err "$netprc" | ||||||
|       _err "tcp port $Le_TLSPort is already used by $(echo "$netprc" | cut -d :  -f 4)" |       _err "tcp port $Le_TLSPort is already used by $(echo "$netprc" | cut -d :  -f 4)" | ||||||
|       _err "Please stop it first" |       _err "Please stop it first" | ||||||
|  |       _on_issue_err | ||||||
|       return 1 |       return 1 | ||||||
|     fi |     fi | ||||||
|   fi |   fi | ||||||
| @ -1667,6 +1733,7 @@ issue() { | |||||||
|   if _hasfield "$Le_Webroot" "apache" ; then |   if _hasfield "$Le_Webroot" "apache" ; then | ||||||
|     if ! _setApache ; then |     if ! _setApache ; then | ||||||
|       _err "set up apache error. Report error to me." |       _err "set up apache error. Report error to me." | ||||||
|  |       _on_issue_err | ||||||
|       return 1 |       return 1 | ||||||
|     fi |     fi | ||||||
|   else |   else | ||||||
| @ -1683,6 +1750,7 @@ issue() { | |||||||
|       if [ "$usingApache" ] ; then |       if [ "$usingApache" ] ; then | ||||||
|         _restoreApache |         _restoreApache | ||||||
|       fi |       fi | ||||||
|  |       _on_issue_err | ||||||
|       return 1 |       return 1 | ||||||
|     fi |     fi | ||||||
|   fi |   fi | ||||||
| @ -1691,6 +1759,7 @@ issue() { | |||||||
|     if [ "$usingApache" ] ; then |     if [ "$usingApache" ] ; then | ||||||
|         _restoreApache |         _restoreApache | ||||||
|     fi |     fi | ||||||
|  |     _on_issue_err | ||||||
|     return 1 |     return 1 | ||||||
|   fi |   fi | ||||||
|    |    | ||||||
| @ -1715,6 +1784,7 @@ issue() { | |||||||
|     else |     else | ||||||
|       _err "Register account Error: $response" |       _err "Register account Error: $response" | ||||||
|       _clearup |       _clearup | ||||||
|  |       _on_issue_err | ||||||
|       return 1 |       return 1 | ||||||
|     fi |     fi | ||||||
|     ACCOUNT_KEY_HASH="$accountkeyhash" |     ACCOUNT_KEY_HASH="$accountkeyhash" | ||||||
| @ -1737,6 +1807,7 @@ issue() { | |||||||
|       if ! createDomainKey $Le_Domain $Le_Keylength ; then  |       if ! createDomainKey $Le_Domain $Le_Keylength ; then  | ||||||
|         _err "Create domain key error." |         _err "Create domain key error." | ||||||
|         _clearup |         _clearup | ||||||
|  |         _on_issue_err | ||||||
|         return 1 |         return 1 | ||||||
|       fi |       fi | ||||||
|     fi |     fi | ||||||
| @ -1744,6 +1815,7 @@ issue() { | |||||||
|     if ! _createcsr "$Le_Domain" "$Le_Alt" "$CERT_KEY_PATH" "$CSR_PATH" "$DOMAIN_SSL_CONF"   ; then |     if ! _createcsr "$Le_Domain" "$Le_Alt" "$CERT_KEY_PATH" "$CSR_PATH" "$DOMAIN_SSL_CONF"   ; then | ||||||
|       _err "Create CSR error." |       _err "Create CSR error." | ||||||
|       _clearup |       _clearup | ||||||
|  |       _on_issue_err | ||||||
|       return 1 |       return 1 | ||||||
|     fi |     fi | ||||||
|   fi |   fi | ||||||
| @ -1783,12 +1855,14 @@ issue() { | |||||||
|       if ! _send_signed_request "$API/acme/new-authz" "{\"resource\": \"new-authz\", \"identifier\": {\"type\": \"dns\", \"value\": \"$d\"}}" ; then |       if ! _send_signed_request "$API/acme/new-authz" "{\"resource\": \"new-authz\", \"identifier\": {\"type\": \"dns\", \"value\": \"$d\"}}" ; then | ||||||
|         _err "Can not get domain token." |         _err "Can not get domain token." | ||||||
|         _clearup |         _clearup | ||||||
|  |         _on_issue_err | ||||||
|         return 1 |         return 1 | ||||||
|       fi |       fi | ||||||
| 
 | 
 | ||||||
|       if [ ! -z "$code" ] && [ ! "$code" = '201' ] ; then |       if [ ! -z "$code" ] && [ ! "$code" = '201' ] ; then | ||||||
|         _err "new-authz error: $response" |         _err "new-authz error: $response" | ||||||
|         _clearup |         _clearup | ||||||
|  |         _on_issue_err | ||||||
|         return 1 |         return 1 | ||||||
|       fi |       fi | ||||||
| 
 | 
 | ||||||
| @ -1797,6 +1871,7 @@ issue() { | |||||||
|       if [ -z "$entry" ] ; then |       if [ -z "$entry" ] ; then | ||||||
|         _err "Error, can not get domain token $d" |         _err "Error, can not get domain token $d" | ||||||
|         _clearup |         _clearup | ||||||
|  |         _on_issue_err | ||||||
|         return 1 |         return 1 | ||||||
|       fi |       fi | ||||||
|       token="$(printf "%s\n" "$entry" | _egrep_o '"token":"[^"]*' | cut -d : -f 2 | tr -d '"')" |       token="$(printf "%s\n" "$entry" | _egrep_o '"token":"[^"]*' | cut -d : -f 2 | tr -d '"')" | ||||||
| @ -1876,23 +1951,27 @@ issue() { | |||||||
|         ( |         ( | ||||||
|           if ! . $d_api ; then |           if ! . $d_api ; then | ||||||
|             _err "Load file $d_api error. Please check your api file and try again." |             _err "Load file $d_api error. Please check your api file and try again." | ||||||
|  |             _on_issue_err | ||||||
|             return 1 |             return 1 | ||||||
|           fi |           fi | ||||||
|            |            | ||||||
|           addcommand="${_currentRoot}_add" |           addcommand="${_currentRoot}_add" | ||||||
|           if ! _exists $addcommand ; then  |           if ! _exists $addcommand ; then  | ||||||
|             _err "It seems that your api file is not correct, it must have a function named: $addcommand" |             _err "It seems that your api file is not correct, it must have a function named: $addcommand" | ||||||
|  |             _on_issue_err | ||||||
|             return 1 |             return 1 | ||||||
|           fi |           fi | ||||||
|            |            | ||||||
|           if ! $addcommand $txtdomain $txt ; then |           if ! $addcommand $txtdomain $txt ; then | ||||||
|             _err "Error add txt for domain:$txtdomain" |             _err "Error add txt for domain:$txtdomain" | ||||||
|  |             _on_issue_err | ||||||
|             return 1 |             return 1 | ||||||
|           fi |           fi | ||||||
|         ) |         ) | ||||||
|          |          | ||||||
|         if [ "$?" != "0" ] ; then |         if [ "$?" != "0" ] ; then | ||||||
|           _clearup |           _clearup | ||||||
|  |           _on_issue_err | ||||||
|           return 1 |           return 1 | ||||||
|         fi |         fi | ||||||
|         dnsadded='1' |         dnsadded='1' | ||||||
| @ -1904,6 +1983,7 @@ issue() { | |||||||
|       _debug "Dns record not added yet, so, save to $DOMAIN_CONF and exit." |       _debug "Dns record not added yet, so, save to $DOMAIN_CONF and exit." | ||||||
|       _err "Please add the TXT records to the domains, and retry again." |       _err "Please add the TXT records to the domains, and retry again." | ||||||
|       _clearup |       _clearup | ||||||
|  |       _on_issue_err | ||||||
|       return 1 |       return 1 | ||||||
|     fi |     fi | ||||||
|      |      | ||||||
| @ -1952,6 +2032,7 @@ issue() { | |||||||
|         _startserver "$keyauthorization" & |         _startserver "$keyauthorization" & | ||||||
|         if [ "$?" != "0" ] ; then |         if [ "$?" != "0" ] ; then | ||||||
|           _clearup |           _clearup | ||||||
|  |           _on_issue_err | ||||||
|           return 1 |           return 1 | ||||||
|         fi |         fi | ||||||
|         serverproc="$!" |         serverproc="$!" | ||||||
| @ -2017,6 +2098,7 @@ issue() { | |||||||
|         _err "Start tls server error." |         _err "Start tls server error." | ||||||
|         _clearupwebbroot "$_currentRoot" "$removelevel" "$token" |         _clearupwebbroot "$_currentRoot" "$removelevel" "$token" | ||||||
|         _clearup |         _clearup | ||||||
|  |         _on_issue_err | ||||||
|         return 1 |         return 1 | ||||||
|       fi |       fi | ||||||
|     fi |     fi | ||||||
| @ -2025,6 +2107,7 @@ issue() { | |||||||
|       _err "$d:Can not get challenge: $response" |       _err "$d:Can not get challenge: $response" | ||||||
|       _clearupwebbroot "$_currentRoot" "$removelevel" "$token" |       _clearupwebbroot "$_currentRoot" "$removelevel" "$token" | ||||||
|       _clearup |       _clearup | ||||||
|  |       _on_issue_err | ||||||
|       return 1 |       return 1 | ||||||
|     fi |     fi | ||||||
|      |      | ||||||
| @ -2032,6 +2115,7 @@ issue() { | |||||||
|       _err "$d:Challenge error: $response" |       _err "$d:Challenge error: $response" | ||||||
|       _clearupwebbroot "$_currentRoot" "$removelevel" "$token" |       _clearupwebbroot "$_currentRoot" "$removelevel" "$token" | ||||||
|       _clearup |       _clearup | ||||||
|  |       _on_issue_err | ||||||
|       return 1 |       return 1 | ||||||
|     fi |     fi | ||||||
|      |      | ||||||
| @ -2046,6 +2130,7 @@ issue() { | |||||||
|         _err "$d:Timeout" |         _err "$d:Timeout" | ||||||
|         _clearupwebbroot "$_currentRoot" "$removelevel" "$token" |         _clearupwebbroot "$_currentRoot" "$removelevel" "$token" | ||||||
|         _clearup |         _clearup | ||||||
|  |         _on_issue_err | ||||||
|         return 1 |         return 1 | ||||||
|       fi |       fi | ||||||
|        |        | ||||||
| @ -2057,6 +2142,7 @@ issue() { | |||||||
|         _err "$d:Verify error:$response" |         _err "$d:Verify error:$response" | ||||||
|         _clearupwebbroot "$_currentRoot" "$removelevel" "$token" |         _clearupwebbroot "$_currentRoot" "$removelevel" "$token" | ||||||
|         _clearup |         _clearup | ||||||
|  |         _on_issue_err | ||||||
|         return 1 |         return 1 | ||||||
|       fi |       fi | ||||||
|       _debug2 original "$response" |       _debug2 original "$response" | ||||||
| @ -2090,6 +2176,7 @@ issue() { | |||||||
|          fi |          fi | ||||||
|         _clearupwebbroot "$_currentRoot" "$removelevel" "$token" |         _clearupwebbroot "$_currentRoot" "$removelevel" "$token" | ||||||
|         _clearup |         _clearup | ||||||
|  |         _on_issue_err | ||||||
|         return 1; |         return 1; | ||||||
|       fi |       fi | ||||||
|        |        | ||||||
| @ -2099,6 +2186,7 @@ issue() { | |||||||
|         _err "$d:Verify error:$response"  |         _err "$d:Verify error:$response"  | ||||||
|         _clearupwebbroot "$_currentRoot" "$removelevel" "$token" |         _clearupwebbroot "$_currentRoot" "$removelevel" "$token" | ||||||
|         _clearup |         _clearup | ||||||
|  |         _on_issue_err | ||||||
|         return 1 |         return 1 | ||||||
|       fi |       fi | ||||||
|        |        | ||||||
| @ -2112,6 +2200,7 @@ issue() { | |||||||
|    |    | ||||||
|   if ! _send_signed_request "$API/acme/new-cert" "{\"resource\": \"new-cert\", \"csr\": \"$der\"}" "needbase64" ; then |   if ! _send_signed_request "$API/acme/new-cert" "{\"resource\": \"new-cert\", \"csr\": \"$der\"}" "needbase64" ; then | ||||||
|     _err "Sign failed." |     _err "Sign failed." | ||||||
|  |     _on_issue_err | ||||||
|     return 1 |     return 1 | ||||||
|   fi |   fi | ||||||
|    |    | ||||||
| @ -2144,6 +2233,7 @@ issue() { | |||||||
|   if [ -z "$Le_LinkCert" ] ; then |   if [ -z "$Le_LinkCert" ] ; then | ||||||
|     response="$(echo $response | _dbase64 "multiline" | _normalizeJson )" |     response="$(echo $response | _dbase64 "multiline" | _normalizeJson )" | ||||||
|     _err "Sign failed: $(echo "$response" | _egrep_o  '"detail":"[^"]*"')" |     _err "Sign failed: $(echo "$response" | _egrep_o  '"detail":"[^"]*"')" | ||||||
|  |     _on_issue_err | ||||||
|     return 1 |     return 1 | ||||||
|   fi |   fi | ||||||
|    |    | ||||||
| @ -2195,6 +2285,7 @@ issue() { | |||||||
|   Le_NextRenewTimeStr=$( _time2str $Le_NextRenewTime ) |   Le_NextRenewTimeStr=$( _time2str $Le_NextRenewTime ) | ||||||
|   _savedomainconf  "Le_NextRenewTimeStr"  "$Le_NextRenewTimeStr" |   _savedomainconf  "Le_NextRenewTimeStr"  "$Le_NextRenewTimeStr" | ||||||
| 
 | 
 | ||||||
|  |   _on_issue_success | ||||||
| 
 | 
 | ||||||
|   if [ "$Le_RealCertPath$Le_RealKeyPath$Le_RealCACertPath$Le_ReloadCmd$Le_RealFullChainPath" ] ; then |   if [ "$Le_RealCertPath$Le_RealKeyPath$Le_RealCACertPath$Le_ReloadCmd$Le_RealFullChainPath" ] ; then | ||||||
|     _installcert |     _installcert | ||||||
| @ -2232,7 +2323,7 @@ renew() { | |||||||
|   fi |   fi | ||||||
|    |    | ||||||
|   IS_RENEW="1" |   IS_RENEW="1" | ||||||
|   issue "$Le_Webroot" "$Le_Domain" "$Le_Alt" "$Le_Keylength" "$Le_RealCertPath" "$Le_RealKeyPath" "$Le_RealCACertPath" "$Le_ReloadCmd" "$Le_RealFullChainPath" |   issue "$Le_Webroot" "$Le_Domain" "$Le_Alt" "$Le_Keylength" "$Le_RealCertPath" "$Le_RealKeyPath" "$Le_RealCACertPath" "$Le_ReloadCmd" "$Le_RealFullChainPath" "$Le_PreHook" "$Le_PostHook" "$Le_RenewHook" | ||||||
|   res=$? |   res=$? | ||||||
|   IS_RENEW="" |   IS_RENEW="" | ||||||
| 
 | 
 | ||||||
| @ -2984,6 +3075,9 @@ Parameters: | |||||||
|   --nocron                          Only valid for '--install' command, which means: do not install the default cron job. In this case, the certs will not be renewed automatically. |   --nocron                          Only valid for '--install' command, which means: do not install the default cron job. In this case, the certs will not be renewed automatically. | ||||||
|   --ecc                             Specifies to use the ECC cert. Valid for '--installcert', '--renew', '--revoke', '--toPkcs' and '--createCSR' |   --ecc                             Specifies to use the ECC cert. Valid for '--installcert', '--renew', '--revoke', '--toPkcs' and '--createCSR' | ||||||
|   --csr                             Specifies the input csr. |   --csr                             Specifies the input csr. | ||||||
|  |   --pre-hook                        Command to be run before obtaining any certificates. | ||||||
|  |   --post-hook                       Command to be run after attempting to obtain/renew certificates. No matter the obain/renew is success or failed. | ||||||
|  |   --renew-hook                      Command to be run once for each successfully renewed certificate. | ||||||
|   " |   " | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| @ -3060,6 +3154,9 @@ _process() { | |||||||
|   _nocron="" |   _nocron="" | ||||||
|   _ecc="" |   _ecc="" | ||||||
|   _csr="" |   _csr="" | ||||||
|  |   _pre_hook="" | ||||||
|  |   _post_hook="" | ||||||
|  |   _renew_hook="" | ||||||
|   while [ ${#} -gt 0 ] ; do |   while [ ${#} -gt 0 ] ; do | ||||||
|     case "${1}" in |     case "${1}" in | ||||||
|      |      | ||||||
| @ -3321,6 +3418,18 @@ _process() { | |||||||
|         _csr="$2" |         _csr="$2" | ||||||
|         shift |         shift | ||||||
|         ;; |         ;; | ||||||
|  |     --pre-hook) | ||||||
|  |         _pre_hook="$2" | ||||||
|  |         shift | ||||||
|  |         ;; | ||||||
|  |     --post-hook) | ||||||
|  |         _post_hook="$2" | ||||||
|  |         shift | ||||||
|  |         ;; | ||||||
|  |     --renew-hook) | ||||||
|  |         _renew_hook="$2" | ||||||
|  |         shift | ||||||
|  |         ;; | ||||||
|     *) |     *) | ||||||
|         _err "Unknown parameter : $1" |         _err "Unknown parameter : $1" | ||||||
|         return 1 |         return 1 | ||||||
| @ -3339,7 +3448,7 @@ _process() { | |||||||
|     uninstall) uninstall "$_nocron" ;; |     uninstall) uninstall "$_nocron" ;; | ||||||
|     upgrade) upgrade ;; |     upgrade) upgrade ;; | ||||||
|     issue) |     issue) | ||||||
|       issue  "$_webroot"  "$_domain" "$_altdomains" "$_keylength" "$_certpath" "$_keypath" "$_capath" "$_reloadcmd" "$_fullchainpath" |       issue  "$_webroot"  "$_domain" "$_altdomains" "$_keylength" "$_certpath" "$_keypath" "$_capath" "$_reloadcmd" "$_fullchainpath" "$_pre_hook" "$_post_hook" "$_renew_hook" | ||||||
|       ;; |       ;; | ||||||
|     signcsr) |     signcsr) | ||||||
|       signcsr "$_csr" "$_webroot" |       signcsr "$_csr" "$_webroot" | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user