moxbox init

This commit is contained in:
monlor
2020-03-05 00:08:40 +08:00
commit 76dbe98978
856 changed files with 170708 additions and 0 deletions

83
apps/mixbox/bin/applist Normal file
View File

@@ -0,0 +1,83 @@
#!/bin/sh
#copyright by monlor
# source /etc/mixbox/bin/base
export PATH=$PATH:/etc/mixbox/bin
mbroot="/etc/mixbox"
mbtmp="/tmp/mbtmp"
mburl=$(mbdb get mixbox.main.url)
model=$(mbdb get mixbox.main.model)
fix_local_applist() {
rm -rf ${mbroot}/config/applist.txt
if [ ! -f ${mbtmp}/applist.txt ]; then
echo "未找到在线插件列表,无法修复!"
return 1
else
get_applist all -a | while read line
do
name="$(get_applist ${line} -n)"
checkuci $name && echo ${line} >> ${mbroot}/config/applist.txt
done
fi
if [ ! -f ${mbroot}/config/applist.txt ]; then
echo "修复失败!"
return 1
else
return 0
fi
}
get_applist() {
if [ "$1" = "installed" ]; then
[ ! -f ${mbroot}/config/applist.txt ] && fix_local_applist
applist_txt="${mbroot}/config/applist.txt"
else
applist_txt="${mbtmp}/applist.txt"
fi
appname="$1" # all: all app, installed, installed app
arg="$2" # -n:appname, -i:appinfo, -e:newinfo, -v:version, -s:service
[ "$appname" = "all" -o "$appname" = "installed" ] && appname=".*"
case "$arg" in
"-n")
cat $applist_txt 2> /dev/null | grep -v mixbox | grep "^${appname}|" | cut -d'|' -f1 | sort -u
;;
"-i")
cat $applist_txt 2> /dev/null | grep "^${appname}|" | cut -d'|' -f2
;;
"-e")
cat $applist_txt 2> /dev/null | grep "^${appname}|" | cut -d'|' -f3
;;
"-v")
cat $applist_txt 2> /dev/null | grep "^${appname}|" | cut -d'|' -f4
;;
"-s")
cat $applist_txt 2> /dev/null | grep "^${appname}|" | cut -d'|' -f5
;;
"-a")
cat $applist_txt 2> /dev/null | grep -v mixbox | grep "^${appname}|"
;;
*)
cat $applist_txt 2> /dev/null | sort -u
;;
esac
}
update_applist() {
result1=$(curl -skL --connect-timeout 10 -m 20 -w %{http_code} -o ${mbtmp}/applist_tmp.txt $mburl/applist.txt)
[ -f ${mbtmp}/applist_tmp.txt ] && result2=$(du -sh ${mbtmp}/applist_tmp.txt | awk '{print$1}') || result2='0'
[ "$result1" != "200" -o "$result2" = '0' ] && exit 1
cat ${mbtmp}/applist_tmp.txt | grep "${model}" | sort -u > ${mbtmp}/applist.txt
rm -rf ${mbtmp}/applist_tmp.txt
}
# force udpate
[ "$1" = "update" ] && update_applist && exit
[ ! -f ${mbtmp}/applist.txt ] && update_applist
get_applist $@
exit 0

289
apps/mixbox/bin/base Normal file
View File

@@ -0,0 +1,289 @@
#!/bin/sh
#copyright by monlor
export PATH=$PATH:/etc/mixbox/bin
mburl_coding="https://monlor.coding.net/p/mbfiles/d/mbfiles/git/raw/master"
mburl_github="https://raw.githubusercontent.com/monlor/mbfiles/master"
mburl_test="https://monlor.coding.net/p/mbfiles/d/mbfiles/git/raw/test"
mburl=$(mbdb get mixbox.main.url) || mburl="$mburl_coding"
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)"
# 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
}
wgetsh() {
# 传入下载的文件位置和下载地址,自动下载到${mbtmp},若成功则移到下载位置
[ -z "$1" -o -z "$2" ] && return 1
[ -x /opt/bin/curl ] && alias curl=/opt/bin/curl
local wgetfilepath="$1"
local wgetfilename=$(basename $wgetfilepath)
local wgetfiledir=$(dirname $wgetfilepath)
local wgeturl="$2"
[ ! -d "$wgetfiledir" ] && mkdir -p $wgetfiledir
[ ! -d ${mbtmp} ] && mkdir -p ${mbtmp}
rm -rf ${mbtmp}/${wgetfilename}
result1=$(curl -skL --connect-timeout 10 -m 20 -w %{http_code} -o "${mbtmp}/${wgetfilename}" "$wgeturl")
[ -f "${mbtmp}/${wgetfilename}" ] && result2=$(du -sh "${mbtmp}/${wgetfilename}" 2> /dev/null | awk '{print$1}')
if [ "$result1" != "200" -a "$result2" == '0' ]; then
rm -rf ${mbtmp}/${wgetfilename}
return 1
else
chmod +x ${mbtmp}/${wgetfilename} > /dev/null 2>&1
mv -f ${mbtmp}/${wgetfilename} $wgetfilepath > /dev/null 2>&1
return 0
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}")"
nohup $@ &> ${mbroot}/var/log/${binname}.log &
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}"
}
base_encode() {
[ -z "${1}" ] && echo -n "" || echo -n "$*" | baseutil --b64
}
base_decode() {
[ -z "${1}" ] && echo -n "" || echo -n "$*" | baseutil --b64 -d
}

