Dockerize everything

This commit is contained in:
Patrick McDonagh
2017-05-23 12:38:03 -05:00
parent 0644242498
commit fa6d451f71
8 changed files with 91 additions and 22 deletions

32
docker-compose.yml Normal file
View File

@@ -0,0 +1,32 @@
version : '2'
services:
mongodb:
image: docker.henrypump.cloud/poc_modbus/mongodb
ports:
- "27017:27017"
restart: on-failure
scraper:
image: docker.henrypump.cloud/poc_modbus/scraper
depends_on:
- modbus_server
restart: on-failure
environment:
- PLC_IP_ADDRESS=1601.denise.henryres.cloudcnx.net
modbus_server:
image: docker.henrypump.cloud/poc_modbus/modbus_server
depends_on:
- mongodb
links:
- mongodb
ports:
- "502:502"
restart: on-failure
environment:
- PLC_IP_ADDRESS=1601.denise.henryres.cloudcnx.net
# portainer:
# image: portainer/portainer
# volumes:
# - /var/run/docker.sock:/var/run/docker.sock
# ports:
# - "9000:9000"
# restart: on-failure

View File

@@ -0,0 +1,13 @@
FROM python:2.7
# Install some python packages
RUN pip install requests pymongo pymodbus cryptography pyasn1
RUN pip install git+https://github.com/Henry-Pump/Pycomm-Helper.git
RUN pip install git+https://github.com/ruscito/pycomm.git
# Copy source files
RUN mkdir /root/poc_to_modbus
COPY poc_modbus_server/poc_to_modbus.py /root/poc_to_modbus/poc_to_modbus.py
COPY poc_modbus_server/run_server.py /root/poc_to_modbus/run_server.py
CMD ["python", "-u", "/root/poc_to_modbus/run_server.py"]

View File

@@ -103,8 +103,9 @@ class DigitalTagDataBlock(ModbusSparseDataBlock):
super(DigitalTagDataBlock, self).__init__(values) super(DigitalTagDataBlock, self).__init__(values)
def getValues(self, address, count=1): def getValues(self, address, count=1):
client = MongoClient() client = MongoClient(host="mongodb", port=27017)
db = client.tag_data db = client.tag_data
db.authenticate(name="poc", password="poc")
tags = db.tag_vals tags = db.tag_vals
for i in range(address, address + count): for i in range(address, address + count):
@@ -120,8 +121,9 @@ class DigitalTagDataBlock(ModbusSparseDataBlock):
:param address: The starting address :param address: The starting address
:param values: The new values to be set :param values: The new values to be set
''' '''
client = MongoClient() client = MongoClient(host="mongodb", port=27017)
db = client.tag_data db = client.tag_data
db.authenticate(name="poc", password="poc")
tags = db.tag_vals tags = db.tag_vals
tag_found = tags.find_one({'register_number': address, 'register_type': self.register_type}) tag_found = tags.find_one({'register_number': address, 'register_type': self.register_type})
tag_name = tag_found['tag_name'] tag_name = tag_found['tag_name']
@@ -172,8 +174,9 @@ class AnalogTagDataBlock(ModbusSparseDataBlock):
super(AnalogTagDataBlock, self).__init__(values) super(AnalogTagDataBlock, self).__init__(values)
def getValues(self, address, count=1): def getValues(self, address, count=1):
client = MongoClient() client = MongoClient(host="mongodb", port=27017)
db = client.tag_data db = client.tag_data
db.authenticate(name="poc", password="poc")
tags = db.tag_vals tags = db.tag_vals
try: try:
for i in range(address, address + count): for i in range(address, address + count):
@@ -205,8 +208,9 @@ class AnalogTagDataBlock(ModbusSparseDataBlock):
''' '''
print("provided values: {}".format(value)) print("provided values: {}".format(value))
try: try:
client = MongoClient() client = MongoClient(host="mongodb", port=27017)
db = client.tag_data db = client.tag_data
db.authenticate(name="poc", password="poc")
tags = db.tag_vals tags = db.tag_vals
tag_found = tags.find_one({'register_number': address, 'register_type': self.register_type}) tag_found = tags.find_one({'register_number': address, 'register_type': self.register_type})
tag_name = tag_found['tag_name'] tag_name = tag_found['tag_name']
@@ -226,8 +230,9 @@ class AnalogTagDataBlock(ModbusSparseDataBlock):
def getTagsFromDB(): def getTagsFromDB():
client = MongoClient() client = MongoClient(host="mongodb", port=27017)
db = client.tag_data db = client.tag_data
db.authenticate(name="poc", password="poc")
tags = db.tag_vals tags = db.tag_vals
print("Found {} tags in the database".format(tags.count())) print("Found {} tags in the database".format(tags.count()))
di_tags_cur = tags.find({'register_type': 'di'}) di_tags_cur = tags.find({'register_type': 'di'})

