"""run gunicorn""" import os import subprocess import glob import tinnus # # only imported to get lib directory name # # tinnus shows the ernad path import docing from nitpo import Nitpo class Runic(Nitpo): def __init__(self, do_verbose=False): super().__init__() ns = self.const['ns'] self.verbose = do_verbose def options(self): if not self.has_conf('folders', 'web_log'): print("server needs a web_log folder") quit() if not self.has_conf('files', 'socket'): print("runic needs a socket file in nitpo.ini.") quit() socket_fufi = self.conf['files']['socket'] if not self.has_conf('files', 'pid'): print("runic needs a pid file in nitpo.ini.") quit() pid_fufi = self.conf['files']['pid'] # # just a sample lib to get the nitpo python directory lib_dir = os.path.dirname(os.path.abspath(docing.__file__)) conf_fufi = lib_dir + '/guniconf.py' log = self.log_fufi() string = '' if self.is_dev(): string += ' --capture-output' string += f" --log-file {log}.out" string += f" --error-logfile {log}.err" string += f" --access-logfile {log}.log" string += f" -D -b unix:{socket_fufi} -p {pid_fufi} " string += f" -c {conf_fufi} " string += ' server:app > /dev/null' return string def stop(self): """stop the server""" if not self.has_conf('files', 'pid'): print("runic needs a pid file in nitpo.ini.") quit() pid_fufi = self.conf['files']['pid'] if not os.path.isfile(pid_fufi): kill = "/usr/bin/killall gunicorn" out = subprocess.run(kill, check=False, shell=True) return out kill = f"/bin/kill `/bin/cat {pid_fufi}` 2> /dev/null" out = subprocess.run(kill, shell=True) return out def start(self): options = self.options() run = f"/usr/bin/gunicorn {options}" print(run) subprocess.run(run, check=True, shell=True) def log_fufi(self): if not self.has_conf('folders', 'web_log'): print("runic needs a pid file in nitpo.ini.") quit() log_fudi = self.conf['folders']['web_log'] if not os.path.isdir(log_fudi): os.makedirs(log_fudi) fufis = self.list_logs_fufis(log_fudi) bana = self.next_log_number(fufis) fufi = log_fudi + '/' + bana return fufi def list_logs_fufis(self, folder, with_gz=True): fufis = [] base_glob = folder + '/*' for fufi in sorted(glob.glob(base_glob)): fufis.append(fufi) if not with_gz: return fufis comp_glob = base_glob + '.gz' for fufi in glob.glob(comp_glob): fufis.append(fufi) sorted_fufis = sorted(fufis) return sorted_fufis def next_log_number(self, fufis): if len(fufis) == 0: return str(0) maxi = 0 for fufi in fufis: bana = os.path.basename(fufi) if bana.endswith('.gz'): bana = bana[:-3] # # remove .log bana = bana[:-4] parts = bana.partition('.') number = tinnus.ekam(parts[0]) if number is None: continue if number > maxi: maxi = number number = tinnus.make(maxi + 1) return number