A couple of socket fixes so root fenrir and user fenrir do not battle.
This commit is contained in:
@@ -14,10 +14,7 @@ INSTANCE_TIMEOUT_SEC = 30.0
|
|||||||
|
|
||||||
|
|
||||||
def get_registry_dir():
|
def get_registry_dir():
|
||||||
return os.path.join(
|
return os.path.join(tempfile.gettempdir(), "fenrirscreenreader-instances")
|
||||||
tempfile.gettempdir(),
|
|
||||||
f"fenrirscreenreader-instances-{os.getuid()}",
|
|
||||||
)
|
|
||||||
|
|
||||||
|
|
||||||
def get_instance_file(pid=None):
|
def get_instance_file(pid=None):
|
||||||
@@ -28,13 +25,14 @@ def get_instance_file(pid=None):
|
|||||||
|
|
||||||
def write_instance(instance_data):
|
def write_instance(instance_data):
|
||||||
registry_dir = get_registry_dir()
|
registry_dir = get_registry_dir()
|
||||||
os.makedirs(registry_dir, mode=0o700, exist_ok=True)
|
os.makedirs(registry_dir, mode=0o755, exist_ok=True)
|
||||||
os.chmod(registry_dir, 0o700)
|
os.chmod(registry_dir, 0o755)
|
||||||
instance_data["updated_at"] = time.time()
|
instance_data["updated_at"] = time.time()
|
||||||
instance_path = get_instance_file(instance_data.get("pid"))
|
instance_path = get_instance_file(instance_data.get("pid"))
|
||||||
with open(instance_path, "w", encoding="utf-8") as instance_file:
|
with open(instance_path, "w", encoding="utf-8") as instance_file:
|
||||||
json.dump(instance_data, instance_file, sort_keys=True)
|
json.dump(instance_data, instance_file, sort_keys=True)
|
||||||
instance_file.write("\n")
|
instance_file.write("\n")
|
||||||
|
os.chmod(instance_path, 0o644)
|
||||||
|
|
||||||
|
|
||||||
def remove_instance(pid=None):
|
def remove_instance(pid=None):
|
||||||
|
|||||||
@@ -23,7 +23,7 @@ class driver(remoteDriver):
|
|||||||
def __init__(self):
|
def __init__(self):
|
||||||
remoteDriver.__init__(self)
|
remoteDriver.__init__(self)
|
||||||
self.fenrirSocks = []
|
self.fenrirSocks = []
|
||||||
self.socket_files = []
|
self.bound_sockets = []
|
||||||
|
|
||||||
def initialize(self, environment):
|
def initialize(self, environment):
|
||||||
self.env = environment
|
self.env = environment
|
||||||
@@ -94,11 +94,16 @@ class driver(remoteDriver):
|
|||||||
|
|
||||||
def _register_instance(self):
|
def _register_instance(self):
|
||||||
settings_manager = self.env["runtime"]["SettingsManager"]
|
settings_manager = self.env["runtime"]["SettingsManager"]
|
||||||
|
active_socket_files = [
|
||||||
|
socket_file
|
||||||
|
for fenrir_sock, socket_file in self.bound_sockets
|
||||||
|
if self._socket_file_matches_socket(fenrir_sock, socket_file)
|
||||||
|
]
|
||||||
instance_data = {
|
instance_data = {
|
||||||
"pid": os.getpid(),
|
"pid": os.getpid(),
|
||||||
"ppid": os.getppid(),
|
"ppid": os.getppid(),
|
||||||
"socket_files": self.socket_files,
|
"socket_files": active_socket_files,
|
||||||
"main_socket": MAIN_SOCKET_FILE in self.socket_files,
|
"main_socket": MAIN_SOCKET_FILE in active_socket_files,
|
||||||
"screen_driver": settings_manager.get_setting("screen", "driver"),
|
"screen_driver": settings_manager.get_setting("screen", "driver"),
|
||||||
"keyboard_driver": settings_manager.get_setting("keyboard", "driver"),
|
"keyboard_driver": settings_manager.get_setting("keyboard", "driver"),
|
||||||
"x11_window_id": settings_manager.get_setting(
|
"x11_window_id": settings_manager.get_setting(
|
||||||
@@ -108,6 +113,17 @@ class driver(remoteDriver):
|
|||||||
}
|
}
|
||||||
remoteInstanceRegistry.write_instance(instance_data)
|
remoteInstanceRegistry.write_instance(instance_data)
|
||||||
|
|
||||||
|
def _socket_file_matches_socket(self, fenrir_sock, socket_file):
|
||||||
|
try:
|
||||||
|
socket_stat = os.stat(socket_file)
|
||||||
|
fd_stat = os.fstat(fenrir_sock.fileno())
|
||||||
|
except OSError:
|
||||||
|
return False
|
||||||
|
return (
|
||||||
|
socket_stat.st_dev == fd_stat.st_dev
|
||||||
|
and socket_stat.st_ino == fd_stat.st_ino
|
||||||
|
)
|
||||||
|
|
||||||
def _cleanup(self):
|
def _cleanup(self):
|
||||||
for fenrir_sock in self.fenrirSocks:
|
for fenrir_sock in self.fenrirSocks:
|
||||||
try:
|
try:
|
||||||
@@ -116,13 +132,16 @@ class driver(remoteDriver):
|
|||||||
pass
|
pass
|
||||||
self.fenrirSocks = []
|
self.fenrirSocks = []
|
||||||
|
|
||||||
for socket_file in self.socket_files:
|
for _, socket_file in self.bound_sockets:
|
||||||
try:
|
try:
|
||||||
if os.path.exists(socket_file):
|
if (
|
||||||
|
os.path.exists(socket_file)
|
||||||
|
and not self._is_socket_active(socket_file)
|
||||||
|
):
|
||||||
os.unlink(socket_file)
|
os.unlink(socket_file)
|
||||||
except OSError:
|
except OSError:
|
||||||
pass
|
pass
|
||||||
self.socket_files = []
|
self.bound_sockets = []
|
||||||
remoteInstanceRegistry.remove_instance()
|
remoteInstanceRegistry.remove_instance()
|
||||||
|
|
||||||
def _handle_client(self, client_sock, event_queue):
|
def _handle_client(self, client_sock, event_queue):
|
||||||
@@ -167,7 +186,7 @@ class driver(remoteDriver):
|
|||||||
if fenrir_sock is None:
|
if fenrir_sock is None:
|
||||||
continue
|
continue
|
||||||
self.fenrirSocks.append(fenrir_sock)
|
self.fenrirSocks.append(fenrir_sock)
|
||||||
self.socket_files.append(socket_file)
|
self.bound_sockets.append((fenrir_sock, socket_file))
|
||||||
|
|
||||||
if not self.fenrirSocks:
|
if not self.fenrirSocks:
|
||||||
return
|
return
|
||||||
|
|||||||
Reference in New Issue
Block a user