View File

@@ -82,7 +82,6 @@ setup(
'pymodbus', 'pymodbus',
'cryptography', 'cryptography',
'pyasn1', 'pyasn1',
'pycomm_helper',
], ],
dependency_links=[ dependency_links=[
'https://github.com/Henry-Pump/Pycomm-Helper/tarball/master#egg=pycomm_helper-0.1', 'https://github.com/Henry-Pump/Pycomm-Helper/tarball/master#egg=pycomm_helper-0.1',

12
poc_scraper/Dockerfile Normal file
View File

@@ -0,0 +1,12 @@
FROM python:2.7
# Install some python packages
RUN pip install requests pymongo
RUN pip install git+https://github.com/Henry-Pump/Pycomm-Helper.git
RUN pip install git+https://github.com/ruscito/pycomm.git
# Copy source files
RUN mkdir /root/poc_scraper
COPY poc_scraper /root/poc_scraper
CMD ["python", "-u", "/root/poc_scraper/__main__.py"]

View File

@@ -5,6 +5,6 @@ from sys import exit
PLC_IP_ADDRESS = getenv("PLC_IP_ADDRESS") PLC_IP_ADDRESS = getenv("PLC_IP_ADDRESS")
if not PLC_IP_ADDRESS: if not PLC_IP_ADDRESS:
exit("No PLC_IP_ADDRESS set in the environment variables") exit("No PLC_IP_ADDRESS set in the environment variables")
print("PLC_IP_ADDRESS for scraper: {}".format(PLC_IP_ADDRESS))
scraper_thread = PLC_to_Mongo(PLC_IP_ADDRESS) scraper_thread = PLC_to_Mongo(PLC_IP_ADDRESS)
scraper_thread.run() scraper_thread.run()

View File

@@ -1,22 +1,24 @@
import pymongo
import json import json
from time import sleep from time import sleep
from time import time as now from time import time as now
from pymongo import MongoClient from pymongo import MongoClient
import pycomm_helper.utils as plc import pycomm_helper.utils as plc
import os import os
import traceback
class PLC_to_Mongo(): class PLC_to_Mongo():
def __init__(self, plc_address): def __init__(self, plc_address):
client = MongoClient()
self.db = client.tag_data
self.tag_vals = self.db.tag_vals
self.PLC_IP_ADDRESS = plc_address self.PLC_IP_ADDRESS = plc_address
def run(self): def run(self):
client = MongoClient(host="mongodb", port=27017)
db = client.tag_data
db.authenticate(name="poc", password="poc")
tag_vals = db.tag_vals
script_path = os.path.dirname(os.path.realpath(__file__)) script_path = os.path.dirname(os.path.realpath(__file__))
print("THERE ARE ALREADY {} VALUES IN tag_vals".format(self.tag_vals.count())) print("THERE ARE ALREADY {} VALUES IN tag_vals".format(tag_vals.count()))
with open(script_path + '/analog.json', 'rb') as analogfile: with open(script_path + '/analog.json', 'rb') as analogfile:
analog_list = json.loads(analogfile.read()) analog_list = json.loads(analogfile.read())
@@ -27,9 +29,9 @@ class PLC_to_Mongo():
arr_list = json.loads(arrayfile.read()) arr_list = json.loads(arrayfile.read())
for entry in analog_list + digital_list + arr_list: for entry in analog_list + digital_list + arr_list:
if self.tag_vals.find({'tag_name': entry['tag_name']}).count() < 1: if tag_vals.find({'tag_name': entry['tag_name']}).count() < 1:
self.tag_vals.insert(entry) tag_vals.insert(entry)
print("NOW THERE ARE {} VALUES IN tag_vals".format(self.tag_vals.count())) print("NOW THERE ARE {} VALUES IN tag_vals".format(tag_vals.count()))
while True: while True:
for t in analog_list: for t in analog_list:
@@ -39,10 +41,12 @@ class PLC_to_Mongo():
t['tag_type'] = plc_val[1] t['tag_type'] = plc_val[1]
t['val'] = plc_val[0] t['val'] = plc_val[0]
t['timestamp'] = now() t['timestamp'] = now()
self.tag_vals.update({'tag_name': t['tag_name']}, t) tag_vals.update({'tag_name': t['tag_name']}, t)
print("Updated: {} - {}".format(t['tag_name'], t['val'])) print("Updated: {} - {}".format(t['tag_name'], t['val']))
except Exception as e: except Exception as e:
print("[ERROR] {} - {}".format(t['tag_name'], e)) print("[ERROR] {} - {}".format(t['tag_name'], e))
print("IP: {}, Tag: {}".format(self.PLC_IP_ADDRESS, t['tag_name']))
traceback.print_exc()
for t in digital_list: for t in digital_list:
try: try:
@@ -51,10 +55,12 @@ class PLC_to_Mongo():
t['tag_type'] = plc_val[1] t['tag_type'] = plc_val[1]
t['val'] = plc_val[0] t['val'] = plc_val[0]
t['timestamp'] = now() t['timestamp'] = now()
self.tag_vals.update({'tag_name': t['tag_name']}, t) tag_vals.update({'tag_name': t['tag_name']}, t)
print("Updated: {} - {}".format(t['tag_name'], t['val'])) print("Updated: {} - {}".format(t['tag_name'], t['val']))
except Exception as e: except Exception as e:
print("[ERROR] {} - {}".format(t['tag_name'], e)) print("[ERROR] {} - {}".format(t['tag_name'], e))
print("IP: {}, Tag: {}".format(self.PLC_IP_ADDRESS, t['tag_name']))
traceback.print_exc()
for a in arr_list: for a in arr_list:
try: try:
@@ -63,17 +69,19 @@ class PLC_to_Mongo():
a['val'] = plc_val a['val'] = plc_val
a['tag_type'] = 'ARRAY' a['tag_type'] = 'ARRAY'
t['timestamp'] = now() t['timestamp'] = now()
self.tag_vals.update({'tag_name': a['tag_name']}, a) tag_vals.update({'tag_name': a['tag_name']}, a)
print("Updated: {} - {}".format(a['tag_name'], a['val'])) print("Updated: {} - {}".format(a['tag_name'], a['val']))
except Exception as e: except Exception as e:
print("[ERROR] {} - {}".format(a['tag_name'], e)) print("[ERROR] {} - {}".format(a['tag_name'], e))
traceback.print_exc()
sleep(5) sleep(5)
def purge(self): def purge(self):
client = MongoClient() client = MongoClient(host="mongodb", port=27017)
db = client.tag_data db = client.tag_data
db.authenticate(name="poc", password="poc")
self.tag_vals = db.tag_vals tag_vals = db.tag_vals
self.tag_vals.delete_many({}) tag_vals.delete_many({})
print("THERE ARE {} VALUES IN tag_vals".format(self.tag_vals.count())) print("THERE ARE {} VALUES IN tag_vals".format(tag_vals.count()))