From c65a659e6d9e71a5d74927f40490ee40a16d84db Mon Sep 17 00:00:00 2001 From: Jan Pavlinec Date: Fri, 26 Mar 2021 12:59:34 +0100 Subject: [PATCH] atlas-sw-probe: add new package Signed-off-by: Jan Pavlinec --- net/atlas-sw-probe/Makefile | 127 +++++++++++++ net/atlas-sw-probe/files/atlas.conf | 4 + net/atlas-sw-probe/files/atlas.init | 178 ++++++++++++++++++ net/atlas-sw-probe/files/atlas_rpcd.sh | 83 ++++++++ .../patches/001-fix-config-path.patch | 14 ++ 5 files changed, 406 insertions(+) create mode 100644 net/atlas-sw-probe/Makefile create mode 100644 net/atlas-sw-probe/files/atlas.conf create mode 100644 net/atlas-sw-probe/files/atlas.init create mode 100755 net/atlas-sw-probe/files/atlas_rpcd.sh create mode 100644 net/atlas-sw-probe/patches/001-fix-config-path.patch 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 +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