uid und gid für PLC Programm konfigurierbar (default 1000)

This commit is contained in:
2017-03-16 11:02:35 +01:00
parent c447b01369
commit 4f6bdf3072
4 changed files with 50 additions and 28 deletions

View File

@@ -3,6 +3,8 @@ autoreload=1
autostart=1 autostart=1
plcworkdir=/var/lib/revpipyload plcworkdir=/var/lib/revpipyload
plcprogram=program.py plcprogram=program.py
plcuid=1000
plcgid=1000
plcslave=0 plcslave=0
pythonversion=3 pythonversion=3
xmlrpc=0 xmlrpc=0

View File

@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE Project SYSTEM "Project-5.1.dtd"> <!DOCTYPE Project SYSTEM "Project-5.1.dtd">
<!-- eric project file for project revpipyload --> <!-- eric project file for project revpipyload -->
<!-- Saved: 2017-03-15, 09:47:38 --> <!-- Saved: 2017-03-16, 10:59:23 -->
<!-- Copyright (C) 2017 Sven Sager, akira@narux.de --> <!-- Copyright (C) 2017 Sven Sager, akira@narux.de -->
<Project version="5.1"> <Project version="5.1">
<Language>en_US</Language> <Language>en_US</Language>
@@ -9,7 +9,7 @@
<ProgLanguage mixed="0">Python3</ProgLanguage> <ProgLanguage mixed="0">Python3</ProgLanguage>
<ProjectType>Console</ProjectType> <ProjectType>Console</ProjectType>
<Description>Dieser Loader wird über das Init-System geladen und führt das angegebene Pythonprogramm aus. Es ist für den RevolutionPi gedacht um automatisch das SPS-Programm zu starten.</Description> <Description>Dieser Loader wird über das Init-System geladen und führt das angegebene Pythonprogramm aus. Es ist für den RevolutionPi gedacht um automatisch das SPS-Programm zu starten.</Description>
<Version>0.2.6</Version> <Version>0.2.7</Version>
<Author>Sven Sager</Author> <Author>Sven Sager</Author>
<Email>akira@narux.de</Email> <Email>akira@narux.de</Email>
<Eol index="-1"/> <Eol index="-1"/>

View File

