#!/bin/bash set -euo pipefail IFS=$'\n\t' PUBLISH_SHARE_TOKEN="PublishDevNetIPsHere" PUBLISH_WEBDAV_URL="https://cloud.qortal.org/public.php/webdav" PORT_START_DEFAULT=23391 PORT_START="${QORTAL_PORT_START:-$PORT_START_DEFAULT}" LISTEN_PORT="" need_cmd() { command -v "$1" >/dev/null 2>&1; } is_valid_port() { local port="$1" if ! echo "$port" | grep -Eq '^[0-9]+$'; then return 1 fi if (( port < 1 || port > 65535 )); then return 1 fi return 0 } read_listen_port_from_settings() { local settings_path="" local port="" local candidate="" for settings_path in "./settings.json" "${HOME}/qortal/settings.json"; do if [[ -f "$settings_path" ]]; then if need_cmd jq; then candidate="$(jq -r '.listenPort // empty' "$settings_path" 2>/dev/null || true)" else candidate="$(sed -nE 's/.*"listenPort"[[:space:]]*:[[:space:]]*([0-9]+).*/\1/p' "$settings_path" | head -n 1)" fi candidate="$(echo "$candidate" | tr -d ' \n\r')" if is_valid_port "$candidate"; then port="$candidate" break fi fi done if [[ -n "$port" ]]; then echo "$port" fi } get_public_ip() { local ip="" local url="" local urls="https://api.ipify.org https://ipv4.icanhazip.com https://checkip.amazonaws.com https://ifconfig.me https://canhazip.com" local curl_opts="-fsS --max-time 8 -A Mozilla/5.0" for url in $urls; do if need_cmd curl; then ip="$(curl $curl_opts "$url" 2>/dev/null || true)" elif need_cmd wget; then ip="$(wget -qO- "$url" || true)" else return 1 fi ip="$(echo "$ip" | tr -d ' \n\r')" if echo "$ip" | grep -Eq '^[0-9]{1,3}(\.[0-9]{1,3}){3}$'; then echo "$ip" return 0 fi done if need_cmd dig; then ip="$(dig +short myip.opendns.com @resolver1.opendns.com | head -n 1 | tr -d ' \n\r')" if echo "$ip" | grep -Eq '^[0-9]{1,3}(\.[0-9]{1,3}){3}$'; then echo "$ip" return 0 fi fi return 1 } publish_public_ip() { local ip="$1" local port="$2" local host_name="$3" local tmp_file="$4" local remote_name="${host_name}.txt" local url="${PUBLISH_WEBDAV_URL}/${remote_name}" local alt_name="" local alt_url="" local http_code="" printf '%s:%s\n' "$ip" "$port" > "$tmp_file" if need_cmd curl; then http_code="$(curl -sS -u "${PUBLISH_SHARE_TOKEN}:" -T "$tmp_file" -o /dev/null -w "%{http_code}" "$url" || true)" if [ "$http_code" != "200" ] && [ "$http_code" != "201" ] && [ "$http_code" != "204" ]; then alt_name="${host_name}-$(date -u +'%Y%m%d_%H%M%S').txt" alt_url="${PUBLISH_WEBDAV_URL}/${alt_name}" http_code="$(curl -sS -u "${PUBLISH_SHARE_TOKEN}:" -T "$tmp_file" -o /dev/null -w "%{http_code}" "$alt_url" || true)" if [ "$http_code" != "200" ] && [ "$http_code" != "201" ] && [ "$http_code" != "204" ]; then echo "Publish failed with HTTP ${http_code}" return 1 fi fi elif need_cmd wget; then wget --method=PUT --body-file="$tmp_file" --user="$PUBLISH_SHARE_TOKEN" --password="" -qO- "$url" >/dev/null else return 1 fi } HOST_NAME="$(hostname -s 2>/dev/null || hostname)" TMP_FILE="$(mktemp -t devnet-ip.XXXXXX)" trap 'rm -f "$TMP_FILE"' EXIT SETTINGS_LISTEN_PORT="$(read_listen_port_from_settings || true)" if [[ -n "$SETTINGS_LISTEN_PORT" ]]; then LISTEN_PORT="$SETTINGS_LISTEN_PORT" else PORT_START_NUM="$(echo "$PORT_START" | tr -d ' \n\r')" if ! echo "$PORT_START_NUM" | grep -Eq '^[0-9]+$'; then PORT_START_NUM="$PORT_START_DEFAULT" fi PORT_START="$PORT_START_NUM" if (( PORT_START < 1024 || PORT_START > 65532 )); then PORT_START="$PORT_START_DEFAULT" fi LISTEN_PORT=$((PORT_START + 1)) fi PUBLIC_IP="$(get_public_ip || true)" if [[ -z "$PUBLIC_IP" ]]; then echo "Warning: could not determine public IP to publish." exit 0 fi publish_public_ip "$PUBLIC_IP" "$LISTEN_PORT" "$HOST_NAME" "$TMP_FILE" echo "Published ${PUBLIC_IP}:${LISTEN_PORT} for ${HOST_NAME} to ${PUBLISH_WEBDAV_URL}/${HOST_NAME}.txt"