2022-01-29 12:54:35 +00:00
#!/bin/sh
# Wrapper for acme.sh to work on openwrt.
#
# This program is free software; you can redistribute it and/or modify it under
# the terms of the GNU General Public License as published by the Free Software
# Foundation; either version 3 of the License, or (at your option) any later
# version.
#
# Authors: Toke Høiland-Jørgensen <toke@toke.dk>
2022-12-11 05:25:00 +00:00
run_dir = /var/run/acme
2022-12-14 14:11:58 +00:00
export CHALLENGE_DIR = $run_dir /challenge
export CERT_DIR = /etc/ssl/acme
2022-01-29 12:54:35 +00:00
NFT_HANDLE =
HOOK = /usr/lib/acme/hook
LOG_TAG = acme
# shellcheck source=/dev/null
. /lib/functions.sh
# shellcheck source=net/acme/files/functions.sh
. /usr/lib/acme/functions.sh
cleanup( ) {
log debug "cleaning up"
2022-10-22 13:46:51 +00:00
if [ -e $run_dir /lock ] ; then
rm $run_dir /lock
fi
2022-01-29 12:54:35 +00:00
if [ " $NFT_HANDLE " ] ; then
# $NFT_HANDLE contains the string 'handle XX' so pass it unquoted to nft
nft delete rule inet fw4 input $NFT_HANDLE
fi
}
load_options( ) {
section = $1
# compatibility for old option name
2022-10-24 02:21:45 +00:00
config_get_bool staging " $section " use_staging
2022-01-29 12:54:35 +00:00
if [ -z " $staging " ] ; then
config_get_bool staging " $section " staging 0
fi
export staging
config_get calias " $section " calias
export calias
config_get dalias " $section " dalias
export dalias
config_get domains " $section " domains
export domains
export main_domain
main_domain = " $( first_arg $domains ) "
config_get keylength " $section " keylength ec-256
export keylength
config_get dns " $section " dns
export dns
config_get acme_server " $section " acme_server
export acme_server
config_get days " $section " days
export days
config_get standalone " $section " standalone 0
export standalone
2022-10-24 02:35:47 +00:00
config_get dns_wait " $section " dns_wait
export dns_wait
2022-01-29 12:54:35 +00:00
config_get webroot " $section " webroot
export webroot
if [ " $webroot " ] ; then
2022-12-14 14:11:58 +00:00
log warn " Option \"webroot\" is deprecated, please remove it and change your web server's config so it serves ACME challenge requests from $CHALLENGE_DIR . "
2022-01-29 12:54:35 +00:00
fi
}
first_arg( ) {
echo " $1 "
}
get_cert( ) {
section = $1
config_get_bool enabled " $section " enabled 1
[ " $enabled " = 1 ] || return
load_options " $section "
if [ -z " $dns " ] && [ " $standalone " = 0 ] ; then
2022-12-14 14:11:58 +00:00
mkdir -p " $CHALLENGE_DIR "
2022-01-29 12:54:35 +00:00
fi
if [ " $standalone " = 1 ] && [ -z " $NFT_HANDLE " ] ; then
if ! NFT_HANDLE = $( nft -a -e insert rule inet fw4 input tcp dport 80 counter accept comment ACME | grep -o 'handle [0-9]\+' ) ; then
return 1
fi
log debug " added nft rule: $NFT_HANDLE "
fi
load_credentials( ) {
eval export " $1 "
}
config_list_foreach " $section " credentials load_credentials
" $HOOK " get
}
load_globals( ) {
section = $1
config_get account_email " $section " account_email
if [ -z " $account_email " ] ; then
log err "account_email option is required"
exit 1
fi
2022-12-11 05:25:00 +00:00
export account_email
config_get state_dir " $section " state_dir
if [ " $state_dir " ] ; then
2022-12-14 14:11:58 +00:00
log warn " Option \"state_dir\" is deprecated, please remove it. Certificates now exist in $CERT_DIR . "
2022-12-11 05:25:00 +00:00
mkdir -p " $state_dir "
else
state_dir = /etc/acme
fi
export state_dir
2022-01-29 12:54:35 +00:00
2022-12-11 05:25:00 +00:00
config_get debug " $section " debug 0
export debug
2022-01-29 12:54:35 +00:00
# only look for the first acme section
return 1
}
usage( ) {
cat <<EOF
Usage: acme <command> [ arguments]
Commands:
get issue or renew certificates
EOF
exit 1
}
if [ ! -x " $HOOK " ] ; then
log err "An ACME client like acme-acmesh or acme-uacme is required, which is not installed."
exit 1
fi
case $1 in
get)
2022-10-22 13:46:51 +00:00
mkdir -p $run_dir
2022-11-11 11:16:53 +00:00
exec 200>$run_dir /lock
if ! flock -n 200; then
log err "Another ACME instance is already running."
exit 1
fi
trap cleanup EXIT
config_load acme
config_foreach load_globals acme
config_foreach get_cert cert
2022-01-29 12:54:35 +00:00
; ;
*)
usage
; ;
esac