atlas-sw-probe: add new package

Signed-off-by: Jan Pavlinec <jan.pavlinec@nic.cz>
This commit is contained in:
Jan Pavlinec 2021-03-26 12:59:34 +01:00
parent cb30c106c0
commit c65a659e6d
No known key found for this signature in database
GPG Key ID: 60244CCEFB39E584
5 changed files with 406 additions and 0 deletions

127
net/atlas-sw-probe/Makefile Normal file
View File

@ -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))

View File

@ -0,0 +1,4 @@
config atlas 'common'
option log_stderr '1'
option log_stdout '0'
option rxtxrpt '1'

View File

@ -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
}

View File

@ -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

View File

@ -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