2019-01-09 22:59:03 +00:00
#!/usr/bin/env python3
2015-11-25 22:00:57 +00:00
2019-11-14 03:56:30 +00:00
# Hydrus is released under WTFPL
# You just DO WHAT THE FUCK YOU WANT TO.
# https://github.com/sirkris/WTFPL/blob/master/WTFPL.md
2015-09-02 23:16:09 +00:00
try :
import locale
try : locale . setlocale ( locale . LC_ALL , ' ' )
except : pass
import os
import sys
import time
2020-04-22 21:00:35 +00:00
import traceback
2015-09-02 23:16:09 +00:00
import threading
2020-04-22 21:00:35 +00:00
2020-07-08 22:00:33 +00:00
from hydrus . core import HydrusBoot
HydrusBoot . AddBaseDirToEnvPath ( )
2020-04-22 21:00:35 +00:00
from hydrus . core import HydrusExceptions
from hydrus . core import HydrusConstants as HC
from hydrus . core import HydrusData
from hydrus . core import HydrusPaths
from hydrus . server import ServerController
2015-09-02 23:16:09 +00:00
from twisted . internet import reactor
2020-04-22 21:00:35 +00:00
from hydrus . core import HydrusGlobals as HG
from hydrus . core import HydrusLogger
2015-09-02 23:16:09 +00:00
2016-10-19 20:02:56 +00:00
#
2016-10-12 21:52:50 +00:00
import argparse
2015-09-02 23:16:09 +00:00
2016-10-12 21:52:50 +00:00
argparser = argparse . ArgumentParser ( description = ' hydrus network server ' )
2015-09-02 23:16:09 +00:00
2016-10-12 21:52:50 +00:00
argparser . add_argument ( ' action ' , default = ' start ' , nargs = ' ? ' , choices = [ ' start ' , ' stop ' , ' restart ' ] , help = ' either start this server (default), or stop an existing server, or both ' )
argparser . add_argument ( ' -d ' , ' --db_dir ' , help = ' set an external db location ' )
2019-09-11 21:51:09 +00:00
argparser . add_argument ( ' --temp_dir ' , help = ' override the program \' s temporary directory ' )
2020-12-09 22:18:48 +00:00
argparser . add_argument ( ' --db_journal_mode ' , default = ' WAL ' , choices = [ ' WAL ' , ' TRUNCATE ' , ' PERSIST ' , ' MEMORY ' ] , help = ' change db journal mode (default=WAL) ' )
2020-12-23 23:07:58 +00:00
argparser . add_argument ( ' --db_cache_size ' , type = int , help = ' override SQLite cache_size per db file, in MB (default=200) ' )
2020-12-16 22:29:51 +00:00
argparser . add_argument ( ' --db_synchronous_override ' , type = int , choices = range ( 4 ) , help = ' override SQLite Synchronous PRAGMA (default=2) ' )
2019-09-11 21:51:09 +00:00
argparser . add_argument ( ' --no_db_temp_files ' , action = ' store_true ' , help = ' run db temp operations entirely in memory ' )
2020-12-16 22:29:51 +00:00
argparser . add_argument ( ' --boot_debug ' , action = ' store_true ' , help = ' print additional bootup information to the log ' )
2020-12-09 22:18:48 +00:00
argparser . add_argument ( ' --no_daemons ' , action = ' store_true ' , help = ' run without background daemons ' )
argparser . add_argument ( ' --no_wal ' , action = ' store_true ' , help = ' OBSOLETE: run using TRUNCATE db journaling ' )
argparser . add_argument ( ' --db_memory_journaling ' , action = ' store_true ' , help = ' OBSOLETE: run using MEMORY db journaling (DANGEROUS) ' )
2016-10-12 21:52:50 +00:00
result = argparser . parse_args ( )
2016-10-19 20:02:56 +00:00
action = result . action
2016-10-12 21:52:50 +00:00
if result . db_dir is None :
2017-01-18 22:52:39 +00:00
db_dir = HC . DEFAULT_DB_DIR
2015-09-02 23:16:09 +00:00
2019-11-20 23:10:46 +00:00
if not HydrusPaths . DirectoryIsWritable ( db_dir ) or HC . RUNNING_FROM_MACOS_APP :
2018-02-21 21:59:37 +00:00
2019-01-09 22:59:03 +00:00
db_dir = HC . USERPATH_DB_DIR
2018-02-21 21:59:37 +00:00
2015-09-02 23:16:09 +00:00
else :
2016-10-12 21:52:50 +00:00
db_dir = result . db_dir
2016-10-26 20:45:34 +00:00
db_dir = HydrusPaths . ConvertPortablePathToAbsPath ( db_dir , HC . BASE_DIR )
2016-10-19 20:02:56 +00:00
2016-10-12 21:52:50 +00:00
try :
HydrusPaths . MakeSureDirectoryExists ( db_dir )
except :
2019-06-05 19:42:39 +00:00
raise Exception ( ' Could not ensure db path " {} " exists! Check the location is correct and that you have permission to write to it! ' . format ( db_dir ) )
if not os . path . isdir ( db_dir ) :
raise Exception ( ' The given db path " {} " is not a directory! ' . format ( db_dir ) )
if not HydrusPaths . DirectoryIsWritable ( db_dir ) :
raise Exception ( ' The given db path " {} " is not a writable-to! ' . format ( db_dir ) )
2016-06-15 18:59:44 +00:00
2016-10-12 21:52:50 +00:00
2019-03-20 21:22:10 +00:00
HG . no_daemons = result . no_daemons
2020-12-09 22:18:48 +00:00
HG . db_journal_mode = result . db_journal_mode
if result . no_wal :
HG . db_journal_mode = ' TRUNCATE '
if result . db_memory_journaling :
HG . db_journal_mode = ' MEMORY '
2019-09-11 21:51:09 +00:00
2020-12-23 23:07:58 +00:00
if result . db_cache_size is not None :
HG . db_cache_size = result . db_cache_size
else :
HG . db_cache_size = 200
2019-09-11 21:51:09 +00:00
if result . db_synchronous_override is not None :
2020-12-09 22:18:48 +00:00
HG . db_synchronous = int ( result . db_synchronous_override )
else :
if HG . db_journal_mode == ' WAL ' :
2019-09-11 21:51:09 +00:00
2020-12-09 22:18:48 +00:00
HG . db_synchronous = 1
2019-09-11 21:51:09 +00:00
2020-12-09 22:18:48 +00:00
else :
2019-09-11 21:51:09 +00:00
2020-12-09 22:18:48 +00:00
HG . db_synchronous = 2
2019-09-11 21:51:09 +00:00
2019-03-06 23:06:22 +00:00
HG . no_db_temp_files = result . no_db_temp_files
2016-10-19 20:02:56 +00:00
2020-12-16 22:29:51 +00:00
HG . boot_debug = result . boot_debug
2019-03-20 21:22:10 +00:00
if result . temp_dir is not None :
2019-06-05 19:42:39 +00:00
HydrusPaths . SetEnvTempDir ( result . temp_dir )
2019-03-20 21:22:10 +00:00
2016-10-19 20:02:56 +00:00
#
2020-01-16 02:08:23 +00:00
try :
action = ServerController . ProcessStartingAction ( db_dir , action )
except HydrusExceptions . ShutdownException as e :
HydrusData . Print ( e )
action = ' exit '
2016-10-12 21:52:50 +00:00
2019-10-16 20:47:55 +00:00
if action == ' exit ' :
sys . exit ( 0 )
2016-10-12 21:52:50 +00:00
except Exception as e :
2015-09-02 23:16:09 +00:00
2019-11-20 23:10:46 +00:00
error_trace = traceback . format_exc ( )
print ( error_trace )
2016-10-12 21:52:50 +00:00
if ' db_dir ' in locals ( ) and os . path . exists ( db_dir ) :
2016-07-20 19:57:10 +00:00
2019-11-20 23:10:46 +00:00
emergency_dir = db_dir
else :
emergency_dir = os . path . expanduser ( ' ~ ' )
possible_desktop = os . path . join ( emergency_dir , ' Desktop ' )
2016-07-20 19:57:10 +00:00
2019-11-20 23:10:46 +00:00
if os . path . exists ( possible_desktop ) and os . path . isdir ( possible_desktop ) :
2016-07-20 19:57:10 +00:00
2019-11-20 23:10:46 +00:00
emergency_dir = possible_desktop
2016-07-20 19:57:10 +00:00
2019-11-20 23:10:46 +00:00
dest_path = os . path . join ( emergency_dir , ' hydrus_crash.log ' )
with open ( dest_path , ' w ' , encoding = ' utf-8 ' ) as f :
f . write ( error_trace )
2019-06-05 19:42:39 +00:00
2019-11-20 23:10:46 +00:00
print ( ' Critical boot error occurred! Details written to hydrus_crash.log in either db dir or user dir! ' )
import sys
sys . exit ( 1 )
2019-08-15 00:40:48 +00:00
controller = None
2019-06-05 19:42:39 +00:00
with HydrusLogger . HydrusLogger ( db_dir , ' server ' ) as logger :
try :
if action in ( ' stop ' , ' restart ' ) :
ServerController . ShutdownSiblingInstance ( db_dir )
if action in ( ' start ' , ' restart ' ) :
HydrusData . Print ( ' Initialising controller \u2026 ' )
threading . Thread ( target = reactor . run , name = ' twisted ' , kwargs = { ' installSignalHandlers ' : 0 } ) . start ( )
controller = ServerController . Controller ( db_dir )
controller . Run ( )
2020-05-06 21:31:41 +00:00
except ( HydrusExceptions . DBCredentialsException , HydrusExceptions . ShutdownException ) as e :
2019-06-05 19:42:39 +00:00
error = str ( e )
HydrusData . Print ( error )
except :
error = traceback . format_exc ( )
HydrusData . Print ( ' Hydrus server failed ' )
HydrusData . Print ( traceback . format_exc ( ) )
finally :
HG . view_shutdown = True
HG . model_shutdown = True
2019-08-15 00:40:48 +00:00
if controller is not None :
2019-07-31 22:01:02 +00:00
controller . pubimmediate ( ' wake_daemons ' )
2019-06-05 19:42:39 +00:00
reactor . callFromThread ( reactor . stop )
2016-07-20 19:57:10 +00:00
2019-07-31 22:01:02 +00:00
HydrusData . Print ( ' hydrus server shut down ' )
2017-01-18 22:52:39 +00:00