atlas-sw-probe: add new package
authorJan Pavlinec <redacted>
Fri, 26 Mar 2021 11:59:34 +0000 (12:59 +0100)
committerJan Pavlinec <redacted>
Fri, 9 Apr 2021 13:21:32 +0000 (15:21 +0200)
Signed-off-by: Jan Pavlinec <redacted>
net/atlas-sw-probe/Makefile [new file with mode: 0644]
net/atlas-sw-probe/files/atlas.conf [new file with mode: 0644]
net/atlas-sw-probe/files/atlas.init [new file with mode: 0644]
net/atlas-sw-probe/files/atlas_rpcd.sh [new file with mode: 0755]
net/atlas-sw-probe/patches/001-fix-config-path.patch [new file with mode: 0644]

diff --git a/net/atlas-sw-probe/Makefile b/net/atlas-sw-probe/Makefile
new file mode 100644 (file)
index 0000000..b4cc2f3
--- /dev/null
@@ -0,0 +1,127 @@
+#
+# Copyright (C) 2019-2021 CZ.NIC z.s.p.o. (https://www.nic.cz/)
+#
+# This is free software, licensed under the GNU General Public License v2.
+# See /LICENSE for more information.
+#
+include $(TOPDIR)/rules.mk
+
+PKG_NAME:=atlas-sw-probe
+PKG_VERSION:=5020
+PKG_RELEASE:=1
+
+PKG_SOURCE_PROTO:=git
+PKG_SOURCE_URL:=https://github.com/RIPE-NCC/ripe-atlas-software-probe.git
+PKG_SOURCE:=ripe-atlas-software-probe-$(PKG_VERSION).tar.gz
+
+PKG_MIRROR_HASH:=846aa20ff4bc938c07526a9893dcae4ac7dfa41982a5b2bcfe2dd53c974ecdc9
+PKG_SOURCE_VERSION:=edee49c942b726a1d8865d91c8d7f32843bc8ad1
+
+PKG_MAINTAINER:=Jan Pavlinec <jan.pavlinec@nic.cz>
+PKG_LICENSE:=GPL-3.0-or-later
+PKG_LICENSE_FILES:=LICENSE
+
+PKG_INSTALL:=1
+
+include $(INCLUDE_DIR)/package.mk
+
+define Package/atlas-sw-probe
+  SECTION:=net
+  CATEGORY:=Network
+  TITLE:=RIPE Atlas software probe
+  URL:=https://atlas.ripe.net/about/probes/
+  DEPENDS:=+atlas-probe
+endef
+
+define Package/atlas-sw-probe/description
+  RIPE Atlas SW probe is software variant of RIPE Atlas Probe.
+  It contains utilities which helps actively measure
+  Internet connectivity through ping, traceroute, DNS, SSL/TLS, NTP, and HTTP.
+  Data are then collected, aggregated and published by the RIPE NCC.
+endef
+
+define Package/atlas-sw-probe-rpc
+  SECTION:=net
+  CATEGORY:=Network
+  TITLE:=RPC service
+  URL:=https://atlas.ripe.net/about/probes/
+  DEPENDS:=+atlas-probe +bind-dig +rpcd
+endef
+
+define Package/atlas-sw-probe-rpc/description
+  Provides ubus calls for probe.
+endef
+
+Build/Compile:=:
+Build/Install:=:
+
+define Package/atlas-sw-probe-rpc/postinst
+#!/bin/sh
+[ -z "$${IPKG_INSTROOT}" ] && /etc/init.d/rpcd restart
+exit 0
+endef
+
+define Package/atlas-sw-probe-rpc/postrm
+#!/bin/sh
+[ -z "$${IPKG_INSTROOT}" ] && /etc/init.d/rpcd restart
+exit 0
+endef
+
+define Package/atlas-sw-probe/conffiles
+/etc/config/atlas
+/usr/libexec/atlas-probe-scripts/state/config.txt
+endef
+
+TMP_BASE_DIR:=/tmp/ripe_atlas_probe
+SCRIPTS_DIR:=/usr/libexec/atlas-probe-scripts
+
+define Package/atlas-sw-probe/install
+       $(INSTALL_DIR) $(1)/$(SCRIPTS_DIR)
+       $(INSTALL_DIR) $(1)/$(SCRIPTS_DIR)/{etc,state,bin/arch,bin/bin}
+
+       # Copy config
+       $(CP) $(PKG_BUILD_DIR)/atlas-config/etc/* $(1)/$(SCRIPTS_DIR)/etc/
+
+       # Copy firmware version
+       $(CP) $(PKG_BUILD_DIR)/atlas-config/state/FIRMWARE_APPS_VERSION $(1)/$(SCRIPTS_DIR)/state/
+
+       # Set probe mode
+       echo "prod" > $(1)/$(SCRIPTS_DIR)/state/mode
+
+       # Copy scripts
+       $(CP) $(PKG_BUILD_DIR)/bin/{ATLAS,common-pre.sh,common.sh,reginit.sh,resolvconf} $(1)/$(SCRIPTS_DIR)/bin/
+       $(CP) $(PKG_BUILD_DIR)/bin/arch/{linux,openwrt-sw-probe} $(1)/$(SCRIPTS_DIR)/bin/arch/
+
+       # Create config info
+       echo "DEVICE_NAME=openwrt-sw-probe" > $(1)/$(SCRIPTS_DIR)/bin/config.sh
+       echo "ATLAS_BASE=$(SCRIPTS_DIR)" >> $(1)/$(SCRIPTS_DIR)/bin/config.sh
+       echo "ATLAS_STATIC=$(SCRIPTS_DIR)" >> $(1)/$(SCRIPTS_DIR)/bin/config.sh
+       echo "SUB_ARCH=openwrt-$(ARCH)-$(PKG_VERSION)-$(PKG_RELEASE)" >> $(1)/$(SCRIPTS_DIR)/bin/bin/config.sh
+
+       # Enable sending interface traffic statistics as Atlas measurement results
+       echo "RXTXRPT=yes" > $(1)/$(SCRIPTS_DIR)/state/config.txt
+
+       # Fix permision
+       chmod 755 $(1)/$(SCRIPTS_DIR)/bin
+
+       # Create softlinks for writable dirs
+       $(LN) $(TMP_BASE_DIR)/crons $(1)/$(SCRIPTS_DIR)/crons
+       $(LN) $(TMP_BASE_DIR)/data $(1)/$(SCRIPTS_DIR)/data
+       $(LN) $(TMP_BASE_DIR)/run $(1)/$(SCRIPTS_DIR)/run
+       $(LN) $(TMP_BASE_DIR)/status $(1)/$(SCRIPTS_DIR)/status
+
+       # Copy init and config
+       $(INSTALL_DIR) $(1)/etc/init.d/
+       $(INSTALL_BIN) ./files/atlas.init $(1)/etc/init.d/atlas
+
+       $(INSTALL_DIR) $(1)/etc/config/
+       $(INSTALL_CONF) ./files/atlas.conf $(1)/etc/config/atlas
+endef
+
+define Package/atlas-sw-probe-rpc/install
+       $(INSTALL_DIR) $(1)/usr/libexec/rpcd
+       $(INSTALL_BIN) ./files/atlas_rpcd.sh $(1)/usr/libexec/rpcd/atlas
+endef
+
+$(eval $(call BuildPackage,atlas-sw-probe))
+$(eval $(call BuildPackage,atlas-sw-probe-rpc))
diff --git a/net/atlas-sw-probe/files/atlas.conf b/net/atlas-sw-probe/files/atlas.conf
new file mode 100644 (file)
index 0000000..d2a12a5
--- /dev/null
@@ -0,0 +1,4 @@
+config atlas 'common'
+       option log_stderr '1'
+       option log_stdout '0'
+       option rxtxrpt '1'
diff --git a/net/atlas-sw-probe/files/atlas.init b/net/atlas-sw-probe/files/atlas.init
new file mode 100644 (file)
index 0000000..c5495cd
--- /dev/null
@@ -0,0 +1,178 @@
+#!/bin/sh /etc/rc.common
+
+USE_PROCD=1
+START=30
+EXTRA_COMMANDS="get_key probeid log create_backup load_backup"
+EXTRA_HELP="   get_key print probe public key (used for probe registration)
+       probeid print probe id
+       log     print probe status log
+       create_backup   backup ssh key to tar.gz
+       load_backup 'backup.tar.gz'     load backup ssh key from tar.gz
+"
+
+SCRIPTS_DIR="/usr/libexec/atlas-probe-scripts"
+TMP_BASE_DIR="/tmp/ripe_atlas_probe"
+PUB_KEY_FILE="$SCRIPTS_DIR/etc/probe_key.pub"
+PRIV_KEY_FILE="$SCRIPTS_DIR/etc/probe_key"
+PROBE_ID_FILE="$TMP_BASE_DIR/status/reg_init_reply.txt"
+LOG_FILE="/tmp/log/ripe_sw_probe"
+STATE_CONFIG="$SCRIPTS_DIR/state/config.txt"
+
+load_backup() {
+       local backup_arch
+       local tmp_dir
+
+       backup_arch="$1"
+       tmp_dir="$(mktemp -u -p /var/run/atlas)"
+       if [ -f "$backup_arch" ]; then
+               safe_mkdir "$tmp_dir"
+               tar -xzf "$backup_arch" -C "$tmp_dir/"
+               if [ -f "$tmp_dir/probe_key.pub" ] && [ -f "$tmp_dir/probe_key" ]; then
+                       mv "$tmp_dir/probe_key.pub" "$PUB_KEY_FILE"
+                       mv "$tmp_dir/probe_key" "$PRIV_KEY_FILE"
+                       rm -rf "$tmp_dir"
+                       print_msg "Info: public and private key loaded from backup"
+               else
+                       print_msg "Error: Could not extract probe_key or probe_key form backup archive"
+                       rm -rf "$tmp_dir"
+                       exit 1
+               fi
+       else
+               print_msg "Error: Provided backup file $backup_arch does not exists"
+               exit 1
+       fi
+}
+
+create_backup() {
+       local back_dir
+
+       back_dir="$(pwd)"
+
+       if [ -f "$PUB_KEY_FILE" -a -f "$PRIV_KEY_FILE" ]; then
+               print_msg "Info: Creating backup arch in $back_dir"
+               tar -czf "$back_dir/atlas-key-backup.tar.gz" -C "$SCRIPTS_DIR/etc" probe_key probe_key.pub
+       else
+               print_msg "Error: private or public key does not exists."
+               exit 1
+       fi
+}
+
+log() {
+       if [ -f "$LOG_FILE" ];then
+               tail "$LOG_FILE"
+       else
+               print_msg "Error. No log file found. Probe isn't probably running"
+               exit 1
+       fi
+}
+
+get_key() {
+       if [ -f "$PUB_KEY_FILE" ]; then
+               echo "Probe public key (use for registration)"
+               echo "URL with registration form https://atlas.ripe.net/apply/swprobe/"
+               echo "=========================================="
+               cat "$PUB_KEY_FILE"
+       else
+               print_msg "Error! Pub. key not found"
+               exit 1
+       fi
+}
+
+probeid() {
+       local probe_id
+
+       if [ -f "$PROBE_ID_FILE" ]; then
+               probe_id="$(awk '/PROBE_ID/ {print $2}' "$PROBE_ID_FILE")"
+               if [ -z "$probe_id" ]; then
+                       print_msg "Probe ID not found SW probe isn't probably registered yet"
+                       exit 1
+               else
+                       print_msg "Probe ID is $probe_id"
+               fi
+       else
+               print_msg "Probe ID not found. SW probe is not running or probe_key isn't registered yet"
+               exit 1
+       fi
+}
+
+print_msg() {
+       echo "$1" >&2
+       logger -t atlas-sw-probe "$1"
+}
+
+stop_service() {
+       local atlas_pid
+       local tunnel_pid
+       local pid_file
+
+       print_msg "Stopping atlas sw probe"
+       print_msg "Kill all atlas processes"
+
+       for pid_file in "$SCRIPTS_DIR/run/"*.vol; do
+               [ -f "$pid_file" ] || continue
+               # test if proccess is still running
+               atlas_pid="$(cat "$pid_file")"
+               if kill -0 "$atlas_pid" 2>/dev/null; then
+                       kill "$atlas_pid"
+               fi
+       done
+
+       if [ -f "$SCRIPTS_DIR/status/con_keep_pid.vol" ]; then
+               print_msg "Kill ssh tunnel"
+               tunnel_pid="$(cat "$SCRIPTS_DIR/status/con_keep_pid.vol")"
+               if kill -0 "$tunnel_pid" 2>/dev/null; then
+                       kill "$tunnel_pid"
+               fi
+       fi
+}
+
+safe_mkdir() {
+    local dir="$1"
+    if [ -e "$dir" ] && [ ! -d "$dir" -o -L "$dir" ]; then
+        rm -rf "$dir"
+    fi
+    mkdir -p "$dir"
+    chmod 700 "$dir"
+    chown root:root "$dir"
+}
+
+create_tmp_dirs() {
+       local dirs
+
+       chown -R atlas:atlas "$SCRIPTS_DIR/bin"
+       chmod 755 "$SCRIPTS_DIR/bin"
+       dirs='crons data run status'
+
+       safe_mkdir "$TMP_BASE_DIR"
+       for i in $dirs; do
+               safe_mkdir "$TMP_BASE_DIR/$i"
+       done
+}
+
+start_service() {
+       local log_stderr
+       local log_stdout
+       local rxtxrpt
+       local test_setting
+
+       create_tmp_dirs
+
+       config_load atlas
+       config_get_bool log_stderr "common" log_stderr "0"
+       config_get_bool log_stdout "common" log_stdout "0"
+       config_get_bool rxtxrpt "common" rxtxrpt "1"
+       test_setting=$(grep "^[         ]*RXTXRPT=yes" "$STATE_CONFIG")
+
+       # Decide if we should write to permanent storage
+       if [ "$rxtxrpt" == "1" ] &&  [ -z "$test_setting" ]; then
+               echo "RXTXRPT=yes">$STATE_CONFIG
+       elif [ "$rxtxrpt" == "0" ] &&  [ ! -z "$test_setting" ]; then
+               echo "RXTXRPT=no">$STATE_CONFIG
+       fi
+
+       procd_open_instance
+       procd_set_param command "$SCRIPTS_DIR/bin/ATLAS"
+       procd_set_param stdout "$log_stdout"
+       procd_set_param stderr "$log_stderr"
+       procd_close_instance
+}
diff --git a/net/atlas-sw-probe/files/atlas_rpcd.sh b/net/atlas-sw-probe/files/atlas_rpcd.sh
new file mode 100755 (executable)
index 0000000..0fde836
--- /dev/null
@@ -0,0 +1,83 @@
+#!/bin/sh
+
+. /lib/functions.sh
+
+SCRIPTS_DIR="/usr/libexec/atlas-probe-scripts"
+TMP_BASE_DIR="/tmp/ripe_atlas_probe"
+PUB_KEY_FILE="$SCRIPTS_DIR/etc/probe_key.pub"
+PRIV_KEY_FILE="$SCRIPTS_DIR/etc/probe_key"
+PROBE_ID_FILE="$TMP_BASE_DIR/status/reg_init_reply.txt"
+
+get_atlas_public_key() {
+       local pub_key
+
+       if [ -f "$PUB_KEY_FILE" ]; then
+               pub_key=$(cat "$PUB_KEY_FILE")
+       fi
+
+       echo "{"
+       echo \"pub-key\":\"$pub_key\"
+       echo "}"
+}
+
+get_atlas_probeid() {
+       local probe_id
+
+       if /etc/init.d/atlas probeid 2>/dev/null; then
+               probe_id="$(awk '/PROBE_ID/ {print $2}' "$PROBE_ID_FILE")"
+       fi
+
+       echo "{"
+       echo \"probe-id\":\"$probe_id\"
+       echo "}"
+}
+
+get_reg_info() {
+       local pub_ip
+       local asn
+       local asn_org
+
+       if [ -z "$pub_ip" ]; then
+               pub_ip="$(dig -4 TXT +short o-o.myaddr.l.google.com @ns1.google.com|tr -d '"')"
+       fi
+
+       echo "{"
+       echo \"public-ipv4\":\"$pub_ip\"
+       echo "}"
+}
+
+get_status() {
+       local status
+
+       status="$(/etc/init.d/atlas status)"
+       echo "{"
+       echo \"status\":\"$status\"
+       echo "}"
+}
+
+case "$1" in
+       list)
+               echo '{'
+               echo ' "pub-key": {},'
+               echo ' "probe-id": {},'
+               echo ' "reg-info": {}'
+               echo ' "status": {}'
+               echo '}'
+       ;;
+       call)
+               case "$2" in
+                       pub-key)
+                               get_atlas_public_key
+                       ;;
+                       probe-id)
+                               get_atlas_probeid
+                       ;;
+                       reg-info)
+                               get_reg_info
+                       ;;
+                       get-status)
+                               get_status
+                       ;;
+               esac
+       ;;
+esac
diff --git a/net/atlas-sw-probe/patches/001-fix-config-path.patch b/net/atlas-sw-probe/patches/001-fix-config-path.patch
new file mode 100644 (file)
index 0000000..5a51819
--- /dev/null
@@ -0,0 +1,14 @@
+--- a/bin/ATLAS
++++ b/bin/ATLAS
+@@ -7,9 +7,9 @@
+ #exec >/tmp/ATLAS.out 2>/tmp/ATLAS.err
+ #set -x
+-if [ -f bin/config.sh ]
++if [ -f /usr/libexec/atlas-probe-scripts/bin/config.sh ]
+ then
+-      . bin/config.sh
++      . /usr/libexec/atlas-probe-scripts/bin/config.sh
+       export DEVICE_NAME SUB_ARCH ATLAS_STATIC
+ else
+       echo no 'bin/config.sh' >&2
git clone https://git.99rst.org/PROJECT