opentopd 1.2.0

This commit is contained in:
sirpdboy 2020-10-22 02:43:32 +08:00
parent 41caa9a1a0
commit 7eb6560792
19 changed files with 1224 additions and 37120 deletions

View File

@ -0,0 +1,237 @@
bind_host: 0.0.0.0
bind_port: 3000
users:
- name: admin
password: $2y$10$vHRcARdPCieYG3RXWomV5evDYN.Nj/edtwEkQgQJZcK6z7qTLaIc6
http_proxy: ""
language: zh-cn
rlimit_nofile: 0
debug_pprof: false
web_session_ttl: 720
dns:
bind_host: 0.0.0.0
port: 5553
statistics_interval: 1
querylog_enabled: true
querylog_file_enabled: true
querylog_interval: 1
querylog_size_memory: 1000
anonymize_client_ip: false
protection_enabled: true
blocking_mode: default
blocking_ipv4: ""
blocking_ipv6: ""
blocked_response_ttl: 60
parental_block_host: family-block.dns.adguard.com
safebrowsing_block_host: standard-block.dns.adguard.com
ratelimit: 0
ratelimit_whitelist: []
refuse_any: true
upstream_dns:
- tls://1dot1dot1dot1.cloudflare-dns.com
- tls://dns.google
- https://cloudflare-dns.com/dns-query
- https://1.0.0.1/dns-query
- https://dns.adgk.net:4433/dns-query
- https://esdns.kbsml.com/dns-query
- tcp://8.8.4.4
- 117.50.11.11
- 117.50.22.22
- 223.5.5.5
- 208.67.222.222
- 114.114.114.114
- 180.76.76.76
bootstrap_dns:
- 119.29.29.29
- 223.5.5.5
- 114.114.114.114
- 8.8.4.4:53
- 1.0.0.1:53
- 2620:fe::10
- 2620:fe::fe:10
all_servers: false
fastest_addr: false
allowed_clients: []
disallowed_clients: []
blocked_hosts: []
cache_size: 1194304
cache_ttl_min: 60
cache_ttl_max: 86400
bogus_nxdomain: []
aaaa_disabled: true
enable_dnssec: true
edns_client_subnet: true
filtering_enabled: true
filters_update_interval: 24
parental_enabled: false
safesearch_enabled: false
safebrowsing_enabled: false
safebrowsing_cache_size: 1048576
safesearch_cache_size: 1048576
parental_cache_size: 1048576
cache_time: 30
rewrites: []
blocked_services: []
tls:
enabled: false
server_name: ""
force_https: false
port_https: 443
port_dns_over_tls: 853
allow_unencrypted_doh: false
strict_sni_check: false
certificate_chain: ""
private_key: ""
certificate_path: ""
private_key_path: ""
filters:
- enabled: true
url: https://adaway.org/hosts.txt
name: Adaway HOST
id: 139789111
- enabled: true
url: https://raw.githubusercontent.com/neodevpro/neodevhost/master/adblocker
name: NEO DEV HOST
id: 139789112
- enabled: true
url: https://banbendalao.coding.net/p/adgk/d/ADgk/git/raw/master/ADgk.txt
name: adgk手机去广告规则
id: 139789121
- enabled: true
url: https://cdn.jsdelivr.net/gh/privacy-protection-tools/anti-AD@master/anti-ad-easylist.txt
name: anti-AD命中率最高列表
id: 139789122
- enabled: true
url: https://gitee.com/halflife/list/raw/master/ad.txt
name: halflife合并乘风
id: 139789131
- enabled: true
url: https://easylist.to/easylist/easyprivacy.txt
name: EasyPrivacy隐私相关
id: 139789132
- enabled: true
url: https://www.i-dont-care-about-cookies.eu/abp/
name: I don't care about cookies隐私相关
id: 139789133
- enabled: true
url: https://gitee.com/cjx82630/cjxlist/raw/master/cjx-ublock.txt
name: CJX's uBlock list隐私相关
id: 139789141
- enabled: false
url: https://gitee.com/xinggsf/Adblock-Rule/raw/master/rule.txt
name: 乘风 广告过滤规则
id: 139789142
- enabled: false
url: https://gitee.com/xinggsf/Adblock-Rule/raw/master/mv.txt
name: 乘风 视频广告过滤规则
id: 139789143
- enabled: false
url: https://raw.githubusercontent.com/Goooler/1024_hosts/master/hosts
name: 1024host
id: 139789151
- enabled: false
url: https://pgl.yoyo.org/adservers/serverlist.php?hostformat=hosts&showintro=1&mimetype=plaintext
name: Peter Lowes Ad and tracking server list
id: 139789152
- enabled: false
url: https://easylist.to/easylist/fanboy-social.txt
name: Fanboy's Social Blocking List
id: 139789153
- enabled: false
url: https://easylist.to/easylist/fanboy-annoyance.txt
name: Fanboy's Annoyance List
id: 139789154
- enabled: false
url: https://secure.fanboy.co.nz/fanboy-cookiemonster.txt
name: EasyList Cookie List
id: 139789155
- enabled: false
url: https://fanboy.co.nz/fanboy-antifacebook.txt
name: Anti-Facebook List
id: 139789161
- enabled: false
url: https://filters.adtidy.org/extension/ublock/filters/14.txt
name: AdGuard Annoyances filter
id: 139789162
- enabled: false
url: https://www.malwaredomainlist.com/hostslist/hosts.txt
name: MalwareDomainList.com Hosts List
id: 139789163
- enabled: false
url: https://www.fanboy.co.nz/enhancedstats.txt
name: Fanboy's Enhanced Tracking List
id: 139789164
- enabled: false
url: https://filters.adtidy.org/extension/ublock/filters/3.txt
name: AdGuard Tracking Protection filter
id: 139789165
- enabled: false
url: https://easylist.to/easylist/easylist.txt
name: EasyList
id: 139789171
- enabled: false
url: https://filters.adtidy.org/extension/ublock/filters/11.txt
name: AdGuard Mobile Ads filter
id: 139789172
- enabled: false
url: https://filters.adtidy.org/extension/ublock/filters/2_without_easylist.txt
name: AdGuard Base filter
id: 139789173
- enabled: false
url: https://easylist-downloads.adblockplus.org/antiadblockfilters.txt
name: Adblock Warning Removal List
id: 139789174
- enabled: false
url: https://fanboy.co.nz/fanboy-problematic-sites.txt
name: Fanboy's problematic-sites
id: 139789175
- enabled: false
url: http://sub.adtchrome.com/adt-chinalist-easylist.txt
name: ChinaList+EasyList(修正)
id: 139789181
- enabled: false
url: https://raw.githubusercontent.com/adbyby/xwhyc-rules/master/lazy.txt
name: Adbyby Lazy Rule
id: 139789182
- enabled: false
url: https://raw.githubusercontent.com/VeleSila/yhosts/master/hosts.txt
name: hosts
id: 139789183
- enabled: false
url: https://gitlab.com/xuhaiyang1234/AAK-Cont/raw/master/FINAL_BUILD/aak-cont-list-notubo.txt
name: aak-cont-list-notubo
id: 139789184
whitelist_filters: []
user_rules:
- '@@||jd.com^important'
- '@@||flyme.cn^$important'
- '@@||meizu.com^$important'
- '@@||wl.jd.com^$important'
- '@@||flydigi.com^'
- '@@||pv.sohu.com^$important'
- /googleads.$~script,domain=~googleads.github.io
- /pagead/lvz?
- '||google.com/pagead/'
- '||static.doubleclick.net^$domain=youtube.com'
- '||youtube.com/get_midroll_'
- '@@||g.live.com^$important'
- '@@||s.click.taobao.com^$important'
- '@@||ipassport.ele.me^$important'
dhcp:
enabled: false
interface_name: ""
gateway_ip: ""
subnet_mask: ""
range_start: ""
range_end: ""
lease_duration: 86400
icmp_timeout_msec: 1000
clients: []
log_compress: false
log_localtime: false
log_max_backups: 0
log_max_size: 100
log_max_age: 3
log_file: ""
verbose: false
schema_version: 6

