immortalwrt/package/lean/luci-app-xlnetacc/root/usr/bin/xlnetacc.sh

671 lines
23 KiB
Bash
Executable File
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/bin/sh
# 声明常量
readonly packageName='com.xunlei.vip.swjsq'
readonly protocolVersion=200
readonly businessType=68
readonly sdkVersion='2.1.1.177662'
readonly clientVersion='2.4.1.3'
readonly agent_xl="android-async-http/xl-acc-sdk/version-$sdkVersion"
readonly agent_down='okhttp/3.4.1'
readonly agent_up='android-async-http/xl-acc-sdk/version-1.0.0.1'
readonly client_type_down='android-swjsq'
readonly client_type_up='android-uplink'
# 声明全局变量
_bind_ip=
_http_cmd=
_peerid=
_devicesign=
_userid=
_loginkey=
_sessionid=
_portal_down=
_portal_up=
_dial_account=
access_url=
http_args=
user_agent=
link_cn=
lasterr=
sequence_xl=1000000
sequence_down=$(( $(date +%s) / 6 ))
sequence_up=$sequence_down
# 包含用于解析 JSON 格式返回值的函数
. /usr/share/libubox/jshn.sh
# 读取 UCI 设置相关函数
uci_get_by_name() {
local ret=$(uci get $NAME.$1.$2 2> /dev/null)
echo -n ${ret:=$3}
}
uci_get_by_type() {
local ret=$(uci get $NAME.@$1[-1].$2 2> /dev/null)
echo -n ${ret:=$3}
}
uci_get_by_bool() {
case $(uci_get_by_name "$1" "$2" "$3") in
1|on|true|yes|enabled) echo -n 1;;
*) echo -n 0;;
esac
}
# 日志和状态栏输出。1 日志文件, 2 系统日志, 4 详细模式, 8 下行状态栏, 16 上行状态栏, 32 失败状态
_log() {
local msg=$1
local flag=$2
[ -z "$msg" ] && return
[ -z "$flag" ] && flag=1
local timestamp=$(date +'%Y/%m/%d %H:%M:%S')
[ $logging -eq 0 -a $(( $flag & 1 )) -ne 0 ] && flag=$(( $flag ^ 1 ))
if [ $verbose -eq 0 -a $(( $flag & 4 )) -ne 0 ]; then
[ $(( $flag & 1 )) -ne 0 ] && flag=$(( $flag ^ 1 ))
[ $(( $flag & 2 )) -ne 0 ] && flag=$(( $flag ^ 2 ))
fi
if [ $down_acc -eq 0 -a $(( $flag & 8 )) -ne 0 ]; then
flag=$(( $flag ^ 8 ))
[ $up_acc -ne 0 ] && flag=$(( $flag | 16 ))
fi
if [ $up_acc -eq 0 -a $(( $flag & 16 )) -ne 0 ]; then
flag=$(( $flag ^ 16 ))
[ $down_acc -ne 0 ] && flag=$(( $flag | 8 ))
fi
[ $(( $flag & 1 )) -ne 0 ] && echo "$timestamp $msg" >> $LOGFILE 2> /dev/null
[ $(( $flag & 2 )) -ne 0 ] && logger -p "daemon.info" -t "$NAME" "$msg"
[ $(( $flag & 32 )) -eq 0 ] && local color="green" || local color="red"
[ $(( $flag & 8 )) -ne 0 ] && echo -n "<font color=$color>$timestamp $msg</font>" > $down_state_file 2> /dev/null
[ $(( $flag & 16 )) -ne 0 ] && echo -n "<font color=$color>$timestamp $msg</font>" > $up_state_file 2> /dev/null
}
# 清理日志
clean_log() {
[ $logging -eq 1 -a -f "$LOGFILE" ] || return
[ $(wc -l "$LOGFILE" | awk '{print $1}') -le 800 ] && return
_log "清理日志文件"
local logdata=$(tail -n 500 "$LOGFILE")
echo "$logdata" > $LOGFILE 2> /dev/null
unset logdata
}
# 获取接口IP地址
get_bind_ip() {
json_cleanup; json_load "$(ubus call network.interface.$network status 2> /dev/null)" >/dev/null 2>&1
json_select "ipv4-address" >/dev/null 2>&1; json_select 1 >/dev/null 2>&1
json_get_var _bind_ip "address"
if [ -z "$_bind_ip" -o "$_bind_ip"x == "0.0.0.0"x ]; then
_log "获取网络 $network IP地址失败"
return 1
else
_log "绑定IP地址: $_bind_ip"
return 0
fi
}
# 定义基本 HTTP 命令和参数
gen_http_cmd() {
_http_cmd="wget-ssl -nv -t 1 -T 5 -O - --no-check-certificate"
_http_cmd="$_http_cmd --bind-address=$_bind_ip"
}
# 生成设备标识
gen_device_sign() {
local ifname macaddr
while : ; do
ifname=$(uci get "network.$network.ifname" 2> /dev/null)
[ "${ifname:0:1}" == "@" ] && network="${ifname:1}" || break
done
[ -z "$ifname" ] && { _log "获取网络 $network 信息出错"; return; }
json_cleanup; json_load "$(ubus call network.device status {\"name\":\"$ifname\"} 2> /dev/null)" >/dev/null 2>&1
json_get_var macaddr "macaddr"
[ -z "$macaddr" ] && { _log "获取网络 $network MAC地址出错"; return; }
macaddr=$(echo -n "$macaddr" | awk '{print toupper($0)}')
# 计算peerID
local fake_peerid=$(awk -F- '{print toupper($5)}' '/proc/sys/kernel/random/uuid')
readonly _peerid="${fake_peerid}004V"
_log "_peerid is $_peerid" $(( 1 | 4 ))
# 计算devicesign
# sign = div.10?.device_id + md5(sha1(packageName + businessType + md5(a protocolVersion specific GUID)))
local fake_device_id=$(echo -n "${macaddr//:/}" | openssl dgst -md5 | awk '{print $2}')
local fake_device_sign=$(echo -n "${fake_device_id}${packageName}${businessType}c7f21687eed3cdb400ca11fc2263c998" \
| openssl dgst -sha1 | awk '{print $2}')
readonly _devicesign="div101.${fake_device_id}"$(echo -n "$fake_device_sign" | openssl dgst -md5 | awk '{print $2}')
_log "_devicesign is $_devicesign" $(( 1 | 4 ))
}
# 快鸟帐号通用参数
swjsq_json() {
let sequence_xl++
# 生成POST数据
json_init
json_add_string protocolVersion "$protocolVersion"
json_add_string sequenceNo "$sequence_xl"
json_add_string platformVersion '2'
json_add_string isCompressed '0'
json_add_string businessType "$businessType"
json_add_string clientVersion "$clientVersion"
json_add_string peerID "$_peerid"
json_add_string appName "ANDROID-$packageName"
json_add_string sdkVersion "${sdkVersion##*.}"
json_add_string devicesign "$_devicesign"
json_add_string deviceModel 'MI'
json_add_string deviceName 'Xiaomi Mi'
json_add_string OSVersion "7.1.1"
}
# 帐号登录
swjsq_login() {
swjsq_json
if [ -z "$_userid" -o -z "$_loginkey" ]; then
access_url='https://mobile-login.xunlei.com/login'
json_add_string userName "$username"
json_add_string passWord "$password"
json_add_string verifyKey
json_add_string verifyCode
else
access_url='https://mobile-login.xunlei.com/loginkey'
json_add_string userName "$_userid"
json_add_string loginKey "$_loginkey"
fi
json_close_object
local ret=$($_http_cmd --user-agent="$agent_xl" "$access_url" --post-data="$(json_dump)")
case $? in
0)
_log "login is $ret" $(( 1 | 4 ))
json_cleanup; json_load "$ret" >/dev/null 2>&1
json_get_var lasterr "errorCode"
;;
2) lasterr=-2;;
4) lasterr=-3;;
*) lasterr=-1;;
esac
case ${lasterr:=-1} in
0)
json_get_var _userid "userID"
json_get_var _loginkey "loginKey"
json_get_var _sessionid "sessionID"
_log "_sessionid is $_sessionid" $(( 1 | 4 ))
local outmsg="帐号登录成功"; _log "$outmsg" $(( 1 | 8 ))
;;
15) # 身份信息已失效
_userid=; _loginkey=;;
-1)
local outmsg="帐号登录失败。迅雷服务器未响应,请稍候"; _log "$outmsg";;
-2)
local outmsg="Wget 参数解析错误,请更新 GNU Wget"; _log "$outmsg" $(( 1 | 8 | 32 ));;
-3)
local outmsg="Wget 网络通信失败,请稍候"; _log "$outmsg";;
*)
local errorDesc; json_get_var errorDesc "errorDesc"
local outmsg="帐号登录失败。错误代码: ${lasterr}"; \
[ -n "$errorDesc" ] && outmsg="${outmsg},原因: $errorDesc"; _log "$outmsg" $(( 1 | 8 | 32 ));;
esac
[ $lasterr -eq 0 ] && return 0 || return 1
}
# 帐号注销
swjsq_logout() {
swjsq_json
json_add_string userID "$_userid"
json_add_string sessionID "$_sessionid"
json_close_object
local ret=$($_http_cmd --user-agent="$agent_xl" 'https://mobile-login.xunlei.com/logout' --post-data="$(json_dump)")
_log "logout is $ret" $(( 1 | 4 ))
json_cleanup; json_load "$ret" >/dev/null 2>&1
json_get_var lasterr "errorCode"
case ${lasterr:=-1} in
0)
_sessionid=
local outmsg="帐号注销成功"; _log "$outmsg" $(( 1 | 8 ));;
-1)
local outmsg="帐号注销失败。迅雷服务器未响应,请稍候"; _log "$outmsg";;
*)
local errorDesc; json_get_var errorDesc "errorDesc"
local outmsg="帐号注销失败。错误代码: ${lasterr}"; \
[ -n "$errorDesc" ] && outmsg="${outmsg},原因: $errorDesc"; _log "$outmsg" $(( 1 | 8 | 32 ));;
esac
[ $lasterr -eq 0 ] && return 0 || return 1
}
# 获取用户信息
swjsq_getuserinfo() {
[ $1 -eq 1 ] && local _vasid=14 || local _vasid=33
swjsq_json
json_add_string userID "$_userid"
json_add_string sessionID "$_sessionid"
json_add_string vasid "$_vasid"
json_close_object
local ret=$($_http_cmd --user-agent="$agent_xl" 'https://mobile-login.xunlei.com/getuserinfo' --post-data="$(json_dump)")
_log "getuserinfo $1 is $ret" $(( 1 | 4 ))
json_cleanup; json_load "$ret" >/dev/null 2>&1
json_get_var lasterr "errorCode"
[ $1 -eq 1 ] && local outmsg="下行提速会员" || local outmsg="上行提速会员"
case ${lasterr:=-1} in
0)
local index vasid isVip isYear expireDate can_upgrade
json_select "vipList" >/dev/null 2>&1
while : ; do
json_select ${index:=1} >/dev/null 2>&1
[ $? -ne 0 ] && break
json_get_var vasid "vasid"
json_get_var isVip "isVip"
json_get_var isYear "isYear"
json_get_var expireDate "expireDate"
json_select ".." >/dev/null 2>&1
let index++
([ $1 -eq 1 -a ${vasid:-0} -eq 2 ] || [ ${vasid:-0} -eq $_vasid ]) && \
[ ${isVip:-0} -eq 1 -o ${isYear:-0} -eq 1 ] && { can_upgrade=1; break; }
done
if [ ${can_upgrade:-0} -eq 1 ]; then
outmsg="获取${outmsg}信息成功。会员到期时间:${expireDate:0:4}-${expireDate:4:2}-${expireDate:6:2}"; \
_log "$outmsg" $(( 1 | $1 * 8 ))
else
if [ ${#expireDate} -ge 8 ]; then
outmsg="${outmsg}已到期。会员到期时间:${expireDate:0:4}-${expireDate:4:2}-${expireDate:6:2}"
else
outmsg="${outmsg}无效"
fi
_log "$outmsg" $(( 1 | $1 * 8 | 32 ))
[ $1 -eq 1 ] && down_acc=0 || up_acc=0
fi
;;
-1)
outmsg="获取${outmsg}信息失败。迅雷服务器未响应,请稍候"; _log "$outmsg";;
*)
local errorDesc; json_get_var errorDesc "errorDesc"
outmsg="获取${outmsg}信息失败。错误代码: ${lasterr}"; \
[ -n "$errorDesc" ] && outmsg="${outmsg},原因: $errorDesc"; _log "$outmsg" $(( 1 | $1 * 8 | 32 ));;
esac
[ $lasterr -eq 0 ] && return 0 || return 1
}
# 获取提速入口
swjsq_portal() {
xlnetacc_var $1
[ $1 -eq 1 ] && access_url='http://api.portal.swjsq.vip.xunlei.com:81/v2/queryportal' || \
access_url='http://api.upportal.swjsq.vip.xunlei.com/v2/queryportal'
local ret=$($_http_cmd --user-agent="$user_agent" "$access_url")
_log "portal $1 is $ret" $(( 1 | 4 ))
json_cleanup; json_load "$ret" >/dev/null 2>&1
json_get_var lasterr "errno"
case ${lasterr:=-1} in
0)
local interface_ip interface_port province sp
json_get_var interface_ip "interface_ip"
json_get_var interface_port "interface_port"
json_get_var province "province_name"
json_get_var sp "sp_name"
if [ $1 -eq 1 ]; then
_portal_down="http://$interface_ip:$interface_port/v2"
_log "_portal_down is $_portal_down" $(( 1 | 4 ))
else
_portal_up="http://$interface_ip:$interface_port/v2"
_log "_portal_up is $_portal_up" $(( 1 | 4 ))
fi
local outmsg="获取${link_cn}提速入口成功"; \
[ -n "$province" -a -n "$sp" ] && outmsg="${outmsg}。运营商:${province}${sp}"; _log "$outmsg" $(( 1 | $1 * 8 ))
;;
-1)
local outmsg="获取${link_cn}提速入口失败。迅雷服务器未响应,请稍候"; _log "$outmsg";;
*)
local message; json_get_var message "message"
local outmsg="获取${link_cn}提速入口失败。错误代码: ${lasterr}"; \
[ -n "$message" ] && outmsg="${outmsg},原因: $message"; _log "$outmsg" $(( 1 | $1 * 8 | 32 ));;
esac
[ $lasterr -eq 0 ] && return 0 || return 1
}
# 获取网络带宽信息
isp_bandwidth() {
xlnetacc_var $1
local ret=$($_http_cmd --user-agent="$user_agent" "$access_url/bandwidth?${http_args%&dial_account=*}")
_log "bandwidth $1 is $ret" $(( 1 | 4 ))
json_cleanup; json_load "$ret" >/dev/null 2>&1
json_get_var lasterr "errno"
case ${lasterr:=-1} in
0)
# 获取带宽数据
local can_upgrade bind_dial_account dial_account stream cur_bandwidth max_bandwidth
[ $1 -eq 1 ] && stream="downstream" || stream="upstream"
json_get_var can_upgrade "can_upgrade"
json_get_var bind_dial_account "bind_dial_account"
json_get_var dial_account "dial_account"
json_select; json_select "bandwidth" >/dev/null 2>&1
json_get_var cur_bandwidth "$stream"
json_select; json_select "max_bandwidth" >/dev/null 2>&1
json_get_var max_bandwidth "$stream"
json_select
cur_bandwidth=$(expr ${cur_bandwidth:-0} / 1024)
max_bandwidth=$(expr ${max_bandwidth:-0} / 1024)
if [ -n "$bind_dial_account" -a "$bind_dial_account" != "$dial_account" ]; then
local outmsg="绑定宽带账号 $bind_dial_account 与当前宽带账号 $dial_account 不一致,请联系迅雷客服解绑(每月仅一次)"; \
_log "$outmsg" $(( 1 | 8 | 32 ))
down_acc=0; up_acc=0
elif [ $can_upgrade -eq 0 ]; then
local message; json_get_var message "richmessage"; [ -z "$message" ] && json_get_var message "message"
local outmsg="${link_cn}无法提速"; \
[ -n "$message" ] && outmsg="${outmsg},原因: $message"; _log "$outmsg" $(( 1 | $1 * 8 | 32 ))
[ $1 -eq 1 ] && down_acc=0 || up_acc=0
elif [ $cur_bandwidth -ge $max_bandwidth ]; then
local outmsg="${link_cn}无需提速。当前带宽 ${cur_bandwidth}M超过最大可提升带宽 ${max_bandwidth}M"; \
_log "$outmsg" $(( 1 | $1 * 8 ))
[ $1 -eq 1 ] && down_acc=0 || up_acc=0
else
if [ -z "$_dial_account" -a -n "$dial_account" ]; then
_dial_account=$dial_account
_log "_dial_account is $_dial_account" $(( 1 | 4 ))
fi
local outmsg="${link_cn}可以提速。当前带宽 ${cur_bandwidth}M可提升至 ${max_bandwidth}M"; _log "$outmsg" $(( 1 | $1 * 8 ))
fi
;;
724) # 724 账号存在异常
lasterr=-2
local outmsg="获取${link_cn}网络带宽信息失败。原因: 您的账号存在异常,请联系迅雷客服反馈"; _log "$outmsg" $(( 1 | $1 * 8 | 32 ));;
3103) # 3103 线路暂不支持
lasterr=0
local province sp
json_get_var province "province_name"; json_get_var sp "sp_name"
local outmsg="${link_cn}无法提速。原因: ${province}${sp}线路暂不支持"; _log "$outmsg" $(( 1 | $1 * 8 | 32 ))
[ $1 -eq 1 ] && down_acc=0 || up_acc=0
;;
-1)
local outmsg="获取${link_cn}网络带宽信息失败。运营商服务器未响应,请稍候"; _log "$outmsg";;
*)
local message; json_get_var message "richmessage"; [ -z "$message" ] && json_get_var message "message"
local outmsg="获取${link_cn}网络带宽信息失败。错误代码: ${lasterr}"; \
[ -n "$message" ] && outmsg="${outmsg},原因: $message"; _log "$outmsg" $(( 1 | $1 * 8 | 32 ));;
esac
[ $lasterr -eq 0 ] && return 0 || return 1
}
# 发送带宽提速信号
isp_upgrade() {
xlnetacc_var $1
local ret=$($_http_cmd --user-agent="$user_agent" "$access_url/upgrade?$http_args")
_log "upgrade $1 is $ret" $(( 1 | 4 ))
json_cleanup; json_load "$ret" >/dev/null 2>&1
json_get_var lasterr "errno"
case ${lasterr:=-1} in
0)
local bandwidth
json_select "bandwidth" >/dev/null 2>&1
json_get_var bandwidth "downstream"
[ ${bandwidth:=0} -ge 1024 ] && bandwidth=$(( $bandwidth / 1024 ))
local outmsg="${link_cn}提速成功,带宽已提升到 ${bandwidth}M"; _log "$outmsg" $(( 1 | $1 * 8 ))
[ $1 -eq 1 ] && down_acc=2 || up_acc=2
;;
812) # 812 已处于提速状态
lasterr=0
local outmsg="${link_cn}提速成功,当前宽带已处于提速状态"; _log "$outmsg" $(( 1 | $1 * 8 ))
[ $1 -eq 1 ] && down_acc=2 || up_acc=2
;;
724) # 724 账号存在异常
lasterr=-2
local outmsg="${link_cn}提速失败。原因: 您的账号存在异常,请联系迅雷客服反馈"; _log "$outmsg" $(( 1 | $1 * 8 | 32 ));;
-1)
local outmsg="${link_cn}提速失败。运营商服务器未响应,请稍候"; _log "$outmsg";;
*)
local message; json_get_var message "richmessage"; [ -z "$message" ] && json_get_var message "message"
local outmsg="${link_cn}提速失败。错误代码: ${lasterr}"; \
[ -n "$message" ] && outmsg="${outmsg},原因: $message"; _log "$outmsg" $(( 1 | $1 * 8 | 32 ));;
esac
[ $lasterr -eq 0 ] && return 0 || return 1
}
# 发送提速心跳信号
isp_keepalive() {
xlnetacc_var $1
local ret=$($_http_cmd --user-agent="$user_agent" "$access_url/keepalive?$http_args")
_log "keepalive $1 is $ret" $(( 1 | 4 ))
json_cleanup; json_load "$ret" >/dev/null 2>&1
json_get_var lasterr "errno"
case ${lasterr:=-1} in
0)
local outmsg="${link_cn}心跳信号返回正常"; _log "$outmsg";;
513) # 513 提速通道不存在
lasterr=-2
local outmsg="${link_cn}提速超时,提速通道不存在"; _log "$outmsg" $(( 1 | $1 * 8 | 32 ));;
-1)
local outmsg="${link_cn}心跳信号发送失败。运营商服务器未响应,请稍候"; _log "$outmsg";;
*)
local message; json_get_var message "richmessage"; [ -z "$message" ] && json_get_var message "message"
local outmsg="${link_cn}提速失效。错误代码: ${lasterr}"; \
[ -n "$message" ] && outmsg="${outmsg},原因: $message"; _log "$outmsg" $(( 1 | $1 * 8 | 32 ));;
esac
[ $lasterr -eq 0 ] && return 0 || return 1
}
# 发送带宽恢复信号
isp_recover() {
xlnetacc_var $1
local ret=$($_http_cmd --user-agent="$user_agent" "$access_url/recover?$http_args")
_log "recover $1 is $ret" $(( 1 | 4 ))
json_cleanup; json_load "$ret" >/dev/null 2>&1
json_get_var lasterr "errno"
case ${lasterr:=-1} in
0)
local outmsg="${link_cn}带宽已恢复"; _log "$outmsg" $(( 1 | $1 * 8 ))
[ $1 -eq 1 ] && down_acc=1 || up_acc=1;;
-1)
local outmsg="${link_cn}带宽恢复失败。运营商服务器未响应,请稍候"; _log "$outmsg";;
*)
local message; json_get_var message "richmessage"; [ -z "$message" ] && json_get_var message "message"
local outmsg="${link_cn}带宽恢复失败。错误代码: ${lasterr}"; \
[ -n "$message" ] && outmsg="${outmsg},原因: $message"; _log "$outmsg" $(( 1 | $1 * 8 | 32 ));;
esac
[ $lasterr -eq 0 ] && return 0 || return 1
}
# 查询提速信息,未使用
isp_query() {
xlnetacc_var $1
local ret=$($_http_cmd --user-agent="$user_agent" "$access_url/query_try_info?$http_args")
_log "query_try_info $1 is $ret" $(( 1 | 4 ))
json_cleanup; json_load "$ret" >/dev/null 2>&1
json_get_var lasterr "errno"
[ $lasterr -eq 0 ] && return 0 || return 1
}
# 设置参数变量
xlnetacc_var() {
if [ $1 -eq 1 ]; then
let sequence_down++
access_url=$_portal_down
http_args="sequence=${sequence_down}&client_type=${client_type_down}-${clientVersion}&client_version=${client_type_down//-/}-${clientVersion}&chanel=umeng-10900011&time_and=$(date +%s)000"
user_agent=$agent_down
link_cn="下行"
else
let sequence_up++
access_url=$_portal_up
http_args="sequence=${sequence_up}&client_type=${client_type_up}-${clientVersion}&client_version=${client_type_up//-/}-${clientVersion}"
user_agent=$agent_up
link_cn="上行"
fi
http_args="${http_args}&peerid=${_peerid}&userid=${_userid}&sessionid=${_sessionid}&user_type=1&os=android-7.1.1"
[ -n "$_dial_account" ] && http_args="${http_args}&dial_account=${_dial_account}"
}
# 重试循环
xlnetacc_retry() {
if [ $# -ge 3 -a $3 -ne 0 ]; then
[ $2 -eq 1 -a $down_acc -ne $3 ] && return 0
[ $2 -eq 2 -a $up_acc -ne $3 ] && return 0
fi
local retry=1
while : ; do
lasterr=
eval $1 $2 && break # 成功
[ $# -ge 4 -a $retry -ge $4 ] && break || let retry++ # 重试超时
case $lasterr in
-1) sleep 5s;; # 服务器未响应
-2) break;; # 严重错误
*) sleep 3s;; # 其它错误
esac
done
[ ${lasterr:-0} -eq 0 ] && return 0 || return 1
}
# 注销已登录帐号
xlnetacc_logout() {
[ -z "$_sessionid" ] && return 2
[ $# -ge 1 ] && local retry=$1 || local retry=1
xlnetacc_retry 'isp_recover' 1 2 $retry
xlnetacc_retry 'isp_recover' 2 2 $retry
xlnetacc_retry 'swjsq_logout' 0 0 $retry
[ $down_acc -ne 0 ] && down_acc=1; [ $up_acc -ne 0 ] && up_acc=1
_sessionid=; _dial_account=
[ $lasterr -eq 0 ] && return 0 || return 1
}
# 中止信号处理
sigterm() {
_log "trap sigterm, exit" $(( 1 | 4 ))
xlnetacc_logout
rm -f "$down_state_file" "$up_state_file"
exit 0
}
# 初始化
xlnetacc_init() {
[ "$1" != "--start" ] && return 1
# 防止重复启动
local pid
for pid in $(pidof "${0##*/}"); do
[ $pid -ne $$ ] && return 1
done
# 读取设置
readonly NAME=xlnetacc
readonly LOGFILE=/var/log/${NAME}.log
readonly down_state_file=/var/state/${NAME}_down_state
readonly up_state_file=/var/state/${NAME}_up_state
down_acc=$(uci_get_by_bool "general" "down_acc" 0)
up_acc=$(uci_get_by_bool "general" "up_acc" 0)
readonly logging=$(uci_get_by_bool "general" "logging" 1)
readonly verbose=$(uci_get_by_bool "general" "verbose" 0)
network=$(uci_get_by_name "general" "network" "wan")
readonly username=$(uci_get_by_name "general" "account")
readonly password=$(uci_get_by_name "general" "password")
local enabled=$(uci_get_by_bool "general" "enabled" 0)
([ $enabled -eq 0 ] || [ $down_acc -eq 0 -a $up_acc -eq 0 ] || [ -z "$username" -o -z "$password" -o -z "$network" ]) && return 2
[ $logging -eq 1 ] && [ ! -d /var/log ] && mkdir -p /var/log
[ -f "$LOGFILE" ] && _log "------------------------------"
_log "迅雷快鸟正在启动..."
# 检查外部调用工具
command -v wget-ssl >/dev/null || { _log "GNU Wget 未安装"; return 3; }
local opensslchk=$(echo -n 'openssl' | openssl dgst -sha1 | awk '{print $2}')
[ "$opensslchk" != 'c898fa1e7226427010e329971e82c669f8d8abb4' ] && { _log "openssl-util 未安装或计算错误"; return 3; }
# 捕获中止信号
trap 'sigterm' INT # Ctrl-C
trap 'sigterm' QUIT # Ctrl-\
trap 'sigterm' TERM # kill
# 生成设备标识
gen_device_sign
[ ${#_peerid} -ne 16 -o ${#_devicesign} -ne 71 ] && return 4
clean_log
[ -d /var/state ] || mkdir -p /var/state
return 0
}
# 程序主体
xlnetacc_main() {
while : ; do
# 获取外网IP地址
xlnetacc_retry 'get_bind_ip'
gen_http_cmd
# 注销快鸟帐号
xlnetacc_logout 3 && sleep 3s
# 登录快鸟帐号
while : ; do
lasterr=
swjsq_login
case $lasterr in
0) break;; # 登录成功
-1) sleep 5s;; # 服务器未响应
-2) return 7;; # Wget 参数解析错误
-3) sleep 3s;; # Wget 网络通信失败
6) sleep 130m;; # 需要输入验证码
8) sleep 3m;; # 服务器系统维护
15) sleep 1s;; # 身份信息已失效
*) return 5;; # 登录失败
esac
done
# 获取用户信息
xlnetacc_retry 'swjsq_getuserinfo' 1 1
xlnetacc_retry 'swjsq_getuserinfo' 2 1
[ $down_acc -eq 0 -a $up_acc -eq 0 ] && break
# 获取提速入口
xlnetacc_retry 'swjsq_portal' 1 1
xlnetacc_retry 'swjsq_portal' 2 1
# 获取带宽信息
xlnetacc_retry 'isp_bandwidth' 1 1 10 || { sleep 3m; continue; }
xlnetacc_retry 'isp_bandwidth' 2 1 10 || { sleep 3m; continue; }
[ $down_acc -eq 0 -a $up_acc -eq 0 ] && break
# 带宽提速
xlnetacc_retry 'isp_upgrade' 1 1 10 || { sleep 3m; continue; }
xlnetacc_retry 'isp_upgrade' 2 1 10 || { sleep 3m; continue; }
# 心跳保持
# local retry=1
while : ; do
clean_log # 清理日志
sleep 10m
# [ $retry -ge 144 ] && break || let retry++ # 心跳最多保持24小时144=24*60/10
xlnetacc_retry 'isp_keepalive' 1 2 5 || break
xlnetacc_retry 'isp_keepalive' 2 2 5 || break
done
done
xlnetacc_logout
_log "无法提速,迅雷快鸟已停止。"
return 6
}
# 程序入口
xlnetacc_init "$@" && xlnetacc_main
exit $?