11#!/usr/bin/env python3
2-
32import argparse
43import subprocess
54import sys
65from pathlib import Path
6+ import re
7+
8+ KIND_SECRET_RE = re .compile (r'^\s*kind:\s*Secret\s*$' , flags = re .I | re .M )
9+ KIND_SEALED_RE = re .compile (r'^\s*kind:\s*SealedSecret\s*$' , flags = re .I | re .M )
710
811def seal_secrets (files , controller_name , controller_namespace ):
12+ failures = 0
913 for file_path in files :
1014 file = Path (file_path )
15+ print (f"\n --- Processing: { file } ---" )
1116 if not file .exists ():
1217 print (f"Warning: File { file } does not exist, skipping" )
1318 continue
1419
1520 if ".sealed." in file .name :
16- print (f"File is already sealed: { file } , skipping" )
21+ print (f"File is already sealed (name contains .sealed.): { file } , skipping" )
22+ continue
23+
24+ try :
25+ content = file .read_text ()
26+ except Exception as e :
27+ print (f"❌ Cannot read { file } : { e } " )
28+ failures += 1
29+ continue
30+
31+ if KIND_SEALED_RE .search (content ):
32+ print (f"File already contains a SealedSecret resource, skipping: { file } " )
33+ continue
34+
35+ if not KIND_SECRET_RE .search (content ):
36+ print (f"No 'kind: Secret' found in { file } . Skipping (not a Secret)." )
1737 continue
1838
1939 kubeseal_cmd = [
@@ -26,25 +46,33 @@ def seal_secrets(files, controller_name, controller_namespace):
2646 sealed_file = file .with_name (f"{ file .stem } .sealed{ file .suffix } " )
2747
2848 try :
29- with Path (file ).open ("rb" ) as f :
30- result = subprocess .run (
31- kubeseal_cmd ,
32- input = f .read (),
33- capture_output = True ,
34- check = True ,
35- text = False ,
36- )
37- sealed_file .write_bytes (result .stdout )
49+ proc = subprocess .run (
50+ kubeseal_cmd ,
51+ input = content .encode (),
52+ capture_output = True ,
53+ check = True ,
54+ )
55+ sealed_file .write_bytes (proc .stdout )
3856 print (f"✅ Sealed secret created: { sealed_file } " )
3957 except subprocess .CalledProcessError as e :
40- print (f"❌ Error sealing { file } : { e .stderr .decode ()} " )
41- sys .exit (1 )
58+ stderr = e .stderr .decode (errors = "replace" ) if e .stderr else str (e )
59+ print (f"❌ Error sealing { file } : { stderr } " )
60+ failures += 1
61+ except Exception as e :
62+ print (f"❌ Unexpected error sealing { file } : { e } " )
63+ failures += 1
64+
65+ if failures :
66+ print (f"\n Finished with { failures } failure(s)." )
67+ sys .exit (1 )
68+ else :
69+ print ("\n All done: no failures." )
70+ sys .exit (0 )
4271
43- if __name__ == "__main__" :
72+ if name == "__main__" :
4473 parser = argparse .ArgumentParser (description = "Seal Kubernetes secrets using kubeseal" )
4574 parser .add_argument ("--controller-name" , required = True , help = "Name of the sealed secrets controller" )
4675 parser .add_argument ("--controller-namespace" , required = True , help = "Namespace of the sealed secrets controller" )
4776 parser .add_argument ("files" , nargs = "+" , help = "Secret files to process" )
48-
4977 args = parser .parse_args ()
5078 seal_secrets (args .files , args .controller_name , args .controller_namespace )
0 commit comments