--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/cli_tests/opcua_test_encrypted.bash Tue Oct 11 13:06:48 2022 +0200
@@ -0,0 +1,96 @@
+#!/bin/bash
+
+rm -f ./SRVOK ./PLCOK
+
+
+yes "" | openssl req -x509 -newkey rsa:2048 -keyout my_private_key.pem -out my_cert.pem \
+ -days 355 -nodes -addext "subjectAltName = URI:urn:example.org:FreeOpcUa:python-opcua"
+openssl x509 -outform der -in my_cert.pem -out my_cert.der
+
+# Run server
+$BEREMIZPYTHONPATH - > >(
+ echo "Start SRV loop"
+ while read line; do
+ # Wait for server to print modified value
+ echo "SRV>> $line"
+ if [[ "$line" == 3.4 ]]; then
+ echo "PLC could write value"
+ touch ./SRVOK
+ fi
+ done
+ echo "End SRV loop"
+) << EOF &
+
+import sys
+import time
+
+from opcua import ua, Server
+
+server = Server()
+server.set_endpoint("opc.tcp://127.0.0.1:4840/freeopcua/server/")
+
+server.set_security_policy([ua.SecurityPolicyType.Basic256Sha256_SignAndEncrypt])
+server.load_certificate("my_cert.der")
+server.load_private_key("my_private_key.pem")
+
+uri = "http://beremiz.github.io"
+idx = server.register_namespace(uri)
+
+objects = server.get_objects_node()
+
+testobj = objects.add_object(idx, "TestObject")
+testvarout = testobj.add_variable(idx, "TestOut", 1.2)
+testvar = testobj.add_variable(idx, "TestIn", 5.6)
+testvar.set_writable()
+
+server.start()
+
+try:
+ while True:
+ time.sleep(1)
+ print testvar.get_value()
+ sys.stdout.flush()
+finally:
+ server.stop()
+EOF
+SERVER_PID=$!
+
+cp my_cert.der my_private_key.pem \
+ $BEREMIZPATH/tests/projects/opcua_client_encrypted/project_files
+
+# Start PLC with opcua test
+setsid $BEREMIZPYTHONPATH $BEREMIZPATH/Beremiz_cli.py -k \
+ --project-home $BEREMIZPATH/tests/projects/opcua_client_encrypted build transfer run > >(
+echo "Start PLC loop"
+while read line; do
+ # Wait for PLC runtime to output expected value on stdout
+ echo "PLC>> $line"
+ if [[ "$line" == 1.2 ]]; then
+ echo "PLC could read value"
+ touch ./PLCOK
+ fi
+done
+echo "End PLC loop"
+) &
+PLC_PID=$!
+
+echo all subprocess started, start polling results
+res=110 # default to ETIMEDOUT
+c=45
+while ((c--)); do
+ if [[ -a ./SRVOK && -a ./PLCOK ]]; then
+ echo got results.
+ res=0 # OK success
+ break
+ else
+ echo waiting.... $c
+ sleep 1
+ fi
+done
+
+# Kill PLC and subprocess
+echo will kill PLC:$PLC_PID and SERVER:$SERVER_PID
+pkill -s $PLC_PID
+kill $SERVER_PID
+
+exit $res
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/projects/opcua_client_encrypted/beremiz.xml Tue Oct 11 13:06:48 2022 +0200
@@ -0,0 +1,4 @@
+<?xml version='1.0' encoding='utf-8'?>
+<BeremizRoot xmlns:xsd="http://www.w3.org/2001/XMLSchema" URI_location="LOCAL://">
+ <TargetType/>
+</BeremizRoot>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/projects/opcua_client_encrypted/opcua_0@opcua/baseconfnode.xml Tue Oct 11 13:06:48 2022 +0200
@@ -0,0 +1,2 @@
+<?xml version='1.0' encoding='utf-8'?>
+<BaseParams xmlns:xsd="http://www.w3.org/2001/XMLSchema" IEC_Channel="0" Name="opcua_0"/>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/projects/opcua_client_encrypted/opcua_0@opcua/confnode.xml Tue Oct 11 13:06:48 2022 +0200
@@ -0,0 +1,9 @@
+<?xml version='1.0' encoding='utf-8'?>
+<OPCUAClient xmlns:xsd="http://www.w3.org/2001/XMLSchema">
+ <AuthType>
+ <x509 Certificate="my_cert.der" PrivateKey="my_private_key.pem">
+ <Policy/>
+ <Mode/>
+ </x509>
+ </AuthType>
+</OPCUAClient>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/projects/opcua_client_encrypted/opcua_0@opcua/selected.csv Tue Oct 11 13:06:48 2022 +0200
@@ -0,0 +1,2 @@
+input,TestOut,2,int,2,Double,0
+output,TestIn,2,int,3,Double,0
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/projects/opcua_client_encrypted/plc.xml Tue Oct 11 13:06:48 2022 +0200
@@ -0,0 +1,208 @@
+<?xml version='1.0' encoding='utf-8'?>
+<project xmlns:ns1="http://www.plcopen.org/xml/tc6_0201" xmlns:xhtml="http://www.w3.org/1999/xhtml" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://www.plcopen.org/xml/tc6_0201">
+ <fileHeader companyName="Unknown" productName="Unnamed" productVersion="1" creationDateTime="2022-07-16T10:46:25"/>
+ <contentHeader name="Unnamed" modificationDateTime="2022-09-15T20:56:16">
+ <coordinateInfo>
+ <fbd>
+ <scaling x="5" y="5"/>
+ </fbd>
+ <ld>
+ <scaling x="0" y="0"/>
+ </ld>
+ <sfc>
+ <scaling x="0" y="0"/>
+ </sfc>
+ </coordinateInfo>
+ </contentHeader>
+ <types>
+ <dataTypes/>
+ <pous>
+ <pou name="program0" pouType="program">
+ <interface>
+ <localVars>
+ <variable name="LocalVar0" address="%IL0.0">
+ <type>
+ <LREAL/>
+ </type>
+ </variable>
+ <variable name="LocalVar1" address="%QL0.0">
+ <type>
+ <LREAL/>
+ </type>
+ </variable>
+ </localVars>
+ <localVars>
+ <variable name="python_poll0">
+ <type>
+ <derived name="python_poll"/>
+ </type>
+ </variable>
+ </localVars>
+ </interface>
+ <body>
+ <FBD>
+ <inVariable localId="1" executionOrderId="0" height="25" width="85" negated="false">
+ <position x="160" y="190"/>
+ <connectionPointOut>
+ <relPosition x="85" y="10"/>
+ </connectionPointOut>
+ <expression>LocalVar0</expression>
+ </inVariable>
+ <outVariable localId="2" executionOrderId="0" height="24" width="82" negated="false">
+ <position x="238" y="49"/>
+ <connectionPointIn>
+ <relPosition x="0" y="11"/>
+ <connection refLocalId="9">
+ <position x="238" y="60"/>
+ <position x="204" y="60"/>
+ </connection>
+ </connectionPointIn>
+ <expression>LocalVar1</expression>
+ </outVariable>
+ <block localId="4" typeName="python_poll" instanceName="python_poll0" executionOrderId="0" height="60" width="98">
+ <position x="658" y="101"/>
+ <inputVariables>
+ <variable formalParameter="TRIG">
+ <connectionPointIn>
+ <relPosition x="0" y="29"/>
+ <connection refLocalId="7">
+ <position x="658" y="130"/>
+ <position x="623" y="130"/>
+ </connection>
+ </connectionPointIn>
+ </variable>
+ <variable formalParameter="CODE">
+ <connectionPointIn>
+ <relPosition x="0" y="49"/>
+ <connection refLocalId="6" formalParameter="OUT">
+ <position x="658" y="150"/>
+ <position x="560" y="150"/>
+ </connection>
+ </connectionPointIn>
+ </variable>
+ </inputVariables>
+ <inOutVariables/>
+ <outputVariables>
+ <variable formalParameter="ACK">
+ <connectionPointOut>
+ <relPosition x="98" y="29"/>
+ </connectionPointOut>
+ </variable>
+ <variable formalParameter="RESULT">
+ <connectionPointOut>
+ <relPosition x="98" y="49"/>
+ </connectionPointOut>
+ </variable>
+ </outputVariables>
+ </block>
+ <block localId="5" typeName="LREAL_TO_STRING" executionOrderId="0" height="40" width="130">
+ <position x="280" y="170"/>
+ <inputVariables>
+ <variable formalParameter="IN">
+ <connectionPointIn>
+ <relPosition x="0" y="30"/>
+ <connection refLocalId="1">
+ <position x="280" y="200"/>
+ <position x="255" y="200"/>
+ <position x="255" y="200"/>
+ <position x="300" y="200"/>
+ <position x="300" y="200"/>
+ <position x="245" y="200"/>
+ </connection>
+ </connectionPointIn>
+ </variable>
+ </inputVariables>
+ <inOutVariables/>
+ <outputVariables>
+ <variable formalParameter="OUT">
+ <connectionPointOut>
+ <relPosition x="130" y="30"/>
+ </connectionPointOut>
+ </variable>
+ </outputVariables>
+ </block>
+ <block localId="6" typeName="CONCAT" executionOrderId="0" height="165" width="63">
+ <position x="497" y="108"/>
+ <inputVariables>
+ <variable formalParameter="IN1">
+ <connectionPointIn>
+ <relPosition x="0" y="42"/>
+ <connection refLocalId="3">
+ <position x="497" y="150"/>
+ <position x="330" y="150"/>
+ </connection>
+ </connectionPointIn>
+ </variable>
+ <variable formalParameter="IN2">
+ <connectionPointIn>
+ <relPosition x="0" y="92"/>
+ <connection refLocalId="5" formalParameter="OUT">
+ <position x="497" y="200"/>
+ <position x="410" y="200"/>
+ </connection>
+ </connectionPointIn>
+ </variable>
+ <variable formalParameter="IN3">
+ <connectionPointIn>
+ <relPosition x="0" y="142"/>
+ <connection refLocalId="8">
+ <position x="497" y="250"/>
+ <position x="225" y="250"/>
+ </connection>
+ </connectionPointIn>
+ </variable>
+ </inputVariables>
+ <inOutVariables/>
+ <outputVariables>
+ <variable formalParameter="OUT">
+ <connectionPointOut>
+ <relPosition x="63" y="42"/>
+ </connectionPointOut>
+ </variable>
+ </outputVariables>
+ </block>
+ <inVariable localId="7" executionOrderId="0" height="24" width="44" negated="false">
+ <position x="579" y="116"/>
+ <connectionPointOut>
+ <relPosition x="44" y="14"/>
+ </connectionPointOut>
+ <expression>TRUE</expression>
+ </inVariable>
+ <inVariable localId="3" executionOrderId="0" height="25" width="180" negated="false">
+ <position x="160" y="140"/>
+ <connectionPointOut>
+ <relPosition x="180" y="10"/>
+ </connectionPointOut>
+ <expression>'pfunc("'</expression>
+ </inVariable>
+ <inVariable localId="8" executionOrderId="0" height="25" width="230" negated="false">
+ <position x="165" y="240"/>
+ <connectionPointOut>
+ <relPosition x="230" y="10"/>
+ </connectionPointOut>
+ <expression>'\n")'</expression>
+ </inVariable>
+ <inVariable localId="9" executionOrderId="0" height="29" width="45" negated="false">
+ <position x="159" y="47"/>
+ <connectionPointOut>
+ <relPosition x="45" y="13"/>
+ </connectionPointOut>
+ <expression>3.4</expression>
+ </inVariable>
+ </FBD>
+ </body>
+ </pou>
+ </pous>
+ </types>
+ <instances>
+ <configurations>
+ <configuration name="config">
+ <resource name="resource1">
+ <task name="task0" priority="0" interval="T#100ms">
+ <pouInstance name="instance0" typeName="program0"/>
+ </task>
+ </resource>
+ </configuration>
+ </configurations>
+ </instances>
+</project>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/projects/opcua_client_encrypted/py_ext_0@py_ext/baseconfnode.xml Tue Oct 11 13:06:48 2022 +0200
@@ -0,0 +1,2 @@
+<?xml version='1.0' encoding='utf-8'?>
+<BaseParams xmlns:xsd="http://www.w3.org/2001/XMLSchema" IEC_Channel="1" Name="py_ext_0"/>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/projects/opcua_client_encrypted/py_ext_0@py_ext/pyfile.xml Tue Oct 11 13:06:48 2022 +0200
@@ -0,0 +1,36 @@
+<?xml version='1.0' encoding='utf-8'?>
+<PyFile xmlns:xhtml="http://www.w3.org/1999/xhtml" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
+ <variables/>
+ <globals>
+ <xhtml:p><![CDATA[
+import sys
+def pfunc(arg):
+ sys.stdout.write(arg)
+ sys.stdout.flush()
+
+pfunc("globals section\n")
+
+]]></xhtml:p>
+ </globals>
+ <init>
+ <xhtml:p><![CDATA[
+pfunc("init section\n")
+]]></xhtml:p>
+ </init>
+ <cleanup>
+ <xhtml:p><![CDATA[
+pfunc("cleanup section\n")
+]]></xhtml:p>
+ </cleanup>
+ <start>
+ <xhtml:p><![CDATA[
+pfunc("start section\n")
+]]></xhtml:p>
+ </start>
+ <stop>
+ <xhtml:p><![CDATA[
+pfunc("stop section\n")
+
+]]></xhtml:p>
+ </stop>
+</PyFile>