Binary file not shown.

Binary file not shown.

Binary file not shown.

43
apps/mixbox/bin/cru Normal file
View File

@@ -0,0 +1,43 @@
#!/bin/sh
#copyright by monlor
source /etc/mixbox/bin/base
# 添加定时任务利用uci来储存信息cru {a|d|c} [name] [crontab]
method="$1"
name="$2"
# content="$3"
case "$method" in
a)
[ -z "$name" -o -z "$3" ] && exit 1
mbdb set mixbox.cru.${name}="$(base_encode "$3")"
;;
d)
[ -z "$name" ] && exit 1
mbdb del mixbox.cru.${name}
;;
c)
mbdb clear mixbox.cru
;;
l)
mbdb show mixbox.cru
;;
esac
# 使定时任务生效
if [ -d /etc/crontabs/ ]; then
cronpath="/etc/crontabs/root"
elif [ -d /var/spool/cron/ ]; then
cronpath="/var/spool/cron/root"
elif [ -d /var/spool/cron/crontabs/ ]; then
cronpath="/var/spool/cron/crontabs/root"
else
logsh "【Tools】" "找不到定时任务文件!" -p
exit 1
fi
sed -i "/#mixbox-cru/d" ${cronpath} &> /dev/null
mbdb values mixbox.cru | while read line; do
echo "$(base_decode "$line") #mixbox-cru" >> ${cronpath}
done
exit 0

70
apps/mixbox/bin/mbdb Normal file
View File

@@ -0,0 +1,70 @@
#!/bin/sh
#copyright by monlor
mbroot="/etc/mixbox"
#${appname}.main.$key=$value 通过uci更轻松的存储数据
#采用了keyvalue对形式储存数据调用前设置appname和uciname值uciname默认值为info
method="$1"
[ -z "$method" ] && method="help"
appname="$(echo "$2" | awk -F '=' '{print$1}' | awk -F '\.' '{print$1}')"
uciname="$(echo "$2" | awk -F '=' '{print$1}' | awk -F '\.' '{print$2}')"
key="$(echo "$2" | awk -F '=' '{print$1}' | awk -F '\.' '{print$3}')"
value="$(echo "$2" | cut -d'=' -f2-)"
configdir=${mbroot}/mbdb
alias uci="uci -c ${configdir}"
help() {
echo "\`mbdb $@\` error!"
echo -e "Usage: $0 {get|set|del|export|show|clean} [key] [value]"
echo -e "Options:"
echo -e "\tget\tGet value by key"
echo -e "\tset\tSet key and value"
echo -e "\tdel\tDelete info by key"
echo -e "\tkeys\tShow all key"
echo -e "\tvalues\tShow all value"
echo -e "\tshow\tShow all key and value"
echo -e "\tclear\tClear all info"
echo -e "\texport\tGet app configure"
exit 1
}
case "$method" in
get)
uci -q get ${appname}.${uciname}.${key} | sed -e "s/'//g"
;;
set)
[ ! -f ${configdir}/${appname} ] && touch ${configdir}/${appname}
uci -q get ${appname}.${uciname} &> /dev/null || uci -q set ${appname}.${uciname}=config
uci -q set ${appname}.${uciname}.${key}="${value}"
uci commit ${appname}.${uciname}
;;
del)
uci -q del ${appname}.${uciname}.${key}
;;
keys)
uci -q get ${appname}.${uciname} &> /dev/null && uci -q show ${appname}.${uciname} | sed -e "s/'//g" | sed 1d | sed -e "s/${appname}.${uciname}.//g" | cut -d'=' -f1
;;
values)
uci -q get ${appname}.${uciname} &> /dev/null && uci -q show ${appname}.${uciname} | sed -e "s/'//g" | sed 1d | sed -e "s/${appname}.${uciname}.//g" | cut -d'=' -f2-
;;
show)
if [ -z "${uciname}" ]; then
uci -q show ${appname} | sed -e "s/'//g" | sed -e "/${appname}.[a-z]\+\=config/d" -e "s/${appname}\.[a-z]\+\.//"
else
uci -q get ${appname}.${uciname} &> /dev/null && uci -q show ${appname}.${uciname} | sed -e "s/'//g" | sed -e "/${appname}.[a-z]\+\=config/d" -e "s/${appname}\.[a-z]\+\.//"
fi
;;
clear)
uci -q del ${appname}.${uciname}
;;
export)
[ -z "${uciname}" ] && uciname="main"
uci -q get ${appname}.${uciname} &> /dev/null && uci -q show ${appname}.${uciname} | sed -e "s/'//g" | sed 1d | sed -e "s/${appname}.${uciname}.//g" | sed -e "s/=/='/" -e "s/$/'/" | tr "\n" ";"
;;
*)
help
;;
esac
exit $?

470
apps/mixbox/bin/mixbox Normal file
View File

