mirror of
https://github.com/naruxde/revpipyload.git
synced 2026-08-16 05:05:52 +02:00
feat: Add unix group support for XML-RPC server socket permissions
- Introduced `unixgroup` configuration for XML-RPC in `revpipyload.conf`. - Updated `UnixStreamXMLRPCServer` to set socket group ownership and permissions. Signed-off-by: Sven Sager <akira@narux.de>
This commit is contained in:
@@ -7,7 +7,7 @@ plcworkdir_set_uid = 1
|
|||||||
plcprogram = program.py
|
plcprogram = program.py
|
||||||
plcprogram_stop_timeout = 5
|
plcprogram_stop_timeout = 5
|
||||||
plcprogram_watchdog = 0
|
plcprogram_watchdog = 0
|
||||||
plcarguments =
|
plcarguments =
|
||||||
plcuid = 1000
|
plcuid = 1000
|
||||||
plcgid = 1000
|
plcgid = 1000
|
||||||
pythonversion = 3
|
pythonversion = 3
|
||||||
@@ -28,6 +28,7 @@ watchdog = 1
|
|||||||
xmlrpc = 1
|
xmlrpc = 1
|
||||||
aclfile = /etc/revpipyload/aclxmlrpc.conf
|
aclfile = /etc/revpipyload/aclxmlrpc.conf
|
||||||
bindip = socket
|
bindip = socket
|
||||||
|
unixgroup = picontrol
|
||||||
|
|
||||||
[MQTT]
|
[MQTT]
|
||||||
mqtt = 0
|
mqtt = 0
|
||||||
@@ -38,6 +39,6 @@ write_outputs = 0
|
|||||||
broker_address = localhost
|
broker_address = localhost
|
||||||
port = 1883
|
port = 1883
|
||||||
tls_set = 0
|
tls_set = 0
|
||||||
username =
|
username =
|
||||||
password =
|
password =
|
||||||
client_id =
|
client_id =
|
||||||
|
|||||||
@@ -331,6 +331,7 @@ class RevPiPyLoad:
|
|||||||
self.xmlrpcbindip = "127.0.0.1"
|
self.xmlrpcbindip = "127.0.0.1"
|
||||||
|
|
||||||
self.xmlrpcport = self.globalconfig.getint("XMLRPC", "port", fallback=55123)
|
self.xmlrpcport = self.globalconfig.getint("XMLRPC", "port", fallback=55123)
|
||||||
|
self.xmlrpcunixgroup = self.globalconfig.get("XMLRPC", "unixgroup", fallback="picontrol")
|
||||||
|
|
||||||
# Workdirectory wechseln
|
# Workdirectory wechseln
|
||||||
if not os.access(self.plcworkdir, os.R_OK | os.W_OK | os.X_OK):
|
if not os.access(self.plcworkdir, os.R_OK | os.W_OK | os.X_OK):
|
||||||
@@ -414,9 +415,9 @@ class RevPiPyLoad:
|
|||||||
|
|
||||||
self.xsrv = UnixStreamXMLRPCServer(
|
self.xsrv = UnixStreamXMLRPCServer(
|
||||||
self.xmlrpcbindip,
|
self.xmlrpcbindip,
|
||||||
requestHandler=UnixStreamXMLRPCRequestHandler,
|
|
||||||
logRequests=False,
|
logRequests=False,
|
||||||
allow_none=True,
|
allow_none=True,
|
||||||
|
unixgroup=self.xmlrpcunixgroup
|
||||||
)
|
)
|
||||||
|
|
||||||
else:
|
else:
|
||||||
|
|||||||
@@ -4,6 +4,8 @@ __author__ = "Sven Sager"
|
|||||||
__copyright__ = "Copyright (C) 2023 Sven Sager"
|
__copyright__ = "Copyright (C) 2023 Sven Sager"
|
||||||
__license__ = "GPLv2"
|
__license__ = "GPLv2"
|
||||||
|
|
||||||
|
import grp
|
||||||
|
import os
|
||||||
import socket
|
import socket
|
||||||
from xmlrpc.server import SimpleXMLRPCRequestHandler, SimpleXMLRPCServer
|
from xmlrpc.server import SimpleXMLRPCRequestHandler, SimpleXMLRPCServer
|
||||||
|
|
||||||
@@ -127,6 +129,54 @@ class UnixStreamXMLRPCServer(SimpleXMLRPCServer):
|
|||||||
"""XML-RPC Server fuer Unix Domain Sockets."""
|
"""XML-RPC Server fuer Unix Domain Sockets."""
|
||||||
address_family = socket.AF_UNIX
|
address_family = socket.AF_UNIX
|
||||||
|
|
||||||
|
def __init__(
|
||||||
|
self, addr, logRequests=True, allow_none=False, unixgroup="picontrol"):
|
||||||
|
"""Init UnixStreamXMLRPCServer class."""
|
||||||
|
proginit.logger.debug("enter UnixStreamXMLRPCServer.__init__()")
|
||||||
|
|
||||||
|
self.timeout = 0.5
|
||||||
|
self.unixgroup = unixgroup
|
||||||
|
|
||||||
|
# Create subdirectories for Unix Domain Socket
|
||||||
|
socket_dir = os.path.dirname(addr)
|
||||||
|
if socket_dir:
|
||||||
|
os.makedirs(socket_dir, exist_ok=True)
|
||||||
|
|
||||||
|
super().__init__(
|
||||||
|
addr=addr,
|
||||||
|
requestHandler=UnixStreamXMLRPCRequestHandler,
|
||||||
|
logRequests=logRequests,
|
||||||
|
allow_none=allow_none,
|
||||||
|
encoding="utf-8",
|
||||||
|
bind_and_activate=False,
|
||||||
|
)
|
||||||
|
|
||||||
|
proginit.logger.debug("leave UnixStreamXMLRPCServer.__init__()")
|
||||||
|
|
||||||
|
def server_bind(self):
|
||||||
|
"""Ueberschreibt server_bind um Berechtigungen zu setzen."""
|
||||||
|
super().server_bind()
|
||||||
|
|
||||||
|
# Gruppe setzen
|
||||||
|
try:
|
||||||
|
gid = grp.getgrnam(self.unixgroup).gr_gid
|
||||||
|
# -1 will leave the owner unchanged
|
||||||
|
os.chown(self.server_address, -1, gid)
|
||||||
|
except (KeyError, PermissionError):
|
||||||
|
proginit.logger.warning(
|
||||||
|
"can not set group of socket {0} to '{1}'"
|
||||||
|
"".format(self.server_address, self.unixgroup)
|
||||||
|
)
|
||||||
|
|
||||||
|
# Berechtigungen fuer restliche Benutzer entziehen
|
||||||
|
try:
|
||||||
|
os.chmod(self.server_address, 0o660)
|
||||||
|
except PermissionError:
|
||||||
|
proginit.logger.warning(
|
||||||
|
"can not set permissions of socket {0}"
|
||||||
|
"".format(self.server_address)
|
||||||
|
)
|
||||||
|
|
||||||
def _dispatch(self, method, params):
|
def _dispatch(self, method, params):
|
||||||
"""Prueft ACL Level fuer angeforderte Methode.
|
"""Prueft ACL Level fuer angeforderte Methode.
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user