15
luci-app-dnspod/Makefile Normal file
View File

@ -0,0 +1,15 @@
#
#-- Copyright (C) 2019 dz <dingzhong110@gmail.com>
#
# This is free software, licensed under the Apache License, Version 2.0 .
#
include $(TOPDIR)/rules.mk
LUCI_TITLE:=LuCI Support for Auto DNS for dnspod
LUCI_DEPENDS:= +bash +curl
PKG_VERSION:=1.14
include $(TOPDIR)/feeds/luci/luci.mk
# call BuildPackage - OpenWrt buildroot signature

View File

@ -0,0 +1,14 @@
--[[
LuCI - Lua Configuration Interface
#
#-- Copyright (C) 2019 dz <dingzhong110@gmail.com>
#
# This is free software, licensed under the Apache License, Version 2.0 .
#
]]--
module("luci.controller.dnspod", package.seeall)
function index()
entry({"admin", "network", "dnspod"}, cbi("dnspod"), _("动态DNSPOD"), 59)
end

View File

@ -0,0 +1,135 @@
--[[
LuCI - Lua Configuration Interface
#
#-- Copyright (C) 2019 dz <dingzhong110@gmail.com>
#
# This is free software, licensed under the Apache License, Version 2.0 .
#
]]--
require("luci.sys")
if luci.sys.call("ps -w | grep ddnspod |grep -v grep >/dev/null") == 0 then
m = Map("dnspod", translate("动态DNSPOD"), "%s - %s" %{translate("DDNSPOD"), translate("<strong><font color=\"green\">Running</font></strong>")})
else
m = Map("dnspod", translate("动态DNSPOD"), "%s - %s" %{translate("DDNSPOD"), translate("<strong><font color=\"red\">Not Running</font></strong>")})
end
------------------------------------------------------------
s = m:section(TypedSection, "base_arg", translate("基本设置"))
s.addremove = false
s.anonymous = true
enable = s:option(Flag, "enabled", translate("Enable"), translate("Enable or disable server"))
enable.default = 0
enable.rmempty = false
o = s:option(Value,"time",translate("Inspection Time"),translate("域名检查间隔时间,单位秒"))
o.default = 600
o.rmempty=false
o = s:option(Button,"delete",translate("删除全部域名记录"))
o.inputstyle = "reset"
o.write = function()
luci.sys.call("cat /dev/null > /usr/share/dnspod/last.ip")
luci.http.redirect(luci.dispatcher.build_url("admin", "services", "dnspod"))
end
------------------------------------------------------------
s = m:section(TypedSection, "ip_last", translate("ip获取设置"))
s.addremove = false
s.anonymous = true
o = s:option(ListValue, "IPtype", translate("ip获取途径"))
o:value("1", translate("网络获取一"))
o:value("2", translate("网络获取二"))
o:value("3", translate("网络获取三"))
o:value("4", translate("网络获取四"))
o:value("5", translate("本地获取"))
o.default = 1
o = s:option(Value, "iface", translate("选择接口"))
o:value("wan", translate("WAN"))
o:value("lan", translate("LAN"))
o.default = "wan"
o:depends("IPtype", "5")
o = s:option(Value, "ipv6iface", translate("ipv6选择接口"))
o:value("wan", translate("WAN"))
o:value("lan", translate("LAN"))
o.default = "lan"
o:depends("IPtype", "5")
o = s:option(Value, "linenumber", translate("ipv6选择"))
o:value("1p", translate("第一行"))
o:value("2p", translate("第二行"))
o:value("3p", translate("第三行"))
o:value("4p", translate("第四行"))
o:value("5p", translate("第五行"))
o:value("6p", translate("第六行"))
o.default = "2p"
o:depends("IPtype", "5")
------------------------------------------------------------
s = m:section(TypedSection, "login_mode", translate("账号设置"))
s.addremove = false
s.anonymous = true
o = s:option(ListValue, "mode", translate("解析模式"))
o:value("login", translate("账号解析"))
o:value("token", translate("token解析"))
email = s:option(Value, "login_email", translate("登录邮箱"),"登录DNSPOD的用户名")
email:depends("mode", "login")
pass = s:option(Value, "login_password", translate("登录密码"),"登录DNSPOD的密码")
pass.password=true
pass:depends("mode", "login")
token = s:option(Value, "artoken", translate("ID,TOKEN"))
token:depends("mode", "token")
-----------------------------------------------------------
s = m:section(TypedSection, "domain_name", translate("域名"))
s.template = "cbi/tblsection"
s.anonymous = true
s.addremove = true
s.sortable = true
record_type = s:option(ListValue, "record_type", translate("记录类型"),"A,AAAA")
record_type:value("A", translate("A"))
record_type:value("AAAA", translate("AAAA"))
sub = s:option(Value, "sub_domain", translate("子域名"),"想要解析的子域名,例如:www")
main = s:option(Value, "main_domain", translate("主域名"),"想要解析的主域名,例如:baidu.com")
comment = s:option(Value, "comment", translate("Comment"))
-------------------------------------------------------
s=m:section(TypedSection,"base",translate("Update Log"))
s.anonymous=true
local a="/var/log/ddnspod.log"
tvlog=s:option(TextValue,"sylogtext")
tvlog.rows=16
tvlog.readonly="readonly"
tvlog.wrap="off"
function tvlog.cfgvalue(s,s)
sylogtext=""
if a and nixio.fs.access(a) then
sylogtext=luci.sys.exec("tail -n 100 %s"%a)
end
return sylogtext
end
tvlog.write=function(s,s,s)
end
local apply = luci.http.formvalue("cbi.apply")
if apply then
io.popen("/etc/init.d/dnspod restart &")
end
return m

View File

@ -0,0 +1,6 @@
msgid ""
msgstr "Content-Type: text/plain; charset=UTF-8\n"
msgid "Enable or disable server"
msgstr "启用或禁用服务"

View File

@ -0,0 +1,25 @@
config base_arg 'base_arg'
option enabled '0'
option time '600'
config domain_name
option record_type 'AAAA'
option sub_domain 'ipv6'
option main_domain '12345.xyz'
config domain_name
option record_type 'A'
option sub_domain 'www'
option main_domain '12345.xyz'
config ip_last
option ip_all '2'
option IPtype '1'
config login_mode
option mode 'token'
option artoken '12424,532453245345b2301e22bca69b1f06ef55'
config base

View File