@@ -0,0 +1,470 @@
#!/bin/sh
#copyright by monlor
#------------------【Tools】--------------------
source /etc/mixbox/bin/base
param=$1
get_status() {
applist installed -n 2> /dev/null | while read line; do
${mbroot}/apps/${line}/scripts/${line}.sh status
done
}
title() {
clear
newver=$(applist mixbox -v)
if [ -z "$newver" ]; then
newver="获取中"
check_update_text=""
else
[ "$(versioncmp $mbver $newver)" = '1' ] && check_update_text="[\033[36m输入u更新工具箱\033[0m]" || check_update_text=""
fi
echo "***************************************"
echo " ***** MIXBOX 工具箱 ***** "
echo "***************************************"
echo -e "当前版本:[$mbver]\t最新版本[$newver]"
[ -f /proc/dmu/temperature ] && temp="`cat /proc/dmu/temperature | awk '{printf$4}' | cut -b 1-2`°C"
[ -f /sys/devices/virtual/thermal/thermal_zone0/temp ] && temp="$(cat /sys/devices/virtual/thermal/thermal_zone0/temp 2> /dev/null)°C"
if [ ! -z "$temp" ]; then
temptext="核心温度:[$temp]"
else
wan_type="$(nvram get nv_wan_type 2> /dev/null)"
[ -n "$wan_type" ] && temptext="上网方式:[$wan_type]" || temptext="主机名称:[`uname -n`]"
fi
echo -e "设备型号:[$xq] \t$temptext"
echo "***************************************"
}
# install_app() {
# echo
# echo "获取工具箱插件列表..."
# wgetsh ${mbtmp}/applist.txt $mburl/temp/applist_"$xq".txt
# if [ $? -ne 0 ]; then
# [ "$model" == "arm" ] && applist="applist.txt"
# [ "$model" == "mips" ] && applist="applist_mips.txt"
# wgetsh ${mbtmp}/applist.txt $mburl/temp/"$applist"
# fi
# echo "********* 安装/更新插件 ***********"
# echo "00. 返回"
# i=1
# if [ -f ${mbtmp}/applist.txt ]; then
# cat ${mbtmp}/applist.txt | while read line
# do
# checkuci ${line} && tmp="`echo -e "\033[32m已安装\033[0m"`" || tmp="`echo -e "\033[31m未安装\033[0m"`"
# [ "$i" -lt "10" ] && k="0$i" || k="$i"
# echo "$k. [$tmp] ${line}"
# let i=$i+1
# done
# else
# echo "[插件列表未找到,请检查网络问题!]"
# fi
# echo
# read -p "请选择要安装/更新的插件:" res
# if [ ! -z "$res" ]; then
# if [ "$res" == '0' -o "$res" == '00' -o ! -f ${mbtmp}/applist.txt ]; then
# manage
# else
# result=$(echo $res | grep -c "^[0-9][0-9]*$")
# if [ "$result" == '1' ]; then
# appname=$(cat ${mbtmp}/applist.txt | sed -n "$res"p)
# if [ ! -z "${appname}" ]; then
# if checkuci ${appname}; then
# read -p "插件${appname}已安装,是否要更新?[1/0] " res
# [ "$res" == '1' ] && ${mbroot}/scripts/appmanage.sh upgrade ${appname}
# else
# ${mbroot}/scripts/appmanage.sh install ${appname}
# if checkuci ${appname}; then
# source "${mbroot}"/apps/${appname}/config/mixbox.conf
# ${appname}
#
# fi
# fi
# else
# echo "输入有误!"
# fi
# fi
# fi
# fi
# }
uninstall_app() {
echo
echo "********* 卸载插件 ***********"
echo "00. 返回管理菜单"
i=1
applist installed -n | while read line
do
[ "$i" -lt "10" ] && k="0$i" || k="$i"
echo "$k. ${line}"
let i=$i+1
done
echo
read -p "请选择要卸载的插件:" res
if [ ! -z "$res" ]; then
if [ "$res" == '0' ]; then
manage_menu
else
appname=$(applist installed -n | sed -n "$res"p)
if [ ! -z "${appname}" ]; then
${mbroot}/scripts/appmanage.sh uninstall ${appname}
else
echo "输入有误,请重新输入!"
uninstall_app
fi
fi
fi
}
backup() {
if [ -f "$mbbackup".tar.gz ]; then
read -p "检测到已被备份插件配置, 确认覆盖?[1/0] " res
else
read -p "确定要备份所有插件配置吗?[1/0] " res
fi
if [ "$res" == '1' ]; then
rm -rf $mbbackup
rm -rf "$mbbackup".tar.gz
mkdir -p $mbbackup
cp -rf ${mbroot}/mbdb $mbbackup
applist installed -n | while read line; do
echo "$(mbdb get ${line}.main.backupfiles)" | tr ',' '\n' | while read file; do
[ -z "$file" ] && continue
savepath="$(dirname $mbbackup/${line}/$file)"
[ ! -d "$savepath" ] && mkdir -p $savepath
cp -rf ${mbroot}/apps/${line}/$file $mbbackup/${line}/$file &> /dev/null
done
done
cp -rf ${mbroot}/scripts/userscript.sh $mbbackup/userscript.sh
cp -rf ${mbroot}/mbdb $mbbackup/mbdb
tar zcvf "$mbbackup".tar.gz $mbbackup > /dev/null 2>&1
rm -rf $mbbackup
echo "备份完成, 配置已备份至$mbbackup.tar.gz"
fi
}
recover(){
read -p "确定要恢复所有插件配置吗(将会覆盖当前配置)[1/0] " res
if [ "$res" == '1' ]; then
[ ! -f "$mbbackup".tar.gz ] && echo "未找到备份文件!" && return 1
rm -rf $mbbackup
tar zxvf "$mbbackup".tar.gz -C / > /dev/null 2>&1
cp -rf $mbbackup/applist.txt ${mbroot}/config/applist.txt
applist installed -n | while read line
do
checkuci ${line} || ${mbroot}/scripts/appmanage.sh install ${line}
[ -d "$mbbackup/${line}" ] && cp -rf $mbbackup/${line}/* ${mbroot}/apps/${line}/
done
# 恢复uci配置
cp -rf $mbbackup/mbdb ${mbroot}/
cp -rf $mbbackup/userscript.sh ${mbroot}/scripts/userscript.sh
rm -rf $mbbackup
echo "恢复完成, 初始化工具箱..."
${mbroot}/scripts/init.sh
fi
}
modify_source() {
local mburl_tmp=""
case "$mburl" in
"$mburl_coding") url_text="coding下载源" ;;
"$mburl_github") url_text="github下载源" ;;
"$mburl_test") url_text="coding测试源" ;;
*) url_text="$mburl" ;;
esac
echo "下载源【$url_text】使用中"
echo "0. 不修改"
echo "1. coding下载源"
echo "2. github下载源"
echo "3. coding测试源(不推荐)"
read -p "请选择或输入下载源:" res
case "$res" in
0) return ;;
1) mburl_tmp="$mburl_coding" ;;
2) mburl_tmp="$mburl_github" ;;
3) mburl_tmp="$mburl_test" ;;
*) [ -n "$res" ] && mburl_tmp="$res" ;;
esac
if [ -n "$mburl_tmp" ]; then
mbdb set mixbox.main.url="$mburl_tmp"
applist update
fi
}
# enable_webui() {
# read -p "是否要启用工具箱web界面[1/0] " res
# mbdb set mixbox.main.webui="$res"
# if [ "$res" == '0' ]; then
# umount -lf /usr/lib/lua/luci
# rm -rf ${mbtmp}/mountfiles
# rm -rf ${mbtmp}/syslogbackup/css
# rm -rf ${mbtmp}/syslogbackup/img
# rm -rf ${mbtmp}/luci-modulecache
# rm -rf ${mbtmp}/luci-indexcache
# elif [ "$res" == '1' ]; then
# ${mbroot}/scripts/addweb.sh
# fi
# }
uninstall() {
# wgetsh ${mbtmp}/uninstall.sh $mburl/apps/mixbox/scripts/uninstall.sh
# [ $? -eq 0 ] && ${mbtmp}/uninstall.sh || echo "获取卸载脚本失败!"
${mbroot}/scripts/uninstall.sh
exit
}
update() {
# wgetsh ${mbtmp}/update.sh $mburl/apps/mixbox/scripts/update.sh
# [ $? -eq 0 ] && ${mbtmp}/update.sh || echo "获取更新脚本失败!"
${mbroot}/scripts/update.sh
exit
}
check_install() {
if checkuci $1; then
status=$(mbdb get $1.main.status | cut -d'|' -f1) > /dev/null 2>&1
if [ ! -z "$status" ]; then
if [ "$status" != "未运行" ]; then
echo -n "[\033[32m$status\033[0m]"
else
echo -n "[\033[31m$status\033[0m]"
fi
else
echo -n "[\033[31m未运行\033[0m]"
fi
else
echo -n "[选择以安装]"
fi
}
check_update() {
[ -z "$1" ] && return
[ -n "$2" ] && newver="$2" || newver="$(applist $1 -v)"
oldver=$(mbdb get $1.main.version)
if [ ! -z "$newver" -a ! -z "$oldver" ] && [ "$(versioncmp $oldver $newver)" = '1' ]; then
echo -n "[\033[36m有更新\033[0m]"
return 0
fi
return 1
}
menulist() {
# if [ "$1" = '0' ]; then
# # 检查是否在进行状态检查
# for i in $(seq 1 5); do
# if [ -n "$(pssh | grep "mixbox.*status")" ]; then
# echo "正在检查插件状态,请稍等一会儿~" && sleep 2
# else
# break
# fi
# done
# fi
rm -rf ${mbtmp}/applist_menu.txt
echo "00. 返回主菜单"
i=0;
if [ "$1" = '0' ]; then
applist installed -a > ${mbtmp}/applist_all.txt
else
applist all -a > ${mbtmp}/applist_all.txt
fi
while read line
do
if [ "$1" = '0' ]; then
info=""
name="$(echo "$line" | cut -d'|' -f1)"
checkuci $name || continue
elif [ "$1" = '1' ]; then
name="$(echo "$line" | cut -d'|' -f1)"
info=["$(echo "$line" | cut -d'|' -f2)"]
checkuci $name && continue
fi
appver="$(cat $mbtmp/applist.txt | grep "^$name|" | cut -d'|' -f4)"
echo $name >> ${mbtmp}/applist_menu.txt
let i=$i+1
args="\t"
[ "$i" -ge 10 ] && head="$i. $name" || head="0$i. $name"
[ "${#head}" -lt 8 ] && args="\t\t"
[ "${#head}" -eq 16 ] && args=""
if [ "$1" = '0' ]; then
echo -e "$head$args`check_install $name` `check_update $name $appver`"
elif [ "$1" = '1' ]; then
echo -e "$head$info [\033[31m未安装\033[0m]"
fi
done < ${mbtmp}/applist_all.txt
rm -rf ${mbtmp}/applist_all.txt
if [ "$i" = '0' ]; then
[ "$1" = '0' ] && echo -e "[未安装任何插件!]" || echo -e "[已经没有插件可安装了哦!]"
fi
echo
}
wait_back() {
echo
#echo "$1秒后返回..."
#sleep $1
echo -n "按任意键返回."
read
}
select_app() {
read -p "请输入你的选择`echo -e $check_update_text`" select
if [ "$select" = 'u' ]; then
update
elif [ `echo $select | grep -c '^[0-9][0-9]*$'` -eq 1 ]; then
if [ "$select" -eq '0' ]; then
return 0
elif [ "$select" -gt '0' ] && [ "$select" -le "$(cat ${mbtmp}/applist_menu.txt | wc -l)" ]; then
appname=$(cat ${mbtmp}/applist_menu.txt | sed -n "$select"p)
if [ ! -z "${appname}" ]; then
if ! checkuci ${appname}; then
read -p "确定要安装${appname}插件?[1/0] " install
[ "$install" = '1' ] && ${mbroot}/scripts/appmanage.sh install ${appname}
else
if [ -n "$(check_update ${appname})" ]; then
read -p "是否要更新${appname}插件?[1/0] " update
[ "$update" == '1' ] && ${mbroot}/scripts/appmanage.sh upgrade ${appname}
fi
source "${mbroot}"/apps/${appname}/config/mixbox.conf
${appname}
${mbroot}/apps/${appname}/scripts/${appname}.sh status
fi
else
echo "输入有误,未找到该插件!"
fi
else
echo "输入有误,没有该序号!"
fi
else
echo "输入有误,请输入数字!"
fi
rm -rf ${mbtmp}/applist_menu.txt
wait_back && (title && menulist $1 && select_app $1)
}
auto_update() {
[ "$(mbdb get mixbox.main.autoupdate)" = '1' ] && local tmptext="已启用" || local tmptext="未启用"
read -p "【谨慎】是否要自动更新工具箱和插件($tmptext)[1/0] " res
checkread $res && mbdb set mixbox.main.autoupdate="$res"
}
manage_menu() {
echo "00. 返回主菜单"
echo "01. 更换工具箱下载源"
echo "02. 备份工具箱配置"
echo "03. 恢复工具箱配置"
echo "04. 自动更新工具箱和插件"
echo "05. 卸载插件"
echo "06. 卸载工具箱"
echo
read -p "请输入你的选择`echo -e $check_update_text`" select
case "$select" in
1|01) modify_source ;;
2|02) backup ;;
3|03) recover ;;
4|04) auto_update ;;
5|05) uninstall_app ;;
6|06) uninstall && exit ;;
u) update && exit ;;
0|00) return ;;
*) echo "输入有误,请重新输入!"
esac
wait_back && (title && manage_menu)
}
menu() {
while(true)
do
title
echo "00. 退出工具箱"
echo "01. 已安装插件"
echo "02. 未安装插件"
echo "03. 工具箱管理"
echo
echo -n "请输入你的选择`echo -e $check_update_text`"
read select
case "$select" in
00|0) exit 1 ;;
01|1) title && menulist 0 && select_app 0;;
02|2) title && menulist 1 && select_app 1;;
03|3) title && manage_menu ;;
u) update ;;
*) echo "输入有误,请重新输入!" && wait_back ;;
esac
echo
done
}
install() {
${mbroot}/scripts/appmanage.sh install $1
}
remove() {
${mbroot}/scripts/appmanage.sh uninstall $1
}
upgrade() {
${mbroot}/scripts/appmanage.sh upgrade $1
}
start() {
mbdb set $1.main.enable=1
/etc/mixbox/apps/$1/scripts/$1.sh start
}
restart() {
mbdb set $1.main.enable=1
/etc/mixbox/apps/$1/scripts/$1.sh restart
}
stop() {
mbdb set $1.main.enable=0
/etc/mixbox/apps/$1/scripts/$1.sh stop
}
help() {
cat << EOF
Usages: $0 {install|remove|upgrade|start|restart|stop|update|backup|recover|uninstall}
Options:
install appname Install App
remove appname Remove App
upgrade appname Upgrade App
start appname Start App
restart appname Restart App
stop appname Stop App
update Update Tool
backup Backup Tool
recover Recover Tool
uninstall Uninstall Tool
Example:
1. mixbox install shadowsocks
2. mixbox upgrade kms
3. mixbox update
EOF
}
#------------------【Tools】--------------------
if [ ! -z $param ]; then
[ -f ${mbroot}/apps/$param/config/mixbox.conf ] && source ${mbroot}/apps/$param/config/mixbox.conf
shift 1
$param $@
else
echo "获取工具箱插件列表..."
applist update &
get_status
menu
fi

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@@ -0,0 +1,7 @@
service="MIXBOX"
appname="mixbox"
needver=""
supports="linux_arm,linux_mips,linux_x86_64"
appinfo="一款支持多平台多架构的Shell工具箱"
newinfo="新增功能parse_str用于解析变量新增baseutils工具"
version="0.1.4"

View File

@@ -0,0 +1,11 @@
source /etc/mixbox/bin/base
appname="tools"
uciname="profile"
profilepath="${mbroot}/bin${profilepath}:$PATH"
[ -z "${LD_LIBRARY_PATH}" ] && libpath="/usr/lib:/lib${libpath}" || libpath="${LD_LIBRARY_PATH}${libpath}"
export PATH="${profilepath}"
export LD_LIBRARY_PATH="${libpath}"
export TERM=xterm
alias ll="ls -l"

View File

@@ -0,0 +1,132 @@
#!/bin/sh
#copyright by monlor
source /etc/mixbox/bin/base
appname="$2"
[ -z "${appname}" ] && logsh "【Tools】" "请输入插件名!" && exit 1
get_app_byurl () {
logsh "【Tools】" "下载插件安装文件..."
wgetsh "${mbtmp}/${appname}.tar.gz" "$mburl/appstore/${appname}_${model}.tar.gz"
if [ $? -eq 1 ]; then
logsh "【Tools】" "文件下载失败!"
exit
fi
logsh "【Tools】" "解压安装文件..."
tar -zxvf ${mbtmp}/${appname}.tar.gz -C ${mbtmp} > /dev/null 2>&1
if [ $? -ne 0 ]; then
logsh "【Tools】" "文件解压失败!"
exit
fi
logsh "【Tools】" "赋予可执行文件..."
chmod +x -R ${mbtmp}/${appname}/
}
install () {
logsh "【Tools】" "开始安装【${appname}】插件..."
get_app_byurl
# if [ "$model" = "armv7l" ]; then
# rm -rf ${mbtmp}/${appname}/bin/*_mips
# else
# rm -rf ${mbtmp}/${appname}/bin/*_armv7l
# fi
# ls ${mbtmp}/${appname}/bin/ 2> /dev/null | while read line; do
# [ -d ${mbtmp}/${appname}/bin/${line} ] && continue
# mv ${mbtmp}/${appname}/bin/${line} ${mbtmp}/${appname}/bin/"$(echo ${line} | sed -e 's/_.*//g')"
# done
# 开始判断
. ${mbtmp}/${appname}/config/${appname}.uci
if [ -n "$(echo $supports | grep "$model")" ]; then
logsh "【Tools】" "处理器架构符合安装要求"
else
logsh "【Tools】" "设备架构:$model,插件支持:$supports,无法安装!"
rm -rf ${mbtmp}/${appname}
rm -rf ${mbtmp}/${appname}.tar.gz
exit 1
fi
logsh "【Tools】" "检查工具箱版本..."
if [ "$(versioncmp $needver $mbver)" = '-1' ]; then
logsh "【Tools】" "工具箱版本过低!【${appname}】要求工具箱版本:$needver"
logsh "【Tools】" "插件【${appname}】安装失败!清理文件..."
rm -rf ${mbtmp}/${appname}
rm -rf ${mbtmp}/${appname}.tar.gz
exit 1
else
logsh "【Tools】" "工具箱版本[$mbver]满足安装要求"
fi
logsh "【Tools】" "检查插件的额外安装脚本..."
if [ -f ${mbtmp}/${appname}/scripts/install.sh ]; then
logsh "【Tools】" "运行插件安装脚本"
${mbtmp}/${appname}/scripts/install.sh
rm -rf ${mbtmp}/${appname}/scripts/install.sh
fi
logsh "【Tools】" "初始化uci配置信息..."
echo >> ${mbtmp}/${appname}/config/${appname}.uci # 防止最后一行读取不到
cat ${mbtmp}/${appname}/config/${appname}.uci | while read line; do
[ -z "$line" ] && continue
local ucikey="$(echo $line | cut -d'=' -f1)"
local ucivalue="$(echo $line | cut -d'=' -f2 | sed -e 's/\"//g')"
mbdb set $appname.main."$ucikey"="$ucivalue"
done
[ "$app_enabled" = '1' ] && mbdb set ${appname}.main.enable='1'
logsh "【Tools】" "添加插件到工具箱..."
sed -i "/^${appname}/d" ${mbroot}/config/applist.txt
echo "${appname}|${appinfo}" >> ${mbroot}/config/applist.txt
mkdir -p ${mbroot}/apps/${appname}
cp -rf ${mbtmp}/${appname}/ ${mbroot}/apps/
#清除临时文件
rm -rf ${mbtmp}/${appname}
rm -rf ${mbtmp}/${appname}.tar.gz
logsh "【Tools】" "插件安装完成!"
if [ -n "${newinfo}" ]; then
echo -e "-----------------------------------------"
echo -e "${newinfo}"
echo -e "-----------------------------------------"
fi
}
upgrade() {
logsh "【Tools】" "开始更新【${appname}】插件..."
!(checkuci ${appname}) && logsh "【Tools】" "插件【${appname}】未安装!" && exit 1
logsh "【Tools】" "先停止【${appname}】插件..."
app_enabled="$(mbdb get ${appname}.main.enable)"
mbdb set ${appname}.main.enable=0
${mbroot}/apps/${appname}/scripts/${appname}.sh stop
install ${appname}
}
uninstall() {
logsh "【Tools】" "开始卸载【${appname}】插件..."
!(checkuci ${appname}) && logsh "【Tools】" "插件【${appname}】未安装!" && exit 1
logsh "【Tools】" "先停止【${appname}】插件..."
${mbroot}/apps/${appname}/scripts/${appname}.sh stop &> /dev/null
#删除插件的配置
logsh "【Tools】" "清除插件uci配置信息"
mbdb clear ${appname}.*
# 清除插件列表中的插件信息
logsh "【Tools】" "从插件列表中移除..."
sed -i "/^${appname}/d" ${mbroot}/config/applist.txt
# 删除插件文件
logsh "【Tools】" "清除所有插件文件"
rm -rf ${mbroot}/apps/${appname} > /dev/null 2>&1
logsh "【Tools】" "插件【${appname}】卸载完成"
}
case "$1" in
install) install;;
upgrade) upgrade ;;
uninstall) uninstall ;;
*) echo "Usage: $0 {add|upgrade|del} appname"
esac

