commit 57de6231da389204565110bef718c28aa43cba41 Author: Ray Ozzie Date: Mon Mar 21 12:36:55 2016 -0700 initial commit diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..a6227c2 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,17 @@ +FROM resin/raspberrypi + +# Enable systemd +ENV INITSYSTEM on + +# Copy all the source code to the place where golang will find it +COPY . ~/ttn-gateway + +# Build the gateway +WORKDIR ~/ttn-gateway +RUN ./install.sh + +# Make sure we start up within the bin directory +WORKDIR ~/opt/ttn-gateway/bin + +# Start it up +CMD ["sh", "-c", "env && ./start.sh"] diff --git a/Dockerfile~ b/Dockerfile~ new file mode 100644 index 0000000..581ca20 --- /dev/null +++ b/Dockerfile~ @@ -0,0 +1,17 @@ +FROM resin/raspberrypi-golang + +# What's the name of your go package? +ENV PKG test + +# Enable systemd +ENV INITSYSTEM on + +# Copy all the source code to the place where golang will find it +COPY ./src $GOPATH/src + +# Build all the golang source +WORKDIR $GOPATH/src/$PKG +RUN go get && go install && go build all + +# Tell the container to run the golang program's binary on startup +CMD ["sh", "-c", "env && $GOPATH/bin/$PKG"] diff --git a/install.sh b/install.sh new file mode 100755 index 0000000..5366489 --- /dev/null +++ b/install.sh @@ -0,0 +1,122 @@ +#!/bin/bash + +# Stop on the first sign of trouble +set -e + +if [ $UID != 0 ]; then + echo "ERROR: Operation not permitted. Forgot sudo?" + exit 1 +fi + +VERSION="master" +if [[ $1 != "" ]]; then VERSION=$1; fi + +echo "The Things Network Gateway installer" +echo "Version $VERSION" + +# Update the gateway installer to the correct branch (defaults to master) +echo "Updating installer files..." +OLD_HEAD=$(git rev-parse HEAD) +git fetch +git checkout -q $VERSION +git pull +NEW_HEAD=$(git rev-parse HEAD) + +if [[ $OLD_HEAD != $NEW_HEAD ]]; then + echo "New installer found. Restarting process..." + exec "./install.sh" "$VERSION" +fi + +# Retrieve gateway configuration for later +echo "Configure your gateway:" +printf " Descriptive name [ttn-ic880a]:" +read GATEWAY_NAME +if [[ $GATEWAY_NAME == "" ]]; then GATEWAY_NAME="ttn-ic880a"; fi + +printf " Contact email: " +read GATEWAY_EMAIL + +printf " Latitude [0]: " +read GATEWAY_LAT +if [[ $GATEWAY_LAT == "" ]]; then GATEWAY_LAT=0; fi + +printf " Longitude [0]: " +read GATEWAY_LON +if [[ $GATEWAY_LON == "" ]]; then GATEWAY_LON=0; fi + +printf " Altitude [0]: " +read GATEWAY_ALT +if [[ $GATEWAY_ALT == "" ]]; then GATEWAY_ALT=0; fi + +# Check dependencies +echo "Installing dependencies..." +apt-get update +apt-get install swig libftdi-dev python-dev + +# Install LoRaWAN packet forwarder repositories +INSTALL_DIR="/opt/ttn-gateway" +if [ ! -d "$INSTALL_DIR" ]; then mkdir $INSTALL_DIR; fi +pushd $INSTALL_DIR + +# Build libraries +if [ ! -d libmpsse ]; then + git clone https://github.com/devttys0/libmpsse.git + pushd libmpsse/src +else + pushd libmpsse/src + git reset --hard + git pull +fi + +./configure --disable-python +make +make install +ldconfig + +popd + +# Build LoRa gateway app +if [ ! -d lora_gateway ]; then + git clone https://github.com/TheThingsNetwork/lora_gateway.git + pushd lora_gateway +else + pushd lora_gateway + git reset --hard + git pull +fi + +cp ./libloragw/99-libftdi.rules /etc/udev/rules.d/99-libftdi.rules + +sed -i -e 's/CFG_SPI= native/CFG_SPI= ftdi/g' ./libloragw/library.cfg +sed -i -e 's/PLATFORM= kerlink/PLATFORM= lorank/g' ./libloragw/library.cfg +sed -i -e 's/ATTRS{idProduct}=="6010"/ATTRS{idProduct}=="6014"/g' /etc/udev/rules.d/99-libftdi.rules + +make + +popd + +# Build packet forwarder +if [ ! -d packet_forwarder ]; then + git clone https://github.com/TheThingsNetwork/packet_forwarder.git + pushd packet_forwarder +else + pushd packet_forwarder + git pull + git reset --hard +fi + +make + +popd + +# Symlink poly packet forwarder +if [ ! -d bin ]; then mkdir bin; fi +if [ -f ./bin/poly_pkt_fwd ]; then rm ./bin/poly_pkt_fwd; fi +ln -s $INSTALL_DIR/packet_forwarder/poly_pkt_fwd/poly_pkt_fwd ./bin/poly_pkt_fwd +cp -f ./packet_forwarder/poly_pkt_fwd/global_conf.json ./bin/global_conf.json + +echo -e "{\n\t\"gateway_conf\": {\n\t\t\"gateway_ID\": \"0000000000000000\",\n\t\t\"servers\": [ { \"server_address\": \"croft.thethings.girovito.nl\", \"serv_port_up\": 1700, \"serv_port_down\": 1701, \"serv_enabled\": true } ],\n\t\t\"ref_latitude\": $GATEWAY_LAT,\n\t\t\"ref_longitude\": $GATEWAY_LON,\n\t\t\"ref_altitude\": $GATEWAY_ALT,\n\t\t\"contact_email\": \"$GATEWAY_EMAIL\",\n\t\t\"description\": \"$GATEWAY_NAME\" \n\t}\n}" >./bin/local_conf.json + +popd + +echo "Installation completed." diff --git a/install.sh~ b/install.sh~ new file mode 100755 index 0000000..91a805b --- /dev/null +++ b/install.sh~ @@ -0,0 +1,145 @@ +#!/bin/bash + +# Stop on the first sign of trouble +set -e + +if [ $UID != 0 ]; then + echo "ERROR: Operation not permitted. Forgot sudo?" + exit 1 +fi + +VERSION="master" +if [[ $1 != "" ]]; then VERSION=$1; fi + +echo "The Things Network Gateway installer" +echo "Version $VERSION" + +# Update the gateway installer to the correct branch (defaults to master) +echo "Updating installer files..." +OLD_HEAD=$(git rev-parse HEAD) +git fetch +git checkout -q $VERSION +git pull +NEW_HEAD=$(git rev-parse HEAD) + +if [[ $OLD_HEAD != $NEW_HEAD ]]; then + echo "New installer found. Restarting process..." + exec "./install.sh" "$VERSION" +fi + +# Retrieve gateway configuration for later +echo "Configure your gateway:" +printf " Descriptive name [ttn-ic880a]:" +read GATEWAY_NAME +if [[ $GATEWAY_NAME == "" ]]; then GATEWAY_NAME="ttn-ic880a"; fi + +printf " Contact email: " +read GATEWAY_EMAIL + +printf " Latitude [0]: " +read GATEWAY_LAT +if [[ $GATEWAY_LAT == "" ]]; then GATEWAY_LAT=0; fi + +printf " Longitude [0]: " +read GATEWAY_LON +if [[ $GATEWAY_LON == "" ]]; then GATEWAY_LON=0; fi + +printf " Altitude [0]: " +read GATEWAY_ALT +if [[ $GATEWAY_ALT == "" ]]; then GATEWAY_ALT=0; fi + + +# Change hostname if needed +CURRENT_HOSTNAME=$(hostname) +NEW_HOSTNAME="ttn-gateway" + +if [[ $NEW_HOSTNAME != $CURRENT_HOSTNAME ]]; then + echo "Updating hostname to '$NEW_HOSTNAME'..." + hostname $NEW_HOSTNAME + echo $NEW_HOSTNAME > /etc/hostname + sed -i "s/$CURRENT_HOSTNAME/$NEW_HOSTNAME/" /etc/hosts +fi + +# Check dependencies +echo "Installing dependencies..." +apt-get install swig libftdi-dev python-dev + +# Install LoRaWAN packet forwarder repositories +INSTALL_DIR="/opt/ttn-gateway" +if [ ! -d "$INSTALL_DIR" ]; then mkdir $INSTALL_DIR; fi +pushd $INSTALL_DIR + +# Build libraries +if [ ! -d libmpsse ]; then + git clone https://github.com/devttys0/libmpsse.git + pushd libmpsse/src +else + pushd libmpsse/src + git reset --hard + git pull +fi + +./configure --disable-python +make +make install +ldconfig + +popd + +# Build LoRa gateway app +if [ ! -d lora_gateway ]; then + git clone https://github.com/TheThingsNetwork/lora_gateway.git + pushd lora_gateway +else + pushd lora_gateway + git reset --hard + git pull +fi + +cp ./libloragw/99-libftdi.rules /etc/udev/rules.d/99-libftdi.rules + +sed -i -e 's/CFG_SPI= native/CFG_SPI= ftdi/g' ./libloragw/library.cfg +sed -i -e 's/PLATFORM= kerlink/PLATFORM= lorank/g' ./libloragw/library.cfg +sed -i -e 's/ATTRS{idProduct}=="6010"/ATTRS{idProduct}=="6014"/g' /etc/udev/rules.d/99-libftdi.rules + +make + +popd + +# Build packet forwarder +if [ ! -d packet_forwarder ]; then + git clone https://github.com/TheThingsNetwork/packet_forwarder.git + pushd packet_forwarder +else + pushd packet_forwarder + git pull + git reset --hard +fi + +make + +popd + +# Symlink poly packet forwarder +if [ ! -d bin ]; then mkdir bin; fi +if [ -f ./bin/poly_pkt_fwd ]; then rm ./bin/poly_pkt_fwd; fi +ln -s $INSTALL_DIR/packet_forwarder/poly_pkt_fwd/poly_pkt_fwd ./bin/poly_pkt_fwd +cp -f ./packet_forwarder/poly_pkt_fwd/global_conf.json ./bin/global_conf.json + +echo -e "{\n\t\"gateway_conf\": {\n\t\t\"gateway_ID\": \"0000000000000000\",\n\t\t\"servers\": [ { \"server_address\": \"croft.thethings.girovito.nl\", \"serv_port_up\": 1700, \"serv_port_down\": 1701, \"serv_enabled\": true } ],\n\t\t\"ref_latitude\": $GATEWAY_LAT,\n\t\t\"ref_longitude\": $GATEWAY_LON,\n\t\t\"ref_altitude\": $GATEWAY_ALT,\n\t\t\"contact_email\": \"$GATEWAY_EMAIL\",\n\t\t\"description\": \"$GATEWAY_NAME\" \n\t}\n}" >./bin/local_conf.json + +# Reset gateway ID based on MAC +./packet_forwarder/reset_pkt_fwd.sh start ./bin/local_conf.json + +popd + +echo "Installation completed." + +# Start packet forwarder as a service +cp ./start.sh $INSTALL_DIR/bin/ +cp ./ttn-gateway.service /lib/systemd/system/ +systemctl enable ttn-gateway.service + +echo "The system will reboot in 5 seconds..." +sleep 5 +shutdown -r now diff --git a/start.sh b/start.sh new file mode 100755 index 0000000..7bdc839 --- /dev/null +++ b/start.sh @@ -0,0 +1,19 @@ +#! /bin/bash + +# Reset gateway ID based on MAC +./packet_forwarder/reset_pkt_fwd.sh start ./bin/local_conf.json + +# Test the connection, wait if needed. +while [[ $(ping -c1 google.com 2>&1 | grep " 0% packet loss") == "" ]]; do + echo "[TTN Gateway]: Waiting for internet connection..." + sleep 30 + done + +# Fire up the forwarder. +while true + do + echo "[TTN Gateway]: Starting packet forwarder..." + ./poly_pkt_fwd + echo "[TTN Gateway]: Packet forwarder exited; retrying in 15s..." + sleep 15 + done diff --git a/start.sh~ b/start.sh~ new file mode 100755 index 0000000..6854e2e --- /dev/null +++ b/start.sh~ @@ -0,0 +1,10 @@ +#! /bin/bash + +# Test the connection, wait if needed. +while [[ $(ping -c1 google.com 2>&1 | grep " 0% packet loss") == "" ]]; do + echo "[TTN Gateway]: Waiting for internet connection..." + sleep 30 + done + +# Fire up the forwarder. +./poly_pkt_fwd \ No newline at end of file