aboutsummaryrefslogtreecommitdiff
path: root/net/atlas-sw-probe
diff options
context:
space:
mode:
authorJan Pavlinec <jan.pavlinec@nic.cz>2021-03-26 12:59:34 +0100
committerJan Pavlinec <jan.pavlinec@nic.cz>2021-04-09 15:21:32 +0200
commitc65a659e6d9e71a5d74927f40490ee40a16d84db (patch)
tree7c71cf4ec63a09e4f75be6e020e242d7a12869c1 /net/atlas-sw-probe
parentcb30c106c09f6e8b9a93e87c3de65f3b3a14db8e (diff)
atlas-sw-probe: add new package
Signed-off-by: Jan Pavlinec <jan.pavlinec@nic.cz>
Diffstat (limited to 'net/atlas-sw-probe')
-rw-r--r--net/atlas-sw-probe/Makefile127
-rw-r--r--net/atlas-sw-probe/files/atlas.conf4
-rw-r--r--net/atlas-sw-probe/files/atlas.init178
-rwxr-xr-xnet/atlas-sw-probe/files/atlas_rpcd.sh83
-rw-r--r--net/atlas-sw-probe/patches/001-fix-config-path.patch14
5 files changed, 406 insertions, 0 deletions
diff --git a/net/atlas-sw-probe/Makefile b/net/atlas-sw-probe/Makefile
new file mode 100644
index 000000000..b4cc2f318
--- /dev/null
+++ b/net/atlas-sw-probe/Makefile
@@ -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
index 000000000..d2a12a523
--- /dev/null
+++ b/net/atlas-sw-probe/files/atlas.conf
@@ -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
index 000000000..c5495cd9a
--- /dev/null
+++ b/net/atlas-sw-probe/files/atlas.init
@@ -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
index 000000000..0fde83638
--- /dev/null
+++ b/net/atlas-sw-probe/files/atlas_rpcd.sh
@@ -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
index 000000000..5a518199c
--- /dev/null
+++ b/net/atlas-sw-probe/patches/001-fix-config-path.patch
@@ -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