View File

@@ -0,0 +1,47 @@
#!/bin/sh
#copyright by monlor
source /etc/mixbox/bin/base
logsh "【Tools】" "工具箱初始化脚本启动..."
[ ! -d "${mbroot}" ] && logsh "【Tools】" "未找到工具箱文件!" && exit 1
# mount -o remount,rw /
result=`ps | grep {init.sh} | grep -v grep | wc -l`
if [ "$result" -gt '2' ]; then
logsh "【Tools】" "检测到初始化脚本已在运行"
exit
fi
logsh "【Tools】" "检查环境变量配置"
result=$(cat /etc/profile | grep -c mixbox/config)
if [ "$result" == 0 ]; then
echo "source ${mbroot}/config/profile" >> /etc/profile
fi
logsh "【Tools】" "检查定时任务配置"
cru a monitor "*/3 * * * * ${mbroot}/scripts/monitor.sh"
logsh "【Tools】" "检查工具箱开机启动配置"
result=$(cat /etc/firewall.user 2> /dev/null | grep init.sh | wc -l)
if [ "$result" == '0' ]; then
echo "${mbroot}/scripts/init.sh" >> /etc/firewall.user
fi
logsh "【Tools】" "执行工具箱监控脚本"
${mbroot}/scripts/monitor.sh
logsh "【Tools】" "防火墙重启插件检查"
mbdb show mixbox.firewall | while read line; do
reload="$(echo $line | cut -d'=' -f2)"
if [ "$reload" = '1' ]; then
appname="$(echo $line | cut -d'=' -f1)"
${mbroot}/apps/${appname}/scripts/${appname}.sh reload
fi
done
# logsh "【Tools】" "启动工具箱监测程序..."
# [ -z "$(pssh | grep ${mbroot}/bin/monitor)" ] && daemon ${mbroot}/bin/monitor
logsh "【Tools】" "运行用户自定义脚本"
${mbroot}/scripts/userscript.sh

