mirror of
https://github.com/naruxde/revpipyload.git
synced 2025-11-08 15:13:52 +01:00
uid und gid für PLC Programm konfigurierbar (default 1000)
This commit is contained in:
@@ -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
|
||||||
|
|||||||
@@ -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"/>
|
||||||
|
|||||||
@@ -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:
|
||||||
|
|||||||
Reference in New Issue
Block a user