ya2 · news · projects · code · about

gettext: --no-location
[pmachines.git] / ya2 / utils / log.py
CommitLineData
8ee66edd
FC
1from logging import basicConfig, info, INFO, DEBUG, getLogger
2from configparser import ConfigParser
3from sys import platform, argv
8ce16d6c 4from glob import glob
8ee66edd 5from os import getcwd, environ
e65a09cf 6from os.path import exists
8ee66edd
FC
7from sys import version_info
8# from platform import system, release, architecture, platform, processor, \
9# version, machine
10# from multiprocessing import cpu_count
d68aeda7 11from panda3d.core import Filename, PandaSystem
8ce16d6c 12from panda3d.bullet import get_bullet_version
d68aeda7
FC
13from ya2.utils.logics import LogicsTools, class_property
14import sys
8ee66edd
FC
15
16
d68aeda7 17class LogManager:
997664d8
FC
18
19 @staticmethod
d68aeda7
FC
20 def before_init_setup(app_name):
21 LogManager.__app_name = app_name
22 o = LogManager.option_file_path
23 LogManager.__set_level(o)
24
25 @class_property
26 def option_file_path(cls):
27 r = 'options.ini'
28 path = ''
29 if LogicsTools.in_build:
30 path = str(Filename.get_user_appdata_directory()) + '/pmachines'
31 if path:
32 r = LogicsTools.platform_specific_path(path + '/options.ini')
33 return r
8ee66edd 34
997664d8 35 @staticmethod
d68aeda7
FC
36 def __set_level(options_file_path):
37 l = LogManager.__set_level_from_settings(options_file_path)
38 basicConfig(level=l, format='%(asctime)s %(message)s', datefmt='%H:%M:%S')
39 getLogger().setLevel(l)
8ee66edd 40
997664d8 41 @staticmethod
d68aeda7
FC
42 def __set_level_from_settings(options_file_path):
43 l = INFO
44 if exists(options_file_path):
45 with open(options_file_path):
46 o = ConfigParser()
47 o.read(options_file_path)
48 v = o['development']['verbose_log']
49 if v and int(v):
50 l = DEBUG
51 return l
52
53 @class_property
54 def init_cls(cls):
55 return WindowedLogManager if base.win else LogManager
8ee66edd 56
aed9737a 57 def __init__(self):
d68aeda7 58 self.log_configuration()
8ee66edd 59
d68aeda7
FC
60 def log(self, message, verbose=False):
61 if verbose and not self.eng.cfg.dev_cfg.verbose_log: return
62 info(message)
8ee66edd 63
8ce16d6c 64 @property
d68aeda7
FC
65 def build_version(self):
66 appimage_version = self.__build_version_appimage()
67 if appimage_version: return appimage_version
68 return self.__build_version_from_file
dd32d640 69
d68aeda7
FC
70 def __build_version_appimage(self):
71 appimage_mounted = glob(f'{LogicsTools.appimage_path(self.__app_name)}*')
72 if appimage_mounted:
73 with open(LogicsTools.current_path(self.__app_name) + 'assets/build_version.txt') as f:
74 return f.read().strip()
8ce16d6c
FC
75
76 @property
d68aeda7
FC
77 def __build_version_from_file(self):
78 try: return self.__load_version_from_file()
8ce16d6c 79 except FileNotFoundError:
d68aeda7 80 info('not found ' + LogicsTools.current_path(self.__app_name) + 'assets/build_version.txt')
8ce16d6c
FC
81 return 'notfound'
82
d68aeda7
FC
83 def __load_version_from_file(self):
84 with open(LogicsTools.current_path(self.__app_name) + 'assets/build_version.txt') as f:
85 return f.read().strip()
86
87 def log_configuration(self):
8ee66edd 88 if '--version' in argv:
d68aeda7
FC
89 self.__write_observed_version()
90 self.__print_version()
91 self.__messages = [f'version: {self.build_version}',
92 f'argv[0]: {argv[0]}',
93 f'getcwd: {getcwd()}',
94 f'__file__: {__file__}']
95 for e in environ.items():
96 self.__messages += [f'env::{e[0]}: {e[1]}']
8ee66edd
FC
97 # os_info = (system(), release(), version())
98 # messages += ['operative system: %s %s %s' % os_info]
99 # messages += ['architecture: ' + str(architecture())]
100 # messages += ['machine: ' + machine()]
101 # messages += ['platform: ' + platform()]
102 # messages += ['processor: ' + processor()]
103 # try:
104 # messages += ['cores: ' + str(cpu_count())]
105 # except NotImplementedError: # on Windows
106 # messages += ['cores: not implemented']
8ce16d6c 107 lib_ver = PandaSystem.get_version_string()
d68aeda7
FC
108 self.__log_system_memory()
109 lib_commit = PandaSystem.get_git_commit()
110 py_ver = [str(e) for e in version_info[:3]]
111 self.__messages += [f'python version: {".".join(py_ver)}',
112 f'panda version: {lib_ver} {lib_commit}',
113 f'bullet version: {str(get_bullet_version())}',
114 f'appdata: {str(Filename.get_user_appdata_directory())}']
115 if LogicsTools.windowed:
116 # not headless
117 print(base.win.get_keyboard_map())
118 list(map(self.log, self.__messages))
119
120 def __write_observed_version(self):
fd2a4e5d 121 info(f'writing {LogicsTools.appdata_path}/{self.__app_name}/observed_version.txt')
d68aeda7
FC
122 with open(LogicsTools.appdata_path + '/pmachines/observed_version.txt', 'w') as f:
123 f.write(self.build_version)
124
125 def __print_version(self):
126 if not platform.startswith('win'):
127 from os import ttyname # here because it doesn't work on windows
128 try:
129 with open(ttyname(0), 'w') as f:
130 sys.stdout = f
131 print(f'version: {self.build_version}')
132 except OSError: # it doesn't work with crontab
133 print('version: ' + self.build_version)
134
135 def __log_system_memory(self):
8ee66edd
FC
136 try:
137 import psutil
d68aeda7
FC
138 mem = psutil.virtual_memory().total / 1000000000
139 self.__messages += [f'memory: {round(mem, 2)} GB']
e65a09cf
FC
140 except ImportError:
141 info("can't import psutil") # windows
8ee66edd 142
8ee66edd 143
d68aeda7 144class WindowedLogManager(LogManager):
8ee66edd 145
d68aeda7
FC
146 def log_configuration(self):
147 super().log_configuration()
148 self.__messages = [base.win.get_gsg().get_driver_vendor()]
149 self.__messages += [base.win.get_gsg().get_driver_renderer()]
e65a09cf
FC
150 shad_maj = base.win.get_gsg().\
151 get_driver_shader_version_major()
152 shad_min = base.win.get_gsg().\
153 get_driver_shader_version_minor()
d68aeda7
FC
154 self.__messages += ['shader: {maj}.{min}'.format(maj=shad_maj, min=shad_min)]
155 self.__messages += [base.win.get_gsg().get_driver_version()]
8ce16d6c
FC
156 drv_maj = base.win.get_gsg().get_driver_version_major()
157 drv_min = base.win.get_gsg().get_driver_version_minor()
8ee66edd 158 drv = 'driver version: {maj}.{min}'
d68aeda7
FC
159 self.__messages += [drv.format(maj=drv_maj, min=drv_min)]
160 self.__log_fullscreen()
161 self.__log_resolution()
162 list(map(self.log, self.__messages))
163
164 def __log_fullscreen(self):
8ce16d6c 165 fullscreen = None
d68aeda7 166 if LogicsTools.windowed:
8ce16d6c 167 fullscreen = base.win.get_properties().get_fullscreen()
d68aeda7 168 self.__messages += ['fullscreen: ' + str(fullscreen)]
e65a09cf 169
d68aeda7 170 def __log_resolution(self):
8ce16d6c 171 def resolution():
d68aeda7 172 if not LogicsTools.windowed:
8ce16d6c 173 return 800, 600
d68aeda7
FC
174 w = base.win.get_properties()
175 return w.get_x_size(), w.get_y_size()
176 self.__messages += [f'resolution: {(r := resolution())[0]}x{r[1]}']