@ -0,0 +1,70 @@
#!/bin/sh /etc/rc.common
START=80
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
logfile="/var/log/ddnspod.log"
uci_get_by_name() {
local ret=$(uci get dnspod.$1.$2 2>/dev/null)
echo ${ret:=$3}
}
start(){
enable=$(uci get dnspod.base_arg.enabled 2>/dev/null)
if [ $enable -eq 1 ]; then
sleeptime=$(uci get dnspod.base_arg.time 2>/dev/null)
icount=`ps -w | grep ddnspod.sh |grep -v grep| wc -l`
if [ $icount = 1 ] ;then
kill -9 $(ps | grep ddnspod.sh | grep -v "grep" | awk '{print $1}') >/dev/null 2>&1
cat /dev/null > /var/log/ddnspod.log
cat /dev/null > /var/log/ddnspod1.log
cat /dev/null > /usr/share/dnspod/dns.conf
fi
local login_email=$(uci get dnspod.@login_mode[0].login_email 2>/dev/null)
local login_password=$(uci get dnspod.@login_mode[0].login_password 2>/dev/null)
local artoken=$(uci get dnspod.@login_mode[0].artoken 2>/dev/null)
rm -f /usr/share/dnspod/dns.conf
cat >>/usr/share/dnspod/dns.conf <<EOF
# For security reasons, it is recommended that you use token-based auth instead
arMail="$login_email"
arPass="$login_password"
# Combine your token ID and token together as follows
arToken="$artoken"
# Place each domain you want to check as follows
# you can have multiple arDdnsCheck blocks
EOF
for arDdnsCheck in $(uci -X show dnspod | grep domain_name | awk -F'[.=]' '{print $2}'); do
local main_domain=$(uci_get_by_name $arDdnsCheck main_domain)
local sub_domain=$(uci_get_by_name $arDdnsCheck sub_domain)
local record_type=$(uci_get_by_name $arDdnsCheck record_type)
cat >>/usr/share/dnspod/dns.conf <<EOF
arDdnsCheck "$main_domain" "$sub_domain" "$record_type"
EOF
done
sleep 2
bash /usr/share/dnspod/ddnspod.sh >> /var/log/ddnspod1.log 2>&1 &
echo "$(date "+%Y-%m-%d %H:%M:%S") >>>>>>>>正在运行:检查更新DNS记录间隔时间为${sleeptime}秒<<<<<<<<" >> ${logfile}
#nohup /usr/share/dnspod/ddnspod.sh > /var/log/ddnspod.log 2>&1 &
fi
}
stop()
{
enable=$(uci get dnspod.base_arg.enabled 2>/dev/null)
if [ $enable -ne 1 ]; then
kill -9 $(ps | grep ddnspod.sh | grep -v "grep" | awk '{print $1}') >/dev/null 2>&1
kill $(ps -w | grep ddnspod |grep -v grep) >/dev/null 2>&1
cat /dev/null > /var/log/ddnspod1.log
cat /dev/null > /usr/share/dnspod/dns.conf
cat /dev/null > /var/log/ddnspod.log && echo "$(date "+%Y-%m-%d %H:%M:%S") >>>>>>>>停止运行:DNS记录以保存<<<<<<<<" >> ${logfile}
fi
}

View File

@ -0,0 +1,14 @@
#!/bin/sh
uci -q batch <<-EOF >/dev/null
delete ucitrack.@dnspod[-1]
add ucitrack dnspod
set ucitrack.@dnspod[-1].init=dnspod
commit ucitrack
EOF
/etc/init.d/dnspod stop
rm -f /tmp/luci-indexcache
exit 0

View File

