diff --git a/Dockerfile b/Dockerfile
new file mode 100644
index 0000000..53a7043
--- /dev/null
+++ b/Dockerfile
@@ -0,0 +1,8 @@
+FROM debian
+
+RUN apt-get update && apt-get install -y build-essential pkg-config bison flex autoconf automake libtool make git python2.7 python-pip sqlite3 cmake git
+RUN pip install flask flask-login pyserial
+COPY . /workdir
+RUN cd /workdir && ./install.sh docker
+WORKDIR /workdir
+ENTRYPOINT ["./start_openplc.sh"]
diff --git a/README.md b/README.md
index 7e8faf8..62277d0 100644
--- a/README.md
+++ b/README.md
@@ -4,21 +4,39 @@ The OpenPLC Project consists of three sub-projects:
1. [Runtime](https://github.com/thiagoralves/OpenPLC_v3)
2. [Programming editor](http://www.openplcproject.com/plcopen-editor)
3. [HMI builder](http://www.openplcproject.com/reference-installing-scadabr)
-
-To install:
-
+
+## Installation:
+```bash
git clone https://github.com/thiagoralves/OpenPLC_v3.git
-
cd OpenPLC_v3
-
./install.sh [platform]
-
-where [platform] can be:
-
-win - Install OpenPLC on Windows over Cygwin
-
-linux - Install OpenPLC on a Debian-based Linux distribution
-
-rpi - Install OpenPLC on a Raspberry Pi
-
-custom - Skip all specific package installation and tries to install OpenPLC assuming your system already has all dependencies met. This option can be useful if you're trying to install OpenPLC on an unsuported Linux platform or had manually installed all the dependency packages before.
+```
+
+Where `[platform]` can be:
+
+`win` - Install OpenPLC on Windows over Cygwin
+
+`linux` - Install OpenPLC on a Debian-based Linux distribution
+
+`docker` - Used by the `Dockerfile` (i.e. doesn't invoke `sudo`)
+
+`rpi` - Install OpenPLC on a Raspberry Pi
+
+`custom` - Skip all specific package installation and tries to install OpenPLC assuming your system already has all dependencies met. This option can be useful if you're trying to install OpenPLC on an unsuported Linux platform or had manually installed all the dependency packages before.
+
+### Building, Installing and Running inside Docker
+Make sure [`docker` is installed](https://docs.docker.com/install/linux/docker-ce/ubuntu/)
+
+#### Build
+```
+# instead of running install.sh as stated above, run:
+docker build -t openplc:v3 .
+```
+
+#### RUN
+_Devices can be passed to the `docker` daemon using the `-v` flag (e.g. `-v /dev/ttyACM0:/dev/ttyACM0`)_
+
+```bash
+docker run -it --rm -p 8080:8080 openplc:v3
+```
+
diff --git a/install.sh b/install.sh
index f820e2c..462b2c9 100755
--- a/install.sh
+++ b/install.sh
@@ -6,6 +6,7 @@ if [ $# -eq 0 ]; then
echo "Usage: ./install.sh [platform] where [platform] can be"
echo " win Install OpenPLC on Windows over Cygwin"
echo " linux Install OpenPLC on a Debian-based Linux distribution"
+ echo " docker Install OpenPLC in a Docker container"
echo " rpi Install OpenPLC on a Raspberry Pi"
echo " neuron Install OpenPLC on a UniPi Neuron PLC"
echo " custom Skip all specific package installation and tries to install"
@@ -22,7 +23,7 @@ if [ "$1" == "win" ]; then
cp ./utils/apt-cyg/apt-cyg ./
cp ./utils/apt-cyg/wget.exe /bin
install apt-cyg /bin
- apt-cyg install lynx
+ apt-cyg install lynx
rm -f /bin/wget.exe
apt-cyg install wget gcc-core gcc-g++ git pkg-config automake autoconf libtool make python2 python2-pip sqlite3
lynx -source https://bootstrap.pypa.io/get-pip.py > get-pip.py
@@ -30,7 +31,7 @@ if [ "$1" == "win" ]; then
pip install flask
pip install flask-login
pip install pyserial
-
+
echo ""
echo "[MATIEC COMPILER]"
cp ./utils/matiec_src/bin_win32/*.* ./webserver/
@@ -39,7 +40,7 @@ if [ "$1" == "win" ]; then
echo "OpenPLC was NOT installed!"
exit 1
fi
-
+
echo ""
echo "[ST OPTIMIZER]"
cd utils/st_optimizer_src
@@ -51,7 +52,7 @@ if [ "$1" == "win" ]; then
exit 1
fi
cd ../..
-
+
echo ""
echo "[GLUE GENERATOR]"
cd utils/glue_generator_src
@@ -63,7 +64,7 @@ if [ "$1" == "win" ]; then
exit 1
fi
cd ../..
-
+
echo ""
echo "[OPEN DNP3]"
cd webserver/core
@@ -80,7 +81,7 @@ if [ "$1" == "win" ]; then
exit 1
fi
cd ../..
-
+
echo ""
echo "[LIBMODBUS]"
cd utils/libmodbus_src
@@ -93,14 +94,14 @@ if [ "$1" == "win" ]; then
exit 1
fi
cd ../..
-
+
echo ""
echo "[FINALIZING]"
cd webserver/scripts
./change_hardware_layer.sh blank
./compile_program.sh blank_program.st
cp ./start_openplc.sh ../../
-
+
elif [ "$1" == "linux" ]; then
@@ -140,7 +141,7 @@ elif [ "$1" == "linux" ]; then
exit 1
fi
cd ../..
-
+
echo ""
echo "[GLUE GENERATOR]"
cd utils/glue_generator_src
@@ -152,7 +153,7 @@ elif [ "$1" == "linux" ]; then
exit 1
fi
cd ../..
-
+
echo ""
echo "[OPEN DNP3]"
cd utils/dnp3_src
@@ -173,7 +174,7 @@ elif [ "$1" == "linux" ]; then
sudo swapoff swapfile
sudo rm -f ./swapfile
cd ../..
-
+
echo ""
echo "[LIBMODBUS]"
cd utils/libmodbus_src
@@ -187,7 +188,7 @@ elif [ "$1" == "linux" ]; then
fi
sudo ldconfig
cd ../..
-
+
echo ""
echo "[OPENPLC SERVICE]"
WORKING_DIR=$(pwd)
@@ -218,21 +219,11 @@ WantedBy=multi-user.target" >> openplc.service
./change_hardware_layer.sh blank_linux
./compile_program.sh blank_program.st
cp ./start_openplc.sh ../../
-
-
-elif [ "$1" == "rpi" ]; then
- echo "Installing OpenPLC on Raspberry Pi"
- sudo apt-get update
- sudo apt-get install build-essential pkg-config bison flex autoconf automake libtool make git python2.7 python-pip sqlite3 cmake wiringpi
- pip install flask
- pip install flask-login
- pip install pyserial
- #make sure that packages are also installed for the super user
- sudo -H pip install flask
- sudo -H pip install flask-login
- sudo -H pip install pyserial
-
+
+elif [ "$1" == "docker" ]; then
+ echo "Installing OpenPLC on Linux inside Docker"
+
echo ""
echo "[MATIEC COMPILER]"
cd utils/matiec_src
@@ -258,7 +249,7 @@ elif [ "$1" == "rpi" ]; then
exit 1
fi
cd ../..
-
+
echo ""
echo "[GLUE GENERATOR]"
cd utils/glue_generator_src
@@ -270,7 +261,99 @@ elif [ "$1" == "rpi" ]; then
exit 1
fi
cd ../..
-
+
+ echo ""
+ echo "[OPEN DNP3]"
+ cd utils/dnp3_src
+ echo "creating swapfile..."
+ dd if=/dev/zero of=swapfile bs=1M count=1000
+ mkswap swapfile
+ swapon swapfile
+ cmake ../dnp3_src
+ make
+ make install
+ if [ $? -ne 0 ]; then
+ echo "Error installing OpenDNP3"
+ echo "OpenPLC was NOT installed!"
+ exit 1
+ fi
+ ldconfig
+ echo "removing swapfile..."
+ swapoff swapfile
+ rm -f ./swapfile
+ cd ../..
+
+ echo ""
+ echo "[LIBMODBUS]"
+ cd utils/libmodbus_src
+ ./autogen.sh
+ ./configure
+ make install
+ if [ $? -ne 0 ]; then
+ echo "Error installing Libmodbus"
+ echo "OpenPLC was NOT installed!"
+ exit 1
+ fi
+ ldconfig
+ cd ../..
+
+ echo ""
+ echo "[FINALIZING]"
+ cd webserver/scripts
+ ./change_hardware_layer.sh blank_linux
+ ./compile_program.sh blank_program.st
+ cp ./start_openplc.sh ../../
+
+elif [ "$1" == "rpi" ]; then
+ echo "Installing OpenPLC on Raspberry Pi"
+ sudo apt-get update
+ sudo apt-get install build-essential pkg-config bison flex autoconf automake libtool make git python2.7 python-pip sqlite3 cmake wiringpi
+ pip install flask
+ pip install flask-login
+ pip install pyserial
+ #make sure that packages are also installed for the super user
+ sudo -H pip install flask
+ sudo -H pip install flask-login
+ sudo -H pip install pyserial
+
+ echo ""
+ echo "[MATIEC COMPILER]"
+ cd utils/matiec_src
+ autoreconf -i
+ ./configure
+ make
+ cp ./iec2c ../../webserver/
+ if [ $? -ne 0 ]; then
+ echo "Error compiling MatIEC"
+ echo "OpenPLC was NOT installed!"
+ exit 1
+ fi
+ cd ../..
+
+ echo ""
+ echo "[ST OPTIMIZER]"
+ cd utils/st_optimizer_src
+ g++ st_optimizer.cpp -o st_optimizer
+ cp ./st_optimizer ../../webserver/
+ if [ $? -ne 0 ]; then
+ echo "Error compiling ST Optimizer"
+ echo "OpenPLC was NOT installed!"
+ exit 1
+ fi
+ cd ../..
+
+ echo ""
+ echo "[GLUE GENERATOR]"
+ cd utils/glue_generator_src
+ g++ glue_generator.cpp -o glue_generator
+ cp ./glue_generator ../../webserver/core
+ if [ $? -ne 0 ]; then
+ echo "Error compiling Glue Generator"
+ echo "OpenPLC was NOT installed!"
+ exit 1
+ fi
+ cd ../..
+
echo ""
echo "[OPEN DNP3]"
cd utils/dnp3_src
@@ -291,7 +374,7 @@ elif [ "$1" == "rpi" ]; then
sudo swapoff swapfile
sudo rm -f ./swapfile
cd ../..
-
+
echo ""
echo "[LIBMODBUS]"
cd utils/libmodbus_src
@@ -305,7 +388,7 @@ elif [ "$1" == "rpi" ]; then
fi
sudo ldconfig
cd ../..
-
+
echo ""
echo "[OPENPLC SERVICE]"
WORKING_DIR=$(pwd)
@@ -376,7 +459,7 @@ elif [ "$1" == "neuron" ]; then
exit 1
fi
cd ../..
-
+
echo ""
echo "[GLUE GENERATOR]"
cd utils/glue_generator_src
@@ -388,7 +471,7 @@ elif [ "$1" == "neuron" ]; then
exit 1
fi
cd ../..
-
+
echo ""
echo "[OPEN DNP3]"
cd utils/dnp3_src
@@ -409,7 +492,7 @@ elif [ "$1" == "neuron" ]; then
sudo swapoff swapfile
sudo rm -f ./swapfile
cd ../..
-
+
echo ""
echo "[LIBMODBUS]"
cd utils/libmodbus_src
@@ -423,16 +506,16 @@ elif [ "$1" == "neuron" ]; then
fi
sudo ldconfig
cd ../..
-
+
echo ""
- echo "[DISABLING UNIPI SERVICES]"
+ echo "[DISABLING UNIPI SERVICES]"
sudo systemctl stop neuronhost.service
sudo systemctl disable neuronhost.service
sudo systemctl stop neurontcp.service
sudo systemctl disable neurontcp.service
sudo systemctl stop evok.service
sudo systemctl disable evok.service
-
+
echo ""
echo "[OPENPLC SERVICE]"
WORKING_DIR=$(pwd)
@@ -468,7 +551,7 @@ WantedBy=multi-user.target" >> openplc.service
elif [ "$1" == "custom" ]; then
echo "Installing OpenPLC on Custom Platform"
-
+
echo ""
echo "[MATIEC COMPILER]"
cd utils/matiec_src
@@ -494,7 +577,7 @@ elif [ "$1" == "custom" ]; then
exit 1
fi
cd ../..
-
+
echo ""
echo "[GLUE GENERATOR]"
cd utils/glue_generator_src
@@ -506,7 +589,7 @@ elif [ "$1" == "custom" ]; then
exit 1
fi
cd ../..
-
+
echo ""
echo "[OPEN DNP3]"
cd utils/dnp3_src
@@ -527,7 +610,7 @@ elif [ "$1" == "custom" ]; then
sudo swapoff swapfile
sudo rm -f ./swapfile
cd ../..
-
+
echo ""
echo "[LIBMODBUS]"
cd utils/libmodbus_src
@@ -541,7 +624,7 @@ elif [ "$1" == "custom" ]; then
fi
sudo ldconfig
cd ../..
-
+
echo ""
echo "[FINALIZING]"
cd webserver/scripts