diff --git a/modules/__init__.py b/modules/__init__.py index d7e3cc7d..5a44fa3e 100644 --- a/modules/__init__.py +++ b/modules/__init__.py @@ -7,6 +7,7 @@ from modules.single_pool import SingleNominatorModule from modules.validator import ValidatorModule from modules.controller import ControllerModule +from modules.liteserver import LiteserverModule MODES = { @@ -14,6 +15,7 @@ 'nominator-pool': NominatorPoolModule, 'single-nominator': SingleNominatorModule, 'liquid-staking': ControllerModule, + 'liteserver': LiteserverModule } diff --git a/modules/liteserver.py b/modules/liteserver.py new file mode 100644 index 00000000..6e3849ec --- /dev/null +++ b/modules/liteserver.py @@ -0,0 +1,27 @@ +import psutil + +from modules.module import MtcModule + + +class LiteserverModule(MtcModule): + + description = 'For liteserver usage only - can\'t be used with validator.' + default_value = False + + def enable(self): + from mytoninstaller.mytoninstaller import set_node_argument + set_node_argument(self.local, ["--celldb-no-preload-all"]) + data = psutil.virtual_memory() + ram = data.total / 2**30 + if ram < 100: + set_node_argument(self.local, ["--celldb-cache-size", "1073741824"]) + + def disable(self): + from mytoninstaller.mytoninstaller import set_node_argument + from mytoninstaller.node_args import get_node_args + set_node_argument(self.local, ["--celldb-no-preload-all", "-d"]) + if get_node_args()['--celldb-cache-size']: + set_node_argument(self.local, ["--celldb-cache-size", "-d"]) + + def add_console_commands(self, console): + ... diff --git a/mytoncore/functions.py b/mytoncore/functions.py index 9e9f4d05..12e36ba3 100755 --- a/mytoncore/functions.py +++ b/mytoncore/functions.py @@ -54,6 +54,8 @@ def Event(local, event_name): ValidatorDownEvent(local) elif event_name == "enable_ton_storage_provider": enable_ton_storage_provider_event(local) + elif event_name == "enable_liteserver_mode": + enable_liteserver_mode(local) local.exit() # end define @@ -90,6 +92,13 @@ def enable_ton_storage_provider_event(local): #end define +def enable_liteserver_mode(local): + ton = MyTonCore(local) + ton.disable_mode('validator') + ton.enable_mode('liteserver') +#end define + + def Elections(local, ton): use_pool = ton.using_pool() use_liquid_staking = ton.using_liquid_staking() diff --git a/mytoncore/mytoncore.py b/mytoncore/mytoncore.py index 3a30ab41..f230c381 100644 --- a/mytoncore/mytoncore.py +++ b/mytoncore/mytoncore.py @@ -3261,9 +3261,21 @@ def get_modes(self): current_modes[name] = mode.default_value # assign default mode value return current_modes + def check_enable_mode(self, name): + if name == 'liteserver': + if self.using_validator(): + raise Exception(f'Cannot enable liteserver mode while validator mode is enabled. ' + f'Use `disable_mode validator` first.') + MODES['liteserver'](self, self.local).enable() + if name == 'validator': + if self.using_liteserver(): + raise Exception(f'Cannot enable validator mode while liteserver mode is enabled. ' + f'Use `disable_mode liteserver` first.') + def enable_mode(self, name): if name not in MODES: raise Exception(f'Unknown module name: {name}. Available modes: {", ".join(MODES)}') + self.check_enable_mode(name) current_modes = self.get_modes() current_modes[name] = True self.local.save() @@ -3272,6 +3284,8 @@ def disable_mode(self, name): current_modes = self.get_modes() if name not in current_modes: raise Exception(f'Unknown module name: {name}. Available modes: {", ".join(MODES)}') + if name == 'liteserver': + MODES['liteserver'](self, self.local).disable() current_modes[name] = False self.local.save() @@ -3296,6 +3310,9 @@ def using_pool(self) -> bool: def using_validator(self): return self.get_mode_value('validator') + def using_liteserver(self): + return self.get_mode_value('liteserver') + def Tlb2Json(self, text): # Заменить скобки start = 0 diff --git a/mytonctrl.py b/mytonctrl.py index 6c6eb9d5..4056f883 100644 --- a/mytonctrl.py +++ b/mytonctrl.py @@ -5,6 +5,13 @@ # import os import sys +import subprocess + +requirements_path = "/usr/src/mytonctrl/requirements.txt" +if os.path.isfile(requirements_path): + args = ["pip3", "install", "-r", requirements_path] + subprocess.run(args) +#end if sys.path.insert(0, '/usr/bin/mytonctrl') # Add path to mytonctrl module diff --git a/mytonctrl/mytonctrl.py b/mytonctrl/mytonctrl.py index e8b52bac..43ace71c 100755 --- a/mytonctrl/mytonctrl.py +++ b/mytonctrl/mytonctrl.py @@ -141,7 +141,7 @@ def inject_globals(func): module = NominatorPoolModule(ton, local) module.add_console_commands(console) - if ton.get_mode_value('single-nominator'): + if ton.using_single_nominator(): from modules.single_pool import SingleNominatorModule module = SingleNominatorModule(ton, local) module.add_console_commands(console) diff --git a/mytoninstaller/mytoninstaller.py b/mytoninstaller/mytoninstaller.py index 56daf47e..d8c51cca 100644 --- a/mytoninstaller/mytoninstaller.py +++ b/mytoninstaller/mytoninstaller.py @@ -29,7 +29,8 @@ CreateSymlinks, enable_ls_proxy, enable_ton_storage, - enable_ton_storage_provider + enable_ton_storage_provider, + EnableMode ) from mytoninstaller.config import ( CreateLocalConfig, @@ -255,6 +256,10 @@ def General(local): mx = sys.argv.index("--dump") dump = sys.argv[mx+1] local.buffer.dump = str2bool(dump) + if "-m" in sys.argv: + mx = sys.argv.index("-m") + mode = sys.argv[mx+1] + local.buffer.mode = mode #end if FirstMytoncoreSettings(local) @@ -264,6 +269,7 @@ def General(local): BackupVconfig(local) BackupMconfig(local) CreateSymlinks(local) + EnableMode(local) #end define diff --git a/mytoninstaller/settings.py b/mytoninstaller/settings.py index 941e16cc..6a4fbbb1 100644 --- a/mytoninstaller/settings.py +++ b/mytoninstaller/settings.py @@ -888,3 +888,9 @@ def CreateSymlinks(local): file.write(fiftpath + '\n') file.close() #end define + + +def EnableMode(local): + if local.buffer.mode == 'liteserver': + args = ["python3", "-m", "mytoncore", "-e", "enable_liteserver_mode"] + subprocess.run(args) diff --git a/scripts/install.sh b/scripts/install.sh index b57b9453..cfe84c76 100644 --- a/scripts/install.sh +++ b/scripts/install.sh @@ -15,16 +15,18 @@ fi author="ton-blockchain" repo="mytonctrl" branch="master" +mode="validator" show_help_and_exit() { - echo 'Supported argumets:' - echo ' -c PATH Provide custom config for toninstaller.sh' - echo ' -t Disable telemetry' - echo ' -i Ignore minimum reqiurements' - echo ' -d Use pre-packaged dump. Reduces duration of initial synchronization.' - echo ' -a Set MyTonCtrl git repo author' + echo 'Supported argumets:' + echo ' -c PATH Provide custom config for toninstaller.sh' + echo ' -t Disable telemetry' + echo ' -i Ignore minimum reqiurements' + echo ' -d Use pre-packaged dump. Reduces duration of initial synchronization.' + echo ' -a Set MyTonCtrl git repo author' echo ' -r Set MyTonCtrl git repo' echo ' -b Set MyTonCtrl git repo branch' + echo ' -m MODE Install MyTonCtrl with specified mode (validator or liteserver)' echo ' -h Show this help' exit } @@ -40,7 +42,8 @@ ignore=false dump=false -while getopts c:tida:r:b: flag + +while getopts c:tida:r:b:m: flag do case "${flag}" in c) config=${OPTARG};; @@ -50,6 +53,7 @@ do a) author=${OPTARG};; r) repo=${OPTARG};; b) branch=${OPTARG};; + m) mode=${OPTARG};; h) show_help_and_exit;; *) echo "Flag -${flag} is not recognized. Aborting" @@ -115,7 +119,7 @@ if [ "$parent_name" = "sudo" ] || [ "$parent_name" = "su" ]; then user=$(logname) fi echo "User: $user" -python3 -m mytoninstaller -u ${user} -t ${telemetry} --dump ${dump} +python3 -m mytoninstaller -u ${user} -t ${telemetry} --dump ${dump} -m ${mode} # set migrate version migrate_version=1