@ -0,0 +1,357 @@
#!/bin/bash
#################################################
# AnripDdns v5.08
# Dynamic DNS using DNSPod API
# Original by anrip<mail@anrip.com>, http://www.anrip.com/ddnspod
# Edited by ProfFan
# Edited by dz
#################################################
enable=1
sleeptime=60
ip_mode=2
WanIp=""
LastIpFile=/usr/share/dnspod/last.ip
logfile="/var/log/ddnspod.log"
sleeptime=$(uci get dnspod.base_arg.time 2>/dev/null)
enable=$(uci get dnspod.base_arg.enabled 2>/dev/null)
IPtype=$(uci get dnspod.@ip_last[0].IPtype 2>/dev/null)
iface=$(uci get dnspod.@ip_last[0].iface 2>/dev/null)
ipv6iface=$(uci get dnspod.@ip_last[0].ipv6iface 2>/dev/null)
linenumber=$(uci get dnspod.@ip_last[0].linenumber 2>/dev/null)
clean_log(){
logrow=$(grep -c "" ${logfile})
if [ $logrow -ge 100 ];then
cat /dev/null > ${logfile}
echo "$(date "+%Y-%m-%d %H:%M:%S") Log条数超限清空处理" >> ${logfile}
fi
logrow1=$(grep -c "" ${logfile1})
if [ $logrow1 -ge 300 ];then
cat /dev/null > ${logfile1}
echo "Log条数超限清空处理" >> ${logfile1}
fi
}
while [ "$enable" = "1" ];
do
clean_log
function getPublicIp() {
record_type=$record_type
if [ $record_type = 'AAAA' ]; then
case $IPtype in
'1')
WanIp=`curl -6 -s 'https://api.myip.com' | grep ip |sed 's/.*ip":"\([^"]*\)".*/\1/g'`
echo $WanIp
;;
'2')
WanIp=`curl -6 -s 'http://ip-api.com/json/?fields=query' | grep query |sed 's/.*query":"\([^"]*\)".*/\1/g'`
echo $WanIp
;;
'3')
WanIp=`curl -6 -s 'https://ipapi.co/ip/'`
echo $WanIp
;;
'4')
WanIp=`curl -6 -s 'https://ifconfig.co'`
echo $WanIp
;;
'5')
WanIp=`ubus call network.interface.$ipv6iface status | grep '"address"' | grep -oE '([a-f0-9]{1,4}(:[a-f0-9]{1,4}){7}|[a-f0-9]{1,4}(:[a-f0-9]{1,4}){0,7}::[a-f0-9]{0,4}(:[a-f0-9]{1,4}){0,7})' |sed -n ''$linenumber''`
echo $WanIp
;;
'6')
WanIp=`curl -6 -s 'https://ip6.seeip.org'`
echo $WanIp
;;
esac
else
case $IPtype in
'1')
#WanIp=`curl -4 -s 'https://api.myip.com' | grep ip |sed 's/.*ip":"\([0-9]*\.[0-9]*\.[0-9]*\.[0-9]*\)".*/\1/g'`
WanIp=`curl -sL --connect-timeout 3 14.215.150.17:6666`
echo $WanIp
;;
'2')
#WanIp=`curl -4 -s 'http://ip-api.com/json/?fields=query' | grep query |sed 's/.*query":"\([0-9]*\.[0-9]*\.[0-9]*\.[0-9]*\)".*/\1/g'`
WanIp=`curl -sL --connect-timeout 3 members.3322.org/dyndns/getip`
echo $WanIp
;;
'3')
WanIp=`curl -4 -s 'https://ipapi.co/ip/'`
echo $WanIp
;;
'4')
WanIp=`curl -4 -s 'https://ifconfig.co'`
echo $WanIp
;;
'5')
WanIp=`ubus call network.interface.$iface status | grep '"address"' | grep -oE '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}'`
echo $WanIp
;;
'6')
WanIp=`curl -4 -s 'https://ip4.seeip.org'`
echo $WanIp
;;
esac
fi
}
# OS Detection
case $(uname) in
'Linux')
echo "Linux"
arIpAddress() {
# local extip
# extip=$(ip -o -4 addr list | grep -Ev '\s(docker|lo)' | awk '{print $4}' | cut -d/ -f1 | grep -Ev '(^127\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$)|(^10\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$)|(^172\.1[6-9]{1}[0-9]{0,1}\.[0-9]{1,3}\.[0-9]{1,3}$)|(^172\.2[0-9]{1}[0-9]{0,1}\.[0-9]{1,3}\.[0-9]{1,3}$)|(^172\.3[0-1]{1}[0-9]{0,1}\.[0-9]{1,3}\.[0-9]{1,3}$)|(^192\.168\.[0-9]{1,3}\.[0-9]{1,3}$)')
# if [ "x${extip}" = "x" ]; then
# extip=$(ip -o -4 addr list | grep -Ev '\s(docker|lo)' | awk '{print $4}' | cut -d/ -f1 )
# fi
# echo $extip
if [ "x${WanIp}" = "x" ]; then
WanIp=$(getPublicIp)
fi
if [ "x${WanIp}" = "x" ]; then
IPtype="1"
WanIp=$(getPublicIp)
fi
if [ "x${WanIp}" = "x" ]; then
IPtype="2"
WanIp=$(getPublicIp)
fi
if [ "x${WanIp}" = "x" ]; then
IPtype="3"
WanIp=$(getPublicIp)
fi
if [ "x${WanIp}" = "x" ]; then
IPtype="4"
WanIp=$(getPublicIp)
fi
if [ "x${WanIp}" = "x" ]; then
IPtype="6"
WanIp=$(getPublicIp)
fi
echo $WanIp
}
;;
'FreeBSD')
echo 'FreeBSD'
exit 100
;;
'WindowsNT')
echo "Windows"
exit 100
;;
'Darwin')
echo "Mac"
arIpAddress() {
ifconfig | grep "inet " | grep -v 127.0.0.1 | awk '{print $2}'
}
;;
'SunOS')
echo 'Solaris'
exit 100
;;
'AIX')
echo 'AIX'
exit 100
;;
*) ;;
esac
# Get script dir
# See: http://stackoverflow.com/a/29835459/4449544
rreadlink() ( # Execute the function in a *subshell* to localize variables and the effect of `cd`.
target=$1 fname= targetDir= CDPATH=
# Try to make the execution environment as predictable as possible:
# All commands below are invoked via `command`, so we must make sure that `command`
# itself is not redefined as an alias or shell function.
# (Note that command is too inconsistent across shells, so we don't use it.)
# `command` is a *builtin* in bash, dash, ksh, zsh, and some platforms do not even have
# an external utility version of it (e.g, Ubuntu).
# `command` bypasses aliases and shell functions and also finds builtins
# in bash, dash, and ksh. In zsh, option POSIX_BUILTINS must be turned on for that
# to happen.
{ \unalias command; \unset -f command; } >/dev/null 2>&1
[ -n "$ZSH_VERSION" ] && options[POSIX_BUILTINS]=on # make zsh find *builtins* with `command` too.
while :; do # Resolve potential symlinks until the ultimate target is found.
[ -L "$target" ] || [ -e "$target" ] || { command printf '%s\n' "ERROR: '$target' does not exist." >&2; return 1; }
command cd "$(command dirname -- "$target")" # Change to target dir; necessary for correct resolution of target path.
fname=$(command basename -- "$target") # Extract filename.
[ "$fname" = '/' ] && fname='' # !! curiously, `basename /` returns '/'
if [ -L "$fname" ]; then
# Extract [next] target path, which may be defined
# *relative* to the symlink's own directory.
# Note: We parse `ls -l` output to find the symlink target
# which is the only POSIX-compliant, albeit somewhat fragile, way.
target=$(command ls -l "$fname")
target=${target#* -> }
continue # Resolve [next] symlink target.
fi
break # Ultimate target reached.
done
targetDir=$(command pwd -P) # Get canonical dir. path
# Output the ultimate target's canonical path.
# Note that we manually resolve paths ending in /. and /.. to make sure we have a normalized path.
if [ "$fname" = '.' ]; then
command printf '%s\n' "${targetDir%/}"
elif [ "$fname" = '..' ]; then
# Caveat: something like /var/.. will resolve to /private (assuming /var@ -> /private/var), i.e. the '..' is applied
# AFTER canonicalization.
command printf '%s\n' "$(command dirname -- "${targetDir}")"
else
command printf '%s\n' "${targetDir%/}/$fname"
fi
)
DIR=$(dirname -- "$(rreadlink "$0")")
# Global Variables:
# Token-based Authentication
arToken=""
# Account-based Authentication
arMail=""
arPass=""
# Load config
#. $DIR/dns.conf
# Get Domain IP
# arg: domain
arNslookup() {
#wget --quiet --output-document=- $inter$1
if [ ! -f $LastIpFile ]; then
echo ""
return
fi
cat $LastIpFile | grep $1 | awk '{print $2}'
}
# Get data
# arg: type data
arApiPost() {
local inter="https://dnsapi.cn/${1:?'Info.Version'}"
if [ "x${arToken}" = "x" ]; then # undefine token
local param="login_email=${arMail}&login_password=${arPass}&format=json&${2}"
else
local param="login_token=${arToken}&format=json&${2}"
fi
curl -s -k -X POST $inter -d $param
}
# Update
# arg: main domain sub domain
arDdnsUpdate() {
local domainID recordID recordRS recordCD myIP
# Get domain ID
domainID=$(arApiPost "Domain.Info" "domain=${1}")
domainID=$(echo $domainID | sed 's/.*{"id":"\([0-9]*\)".*/\1/')
# Update IP
arIpAddress
myIP=$(arIpAddress)
if echo $myIP|grep -E "^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$">/dev/null; then
post_type="Record.Ddns"
record_types="A"
else
post_type="Record.Modify"
record_types="AAAA"
fi
# Get Record ID
recordID=$(arApiPost "Record.List" "domain_id=${domainID}&sub_domain=${2}&record_type=${record_types}&record_line=默认")
recordID=$(echo $recordID | sed 's/.*\[{"id":"\([0-9]*\)".*/\1/')
recordRS=$(arApiPost "$post_type" "domain_id=${domainID}&record_id=${recordID}&sub_domain=${2}&record_type=${record_types}&value=${myIP}&record_line=默认")
recordCD=$(echo $recordRS | sed 's/.*{"code":"\([0-9]*\)".*/\1/')
# Output IP
if [ "$recordCD" = "1" ]; then
echo $recordRS | sed 's/.*,"value":"\([^"]*\)".*/\1/'
return 1
fi
# Echo error message
echo $recordRS | sed 's/.*,"message":"\([^"]*\)".*/\1/'
}
# DDNS Check
# Arg: Main Sub
arDdnsCheck() {
record_type=${3}
#arIpAddress
local postRS
local hostIP=$(arIpAddress)
local lastIP=$(arNslookup "${3}-${2}.${1}")
echo "domain name: ${2}.${1}"
echo "hostIP: ${3} ${hostIP}"
echo "lastIP: ${3} ${lastIP}"
if [ "$lastIP" != "$hostIP" ]; then
echo "$(date "+%Y-%m-%d %H:%M:%S") 域名: ${2}.${1} 记录类型: ${3}" >> ${logfile}
echo "$(date "+%Y-%m-%d %H:%M:%S") 当前IP: ${hostIP}" >> ${logfile}
echo "$(date "+%Y-%m-%d %H:%M:%S") 记录IP: ${lastIP}" >> ${logfile}
echo "--- Update last.ip"
echo "$(date "+%Y-%m-%d %H:%M:%S") 更新域名记录" >> ${logfile}
if [ -f $LastIpFile ]
then
grep -v "${3}-${2}.${1}" $LastIpFile > $LastIpFile.bak
fi
echo "${3}-${2}.${1} ${hostIP}" >> $LastIpFile.bak
mv $LastIpFile.bak $LastIpFile
echo "--- Update dns zone"
echo "$(date "+%Y-%m-%d %H:%M:%S") 更新DNS日志" >> ${logfile}
postRS=$(arDdnsUpdate $1 $2)
echo "postRS: ${postRS}"
echo "$(date "+%Y-%m-%d %H:%M:%S") 输出记录: ${postRS}" >> ${logfile}
sleep 2
echo "$(date "+%Y-%m-%d %H:%M:%S") >>>>>>>>正在运行:检查更新DNS记录间隔时间为${sleeptime}秒<<<<<<<<" >> ${logfile}
if [ $? -ne 1 ]; then
return 0
fi
fi
return 1
}
# DDNS
#echo ${#domains[@]}
#for index in ${!domains[@]}; do
# echo "${domains[index]} ${subdomains[index]}"
# arDdnsCheck "${domains[index]}" "${subdomains[index]}"
#done
date
. $DIR/dns.conf
echo ""
echo ""
echo ""
echo "+++++++++++++++++++++++++++"
sleep ${sleeptime}
continue
done

View File

@ -0,0 +1,12 @@
# For security reasons, it is recommended that you use token-based auth instead
# arMail=""
# arPass=""
# Combine your token ID and token together as follows
arToken="6541626156242"
# Place each domain you want to check as follows
# you can have multiple arDdnsCheck blocks
arDdnsCheck "1" "11"
arDdnsCheck "2" "22"
arDdnsCheck "3" "33"

View File

@ -11,7 +11,7 @@ THEME_NAME:=opentopd
THEME_TITLE:=opentopd Theme THEME_TITLE:=opentopd Theme
PKG_NAME:=luci-theme-$(THEME_NAME) PKG_NAME:=luci-theme-$(THEME_NAME)
PKG_VERSION:=1.1.9 PKG_VERSION:=1.2.0
PKG_RELEASE:=20201007 PKG_RELEASE:=20201007
@ -19,4 +19,12 @@ include $(INCLUDE_DIR)/package.mk
include $(TOPDIR)/feeds/luci/luci.mk include $(TOPDIR)/feeds/luci/luci.mk
define Package/luci-theme-opentopd/postinst
#!/bin/sh
rm -Rf /var/luci-modulecache
rm -Rf /var/luci-indexcache
exit 0
endef
# call BuildPackage - OpenWrt buildroot signature # call BuildPackage - OpenWrt buildroot signature

View File

@ -48,8 +48,10 @@
-moz-osx-font-smoothing: grayscale; -moz-osx-font-smoothing: grayscale;
} }
.icon-expand_more:before {
content: "\e20b";
.icon-expand_more:before{
content: "\e20b";
} }
.icon-menu:before { .icon-menu:before {

View File

@ -177,6 +177,7 @@ hr {
border-color: #EEE; border-color: #EEE;
opacity: 0.1; opacity: 0.1;
} }
.main { .main {
top: 4rem; top: 4rem;
bottom: 0rem; bottom: 0rem;
@ -184,33 +185,36 @@ hr {
height: 100%; height: 100%;
height: calc(100% - 4rem); height: calc(100% - 4rem);
} }
.main > .loading {
.main>.loading { position: fixed;
position: fixed; z-index: 1000;
width: 100%; top: 0;
height: 100%; display: block;
z-index: 1000; width: 100%;
display: block; height: 100%;
background-color: rgba(239,195,145,1.00); pointer-events: none;
top: 0; background-color: #rgba(239,195,145,1.00);
} }
.main > .loading > span {
.main>.loading>span { font-family: monospace;
display: block; font-size: 2rem;
text-align: center; font-size-adjust: 0.35;
margin-top: 2rem; position: relative;
color: #888; top: 12.5%;
font-size: 1.2rem; display: block;
text-align: center;
color: #888;
} }
.main > .loading > span > .loading-img {
.main>.loading>span>.loading-img:before { position: relative;
content: "\e603"; top: 0.1rem;
} left: 0.05rem;
display: inline-block;
.main>.loading>span>.loading-img { width: 1.25rem;
animation: anim-rotate 2s infinite linear; height: 1.25rem;
margin-right: 0.2rem; margin-right: 1rem;
display: inline-block; animation: anim-rotate 2s infinite linear;
background: url(../icons/spinner.svg) no-repeat center;
} }
@keyframes anim-rotate { @keyframes anim-rotate {
@ -243,6 +247,7 @@ header {
header .container { header .container {
margin-top: .5rem; margin-top: .5rem;
padding: .5rem 1rem 0 1rem padding: .5rem 1rem 0 1rem
} }
header .container .pull-right>* { header .container .pull-right>* {
position: relative; position: relative;
@ -265,16 +270,19 @@ header .fill {
} }
header .fill .container { header .fill .container {
height: 3rem; height: 3rem;
padding: 0 1.25rem; padding: 0 1rem;
background: #333; background: #333;
background-color:#333; background-color:#333;
vertical-align:middle;
} }
header>.container>.brand, header > .fill > .container > .brand { header>.container>.brand, header > .fill > .container > .brand {
font-size: 1.3rem; font-size: 1.3rem;
color: #fff; color: #fff;
text-decoration: none; text-decoration: none;
font-weight: 600; font-weight: 600;
padding-left: 1rem; padding-left: 1rem;
cursor: default; cursor: default;
vertical-align: text-bottom; vertical-align: text-bottom;
display: none display: none
@ -283,6 +291,9 @@ header>.container>.brand, header > .fill > .container > .brand {
footer { footer {
text-align: right; text-align: right;
padding: 1rem; padding: 1rem;
overflow: hidden;
white-space: nowrap;
text-shadow: 0 0 2px #bbb;
color: #aaa; color: #aaa;
font-size: .8rem font-size: .8rem
} }
@ -534,6 +545,8 @@ background-color:#fff;
li { li {
list-style-type: none list-style-type: none
} }
.main .main-right { .main .main-right {
width: calc(100% - 15rem); width: calc(100% - 15rem);
float: right; float: right;
@ -579,37 +592,14 @@ li {
margin-top: 2rem; margin-top: 2rem;
text-decoration: inherit text-decoration: inherit
} }
.main .loading {
position: fixed; /* button style */
width: 100%; .btn,
height: 100%;
z-index: 2000;
display: flex;
align-items: center;
justify-content: center;
background-color: #F4BF8B;
top: 0
}
.main .loading span {
display: block;
text-align: center;
margin-top: 2rem;
color: #fe7a00;
font-size: 2rem
}
.main .loading span .loading-img {
animation: anim-rotate 2s infinite linear;
margin-right: .4rem;
display: inline-block
}
.main .loading span .loading-img::before {
content: "\e903"
}
.cbi-button { .cbi-button {
-webkit-appearance: none; -webkit-appearance: none;
text-transform: uppercase; text-transform: uppercase;
height: auto; height: auto;
color: rgba(0,0,0,0.87); color: #fe7a00;
background-color: #F0F0F0; background-color: #F0F0F0;
transition: all .2s ease-in-out; transition: all .2s ease-in-out;
display: inline-block; display: inline-block;
@ -630,10 +620,50 @@ li {
font-size: .875rem; font-size: .875rem;
width: auto !important; width: auto !important;
line-height: 1em line-height: 1em
} }
.cbi-button:hover, .cbi-button:focus, .cbi-button:active {
outline: 0; .cbi-button-up, .cbi-button-down {
text-decoration: none display: inline-block;
min-width: 0;
padding: .2rem .6rem;
font-size: 1.2rem;
color: #fe7a00 !important;
/*background: url(../icons/arrow.svg) no-repeat center;
background-size: 12px 20px;*/
content:"\e20b";
}
.cbi-button-up {
transform: scaleY(-1);
}
.cbi-button:not(select) {
-webkit-appearance: none !important;
}
.btn:hover,
.btn:focus,
.btn:active,
.cbi-button:hover,
.cbi-button:focus,
.cbi-button:active,
.item:hover::after,
.item:focus::after,
.item:active::after,
.cbi-page-actions .cbi-button-apply + .cbi-button-save:hover,
.cbi-page-actions .cbi-button-apply + .cbi-button-save:focus,
.cbi-page-actions .cbi-button-apply + .cbi-button-save:active {
text-decoration: none;
outline: 0;
}
button:hover,
.btn:hover,
.btn:focus,
.cbi-button:hover,
.cbi-button:focus,
.item:hover::after,
.item:focus::after {
opacity: 0.7;
top:0.15rem;
} }
.cbi-button:hover, .cbi-button:focus { .cbi-button:hover, .cbi-button:focus {
box-shadow: 0 0 2px rgba(0,0,0,0.12), 0 2px 2px rgba(0,0,0,0.2) box-shadow: 0 0 2px rgba(0,0,0,0.12), 0 2px 2px rgba(0,0,0,0.2)
@ -641,11 +671,12 @@ li {
.cbi-button:active { .cbi-button:active {
box-shadow: 0 10px 20px rgba(0,0,0,0.19), 0 6px 6px rgba(0,0,0,0.23) box-shadow: 0 10px 20px rgba(0,0,0,0.19), 0 6px 6px rgba(0,0,0,0.23)
} }
.btn:disabled,
.cbi-button:disabled { .cbi-button:disabled {
cursor: not-allowed; cursor: not-allowed;
pointer-events: none; pointer-events: none;
opacity: .6; opacity: 0.6;
box-shadow: none box-shadow: none;
} }
.cbi-button-check { .cbi-button-check {
margin-top: .25rem !important margin-top: .25rem !important
@ -692,7 +723,7 @@ form.inline+form.inline, .cbi-button+.cbi-button {
min-width: 15rem min-width: 15rem
} }
select { select {
min-width: 20rem; min-width: 15rem;
appearance: none; appearance: none;
-webkit-appearance: none; -webkit-appearance: none;
background-image: url('data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBzdGFuZGFsb25lPSJubyI/PjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+PHN2ZyB0PSIxNTY1MzQ4MDM3OTIyIiBjbGFzcz0iaWNvbiIgdmlld0JveD0iMCAwIDEwMjQgMTAyNCIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHAtaWQ9IjI1ODMiIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB3aWR0aD0iMjAwIiBoZWlnaHQ9IjIwMCI+PGRlZnM+PHN0eWxlIHR5cGU9InRleHQvY3NzIj4qIHsgdGV4dC1zaGFkb3c6IHRyYW5zcGFyZW50IDBweCAwcHggMHB4LCByZ2JhKDAsIDAsIDAsIDAuNSkgMHB4IDBweCAwcHggIWltcG9ydGFudDsgfQo8L3N0eWxlPjwvZGVmcz48cGF0aCBkPSJNMjAuNDggMjQ1Ljc2aDk4My4wNEw1MTIgNzc4LjI0eiIgcC1pZD0iMjU4NCIgZmlsbD0iIzcwNzA3MCI+PC9wYXRoPjwvc3ZnPg==') !important; background-image: url('data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBzdGFuZGFsb25lPSJubyI/PjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+PHN2ZyB0PSIxNTY1MzQ4MDM3OTIyIiBjbGFzcz0iaWNvbiIgdmlld0JveD0iMCAwIDEwMjQgMTAyNCIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHAtaWQ9IjI1ODMiIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB3aWR0aD0iMjAwIiBoZWlnaHQ9IjIwMCI+PGRlZnM+PHN0eWxlIHR5cGU9InRleHQvY3NzIj4qIHsgdGV4dC1zaGFkb3c6IHRyYW5zcGFyZW50IDBweCAwcHggMHB4LCByZ2JhKDAsIDAsIDAsIDAuNSkgMHB4IDBweCAwcHggIWltcG9ydGFudDsgfQo8L3N0eWxlPjwvZGVmcz48cGF0aCBkPSJNMjAuNDggMjQ1Ljc2aDk4My4wNEw1MTIgNzc4LjI0eiIgcC1pZD0iMjU4NCIgZmlsbD0iIzcwNzA3MCI+PC9wYXRoPjwvc3ZnPg==') !important;
@ -918,13 +949,7 @@ small {
white-space: normal; white-space: normal;
line-height: 1.42857143 line-height: 1.42857143
} }
.cbi-button-up, .cbi-button-down {
display: inline-block;
min-width: 0;
padding: .2rem .6rem;
font-size: 1.2rem;
color: #fe7a00 !important;
}
.cbi-optionals { .cbi-optionals {
padding: 1rem 1rem 0 1rem; padding: 1rem 1rem 0 1rem;
border-top: 1px solid #CCC border-top: 1px solid #CCC
@ -1072,14 +1097,16 @@ td>table>tbody>tr>td, .td>.table>.tbody>.tr>.td {
.cbi-section-table .cbi-section-table-titles .cbi-section-table-cell { .cbi-section-table .cbi-section-table-titles .cbi-section-table-cell {
width: auto !important; width: auto !important;
background-color: #e9ecef; /* background-color: #e9ecef; */
} }
.td.cbi-section-actions { .td.cbi-section-actions {
text-align: right; /* text-align: right; */
vertical-align: middle vertical-align: middle;
} }
.td.cbi-section-actions>* { .td.cbi-section-actions>* {
display: flex /* display: flex; */
} }
.td.cbi-section-actions>*>*, .td.cbi-section-actions>*>form>* { .td.cbi-section-actions>*>*, .td.cbi-section-actions>*>form>* {
flex: 1 1 4em; flex: 1 1 4em;
@ -1161,6 +1188,7 @@ td>table>tbody>tr>td, .td>.table>.tbody>.tr>.td {
display: none; display: none;
color: #fff; color: #fff;
font-size: 1.4rem font-size: 1.4rem
} }
.darkMask { .darkMask {
width: 100%; width: 100%;
@ -1189,19 +1217,22 @@ body.lang_pl.node-main-login .cbi-value-title {
width: 12rem width: 12rem
} }
/* fix Main Login*/
.node-main-login>.main>.main-right>header {
background: none !important;
box-shadow: none !important;
display: none;
}
/* fix Main Login */
.node-main-login .main .main-right header {
background: none !important;
box-shadow: none !important;
display: none !important;
}
.node-main-login>.main>.main-right>header>.fill>.container { .node-main-login>.main>.main-right>header>.fill>.container {
margin: 2rem auto; margin: 2rem auto;
max-width: 1140px; max-width: 1140px;
} }
.node-main-login>.main>.main-right>header>.fill>.container>.brand { .node-main-login>.main>.main-right>header>.fill>.container>.brand {
font-size: 2rem;
color: #fe7a00;
display: none; display: none;
} }
@ -1210,16 +1241,13 @@ body.lang_pl.node-main-login .cbi-value-title {
top: 0; top: 0;
height: 100% !important; height: 100% !important;
} }
.node-main-login>.main>.main-left { .node-main-login>.main>.main-left {
display: none; display: none;
} }
.node-main-login > .main > .main-right { .node-main-login > .main > .main-right {
width: 100%; width: 100%;
} }
.node-main-login .main .main-right .login-bg {
.node-main-login>.main>.main-right>.login-bg {
display: block; display: block;
position: fixed; position: fixed;
width: 100%; width: 100%;
@ -1268,7 +1296,10 @@ body.lang_pl.node-main-login .cbi-value-title {
margin-top: 2rem !important; margin-top: 2rem !important;
background-color: #D5CAB6 !important; background-color: #D5CAB6 !important;
border-radius: .375rem; border-radius: .375rem;
box-shadow: rgba(0,0,0,0.75) 0 0 35px -5px; /* text-align: left;
box-shadow: 0 2px 2px 0 rgba(0,0,0,0.14), 0 3px 1px -2px rgba(0,0,0,0.12), 0 1px 5px 0 rgba(0,0,0,0.2);
transition: box-shadow .25s, -webkit-box-shadow .25s;*/
box-shadow: rgba(0,0,0,0.75) 0 0 35px -5px;
background: transparent; background: transparent;
} }
@ -1415,7 +1446,7 @@ body.lang_pl.node-main-login .cbi-value-title {
line-height: 1; line-height: 1;
-webkit-font-smoothing: antialiased; -webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale; -moz-osx-font-smoothing: grayscale;
content: "\e901"; content: "\e910";
color: #adb5bd; color: #adb5bd;
font-size: 1.5rem; font-size: 1.5rem;
position: absolute; position: absolute;
@ -1563,19 +1594,7 @@ body.lang_pl.node-main-login .cbi-value-title {
.cbi-rowstyle-2 .cbi-button-up, .cbi-rowstyle-2 .cbi-button-down { .cbi-rowstyle-2 .cbi-button-up, .cbi-rowstyle-2 .cbi-button-down {
background-color: #FFF !important background-color: #FFF !important
} }
.cbi-button-up, .cbi-button-down, .cbi-value-helpicon, .showSide, .main>.loading>span {
font-family: 'advancedtomato' !important;
font-style: normal !important;
font-weight: normal !important;
font-variant: normal !important;
text-transform: none !important;
line-height: 1;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale
}
.cbi-button-up {
transform: rotate(180deg)
}
select { select {
padding: .36rem .8rem; padding: .36rem .8rem;
color: #555; color: #555;
@ -1587,7 +1606,7 @@ select, input {
font-size: .875rem; font-size: .875rem;
transition: all .15s ease-in-out; transition: all .15s ease-in-out;
line-height: 1.5; line-height: 1.5;
padding: .625rem .75rem; padding: .75rem;
color: #8898aa; color: #8898aa;
border: 1px solid #dee2e6; border: 1px solid #dee2e6;
border-radius: .25rem; border-radius: .25rem;
@ -1596,7 +1615,7 @@ select, input {
box-shadow: 0 3px 2px rgba(233,236,239,0.05); box-shadow: 0 3px 2px rgba(233,236,239,0.05);
outline: none; outline: none;
transition: box-shadow .15s ease; transition: box-shadow .15s ease;
margin: .25rem margin: 0;
} }
select:not([multiple="multiple"]):focus, input:focus { select:not([multiple="multiple"]):focus, input:focus {
border-color: #fe7a00; border-color: #fe7a00;
@ -2399,15 +2418,8 @@ div.cbi-value var, td.cbi-value-field var {
font-style: italic; font-style: italic;
color: #0069D6 color: #0069D6
} }
small {
font-size: 90%;
white-space: normal;
line-height: 1.42857143
}
.cbi-optionals {
padding: 1rem 1rem 0 1rem;
border-top: 1px solid #CCC
}
input[name="ping"], input[name="traceroute"], input[name="nslookup"] { input[name="ping"], input[name="traceroute"], input[name="nslookup"] {
width: 80% width: 80%
} }
@ -2636,19 +2648,14 @@ input[name="ping"], input[name="traceroute"], input[name="nslookup"] {
} }
@media screen and (max-width:1600px) { @media screen and (max-width:1600px) {
.cbi-value input[type="password"],
.cbi-value input[type="text"] { .main-left {
min-width: 25rem; width: calc(0% + 13rem);
} }
.cbi-value-field .cbi-input-select {
min-width: 25rem; .main-right {
width: calc(100% - 13rem);
} }
.main .main-left {
width: calc(0% + 13rem)
}
.main .main-right {
width: calc(100% - 13rem)
}
.cbi-button { .cbi-button {
font-size: .8rem font-size: .8rem
} }
@ -2677,22 +2684,18 @@ select {
} }
@media screen and (max-width:1280px) { @media screen and (max-width:1280px) {
.cbi-value input[type="password"],
.cbi-value input[type="text"] {
min-width: 22rem;
}
.cbi-value-field .cbi-input-select {
min-width: 22rem;
}
header>.container { header>.container {
margin-top: .25rem margin-top: .25rem
} }
.main .main-left { .main-left {
width: calc(0% + 13rem) width: calc(0% + 13rem);
} }
.main .main-right {
width: calc(100% - 13rem) .main-right {
} width: calc(100% - 13rem);
}
.cbi-tabmenu li a, .tabs li a { .cbi-tabmenu li a, .tabs li a {
padding: .2rem .5rem padding: .2rem .5rem
} }
@ -2700,7 +2703,8 @@ header>.container {
font-size: 1.1rem; font-size: 1.1rem;
padding-bottom: 1rem padding-bottom: 1rem
} }
table { .table,
table {
font-size: .7rem !important; font-size: .7rem !important;
width: 100% !important width: 100% !important
} }
@ -2712,33 +2716,7 @@ table {
} }
} }
@media screen and (min-width:600px) {
::-webkit-scrollbar {
width:10px;
height:10px
}
::-webkit-scrollbar, ::-webkit-scrollbar-corner {
background:transparent
}
::-webkit-scrollbar-thumb {
background:#9e9e9e
}
::-webkit-scrollbar-thumb:hover {
background:#757575
}
::-webkit-scrollbar-thumb:active {
background:#424242
}
}
@media screen and (max-width:992px) { @media screen and (max-width:992px) {
.cbi-value input[type="password"],
.cbi-value input[type="text"] {
min-width: 20rem;
}
.cbi-value-field .cbi-input-select {
min-width: 20rem;
}
.main .main-left { .main .main-left {
width: 0; width: 0;
position: fixed; position: fixed;
@ -2747,10 +2725,12 @@ background:#424242
.main .main-right { .main .main-right {
width: 100% width: 100%
} }
.showSide { .showSide {
padding: .1rem; padding: .5rem;
position: relative; position: relative;
display: inline-block display: inline-block
} }
.showSide:hover { .showSide:hover {
text-decoration: none text-decoration: none
@ -2759,14 +2739,17 @@ background:#424242
content: "\e90d"; content: "\e90d";
font-size: 1.8rem font-size: 1.8rem
} }
.node-main-login .showSide {
display: none !important;
}
header>.fill>.container>.brand { header>.fill>.container>.brand {
display: inline-block display: inline-block
} }
.cbi-value-title { .cbi-value-title {
width: 9rem; width: 9rem;
padding-right: 1rem padding-right: 1rem
} }
.node-network-diagnostics>.main .cbi-map fieldset>div * { .node-network-diagnostics>.main .cbi-map fieldset>div * {
width: 100% !important width: 100% !important
@ -2783,31 +2766,31 @@ header>.fill>.container>.brand {
.node-network-diagnostics>.main .cbi-map fieldset>div { .node-network-diagnostics>.main .cbi-map fieldset>div {
width: 100% !important width: 100% !important
} }
.node-main-login>.main .cbi-value-title {
text-align: left;
}
#diag-rc-output>pre { #diag-rc-output>pre {
font-size: 1rem font-size: 1rem
} }
} }
@media screen and (max-width:480px) { @media screen and (max-width:480px) {
body { body {
font-size: .8rem font-size: .8rem
} }
div.cbi-section,
fieldset {
padding: 0;
margin: 1rem 0 0 0;
overflow-x: auto;
}
.pull-right { .pull-right {
float: right; float: right;
margin-top: 0rem !important margin-top: 0rem !important
} }
.cbi-value input[type="password"],
.cbi-value input[type="text"] {
min-width: 18rem;
}
.cbi-value-field .cbi-input-select {
min-width: 18rem;
}
fieldset {
padding: 0;
margin: 1rem 0 0 0
}
.tabs { .tabs {
margin: .5rem 0 margin: .5rem 0
} }
@ -2830,6 +2813,10 @@ h2 {
.main>.main-left>.nav>.slide>.slide-menu>li>a { .main>.main-left>.nav>.slide>.slide-menu>li>a {
font-size: .9rem font-size: .9rem
} }
/* .main>.main-left>.nav>.slide>.menu:before {
padding-top: 5px;
}
*/
.main>.main-left>.nav>.slide>.menu:after { .main>.main-left>.nav>.slide>.menu:after {
top: .9rem top: .9rem
} }
@ -2848,30 +2835,97 @@ h2 {
text-align: left; text-align: left;
padding: 0 .25rem padding: 0 .25rem
} }
.cbi-value input[type="password"], .cbi-value input[type="text"] {
min-width: 15rem .cbi-value input[type="password"],
} .cbi-value input[type="text"] {
select { min-width: 15rem;
width: 15rem;
min-width: auto
}
.cbi-value>.cbi-value-field {
display: inline-block
}
.cbi-value-field,
.cbi-value-description {
width: 95%;
} }
.cbi-value-field .cbi-input-select {
min-width: 15rem;
}
/*
.cbi-value-field .cbi-input-select { .cbi-value-field .cbi-input-select {
width: 95%; width: 95%;
min-width: unset; min-width: unset;
} }
*/
.cbi-value-field,
.cbi-value-description {
width: 95%;
}
select,
input {
width: 95%;
min-width: unset;
}
.cbi-value>.cbi-value-field {
display: inline-block;
}
.cbi-value-field .cbi-input-textarea { .cbi-value-field .cbi-input-textarea {
width: 95% !important; width: 95% !important;
min-width: unset; min-width: unset;
} }
.node-main-login {
width: 18rem;
padding-left: 0rem;
}
.cbi-tabmenu>li,
.tabs>li {
padding: 0.6rem 0rem;
}
.cbi-tabmenu>li>a,
.tabs>li>a {
padding: 0.2rem 0.3rem;
font-size: 0.9rem;
}
.cbi-page-actions>div>input {
display: none;
}
.node-main-login>.main .container {
padding: 0.5rem 1rem 2rem 1rem;
margin: 0 auto !important;
}
.node-main-login>.main form>div:nth-last-child(1) {
margin-top: 0rem;
}
.node-main-login>.main .cbi-value-title {
width: 100% !important;
margin-top: 0rem;
font-size: 1rem;
margin-bottom: 0;
padding: 0 0.5rem;
}
.node-main-login>.main fieldset {
margin: 0;
padding: 0.5rem;
}
.node-main-login .alert-message.warning {
width: calc(100% - 2rem);
padding: 1rem 1rem;
font-size: 12px;
}
h2 {
font-size: 1.5rem;
}
.node-main-login>.main .container h2 {
margin: -70px auto 15px auto;
}
.cbi-value-field .cbi-input-checkbox, .cbi-value-field .cbi-input-radio { .cbi-value-field .cbi-input-checkbox, .cbi-value-field .cbi-input-radio {
margin: 0 .25rem 0 .25rem; margin: 0 .25rem 0 .25rem;
height: 1rem; height: 1rem;
@ -2887,12 +2941,19 @@ height:0px
.tabs>li>a { .tabs>li>a {
font-size: .9rem font-size: .9rem
} }
select, input { select,
font-size: .9rem input {
} font-size: 0.9rem;
}
.mobile-hide { .mobile-hide {
display: none display: none
} }
.panel-title {
font-size: 1.4rem;
padding-bottom: 1rem;
}
.node-status-realtime table>tbody>tr>td, .node-status-realtime table>tfoot>tr>td, .node-status-realtime table>thead>tr>td { .node-status-realtime table>tbody>tr>td, .node-status-realtime table>tfoot>tr>td, .node-status-realtime table>thead>tr>td {
font-size: .8125rem; font-size: .8125rem;
color: #525f7f; color: #525f7f;
@ -2953,3 +3014,61 @@ width:10rem !important
height: auto height: auto
} }
} }
@media screen and (min-width:600px) {
::-webkit-scrollbar {
width:10px;
height:10px
}
::-webkit-scrollbar, ::-webkit-scrollbar-corner {
background:transparent
}
::-webkit-scrollbar-thumb {
background:#9e9e9e
}
::-webkit-scrollbar-thumb:hover {
background:#757575
}
::-webkit-scrollbar-thumb:active {
background:#424242
}
}
@media screen and (min-width: 992px) {
.cbi-value input[type="password"],
.cbi-value input[type="text"] {
min-width: 18rem;
}
.cbi-value-field .cbi-input-select {
min-width: 18rem;
}
}
@media screen and (min-width: 1280px) {
.cbi-value input[type="password"],
.cbi-value input[type="text"] {
min-width: 22rem;
}
.cbi-value-field .cbi-input-select {
min-width: 22rem;
}
}
@media screen and (min-width: 1600px) {
.cbi-value input[type="password"],
.cbi-value input[type="text"] {
min-width: 25rem;
}
.cbi-value-field .cbi-input-select {
min-width: 25rem;
}
}

View File

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16"><path fill="#202124" d="m8,10.033663l-6.898535,-6.013274l-1.060688,0.972974l7.959223,6.986249l7.959223,-6.986249l-1.060688,-0.972974l-6.898535,6.013274z"/></svg>

After

Width:  |  Height:  |  Size: 221 B

View File

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16"><path fill="#888" d="M8,0c-4.355,0-7.898,3.481-7.998,7.812,0.092-3.779,2.966-6.812,6.498-6.812,3.59,0,6.5,3.134,6.5,7,0,0.828,0.672,1.5,1.5,1.5s1.5-0.672,1.5-1.5c0-4.418-3.582-8-8-8zM8,16c4.355,0,7.898-3.481,7.998-7.812-0.092,3.779-2.966,6.812-6.498,6.812-3.59,0-6.5-3.134-6.5-7,0-0.828-0.672-1.5-1.5-1.5s-1.5,0.672-1.5,1.5c0,4.418,3.582,8,8,8z"/></svg>

After

Width:  |  Height:  |  Size: 413 B

View File

@ -1,9 +1,7 @@
#!/bin/sh #!/bin/sh
if [ "$PKG_UPGRADE" != 1 ]; then
uci batch <<-EOF uci batch <<-EOF
set luci.themes.opentopd=/luci-static/opentopd set luci.themes.opentopd=/luci-static/opentopd
set luci.main.mediaurlbase=/luci-static/opentopd set luci.main.mediaurlbase=/luci-static/opentopd
commit luci commit luci
EOF EOF
fi
exit 0 exit 0

View File

@ -1,8 +1,18 @@
# #
# Copyright (c) 2018-2020 Nick Peng (pymumu@gmail.com) # Copyright (C) 2018-2020 Ruilin Peng (Nick) <pymumu@gmail.com>.
# This is free software, licensed under the GNU General Public License v3.
# #
# smartdns is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# smartdns is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
include $(TOPDIR)/rules.mk include $(TOPDIR)/rules.mk
PKG_NAME:=smartdns PKG_NAME:=smartdns
@ -21,7 +31,7 @@ PKG_BUILD_PARALLEL:=1
include $(INCLUDE_DIR)/package.mk include $(INCLUDE_DIR)/package.mk
MAKE_VARS += VER=$(PKG_VERSION) MAKE_VARS += VER=$(PKG_VERSION)
MAKE_PATH:=src MAKE_PATH:=src
define Package/smartdns define Package/smartdns
@ -34,7 +44,7 @@ endef
define Package/smartdns/description define Package/smartdns/description
SmartDNS is a local DNS server which accepts DNS query requests from local network clients, SmartDNS is a local DNS server which accepts DNS query requests from local network clients,
gets DNS query results from multiple upstream DNS servers concurrently, and returns the fastest IP to clients. get DNS query results from multiple upstream DNS servers concurrently, and returns the fastest IP to clients.
Unlike dnsmasq's all-servers, smartdns returns the fastest IP. Unlike dnsmasq's all-servers, smartdns returns the fastest IP.
endef endef
@ -42,7 +52,6 @@ define Package/smartdns/conffiles
/etc/config/smartdns /etc/config/smartdns
/etc/smartdns/address.conf /etc/smartdns/address.conf
/etc/smartdns/blacklist-ip.conf /etc/smartdns/blacklist-ip.conf
/etc/smartdns/anti-ad-smartdns.conf
/etc/smartdns/custom.conf /etc/smartdns/custom.conf
endef endef
@ -53,7 +62,6 @@ define Package/smartdns/install
$(INSTALL_CONF) $(PKG_BUILD_DIR)/package/openwrt/address.conf $(1)/etc/smartdns/address.conf $(INSTALL_CONF) $(PKG_BUILD_DIR)/package/openwrt/address.conf $(1)/etc/smartdns/address.conf
$(INSTALL_CONF) $(PKG_BUILD_DIR)/package/openwrt/blacklist-ip.conf $(1)/etc/smartdns/blacklist-ip.conf $(INSTALL_CONF) $(PKG_BUILD_DIR)/package/openwrt/blacklist-ip.conf $(1)/etc/smartdns/blacklist-ip.conf
$(INSTALL_CONF) $(CURDIR)/conf/custom.conf $(1)/etc/smartdns/custom.conf $(INSTALL_CONF) $(CURDIR)/conf/custom.conf $(1)/etc/smartdns/custom.conf
$(INSTALL_CONF) $(CURDIR)/conf/anti-ad-smartdns.conf $(1)/etc/smartdns/anti-ad-smartdns.conf
$(INSTALL_CONF) $(CURDIR)/conf/smartdns.conf $(1)/etc/config/smartdns $(INSTALL_CONF) $(CURDIR)/conf/smartdns.conf $(1)/etc/config/smartdns
endef endef

File diff suppressed because it is too large Load Diff

View File

@ -15,5 +15,3 @@ cache-size 10240
#bind: 6053 -group smartdns #bind: 6053 -group smartdns
#bind: 7053 -group world #bind: 7053 -group world
# 去广告文件,去掉#就可以使用自带去广告的文件了,也可以自己上传。
# conf-file /etc/smartdns/anti-ad-smartdns.conf