View File

@@ -0,0 +1,72 @@
#!/bin/sh
#copyright by monlor
source /etc/mixbox/bin/base
detect_apps() {
applist installed -n| while read line
do
${mbroot}/apps/${line}/scripts/${line}.sh status
result1="$(mbdb get ${line}.main.enable)"
result2="$(mbdb get ${line}.main.status | cut -d'|' -f2)"
if [ "$result1" = '1' ] && [ "$result2" = '0' ]; then
${mbroot}/apps/${line}/scripts/${line}.sh restart
fi
done
}
detect_update() {
if [ "$(mbdb get mixbox.main.autoupdate)" = '1' ]; then
mixbox get_version 1> /dev/null
toolsver="$(applist mixbox -v)"
if [ -z "$toolsver" ]; then
logsh "【Tools】" "未获取到工具箱版本信息!"
else
if [ "$(versioncmp $mbver $toolsver)" = '1' ]; then
logsh "【Tools】" "检测到工具箱有更新!即将更新..." && sleep 2
mixbox update
fi
fi
applist installed -n | while read line; do
[ "$(mbdb get ${line}.main.enable)" = '0' ] && continue
appver_online="$(cat ${mbtmp}/versions.txt | grep "${line}" | cutsh 2)"
appver_local="$(mbdb get mixbox.${line}.version)"
[ -z "$appver_local" -o -z "$appver_online" ] && logsh "【Tools】" "未获取插件${line}的版本信息!" && continue
if [ "$(versioncmp $appver_local $appver_online)" = '1' ]; then
logsh "【Tools】" "检测到插件${line}有更新!即将更新..." && sleep 2
${mbroot}/scripts/appmanage.sh upgrade ${line}
${mbroot}/apps/${line}/scripts/${line}.sh restart
fi
done
fi
}
detect_others() {
if [ -f "$mbdisk/uninstall_mixbox" ]; then
logsh "【Tools】" "检测到工具箱出现问题,正在备份并卸载工具箱..."
mixbox backup
cp /etc/mbbackup.tar.gz $mbdisk/mbbackup.tar.gz
mixbox uninstall || ${mbroot}/scripts/uninstall.sh
echo "工具箱已卸载并备份了工具箱配置到这里:$mbdisk/mbbackup.tar.gz" > $mbdisk/uninstall_tools.txt
rm -rf $mbdisk/uninstall
fi
if [ -f "$mbdisk/fix_dropbear" ]; then
logsh "【Tools】" "检测到ssh出现问题正在尝试修复..."
killall -9 dropbear
daemon ${mbroot}/apps/dropbear/bin/dropbear -p 3333 -d ${mbroot}/apps/dropbear/config/dropbear_dss_host_key -r ${mbroot}/apps/dropbear/config/dropbear_rsa_host_key
# echo -e "123456/n123456" | passwd root
echo "启动ssh服务器登录地址[ssh root@$lanip -p 3333]Have Fun!" > $mbdisk/fix_dropbear.txt
rm -rf $mbdisk/fix_dropbear
fi
}
if [ -z "$(pssh | grep -w ${mbroot}/bin/mixbox)" ]; then
applist update
detect_update
detect_apps
detect_others
fi

