#!/bin/sh #copyright by monlor export PATH=$PATH:/etc/mixbox/bin mburl_coding="https://monlor.coding.net/p/mbfiles/d/mbfiles/git/lfs/master" mburl_github="https://raw.githubusercontent.com/monlor/mbfiles/master" mburl_gitee="https://gitee.com/monlor/mbfiles/raw/master" mburl=$(mbdb get mixbox.main.url) || mburl="$mburl_gitee" mbroot=$(mbdb get mixbox.main.path) mbdisk=$(mbdb get mixbox.main.mbdisk) mbbackup="/etc/mbbackup" [ -z "$mbdisk" ] && mbdisk="${mbroot}" wanip=$(ubus call network.interface.wan status 2> /dev/null | grep \"address\" | grep -oE '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}') || wanip="127.0.0.1" lanip=$(uci get network.lan.ipaddr 2> /dev/null) || lanip="127.0.0.1" profilepath=$(mbdb get mixbox.main.profilepath) libpath=$(mbdb get mixbox.main.libpath) mbver=$(mbdb get mixbox.main.version) mbtmp=/tmp/mbtmp [ ! -d "${mbtmp}" ] && mkdir -p ${mbtmp} model=$(mbdb get mixbox.main.model) xq=$(cat /proc/xiaoqiang/model 2> /dev/null) || xq="$(uname -s)" source ${mbroot}/scripts/helper.sh # if [ "$xq" == "R1D" -o "$xq" == "R2D" -o "$xq" == "R3D" ]; then # model=arm # elif [ "$xq" == "R3" -o "$xq" == "R3P" -o "$xq" == "R3G" -o "$xq" == "R1CM" ]; then # model=mips # fi # 备份uci配置,主要为了系统升级后能恢复配置 # if [ -f "/etc/config/mixbox" ]; then # [ ! -f ${mbroot}/config/mixbox.uci ] && touch ${mbroot}/config/mixbox.uci # md5_1=$(md5sum /etc/config/mixbox | cut -d' ' -f1) # md5_2=$(md5sum ${mbroot}/config/mixbox.uci | cut -d' ' -f1) # if [ "$md5_1" != "$md5_2" ]; then # cp -rf /etc/config/mixbox ${mbroot}/config/mixbox.uci # fi # fi checkuci() { # 最初用来检查插件的uci是否存在,现在当插件已经安装则返回0 result=$(mbdb show $1.main) if [ ! -z "$result" -a -d ${mbroot}/apps/$1 ]; then return 0 else return 1 fi } checkread() { # 传入参数为0或1则返回0,否则返回1 if [ "$1" == '1' -o "$1" == '0' ]; then return 0 else return 1 fi } cutsh() { # 传入要分割的文本和要分割出的位置,以逗号分割 local delimiter="," if [ -n "$1" -a -n "$2" ]; then [ -n "$3" ] && delimiter="$3" echo $1 | cut -d"${delimiter}" -f"$2" elif [ -n "$1" -a -z "$2" ]; then [ -n "$2" ] && delimiter="$2" xargs | cut -d"${delimiter}" -f"$1" fi } logsh() { # 输出信息到/tmp/messages和标准输出,-s只输入到标准输出,-p只输入到日志文件 command -v logger &> /dev/null if [ $? -eq 0 ]; then if [ "$3" == "-s" ]; then logger -s -t "$1" "$2" elif [ "$3" == "-p" ]; then logger -p 1 -t "$1" "$2" else logger -s -p 1 -t "$1" "$2" fi return 0 else alias echo_date='echo 【$(TZ=UTC-8 date -R +%Y年%m月%d日\ %X)】:' if [ "$3" == "-s" ]; then echo_date "$2" elif [ "$3" == "-p" ]; then echo_date "$2" &> ${mbroot}/var/log/mixbox.log else echo_date "$2" | tee ${mbroot}/var/log/mixbox.log fi fi } pssh() { ps -aux &> /dev/null [ $? -eq 0 ] && ps -aux | grep -v grep || ps -w | grep -v grep } pingsh() { ping qq.com -c 2 &> /dev/null result1="$?" ping baidu.com -c 2 &> /dev/null result2="$?" [ "$result1" -eq 0 -o "$result2" -eq 0 ] && return 0 || return 1 } echosh() { local length="" local string="" if [ -z "$2" ]; then length="$1" string="$(xargs)" else string="$1" length="$2" fi if [ "${#string}" -gt "$length" ]; then let length="$length"-2 string="$(echo "$string" | cut -b 1-"$length")".. fi echo -e "$string" } readsh() { local readtext="$1" local uciname="$2" local value="$(mbdb get ${appname}.main.$2)" local default="$3" if [ -z "$value" ]; then [ -n "$default" ] && showtext="[回车即$default]" || showtext="[未设置]" else showtext="[回车即$value]" fi read -p "$readtext$showtext:" res if [ "$uciname" = "res" ]; then res="$res" return 0 fi if [ "$res" = '-1' ]; then mbdb del ${appname}.main.$uciname else if [ -z "$res" ]; then if [ -n "$value" ]; then mbdb set $appname.main.$uciname="$value" || echo "设置key:"$uciname"等于value:"$value"出错!" else mbdb set $appname.main.$uciname="$default" || echo "设置key:"$uciname"等于value:"$default"出错!" fi else if [ "$uciname" = "port" ] && [ -n "$(netstat -tunpl 2> /dev/null | grep -w "$res")" ]; then echo "端口已被占用!请重新输入!" readsh $@ else mbdb set $appname.main.$uciname="$res" || echo "设置key:"$uciname"等于value:"$res"出错!" eval "$uciname"="\"$res\"" return 0 fi fi fi return 0 } umountsh() { local mount_point="$1" [ -z "$mount_point" ] && return 1 mount_points="$(df -h | grep -Ew "[ ]*"$mount_point"[ ]*" | awk '{print$6}')" [ -n "$mount_points" ] && umount -lf "$mount_points" &> /dev/null return 0 } write_firewall_start(){ if [ "$openport" == "1" ];then logsh "【$service】" "添加nat-start触发事件..." mbdb set mixbox.firewall.${appname}=1 fi } remove_firewall_start(){ logsh "【$service】" "删除nat-start触发..." [ -z "${appname}" ] && return 1 mbdb set mixbox.firewall.${appname}=0 } daemon() { local binname="$(basename "${1}")" if type nohup >/dev/null 2>&1; then nohup $@ &> ${mbroot}/var/log/${binname}.log & else $@ &> ${mbroot}/var/log/${binname}.log & fi return $? } open_port () { local protocol="" [ -n "$1" ] && local port="$1" [ -n "$2" ] && protocol="$2" || protocol="tcp" if [ "$openport" = '1' ]; then if [ -n "$(echo ${port} | grep ',')" ]; then iptables -I INPUT -p "$protocol" -m multiport --dport "${port}" -m comment --comment "mixbox-${appname}" -j ACCEPT else iptables -I INPUT -p "$protocol" --dport "${port}" -m comment --comment "mixbox-${appname}" -j ACCEPT fi fi } close_port () { eval `iptables -S | grep "mixbox-${appname}" | sed -e 's/-A/iptables -D/g' | sed -e 's/\$/;/g'` } bincheck () { binname="$@" command -v apt &> /dev/null if [ $? -eq 0 ]; then logsh "【$service】" "监测到apt程序,使用apt安装..." echo y | apt install ${binname} &> /dev/null fi command -v yum &> /dev/null if [ $? -eq 0 ]; then logsh "【$service】" "监测到yum程序,使用yum安装..." yum install ${binname} -y &> /dev/null fi command -v pacman &> /dev/null if [ $? -eq 0 ]; then logsh "【$service】" "监测到pacman程序,使用pacman安装..." pacman -S ${binname} --noconfirm &> /dev/null fi command -v opkg &> /dev/null if [ $? -eq 0 ]; then logsh "【$service】" "监测到opkg程序,使用opkg安装..." opkg install ${binname} &> /dev/null [ $? -ne 0 -a -x /opt/bin/opkg ] && /opt/bin/opkg install ${binname} &> /dev/null fi command -v brew &> /dev/null if [ $? -eq 0 ]; then logsh "【$service】" "监测到brew程序,使用brew安装..." brew install ${binname} &> /dev/null fi return $? } # 通过传入一个字符串,取变量名称等于该字符串的变量值 parse_str() { [ -z "${1}" ] && echo -n "" || eval echo -n '$'"${1}" }