|
@@ -9,6 +9,9 @@ PROJECT_ENTRY="acme.sh"
|
|
|
PROJECT="https://github.com/Neilpang/$PROJECT_NAME"
|
|
|
|
|
|
DEFAULT_INSTALL_HOME="$HOME/.$PROJECT_NAME"
|
|
|
+
|
|
|
+_WINDOWS_SCHEDULER_NAME="$PROJECT_NAME.cron"
|
|
|
+
|
|
|
_SCRIPT_="$0"
|
|
|
|
|
|
_SUB_FOLDERS="dnsapi deploy"
|
|
@@ -2108,7 +2111,7 @@ _startserver() {
|
|
|
echo 'HTTP/1.0 200 OK'; \
|
|
|
echo 'Content-Length\: $_content_len'; \
|
|
|
echo ''; \
|
|
|
-printf '$content';" &
|
|
|
+printf -- '$content';" &
|
|
|
serverproc="$!"
|
|
|
}
|
|
|
|
|
@@ -3748,7 +3751,7 @@ issue() {
|
|
|
return 1
|
|
|
fi
|
|
|
|
|
|
- Le_OrderFinalize="$(echo "$response" | tr -d '\r\n' | _egrep_o '"finalize" *: *"[^"]*"' | cut -d '"' -f 4)"
|
|
|
+ Le_OrderFinalize="$(echo "$response" | _egrep_o '"finalize" *: *"[^"]*"' | cut -d '"' -f 4)"
|
|
|
_debug Le_OrderFinalize "$Le_OrderFinalize"
|
|
|
if [ -z "$Le_OrderFinalize" ]; then
|
|
|
_err "Create new order error. Le_OrderFinalize not found. $response"
|
|
@@ -3760,7 +3763,7 @@ issue() {
|
|
|
#for dns manual mode
|
|
|
_savedomainconf "Le_OrderFinalize" "$Le_OrderFinalize"
|
|
|
|
|
|
- _authorizations_seg="$(echo "$response" | tr -d '\r\n' | _egrep_o '"authorizations" *: *\[[^\]*\]' | cut -d '[' -f 2 | tr -d ']' | tr -d '"')"
|
|
|
+ _authorizations_seg="$(echo "$response" | _egrep_o '"authorizations" *: *\[[^\]*\]' | cut -d '[' -f 2 | tr -d ']' | tr -d '"')"
|
|
|
_debug2 _authorizations_seg "$_authorizations_seg"
|
|
|
if [ -z "$_authorizations_seg" ]; then
|
|
|
_err "_authorizations_seg not found."
|
|
@@ -3846,7 +3849,7 @@ $_authorizations_map"
|
|
|
thumbprint="$(__calc_account_thumbprint)"
|
|
|
fi
|
|
|
|
|
|
- entry="$(printf "%s\n" "$response" | _egrep_o '[^\{]*"type":"'$vtype'"[^\}]*')"
|
|
|
+ entry="$(echo "$response" | _egrep_o '[^\{]*"type":"'$vtype'"[^\}]*')"
|
|
|
_debug entry "$entry"
|
|
|
if [ -z "$entry" ]; then
|
|
|
_err "Error, can not get domain token entry $d"
|
|
@@ -3858,7 +3861,7 @@ $_authorizations_map"
|
|
|
_on_issue_err "$_post_hook"
|
|
|
return 1
|
|
|
fi
|
|
|
- token="$(printf "%s\n" "$entry" | _egrep_o '"token":"[^"]*' | cut -d : -f 2 | tr -d '"')"
|
|
|
+ token="$(echo "$entry" | _egrep_o '"token":"[^"]*' | cut -d : -f 2 | tr -d '"')"
|
|
|
_debug token "$token"
|
|
|
|
|
|
if [ -z "$token" ]; then
|
|
@@ -3868,9 +3871,9 @@ $_authorizations_map"
|
|
|
return 1
|
|
|
fi
|
|
|
if [ "$ACME_VERSION" = "2" ]; then
|
|
|
- uri="$(printf "%s\n" "$entry" | _egrep_o '"url":"[^"]*' | cut -d '"' -f 4 | _head_n 1)"
|
|
|
+ uri="$(echo "$entry" | _egrep_o '"url":"[^"]*' | cut -d '"' -f 4 | _head_n 1)"
|
|
|
else
|
|
|
- uri="$(printf "%s\n" "$entry" | _egrep_o '"uri":"[^"]*' | cut -d '"' -f 4)"
|
|
|
+ uri="$(echo "$entry" | _egrep_o '"uri":"[^"]*' | cut -d '"' -f 4)"
|
|
|
fi
|
|
|
_debug uri "$uri"
|
|
|
|
|
@@ -3928,21 +3931,21 @@ $_authorizations_map"
|
|
|
else
|
|
|
txtdomain="_acme-challenge.$_d_alias"
|
|
|
fi
|
|
|
- dns_entries="${dns_entries}${_dns_root_d}${dvsep}_acme-challenge.$_dns_root_d$dvsep$txtdomain$dvsep$_currentRoot"
|
|
|
+ dns_entry="${_dns_root_d}${dvsep}_acme-challenge.$_dns_root_d$dvsep$txtdomain$dvsep$_currentRoot"
|
|
|
else
|
|
|
txtdomain="_acme-challenge.$_dns_root_d"
|
|
|
- dns_entries="${dns_entries}${_dns_root_d}${dvsep}_acme-challenge.$_dns_root_d$dvsep$dvsep$_currentRoot"
|
|
|
+ dns_entry="${_dns_root_d}${dvsep}_acme-challenge.$_dns_root_d$dvsep$dvsep$_currentRoot"
|
|
|
fi
|
|
|
+
|
|
|
_debug txtdomain "$txtdomain"
|
|
|
txt="$(printf "%s" "$keyauthorization" | _digest "sha256" | _url_replace)"
|
|
|
_debug txt "$txt"
|
|
|
|
|
|
d_api="$(_findHook "$_dns_root_d" dnsapi "$_currentRoot")"
|
|
|
-
|
|
|
_debug d_api "$d_api"
|
|
|
- dns_entries="$dns_entries$dvsep$txt${dvsep}$d_api
|
|
|
-"
|
|
|
- _debug2 "$dns_entries"
|
|
|
+
|
|
|
+ dns_entry="$dns_entry$dvsep$txt${dvsep}$d_api"
|
|
|
+ _debug2 dns_entry "$dns_entry"
|
|
|
if [ "$d_api" ]; then
|
|
|
_info "Found domain api file: $d_api"
|
|
|
else
|
|
@@ -3981,6 +3984,9 @@ $_authorizations_map"
|
|
|
_clearup
|
|
|
return 1
|
|
|
fi
|
|
|
+ dns_entries="$dns_entries$dns_entry
|
|
|
+"
|
|
|
+ _debug2 "$dns_entries"
|
|
|
dnsadded='1'
|
|
|
fi
|
|
|
done
|
|
@@ -4191,7 +4197,7 @@ $_authorizations_map"
|
|
|
fi
|
|
|
|
|
|
if [ "$status" = "invalid" ]; then
|
|
|
- error="$(echo "$response" | tr -d "\r\n" | _egrep_o '"error":\{[^\}]*')"
|
|
|
+ error="$(echo "$response" | _egrep_o '"error":\{[^\}]*')"
|
|
|
_debug2 error "$error"
|
|
|
errordetail="$(echo "$error" | _egrep_o '"detail": *"[^"]*' | cut -d '"' -f 4)"
|
|
|
_debug2 errordetail "$errordetail"
|
|
@@ -4257,7 +4263,7 @@ $_authorizations_map"
|
|
|
while [ "$_link_cert_retry" -lt "$_MAX_CERT_RETRY" ]; do
|
|
|
if _contains "$response" "\"status\":\"valid\""; then
|
|
|
_debug "Order status is valid."
|
|
|
- Le_LinkCert="$(echo "$response" | tr -d '\r\n' | _egrep_o '"certificate" *: *"[^"]*"' | cut -d '"' -f 4)"
|
|
|
+ Le_LinkCert="$(echo "$response" | _egrep_o '"certificate" *: *"[^"]*"' | cut -d '"' -f 4)"
|
|
|
_debug Le_LinkCert "$Le_LinkCert"
|
|
|
if [ -z "$Le_LinkCert" ]; then
|
|
|
_err "Sign error, can not find Le_LinkCert"
|
|
@@ -4923,35 +4929,107 @@ _installcert() {
|
|
|
|
|
|
}
|
|
|
|
|
|
+__read_password() {
|
|
|
+ unset _pp
|
|
|
+ prompt="Enter Password:"
|
|
|
+ while IFS= read -p "$prompt" -r -s -n 1 char; do
|
|
|
+ if [ "$char" = $'\0' ]; then
|
|
|
+ break
|
|
|
+ fi
|
|
|
+ prompt='*'
|
|
|
+ _pp="$_pp$char"
|
|
|
+ done
|
|
|
+ echo "$_pp"
|
|
|
+}
|
|
|
+
|
|
|
+_install_win_taskscheduler() {
|
|
|
+ _lesh="$1"
|
|
|
+ _centry="$2"
|
|
|
+ _randomminute="$3"
|
|
|
+ if ! _exists cygpath; then
|
|
|
+ _err "cygpath not found"
|
|
|
+ return 1
|
|
|
+ fi
|
|
|
+ if ! _exists schtasks; then
|
|
|
+ _err "schtasks.exe is not found, are you on Windows?"
|
|
|
+ return 1
|
|
|
+ fi
|
|
|
+ _winbash="$(cygpath -w $(which bash))"
|
|
|
+ _debug _winbash "$_winbash"
|
|
|
+ if [ -z "$_winbash" ]; then
|
|
|
+ _err "can not find bash path"
|
|
|
+ return 1
|
|
|
+ fi
|
|
|
+ _myname="$(whoami)"
|
|
|
+ _debug "_myname" "$_myname"
|
|
|
+ if [ -z "$_myname" ]; then
|
|
|
+ _err "can not find my user name"
|
|
|
+ return 1
|
|
|
+ fi
|
|
|
+ _debug "_lesh" "$_lesh"
|
|
|
+
|
|
|
+ _info "To install scheduler task in your Windows account, you must input your windows password."
|
|
|
+ _info "$PROJECT_NAME doesn't save your password."
|
|
|
+ _info "Please input your Windows password for: $(__green "$_myname")"
|
|
|
+ _password="$(__read_password)"
|
|
|
+ #SCHTASKS.exe '/create' '/SC' 'DAILY' '/TN' "$_WINDOWS_SCHEDULER_NAME" '/F' '/ST' "00:$_randomminute" '/RU' "$_myname" '/RP' "$_password" '/TR' "$_winbash -l -c '$_lesh --cron --home \"$LE_WORKING_DIR\" $_centry'" >/dev/null
|
|
|
+ echo SCHTASKS.exe '/create' '/SC' 'DAILY' '/TN' "$_WINDOWS_SCHEDULER_NAME" '/F' '/ST' "00:$_randomminute" '/RU' "$_myname" '/RP' "$_password" '/TR' "\"$_winbash -l -c '$_lesh --cron --home \"$LE_WORKING_DIR\" $_centry'\"" | cmd.exe >/dev/null
|
|
|
+ echo
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+_uninstall_win_taskscheduler() {
|
|
|
+ if ! _exists schtasks; then
|
|
|
+ _err "schtasks.exe is not found, are you on Windows?"
|
|
|
+ return 1
|
|
|
+ fi
|
|
|
+ if ! echo SCHTASKS /query /tn "$_WINDOWS_SCHEDULER_NAME" | cmd.exe >/dev/null; then
|
|
|
+ _debug "scheduler $_WINDOWS_SCHEDULER_NAME is not found."
|
|
|
+ else
|
|
|
+ _info "Removing $_WINDOWS_SCHEDULER_NAME"
|
|
|
+ echo SCHTASKS /delete /f /tn "$_WINDOWS_SCHEDULER_NAME" | cmd.exe >/dev/null
|
|
|
+ fi
|
|
|
+}
|
|
|
+
|
|
|
#confighome
|
|
|
installcronjob() {
|
|
|
_c_home="$1"
|
|
|
_initpath
|
|
|
_CRONTAB="crontab"
|
|
|
+ if [ -f "$LE_WORKING_DIR/$PROJECT_ENTRY" ]; then
|
|
|
+ lesh="\"$LE_WORKING_DIR\"/$PROJECT_ENTRY"
|
|
|
+ else
|
|
|
+ _err "Can not install cronjob, $PROJECT_ENTRY not found."
|
|
|
+ return 1
|
|
|
+ fi
|
|
|
+ if [ "$_c_home" ]; then
|
|
|
+ _c_entry="--config-home \"$_c_home\" "
|
|
|
+ fi
|
|
|
+ _t=$(_time)
|
|
|
+ random_minute=$(_math $_t % 60)
|
|
|
+
|
|
|
if ! _exists "$_CRONTAB" && _exists "fcrontab"; then
|
|
|
_CRONTAB="fcrontab"
|
|
|
fi
|
|
|
+
|
|
|
if ! _exists "$_CRONTAB"; then
|
|
|
+ if _exists cygpath && _exists schtasks.exe; then
|
|
|
+ _info "It seems you are on Windows, let's install Windows scheduler task."
|
|
|
+ if _install_win_taskscheduler "$lesh" "$_c_entry" "$random_minute"; then
|
|
|
+ _info "Install Windows scheduler task success."
|
|
|
+ return 0
|
|
|
+ else
|
|
|
+ _err "Install Windows scheduler task failed."
|
|
|
+ return 1
|
|
|
+ fi
|
|
|
+ fi
|
|
|
_err "crontab/fcrontab doesn't exist, so, we can not install cron jobs."
|
|
|
_err "All your certs will not be renewed automatically."
|
|
|
_err "You must add your own cron job to call '$PROJECT_ENTRY --cron' everyday."
|
|
|
return 1
|
|
|
fi
|
|
|
-
|
|
|
_info "Installing cron job"
|
|
|
if ! $_CRONTAB -l | grep "$PROJECT_ENTRY --cron"; then
|
|
|
- if [ -f "$LE_WORKING_DIR/$PROJECT_ENTRY" ]; then
|
|
|
- lesh="\"$LE_WORKING_DIR\"/$PROJECT_ENTRY"
|
|
|
- else
|
|
|
- _err "Can not install cronjob, $PROJECT_ENTRY not found."
|
|
|
- return 1
|
|
|
- fi
|
|
|
-
|
|
|
- if [ "$_c_home" ]; then
|
|
|
- _c_entry="--config-home \"$_c_home\" "
|
|
|
- fi
|
|
|
- _t=$(_time)
|
|
|
- random_minute=$(_math $_t % 60)
|
|
|
if _exists uname && uname -a | grep SunOS >/dev/null; then
|
|
|
$_CRONTAB -l | {
|
|
|
cat
|
|
@@ -4979,6 +5057,16 @@ uninstallcronjob() {
|
|
|
fi
|
|
|
|
|
|
if ! _exists "$_CRONTAB"; then
|
|
|
+ if _exists cygpath && _exists schtasks.exe; then
|
|
|
+ _info "It seems you are on Windows, let's uninstall Windows scheduler task."
|
|
|
+ if _uninstall_win_taskscheduler; then
|
|
|
+ _info "Uninstall Windows scheduler task success."
|
|
|
+ return 0
|
|
|
+ else
|
|
|
+ _err "Uninstall Windows scheduler task failed."
|
|
|
+ return 1
|
|
|
+ fi
|
|
|
+ fi
|
|
|
return
|
|
|
fi
|
|
|
_info "Removing cron job"
|
|
@@ -5110,7 +5198,7 @@ _deactivate() {
|
|
|
_err "Can not get domain new order."
|
|
|
return 1
|
|
|
fi
|
|
|
- _authorizations_seg="$(echo "$response" | tr -d '\r\n' | _egrep_o '"authorizations" *: *\[[^\]*\]' | cut -d '[' -f 2 | tr -d ']' | tr -d '"')"
|
|
|
+ _authorizations_seg="$(echo "$response" | _egrep_o '"authorizations" *: *\[[^\]*\]' | cut -d '[' -f 2 | tr -d ']' | tr -d '"')"
|
|
|
_debug2 _authorizations_seg "$_authorizations_seg"
|
|
|
if [ -z "$_authorizations_seg" ]; then
|
|
|
_err "_authorizations_seg not found."
|
|
@@ -5156,16 +5244,16 @@ _deactivate() {
|
|
|
fi
|
|
|
_debug "Trigger validation."
|
|
|
vtype="$VTYPE_DNS"
|
|
|
- entry="$(printf "%s\n" "$response" | _egrep_o '[^\{]*"type":"'$vtype'"[^\}]*')"
|
|
|
+ entry="$(echo "$response" | _egrep_o '[^\{]*"type":"'$vtype'"[^\}]*')"
|
|
|
_debug entry "$entry"
|
|
|
if [ -z "$entry" ]; then
|
|
|
_err "Error, can not get domain token $d"
|
|
|
return 1
|
|
|
fi
|
|
|
- token="$(printf "%s\n" "$entry" | _egrep_o '"token":"[^"]*' | cut -d : -f 2 | tr -d '"')"
|
|
|
+ token="$(echo "$entry" | _egrep_o '"token":"[^"]*' | cut -d : -f 2 | tr -d '"')"
|
|
|
_debug token "$token"
|
|
|
|
|
|
- uri="$(printf "%s\n" "$entry" | _egrep_o "\"$_URL_NAME\":\"[^\"]*" | cut -d : -f 2,3 | tr -d '"')"
|
|
|
+ uri="$(echo "$entry" | _egrep_o "\"$_URL_NAME\":\"[^\"]*" | cut -d : -f 2,3 | tr -d '"')"
|
|
|
_debug uri "$uri"
|
|
|
|
|
|
keyauthorization="$token.$thumbprint"
|
|
@@ -5187,11 +5275,11 @@ _deactivate() {
|
|
|
break
|
|
|
fi
|
|
|
|
|
|
- _vtype="$(printf "%s\n" "$entry" | _egrep_o '"type": *"[^"]*"' | cut -d : -f 2 | tr -d '"')"
|
|
|
+ _vtype="$(echo "$entry" | _egrep_o '"type": *"[^"]*"' | cut -d : -f 2 | tr -d '"')"
|
|
|
_debug _vtype "$_vtype"
|
|
|
_info "Found $_vtype"
|
|
|
|
|
|
- uri="$(printf "%s\n" "$entry" | _egrep_o "\"$_URL_NAME\":\"[^\"]*" | cut -d : -f 2,3 | tr -d '"')"
|
|
|
+ uri="$(echo "$entry" | _egrep_o "\"$_URL_NAME\":\"[^\"]*" | cut -d : -f 2,3 | tr -d '"')"
|
|
|
_debug uri "$uri"
|
|
|
|
|
|
if [ "$_d_type" ] && [ "$_d_type" != "$_vtype" ]; then
|
|
@@ -5306,13 +5394,17 @@ _precheck() {
|
|
|
|
|
|
if [ -z "$_nocron" ]; then
|
|
|
if ! _exists "crontab" && ! _exists "fcrontab"; then
|
|
|
- _err "It is recommended to install crontab first. try to install 'cron, crontab, crontabs or vixie-cron'."
|
|
|
- _err "We need to set cron job to renew the certs automatically."
|
|
|
- _err "Otherwise, your certs will not be able to be renewed automatically."
|
|
|
- if [ -z "$FORCE" ]; then
|
|
|
- _err "Please add '--force' and try install again to go without crontab."
|
|
|
- _err "./$PROJECT_ENTRY --install --force"
|
|
|
- return 1
|
|
|
+ if _exists cygpath && _exists schtasks.exe; then
|
|
|
+ _info "It seems you are on Windows, we will install Windows scheduler task."
|
|
|
+ else
|
|
|
+ _err "It is recommended to install crontab first. try to install 'cron, crontab, crontabs or vixie-cron'."
|
|
|
+ _err "We need to set cron job to renew the certs automatically."
|
|
|
+ _err "Otherwise, your certs will not be able to be renewed automatically."
|
|
|
+ if [ -z "$FORCE" ]; then
|
|
|
+ _err "Please add '--force' and try install again to go without crontab."
|
|
|
+ _err "./$PROJECT_ENTRY --install --force"
|
|
|
+ return 1
|
|
|
+ fi
|
|
|
fi
|
|
|
fi
|
|
|
fi
|