View File

@@ -0,0 +1,40 @@
#!/bin/sh
#copyright by monlor
[ -n "$(uci -q get monlor.tools)" ] && echo "工具箱版本过低,此卸载程序已不再支持,请执行[$(uci -q get monlor.tools.path)/scripts/uninstall.sh]卸载工具箱后重新安装新的版本!" && exit 1
source /etc/mixbox/bin/base
clear
logsh "【Tools】" "即将卸载工具箱,按任意键继续(Ctrl + C 退出)."
read answer
logsh "【Tools】" "正在卸载工具箱..."
logsh "【Tools】" "停止所有插件"
ls ${mbroot}/apps | while read line
do
result=$(mbdb get ${line}.main.enable)
if [ "$result" == '1' ]; then
mbdb set mixbox.${line}.enable='0'
${mbroot}/apps/${line}/scripts/${line}.sh stop
fi
done
logsh "【Tools】" "删除定时任务"
cru c
logsh "【Tools】" "删除所有工具箱配置信息"
result=$(cat /etc/profile | grep -c mixbox/config)
if [ "$result" != 0 ]; then
sed -i "/mixbox\/config/d" /etc/profile
fi
result=$(cat /etc/firewall.user | grep init.sh | wc -l) > /dev/null 2>&1
if [ "$result" != '0' ]; then
sed -i "/init.sh/d" /etc/firewall.user
fi
logsh "【Tools】" "See You!"
rm -rf ${mbroot} /etc/mixbox

