@@ -8,6 +8,7 @@ from argparse import ArgumentParser
88from collections import namedtuple
99from configparser import ConfigParser , NoOptionError
1010from contextlib import suppress
11+ from operator import attrgetter
1112from tempfile import NamedTemporaryFile
1213from textwrap import dedent
1314
@@ -19,17 +20,15 @@ class CaddyfileGenerator:
1920 "alias_domains" ,
2021 "backend_authority" ,
2122 "domain" ,
23+ "hsts_preload" ,
2224 ],
2325 )
2426
2527 def __init__ (self ):
26- self ._redir_target_of = {}
27- self ._backend_of = {}
28+ self ._sites = []
2829
2930 def add (self , site ):
30- self ._backend_of [site .domain ] = site .backend_authority
31- for domain in site .alias_domains :
32- self ._redir_target_of [domain ] = site .domain
31+ self ._sites .append (site )
3332
3433 def write_to (self , fp ):
3534 print (
@@ -44,33 +43,40 @@ class CaddyfileGenerator:
4443 file = fp ,
4544 )
4645
47- for domain , backend_authority in sorted (self ._backend_of .items ()):
48- if backend_authority is None :
49- continue
46+ sites_with_backends : list [self .Site ] = [
47+ s for s in self ._sites if s .backend_authority is not None
48+ ]
49+ sites_with_alias_domains : list [self .Site ] = [s for s in self ._sites if s .alias_domains ]
50+
51+ for site in sorted (sites_with_backends , key = attrgetter ("domain" )):
52+ hsts_header_value = "max-age=63072000; includeSubDomains"
53+ if site .hsts_preload :
54+ hsts_header_value += "; preload"
5055
5156 print (
5257 dedent ("""
5358 %s {
5459 import common
5560 reverse_proxy %s {
56- header_down +Strict-Transport-Security "max-age=63072000; includeSubDomains; preload "
61+ header_down +Strict-Transport-Security "%s "
5762 }
58- }""" ) # noqa: E501
59- % (domain , backend_authority ),
60- file = fp ,
61- )
62-
63- for source_domain , target_domain in sorted (self ._redir_target_of .items ()):
64- print (
65- dedent ("""
66- %s {
67- import common
68- redir https://%s{uri}
6963 }""" )
70- % (source_domain , target_domain ),
64+ % (site . domain , site . backend_authority , hsts_header_value ),
7165 file = fp ,
7266 )
7367
68+ for site in sorted (sites_with_alias_domains , key = attrgetter ("domain" )):
69+ for alias_domain in sorted (site .alias_domains ):
70+ print (
71+ dedent ("""
72+ %s {
73+ import common
74+ redir https://%s{uri}
75+ }""" )
76+ % (alias_domain , site .domain ),
77+ file = fp ,
78+ )
79+
7480
7581def run (options ):
7682 config = ConfigParser ()
@@ -89,7 +95,9 @@ def run(options):
8995 except NoOptionError :
9096 backend_authority = None
9197
92- site = CaddyfileGenerator .Site (alias_domains , backend_authority , domain )
98+ hsts_preload = config .getboolean (domain , "hsts_preload" , fallback = False )
99+
100+ site = CaddyfileGenerator .Site (alias_domains , backend_authority , domain , hsts_preload )
93101 caddyfile .add (site )
94102
95103 with NamedTemporaryFile () as temp_file :
0 commit comments