1
+ from __future__ import annotations
1
2
import argparse
2
3
import logging
3
4
from logging .handlers import TimedRotatingFileHandler
4
5
import os
6
+ from typing import Optional , List
5
7
6
8
import toml
7
9
12
14
13
15
14
16
class Config :
17
+ branch : str
18
+ network : str
19
+ home_dir : str
20
+ network_dir : str
21
+ disable_update : bool
22
+ external_ip : Optional [str ]
23
+ backup_dir : Optional [str ]
24
+ restore_dir : Optional [str ]
25
+ eth_providers : List [str ]
26
+
15
27
def __init__ (self , loader : ConfigLoader ):
16
28
self .logger = logging .getLogger ("launcher.Config" )
17
29
@@ -23,44 +35,49 @@ def __init__(self, loader: ConfigLoader):
23
35
self .network = os .environ ["NETWORK" ]
24
36
25
37
self .home_dir = self .loader .ensure_home_dir (os .environ ["HOST_HOME" ])
26
- self .network_dir = None
38
+ self .network_dir = os . path . join ( self . home_dir , self . network )
27
39
self .backup_dir = None
28
40
self .restore_dir = None
29
41
30
42
self .eth_providers = general_config [self .network ]["eth_providers" ]
31
43
32
44
self .nodes = nodes_config [self .network ]
33
45
34
- self .args = None
46
+ self ._parse_command_line_arguments ()
47
+ self ._parse_general_config_file ()
48
+ self .network_dir = self .loader .ensure_network_dir (self .network_dir )
49
+
50
+ self ._parse_network_config_file ()
51
+
52
+ for node in self .nodes .values ():
53
+ for v in node ["volumes" ]:
54
+ v ["host" ] = self .expand_vars (v ["host" ])
35
55
36
- self .parse ()
56
+ self .dump ()
37
57
38
- def parse (self ):
58
+ def _parse_command_line_arguments (self ) -> None :
59
+ self .args = None
39
60
try :
40
61
self .parse_command_line_arguments ()
41
62
except Exception as e :
42
63
raise ConfigError (ConfigErrorScope .COMMAND_LINE_ARGS ) from e
43
64
44
- self .network_dir = "{}/{}" .format (self .home_dir , self .network )
45
-
65
+ def _parse_general_config_file (self ) -> None :
66
+ filename = "xud-docker.conf"
67
+ conf_file = os .path .join (self .home_dir , filename )
46
68
try :
47
69
self .parse_general_config ()
48
70
except Exception as e :
49
- conf_file = "{}/{}.conf" .format (self .home_dir , "xud-docker" )
50
71
raise ConfigError (ConfigErrorScope .GENERAL_CONF , conf_file = conf_file ) from e
51
72
52
- self .network_dir = self .loader .ensure_network_dir (self .network_dir )
53
-
73
+ def _parse_network_config_file (self ) -> None :
74
+ filename = "{}.conf" .format (self .network )
75
+ conf_file = os .path .join (self .network_dir , filename )
54
76
try :
55
77
self .parse_network_config ()
56
78
except Exception as e :
57
- conf_file = "{}/{}.conf" .format (self .network_dir , self .network )
58
79
raise ConfigError (ConfigErrorScope .NETWORK_CONF , conf_file = conf_file ) from e
59
80
60
- for node in self .nodes .values ():
61
- for v in node ["volumes" ]:
62
- v ["host" ] = self .expand_vars (v ["host" ])
63
-
64
81
def parse_command_line_arguments (self ):
65
82
parser = ArgumentParser (argument_default = argparse .SUPPRESS , prog = "xud.sh" , usage = "bash xud.sh [OPTIONS]" )
66
83
parser .add_argument (
@@ -915,8 +932,100 @@ def expand_vars(self, value):
915
932
return value
916
933
917
934
@property
918
- def logfile (self ):
919
- if self .network_dir :
920
- network = self .network
921
- return f"{ self .network_dir } /logs/{ network } .log"
922
- return None
935
+ def logs_dir (self ) -> str :
936
+ return os .path .join (self .network_dir , "logs" )
937
+
938
+ @property
939
+ def logfile (self ) -> str :
940
+ filename = f"{ self .network } .log"
941
+ return os .path .join (self .logs_dir , filename )
942
+
943
+ @property
944
+ def dumpfile (self ) -> str :
945
+ filename = f"config.sh"
946
+ return os .path .join (self .logs_dir , filename )
947
+
948
+ def dump (self ) -> None :
949
+ """Dump xud-docker configurations as bash key-value file in logs_dir"""
950
+ prefix = "XUD_DOCKER"
951
+
952
+ with open ("/mnt/hostfs" + self .dumpfile , "w" ) as f :
953
+ def dump_attr (attr : str ) -> None :
954
+ key = f"{ prefix } _{ attr .upper ()} "
955
+ value = getattr (self , attr )
956
+ if not value :
957
+ value = ""
958
+ if isinstance (value , bool ):
959
+ value = str (value ).lower ()
960
+ print ("{}=\" {}\" " .format (key , value ), file = f )
961
+ dump_attr ("branch" )
962
+ dump_attr ("disable_update" )
963
+ dump_attr ("external_ip" )
964
+ dump_attr ("network" )
965
+ dump_attr ("home_dir" )
966
+ dump_attr ("network_dir" )
967
+ dump_attr ("backup_dir" )
968
+ dump_attr ("restore_dir" )
969
+
970
+ # dump nodes config
971
+ def dump_node_attr (node : str , attr : str ) -> None :
972
+ node_config = self .nodes [node ]
973
+ node_prefix = f"{ prefix } _SERVICE_{ node .upper ()} "
974
+ if attr == "volumes" :
975
+ for volume in node_config ["volumes" ]:
976
+ key = f"{ node_prefix } _VOLUME"
977
+ value = "{}:{}" .format (volume ["host" ], volume ["container" ])
978
+ print ("{}=\" {}\" " .format (key , value ), file = f )
979
+ elif attr == "ports" :
980
+ for port in node_config ["ports" ]:
981
+ key = f"{ node_prefix } _PORT"
982
+ value = str (port )
983
+ print ("{}=\" {}\" " .format (key , value ), file = f )
984
+ else :
985
+ key = f"{ node_prefix } _{ attr .upper ()} "
986
+ value = ""
987
+ try :
988
+ value = node_config [attr ]
989
+ except KeyError :
990
+ if node == "arby" :
991
+ value = node_config .get (attr .replace ("_" , "-" ), "" )
992
+ if not value :
993
+ value = ""
994
+ if isinstance (value , bool ):
995
+ value = str (value ).lower ()
996
+ print ("{}=\" {}\" " .format (key , value ), file = f )
997
+
998
+ for node in self .nodes .keys ():
999
+ dump_node_attr (node , "image" )
1000
+ dump_node_attr (node , "volumes" )
1001
+ dump_node_attr (node , "ports" )
1002
+ dump_node_attr (node , "mode" )
1003
+ dump_node_attr (node , "disabled" )
1004
+ dump_node_attr (node , "preserve_config" )
1005
+ dump_node_attr (node , "use_local_image" )
1006
+
1007
+ if node in ["bitcoind" , "litecoind" ]:
1008
+ dump_node_attr (node , "external_rpc_host" )
1009
+ dump_node_attr (node , "external_rpc_port" )
1010
+ #dump_node_attr(node, "external_rpc_user")
1011
+ #dump_node_attr(node, "external_rpc_password")
1012
+ dump_node_attr (node , "external_zmqpubrawblock" )
1013
+ dump_node_attr (node , "external_zmqpubrawtx" )
1014
+ elif node == "geth" :
1015
+ dump_node_attr (node , "external_rpc_host" )
1016
+ dump_node_attr (node , "external_rpc_port" )
1017
+ #dump_node_attr(node, "infura_project_id")
1018
+ #dump_node_attr(node, "infura_project_secret")
1019
+ dump_node_attr (node , "cache" )
1020
+ elif node == "arby" :
1021
+ dump_node_attr (node , "test_centralized_baseasset_balance" )
1022
+ dump_node_attr (node , "test_centralized_quoteasset_balance" )
1023
+ dump_node_attr (node , "opendex_base_asset" )
1024
+ dump_node_attr (node , "opendex_quote_asset" )
1025
+ dump_node_attr (node , "cex_base_asset" )
1026
+ dump_node_attr (node , "cex_quote_asset" )
1027
+ dump_node_attr (node , "live_cex" )
1028
+ dump_node_attr (node , "cex" )
1029
+ #dump_node_attr(node, "cex_api_key")
1030
+ #dump_node_attr(node, "cex_api_secret")
1031
+ dump_node_attr (node , "margin" )
0 commit comments