@@ -51,7 +51,7 @@ from xmlrpc.server import SimpleXMLRPCServer
configrsc = "/opt/KUNBUS/config.rsc" configrsc = "/opt/KUNBUS/config.rsc"
picontrolreset = "/opt/KUNBUS/piControlReset" picontrolreset = "/opt/KUNBUS/piControlReset"
procimg = "/dev/piControl0" procimg = "/dev/piControl0"
pyloadverion = "0.2.6" pyloadverion = "0.2.7"
class LogReader(): class LogReader():
@@ -169,12 +169,33 @@ class RevPiPlc(Thread):
self.autoreload = False self.autoreload = False
self._evt_exit = Event() self._evt_exit = Event()
self.exitcode = None self.exitcode = None
self._fh = None
self.gid = 65534
self._program = program self._program = program
self._procplc = None self._procplc = None
self._pversion = pversion self._pversion = pversion
self.uid = 65534
self.zeroonerror = False self.zeroonerror = False
self.zeroonexit = False self.zeroonexit = False
def _setuppopen(self):
"""Setzt UID und GID fuer das PLC Programm."""
os.setgid(self.gid)
os.setuid(self.uid)
def _spopen(self, lst_proc):
"""Startet das PLC Programm.
@param lst_proc: Prozessliste
@returns: subprocess"""
return subprocess.Popen(
lst_proc,
preexec_fn=self._setuppopen,
cwd=os.path.dirname(self._program),
bufsize=1,
stdout=subprocess.STDOUT if self._fh is None else self._fh,
stderr=subprocess.STDOUT
)
def _zeroprocimg(self): def _zeroprocimg(self):
"""Setzt Prozessabbild auf NULL.""" """Setzt Prozessabbild auf NULL."""
if os.path.exists("/dev/piControl0"): if os.path.exists("/dev/piControl0"):
@@ -189,25 +210,24 @@ class RevPiPlc(Thread):
lst_proc = shlex.split("/usr/bin/env python3 -u " + self._program) lst_proc = shlex.split("/usr/bin/env python3 -u " + self._program)
# Ausgaben konfigurieren und ggf. umleiten # Ausgaben konfigurieren und ggf. umleiten
fh = None logfile = None
if proginit.pargs.daemon: if proginit.pargs.daemon:
if os.access(os.path.dirname(proginit.logapp), os.R_OK | os.W_OK): if os.access(os.path.dirname(proginit.logapp), os.R_OK | os.W_OK):
fh = proginit.logapp logfile = proginit.logapp
elif proginit.pargs.logfile is not None: elif proginit.pargs.logfile is not None:
fh = proginit.pargs.logfile logfile = proginit.pargs.logfile
if fh is not None: if logfile is not None:
fh = open(fh, "a") self._fh = open(logfile, "a")
fh.write("-" * 45) self._fh.write("-" * 55)
fh.write("\nplc app started: {}\n".format(asctime())) self._fh.write("\nplc: {} started: {}\n".format(
fh.flush() os.path.basename(self._program), asctime()
))
self._fh.flush()
# Prozess erstellen # Prozess erstellen
proginit.logger.info("start plc program {}".format(self._program)) proginit.logger.info("start plc program {}".format(self._program))
self._procplc = subprocess.Popen( self._procplc = self._spopen(lst_proc)
lst_proc, cwd=os.path.dirname(self._program),
bufsize=1, stdout=fh, stderr=subprocess.STDOUT
)
while not self._evt_exit.is_set(): while not self._evt_exit.is_set():
@@ -215,7 +235,6 @@ class RevPiPlc(Thread):
self.exitcode = self._procplc.poll() self.exitcode = self._procplc.poll()
if self.exitcode is not None: if self.exitcode is not None:
if self.exitcode > 0: if self.exitcode > 0:
# PLC Python Programm abgestürzt # PLC Python Programm abgestürzt
proginit.logger.error( proginit.logger.error(
@@ -239,10 +258,7 @@ class RevPiPlc(Thread):
if not self._evt_exit.is_set() and self.autoreload: if not self._evt_exit.is_set() and self.autoreload:
# Prozess neu starten # Prozess neu starten
self._procplc = subprocess.Popen( self._procplc = self._spopen(lst_proc)
lst_proc, cwd=os.path.dirname(self._program),
bufsize=1, stdout=fh, stderr=subprocess.STDOUT
)
if self.exitcode == 0: if self.exitcode == 0:
proginit.logger.warning( proginit.logger.warning(
"restart plc program after clean exit" "restart plc program after clean exit"
@@ -256,13 +272,15 @@ class RevPiPlc(Thread):
self._evt_exit.wait(1) self._evt_exit.wait(1)
# Prüfen ob es einen subprocess gibt
if self._procplc is None:
return
# Prozess beenden # Prozess beenden
count = 0 count = 0
proginit.logger.info("term plc program {}".format(self._program)) proginit.logger.info("term plc program {}".format(self._program))
# TODO: Prüfen ob es überhautp noch läuft
self._procplc.terminate() self._procplc.terminate()
while self._procplc.poll() is None and count < 10: while self._procplc.poll() is None and count < 10:
count += 1 count += 1
proginit.logger.info( proginit.logger.info(
@@ -340,9 +358,9 @@ class RevPiPyLoad(proginit.ProgInit):
self.autostart = \ self.autostart = \
int(self.globalconfig["DEFAULT"].get("autostart", 0)) int(self.globalconfig["DEFAULT"].get("autostart", 0))
self.plcprog = \ self.plcprog = \
self.globalconfig["DEFAULT"].get("plcprogram", None) self.globalconfig["DEFAULT"].get("plcprogram", "none.py")
self.plcworkdir = \ self.plcworkdir = \
self.globalconfig["DEFAULT"].get("plcworkdir", "/var/lib/revpipyload") self.globalconfig["DEFAULT"].get("plcworkdir", ".")
self.plcslave = \ self.plcslave = \
int(self.globalconfig["DEFAULT"].get("plcslave", 0)) int(self.globalconfig["DEFAULT"].get("plcslave", 0))
self.pythonver = \ self.pythonver = \
@@ -427,12 +445,14 @@ class RevPiPyLoad(proginit.ProgInit):
proginit.logger.error("plc file does not exists {}".format( proginit.logger.error("plc file does not exists {}".format(
os.path.join(self.plcworkdir, self.plcprog) os.path.join(self.plcworkdir, self.plcprog)
)) ))
return return None
proginit.logger.debug("create PLC watcher") proginit.logger.debug("create PLC watcher")
th_plc = RevPiPlc( th_plc = RevPiPlc(
os.path.join(self.plcworkdir, self.plcprog), self.pythonver) os.path.join(self.plcworkdir, self.plcprog), self.pythonver)
th_plc.autoreload = self.autoreload th_plc.autoreload = self.autoreload
th_plc.gid = int(self.globalconfig["DEFAULT"].get("plcgid", 65534))
th_plc.uid = int(self.globalconfig["DEFAULT"].get("plcuid", 65534))
th_plc.zeroonerror = self.zerooneerror th_plc.zeroonerror = self.zerooneerror
th_plc.zeroonexit = self.zeroonexit th_plc.zeroonexit = self.zeroonexit
proginit.logger.debug("created PLC watcher") proginit.logger.debug("created PLC watcher")
@@ -724,7 +744,7 @@ class RevPiPyLoad(proginit.ProgInit):
fh = open(self.globalconffile, "w") fh = open(self.globalconffile, "w")
self.globalconfig.write(fh) self.globalconfig.write(fh)
proginit.logger.info( proginit.logger.info(
"got new config and wrote ist to {}".format(self.globalconffile) "got new config and wrote it to {}".format(self.globalconffile)
) )
if loadnow: if loadnow:

View File

@@ -27,7 +27,7 @@ setup(
license="LGPLv3", license="LGPLv3",
name="revpipyload", name="revpipyload",
version="0.2.6", version="0.2.7",
scripts=["data/revpipyload"], scripts=["data/revpipyload"],