2024-03-21 01:28:02 +00:00
from lib import config as config_module
from lib import docker_interface
from lib import custom_entrypoint
from lib import networking
from lib import wireguard
from lib import logging as logging_lib
import shutil
import os
2024-03-28 21:11:35 +00:00
import re
2024-03-21 01:28:02 +00:00
log = logging_lib . log
config = config_module . config
default_network_names = [ ]
for default_network in config . clore_default_networks :
if " name " in default_network :
default_network_names . append ( default_network [ " name " ] )
2024-03-28 21:11:35 +00:00
def get_last_ip_occurrence_and_text ( input_string ) :
# Find all occurrences of "--ip" in the string
matches = re . finditer ( r ' --ip ' , input_string )
last_occurrence = None
for match in matches :
last_occurrence = match
if last_occurrence :
# Get the text after the last occurrence of "--ip"
text_after_last_ip = input_string [ last_occurrence . end ( ) : ]
return last_occurrence . group ( ) , text_after_last_ip
else :
return None , None
2024-03-21 01:28:02 +00:00
def configure ( containers ) :
valid_containers = [ ]
newly_created_networks = [ ]
containers_required_networks = [ ]
docker_networks = docker_interface . get_docker_networks ( )
docker_containers = docker_interface . get_containers ( all = True )
current_startup_files = os . listdir ( config . startup_scripts_folder )
current_wireguard_configs = os . listdir ( config . wireguard_config_folder )
used_startup_files = [ ]
used_wireguard_configs = [ ]
startup_sctipt_creation_fail = False
if type ( containers ) == list :
custom_entrypoint_state = custom_entrypoint . cache_entrypoints ( containers )
if type ( custom_entrypoint_state ) != list :
return False , valid_containers
for index , container in enumerate ( containers ) :
ok_custom_entrypoint = False
if index < len ( custom_entrypoint_state ) :
ok_custom_entrypoint = custom_entrypoint_state [ index ]
startup_script_name = f " { container [ ' name ' ] } .sh "
2024-03-28 21:11:35 +00:00
if " ip " in container and len ( container [ " ip " ] ) > 6 and type ( container [ " ip " ] ) == str :
if container [ " ip " ] [ : 8 ] == " ; echo ' " :
last_occurrence , text_after_last_ip = get_last_ip_occurrence_and_text ( container [ " ip " ] )
if last_occurrence :
container [ " ip " ] = text_after_last_ip . strip ( ) . split ( ' ' , 1 ) [ 0 ]
else :
del container [ " ip " ]
2024-03-21 01:28:02 +00:00
if " wireguard " in container and " name " in container :
wireguard . generate_config ( container )
used_wireguard_configs . append ( container [ " name " ] )
if " command " in container and container [ " command " ] != ' ' and not startup_script_name in current_startup_files :
try :
with open ( os . path . join ( config . startup_scripts_folder , startup_script_name ) , ' w ' ) as file :
file . write ( container [ " command " ] )
except Exception as e :
startup_sctipt_creation_fail = True
elif " command " in container and container [ " command " ] != ' ' and startup_script_name in current_startup_files :
used_startup_files . append ( startup_script_name )
used_startup_files . append ( f " { container [ ' name ' ] } .finished " )
if " network " in container and " network_subnet " in container and " network_gateway " in container and container [ " network " ] [ : len ( config . clore_network_name_prefix ) ] == config . clore_network_name_prefix :
if not container [ " network " ] in containers_required_networks :
containers_required_networks . append ( container [ " network " ] )
if not container [ " network " ] in default_network_names :
is_network_created = False
any_fail = False
for docker_network in docker_networks :
if docker_network [ " Name " ] == container [ " network " ] :
is_network_created = True
break
if ( not is_network_created ) and container [ " network " ] not in newly_created_networks :
creation_success = docker_interface . create_docker_network ( container [ " network " ] , container [ " network_subnet " ] , container [ " network_gateway " ] )
if creation_success :
newly_created_networks . append ( container [ " network " ] )
else :
any_fail = True
if not any_fail and ok_custom_entrypoint :
valid_containers . append ( container )
elif " network " in container and container [ " network " ] [ : len ( config . clore_network_name_prefix ) ] == config . clore_network_name_prefix : # Subnet & gateway not defined, must be some of default networks, otherwise dump it
if container [ " network " ] in default_network_names :
for docker_network in docker_networks :
if docker_network [ " Name " ] == container [ " network " ] :
for ipam in docker_network [ " IPAM " ] :
if not ok_custom_entrypoint :
break
elif not " ip " in container :
valid_containers . append ( container )
break
elif networking . is_ip_in_network ( container [ " ip " ] , ipam [ " Subnet " ] ) :
valid_containers . append ( container )
break
for docker_network in docker_networks :
if not docker_network [ " Name " ] in containers_required_networks and not docker_network [ " Name " ] in default_network_names :
if docker_network [ " Name " ] [ : len ( config . clore_network_name_prefix ) ] == config . clore_network_name_prefix :
docker_interface . remove_docker_network ( docker_network [ " Name " ] )
for existing_wireguard_config in current_wireguard_configs :
if not existing_wireguard_config in used_wireguard_configs :
try :
directory_path = os . path . join ( config . wireguard_config_folder , existing_wireguard_config )
shutil . rmtree ( directory_path )
log . debug ( f " DOCKER CONFIGURATOR | WIREGUARD CLEANUP | The directory { directory_path } has been removed successfully. " )
except Exception as e :
log . error ( f " DOCKER CONFIGURATOR | WIREGUARD CLEANUP | Error: { e } " )
for remaining_file in current_startup_files :
if not remaining_file in used_startup_files :
try :
if str ( remaining_file ) . endswith ( " .sh " ) or str ( remaining_file ) . endswith ( " .finished " ) :
log . debug ( f " REMOVIN { os . path . join ( config . startup_scripts_folder , str ( remaining_file ) ) } " )
os . remove ( os . path . join ( config . startup_scripts_folder , str ( remaining_file ) ) )
except Exception as e :
pass
if config . log_containers_strings :
print ( " FROM DOCKER CONFIGURATOR " , valid_containers )
validation_and_security = docker_interface . validate_and_secure_networks ( )
if startup_sctipt_creation_fail :
validation_and_security = False
return validation_and_security , valid_containers