2020-09-28 13:32:19 +02:00
#!/usr/bin/env python3
import argparse
2021-09-07 12:59:31 +02:00
import hashlib
2020-09-28 13:32:19 +02:00
import logging
2022-11-23 15:54:22 +01:00
import logging . config
2021-09-07 12:59:31 +02:00
import platform
2020-09-28 13:32:19 +02:00
import shlex
2021-09-07 12:59:31 +02:00
import subprocess
2020-09-28 13:32:19 +02:00
import sys
2021-04-06 17:27:59 +02:00
from pathlib import Path
2020-09-28 13:32:19 +02:00
2022-11-23 15:54:22 +01:00
from lookyloo . default import get_homedir , get_config
2020-09-28 13:32:19 +02:00
2022-11-23 15:54:22 +01:00
logging . config . dictConfig ( get_config ( ' logging ' ) )
2020-09-28 13:32:19 +02:00
2024-01-12 17:15:41 +01:00
def compute_hash_self ( ) - > bytes :
2020-10-03 21:32:30 +02:00
m = hashlib . sha256 ( )
with ( get_homedir ( ) / ' bin ' / ' update.py ' ) . open ( ' rb ' ) as f :
2020-10-13 16:18:01 +02:00
m . update ( f . read ( ) )
return m . digest ( )
2020-10-03 21:32:30 +02:00
2020-10-13 16:38:56 +02:00
2024-01-12 17:15:41 +01:00
def keep_going ( ignore : bool = False ) - > None :
2020-09-28 13:32:19 +02:00
if ignore :
return
keep_going = input ( ' Continue? (y/N) ' )
if keep_going . lower ( ) != ' y ' :
print ( ' Okay, quitting. ' )
sys . exit ( )
2024-01-12 17:15:41 +01:00
def run_command ( command : str , expect_fail : bool = False , capture_output : bool = True ) - > None :
2020-09-28 13:32:19 +02:00
args = shlex . split ( command )
2020-09-28 13:57:21 +02:00
homedir = get_homedir ( )
2020-10-22 16:41:00 +02:00
process = subprocess . run ( args , cwd = homedir , capture_output = capture_output )
if capture_output :
print ( process . stdout . decode ( ) )
if process . returncode and not expect_fail :
2020-09-28 13:32:19 +02:00
print ( process . stderr . decode ( ) )
sys . exit ( )
2024-01-12 17:15:41 +01:00
def check_poetry_version ( ) - > None :
2020-10-03 21:19:43 +02:00
args = shlex . split ( " poetry self -V " )
homedir = get_homedir ( )
process = subprocess . run ( args , cwd = homedir , capture_output = True )
poetry_version_str = process . stdout . decode ( )
version = poetry_version_str . split ( ) [ 2 ]
2022-08-31 16:33:13 +02:00
version = version . strip ( ' ) ' )
2020-10-03 21:19:43 +02:00
version_details = tuple ( int ( i ) for i in version . split ( ' . ' ) )
2022-12-28 16:25:44 +01:00
if version_details < ( 1 , 3 , 0 ) :
print ( ' Lookyloo requires poetry >= 1.3.0, please update. ' )
2020-10-03 21:19:43 +02:00
print ( ' If you installed with " pip install --user poetry " , run " pip install --user -U poetry " ' )
print ( ' If you installed via the recommended method, use " poetry self update " ' )
print ( ' More details: https://github.com/python-poetry/poetry#updating-poetry ' )
sys . exit ( )
2024-01-12 17:15:41 +01:00
def main ( ) - > None :
2020-09-28 13:32:19 +02:00
parser = argparse . ArgumentParser ( description = ' Pull latest release, update dependencies, update and validate the config files, update 3rd deps for the website. ' )
parser . add_argument ( ' --yes ' , default = False , action = ' store_true ' , help = ' Run all commands without asking. ' )
args = parser . parse_args ( )
2020-10-03 21:32:30 +02:00
old_hash = compute_hash_self ( )
2020-10-03 21:19:43 +02:00
2024-10-17 18:07:07 +02:00
print ( ' * Lookyloo requires valkey 8.0 or more recent. If you are updating from an existing instance, make sure to update/migrate to valkey 8.0. ' )
print ( ' * If you do not do that, restarting will not work but you will not loose anything, just need to install valkey 8.0. ' )
print ( ' * Installing valkey 8.0 simply means cloning valkey, and runnig make. ' )
keep_going ( args . yes )
2020-09-28 13:32:19 +02:00
print ( ' * Update repository. ' )
keep_going ( args . yes )
run_command ( ' git pull ' )
2020-10-03 21:32:30 +02:00
new_hash = compute_hash_self ( )
if old_hash != new_hash :
print ( ' Update script changed, please do " poetry run update " ' )
sys . exit ( )
check_poetry_version ( )
2020-09-28 13:32:19 +02:00
print ( ' * Install/update dependencies. ' )
keep_going ( args . yes )
run_command ( ' poetry install ' )
2022-04-25 13:34:01 +02:00
print ( ' * Install or make sure the playwright browsers are installed. ' )
keep_going ( args . yes )
run_command ( ' poetry run playwright install ' )
2020-09-28 13:32:19 +02:00
print ( ' * Validate configuration files. ' )
keep_going ( args . yes )
2021-04-06 17:43:45 +02:00
run_command ( f ' poetry run { ( Path ( " tools " ) / " validate_config_files.py " ) . as_posix ( ) } --check ' )
2020-09-28 13:32:19 +02:00
print ( ' * Update configuration files. ' )
keep_going ( args . yes )
2021-04-06 17:43:45 +02:00
run_command ( f ' poetry run { ( Path ( " tools " ) / " validate_config_files.py " ) . as_posix ( ) } --update ' )
2020-09-28 13:32:19 +02:00
print ( ' * Update third party dependencies for the website. ' )
keep_going ( args . yes )
2021-04-06 17:43:45 +02:00
run_command ( f ' poetry run { ( Path ( " tools " ) / " 3rdparty.py " ) . as_posix ( ) } ' )
2020-10-13 16:38:56 +02:00
2020-10-13 15:05:36 +02:00
print ( ' * Restarting Lookyloo. ' )
keep_going ( args . yes )
2021-04-06 17:27:59 +02:00
if platform . system ( ) == ' Windows ' :
2020-10-22 16:41:00 +02:00
print ( ' Restarting Lookyloo with poetry... ' )
run_command ( ' poetry run stop ' , expect_fail = True )
run_command ( ' poetry run start ' , capture_output = False )
print ( ' Lookyloo started. ' )
2021-04-06 17:27:59 +02:00
else :
service = " lookyloo "
p = subprocess . run ( [ " systemctl " , " is-active " , " --quiet " , service ] )
try :
p . check_returncode ( )
print ( ' Restarting Lookyloo with systemd... ' )
run_command ( ' sudo service lookyloo restart ' )
print ( ' done. ' )
except subprocess . CalledProcessError :
print ( ' Restarting Lookyloo with poetry... ' )
run_command ( ' poetry run stop ' , expect_fail = True )
run_command ( ' poetry run start ' , capture_output = False )
print ( ' Lookyloo started. ' )
2020-10-13 16:38:56 +02:00
2020-10-03 21:19:43 +02:00
if __name__ == ' __main__ ' :
main ( )