#!/bin/bash /etc/ikcommon
# iKuai WebUI service wrapper for netspeedtest.
Include interface.sh,iproute.sh
I18nload netspeedtest.json

EXECUTOR=${NETSPEEDTEST_EXECUTOR:-/usr/sbin/netspeedtest}
CONFIG_FILE=${NETSPEEDTEST_CONFIG_FILE:-/etc/log/netspeedtest.json}
PID_FILE=${NETSPEEDTEST_PID_FILE:-/var/run/netspeedtest.pid}
LOG_FILE=${NETSPEEDTEST_LOG_FILE:-/tmp/iktmp/netspeedtest.log}
DEFAULT_PORT=8765
DEFAULT_USER=admin
DEFAULT_PASSWORD=ikuai8.com
DEFAULT_INTERFACE=auto

json_escape() {
    printf '%s' "$1" | sed 's/\\/\\\\/g; s/"/\\"/g'
}

emit_error() {
    msg=$(json_escape "$1")
    printf '{"status":0,"status_msg":"error","error":"%s"}\n' "$msg"
}

ensure_dirs() {
    mkdir -p /etc/log /var/run /tmp/iktmp 2>/dev/null || true
}

get_param() {
    key=$1
    default=$2
    eval value=\${${key}:-}
    if [ -n "$value" ]; then printf '%s' "$value"; else printf '%s' "$default"; fi
}

load_config() {
    port=$DEFAULT_PORT
    username=$DEFAULT_USER
    password=$DEFAULT_PASSWORD
    interface=$DEFAULT_INTERFACE
    enabled=0
    if [ -s "$CONFIG_FILE" ]; then
        port=$(sed -n 's/.*"port"[[:space:]]*:[[:space:]]*"*\([0-9][0-9]*\)"*.*/\1/p' "$CONFIG_FILE" | head -n 1)
        username=$(sed -n 's/.*"username"[[:space:]]*:[[:space:]]*"\([^"]*\)".*/\1/p' "$CONFIG_FILE" | head -n 1)
        password=$(sed -n 's/.*"password"[[:space:]]*:[[:space:]]*"\([^"]*\)".*/\1/p' "$CONFIG_FILE" | head -n 1)
        interface=$(sed -n 's/.*"interface"[[:space:]]*:[[:space:]]*"\([^"]*\)".*/\1/p' "$CONFIG_FILE" | head -n 1)
        enabled=$(sed -n 's/.*"enabled"[[:space:]]*:[[:space:]]*"*\([01]\)"*.*/\1/p' "$CONFIG_FILE" | head -n 1)
    fi
    [ -n "$port" ] || port=$DEFAULT_PORT
    [ -n "$username" ] || username=$DEFAULT_USER
    [ -n "$password" ] || password=$DEFAULT_PASSWORD
    [ -n "$interface" ] || interface=$DEFAULT_INTERFACE
    [ -n "$enabled" ] || enabled=0
}

save_config() {
    ensure_dirs
    e=$(json_escape "$enabled")
    p=$(json_escape "$port")
    u=$(json_escape "$username")
    pw=$(json_escape "$password")
    iface=$(json_escape "$interface")
    printf '{"enabled":"%s","port":"%s","username":"%s","password":"%s","interface":"%s"}\n' "$e" "$p" "$u" "$pw" "$iface" > "$CONFIG_FILE"
}

is_running() {
    [ -s "$PID_FILE" ] || return 1
    pid=$(cat "$PID_FILE" 2>/dev/null)
    [ -n "$pid" ] || return 1
    kill -0 "$pid" 2>/dev/null
}

resolve_bind_ip() {
    iface=$1
    if [ -z "$iface" ] || [ "$iface" = "auto" ]; then return 0; fi
    if command -v interface_get_ipaddr >/dev/null 2>&1; then
        interface_get_ipaddr "$iface" 2>/dev/null | head -n 1
        return 0
    fi
    ip -4 addr show dev "$iface" 2>/dev/null | sed -n 's/.*inet \([0-9.]*\).*/\1/p' | head -n 1
}

resolve_mark() {
    iface=$1
    if [ -z "$iface" ] || [ "$iface" = "auto" ]; then return 0; fi
    if command -v iproute_get_markid >/dev/null 2>&1; then
        iproute_get_markid "$iface" 2>/dev/null | head -n 1
    fi
}

router_ip() {
    ip -4 addr show dev lan1 2>/dev/null | sed -n 's/.*inet \([0-9.]*\).*/\1/p' | head -n 1
    return 0
}

start() {
    ensure_dirs
    load_config
    if is_running; then
        show
        return 0
    fi
    bind_ip=$(resolve_bind_ip "$interface")
    mark=$(resolve_mark "$interface")
    "$EXECUTOR" serve \
        --port "$port" \
        --user "$username" \
        --password "$password" \
        --interface "$interface" \
        --bind-ip "$bind_ip" \
        --mark "$mark" > "$LOG_FILE" 2>&1 &
    echo $! > "$PID_FILE"
    show
}

stop() {
    if is_running; then
        pid=$(cat "$PID_FILE" 2>/dev/null)
        kill "$pid" 2>/dev/null || true
    fi
    rm -f "$PID_FILE"
    show
}

config() {
    new_enabled=$enabled
    new_port=$port
    new_username=$username
    new_password=$password
    new_interface=$interface
    load_config
    [ -n "$new_enabled" ] && enabled=$new_enabled
    [ -n "$new_port" ] && port=$new_port
    [ -n "$new_username" ] && username=$new_username
    [ -n "$new_password" ] && password=$new_password
    [ -n "$new_interface" ] && interface=$new_interface
    save_config
    if [ "$enabled" = "1" ]; then start; else stop; fi
}

show() {
    Show __json_result__
}

__show_data() {
    load_config
    running=false
    if is_running; then running=true; fi
    host=$(router_ip)
    [ -n "$host" ] || host="<router-ip>"
    u=$(json_escape "$username")
    iface=$(json_escape "$interface")
    __json_result=$(printf '{"status":0,"status_msg":"ok","enabled":%s,"running":%s,"port":%s,"username":"%s","interface":"%s","url":"http://%s:%s/"}' "$enabled" "$running" "$port" "$u" "$iface" "$host" "$port")
}

version() {
    "$EXECUTOR" version 2>/dev/null || printf '{"version":"unknown"}\n'
}