View File

@@ -0,0 +1,54 @@
#!/bin/sh
#copyright by monlor
[ -n "$(uci -q get monlor.tools 2> /dev/null)" ] && echo "工具箱版本过低,此更新程序已不再支持,请执行[$(uci -q get monlor.tools.path)/scripts/uninstall.sh]卸载工具箱后重新安装新的版本!" && exit 1
source /etc/mixbox/bin/base
logsh "【Tools】" "正在更新工具箱程序... "
rm -rf ${mbtmp}/mixbox.tar.gz
rm -rf ${mbtmp}/mixbox
wgetsh "${mbtmp}/mixbox.tar.gz" "$mburl/appstore/mixbox_${model}.tar.gz" > /dev/null 2>&1
[ $? -ne 0 ] && logsh "【Tools】" "工具箱文件下载失败!" && exit
logsh "【Tools】" "解压工具箱文件"
tar -zxvf ${mbtmp}/mixbox.tar.gz -C ${mbtmp} > /dev/null 2>&1
[ $? -ne 0 ] && logsh "【Tools】" "文件解压失败!" && exit
logsh "【Tools】" "更新工具箱文件"
# 处理工具箱二进制文件
logsh "【Tools】" "初始化uci配置信息..."
echo >> ${mbtmp}/mixbox/config/mixbox.uci # 防止最后一行读取不到
source ${mbtmp}/mixbox/config/mixbox.uci
cat ${mbtmp}/mixbox/config/mixbox.uci | while read line; do
[ -z "$line" ] && continue
ucikey="$(echo $line | cut -d'=' -f1)"
ucivalue="$(echo $line | cut -d'=' -f2 | sed -e 's/\"//g')"
mbdb set mixbox.main."$ucikey"="$ucivalue"
done
rm -rf ${mbtmp}/mixbox/scripts/userscript.sh
cp -rf ${mbtmp}/mixbox/* ${mbroot}/
logsh "【Tools】" "赋予可执行权限"
chmod -R +x ${mbroot}/bin
chmod -R +x ${mbroot}/scripts
# 执行初始化脚本
# ${mbroot}/scripts/init.sh
if [ -z "$(mbdb get mixbox.main.model)" ]; then
model=$(uname -ms | tr ' ' '_' | tr '[A-Z]' '[a-z]')
[ -n "$(echo $model | grep -E "linux.*arm.*")" ] && model="linux_arm"
[ -n "$(echo $model | grep -E "linux.*mips.*")" ] && model="linux_mips"
mbdb set mixbox.main.model="$model"
fi
logsh "【Tools】" "工具箱更新完成!"
if [ -n "${newinfo}" ]; then
echo -e "-----------------------------------------"
echo -e "${newinfo}"
echo -e "-----------------------------------------"
fi
#删除临时文件
rm -rf ${mbtmp}/mixbox.tar.gz
rm -rf ${mbtmp}/mixbox

View File

@@ -0,0 +1,3 @@
#!/bin/sh
source /etc/mixbox/bin/base
#Start line