From 67a9bdd9ebe354f4f566dc49c9b4ad1542ee342f Mon Sep 17 00:00:00 2001 From: Darren 'Tadgy' Austin Date: Thu, 19 Mar 2026 20:20:05 +0000 Subject: [PATCH] Dehydrated updates for Devuan. --- .gitattributesdb | 259 ++++----- ...GV0c2VuY3J5cHQub3JnL2RpcmVjdG9yeQo.tar.gpg | Bin 3538 -> 3548 bytes etc/dehydrated/conf.d/.gitkeepdir | 0 etc/dehydrated/config | 30 +- etc/dehydrated/domains.d/_example_ | 2 +- etc/dehydrated/hooks/default | 522 ++++++++++-------- var/www/.gitignore | 1 + var/www/dehydrated/.gitignore | 2 + 8 files changed, 455 insertions(+), 361 deletions(-) create mode 100644 etc/dehydrated/conf.d/.gitkeepdir create mode 100644 var/www/.gitignore create mode 100644 var/www/dehydrated/.gitignore diff --git a/.gitattributesdb b/.gitattributesdb index 3832f61..9d67a5d 100644 --- a/.gitattributesdb +++ b/.gitattributesdb @@ -11,344 +11,348 @@ LmdpdGhvb2tz 1773074781.635958529 1771512801.560006128 root:root 0755 - - LmdpdGhvb2tzL3ByZS1jb21taXQ= 1757519106.000000000 1757519106.000000000 root:root 0755 - - LmdpdGlnbm9yZQ== 1762025173.020942279 1757593248.000000000 root:root 0644 - - LmdpdG1vZHVsZXM= 1757607701.000000000 1757607701.000000000 root:root 0644 - - -ZXRj 1773949446.172698365 1771501908.000000000 root:root 0755 - - +ZXRj 1773951237.415059979 1771501908.000000000 root:root 0755 - - ZXRjLy5naXRpZ25vcmU= 1773946669.402887347 1757611781.000000000 root:root 0644 - - -ZXRj 1773949446.172698365 1771501908.000000000 root:root 0755 - - +ZXRj 1773951237.415059979 1771501908.000000000 root:root 0755 - - YXBhY2hlMg== - - ZXRjL2FwYWNoZTIvLmdpdGlnbm9yZQ== 1766069108.043264156 1757775932.000000000 root:root 0644 - - -ZXRj 1773949446.172698365 1771501908.000000000 root:root 0755 - - +ZXRj 1773951237.415059979 1771501908.000000000 root:root 0755 - - YXBhY2hlMg== - - ZXRjL2FwYWNoZTIvYXBhY2hlMi5jb25m 1773343425.497690175 1757785514.000000000 root:root 0644 - - -ZXRj 1773949446.172698365 1771501908.000000000 root:root 0755 - - +ZXRj 1773951237.415059979 1771501908.000000000 root:root 0755 - - YXBhY2hlMg== - - bW9kcy1lbmFibGVk - - ZXRjL2FwYWNoZTIvbW9kcy1lbmFibGVkL2F1dGhuX2NvcmUubG9hZA== 1771512801.564006063 1771512801.564006063 root:root 0777 - - -ZXRj 1773949446.172698365 1771501908.000000000 root:root 0755 - - +ZXRj 1773951237.415059979 1771501908.000000000 root:root 0755 - - YXBhY2hlMg== - - bW9kcy1lbmFibGVk - - ZXRjL2FwYWNoZTIvbW9kcy1lbmFibGVkL2F1dGhuX2ZpbGUubG9hZA== 1771512801.564006063 1771512801.564006063 root:root 0777 - - -ZXRj 1773949446.172698365 1771501908.000000000 root:root 0755 - - +ZXRj 1773951237.415059979 1771501908.000000000 root:root 0755 - - YXBhY2hlMg== - - bW9kcy1lbmFibGVk - - ZXRjL2FwYWNoZTIvbW9kcy1lbmFibGVkL2F1dGh6X2NvcmUubG9hZA== 1771512801.564006063 1771512801.564006063 root:root 0777 - - -ZXRj 1773949446.172698365 1771501908.000000000 root:root 0755 - - +ZXRj 1773951237.415059979 1771501908.000000000 root:root 0755 - - YXBhY2hlMg== - - bW9kcy1lbmFibGVk - - ZXRjL2FwYWNoZTIvbW9kcy1lbmFibGVkL2F1dGh6X3VzZXIubG9hZA== 1771512801.564006063 1771512801.564006063 root:root 0777 - - -ZXRj 1773949446.172698365 1771501908.000000000 root:root 0755 - - +ZXRj 1773951237.415059979 1771501908.000000000 root:root 0755 - - YXBhY2hlMg== - - bW9kcy1lbmFibGVk - - ZXRjL2FwYWNoZTIvbW9kcy1lbmFibGVkL2NnaWQubG9hZA== 1771512801.564006063 1771512801.564006063 root:root 0777 - - -ZXRj 1773949446.172698365 1771501908.000000000 root:root 0755 - - +ZXRj 1773951237.415059979 1771501908.000000000 root:root 0755 - - YXBhY2hlMg== - - bW9kcy1lbmFibGVk - - ZXRjL2FwYWNoZTIvbW9kcy1lbmFibGVkL2RlZmxhdGUubG9hZA== 1771512801.564006063 1771512801.564006063 root:root 0777 - - -ZXRj 1773949446.172698365 1771501908.000000000 root:root 0755 - - +ZXRj 1773951237.415059979 1771501908.000000000 root:root 0755 - - YXBhY2hlMg== - - bW9kcy1lbmFibGVk - - ZXRjL2FwYWNoZTIvbW9kcy1lbmFibGVkL2ZpbHRlci5sb2Fk 1771512801.568005995 1771512801.568005995 root:root 0777 - - -ZXRj 1773949446.172698365 1771501908.000000000 root:root 0755 - - +ZXRj 1773951237.415059979 1771501908.000000000 root:root 0755 - - YXBhY2hlMg== - - bW9kcy1lbmFibGVk - - ZXRjL2FwYWNoZTIvbW9kcy1lbmFibGVkL2h0dHAyLmxvYWQ= 1771512801.568005995 1771512801.568005995 root:root 0777 - - -ZXRj 1773949446.172698365 1771501908.000000000 root:root 0755 - - +ZXRj 1773951237.415059979 1771501908.000000000 root:root 0755 - - YXBhY2hlMg== - - bW9kcy1lbmFibGVk - - ZXRjL2FwYWNoZTIvbW9kcy1lbmFibGVkL2luY2x1ZGUubG9hZA== 1771512801.568005995 1771512801.568005995 root:root 0777 - - -ZXRj 1773949446.172698365 1771501908.000000000 root:root 0755 - - +ZXRj 1773951237.415059979 1771501908.000000000 root:root 0755 - - YXBhY2hlMg== - - bW9kcy1lbmFibGVk - - ZXRjL2FwYWNoZTIvbW9kcy1lbmFibGVkL3Byb3h5LmxvYWQ= 1771512801.568005995 1771512801.568005995 root:root 0777 - - -ZXRj 1773949446.172698365 1771501908.000000000 root:root 0755 - - +ZXRj 1773951237.415059979 1771501908.000000000 root:root 0755 - - YXBhY2hlMg== - - bW9kcy1lbmFibGVk - - ZXRjL2FwYWNoZTIvbW9kcy1lbmFibGVkL3Byb3h5X2ZjZ2kubG9hZA== 1771512801.568005995 1771512801.568005995 root:root 0777 - - -ZXRj 1773949446.172698365 1771501908.000000000 root:root 0755 - - +ZXRj 1773951237.415059979 1771501908.000000000 root:root 0755 - - YXBhY2hlMg== - - bW9kcy1lbmFibGVk - - ZXRjL2FwYWNoZTIvbW9kcy1lbmFibGVkL3Byb3h5X2h0dHAubG9hZA== 1773512305.071354981 1773512305.071354981 root:root 0777 - - -ZXRj 1773949446.172698365 1771501908.000000000 root:root 0755 - - +ZXRj 1773951237.415059979 1771501908.000000000 root:root 0755 - - YXBhY2hlMg== - - bW9kcy1lbmFibGVk - - ZXRjL2FwYWNoZTIvbW9kcy1lbmFibGVkL3Jld3JpdGUubG9hZA== 1773519967.649760800 1773519967.649760800 root:root 0777 - - -ZXRj 1773949446.172698365 1771501908.000000000 root:root 0755 - - +ZXRj 1773951237.415059979 1771501908.000000000 root:root 0755 - - YXBhY2hlMg== - - bW9kcy1lbmFibGVk - - ZXRjL2FwYWNoZTIvbW9kcy1lbmFibGVkL3NvY2FjaGVfc2htY2IubG9hZA== 1773343134.250327036 1773343134.250327036 root:root 0777 - - -ZXRj 1773949446.172698365 1771501908.000000000 root:root 0755 - - +ZXRj 1773951237.415059979 1771501908.000000000 root:root 0755 - - YXBhY2hlMg== - - bW9kcy1lbmFibGVk - - ZXRjL2FwYWNoZTIvbW9kcy1lbmFibGVkL3NzbC5sb2Fk 1773343014.364235719 1773343014.364235719 root:root 0777 - - -ZXRj 1773949446.172698365 1771501908.000000000 root:root 0755 - - +ZXRj 1773951237.415059979 1771501908.000000000 root:root 0755 - - YXBhY2hlMg== - - c2l0ZXMtYXZhaWxhYmxl - - ZXRjL2FwYWNoZTIvc2l0ZXMtYXZhaWxhYmxlLy5naXRpZ25vcmU= 1766069274.068541443 1766069263.648712326 root:root 0644 - - -ZXRj 1773949446.172698365 1771501908.000000000 root:root 0755 - - +ZXRj 1773951237.415059979 1771501908.000000000 root:root 0755 - - YXBhY2hlMg== - - c2l0ZXMtYXZhaWxhYmxl - - ZXRjL2FwYWNoZTIvc2l0ZXMtYXZhaWxhYmxlL2NvcmUuc2xhY2t3YXJlLnVrLm5ldC5jb25m 1773519943.102151242 1757785113.000000000 root:root 0644 - - -ZXRj 1773949446.172698365 1771501908.000000000 root:root 0755 - - +ZXRj 1773951237.415059979 1771501908.000000000 root:root 0755 - - YXBhY2hlMg== - - c2l0ZXMtZW5hYmxlZA== - - ZXRjL2FwYWNoZTIvc2l0ZXMtZW5hYmxlZC8wMC1jb3JlLnNsYWNrd2FyZS51ay5uZXQuY29uZg== 1773340506.404142422 1773340506.404142422 root:root 0777 - - -ZXRj 1773949446.172698365 1771501908.000000000 root:root 0755 - - +ZXRj 1773951237.415059979 1771501908.000000000 root:root 0755 - - YXB0 - - ZXRjL2FwdC8uZ2l0aWdub3Jl 1762532662.236312315 1762532566.409854495 root:root 0644 - - -ZXRj 1773949446.172698365 1771501908.000000000 root:root 0755 - - +ZXRj 1773951237.415059979 1771501908.000000000 root:root 0755 - - YXB0 - - cHJlZmVyZW5jZXMuZA== - - ZXRjL2FwdC9wcmVmZXJlbmNlcy5kL3N1cnk= 1762021809.456432672 1762021809.456432672 root:root 0644 - - -ZXRj 1773949446.172698365 1771501908.000000000 root:root 0755 - - +ZXRj 1773951237.415059979 1771501908.000000000 root:root 0755 - - YXB0 - - c291cmNlcy5saXN0LmQ= - - ZXRjL2FwdC9zb3VyY2VzLmxpc3QuZC9mZC5saXN0 1762021706.378133066 1762021706.374133133 root:root 0644 - - -ZXRj 1773949446.172698365 1771501908.000000000 root:root 0755 - - +ZXRj 1773951237.415059979 1771501908.000000000 root:root 0755 - - YXB0 - - c291cmNlcy5saXN0LmQ= - - ZXRjL2FwdC9zb3VyY2VzLmxpc3QuZC9zdXJ5Lmxpc3Q= 1762021706.378133066 1762021706.378133066 root:root 0644 - - -ZXRj 1773949446.172698365 1771501908.000000000 root:root 0755 - - +ZXRj 1773951237.415059979 1771501908.000000000 root:root 0755 - - Y3Jvbi4xNW1pbg== - - ZXRjL2Nyb24uMTVtaW4vLmdpdGlnbm9yZQ== 1762535468.567176697 1762535289.358058790 root:root 0644 - - -ZXRj 1773949446.172698365 1771501908.000000000 root:root 0755 - - +ZXRj 1773951237.415059979 1771501908.000000000 root:root 0755 - - Y3Jvbi5k - - ZXRjL2Nyb24uZC8uZ2l0aWdub3Jl 1762535453.203423781 1762535289.358058790 root:root 0644 - - -ZXRj 1773949446.172698365 1771501908.000000000 root:root 0755 - - +ZXRj 1773951237.415059979 1771501908.000000000 root:root 0755 - - Y3Jvbi5kYWlseQ== - - ZXRjL2Nyb24uZGFpbHkvLmdpdGlnbm9yZQ== 1762538383.748288196 1762535499.146684944 root:root 0644 - - -ZXRj 1773949446.172698365 1771501908.000000000 root:root 0755 - - +ZXRj 1773951237.415059979 1771501908.000000000 root:root 0755 - - Y3Jvbi5kYWlseQ== - - ZXRjL2Nyb24uZGFpbHkvMC1yb3RhdGUtbG9ncy1zeW1saW5rcw== 1773074830.431179720 1773074830.431179720 root:root 0777 - - -ZXRj 1773949446.172698365 1771501908.000000000 root:root 0755 - - +ZXRj 1773951237.415059979 1771501908.000000000 root:root 0755 - - Y3Jvbi5kYWlseQ== - - ZXRjL2Nyb24uZGFpbHkvMTAtZGVoeWRyYXRlZA== 1773074830.431179720 1773074830.431179720 root:root 0777 - - -ZXRj 1773949446.172698365 1771501908.000000000 root:root 0755 - - +ZXRj 1773951237.415059979 1771501908.000000000 root:root 0755 - - Y3Jvbi5kYWlseQ== - - ZXRjL2Nyb24uZGFpbHkvNS11cGRhdGUtcGFja2FnZXMtbGlzdA== 1773074830.431179720 1773074830.431179720 root:root 0777 - - -ZXRj 1773949446.172698365 1771501908.000000000 root:root 0755 - - +ZXRj 1773951237.415059979 1771501908.000000000 root:root 0755 - - Y3Jvbi5kYWlseQ== - - ZXRjL2Nyb24uZGFpbHkvNy13YXJuLWdpdC1zdGF0dXM= 1773074830.431179720 1773074830.431179720 root:root 0777 - - -ZXRj 1773949446.172698365 1771501908.000000000 root:root 0755 - - +ZXRj 1773951237.415059979 1771501908.000000000 root:root 0755 - - Y3Jvbi5ob3VybHk= - - ZXRjL2Nyb24uaG91cmx5Ly5naXRpZ25vcmU= 1762535518.534373147 1762535518.534373147 root:root 0644 - - -ZXRj 1773949446.172698365 1771501908.000000000 root:root 0755 - - +ZXRj 1773951237.415059979 1771501908.000000000 root:root 0755 - - Y3Jvbi5tb250aGx5 - - ZXRjL2Nyb24ubW9udGhseS8uZ2l0aWdub3Jl 1762535548.045898541 1762535548.045898541 root:root 0644 - - -ZXRj 1773949446.172698365 1771501908.000000000 root:root 0755 - - +ZXRj 1773951237.415059979 1771501908.000000000 root:root 0755 - - Y3Jvbi53ZWVrbHk= - - ZXRjL2Nyb24ud2Vla2x5Ly5naXRpZ25vcmU= 1762628453.620630321 1762535530.470181196 root:root 0644 - - -ZXRj 1773949446.172698365 1771501908.000000000 root:root 0755 - - +ZXRj 1773951237.415059979 1771501908.000000000 root:root 0755 - - Y3Jvbi53ZWVrbHk= - - ZXRjL2Nyb24ud2Vla2x5L2NsZWFuLXBocA== 1773074830.431179720 1773074830.431179720 root:root 0777 - - -ZXRj 1773949446.172698365 1771501908.000000000 root:root 0755 - - +ZXRj 1773951237.415059979 1771501908.000000000 root:root 0755 - - Y3Jvbi55ZWFybHk= - - ZXRjL2Nyb24ueWVhcmx5Ly5naXRpZ25vcmU= 1762535568.001577608 1762535568.001577608 root:root 0644 - - -ZXRj 1773949446.172698365 1771501908.000000000 root:root 0755 - - +ZXRj 1773951237.415059979 1771501908.000000000 root:root 0755 - - ZXRjL2Nyb250YWI= 1762534976.223094581 1757593504.000000000 root:root 0600 - - -ZXRj 1773949446.172698365 1771501908.000000000 root:root 0755 - - +ZXRj 1773951237.415059979 1771501908.000000000 root:root 0755 - - ZGVmYXVsdA== - - ZXRjL2RlZmF1bHQvLmdpdGlnbm9yZQ== 1762624179.585857684 1762624148.166366444 root:root 0644 - - -ZXRj 1773949446.172698365 1771501908.000000000 root:root 0755 - - +ZXRj 1773951237.415059979 1771501908.000000000 root:root 0755 - - ZGVmYXVsdA== - - ZXRjL2RlZmF1bHQvcHJvbWV0aGV1cy1ub2RlLWV4cG9ydGVy 1773511187.568917165 1762023153.000000000 root:root 0644 - - -ZXRj 1773949446.172698365 1771501908.000000000 root:root 0755 - - +ZXRj 1773951237.415059979 1771501908.000000000 root:root 0755 - - ZGVmYXVsdA== - - ZXRjL2RlZmF1bHQvcm90YXRlLWxvZ3Mtc3ltbGlua3M= 1758555243.000000000 1758552192.000000000 root:root 0644 - - -ZXRj 1773949446.172698365 1771501908.000000000 root:root 0755 - - +ZXRj 1773951237.415059979 1771501908.000000000 root:root 0755 - - ZGVmYXVsdA== - - ZXRjL2RlZmF1bHQvdGVycmFmb3JtLWh0dHAtYmFja2VuZA== 1773511563.759009356 1757595391.000000000 root:root 0600 - - -ZXRj 1773949446.172698365 1771501908.000000000 root:root 0755 - - +ZXRj 1773951237.415059979 1771501908.000000000 root:root 0755 - - ZGVoeWRyYXRlZA== - - ZXRjL2RlaHlkcmF0ZWQvLmdpdGlnbm9yZQ== 1758038054.000000000 1758038054.000000000 root:root 0644 - - -ZXRj 1773949446.172698365 1771501908.000000000 root:root 0755 - - +ZXRj 1773951237.415059979 1771501908.000000000 root:root 0755 - - ZGVoeWRyYXRlZA== - - YWNjb3VudHM= - - ZXRjL2RlaHlkcmF0ZWQvYWNjb3VudHMvLmdpdGlnbm9yZQ== 1757873230.000000000 1757873230.000000000 root:root 0644 - - -ZXRj 1773949446.172698365 1771501908.000000000 root:root 0755 - - +ZXRj 1773951237.415059979 1771501908.000000000 root:root 0755 - - ZGVoeWRyYXRlZA== - - YWNjb3VudHM= - - ZXRjL2RlaHlkcmF0ZWQvYWNjb3VudHMvYUhSMGNITTZMeTloWTIxbExYWXdNaTVoY0drdWJHVjBjMlZ1WTNKNWNIUXViM0puTDJScGNtVmpkRzl5ZVFvLnRhci5ncGc= 1773159494.828502366 1757873275.000000000 root:root 0644 - - -ZXRj 1773949446.172698365 1771501908.000000000 root:root 0755 - - +ZXRj 1773951237.415059979 1771501908.000000000 root:root 0755 - - ZGVoeWRyYXRlZA== - - YXJjaGl2ZQ== - - ZXRjL2RlaHlkcmF0ZWQvYXJjaGl2ZS8uZ2l0aWdub3Jl 1757874259.000000000 1757873451.000000000 root:root 0644 - - -ZXRj 1773949446.172698365 1771501908.000000000 root:root 0755 - - +ZXRj 1773951237.415059979 1771501908.000000000 root:root 0755 - - ZGVoeWRyYXRlZA== - - Y2VydHM= - - ZXRjL2RlaHlkcmF0ZWQvY2VydHMvLmdpdGlnbm9yZQ== 1757874303.000000000 1757873537.000000000 root:root 0644 - - -ZXRj 1773949446.172698365 1771501908.000000000 root:root 0755 - - +ZXRj 1773951237.415059979 1771501908.000000000 root:root 0755 - - +ZGVoeWRyYXRlZA== - - +Y29uZi5k - - +ZXRjL2RlaHlkcmF0ZWQvY29uZi5kLy5naXRrZWVwZGly 1773342473.728835264 1773342473.728835264 root:root 0644 - - +ZXRj 1773951237.415059979 1771501908.000000000 root:root 0755 - - ZGVoeWRyYXRlZA== - - ZXRjL2RlaHlkcmF0ZWQvY29uZmln 1773422158.392330219 1757862077.000000000 root:root 0644 - - -ZXRj 1773949446.172698365 1771501908.000000000 root:root 0755 - - +ZXRj 1773951237.415059979 1771501908.000000000 root:root 0755 - - ZGVoeWRyYXRlZA== - - ZXRjL2RlaHlkcmF0ZWQvZG9tYWlucw== 1757862328.000000000 1757862077.000000000 root:root 0644 - - -ZXRj 1773949446.172698365 1771501908.000000000 root:root 0755 - - +ZXRj 1773951237.415059979 1771501908.000000000 root:root 0755 - - ZGVoeWRyYXRlZA== - - ZG9tYWlucy5k - - ZXRjL2RlaHlkcmF0ZWQvZG9tYWlucy5kL19leGFtcGxlXw== 1773422197.987710884 1757862077.000000000 root:root 0644 - - -ZXRj 1773949446.172698365 1771501908.000000000 root:root 0755 - - +ZXRj 1773951237.415059979 1771501908.000000000 root:root 0755 - - ZGVoeWRyYXRlZA== - - aG9va3M= - - ZXRjL2RlaHlkcmF0ZWQvaG9va3MvZGVmYXVsdA== 1773342632.190315764 1757862077.000000000 root:root 0755 - - -ZXRj 1773949446.172698365 1771501908.000000000 root:root 0755 - - +ZXRj 1773951237.415059979 1771501908.000000000 root:root 0755 - - ZnVzaW9uZGlyZWN0b3J5 - - ZXRjL2Z1c2lvbmRpcmVjdG9yeS9mdXNpb25kaXJlY3RvcnktYXBhY2hlLmNvbmY= 1740415693.000000000 1762022137.000000000 root:root 0644 - - -ZXRj 1773949446.172698365 1771501908.000000000 root:root 0755 - - +ZXRj 1773951237.415059979 1771501908.000000000 root:root 0755 - - ZnVzaW9uZGlyZWN0b3J5 - - ZXRjL2Z1c2lvbmRpcmVjdG9yeS9mdXNpb25kaXJlY3RvcnkuY29uZg== - - -ZXRj 1773949446.172698365 1771501908.000000000 root:root 0755 - - +ZXRj 1773951237.415059979 1771501908.000000000 root:root 0755 - - ZnVzaW9uZGlyZWN0b3J5 - - ZXRjL2Z1c2lvbmRpcmVjdG9yeS9mdXNpb25kaXJlY3RvcnkuY29uZi5vcmln 1760207207.000000000 1760207207.000000000 root:root 0644 - - -ZXRj 1773949446.172698365 1771501908.000000000 root:root 0755 - - -ZXRjL2dyb3Vw 1762530431.632238190 1762530431.632238190 root:root 0644 - - -ZXRj 1773949446.172698365 1771501908.000000000 root:root 0755 - - +ZXRj 1773951237.415059979 1771501908.000000000 root:root 0755 - - +ZXRjL2dyb3Vw 1773951237.415059979 1773951237.415059979 root:root 0644 - - +ZXRj 1773951237.415059979 1771501908.000000000 root:root 0755 - - ZXRjL2dzaGFkb3cuZ3Bn 1762628156.813441524 1762447499.282711556 root:root 0644 - - -ZXRj 1773949446.172698365 1771501908.000000000 root:root 0755 - - +ZXRj 1773951237.415059979 1771501908.000000000 root:root 0755 - - ZXRjL2hvc3RuYW1l 1757594311.000000000 1757594311.000000000 root:root 0644 - - -ZXRj 1773949446.172698365 1771501908.000000000 root:root 0755 - - +ZXRj 1773951237.415059979 1771501908.000000000 root:root 0755 - - ZXRjL2hvc3Rz 1762446715.371577485 1757594362.000000000 root:root 0644 - - -ZXRj 1773949446.172698365 1771501908.000000000 root:root 0755 - - +ZXRj 1773951237.415059979 1771501908.000000000 root:root 0755 - - aW5pdC5k - - ZXRjL2luaXQuZC8uZ2l0aWdub3Jl 1771459200.000000000 1771459200.000000000 root:root 0644 - - -ZXRj 1773949446.172698365 1771501908.000000000 root:root 0755 - - +ZXRj 1773951237.415059979 1771501908.000000000 root:root 0755 - - aW5pdC5k - - ZXRjL2luaXQuZC90ZXJyYWZvcm0taHR0cC1iYWNrZW5k 1773654405.833829368 1771459200.000000000 root:root 0755 - - -ZXRj 1773949446.172698365 1771501908.000000000 root:root 0755 - - +ZXRj 1773951237.415059979 1771501908.000000000 root:root 0755 - - ZXRjL2tyYjUuY29uZg== 1773662876.418407545 1583171707.000000000 root:root 0644 - - -ZXRj 1773949446.172698365 1771501908.000000000 root:root 0755 - - +ZXRj 1773951237.415059979 1771501908.000000000 root:root 0755 - - bGRhcA== - - ZXRjL2xkYXAvbGRhcC5jb25m 1758374529.000000000 1730112559.000000000 root:root 0644 - - -ZXRj 1773949446.172698365 1771501908.000000000 root:root 0755 - - +ZXRj 1773951237.415059979 1771501908.000000000 root:root 0755 - - bGRhcA== - - c2NoZW1h - - ZXRjL2xkYXAvc2NoZW1hLy5naXRpZ25vcmU= 1762628549.507075969 1762628549.507075969 root:root 0644 - - -ZXRj 1773949446.172698365 1771501908.000000000 root:root 0755 - - +ZXRj 1773951237.415059979 1771501908.000000000 root:root 0755 - - bGRhcA== - - c2NoZW1h - - ZXRjL2xkYXAvc2NoZW1hL3JmYzIzMDdiaXMuc2NoZW1h 1759835660.000000000 1759835660.000000000 root:root 0644 - - -ZXRj 1773949446.172698365 1771501908.000000000 root:root 0755 - - +ZXRj 1773951237.415059979 1771501908.000000000 root:root 0755 - - ZXRjL2xvZ2luLmRlZnM= 1771509215.801996599 1745058028.000000000 root:root 0644 - - -ZXRj 1773949446.172698365 1771501908.000000000 root:root 0755 - - +ZXRj 1773951237.415059979 1771501908.000000000 root:root 0755 - - ZXRjL21vdGQ= 1762625944.389278724 1756052400.000000000 root:root 0644 - - -ZXRj 1773949446.172698365 1771501908.000000000 root:root 0755 - - +ZXRj 1773951237.415059979 1771501908.000000000 root:root 0755 - - ZXRjL21zbXRwLmFsaWFzZXM= 1758035451.000000000 1758035451.000000000 root:root 0644 - - -ZXRj 1773949446.172698365 1771501908.000000000 root:root 0755 - - +ZXRj 1773951237.415059979 1771501908.000000000 root:root 0755 - - ZXRjL21zbXRwcmMuZ3Bn 1761052674.000000000 1758049424.000000000 root:root 0644 - - -ZXRj 1773949446.172698365 1771501908.000000000 root:root 0755 - - +ZXRj 1773951237.415059979 1771501908.000000000 root:root 0755 - - bmV0d29yaw== - - ZXRjL25ldHdvcmsvLmdpdGlnbm9yZQ== 1757596572.000000000 1757596572.000000000 root:root 0644 - - -ZXRj 1773949446.172698365 1771501908.000000000 root:root 0755 - - +ZXRj 1773951237.415059979 1771501908.000000000 root:root 0755 - - bmV0d29yaw== - - ZXRjL25ldHdvcmsvaW50ZXJmYWNlcw== 1762449437.502802342 1762449437.502802342 root:root 0644 - - -ZXRj 1773949446.172698365 1771501908.000000000 root:root 0755 - - +ZXRj 1773951237.415059979 1771501908.000000000 root:root 0755 - - bmV0d29yaw== - - aW50ZXJmYWNlcy5k - - ZXRjL25ldHdvcmsvaW50ZXJmYWNlcy5kL2V0aDA= 1762449591.864258045 1762449559.040799058 root:root 0644 - - -ZXRj 1773949446.172698365 1771501908.000000000 root:root 0755 - - +ZXRj 1773951237.415059979 1771501908.000000000 root:root 0755 - - bmV0d29yaw== - - aW50ZXJmYWNlcy5k - - ZXRjL25ldHdvcmsvaW50ZXJmYWNlcy5kL2V0aDE= 1762449602.376084790 1762449560.312778093 root:root 0644 - - -ZXRj 1773949446.172698365 1771501908.000000000 root:root 0755 - - -ZXRjL3Bhc3N3ZA== 1773520112.011464701 1762449439.234773795 root:root 0644 - - -ZXRj 1773949446.172698365 1771501908.000000000 root:root 0755 - - +ZXRj 1773951237.415059979 1771501908.000000000 root:root 0755 - - +ZXRjL3Bhc3N3ZA== 1773951229.999182951 1773951229.999182951 root:root 0644 - - +ZXRj 1773951237.415059979 1771501908.000000000 root:root 0755 - - cGhw - - ZXRjL3BocC8uZ2l0aWdub3Jl 1773950303.090525695 1773950303.090525695 root:root 0644 - - -ZXRj 1773949446.172698365 1771501908.000000000 root:root 0755 - - +ZXRj 1773951237.415059979 1771501908.000000000 root:root 0755 - - cGhw - - OC40 - - ZXRjL3BocC84LjQvLmdpdGlnbm9yZQ== 1773950864.129246341 1773950864.129246341 root:root 0644 - - -ZXRj 1773949446.172698365 1771501908.000000000 root:root 0755 - - +ZXRj 1773951237.415059979 1771501908.000000000 root:root 0755 - - cGhw - - OC40 - - YXBhY2hlMg== - - ZXRjL3BocC84LjQvYXBhY2hlMi8uZ2l0aWdub3Jl 1773950761.570942616 1773950761.570942616 root:root 0644 - - -ZXRj 1773949446.172698365 1771501908.000000000 root:root 0755 - - +ZXRj 1773951237.415059979 1771501908.000000000 root:root 0755 - - cGhw - - OC40 - - YXBhY2hlMg== - - ZXRjL3BocC84LjQvYXBhY2hlMi9waHAuaW5p 1773248884.583344972 1773248884.583344972 root:root 0777 - - -ZXRj 1773949446.172698365 1771501908.000000000 root:root 0755 - - +ZXRj 1773951237.415059979 1771501908.000000000 root:root 0755 - - cGhw - - OC40 - - Y2xp - - ZXRjL3BocC84LjQvY2xpLy5naXRpZ25vcmU= 1773950780.838623940 1773950780.838623940 root:root 0644 - - -ZXRj 1773949446.172698365 1771501908.000000000 root:root 0755 - - +ZXRj 1773951237.415059979 1771501908.000000000 root:root 0755 - - cGhw - - OC40 - - Y2xp - - ZXRjL3BocC84LjQvY2xpL3BocC5pbmk= 1773248893.095208163 1773248893.095208163 root:root 0777 - - -ZXRj 1773949446.172698365 1771501908.000000000 root:root 0755 - - +ZXRj 1773951237.415059979 1771501908.000000000 root:root 0755 - - cGhw - - OC40 - - ZnBt - - ZXRjL3BocC84LjQvZnBtLy5naXRpZ25vcmU= 1773950820.753963759 1773950820.753963759 root:root 0644 - - -ZXRj 1773949446.172698365 1771501908.000000000 root:root 0755 - - +ZXRj 1773951237.415059979 1771501908.000000000 root:root 0755 - - cGhw - - OC40 - - ZnBt - - ZXRjL3BocC84LjQvZnBtL3BocC1mcG0uY29uZg== 1773249914.582789624 1771512192.000000000 root:root 0644 - - -ZXRj 1773949446.172698365 1771501908.000000000 root:root 0755 - - +ZXRj 1773951237.415059979 1771501908.000000000 root:root 0755 - - cGhw - - OC40 - - ZnBt - - ZXRjL3BocC84LjQvZnBtL3BocC5pbmk= 1773248900.295092442 1773248900.295092442 root:root 0777 - - -ZXRj 1773949446.172698365 1771501908.000000000 root:root 0755 - - +ZXRj 1773951237.415059979 1771501908.000000000 root:root 0755 - - cGhw - - OC40 - - ZnBt - - cG9vbC5k - - ZXRjL3BocC84LjQvZnBtL3Bvb2wuZC93d3cuY29uZg== 1773343753.212472726 1771512192.000000000 root:root 0644 - - -ZXRj 1773949446.172698365 1771501908.000000000 root:root 0755 - - +ZXRj 1773951237.415059979 1771501908.000000000 root:root 0755 - - cGhw - - OC40 - - ZXRjL3BocC84LjQvcGhwLmluaQ== 1773248696.138374022 1773229113.232168334 root:root 0644 - - -ZXRj 1773949446.172698365 1771501908.000000000 root:root 0755 - - +ZXRj 1773951237.415059979 1771501908.000000000 root:root 0755 - - cGhwbGRhcGFkbWlu - - ZXRjL3BocGxkYXBhZG1pbi8uZ2l0aWdub3Jl 1762628720.800299329 1762628701.308615289 root:root 0644 - - -ZXRj 1773949446.172698365 1771501908.000000000 root:root 0755 - - +ZXRj 1773951237.415059979 1771501908.000000000 root:root 0755 - - cGhwbGRhcGFkbWlu - - ZXRjL3BocGxkYXBhZG1pbi9jb25maWcucGhwLmdwZw== 1761052640.000000000 1758539944.000000000 root:root 0644 - - -ZXRj 1773949446.172698365 1771501908.000000000 root:root 0755 - - +ZXRj 1773951237.415059979 1771501908.000000000 root:root 0755 - - ZXRjL3BrZ2xpc3Q= 1773878402.020187156 1762560002.068536774 root:root 0644 - - -ZXRj 1773949446.172698365 1771501908.000000000 root:root 0755 - - +ZXRj 1773951237.415059979 1771501908.000000000 root:root 0755 - - cHVzaG92ZXItY2xpZW50 - - ZXRjL3B1c2hvdmVyLWNsaWVudC8uZ2l0aWdub3Jl 1762628624.365862525 1762448145.464092595 root:root 0644 - - -ZXRj 1773949446.172698365 1771501908.000000000 root:root 0755 - - +ZXRj 1773951237.415059979 1771501908.000000000 root:root 0755 - - cHVzaG92ZXItY2xpZW50 - - ZXRjL3B1c2hvdmVyLWNsaWVudC9kZWZhdWx0LmdwZw== 1762448163.991787320 1762448163.979787518 root:root 0644 - - -ZXRj 1773949446.172698365 1771501908.000000000 root:root 0755 - - +ZXRj 1773951237.415059979 1771501908.000000000 root:root 0755 - - ZXRjL3Jlc29sdi5jb25m 1773592997.299303370 1757611605.000000000 root:root 0644 - - -ZXRj 1773949446.172698365 1771501908.000000000 root:root 0755 - - +ZXRj 1773951237.415059979 1771501908.000000000 root:root 0755 - - ZXRjL3JzeXNsb2cuY29uZg== 1757785113.000000000 1757785113.000000000 root:root 0644 - - -ZXRj 1773949446.172698365 1771501908.000000000 root:root 0755 - - +ZXRj 1773951237.415059979 1771501908.000000000 root:root 0755 - - c2FtYmE= - - ZXRjL3NhbWJhL3NtYi5jb25m 1762447904.392054475 1758208516.000000000 root:root 0644 - - -ZXRj 1773949446.172698365 1771501908.000000000 root:root 0755 - - +ZXRj 1773951237.415059979 1771501908.000000000 root:root 0755 - - c2FtYmE= - - ZXRjL3NhbWJhL3NtYnVzZXJz 1758121825.000000000 1758121586.000000000 root:root 0644 - - -ZXRj 1773949446.172698365 1771501908.000000000 root:root 0755 - - +ZXRj 1773951237.415059979 1771501908.000000000 root:root 0755 - - ZXRjL3NoYWRvdy5ncGc= 1762628180.969049967 1762447484.598952854 root:root 0644 - - -ZXRj 1773949446.172698365 1771501908.000000000 root:root 0755 - - +ZXRj 1773951237.415059979 1771501908.000000000 root:root 0755 - - c3No - - ZXRjL3NzaC8uZ2l0aWdub3Jl 1762628843.382312260 1757606957.000000000 root:root 0644 - - -ZXRj 1773949446.172698365 1771501908.000000000 root:root 0755 - - +ZXRj 1773951237.415059979 1771501908.000000000 root:root 0755 - - c3No - - ZXRjL3NzaC9zc2hfY29uZmln 1757606630.000000000 1757606630.000000000 root:root 0644 - - -ZXRj 1773949446.172698365 1771501908.000000000 root:root 0755 - - +ZXRj 1773951237.415059979 1771501908.000000000 root:root 0755 - - c3No - - ZXRjL3NzaC9zc2hkX2NvbmZpZw== 1758202229.000000000 1757606896.000000000 root:root 0644 - - -ZXRj 1773949446.172698365 1771501908.000000000 root:root 0755 - - +ZXRj 1773951237.415059979 1771501908.000000000 root:root 0755 - - c3NoZ3VhcmQ= - - ZXRjL3NzaGd1YXJkL3NzaGd1YXJkLmNvbmY= 1758050700.000000000 1758050700.000000000 root:root 0644 - - -ZXRj 1773949446.172698365 1771501908.000000000 root:root 0755 - - +ZXRj 1773951237.415059979 1771501908.000000000 root:root 0755 - - c3NoZ3VhcmQ= - - ZXRjL3NzaGd1YXJkL3doaXRlbGlzdA== 1758050235.000000000 1758050235.000000000 root:root 0644 - - -ZXRj 1773949446.172698365 1771501908.000000000 root:root 0755 - - +ZXRj 1773951237.415059979 1771501908.000000000 root:root 0755 - - c3Vkb2Vycy5k - - ZXRjL3N1ZG9lcnMuZC8uZ2l0aWdub3Jl 1762026765.566662574 1762026765.566662574 root:root 0644 - - -ZXRj 1773949446.172698365 1771501908.000000000 root:root 0755 - - +ZXRj 1773951237.415059979 1771501908.000000000 root:root 0755 - - c3Vkb2Vycy5k - - ZXRjL3N1ZG9lcnMuZC9kZWZhdWx0cw== 1757599359.000000000 1757599359.000000000 root:root 0640 - - -ZXRj 1773949446.172698365 1771501908.000000000 root:root 0755 - - +ZXRj 1773951237.415059979 1771501908.000000000 root:root 0755 - - c3Vkb2Vycy5k - - ZXRjL3N1ZG9lcnMuZC9yb290LWFjY2Vzcw== 1757600157.000000000 1757600157.000000000 root:root 0640 - - aG9tZQ== 1773074781.647958337 1771512801.576005863 root:root 0755 - - @@ -409,36 +413,36 @@ b3B0L3NiaW4vcHVzaG92ZXItY2xpZW50 1758224526.000000000 1758224526.000000000 root: b3B0 1771515169.961748163 1771501851.000000000 root:root 0755 - - c2Jpbg== 1767688090.000000000 1767688090.000000000 root:root 0777 - - b3B0L3NiaW4vdGVycmFmb3JtLWh0dHAtYmFja2VuZA== 1757590543.000000000 1757590543.000000000 root:root 0755 - - -cm9vdA== 1773947266.280944041 1771512801.616005200 root:root 0755 - - +cm9vdA== 1773951371.844830681 1771512801.616005200 root:root 0755 - - cm9vdC8uYmFzaF9sb2dvdXQ= 1757582867.000000000 1757582867.000000000 root:root 0644 - - -cm9vdA== 1773947266.280944041 1771512801.616005200 root:root 0755 - - +cm9vdA== 1773951371.844830681 1771512801.616005200 root:root 0755 - - cm9vdC8uYmFzaF9wcm9maWxl 1757584711.000000000 1757584711.000000000 root:root 0644 - - -cm9vdA== 1773947266.280944041 1771512801.616005200 root:root 0755 - - +cm9vdA== 1773951371.844830681 1771512801.616005200 root:root 0755 - - cm9vdC8uYmFzaHJj 1758887027.000000000 1757586493.000000000 root:root 0644 - - -cm9vdA== 1773947266.280944041 1771512801.616005200 root:root 0755 - - +cm9vdA== 1773951371.844830681 1771512801.616005200 root:root 0755 - - cm9vdC8uZ2l0Y29uZmln 1757582738.000000000 1757582738.000000000 root:root 0644 - - -cm9vdA== 1773947266.280944041 1771512801.616005200 root:root 0755 - - +cm9vdA== 1773951371.844830681 1771512801.616005200 root:root 0755 - - cm9vdC8uZ2l0aWdub3Jl 1771509562.912369370 1757600312.000000000 root:root 0644 - - -cm9vdA== 1773947266.280944041 1771512801.616005200 root:root 0755 - - +cm9vdA== 1773951371.844830681 1771512801.616005200 root:root 0755 - - LmxvY2Fs - - c2hhcmU= - - bmFubw== - - cm9vdC8ubG9jYWwvc2hhcmUvbmFuby8uZ2l0aWdub3Jl 1757586210.000000000 1757586210.000000000 root:root 0644 - - -cm9vdA== 1773947266.280944041 1771512801.616005200 root:root 0755 - - +cm9vdA== 1773951371.844830681 1771512801.616005200 root:root 0755 - - cm9vdC8ubmFub3Jj 1757585756.000000000 1757585756.000000000 root:root 0644 - - -cm9vdA== 1773947266.280944041 1771512801.616005200 root:root 0755 - - +cm9vdA== 1773951371.844830681 1771512801.616005200 root:root 0755 - - LnNzaA== - - cm9vdC8uc3NoLy5naXRpZ25vcmU= 1757593349.000000000 1757593349.000000000 root:root 0644 - - -cm9vdA== 1773947266.280944041 1771512801.616005200 root:root 0755 - - +cm9vdA== 1773951371.844830681 1771512801.616005200 root:root 0755 - - LnNzaA== - - cm9vdC8uc3NoL2F1dGhvcml6ZWRfa2V5cw== 1757587611.000000000 1757587611.000000000 root:root 0644 - - -cm9vdA== 1773947266.280944041 1771512801.616005200 root:root 0755 - - +cm9vdA== 1773951371.844830681 1771512801.616005200 root:root 0755 - - c3R1ZmYtdG8ta2VlcA== - - cm9vdC9zdHVmZi10by1rZWVwL2NsZWFuLWZk 1758994151.000000000 1758992264.000000000 root:root 0755 - - -cm9vdA== 1773947266.280944041 1771512801.616005200 root:root 0755 - - +cm9vdA== 1773951371.844830681 1771512801.616005200 root:root 0755 - - c3R1ZmYtdG8ta2VlcA== - - cm9vdC9zdHVmZi10by1rZWVwL2R1bW15LWRlZmF1bHQtbXRh 1762020478.278412865 1762020215.034844513 root:root 0644 - - -cm9vdA== 1773947266.280944041 1771512801.616005200 root:root 0755 - - +cm9vdA== 1773951371.844830681 1771512801.616005200 root:root 0755 - - c3R1ZmYtdG8ta2VlcA== - - cm9vdC9zdHVmZi10by1rZWVwL2R1bW15LWRlZmF1bHQtbXRhXzAuMC4xX2FsbC5kZWI= 1762020499.466056182 1762020499.458056317 root:root 0644 - - dmFy 1773949028.799601180 1771512801.620005134 root:root 0755 - - @@ -462,19 +466,26 @@ dmFy 1773949028.799601180 1771512801.620005134 root:root 0755 - - dG1w 1773942460.457147071 1771501870.000000000 root:root 1777 - - cGhwLXVwbG9hZHM= - - dmFyL3RtcC9waHAtdXBsb2Fkcy8uZ2l0aWdub3Jl 1773949181.645073322 1773949181.645073322 root:root 0644 - - -ZXRj 1773949446.172698365 1771501908.000000000 root:root 0755 - - -ZXRjL3NoYWRvdw== 1762449439.206774257 1762449439.206774257 root:shadow 0640 - - -ZXRj 1773949446.172698365 1771501908.000000000 root:root 0755 - - -ZXRjL3NoYWRvdy0= 1762023813.000000000 1762023813.000000000 root:shadow 0640 - - -ZXRj 1773949446.172698365 1771501908.000000000 root:root 0755 - - +dmFy 1773949028.799601180 1771512801.620005134 root:root 0755 - - +d3d3 - - +dmFyL3d3dy8uZ2l0aWdub3Jl 1773949001.724048991 1773949001.724048991 root:root 0644 - - +dmFy 1773949028.799601180 1771512801.620005134 root:root 0755 - - +d3d3 - - +ZGVoeWRyYXRlZA== - - +dmFyL3d3dy9kZWh5ZHJhdGVkLy5naXRpZ25vcmU= 1773946447.886574894 1773340286.179664904 root:root 0644 - - +ZXRj 1773951237.415059979 1771501908.000000000 root:root 0755 - - +ZXRjL3NoYWRvdw== 1773951229.983183217 1773951229.983183217 root:shadow 0640 - - +ZXRj 1773951237.415059979 1771501908.000000000 root:root 0755 - - +ZXRjL3NoYWRvdy0= 1762449439.000000000 1762449439.000000000 root:shadow 0640 - - +ZXRj 1773951237.415059979 1771501908.000000000 root:root 0755 - - ZXRjL3N1ZG9lcnM= 1751262933.000000000 1751262933.000000000 root:root 0440 - - -ZXRj 1773949446.172698365 1771501908.000000000 root:root 0755 - - +ZXRj 1773951237.415059979 1771501908.000000000 root:root 0755 - - c3Vkb2Vycy5k - - ZXRjL3N1ZG9lcnMuZC9SRUFETUU= 1751262933.000000000 1751262933.000000000 root:root 0440 - - -ZXRj 1773949446.172698365 1771501908.000000000 root:root 0755 - - +ZXRj 1773951237.415059979 1771501908.000000000 root:root 0755 - - c3Vkb2Vycy5k - - ZXRjL3N1ZG9lcnMuZC9kZWZhdWx0cw== 1757599359.000000000 1757599359.000000000 root:root 0640 - - -ZXRj 1773949446.172698365 1771501908.000000000 root:root 0755 - - +ZXRj 1773951237.415059979 1771501908.000000000 root:root 0755 - - c3Vkb2Vycy5k - - ZXRjL3N1ZG9lcnMuZC9yb290LWFjY2Vzcw== 1757600157.000000000 1757600157.000000000 root:root 0640 - - aG9tZQ== 1773074781.647958337 1771512801.576005863 root:root 0755 - - diff --git a/etc/dehydrated/accounts/aHR0cHM6Ly9hY21lLXYwMi5hcGkubGV0c2VuY3J5cHQub3JnL2RpcmVjdG9yeQo.tar.gpg b/etc/dehydrated/accounts/aHR0cHM6Ly9hY21lLXYwMi5hcGkubGV0c2VuY3J5cHQub3JnL2RpcmVjdG9yeQo.tar.gpg index 983eedd03733ca940e4bc8a81ef2a1fb73bd721d..9a51e1059708b86879a850ae34f3f4a846d95086 100644 GIT binary patch literal 3548 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 Wo?DI|+-orHFs-05$s!$k$x!TXWz7`; literal 3538 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 M$CABtAK6wQg%DZTod5s; diff --git a/etc/dehydrated/conf.d/.gitkeepdir b/etc/dehydrated/conf.d/.gitkeepdir new file mode 100644 index 0000000..e69de29 diff --git a/etc/dehydrated/config b/etc/dehydrated/config index b43b3ad..b7e3bdd 100644 --- a/etc/dehydrated/config +++ b/etc/dehydrated/config @@ -3,7 +3,7 @@ # $SCRIPTDIR/config (next to this script) # /usr/local/etc/dehydrated/config # /etc/dehydrated/config -# ${PWD}/config (in current working-directory) +# $PWD/config (in current working-directory) # Which user should dehydrated run as? This will be implictly enforced when running as root. # Default: @@ -32,7 +32,7 @@ #OLDCA="https://acme-v01.api.letsencrypt.org/directory" # Which challenge should be used? -# Supported values: http-01, dns-01, tls-alpn-01. +# Supported values: http-01, dns-01, dns-persist-01, tls-alpn-01. # Default: http-01 #CHALLENGETYPE="http-01" @@ -40,7 +40,7 @@ # This allows overriding the defaults found in the main configuration file. # Additional config files in this directory must be named with a '.sh' ending. # Default: -#CONFIG_D="" +CONFIG_D="/etc/dehydrated/conf.d" # Base directory for account key, generated certificates and list of domains. # Default: $SCRIPTDIR @@ -48,28 +48,28 @@ BASEDIR="/etc/dehydrated" # File containing the list of domains for which to request certificates. # Default: $BASEDIR/domains.txt -DOMAINS_TXT="${BASEDIR}/domains" +DOMAINS_TXT="$BASEDIR/domains" # Directory for per-domain configuration files. # If not set, per-domain configurations are sourced from each certificates output directory. # Default: -DOMAINS_D="${BASEDIR}/domains.d" +DOMAINS_D="$BASEDIR/domains.d" # Output directory for generated certificates. -# Default: ${BASEDIR}/certs -#CERTDIR="${BASEDIR}/certs" +# Default: $BASEDIR/certs +#CERTDIR="$BASEDIR/certs" # Output directory for alpn verification certificates. -# Default: ${BASEDIR}/alpn-certs -#ALPNCERTDIR="${BASEDIR}/alpn-certs" +# Default: $BASEDIR/alpn-certs +#ALPNCERTDIR="$BASEDIR/alpn-certs" # Directory for account keys and registration information. -# Default: ${BASEDIR}/accounts -#ACCOUNTDIR="${BASEDIR}/accounts" +# Default: $BASEDIR/accounts +#ACCOUNTDIR="$BASEDIR/accounts" # Output directory for challenge-tokens to be served by webserver, or deployed in $HOOK. # Default: /var/www/dehydrated -WELLKNOWN="/srv/dehydrated" +WELLKNOWN="/var/www/dehydrated" # Default keysize for private keys. # Default: 4096 @@ -91,7 +91,7 @@ WELLKNOWN="/srv/dehydrated" # Program or function called at certain stages of processing. # BASEDIR and WELLKNOWN variables are exported and can be used in an external program. # Default: -HOOK="${BASEDIR}/hooks/default" +HOOK="$BASEDIR/hooks/default" # Chain clean_challenge|deploy_challenge arguments together into one hook call per certificate? # Default: no @@ -103,7 +103,7 @@ HOOK="${BASEDIR}/hooks/default" # Regenerate private keys instead of just signing new certificates on renewal? # Default: yes -PRIVATE_KEY_RENEW="no" +#PRIVATE_KEY_RENEW="yes" # Create an extra private key for rollover? # Default: no @@ -136,7 +136,7 @@ LOCKFILE="/run/dehydrated.lock" # Issuer chain cache directory. # Default: $BASEDIR/chains -#CHAINCACHE="${BASEDIR}/chains" +#CHAINCACHE="$BASEDIR/chains" # Automatic cleanup? # Default: no diff --git a/etc/dehydrated/domains.d/_example_ b/etc/dehydrated/domains.d/_example_ index 941659e..76b06b3 100644 --- a/etc/dehydrated/domains.d/_example_ +++ b/etc/dehydrated/domains.d/_example_ @@ -1,7 +1,7 @@ # The settings in this file can be used to override those in the global config file in /etc/dehydrated # Which challenge should be used? -# Supported values: http-01, dns-01, tls-alpn-01. +# Supported values: http-01, dns-01, dns-persist-01, tls-alpn-01. # Default: http-01 #CHALLENGETYPE="http-01" diff --git a/etc/dehydrated/hooks/default b/etc/dehydrated/hooks/default index 2c94e31..b28b4b2 100755 --- a/etc/dehydrated/hooks/default +++ b/etc/dehydrated/hooks/default @@ -1,136 +1,189 @@ #!/usr/bin/env bash -# This file contains the default hook functions for dehydrated - these functions will be used when there is no overriding certificate specific hooks file. -# All but startup_hook and ext_hook can be overridden by a hooks script on a per certificate basis. +# This file contains the default hook functions for dehydrated - these functions will be used when there is no overriding certificate +# specific hooks file. All but startup_hook and ext_hook can be overridden by a hooks script on a per certificate basis. # # shellcheck disable=SC2034,SC2317 # Configuration. # Where the copies of the current certificates/keys should be placed. Comment for no copying. CERTSDIR="/etc/certificates" -# The syslog facility and tag to use. -FACILITY="local3" -TAG="dehydrated" -# Where from/to to send emails. -EMAIL_FROM="\"Server: ${HOSTNAME%%.*}\" " +# The syslog facility and tag to use. Comment for no sysloging. +SYSLOG_FACILITY="local1" +SYSLOG_TAG="dehydrated-hooks" +# Where from/to to send emails. Comment for no emailing. +EMAIL_FROM="\"Server: ${HOSTNAME%%.*}\" " EMAIL_TO=("Systems' Administrator ") # Get the system ID. # shellcheck disable=SC2046 declare SYSTEM_$(grep '^ID=' /etc/os-release 2>/dev/null) -# Write a message to syslog, and send a copy via email. +# Write a message to syslog and/or send via email. notify() { - local LOG_PREFIX="${LOG_PREFIX:-Certificate renewal} $1" PRIORITY + # Parameters: + # $1 Log entry type (currently one of: error, warning or info). + # $2... The text of the log entry. + + local PREFIX PRIORITY [[ -z "$1" ]] && return 1 # Select the syslog priority level. case "$1" in - 'error') PRIORITY="err" ;; - 'warning') PRIORITY="warn" ;; - *) PRIORITY="info" ;; + 'error') + PREFIX="${LOG_PREFIX:-Certificate renewal} $1" + PRIORITY="err" + shift + ;; + 'info') + PREFIX="${LOG_PREFIX:-Certificate renewal} $1" + PRIORITY="info" + shift + ;; + 'warning') + PREFIX="${LOG_PREFIX:-Certificate renewal} $1" + PRIORITY="warn" + shift + ;; + *) + LOG_PREFIX="Dehydrated hooks' coding" + notify "error" "Invalid or no log entry severity specified - using 'error'" + PREFIX="${LOG_PREFIX:-Certificate renewal} error" + PRIORITY="err" + ;; esac - shift - # Log the message to syslog - if [[ "$ID" == "alpine" ]]; then - # BusyBox logger on Alpine's is missing the --id option. - printf "%s\\n" "$LOG_PREFIX:" "$@" "EOX" | logger -p "$FACILITY.$PRIORITY" -t "$TAG" >/dev/null 2>&1 - else - printf "%s\\n" "$LOG_PREFIX:" "$@" "EOX" | logger --id="$$" -p "$FACILITY.$PRIORITY" -t "$TAG" >/dev/null 2>&1 - fi + # Log the message to syslog. + [[ -n "$SYSLOG_FACILITY" ]] && [[ -n "$SYSLOG_TAG" ]] && { + if [[ "$SYSTEM_ID" == "alpine" ]]; then + # BusyBox logger on Alpine's is missing the --id option. + printf "%s\\n" "$PREFIX:" "$@" "EOL" | logger -p "$SYSLOG_FACILITY.$PRIORITY" -t "$SYSLOG_TAG" >/dev/null 2>&1 + else + printf "%s\\n" "$PREFIX:" "$@" "EOL" | logger --id="$$" -p "$SYSLOG_FACILITY.$PRIORITY" -t "$SYSLOG_TAG" >/dev/null 2>&1 + fi + } # Email the notification. - printf "%s\\n" "$@" | mail -r "$EMAIL_FROM" -s "$LOG_PREFIX" "${EMAIL_TO[@]}" >/dev/null 2>&1 + [[ -n "$EMAIL_FROM" ]] && [[ -n "${EMAIL_TO[*]}" ]] && { + printf "%s\\n" "$@" | mail -r "$EMAIL_FROM" -s "$PREFIX" "${EMAIL_TO[@]}" >/dev/null 2>&1 + } return 0 } # Service configurations (used at startup/shutdown). services() { - local DAEMON ERR=0 LOG_PREFIX="Dehydrated configuration" PIDFILE RCFILE SANITY="$1" + # Parameters: + # $1 Whether to sanity check configuration. '1' == sanity check. - # Select the service configuration based on the distribution. - # RCFILE_ is required for any service. - # Either DAEMON_ or PIDFILE_, or both is required for any service. - if [[ "$SYSTEM_ID" == "slackware" ]]; then - # HTTP daemon selection. - if [[ -x "/etc/rc.d/rc.httpd" ]]; then - RCFILE_HTTPD="/etc/rc.d/rc.httpd" - DAEMON_HTTPD="httpd" - PIDFILE_HTTPD="/run/httpd.pid" - elif [[ -x "/etc/rc.d/rc.thttpd" ]]; then - RCFILE_HTTPD="/etc/rc.d/rc.thttpd" - DAEMON_HTTPD="thttpd" - PIDFILE_HTTPD="/run/thttpd.pid" - fi - # FTP daemon selection. - if [[ -x "/etc/rc.d/rc.proftpd" ]]; then - RCFILE_FTPD="/etc/rc.d/rc.proftpd" - DAEMON_FTPD="proftpd" - PIDFILE_FTPD="/run/proftpd.pid" - fi - # SMTP daemon selection. - if [[ -x "/etc/rc.d/rc.exim" ]]; then - RCFILE_SMTPD="/etc/rc.d/rc.exim" - DAEMON_SMTPD="exim" - PIDFILE_SMTPD="/run/exim.pid" - fi - elif [[ "$SYSTEM_ID" == "void" ]]; then - # HTTP daemon selection. - # thttpd on Void doesn't have a directly callable rc script, so can't be supported. - if [[ -x "/usr/sbin/apachectl" ]]; then - RCFILE_HTTPD="/usr/sbin/apachectl" - DAEMON_HTTPD="httpd" - PIDFILE_HTTPD="/run/httpd/httpd.pid" - fi - elif [[ "$SYSTEM_ID" == "alpine" ]]; then - # HTTP daemon selection. + local LOG_PREFIX="Dehydrated hooks' configuration" SERVICE + declare -g -A SERVICE_CTL SERVICE_DAEMON SERVICE_PIDFILE + + # Select the service configurations based on the distribution. + # SERVICE_CTL[''] is required, and either SERVICE_DAEMON[''] or SERVICE_PIDFILE[''], or both is required for any service. + # An 'httpd' service must be defined for certificate renewal to work. + if [[ "$SYSTEM_ID" == "alpine" ]]; then + # HTTP daemon. if [[ -x "/etc/init.d/apache2" ]]; then - RCFILE_HTTPD="/etc/init.d/apache2" - DAEMON_HTTPD="httpd" - PIDFILE_HTTPD="/run/apache2/httpd.pid" + SERVICE_CTL['httpd']="/etc/init.d/apache2" + SERVICE_DAEMON['httpd']="httpd" + SERVICE_PIDFILE['httpd']="/run/apache2/httpd.pid" elif [[ -x "/etc/init.d/thttpd" ]]; then - RCFILE_HTTPD="/etc/init.d/thttpd" - DAEMON_HTTPD="thttpd" - PIDFILE_HTTPD="/run/thttpd.pid" + SERVICE_CTL['httpd']="/etc/init.d/thttpd" + SERVICE_DAEMON['httpd']="thttpd" + SERVICE_PIDFILE['httpd']="/run/thttpd.pid" fi # Samba daemon selection. if [[ -x "/etc/init.d/samba" ]]; then -# FIXME: -# RCFILE_SAMBA="/etc/init.d/samba" - DAEMON_SAMBA="samba" - PIDFILE_SAMBA="/run/samba.pid" + SERVICE_CTL['samba']="/etc/init.d/samba" + SERVICE_DAEMON['samba']="samba" + SERVICE_PIDFILE['samba']="/run/samba.pid" fi + elif [[ "$SYSTEM_ID" =~ ^(debian|devuan)$ ]]; then + # HTTP daemon. + if [[ -x "/usr/sbin/apachectl" ]]; then + SERVICE_CTL['httpd']="/usr/sbin/apachectl" + SERVICE_DAEMON['httpd']="apache2" + SERVICE_PIDFILE['httpd']="/run/apache2/apache2.pid" + fi + # Samba daemon. + if [[ -x "/etc/init.d/samba" ]]; then + SERVICE_CTL['samba']="/etc/init.d/samba" + SERVICE_DAEMON['samba']="samba" + SERVICE_PIDFILE['samba']="/run/samba/samba.pid" + fi + elif [[ "$SYSTEM_ID" == "slackware" ]]; then + # HTTP daemon. + if [[ -x "/etc/rc.d/rc.httpd" ]]; then + SERVICE_CTL['httpd']="/etc/rc.d/rc.httpd" + SERVICE_DAEMON['httpd']="httpd" + SERVICE_PIDFILE['httpd']="/run/httpd.pid" + elif [[ -x "/etc/rc.d/rc.thttpd" ]]; then + SERVICE_CTL['httpd']="/etc/rc.d/rc.thttpd" + SERVICE_DAEMON['httpd']="thttpd" + SERVICE_PIDFILE['httpd']="/run/thttpd.pid" + fi + # FTP daemon. + if [[ -x "/etc/rc.d/rc.proftpd" ]]; then + SERVICE_CTL['ftpd']="/etc/rc.d/rc.proftpd" + SERVICE_DAEMON['ftpd']="proftpd" + SERVICE_PIDFILE['ftpd']="/run/proftpd.pid" + fi + # SMTP daemon. + if [[ -x "/etc/rc.d/rc.exim" ]]; then + SERVICE_CTL['smtpd']="/etc/rc.d/rc.exim" + SERVICE_DAEMON['smtpd']="exim" + SERVICE_PIDFILE['smtpd']="/run/exim.pid" + fi + elif [[ "$SYSTEM_ID" == "void" ]]; then + # HTTP daemon selection. + # Note: thttpd on Void doesn't have a directly callable rc script, so can't be supported. + if [[ -x "/usr/sbin/apachectl" ]]; then + SERVICE_CTL['httpd']="/usr/sbin/apachectl" + SERVICE_DAEMON['httpd']="httpd" + SERVICE_PIDFILE['httpd']="/run/httpd/httpd.pid" + fi + else + notify "error" "'$SYSTEM_ID' is not a supported platform for hooks" + return 1 fi # Sanity check settings. - ((SANITY == 1)) && { - [[ -z "$RCFILE_HTTPD" ]] && notify "warning" "No configuration settings for an HTTP daemon - no start/restart of HTTP daemon is possible -- check configuration" - for RCFILE in "${!RCFILE_@}"; do - DAEMON="DAEMON_${RCFILE#RCFILE_}" - PIDFILE="PIDFILE_${RCFILE#RCFILE_}" - [[ -n "${!RCFILE}" ]] && [[ -z "${!DAEMON}" ]] && [[ -z "${!PIDFILE}" ]] && notify "error" "'$RCFILE' is set, but neither '$DAEMON' nor '$PIDFILE' is set - at least one setting is required -- aborting" && ERR=1 + (( $1 == 1 )) && { + local IFS=$'\n' + for SERVICE in $(printf "%s\\n" "${!SERVICE_CTL[@]}" "${!SERVICE_DAEMON[@]}" "${!SERVICE_PIDFILE[@]}" | sort | uniq); do + if [[ -z "${SERVICE_CTL[\"$SERVICE\"]}" ]]; then + if [[ "$SERVICE" == "httpd" ]]; then + notify "warning" "'SERVICE_CTL' is not set for service 'httpd' - HTTP based validation, if used, not possible" "Comment all 'httpd' SERVICE_* settings to silence this warning" + else + notify "warning" "'SERVICE_CTL' is not set for service '$SERVICE'" + fi + unset "SERVICE_CTL['$SERVICE']" "SERVICE_DAEMON['$SERVICE']" "SERVICE_PIDFILE['$SERVICE']" + continue + else + [[ -z "${SERVICE_DAEMON[\"$SERVICE\"]}" ]] && [[ -z "${SERVICE_PIDFILE[\"$SERVICE\"]}" ]] && { + notify "warning" "neither 'SERVICE_DAEMON' nor 'SERVICE_PIDFILE' is set for service '$SERVICE' - at least one setting is required" + unset "SERVICE_CTL['$SERVICE']" "SERVICE_DAEMON['$SERVICE']" "SERVICE_PIDFILE['$SERVICE']" + continue + } + fi done } - ((ERR == 1)) && return 1 - return 0 } +# Called once for every domain that needs to be validated, including any alternative names listed. deploy_challenge() { - local DOMAIN="$1" TOKEN_FILENAME="$2" TOKEN_VALUE="$3" - - # This hook is called once for every domain that needs to be - # validated, including any alternative names you may have listed. # Parameters: - # DOMAIN - The domain name (CN or subject alternative name) being validated. - # TOKEN_FILENAME - The name of the file containing the token to be served for HTTP validation - # Should be served by your web server as /.well-known/acme-challenge/${TOKEN_FILENAME}. - # TOKEN_VALUE - The token value that needs to be served for validation. - # For DNS validation, this is what you want to put in the _acme-challenge TXT record. - # For HTTP validation it is the value that is expected be found in the $TOKEN_FILENAME file. + # $1 (DOMAIN) The domain name (CN or subject alternative name) being validated. + # $2 (TOKEN_FILENAME) The name of the file containing the token to be served for HTTP validation + # Should be served by your web server as /.well-known/acme-challenge/${TOKEN_FILENAME}. + # $3 (TOKEN_VALUE) The token value that needs to be served for validation. + # For HTTP validation it is the value that is expected be found in the $TOKEN_FILENAME file. + # For DNS validation, this is what you want to put in the _acme-challenge TXT record. + + local DOMAIN="$1" TOKEN_FILENAME="$2" TOKEN_VALUE="$3" # Simple example: Use nsupdate with local named # printf 'server 127.0.0.1\nupdate add _acme-challenge.%s 300 IN TXT "%s"\nsend\n' "$DOMAIN" "$TOKEN_VALUE" | nsupdate -k /var/run/named/session.key @@ -139,11 +192,18 @@ deploy_challenge() { } +# Called after attempting to validate each domain, whether or not validation was successful. +# Can be used to delete files or DNS records that are no longer needed. clean_challenge() { - local DOMAIN="$1" TOKEN_FILENAME="$2" TOKEN_VALUE="$3" + # Parameters: + # $1 (DOMAIN) The domain name (CN or subject alternative name) being validated. + # $2 (TOKEN_FILENAME) The name of the file containing the token to be served for HTTP validation + # Should be served by your web server as /.well-known/acme-challenge/${TOKEN_FILENAME}. + # $3 (TOKEN_VALUE) The token value that needs to be served for validation. + # For HTTP validation it is the value that is expected be found in the $TOKEN_FILENAME file. + # For DNS validation, this is what you want to put in the _acme-challenge TXT record. - # This hook is called after attempting to validate each domain, whether or not validation was successful. Here you can delete files or DNS records that are no longer needed. - # The parameters are the same as for deploy_challenge. + local DOMAIN="$1" TOKEN_FILENAME="$2" TOKEN_VALUE="$3" # Simple example: Use nsupdate with local named # printf 'server 127.0.0.1\nupdate delete _acme-challenge.%s TXT "%s"\nsend\n' "$DOMAIN" "$TOKEN_VALUE" | nsupdate -k /var/run/named/session.key @@ -152,38 +212,37 @@ clean_challenge() { } +# Called after the certificates have been created but before they are symlinked. +# This allows the sync the files to disk to prevent creating a symlink to empty files on unexpected system crashes. +# This hook is not intended to be used for further processing of certificate files; see deploy_cert for that. sync_cert() { + # Parameters: + # $1 (KEYFILE) The path of the file containing the private key. + # $2 (CERTFILE) The path of the file containing the signed certificate. + # $3 (FULLCHAINFILE) The path of the file containing the full certificate chain. + # $4 (CHAINFILE) The path of the file containing the intermediate certificate(s). + # $5 (REQUESTFILE) The path of the file containing the certificate signing request. + local KEYFILE="$1" CERTFILE="$2" FULLCHAINFILE="$3" CHAINFILE="$4" REQUESTFILE="$5" - # This hook is called after the certificates have been created but before they are symlinked. - # This allows you to sync the files to disk to prevent creating a symlink to empty files on unexpected system crashes. - # This hook is not intended to be used for further processing of certificate files; see deploy_cert for that. - # Parameters: - # KEYFILE - The path of the file containing the private key. - # CERTFILE - The path of the file containing the signed certificate. - # FULLCHAINFILE - The path of the file containing the full certificate chain. - # CHAINFILE - The path of the file containing the intermediate certificate(s). - # REQUESTFILE - The path of the file containing the certificate signing request. - - # Simple example: sync the files before symlinking them - # sync "$KEYFILE" "$CERTFILE" "$FULLCHAINFILE" "$CHAINFILE" "$REQUESTFILE" + sync "$KEYFILE" "$CERTFILE" "$FULLCHAINFILE" "$CHAINFILE" "$REQUESTFILE" return 0 } +# Called once for each certificate that has been produced. +# Here you can copy your new certificates to service-specific locations and reload the service. deploy_cert() { - local DOMAIN="$1" KEYFILE="$2" CERTFILE="$3" FULLCHAINFILE="$4" CHAINFILE="$5" TIMESTAMP="$6" - - # This hook is called once for each certificate that has been produced. - # Here you might, for instance, copy your new certificates to service-specific locations and reload the service. # Parameters: - # DOMAIN - The primary domain name, i.e. the certificate common name (CN). - # KEYFILE - The path of the file containing the private key. - # CERTFILE - The path of the file containing the signed certificate. - # FULLCHAINFILE - The path of the file containing the full certificate chain. - # CHAINFILE - The path of the file containing the intermediate certificate(s). - # TIMESTAMP - Timestamp when the specified certificate was created. + # $1 (DOMAIN) The primary domain name, i.e. the certificate common name (CN). + # $2 (KEYFILE) The path of the file containing the private key. + # $3 (CERTFILE) The path of the file containing the signed certificate. + # $4 (FULLCHAINFILE) The path of the file containing the full certificate chain. + # $5 (CHAINFILE) The path of the file containing the intermediate certificate(s). + # $6 (TIMESTAMP) Timestamp when the specified certificate was created. + + local DOMAIN="$1" KEYFILE="$2" CERTFILE="$3" FULLCHAINFILE="$4" CHAINFILE="$5" TIMESTAMP="$6" local FILE LOG_PREFIX="Certificate deployment" @@ -198,9 +257,10 @@ deploy_cert() { } done - # The first time through this will create the files readable by root only, but better to err on the side of caution. - # Subsequent runs will retain whatever permissions were set by the admin after the first run. + # Only copy the certificate if it differs from the new one. cmp "$CERTFILE" "$CERTSDIR/${DOMAIN}_cert.pem" >/dev/null 2>&1 || { + # The first time through this will create the files readable by root only, but better to err on the side of caution. + # Subsequent runs will retain whatever permissions were set by the admin after the first run. umask 066 # shellcheck disable=SC2015 cat "$CERTFILE" >"$CERTSDIR/${DOMAIN}_cert.pem" && cat "$KEYFILE" >"$CERTSDIR/${DOMAIN}_key.pem" && cat "$CHAINFILE" >"$CERTSDIR/${DOMAIN}_chain.pem" && cat "$FULLCHAINFILE" >"$CERTSDIR/${DOMAIN}_fullchain.pem" || { @@ -211,7 +271,7 @@ deploy_cert() { } # Set a marker (used in the exit_hook function) to signal that services should be reloaded at the end of deployments. - touch /run/dehydrated-reload-marker || { + touch "/run/dehydrated-reload-marker" || { notify "warning" "Failed to create reload marker during '$DOMAIN' certificate deployment - reloading services manually may be required -- check server" # Return 0 so that dehydrated doesn't stop - there may be some more certificates to renew. return 0 @@ -225,15 +285,15 @@ deploy_cert() { } +# Called once for each updated OCSP stapling file that has been produced. +# Here you can copy your new OCSP stapling files to service-specific locations and reload the service. deploy_ocsp() { - local DOMAIN="$1" OCSPFILE="$2" TIMESTAMP="$3" - - # This hook is called once for each updated ocsp stapling file that has been produced. - # Here you might, for instance, copy your new ocsp stapling files to service-specific locations and reload the service. # Parameters: - # DOMAIN - The primary domain name, i.e. the certificate common name (CN). - # OCSPFILE - The path of the ocsp stapling file. - # TIMESTAMP - Timestamp when the specified ocsp stapling file was created. + # $1 (DOMAIN) The primary domain name, i.e. the certificate common name (CN). + # $2 (OCSPFILE) The path of the OCSP stapling file. + # $3 (TIMESTAMP) Timestamp when the specified OCSP stapling file was created. + + local DOMAIN="$1" OCSPFILE="$2" TIMESTAMP="$3" # Simple example: Copy file to nginx config # cp "$OCSPFILE" /etc/nginx/ssl/; chown -R nginx: /etc/nginx/ssl @@ -243,28 +303,28 @@ deploy_ocsp() { } +# Called once for each certificate that is still valid and therefore wasn't reissued. unchanged_cert() { - local DOMAIN="$1" KEYFILE="$2" CERTFILE="$3" FULLCHAINFILE="$4" CHAINFILE="$5" - - # This hook is called once for each certificate that is still valid and therefore wasn't reissued. # Parameters: - # DOMAIN - The primary domain name, i.e. the certificate common name (CN). - # KEYFILE - The path of the file containing the private key. - # CERTFILE - The path of the file containing the signed certificate. - # FULLCHAINFILE - The path of the file containing the full certificate chain. - # CHAINFILE - The path of the file containing the intermediate certificate(s). + # $1 (DOMAIN) The primary domain name, i.e. the certificate common name (CN). + # $2 (KEYFILE) The path of the file containing the private key. + # $3 (CERTFILE) The path of the file containing the signed certificate. + # $4 (FULLCHAINFILE) The path of the file containing the full certificate chain. + # $5 (CHAINFILE) The path of the file containing the intermediate certificate(s). + + local DOMAIN="$1" KEYFILE="$2" CERTFILE="$3" FULLCHAINFILE="$4" CHAINFILE="$5" return 0 } +# Called if the challenge response has failed, so domain owners can be aware and act accordingly. invalid_challenge() { - local DOMAIN="$1" RESPONSE="$2" - - # This hook is called if the challenge response has failed, so domain owners can be aware and act accordingly. # Parameters: - # DOMAIN - The primary domain name, i.e. the certificate common name (CN). - # RESPONSE - The response that the verification server returned + # $1 (DOMAIN) The primary domain name, i.e. the certificate common name (CN). + # $2 (RESPONSE) The response that the verification server returned + + local DOMAIN="$1" RESPONSE="$2" # Notify the sysadmin. notify "error" "Validation of '$DOMAIN' failed:" "$RESPONSE" @@ -273,154 +333,174 @@ invalid_challenge() { } +# Called when an HTTP request fails (e.g., when the ACME server is busy, returns an error, etc). +# It will be called upon any response code that does not start with '2'. Useful to alert admins about problems with requests. request_failure() { + # Parameters: + # $1 (STATUSCODE) The HTML status code that originated the error. + # $2 (REASON) The specified reason for the error. + # $3 (REQTYPE) The kind of request that was made (GET, POST...) + local STATUSCODE="$1" REASON="$2" REQTYPE="$3" HEADERS="$4" - # This hook is called when an HTTP request fails (e.g., when the ACME server is busy, returns an error, etc). - # It will be called upon any response code that does not start with '2'. Useful to alert admins about problems with requests. - # Parameters: - # STATUSCODE - The HTML status code that originated the error. - # REASON - The specified reason for the error. - # REQTYPE - The kind of request that was made (GET, POST...) - # Notify the sysadmin. - notify "error" "HTTP $REQTYPE request failed for '$DOMAIN' with code '$STATUSCODE'" "Reason: $REASON" "Headers:" "$HEADERS" + notify "error" "HTTP '$REQTYPE' request failed for '$DOMAIN' with code '$STATUSCODE'" "Reason: $REASON" "Headers:" "$HEADERS" return 0 } +# Called before any certificate signing operation takes place. +# It can be used to generate or fetch a certificate signing request with external tools. +# The output should be just the cerificate signing request formatted as PEM. generate_csr() { + # Parameters: + # $1 (DOMAIN) The primary domain as specified in domains.txt. + # This does not need to match with the domains in the CSR, it's basically just the directory name. + # $2 (CERTDIR) Certificate output directory for this particular certificate. + # Can be used for storing additional files. + # $3 (ALTNAMES) All domain names for the current certificate as specified in domains.txt. + # Again, this doesn't need to match with the CSR, it's just there for convenience. + local DOMAIN="$1" CERTDIR="$2" ALTNAMES="$3" - # This hook is called before any certificate signing operation takes place. - # It can be used to generate or fetch a certificate signing request with external tools. - # The output should be just the cerificate signing request formatted as PEM. - # Parameters: - # DOMAIN - The primary domain as specified in domains.txt. - # This does not need to match with the domains in the CSR, it's basically just the directory name. - # CERTDIR - Certificate output directory for this particular certificate. - # Can be used for storing additional files. - # ALTNAMES - All domain names for the current certificate as specified in domains.txt. - # Again, this doesn't need to match with the CSR, it's just there for convenience. - # Simple example: Look for pre-generated CSRs - # if [ -e "$CERTDIR/pre-generated.csr" ]; then - # cat "$CERTDIR/pre-generated.csr" - # fi + # [[ -e "$CERTDIR/pre-generated.csr" ]] && cat "$CERTDIR/pre-generated.csr" return 0 } +# Called before the cron command to do some initial tasks (e.g. starting a webserver). startup_hook() { - # This hook is called before the cron command to do some initial tasks (e.g. starting a webserver). - local LOG_PREFIX="Dehydrated startup" - # Read services configuration (with sanity check) - services 1 || return 1 + # The 'root' user is required. + (( $(id -u) != 0 )) && { + notify "error" "Must be running as 'root' -- aborting" + return 1 + } + + # Read services configuration (with sanity checks). + services "1" # Make sure the certificates directory exists. [[ -n "$CERTSDIR" ]] && { umask 022 # shellcheck disable=SC2174 mkdir -p -m 0755 "$CERTSDIR" 2>/dev/null || { - notify "error" "Failed to create certificate storage directory -- aborting" + notify "error" "Failed to create certificate storage directory '$CERTSDIR' -- aborting" return 1 } } - # If an HTTP daemon rc script is available and the service is not already running, start it. - [[ -n "$RCFILE_HTTPD" ]] && { - pgrep -c ${PIDFILE_HTTPD:+-F "$PIDFILE_HTTPD"} "$DAEMON_HTTPD" >/dev/null 2>&1 || { - "$RCFILE_HTTPD" start >/dev/null 2>&1 + # If an HTTP daemon is not already running, start it. + [[ -n "${SERVICE_CTL['httpd']}" ]] && { + pgrep -c ${SERVICE_PIDFILE['httpd']:+-F "${SERVICE_PIDFILE['httpd']}"} "${SERVICE_DAEMON['httpd']}" >/dev/null 2>&1 || { + "${SERVICE_CTL['httpd']}" "start" >/dev/null 2>&1 sleep 5 - if pgrep -c ${PIDFILE_HTTPD:+-F "$PIDFILE_HTTPD"} "$DAEMON_HTTPD" >/dev/null 2>&1; then + if pgrep -c ${SERVICE_PIDFILE['httpd']:+-F "${SERVICE_PIDFILE['httpd']}"} "${SERVICE_DAEMON['httpd']}" >/dev/null 2>&1; then # Set a marker (used in exit_hook()) to signal that the HTTP daemon should be stopped at the end of deployments. - touch /run/dehydrated-http-daemon-stop-marker 2>/dev/null || notify "warning" "Failed to create HTTP daemon stop marker - HTTP daemon will be left running -- check server" + touch "/run/dehydrated-http-daemon-stop-marker" 2>/dev/null || notify "warning" "Failed to create HTTP daemon stop marker - HTTP daemon will be left running -- check server" else - notify "error" "Failure of '$RCFILE_HTTPD' to start HTTP daemon -- aborting" + notify "error" "Failed to start HTTP daemon for nonce validation -- aborting" return 1 fi } - } - # Add firewall rules to allow HTTP traffic so the nonce can be validated. - { iptables -N dehydrated && ip6tables -N dehydrated && iptables -I INPUT 1 -j dehydrated && ip6tables -I INPUT 1 -j dehydrated && iptables -I dehydrated 1 -p tcp --syn --dport 80 -m conntrack --ctstate NEW -j ACCEPT && ip6tables -I dehydrated 1 -p tcp --syn --dport 80 -m conntrack --ctstate NEW -j ACCEPT; } >/dev/null 2>&1 || { - notify "error" "Failed to insert firewall rules to allow nonce validation -- aborting" - return 1 + # Add firewall rules to allow HTTP traffic so the nonce can be validated. + { iptables -N dehydrated && ip6tables -N dehydrated && \ + iptables -I INPUT 1 -j dehydrated && ip6tables -I INPUT 1 -j dehydrated && \ + iptables -I dehydrated 1 -p tcp --dport 80 -j ACCEPT && ip6tables -I dehydrated 1 -p tcp --dport 80 -j ACCEPT; } >/dev/null 2>&1 || { + notify "warning" "Failed to insert firewall rules to allow nonce validation" + return 1 + } } return 0 } +# Called at the end of the cron command and can be used to do some final (cleanup or other) tasks. exit_hook() { - local ERROR="$1" - - # This hook is called at the end of the cron command and can be used to do some final (cleanup or other) tasks. # Parameters: - # ERROR - Contains error message if dehydrated exits with error. + # $1 (ERROR) Contains error message if dehydrated exits with error. - local DAEMON ERR=0 LOG_PREFIX="Dehydrated shutdown" PIDFILE RCFILE TIMEOUT=30 + local ERROR="$1" + local ERR=0 LOG_PREFIX="Dehydrated shutdown" SERVICE TIMEOUT=30 # Read services configuration (without sanity check - this was already done at startup) - services 0 || return 1 + services 0 - # Delete firewall rules that was added to allow HTTP traffic. - iptables -C INPUT -j dehydrated >/dev/null 2>&1 && iptables -D INPUT -j dehydrated >/dev/null 2>&1 - ip6tables -C INPUT -j dehydrated >/dev/null 2>&1 && ip6tables -D INPUT -j dehydrated >/dev/null 2>&1 - iptables -F dehydrated >/dev/null 2>&1 - ip6tables -F dehydrated >/dev/null 2>&1 - iptables -X dehydrated >/dev/null 2>&1 - ip6tables -X dehydrated >/dev/null 2>&1 - # If the reload marker was set, restart services. - [[ -e /run/dehydrated-reload-marker ]] && { - for RCFILE in "${!RCFILE_@}"; do - DAEMON="DAEMON_${RCFILE#RCFILE_}" - PIDFILE="PIDFILE_${RCFILE#RCFILE_}" + [[ -e "/run/dehydrated-reload-marker" ]] && { + local IFS=$'\n' + for SERVICE in $(printf "%s\\n" "${!SERVICE_CTL[@]}"); do # If the HTTP daemon is going to be shut down, there's no need to restart it. - [[ "$RCFILE" == "RCFILE_HTTPD" ]] && [[ -e /run/dehydrated-http-daemon-stop-marker ]] && continue - # Restart the service. - "${!RCFILE}" restart >/dev/null 2>&1 || notify "warning" "Failed to restart service '${!DAEMON}' -- check server" + [[ "$SERVICE" == "httpd" ]] && [[ -e "/run/dehydrated-http-daemon-stop-marker" ]] && continue + + # Restart the services. + "${SERVICE_CTL[\"$SERVICE\"]}" "restart" >/dev/null 2>&1 || { + notify "error" "Controlled restart of service '$SERVICE' failed -- check server" + ERR=1 + continue + } sleep "$TIMEOUT" - pgrep -c ${PIDFILE:+-F "${!PIDFILE}"} "${!DAEMON}" >/dev/null 2>&1 || { - notify "warning" "Service '${!DAEMON}' exited unexpectedly - trying to start again" - "${!RCFILE}" start >/dev/null 2>&1 || notify "warning" "Failed to start service '${!DAEMON}' -- check server" - sleep "$TIMEOUT" - pgrep -c ${PIDFILE:+-F "${!PIDFILE}"} "${!DAEMON}" >/dev/null 2>&1 || { - notify "warning" "Service '${!DAEMON}' failed to restart correctly -- check server" + pgrep -c ${SERVICE_PIDFILE["$SERVICE"]:+-F "${SERVICE_PIDFILE[\"$SERVICE\"]}"} "${SERVICE_DAEMON[\"$SERVICE\"]}" >/dev/null 2>&1 || { + notify "warning" "Service '$SERVICE' exited unexpectedly - trying to start again" + "${SERVICE_CTL[\"$SERVICE\"]}" "start" >/dev/null 2>&1 || { + notify "error" "Controlled start of service '$SERVICE' failed -- check server" ERR=1 + continue + } + sleep "$TIMEOUT" + pgrep -c ${SERVICE_PIDFILE["$SERVICE"]:+-F "${SERVICE_PIDFILE[\"$SERVICE\"]}"} "${SERVICE_DAEMON[\"$SERVICE\"]}" >/dev/null 2>&1 || { + notify "error" "Multiple failures (re)starting service '$SERVICE' -- check server" + ERR=1 + continue } } done } # Remove the reload marker if all services restarted without issue. Keep the marker if any failed. - ((ERR == 0)) && { rm -f /run/dehydrated-reload-marker 2>/dev/null || notify "warning" "Failed to remove services reload marker -- check server"; } - - # If an HTTP daemon was started by dehydrated, stop it now. - ERR=0 - [[ -e /run/dehydrated-http-daemon-stop-marker ]] && { - pgrep -c ${PIDFILE_HTTPD:+-F "$PIDFILE_HTTPD"} "$DAEMON_HTTPD" >/dev/null 2>&1 && { - "$RCFILE_HTTPD" stop >/dev/null 2>&1 || notify "warning" "Failed to gracefully stop service '$DAEMON_HTTPD' -- check server" - sleep "$TIMEOUT" - pgrep -c ${PIDFILE_HTTPD:+-F "$PIDFILE_HTTPD"} "$DAEMON_HTTPD" >/dev/null 2>&1 && { - pkill -TERM ${PIDFILE_HTTPD:+-F "$PIDFILE_HTTPD"} "$DAEMON_HTTPD" >/dev/null 2>&1 || notify "warning" "Failed to -SIGTERM service '$DAEMON_HTTPD' -- check server" - sleep "$TIMEOUT" - pgrep -c ${PIDFILE_HTTPD:+-F "$PIDFILE_HTTPD"} "$DAEMON_HTTPD" >/dev/null 2>&1 && { - pkill -KILL ${PIDFILE_HTTPD:+-F "$PIDFILE_HTTPD"} "$DAEMON_HTTPD" >/dev/null 2>&1 || notify "warning" "Failed to -SIGKILL service '$DAEMON_HTTPD' -- check server" - sleep 5 - } - } - pgrep -c ${PIDFILE_HTTPD:+-F "$PIDFILE_HTTPD"} "$DAEMON_HTTPD" >/dev/null 2>&1 && notify "warning" "Failed to stop HTTP daemon that dehydrated started" && ERR=1 - } + (( ERR == 0 )) && { + rm -f "/run/dehydrated-reload-marker" 2>/dev/null || notify "warning" "Failed to remove services reload marker -- check server" } - # If the HTTP daemon was stopped correctly, remove the stop marker. - ((ERR == 0)) && { rm -f /run/dehydrated-http-daemon-stop-marker 2>/dev/null || notify "warning" "Failed to remove HTTP daemon stop marker -- check server"; } + # If an HTTP daemon is configured, process the shutdown of it. + [[ -n "${SERVICE_CTL['httpd']}" ]] && { + # Delete firewall rules that were added to allow HTTP traffic. + { iptables -C INPUT -j dehydrated && iptables -D INPUT -j dehydrated; } >/dev/null 2>&1 + { ip6tables -C INPUT -j dehydrated && ip6tables -D INPUT -j dehydrated; } >/dev/null 2>&1 + iptables -F dehydrated >/dev/null 2>&1 + ip6tables -F dehydrated >/dev/null 2>&1 + iptables -X dehydrated >/dev/null 2>&1 + ip6tables -X dehydrated >/dev/null 2>&1 + + # If an HTTP daemon was started in startup_hook(), stop it now. + ERR=0 + [[ -e "/run/dehydrated-http-daemon-stop-marker" ]] && { + pgrep -c ${SERVICE_PIDFILE['httpd']:+-F "${SERVICE_PIDFILE['httpd']}"} "${SERVICE_DAEMON['httpd']}" >/dev/null 2>&1 && { + "${SERVICE_CTL['httpd']}" "stop" >/dev/null 2>&1 || notify "error" "Controlled stop service of 'httpd' failed -- check server" + sleep "$TIMEOUT" + pgrep -c ${SERVICE_PIDFILE['httpd']:+-F "${SERVICE_PIDFILE['httpd']}"} "${SERVICE_DAEMON['httpd']}" >/dev/null 2>&1 && { + pkill -TERM ${SERVICE_PIDFILE['httpd']:+-F "${SERVICE_PIDFILE['httpd']}"} "${SERVICE_DAEMON['httpd']}" >/dev/null 2>&1 || notify "warning" "Failed to SIGTERM service 'httpd' -- check server" + sleep "$TIMEOUT" + pgrep -c ${SERVICE_PIDFILE['httpd']:+-F "${SERVICE_PIDFILE['httpd']}"} "${SERVICE_DAEMON['httpd']}" >/dev/null 2>&1 && { + pkill -KILL ${SERVICE_PIDFILE['httpd']:+-F "${SERVICE_PIDFILE['httpd']}"} "${SERVICE_DAEMON['httpd']}" >/dev/null 2>&1 || notify "warning" "Failed to SIGKILL service 'httpd' -- check server" + sleep 5 + } + } + pgrep -c ${SERVICE_PIDFILE['httpd']:+-F "${SERVICE_PIDFILE['httpd']}"} "${SERVICE_DAEMON['httpd']}" >/dev/null 2>&1 && notify "error" "Failed to stop HTTP daemon that dehydrated started" && ERR=1 + } + } + + # If the HTTP daemon was stopped correctly, remove the stop marker. + (( ERR == 0 )) && { + rm -f "/run/dehydrated-http-daemon-stop-marker" 2>/dev/null || notify "warning" "Failed to remove HTTP daemon stop marker -- check server" + } + } return 0 } @@ -433,4 +513,4 @@ if declare -pF "$HANDLER" >/dev/null 2>&1; then exit "$?" else exit 0 -fi +fi diff --git a/var/www/.gitignore b/var/www/.gitignore new file mode 100644 index 0000000..ac7af2e --- /dev/null +++ b/var/www/.gitignore @@ -0,0 +1 @@ +/html/ diff --git a/var/www/dehydrated/.gitignore b/var/www/dehydrated/.gitignore new file mode 100644 index 0000000..a68d087 --- /dev/null +++ b/var/www/dehydrated/.gitignore @@ -0,0 +1,2 @@ +/* +!/.gitignore