- no longer using :latest by default in values.yaml, instead updating version with each release - set chart version to match app version in Chart.yaml - update version in helm chart and values.yaml as part of update-version.sh script - update test.yaml and local-config.yaml to enable using :latest tag images - ci: add ci script for packaging current helm chart - docs: updates docs to indicate deploying directly from GitHub release - docs: add script to fill in latest version for 'VERSION' using custom script - chart: set local_service_port to 30870 by default, but use only if no ingress. - default values.yaml set up for local deployment, local-config.yaml contains additional commented out examples - ci draft: add deployment info to draft with helm install command for current version - test: fix password check test
		
			
				
	
	
		
			58 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			58 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
| "A small dirty script to check that none of the password config options have been set to real passwords"
 | |
| from collections.abc import Generator
 | |
| import yaml
 | |
| from yaml.parser import ParserError
 | |
| from yaml.scanner import ScannerError
 | |
| from yaml.constructor import ConstructorError
 | |
| import sys
 | |
| 
 | |
| 
 | |
| ALLOWED_PASSWORDS = ["PassW0rd!", "password", "PASSWORD@", "PASSW0RD!", "PASSWORD!"]
 | |
| 
 | |
| def key_finder(d: dict, key: str = "password", top_level = None) -> Generator:
 | |
|     """This recursive function yields all the keys in {d} that _contains_ the string {key}
 | |
| 
 | |
|     :param dict d: The dictionary to dive through
 | |
|     :param str key: The phrase we are going to match keys against
 | |
|     :return: A generator that creates tuples containing Optional[top_level_key], key, value
 | |
|     :rtype Union[tuple[str, str], tuple[str, str, str]]
 | |
|     """
 | |
|     if d is None:
 | |
|         return {}
 | |
|     for k, v in d.items():
 | |
|         if isinstance(v, dict):
 | |
|             if top_level is None:
 | |
|                 yield from key_finder(v, key, k) # Pass the top level name into the recursive descent
 | |
|             else:
 | |
|                 yield from key_finder(v, key, top_level) # name isn't the top level key
 | |
|         if key in str(k): # Sometimes yaml gets parsed with key True
 | |
|             if top_level is None:
 | |
|                 yield k, v # Key is already top level
 | |
|             else:
 | |
|                 yield top_level, k, v # Use the top level name
 | |
| 
 | |
| WE_DUN_GOOFED: bool = False
 | |
| 
 | |
| changed_files = sys.argv[1:] # Ignore filename of this script
 | |
| for file in changed_files:
 | |
|     with open(file, 'r') as f:
 | |
|         try:
 | |
|             yml = yaml.safe_load(f)
 | |
|             gen = key_finder(yml)
 | |
|             for password_keys in gen:
 | |
|                 if password_keys[-1] not in ALLOWED_PASSWORDS:
 | |
|                     if len(password_keys) == 2:
 | |
|                         print(f"top level key '{password_keys[0]}' in {file} contains a real password!")
 | |
|                     else:
 | |
|                         print(f"top level key '{password_keys[0]}' with subkey '{password_keys[1]}' in {file} contains a real password!")
 | |
|                     WE_DUN_GOOFED = True
 | |
|         except (ScannerError, ParserError):
 | |
|             print(f"Couldn't parse yaml file for: {file}")
 | |
|             pass
 | |
|         except ConstructorError:
 | |
|             print(f"Couldn't construct yaml file: {file}")
 | |
|             pass
 | |
| 
 | |
| if WE_DUN_GOOFED:
 | |
|     exit(1)
 |