From 83f33178d0ef5688677de195975ee7de9f1ee4a5 Mon Sep 17 00:00:00 2001 From: CN_SZTL Date: Sat, 1 Feb 2020 02:36:42 +0800 Subject: [PATCH] Add CTCGFW's main code --- include/target.mk | 3 +- package/ctcgfw/ChinaDNS/Makefile | 54 + package/ctcgfw/GoQuiet/Makefile | 86 + .../ctcgfw/UnblockNeteaseMusic-Go/Makefile | 72 + .../UnblockNeteaseMusic-Go/cert/server.crt | 21 + .../UnblockNeteaseMusic-Go/cert/server.key | 27 + package/ctcgfw/baidupcs-web/Makefile | 82 + package/ctcgfw/bbr-bbrplus/Makefile | 46 + package/ctcgfw/bbr-bbrplus/src/Makefile | 1 + .../ctcgfw/bbr-bbrplus/src/tcp_bbr_bbrplus.c | 1171 + package/ctcgfw/bbr-mod/Makefile | 47 + package/ctcgfw/bbr-mod/src/Makefile | 1 + package/ctcgfw/bbr-mod/src/tcp_bbr_mod.c | 962 + package/ctcgfw/bbr-nanqinlang/Makefile | 47 + package/ctcgfw/bbr-nanqinlang/src/Makefile | 1 + .../bbr-nanqinlang/src/tcp_bbr_nanqinlang.c | 968 + package/ctcgfw/bbr-tsunami/Makefile | 46 + package/ctcgfw/bbr-tsunami/src/Makefile | 1 + .../ctcgfw/bbr-tsunami/src/tcp_bbr_tsunami.c | 905 + package/ctcgfw/cups-bjnp/Makefile | 48 + package/ctcgfw/cups/Makefile | 321 + package/ctcgfw/cups/files/cupsd.init | 19 + .../ctcgfw/cups/files/etc/cups/classes.conf | 7 + .../ctcgfw/cups/files/etc/cups/client.conf | 9 + package/ctcgfw/cups/files/etc/cups/cupsd.conf | 58 + .../ctcgfw/cups/files/etc/cups/printers.conf | 23 + package/ctcgfw/cups/patches/100-target.patch | 11 + package/ctcgfw/cups/patches/140-uname.patch | 11 + .../cups/patches/150-64bit_host_fix.patch | 33 + package/ctcgfw/cups/patches/160-ppdc.patch | 17 + package/ctcgfw/filebrowser/Makefile | 77 + package/ctcgfw/iptvhelper/Makefile | 50 + .../iptvhelper/files/etc/config/iptvhelper | 8 + .../iptvhelper/files/etc/firewall.iptvhelper | 2 + .../iptvhelper/files/etc/init.d/iptvhelper | 127 + .../iptvhelper/files/usr/sbin/iptvhelper.sh | 24 + package/ctcgfw/luci-app-adguardhome/Makefile | 75 + .../luasrc/controller/AdGuardHome.lua | 127 + .../luasrc/model/cbi/AdGuardHome/base.lua | 304 + .../luasrc/model/cbi/AdGuardHome/log.lua | 16 + .../luasrc/model/cbi/AdGuardHome/manual.lua | 97 + .../view/AdGuardHome/AdGuardHome_check.htm | 78 + .../view/AdGuardHome/AdGuardHome_chpass.htm | 49 + .../view/AdGuardHome/AdGuardHome_status.htm | 27 + .../luasrc/view/AdGuardHome/log.htm | 110 + .../luasrc/view/AdGuardHome/yamleditor.htm | 39 + .../po/zh-cn/AdGuardHome.po | 266 + .../root/etc/config/AdGuardHome | 11 + .../root/etc/init.d/AdGuardHome | 618 + .../root/etc/uci-defaults/40_luci-AdGuardHome | 12 + .../AdGuardHome/AdGuardHome_template.yaml | 109 + .../root/usr/share/AdGuardHome/addhost.sh | 33 + .../root/usr/share/AdGuardHome/firewall.start | 8 + .../root/usr/share/AdGuardHome/getsyslog.sh | 19 + .../root/usr/share/AdGuardHome/gfw2adg.sh | 86 + .../root/usr/share/AdGuardHome/links.txt | 3 + .../root/usr/share/AdGuardHome/tailto.sh | 4 + .../root/usr/share/AdGuardHome/update_core.sh | 231 + .../root/usr/share/AdGuardHome/waitnet.sh | 34 + .../root/usr/share/AdGuardHome/watchconfig.sh | 12 + .../codemirror/addon/fold/foldcode.js | 1 + .../codemirror/addon/fold/foldgutter.css | 1 + .../codemirror/addon/fold/foldgutter.js | 1 + .../codemirror/addon/fold/indent-fold.js | 1 + .../resources/codemirror/lib/codemirror.css | 1 + .../resources/codemirror/lib/codemirror.js | 1 + .../resources/codemirror/mode/yaml/yaml.js | 1 + .../resources/codemirror/theme/dracula.css | 1 + .../luci-static/resources/twin-bcrypt.min.js | 7 + package/ctcgfw/luci-app-airwhu/Makefile | 51 + .../files/root/bin/ipv6masq.sh | 41 + .../files/root/etc/config/airwhu | 25 + .../files/root/etc/hotplug.d/iface/99-ipv6nat | 56 + .../files/root/etc/init.d/mentohust | 49 + .../usr/lib/lua/luci/controller/airwhu.lua | 5 + .../usr/lib/lua/luci/model/cbi/airwhu.lua | 115 + .../ctcgfw/luci-app-airwhu/po/airwhu.zh-cn.po | 258 + .../luci-app-airwhu/tools/po2lmo/Makefile | 12 + .../luci-app-airwhu/tools/po2lmo/src/po2lmo | Bin 0 -> 18832 bytes .../luci-app-airwhu/tools/po2lmo/src/po2lmo.c | 247 + .../tools/po2lmo/src/template_lmo.c | 328 + .../tools/po2lmo/src/template_lmo.h | 92 + package/ctcgfw/luci-app-appfilter/Makefile | 15 + .../luasrc/controller/appfilter.lua | 96 + .../luasrc/model/cbi/appfilter/appfilter.lua | 87 + .../luasrc/view/admin_network/user_status.htm | 85 + .../ctcgfw/luci-app-appfilter/po/zh-cn/oaf.po | 48 + .../root/etc/uci-defaults/91_luci-oaf | 14 + .../ctcgfw/luci-app-autoipsetadder/Makefile | 64 + .../luasrc/controller/autoipsetadder.lua | 56 + .../luasrc/model/cbi/autoipsetadder.lua | 97 + .../luasrc/view/autoipsetadder/check.htm | 62 + .../luasrc/view/autoipsetadder/status.htm | 22 + .../root/etc/config/autoipsetadder | 2 + .../root/etc/init.d/autoipsetadder | 126 + .../etc/uci-defaults/40_luci-autoipsetadder | 11 + .../usr/bin/autoipsetadder/autoaddlist.sh | 164 + .../root/usr/bin/autoipsetadder/debugip.sh | 56 + .../root/usr/bin/autoipsetadder/tailto.sh | 4 + .../root/usr/bin/autoipsetadder/testip.sh | 182 + package/ctcgfw/luci-app-baidupcs-web/Makefile | 22 + .../luasrc/controller/baidupcs-web.lua | 17 + .../luasrc/model/cbi/baidupcs-web.lua | 48 + .../view/baidupcs-web/baidupcs-web_status.htm | 38 + .../root/etc/config/baidupcs-web | 2 + .../root/etc/init.d/baidupcs-web | 32 + .../root/etc/uci-defaults/luci-baidupcs-web | 11 + package/ctcgfw/luci-app-chinadns/Makefile | 85 + .../files/luci/controller/chinadns.lua | 21 + .../files/luci/i18n/chinadns.zh-cn.po | 41 + .../files/luci/model/cbi/chinadns.lua | 48 + .../luci/view/chinadns/chinadns_status.htm | 22 + .../files/root/etc/config/chinadns | 7 + .../files/root/etc/init.d/chinadns | 25 + .../files/root/etc/uci-defaults/luci-chinadns | 8 + .../luci-app-chinadns/tools/po2lmo/Makefile | 12 + .../tools/po2lmo/src/po2lmo.c | 247 + .../tools/po2lmo/src/template_lmo.c | 328 + .../tools/po2lmo/src/template_lmo.h | 92 + package/ctcgfw/luci-app-diskman/Makefile | 46 + package/ctcgfw/luci-app-diskman/depends.lst | 1 + .../luasrc/controller/diskman.lua | 136 + .../luasrc/model/cbi/diskman/disks.lua | 265 + .../luasrc/model/cbi/diskman/partition.lua | 332 + .../luci-app-diskman/luasrc/model/diskman.lua | 540 + .../view/diskman/cbi/disabled_button.htm | 7 + .../luasrc/view/diskman/cbi/inlinebutton.htm | 7 + .../luasrc/view/diskman/cbi/xnullsection.htm | 37 + .../luasrc/view/diskman/cbi/xsimpleform.htm | 88 + .../luasrc/view/diskman/disk_info_tab.htm | 143 + .../luasrc/view/diskman/partition_info.htm | 34 + .../luasrc/view/diskman/smart_detail.htm | 77 + .../ctcgfw/luci-app-diskman/po/pl/diskman.po | 128 + .../luci-app-diskman/po/zh-cn/diskman.po | 128 + package/ctcgfw/luci-app-dockerman/Makefile | 45 + .../luasrc/controller/dockerman.lua | 158 + .../luasrc/model/cbi/docker/container.lua | 487 + .../luasrc/model/cbi/docker/containers.lua | 203 + .../luasrc/model/cbi/docker/images.lua | 178 + .../luasrc/model/cbi/docker/networks.lua | 128 + .../luasrc/model/cbi/docker/newcontainer.lua | 504 + .../luasrc/model/cbi/docker/newnetwork.lua | 210 + .../luasrc/model/cbi/docker/overview.lua | 95 + .../luasrc/model/cbi/docker/volumes.lua | 121 + .../luasrc/model/docker.lua | 234 + .../luasrc/view/docker/apply_widget.htm | 144 + .../luasrc/view/docker/cbi/dummyvalue.htm | 13 + .../luasrc/view/docker/cbi/inlinebutton.htm | 7 + .../luasrc/view/docker/cbi/inlinevalue.htm | 33 + .../luasrc/view/docker/cbi/xdynlist.htm | 27 + .../luasrc/view/docker/cbi/xfvalue.htm | 10 + .../luasrc/view/docker/cbi/xsimpleform.htm | 89 + .../luasrc/view/docker/container.htm | 24 + .../luasrc/view/docker/logs.htm | 24 + .../luasrc/view/docker/overview.htm | 287 + .../luasrc/view/docker/resolv_container.htm | 23 + .../luasrc/view/docker/stats.htm | 60 + .../luci-app-dockerman/po/zh-cn/dockerman.po | 299 + .../luci-app-dockerman/root/etc/config/docker | 5 + package/ctcgfw/luci-app-filebrowser/Makefile | 21 + .../luasrc/controller/filebrowser.lua | 10 + .../luasrc/model/cbi/filebrowser.lua | 65 + .../root/etc/config/filebrowser | 10 + .../root/etc/init.d/filebrowser | 33 + .../root/etc/uci-defaults/luci-filebrowser | 11 + package/ctcgfw/luci-app-iptvhelper/Makefile | 19 + .../luasrc/controller/iptvhelper.lua | 14 + .../luasrc/model/cbi/iptvhelper.lua | 34 + .../po/templates/iptvhelper.pot | 49 + .../po/zh-cn/iptvhelper.po | 50 + .../root/etc/uci-defaults/40_iptvhelper | 12 + package/ctcgfw/luci-app-k3screenctrl/Makefile | 49 + .../files/luci/controller/k3screenctrl.lua | 10 + .../files/luci/i18n/k3screenctrl.zh-cn.lmo | Bin 0 -> 1444 bytes .../files/luci/i18n/k3screenctrl.zh-cn.po | 155 + .../files/luci/model/cbi/k3screenctrl.lua | 99 + package/ctcgfw/luci-app-koolproxyR/Makefile | 95 + .../ctcgfw/luci-app-koolproxyR/files/bin/arm | Bin 0 -> 473736 bytes .../ctcgfw/luci-app-koolproxyR/files/bin/i386 | Bin 0 -> 605688 bytes .../ctcgfw/luci-app-koolproxyR/files/bin/mips | Bin 0 -> 486696 bytes .../luci-app-koolproxyR/files/bin/mipsel | Bin 0 -> 490188 bytes .../luci-app-koolproxyR/files/bin/x86_64 | Bin 0 -> 620220 bytes .../files/etc/adblocklist/adblock | 0 .../files/etc/adblocklist/adblockip | 1 + .../files/etc/adblocklist/adbypass | 1 + .../files/etc/adblocklist/adbypassip | 0 .../files/etc/config/koolproxy | 17 + .../files/etc/init.d/koolproxy | 475 + .../files/etc/uci-defaults/luci-koolproxy | 17 + .../files/lib/upgrade/keep.d/koolproxy | 3 + .../usr/lib/lua/luci/controller/koolproxy.lua | 8 + .../usr/lib/lua/luci/i18n/koolproxy.zh-cn.lmo | Bin 0 -> 2508 bytes .../lua/luci/model/cbi/koolproxy/global.lua | 416 + .../lua/luci/model/cbi/koolproxy/rss_rule.lua | 36 + .../lib/lua/luci/view/koolproxy/cadvalue.htm | 8 + .../lib/lua/luci/view/koolproxy/caupload.htm | 5 + .../lib/lua/luci/view/koolproxy/dvalue.htm | 3 + .../usr/lib/lua/luci/view/koolproxy/index.htm | 16 + .../files/usr/sbin/adblockplus | 23 + .../files/usr/share/koolproxy/adblock.conf | 0 .../files/usr/share/koolproxy/camanagement | 66 + .../files/usr/share/koolproxy/data/gen_ca.sh | 29 + .../usr/share/koolproxy/data/openssl.cnf | 132 + .../koolproxy/data/rules/easylistchina.txt | 27813 ++++++ .../usr/share/koolproxy/data/rules/fanboy.txt | 21958 +++++ .../usr/share/koolproxy/data/rules/kp.dat | Bin 0 -> 37232 bytes .../usr/share/koolproxy/data/rules/user.txt | 49 + .../usr/share/koolproxy/data/rules/yhosts.txt | 16687 ++++ .../usr/share/koolproxy/data/source.list | 5 + .../files/usr/share/koolproxy/data/user.txt | 49 + .../files/usr/share/koolproxy/dnsmasq.adblock | 5102 ++ .../usr/share/koolproxy/koolproxy_ipset.conf | 6584 ++ .../files/usr/share/koolproxy/kpupdate | 152 + .../ctcgfw/luci-app-koolproxyR/koolproxy.txt | 194 + .../luci-app-koolproxyR/koolproxyupdate.sh | 13 + package/ctcgfw/luci-app-mentohust/Makefile | 53 + .../files/luci/controller/mentohust.lua | 16 + .../files/luci/i18n/mentohust.zh-cn.po | 152 + .../luci/model/cbi/mentohust/general.lua | 111 + .../files/luci/model/cbi/mentohust/log.lua | 23 + .../files/root/etc/config/mentohust | 1 + .../files/root/etc/init.d/mentohust | 85 + package/ctcgfw/luci-app-onliner/Makefile | 32 + .../luasrc/controller/onliner.lua | 17 + .../luasrc/view/onliner/display.htm | 921 + .../luasrc/view/onliner/onliner.htm | 99 + .../luci-app-onliner/po/zh-cn/onliner.po | 14 + .../root/usr/share/onliner/setnlbw.sh | 20 + package/ctcgfw/luci-app-openclash/Makefile | 156 + .../files/etc/config/openclash | 58 + .../files/etc/init.d/openclash | 946 + .../files/etc/openclash/ConnersHua.yaml | 1433 + .../etc/openclash/ConnersHua_return.yaml | 79 + .../files/etc/openclash/Country.mmdb | Bin 0 -> 4255911 bytes .../custom/openclash_custom_fake_black.conf | 89 + .../custom/openclash_custom_hosts.list | 6 + .../custom/openclash_custom_rules.list | 30 + .../files/etc/openclash/default.yaml | 182 + .../files/etc/openclash/game_rules.list | 140 + .../etc/openclash/game_rules/CS-GO.rules | 618 + .../game_rules/Monster-Hunter-World.rules | 295 + .../PUBG-Asia%26-Southeast-Asia.rules | 1759 + .../etc/openclash/game_rules/Steam.rules | 949 + .../files/etc/openclash/lhie1.yaml | 9765 ++ .../files/etc/openclash/openclash_version | 2 + .../usr/lib/lua/luci/controller/openclash.lua | 309 + .../lua/luci/model/cbi/openclash/client.lua | 112 + .../model/cbi/openclash/config-subscribe.lua | 126 + .../lua/luci/model/cbi/openclash/config.lua | 322 + .../model/cbi/openclash/game-settings.lua | 149 + .../model/cbi/openclash/groups-config.lua | 112 + .../lib/lua/luci/model/cbi/openclash/log.lua | 50 + .../cbi/openclash/proxy-provider-config.lua | 128 + .../model/cbi/openclash/servers-config.lua | 256 + .../lua/luci/model/cbi/openclash/servers.lua | 245 + .../lua/luci/model/cbi/openclash/settings.lua | 478 + .../files/usr/lib/lua/luci/openclash.lua | 244 + .../lib/lua/luci/view/openclash/developer.htm | 105 + .../view/openclash/download_game_rule.htm | 37 + .../lib/lua/luci/view/openclash/dvalue.htm | 13 + .../usr/lib/lua/luci/view/openclash/myip.htm | 357 + .../lua/luci/view/openclash/other_button.htm | 7 + .../usr/lib/lua/luci/view/openclash/ping.htm | 3 + .../lua/luci/view/openclash/server_list.htm | 32 + .../usr/lib/lua/luci/view/openclash/state.htm | 68 + .../lib/lua/luci/view/openclash/status.htm | 256 + .../lib/lua/luci/view/openclash/update.htm | 215 + .../lib/lua/luci/view/openclash/upload.htm | 11 + .../cfg_servers_address_fake_block.sh | 13 + .../share/openclash/cfg_unused_servers_del.sh | 23 + .../usr/share/openclash/clash_version.sh | 12 + .../files/usr/share/openclash/dashboard/CNAME | 1 + .../img/33343e6117c37aaef8886179007ba6b5.png | Bin 0 -> 6115 bytes .../usr/share/openclash/dashboard/index.html | 12 + .../js/1.bundle.0bddb85299f970595cb5.min.js | 2 + ...bundle.0bddb85299f970595cb5.min.js.LICENSE | 69 + .../js/bundle.0bddb85299f970595cb5.min.js | 1 + .../dashboard/main.0bddb85299f970595cb5.css | 27 + .../files/usr/share/openclash/openclash.sh | 188 + .../usr/share/openclash/openclash_core.sh | 54 + .../share/openclash/openclash_fake_block.sh | 40 + .../share/openclash/openclash_game_rule.sh | 41 + .../usr/share/openclash/openclash_ipdb.sh | 34 + .../usr/share/openclash/openclash_rule.sh | 50 + .../usr/share/openclash/openclash_update.sh | 59 + .../usr/share/openclash/openclash_version.sh | 20 + .../usr/share/openclash/openclash_watchdog.sh | 54 + .../openclash/yacd/8.788ab61adcbd1ce75d98.js | 2 + .../yacd/8.788ab61adcbd1ce75d98.js.LICENSE | 14 + .../files/usr/share/openclash/yacd/CNAME | 1 + .../yacd/app.02ba11cfe63c3d5e1e73.css | 28 + .../yacd/app.9f29cd9cb7f46e88a014.js | 2 + .../yacd/app.9f29cd9cb7f46e88a014.js.LICENSE | 71 + .../yacd/core-js~app.bee8eb27b94a9dc46ebe.js | 1 + .../files/usr/share/openclash/yacd/index.html | 42 + .../yacd/proxies.6cc15bdf1bc70c0d1a8d.js | 1 + .../yacd/proxies.d435411ad74e5f59ce94.css | 5 + .../yacd/react~app.0e7d4c38821c1ecfbf2f.js | 2 + .../react~app.0e7d4c38821c1ecfbf2f.js.LICENSE | 17 + .../usr/share/openclash/yacd/report.html | 67 + .../yacd/rules.32658050e64361773fc6.js | 1 + .../yacd/rules.f60a65ba29535b87ba96.css | 1 + .../yacd/runtime.ded9d303f4333455472b.js | 1 + .../vendors~chartjs.0775b8169f7ef69511b0.js | 2 + ...rs~chartjs.0775b8169f7ef69511b0.js.LICENSE | 6 + .../vendors~proxies.7b8f1dc3f02b17f47fdd.js | 2 + ...rs~proxies.7b8f1dc3f02b17f47fdd.js.LICENSE | 14 + .../usr/share/openclash/yacd/yacd-128.png | Bin 0 -> 7703 bytes .../usr/share/openclash/yacd/yacd-64.png | Bin 0 -> 3433 bytes .../files/usr/share/openclash/yacd/yacd.ico | Bin 0 -> 5430 bytes .../files/usr/share/openclash/yml_change.sh | 177 + .../usr/share/openclash/yml_groups_get.sh | 207 + .../usr/share/openclash/yml_groups_name_ch.sh | 41 + .../share/openclash/yml_groups_name_get.sh | 58 + .../usr/share/openclash/yml_groups_set.sh | 220 + .../usr/share/openclash/yml_proxys_get.sh | 588 + .../usr/share/openclash/yml_proxys_set.sh | 676 + .../usr/share/openclash/yml_rules_change.sh | 131 + .../i18n/zh-cn/openclash.zh-cn.po | 752 + .../luci-app-openclash/tools/po2lmo/Makefile | 12 + .../tools/po2lmo/src/po2lmo | Bin 0 -> 19272 bytes .../tools/po2lmo/src/po2lmo.c | 247 + .../tools/po2lmo/src/template_lmo.c | 328 + .../tools/po2lmo/src/template_lmo.h | 92 + package/ctcgfw/luci-app-rclone/Makefile | 23 + .../luasrc/controller/rclone.lua | 8 + .../luasrc/model/cbi/rclone.lua | 120 + .../ctcgfw/luci-app-rclone/po/en/rclone.po | 110 + .../luci-app-rclone/po/templates/rclone.pot | 97 + .../ctcgfw/luci-app-rclone/po/zh-cn/rclone.po | 111 + .../luci-app-rclone/root/etc/config/rclone | 14 + .../luci-app-rclone/root/etc/init.d/rclone | 92 + .../root/etc/uci-defaults/100_luci-rclone | 11 + package/ctcgfw/luci-app-serverchan/Makefile | 17 + .../luasrc/controller/serverchan.lua | 15 + .../luasrc/model/cbi/serverchan.lua | 250 + .../view/serverchan/serverchan_status.htm | 22 + .../root/etc/config/serverchan | 16 + .../root/etc/init.d/serverchan | 16 + .../root/usr/bin/serverchan/serverchan | 1019 + package/ctcgfw/luci-app-smartinfo/Makefile | 16 + .../luasrc/controller/smartinfo.lua | 132 + .../luasrc/model/cbi/smartinfo.lua | 84 + .../view/admin_status/index/smartinfo.htm | 1 + .../view/smartinfo/detail_begin_flag.htm | 10 + .../view/smartinfo/detail_begin_value.htm | 7 + .../view/smartinfo/detail_end_listvalue.htm | 20 + .../view/smartinfo/detail_end_value.htm | 9 + .../luasrc/view/smartinfo/smart_detail.htm | 82 + .../luasrc/view/smartinfo/smart_status.htm | 80 + .../luci-app-smartinfo/po/zh-cn/smartinfo.po | 116 + .../root/etc/config/smartinfo | 11 + .../root/etc/init.d/smartinfo | 15 + .../root/usr/lib/smartinfo/smart_checker.sh | 113 + .../root/usr/lib/smartinfo/smart_functions.sh | 56 + .../root/usr/lib/smartinfo/smart_status.sh | 17 + package/ctcgfw/luci-app-smstool/Makefile | 40 + .../files/usr/lib/lua/luci/controller/sms.lua | 10 + .../files/usr/lib/lua/luci/view/sms.htm | 14 + package/ctcgfw/luci-app-ssocks/Makefile | 21 + .../luasrc/controller/ssocks.lua | 23 + .../luasrc/model/cbi/ssocks.lua | 45 + .../luasrc/view/ssocks/ssocks_status.htm | 22 + .../ctcgfw/luci-app-ssocks/po/zh-cn/ssocks.po | 44 + .../luci-app-ssocks/root/etc/config/ssocks | 7 + .../root/etc/config/ssocks-authorization | 1 + .../luci-app-ssocks/root/etc/init.d/ssocks | 40 + .../root/etc/uci-defaults/ssocks | 17 + package/ctcgfw/luci-app-ssr-plus-Jo/Makefile | 169 + .../luasrc/controller/shadowsocksr.lua | 280 + .../model/cbi/shadowsocksr/advanced.lua | 255 + .../model/cbi/shadowsocksr/appointlist.lua | 23 + .../model/cbi/shadowsocksr/automatic.lua | 45 + .../model/cbi/shadowsocksr/client-config.lua | 444 + .../luasrc/model/cbi/shadowsocksr/client.lua | 176 + .../luasrc/model/cbi/shadowsocksr/control.lua | 100 + .../luasrc/model/cbi/shadowsocksr/list.lua | 24 + .../luasrc/model/cbi/shadowsocksr/log.lua | 16 + .../model/cbi/shadowsocksr/server-config.lua | 379 + .../luasrc/model/cbi/shadowsocksr/server.lua | 115 + .../luasrc/model/cbi/shadowsocksr/servers.lua | 80 + .../luasrc/model/cbi/shadowsocksr/status.lua | 369 + .../model/cbi/shadowsocksr/subscription.lua | 73 + .../luasrc/view/shadowsocksr/check.htm | 33 + .../luasrc/view/shadowsocksr/checkport.htm | 29 + .../luasrc/view/shadowsocksr/feedback.htm | 22 + .../luasrc/view/shadowsocksr/myip.htm | 340 + .../luasrc/view/shadowsocksr/ping.htm | 28 + .../luasrc/view/shadowsocksr/refresh.htm | 44 + .../luasrc/view/shadowsocksr/server_list.htm | 24 + .../luasrc/view/shadowsocksr/ssrurl.htm | 257 + .../luasrc/view/shadowsocksr/status.htm | 224 + .../luasrc/view/shadowsocksr/status2.htm | 213 + .../po/zh-cn/ssr-plus.zh-cn.lmo | Bin 0 -> 9152 bytes .../root/etc/china_ssr.txt | 8374 ++ .../root/etc/config/black.list | 5 + .../root/etc/config/gfw.list | 54 + .../root/etc/config/google_fu_mode | 1 + .../root/etc/config/shadowsocksr | 114 + .../root/etc/config/white.list | 2 + .../root/etc/dnsmasq.oversea/base_list.conf | 3 + .../etc/dnsmasq.oversea/oversea_list.conf | 192 + .../root/etc/dnsmasq.ssr/ad.conf | 5687 ++ .../root/etc/dnsmasq.ssr/appoint_list.conf | 143 + .../root/etc/dnsmasq.ssr/custom_forward.conf | 106 + .../root/etc/dnsmasq.ssr/gfw_base.conf | 5886 ++ .../root/etc/dnsmasq.ssr/gfw_list.conf | 10414 +++ .../root/etc/init.d/shadowsocksr | 1136 + .../root/etc/uci-defaults/luci-ssr-plus | 17 + .../luci-app-ssr-plus-Jo/root/usr/bin/ssr-ad | 6 + .../luci-app-ssr-plus-Jo/root/usr/bin/ssr-gfw | 32 + .../root/usr/bin/ssr-monitor | 277 + .../root/usr/bin/ssr-rules | 424 + .../root/usr/bin/ssr-switch | 175 + .../root/usr/share/shadowsocksr/chinaipset.sh | 6 + .../share/shadowsocksr/gentrojanconfig.lua | 37 + .../usr/share/shadowsocksr/genv2config.lua | 96 + .../shadowsocksr/genv2config_haproxy.lua | 95 + .../share/shadowsocksr/genv2config_local.lua | 107 + .../share/shadowsocksr/genv2config_server.lua | 65 + .../root/usr/share/shadowsocksr/gfw2ipset.sh | 11 + .../root/usr/share/shadowsocksr/subscribe.sh | 259 + .../root/usr/share/shadowsocksr/update.sh | 25 + .../usr/share/shadowsocksr/v2ray_update1.sh | 106 + .../luci-app-unblockneteasemusic-go/Makefile | 21 + .../controller/unblockneteasemusic-go.lua | 25 + .../model/cbi/unblockneteasemusic-go.lua | 51 + .../model/cbi/unblockneteasemusicgo_log.lua | 14 + .../unblockneteasemusic_go_status.htm | 22 + .../root/etc/config/unblockneteasemusic-go | 8 + .../root/etc/init.d/unblockneteasemusic-go | 118 + .../etc/ppp/ip-up.d/unblockneteasemusic-go | 4 + .../etc/uci-defaults/unblockneteasemusic-go | 17 + .../share/UnblockNeteaseMusic-Go/log_check.sh | 11 + .../Makefile | 21 + .../controller/unblockneteasemusic-mini.lua | 23 + .../model/cbi/unblockneteasemusic-mini.lua | 21 + .../unblockneteasemusic_mini_status.htm | 22 + .../root/etc/config/unblockneteasemusic-mini | 3 + .../root/etc/init.d/unblockneteasemusic-mini | 72 + .../etc/ppp/ip-up.d/unblockneteasemusic-mini | 4 + .../etc/uci-defaults/unblockneteasemusic-mini | 17 + .../luci-app-unblockneteasemusic/Makefile | 21 + .../luasrc/controller/unblockneteasemusic.lua | 56 + .../luasrc/model/cbi/unblockneteasemusic.lua | 124 + .../model/cbi/unblockneteasemusic_upcore.lua | 13 + .../model/cbi/unblockneteasemusiclog.lua | 14 + .../unblockneteasemusic_status.htm | 22 + .../view/unblockneteasemusic/update_core.htm | 36 + .../root/etc/config/unblockneteasemusic | 19 + .../root/etc/init.d/unblockneteasemusic | 174 + .../root/etc/ppp/ip-up.d/unblockneteasemusic | 4 + .../root/etc/uci-defaults/unblockneteasemusic | 17 + .../share/unblockneteasemusic/log_check.sh | 11 + .../share/unblockneteasemusic/update_core.sh | 64 + package/ctcgfw/luci-app-usb3disable/Makefile | 31 + .../luasrc/controller/usb3disable.lua | 6 + .../luasrc/model/cbi/usb3disable.lua | 45 + .../root/etc/config/usb3disable | 2 + package/ctcgfw/luci-app-vssr/Makefile | 105 + .../luci-app-vssr/luasrc/controller/vssr.lua | 384 + .../luasrc/model/cbi/vssr/advanced.lua | 107 + .../luasrc/model/cbi/vssr/client-config.lua | 382 + .../luasrc/model/cbi/vssr/client.lua | 96 + .../luasrc/model/cbi/vssr/control.lua | 88 + .../luasrc/model/cbi/vssr/list.lua | 23 + .../luasrc/model/cbi/vssr/log.lua | 15 + .../luasrc/model/cbi/vssr/server-config.lua | 95 + .../luasrc/model/cbi/vssr/server.lua | 114 + .../luasrc/model/cbi/vssr/servers.lua | 62 + .../luasrc/model/cbi/vssr/status.lua | 189 + .../luasrc/model/cbi/vssr/subscription.lua | 75 + .../luasrc/view/vssr/cell_valuefooter.htm | 1 + .../luasrc/view/vssr/cell_valueheader.htm | 1 + .../luci-app-vssr/luasrc/view/vssr/check.htm | 38 + .../luasrc/view/vssr/checkport.htm | 36 + .../luci-app-vssr/luasrc/view/vssr/ping.htm | 3 + .../luasrc/view/vssr/refresh.htm | 44 + .../luasrc/view/vssr/server_list.htm | 24 + .../luci-app-vssr/luasrc/view/vssr/ssrurl.htm | 270 + .../luci-app-vssr/luasrc/view/vssr/status.htm | 151 + .../luasrc/view/vssr/status2.htm | 100 + .../luasrc/view/vssr/tblsection.htm | 213 + .../luasrc/view/vssr/update_subscribe.htm | 124 + package/ctcgfw/luci-app-vssr/po/zh-cn/vssr.po | 618 + .../luci-app-vssr/root/etc/china_ssr.txt | 8296 ++ .../luci-app-vssr/root/etc/config/black.list | 0 .../luci-app-vssr/root/etc/config/gfw.list | 53 + .../root/etc/config/google_fu_mode | 1 + .../ctcgfw/luci-app-vssr/root/etc/config/vssr | 38 + .../luci-app-vssr/root/etc/config/white.list | 0 .../etc/dnsmasq.oversea/oversea_list.conf | 192 + .../root/etc/dnsmasq.ssr/ad.conf | 0 .../root/etc/dnsmasq.ssr/gfw_base.conf | 5880 ++ .../root/etc/dnsmasq.ssr/gfw_list.conf | 10414 +++ .../ctcgfw/luci-app-vssr/root/etc/init.d/vssr | 588 + .../root/etc/uci-defaults/luci-vssr | 18 + .../ctcgfw/luci-app-vssr/root/usr/bin/vssr-ad | 6 + .../luci-app-vssr/root/usr/bin/vssr-gfw | 31 + .../luci-app-vssr/root/usr/bin/vssr-monitor | 159 + .../root/usr/bin/vssr-qucikswitch | 120 + .../luci-app-vssr/root/usr/bin/vssr-rules | 387 + .../luci-app-vssr/root/usr/bin/vssr-switch | 183 + .../root/usr/share/vssr/GeoLite2-Country.mmdb | Bin 0 -> 3966905 bytes .../root/usr/share/vssr/chinaipset.sh | 5 + .../root/usr/share/vssr/genconfig_ss.lua | 61 + .../root/usr/share/vssr/genconfig_ssr.lua | 25 + .../root/usr/share/vssr/genconfig_v2ray.lua | 96 + .../root/usr/share/vssr/genconfig_v2ray_s.lua | 40 + .../root/usr/share/vssr/gentrojanconfig.lua | 37 + .../root/usr/share/vssr/genv2config.lua | 95 + .../root/usr/share/vssr/genv2config_local.lua | 107 + .../root/usr/share/vssr/getflag.sh | 39 + .../root/usr/share/vssr/getip.sh | 17 + .../root/usr/share/vssr/gfw2ipset.sh | 11 + .../root/usr/share/vssr/subscribe.sh | 269 + .../root/usr/share/vssr/update.sh | 26 + .../luci-static/vssr/css/flag-icon.min.css | 1 + .../root/www/luci-static/vssr/css/vssr.css | 704 + .../root/www/luci-static/vssr/emoji.js | 129 + .../luci-static/vssr/emoji/1f1e6-1f1e8.png | Bin 0 -> 884 bytes .../luci-static/vssr/emoji/1f1e6-1f1e9.png | Bin 0 -> 745 bytes .../luci-static/vssr/emoji/1f1e6-1f1ea.png | Bin 0 -> 574 bytes .../luci-static/vssr/emoji/1f1e6-1f1eb.png | Bin 0 -> 675 bytes .../luci-static/vssr/emoji/1f1e6-1f1ec.png | Bin 0 -> 635 bytes .../luci-static/vssr/emoji/1f1e6-1f1ee.png | Bin 0 -> 626 bytes .../luci-static/vssr/emoji/1f1e6-1f1f1.png | Bin 0 -> 466 bytes .../luci-static/vssr/emoji/1f1e6-1f1f2.png | Bin 0 -> 831 bytes .../luci-static/vssr/emoji/1f1e6-1f1f4.png | Bin 0 -> 521 bytes .../luci-static/vssr/emoji/1f1e6-1f1f6.png | Bin 0 -> 440 bytes .../luci-static/vssr/emoji/1f1e6-1f1f7.png | Bin 0 -> 533 bytes .../luci-static/vssr/emoji/1f1e6-1f1f8.png | Bin 0 -> 651 bytes .../luci-static/vssr/emoji/1f1e6-1f1f9.png | Bin 0 -> 547 bytes .../luci-static/vssr/emoji/1f1e6-1f1fa.png | Bin 0 -> 649 bytes .../luci-static/vssr/emoji/1f1e6-1f1fc.png | Bin 0 -> 513 bytes .../luci-static/vssr/emoji/1f1e6-1f1fd.png | Bin 0 -> 656 bytes .../luci-static/vssr/emoji/1f1e6-1f1ff.png | Bin 0 -> 870 bytes .../luci-static/vssr/emoji/1f1e7-1f1e6.png | Bin 0 -> 496 bytes .../luci-static/vssr/emoji/1f1e7-1f1e7.png | Bin 0 -> 488 bytes .../luci-static/vssr/emoji/1f1e7-1f1e9.png | Bin 0 -> 438 bytes .../luci-static/vssr/emoji/1f1e7-1f1ea.png | Bin 0 -> 478 bytes .../luci-static/vssr/emoji/1f1e7-1f1eb.png | Bin 0 -> 526 bytes .../luci-static/vssr/emoji/1f1e7-1f1ec.png | Bin 0 -> 616 bytes .../luci-static/vssr/emoji/1f1e7-1f1ed.png | Bin 0 -> 492 bytes .../luci-static/vssr/emoji/1f1e7-1f1ee.png | Bin 0 -> 655 bytes .../luci-static/vssr/emoji/1f1e7-1f1ef.png | Bin 0 -> 531 bytes .../luci-static/vssr/emoji/1f1e7-1f1f1.png | Bin 0 -> 557 bytes .../luci-static/vssr/emoji/1f1e7-1f1f2.png | Bin 0 -> 939 bytes .../luci-static/vssr/emoji/1f1e7-1f1f3.png | Bin 0 -> 957 bytes .../luci-static/vssr/emoji/1f1e7-1f1f4.png | Bin 0 -> 824 bytes .../luci-static/vssr/emoji/1f1e7-1f1f6.png | Bin 0 -> 578 bytes .../luci-static/vssr/emoji/1f1e7-1f1f7.png | Bin 0 -> 572 bytes .../luci-static/vssr/emoji/1f1e7-1f1f8.png | Bin 0 -> 597 bytes .../luci-static/vssr/emoji/1f1e7-1f1f9.png | Bin 0 -> 828 bytes .../luci-static/vssr/emoji/1f1e7-1f1fb.png | Bin 0 -> 908 bytes .../luci-static/vssr/emoji/1f1e7-1f1fc.png | Bin 0 -> 550 bytes .../luci-static/vssr/emoji/1f1e7-1f1fe.png | Bin 0 -> 520 bytes .../luci-static/vssr/emoji/1f1e7-1f1ff.png | Bin 0 -> 548 bytes .../luci-static/vssr/emoji/1f1e8-1f1e6.png | Bin 0 -> 532 bytes .../luci-static/vssr/emoji/1f1e8-1f1e8.png | Bin 0 -> 550 bytes .../luci-static/vssr/emoji/1f1e8-1f1e9.png | Bin 0 -> 937 bytes .../luci-static/vssr/emoji/1f1e8-1f1eb.png | Bin 0 -> 926 bytes .../luci-static/vssr/emoji/1f1e8-1f1ec.png | Bin 0 -> 611 bytes .../luci-static/vssr/emoji/1f1e8-1f1ed.png | Bin 0 -> 413 bytes .../luci-static/vssr/emoji/1f1e8-1f1ee.png | Bin 0 -> 471 bytes .../luci-static/vssr/emoji/1f1e8-1f1f0.png | Bin 0 -> 621 bytes .../luci-static/vssr/emoji/1f1e8-1f1f1.png | Bin 0 -> 594 bytes .../luci-static/vssr/emoji/1f1e8-1f1f2.png | Bin 0 -> 484 bytes .../luci-static/vssr/emoji/1f1e8-1f1f3.png | Bin 0 -> 446 bytes .../luci-static/vssr/emoji/1f1e8-1f1f4.png | Bin 0 -> 829 bytes .../luci-static/vssr/emoji/1f1e8-1f1f5.png | Bin 0 -> 462 bytes .../luci-static/vssr/emoji/1f1e8-1f1f7.png | Bin 0 -> 910 bytes .../luci-static/vssr/emoji/1f1e8-1f1fa.png | Bin 0 -> 661 bytes .../luci-static/vssr/emoji/1f1e8-1f1fb.png | Bin 0 -> 587 bytes .../luci-static/vssr/emoji/1f1e8-1f1fc.png | Bin 0 -> 562 bytes .../luci-static/vssr/emoji/1f1e8-1f1fd.png | Bin 0 -> 587 bytes .../luci-static/vssr/emoji/1f1e8-1f1fe.png | Bin 0 -> 471 bytes .../luci-static/vssr/emoji/1f1e8-1f1ff.png | Bin 0 -> 572 bytes .../luci-static/vssr/emoji/1f1e9-1f1ea.png | Bin 0 -> 722 bytes .../luci-static/vssr/emoji/1f1e9-1f1ec.png | Bin 0 -> 699 bytes .../luci-static/vssr/emoji/1f1e9-1f1ef.png | Bin 0 -> 599 bytes .../luci-static/vssr/emoji/1f1e9-1f1f0.png | Bin 0 -> 562 bytes .../luci-static/vssr/emoji/1f1e9-1f1f2.png | Bin 0 -> 673 bytes .../luci-static/vssr/emoji/1f1e9-1f1f4.png | Bin 0 -> 702 bytes .../luci-static/vssr/emoji/1f1e9-1f1ff.png | Bin 0 -> 607 bytes .../luci-static/vssr/emoji/1f1ea-1f1e6.png | Bin 0 -> 568 bytes .../luci-static/vssr/emoji/1f1ea-1f1e8.png | Bin 0 -> 860 bytes .../luci-static/vssr/emoji/1f1ea-1f1ea.png | Bin 0 -> 578 bytes .../luci-static/vssr/emoji/1f1ea-1f1ec.png | Bin 0 -> 842 bytes .../luci-static/vssr/emoji/1f1ea-1f1ed.png | Bin 0 -> 621 bytes .../luci-static/vssr/emoji/1f1ea-1f1f7.png | Bin 0 -> 648 bytes .../luci-static/vssr/emoji/1f1ea-1f1f8.png | Bin 0 -> 568 bytes .../luci-static/vssr/emoji/1f1ea-1f1f9.png | Bin 0 -> 875 bytes .../luci-static/vssr/emoji/1f1ea-1f1fa.png | Bin 0 -> 408 bytes .../luci-static/vssr/emoji/1f1eb-1f1ee.png | Bin 0 -> 553 bytes .../luci-static/vssr/emoji/1f1eb-1f1ef.png | Bin 0 -> 922 bytes .../luci-static/vssr/emoji/1f1eb-1f1f0.png | Bin 0 -> 665 bytes .../luci-static/vssr/emoji/1f1eb-1f1f2.png | Bin 0 -> 397 bytes .../luci-static/vssr/emoji/1f1eb-1f1f4.png | Bin 0 -> 658 bytes .../luci-static/vssr/emoji/1f1eb-1f1f7.png | Bin 0 -> 462 bytes .../luci-static/vssr/emoji/1f1ec-1f1e6.png | Bin 0 -> 637 bytes .../luci-static/vssr/emoji/1f1ec-1f1e7.png | Bin 0 -> 784 bytes .../luci-static/vssr/emoji/1f1ec-1f1e9.png | Bin 0 -> 636 bytes .../luci-static/vssr/emoji/1f1ec-1f1ea.png | Bin 0 -> 638 bytes .../luci-static/vssr/emoji/1f1ec-1f1eb.png | Bin 0 -> 515 bytes .../luci-static/vssr/emoji/1f1ec-1f1ec.png | Bin 0 -> 609 bytes .../luci-static/vssr/emoji/1f1ec-1f1ed.png | Bin 0 -> 646 bytes .../luci-static/vssr/emoji/1f1ec-1f1ee.png | Bin 0 -> 822 bytes .../luci-static/vssr/emoji/1f1ec-1f1f1.png | Bin 0 -> 571 bytes .../luci-static/vssr/emoji/1f1ec-1f1f2.png | Bin 0 -> 873 bytes .../luci-static/vssr/emoji/1f1ec-1f1f3.png | Bin 0 -> 437 bytes .../luci-static/vssr/emoji/1f1ec-1f1f5.png | Bin 0 -> 618 bytes .../luci-static/vssr/emoji/1f1ec-1f1f6.png | Bin 0 -> 673 bytes .../luci-static/vssr/emoji/1f1ec-1f1f7.png | Bin 0 -> 622 bytes .../luci-static/vssr/emoji/1f1ec-1f1f8.png | Bin 0 -> 890 bytes .../luci-static/vssr/emoji/1f1ec-1f1f9.png | Bin 0 -> 454 bytes .../luci-static/vssr/emoji/1f1ec-1f1fa.png | Bin 0 -> 450 bytes .../luci-static/vssr/emoji/1f1ec-1f1fc.png | Bin 0 -> 765 bytes .../luci-static/vssr/emoji/1f1ec-1f1fe.png | Bin 0 -> 654 bytes .../luci-static/vssr/emoji/1f1ed-1f1f0.png | Bin 0 -> 439 bytes .../luci-static/vssr/emoji/1f1ed-1f1f2.png | Bin 0 -> 649 bytes .../luci-static/vssr/emoji/1f1ed-1f1f3.png | Bin 0 -> 558 bytes .../luci-static/vssr/emoji/1f1ed-1f1f7.png | Bin 0 -> 891 bytes .../luci-static/vssr/emoji/1f1ed-1f1f9.png | Bin 0 -> 572 bytes .../luci-static/vssr/emoji/1f1ed-1f1fa.png | Bin 0 -> 629 bytes .../luci-static/vssr/emoji/1f1ee-1f1e8.png | Bin 0 -> 511 bytes .../luci-static/vssr/emoji/1f1ee-1f1e9.png | Bin 0 -> 508 bytes .../luci-static/vssr/emoji/1f1ee-1f1ea.png | Bin 0 -> 462 bytes .../luci-static/vssr/emoji/1f1ee-1f1f1.png | Bin 0 -> 620 bytes .../luci-static/vssr/emoji/1f1ee-1f1f2.png | Bin 0 -> 433 bytes .../luci-static/vssr/emoji/1f1ee-1f1f3.png | Bin 0 -> 833 bytes .../luci-static/vssr/emoji/1f1ee-1f1f4.png | Bin 0 -> 699 bytes .../luci-static/vssr/emoji/1f1ee-1f1f6.png | Bin 0 -> 642 bytes .../luci-static/vssr/emoji/1f1ee-1f1f7.png | Bin 0 -> 836 bytes .../luci-static/vssr/emoji/1f1ee-1f1f8.png | Bin 0 -> 669 bytes .../luci-static/vssr/emoji/1f1ee-1f1f9.png | Bin 0 -> 456 bytes .../luci-static/vssr/emoji/1f1ef-1f1ea.png | Bin 0 -> 643 bytes .../luci-static/vssr/emoji/1f1ef-1f1f2.png | Bin 0 -> 639 bytes .../luci-static/vssr/emoji/1f1ef-1f1f4.png | Bin 0 -> 858 bytes .../luci-static/vssr/emoji/1f1ef-1f1f5.png | Bin 0 -> 448 bytes .../luci-static/vssr/emoji/1f1f0-1f1ea.png | Bin 0 -> 890 bytes .../luci-static/vssr/emoji/1f1f0-1f1ec.png | Bin 0 -> 466 bytes .../luci-static/vssr/emoji/1f1f0-1f1ed.png | Bin 0 -> 816 bytes .../luci-static/vssr/emoji/1f1f0-1f1ee.png | Bin 0 -> 904 bytes .../luci-static/vssr/emoji/1f1f0-1f1f2.png | Bin 0 -> 899 bytes .../luci-static/vssr/emoji/1f1f0-1f1f3.png | Bin 0 -> 898 bytes .../luci-static/vssr/emoji/1f1f0-1f1f5.png | Bin 0 -> 601 bytes .../luci-static/vssr/emoji/1f1f0-1f1f7.png | Bin 0 -> 577 bytes .../luci-static/vssr/emoji/1f1f0-1f1fc.png | Bin 0 -> 620 bytes .../luci-static/vssr/emoji/1f1f0-1f1fe.png | Bin 0 -> 905 bytes .../luci-static/vssr/emoji/1f1f0-1f1ff.png | Bin 0 -> 527 bytes .../luci-static/vssr/emoji/1f1f1-1f1e6.png | Bin 0 -> 595 bytes .../luci-static/vssr/emoji/1f1f1-1f1e7.png | Bin 0 -> 620 bytes .../luci-static/vssr/emoji/1f1f1-1f1e8.png | Bin 0 -> 516 bytes .../luci-static/vssr/emoji/1f1f1-1f1ee.png | Bin 0 -> 536 bytes .../luci-static/vssr/emoji/1f1f1-1f1f0.png | Bin 0 -> 546 bytes .../luci-static/vssr/emoji/1f1f1-1f1f7.png | Bin 0 -> 578 bytes .../luci-static/vssr/emoji/1f1f1-1f1f8.png | Bin 0 -> 638 bytes .../luci-static/vssr/emoji/1f1f1-1f1f9.png | Bin 0 -> 810 bytes .../luci-static/vssr/emoji/1f1f1-1f1fa.png | Bin 0 -> 645 bytes .../luci-static/vssr/emoji/1f1f1-1f1fb.png | Bin 0 -> 508 bytes .../luci-static/vssr/emoji/1f1f1-1f1fe.png | Bin 0 -> 624 bytes .../luci-static/vssr/emoji/1f1f2-1f1e6.png | Bin 0 -> 454 bytes .../luci-static/vssr/emoji/1f1f2-1f1e8.png | Bin 0 -> 514 bytes .../luci-static/vssr/emoji/1f1f2-1f1e9.png | Bin 0 -> 540 bytes .../luci-static/vssr/emoji/1f1f2-1f1ea.png | Bin 0 -> 427 bytes .../luci-static/vssr/emoji/1f1f2-1f1eb.png | Bin 0 -> 462 bytes .../luci-static/vssr/emoji/1f1f2-1f1ec.png | Bin 0 -> 534 bytes .../luci-static/vssr/emoji/1f1f2-1f1ed.png | Bin 0 -> 639 bytes .../luci-static/vssr/emoji/1f1f2-1f1f0.png | Bin 0 -> 643 bytes .../luci-static/vssr/emoji/1f1f2-1f1f1.png | Bin 0 -> 484 bytes .../luci-static/vssr/emoji/1f1f2-1f1f2.png | Bin 0 -> 875 bytes .../luci-static/vssr/emoji/1f1f2-1f1f3.png | Bin 0 -> 492 bytes .../luci-static/vssr/emoji/1f1f2-1f1f4.png | Bin 0 -> 451 bytes .../luci-static/vssr/emoji/1f1f2-1f1f5.png | Bin 0 -> 553 bytes .../luci-static/vssr/emoji/1f1f2-1f1f6.png | Bin 0 -> 570 bytes .../luci-static/vssr/emoji/1f1f2-1f1f7.png | Bin 0 -> 571 bytes .../luci-static/vssr/emoji/1f1f2-1f1f8.png | Bin 0 -> 914 bytes .../luci-static/vssr/emoji/1f1f2-1f1f9.png | Bin 0 -> 477 bytes .../luci-static/vssr/emoji/1f1f2-1f1fa.png | Bin 0 -> 849 bytes .../luci-static/vssr/emoji/1f1f2-1f1fb.png | Bin 0 -> 500 bytes .../luci-static/vssr/emoji/1f1f2-1f1fc.png | Bin 0 -> 587 bytes .../luci-static/vssr/emoji/1f1f2-1f1fd.png | Bin 0 -> 536 bytes .../luci-static/vssr/emoji/1f1f2-1f1fe.png | Bin 0 -> 689 bytes .../luci-static/vssr/emoji/1f1f2-1f1ff.png | Bin 0 -> 899 bytes .../luci-static/vssr/emoji/1f1f3-1f1e6.png | Bin 0 -> 933 bytes .../luci-static/vssr/emoji/1f1f3-1f1e8.png | Bin 0 -> 689 bytes .../luci-static/vssr/emoji/1f1f3-1f1ea.png | Bin 0 -> 853 bytes .../luci-static/vssr/emoji/1f1f3-1f1eb.png | Bin 0 -> 490 bytes .../luci-static/vssr/emoji/1f1f3-1f1ec.png | Bin 0 -> 411 bytes .../luci-static/vssr/emoji/1f1f3-1f1ee.png | Bin 0 -> 569 bytes .../luci-static/vssr/emoji/1f1f3-1f1f1.png | Bin 0 -> 605 bytes .../luci-static/vssr/emoji/1f1f3-1f1f4.png | Bin 0 -> 908 bytes .../luci-static/vssr/emoji/1f1f3-1f1f5.png | Bin 0 -> 371 bytes .../luci-static/vssr/emoji/1f1f3-1f1f7.png | Bin 0 -> 493 bytes .../luci-static/vssr/emoji/1f1f3-1f1fa.png | Bin 0 -> 650 bytes .../luci-static/vssr/emoji/1f1f3-1f1ff.png | Bin 0 -> 592 bytes .../luci-static/vssr/emoji/1f1f4-1f1f2.png | Bin 0 -> 790 bytes .../luci-static/vssr/emoji/1f1f5-1f1e6.png | Bin 0 -> 656 bytes .../luci-static/vssr/emoji/1f1f5-1f1ea.png | Bin 0 -> 430 bytes .../luci-static/vssr/emoji/1f1f5-1f1eb.png | Bin 0 -> 860 bytes .../luci-static/vssr/emoji/1f1f5-1f1ec.png | Bin 0 -> 601 bytes .../luci-static/vssr/emoji/1f1f5-1f1ed.png | Bin 0 -> 657 bytes .../luci-static/vssr/emoji/1f1f5-1f1f0.png | Bin 0 -> 475 bytes .../luci-static/vssr/emoji/1f1f5-1f1f1.png | Bin 0 -> 516 bytes .../luci-static/vssr/emoji/1f1f5-1f1f2.png | Bin 0 -> 946 bytes .../luci-static/vssr/emoji/1f1f5-1f1f3.png | Bin 0 -> 668 bytes .../luci-static/vssr/emoji/1f1f5-1f1f7.png | Bin 0 -> 931 bytes .../luci-static/vssr/emoji/1f1f5-1f1f8.png | Bin 0 -> 645 bytes .../luci-static/vssr/emoji/1f1f5-1f1f9.png | Bin 0 -> 739 bytes .../luci-static/vssr/emoji/1f1f5-1f1fc.png | Bin 0 -> 504 bytes .../luci-static/vssr/emoji/1f1f5-1f1fe.png | Bin 0 -> 849 bytes .../luci-static/vssr/emoji/1f1f6-1f1e6.png | Bin 0 -> 416 bytes .../luci-static/vssr/emoji/1f1f7-1f1ea.png | Bin 0 -> 689 bytes .../luci-static/vssr/emoji/1f1f7-1f1f4.png | Bin 0 -> 446 bytes .../luci-static/vssr/emoji/1f1f7-1f1f8.png | Bin 0 -> 677 bytes .../luci-static/vssr/emoji/1f1f7-1f1fa.png | Bin 0 -> 621 bytes .../luci-static/vssr/emoji/1f1f7-1f1fc.png | Bin 0 -> 841 bytes .../luci-static/vssr/emoji/1f1f8-1f1e6.png | Bin 0 -> 412 bytes .../luci-static/vssr/emoji/1f1f8-1f1e7.png | Bin 0 -> 606 bytes .../luci-static/vssr/emoji/1f1f8-1f1e8.png | Bin 0 -> 907 bytes .../luci-static/vssr/emoji/1f1f8-1f1e9.png | Bin 0 -> 822 bytes .../luci-static/vssr/emoji/1f1f8-1f1ea.png | Bin 0 -> 589 bytes .../luci-static/vssr/emoji/1f1f8-1f1ec.png | Bin 0 -> 535 bytes .../luci-static/vssr/emoji/1f1f8-1f1ed.png | Bin 0 -> 884 bytes .../luci-static/vssr/emoji/1f1f8-1f1ee.png | Bin 0 -> 863 bytes .../luci-static/vssr/emoji/1f1f8-1f1ef.png | Bin 0 -> 908 bytes .../luci-static/vssr/emoji/1f1f8-1f1f0.png | Bin 0 -> 873 bytes .../luci-static/vssr/emoji/1f1f8-1f1f1.png | Bin 0 -> 618 bytes .../luci-static/vssr/emoji/1f1f8-1f1f2.png | Bin 0 -> 602 bytes .../luci-static/vssr/emoji/1f1f8-1f1f3.png | Bin 0 -> 496 bytes .../luci-static/vssr/emoji/1f1f8-1f1f4.png | Bin 0 -> 400 bytes .../luci-static/vssr/emoji/1f1f8-1f1f7.png | Bin 0 -> 891 bytes .../luci-static/vssr/emoji/1f1f8-1f1f8.png | Bin 0 -> 872 bytes .../luci-static/vssr/emoji/1f1f8-1f1f9.png | Bin 0 -> 649 bytes .../luci-static/vssr/emoji/1f1f8-1f1fb.png | Bin 0 -> 570 bytes .../luci-static/vssr/emoji/1f1f8-1f1fd.png | Bin 0 -> 851 bytes .../luci-static/vssr/emoji/1f1f8-1f1fe.png | Bin 0 -> 642 bytes .../luci-static/vssr/emoji/1f1f8-1f1ff.png | Bin 0 -> 954 bytes .../luci-static/vssr/emoji/1f1f9-1f1e6.png | Bin 0 -> 884 bytes .../luci-static/vssr/emoji/1f1f9-1f1e8.png | Bin 0 -> 911 bytes .../luci-static/vssr/emoji/1f1f9-1f1e9.png | Bin 0 -> 466 bytes .../luci-static/vssr/emoji/1f1f9-1f1eb.png | Bin 0 -> 474 bytes .../luci-static/vssr/emoji/1f1f9-1f1ec.png | Bin 0 -> 909 bytes .../luci-static/vssr/emoji/1f1f9-1f1ed.png | Bin 0 -> 918 bytes .../luci-static/vssr/emoji/1f1f9-1f1ef.png | Bin 0 -> 850 bytes .../luci-static/vssr/emoji/1f1f9-1f1f0.png | Bin 0 -> 539 bytes .../luci-static/vssr/emoji/1f1f9-1f1f1.png | Bin 0 -> 568 bytes .../luci-static/vssr/emoji/1f1f9-1f1f2.png | Bin 0 -> 459 bytes .../luci-static/vssr/emoji/1f1f9-1f1f3.png | Bin 0 -> 473 bytes .../luci-static/vssr/emoji/1f1f9-1f1f4.png | Bin 0 -> 531 bytes .../luci-static/vssr/emoji/1f1f9-1f1f7.png | Bin 0 -> 456 bytes .../luci-static/vssr/emoji/1f1f9-1f1f9.png | Bin 0 -> 561 bytes .../luci-static/vssr/emoji/1f1f9-1f1fb.png | Bin 0 -> 906 bytes .../luci-static/vssr/emoji/1f1f9-1f1fc.png | Bin 0 -> 529 bytes .../luci-static/vssr/emoji/1f1f9-1f1ff.png | Bin 0 -> 897 bytes .../luci-static/vssr/emoji/1f1fa-1f1e6.png | Bin 0 -> 546 bytes .../luci-static/vssr/emoji/1f1fa-1f1ec.png | Bin 0 -> 899 bytes .../luci-static/vssr/emoji/1f1fa-1f1f2.png | Bin 0 -> 636 bytes .../luci-static/vssr/emoji/1f1fa-1f1f3.png | Bin 0 -> 431 bytes .../luci-static/vssr/emoji/1f1fa-1f1f8.png | Bin 0 -> 636 bytes .../luci-static/vssr/emoji/1f1fa-1f1fe.png | Bin 0 -> 644 bytes .../luci-static/vssr/emoji/1f1fa-1f1ff.png | Bin 0 -> 845 bytes .../luci-static/vssr/emoji/1f1fb-1f1e6.png | Bin 0 -> 450 bytes .../luci-static/vssr/emoji/1f1fb-1f1e8.png | Bin 0 -> 537 bytes .../luci-static/vssr/emoji/1f1fb-1f1ea.png | Bin 0 -> 863 bytes .../luci-static/vssr/emoji/1f1fb-1f1ec.png | Bin 0 -> 903 bytes .../luci-static/vssr/emoji/1f1fb-1f1ee.png | Bin 0 -> 960 bytes .../luci-static/vssr/emoji/1f1fb-1f1f3.png | Bin 0 -> 461 bytes .../luci-static/vssr/emoji/1f1fb-1f1fa.png | Bin 0 -> 872 bytes .../luci-static/vssr/emoji/1f1fc-1f1eb.png | Bin 0 -> 512 bytes .../luci-static/vssr/emoji/1f1fc-1f1f8.png | Bin 0 -> 499 bytes .../luci-static/vssr/emoji/1f1fd-1f1f0.png | Bin 0 -> 457 bytes .../luci-static/vssr/emoji/1f1fe-1f1ea.png | Bin 0 -> 600 bytes .../luci-static/vssr/emoji/1f1fe-1f1f9.png | Bin 0 -> 490 bytes .../luci-static/vssr/emoji/1f1ff-1f1e6.png | Bin 0 -> 992 bytes .../luci-static/vssr/emoji/1f1ff-1f1f2.png | Bin 0 -> 477 bytes .../luci-static/vssr/emoji/1f1ff-1f1fc.png | Bin 0 -> 935 bytes .../luci-static/vssr/emoji/2x/1f1e6-1f1e8.png | Bin 0 -> 1251 bytes .../luci-static/vssr/emoji/2x/1f1e6-1f1e9.png | Bin 0 -> 1018 bytes .../luci-static/vssr/emoji/2x/1f1e6-1f1ea.png | Bin 0 -> 858 bytes .../luci-static/vssr/emoji/2x/1f1e6-1f1eb.png | Bin 0 -> 798 bytes .../luci-static/vssr/emoji/2x/1f1e6-1f1ec.png | Bin 0 -> 1110 bytes .../luci-static/vssr/emoji/2x/1f1e6-1f1ee.png | Bin 0 -> 1332 bytes .../luci-static/vssr/emoji/2x/1f1e6-1f1f1.png | Bin 0 -> 693 bytes .../luci-static/vssr/emoji/2x/1f1e6-1f1f2.png | Bin 0 -> 1008 bytes .../luci-static/vssr/emoji/2x/1f1e6-1f1f4.png | Bin 0 -> 807 bytes .../luci-static/vssr/emoji/2x/1f1e6-1f1f6.png | Bin 0 -> 639 bytes .../luci-static/vssr/emoji/2x/1f1e6-1f1f7.png | Bin 0 -> 798 bytes .../luci-static/vssr/emoji/2x/1f1e6-1f1f8.png | Bin 0 -> 1265 bytes .../luci-static/vssr/emoji/2x/1f1e6-1f1f9.png | Bin 0 -> 775 bytes .../luci-static/vssr/emoji/2x/1f1e6-1f1fa.png | Bin 0 -> 1208 bytes .../luci-static/vssr/emoji/2x/1f1e6-1f1fc.png | Bin 0 -> 845 bytes .../luci-static/vssr/emoji/2x/1f1e6-1f1fd.png | Bin 0 -> 1234 bytes .../luci-static/vssr/emoji/2x/1f1e6-1f1ff.png | Bin 0 -> 1092 bytes .../luci-static/vssr/emoji/2x/1f1e7-1f1e6.png | Bin 0 -> 847 bytes .../luci-static/vssr/emoji/2x/1f1e7-1f1e7.png | Bin 0 -> 699 bytes .../luci-static/vssr/emoji/2x/1f1e7-1f1e9.png | Bin 0 -> 585 bytes .../luci-static/vssr/emoji/2x/1f1e7-1f1ea.png | Bin 0 -> 632 bytes .../luci-static/vssr/emoji/2x/1f1e7-1f1eb.png | Bin 0 -> 788 bytes .../luci-static/vssr/emoji/2x/1f1e7-1f1ec.png | Bin 0 -> 896 bytes .../luci-static/vssr/emoji/2x/1f1e7-1f1ed.png | Bin 0 -> 724 bytes .../luci-static/vssr/emoji/2x/1f1e7-1f1ee.png | Bin 0 -> 1197 bytes .../luci-static/vssr/emoji/2x/1f1e7-1f1ef.png | Bin 0 -> 785 bytes .../luci-static/vssr/emoji/2x/1f1e7-1f1f1.png | Bin 0 -> 1036 bytes .../luci-static/vssr/emoji/2x/1f1e7-1f1f2.png | Bin 0 -> 1611 bytes .../luci-static/vssr/emoji/2x/1f1e7-1f1f3.png | Bin 0 -> 1379 bytes .../luci-static/vssr/emoji/2x/1f1e7-1f1f4.png | Bin 0 -> 1152 bytes .../luci-static/vssr/emoji/2x/1f1e7-1f1f6.png | Bin 0 -> 963 bytes .../luci-static/vssr/emoji/2x/1f1e7-1f1f7.png | Bin 0 -> 937 bytes .../luci-static/vssr/emoji/2x/1f1e7-1f1f8.png | Bin 0 -> 911 bytes .../luci-static/vssr/emoji/2x/1f1e7-1f1f9.png | Bin 0 -> 1120 bytes .../luci-static/vssr/emoji/2x/1f1e7-1f1fb.png | Bin 0 -> 1148 bytes .../luci-static/vssr/emoji/2x/1f1e7-1f1fc.png | Bin 0 -> 825 bytes .../luci-static/vssr/emoji/2x/1f1e7-1f1fe.png | Bin 0 -> 817 bytes .../luci-static/vssr/emoji/2x/1f1e7-1f1ff.png | Bin 0 -> 1164 bytes .../luci-static/vssr/emoji/2x/1f1e8-1f1e6.png | Bin 0 -> 871 bytes .../luci-static/vssr/emoji/2x/1f1e8-1f1e8.png | Bin 0 -> 880 bytes .../luci-static/vssr/emoji/2x/1f1e8-1f1e9.png | Bin 0 -> 1269 bytes .../luci-static/vssr/emoji/2x/1f1e8-1f1eb.png | Bin 0 -> 1320 bytes .../luci-static/vssr/emoji/2x/1f1e8-1f1ec.png | Bin 0 -> 999 bytes .../luci-static/vssr/emoji/2x/1f1e8-1f1ed.png | Bin 0 -> 641 bytes .../luci-static/vssr/emoji/2x/1f1e8-1f1ee.png | Bin 0 -> 717 bytes .../luci-static/vssr/emoji/2x/1f1e8-1f1f0.png | Bin 0 -> 1191 bytes .../luci-static/vssr/emoji/2x/1f1e8-1f1f1.png | Bin 0 -> 870 bytes .../luci-static/vssr/emoji/2x/1f1e8-1f1f2.png | Bin 0 -> 734 bytes .../luci-static/vssr/emoji/2x/1f1e8-1f1f3.png | Bin 0 -> 684 bytes .../luci-static/vssr/emoji/2x/1f1e8-1f1f4.png | Bin 0 -> 999 bytes .../luci-static/vssr/emoji/2x/1f1e8-1f1f5.png | Bin 0 -> 703 bytes .../luci-static/vssr/emoji/2x/1f1e8-1f1f7.png | Bin 0 -> 1049 bytes .../luci-static/vssr/emoji/2x/1f1e8-1f1fa.png | Bin 0 -> 1133 bytes .../luci-static/vssr/emoji/2x/1f1e8-1f1fb.png | Bin 0 -> 1191 bytes .../luci-static/vssr/emoji/2x/1f1e8-1f1fc.png | Bin 0 -> 909 bytes .../luci-static/vssr/emoji/2x/1f1e8-1f1fd.png | Bin 0 -> 1029 bytes .../luci-static/vssr/emoji/2x/1f1e8-1f1fe.png | Bin 0 -> 797 bytes .../luci-static/vssr/emoji/2x/1f1e8-1f1ff.png | Bin 0 -> 865 bytes .../luci-static/vssr/emoji/2x/1f1e9-1f1ea.png | Bin 0 -> 872 bytes .../luci-static/vssr/emoji/2x/1f1e9-1f1ec.png | Bin 0 -> 1823 bytes .../luci-static/vssr/emoji/2x/1f1e9-1f1ef.png | Bin 0 -> 955 bytes .../luci-static/vssr/emoji/2x/1f1e9-1f1f0.png | Bin 0 -> 908 bytes .../luci-static/vssr/emoji/2x/1f1e9-1f1f2.png | Bin 0 -> 1424 bytes .../luci-static/vssr/emoji/2x/1f1e9-1f1f4.png | Bin 0 -> 1183 bytes .../luci-static/vssr/emoji/2x/1f1e9-1f1ff.png | Bin 0 -> 876 bytes .../luci-static/vssr/emoji/2x/1f1ea-1f1e6.png | Bin 0 -> 974 bytes .../luci-static/vssr/emoji/2x/1f1ea-1f1e8.png | Bin 0 -> 1242 bytes .../luci-static/vssr/emoji/2x/1f1ea-1f1ea.png | Bin 0 -> 791 bytes .../luci-static/vssr/emoji/2x/1f1ea-1f1ec.png | Bin 0 -> 899 bytes .../luci-static/vssr/emoji/2x/1f1ea-1f1ed.png | Bin 0 -> 927 bytes .../luci-static/vssr/emoji/2x/1f1ea-1f1f7.png | Bin 0 -> 1128 bytes .../luci-static/vssr/emoji/2x/1f1ea-1f1f8.png | Bin 0 -> 974 bytes .../luci-static/vssr/emoji/2x/1f1ea-1f1f9.png | Bin 0 -> 1087 bytes .../luci-static/vssr/emoji/2x/1f1ea-1f1fa.png | Bin 0 -> 595 bytes .../luci-static/vssr/emoji/2x/1f1eb-1f1ee.png | Bin 0 -> 857 bytes .../luci-static/vssr/emoji/2x/1f1eb-1f1ef.png | Bin 0 -> 1541 bytes .../luci-static/vssr/emoji/2x/1f1eb-1f1f0.png | Bin 0 -> 1431 bytes .../luci-static/vssr/emoji/2x/1f1eb-1f1f2.png | Bin 0 -> 575 bytes .../luci-static/vssr/emoji/2x/1f1eb-1f1f4.png | Bin 0 -> 1233 bytes .../luci-static/vssr/emoji/2x/1f1eb-1f1f7.png | Bin 0 -> 703 bytes .../luci-static/vssr/emoji/2x/1f1ec-1f1e6.png | Bin 0 -> 922 bytes .../luci-static/vssr/emoji/2x/1f1ec-1f1e7.png | Bin 0 -> 1451 bytes .../luci-static/vssr/emoji/2x/1f1ec-1f1e9.png | Bin 0 -> 1096 bytes .../luci-static/vssr/emoji/2x/1f1ec-1f1ea.png | Bin 0 -> 1083 bytes .../luci-static/vssr/emoji/2x/1f1ec-1f1eb.png | Bin 0 -> 853 bytes .../luci-static/vssr/emoji/2x/1f1ec-1f1ec.png | Bin 0 -> 1090 bytes .../luci-static/vssr/emoji/2x/1f1ec-1f1ed.png | Bin 0 -> 984 bytes .../luci-static/vssr/emoji/2x/1f1ec-1f1ee.png | Bin 0 -> 1022 bytes .../luci-static/vssr/emoji/2x/1f1ec-1f1f1.png | Bin 0 -> 842 bytes .../luci-static/vssr/emoji/2x/1f1ec-1f1f2.png | Bin 0 -> 1115 bytes .../luci-static/vssr/emoji/2x/1f1ec-1f1f3.png | Bin 0 -> 731 bytes .../luci-static/vssr/emoji/2x/1f1ec-1f1f5.png | Bin 0 -> 994 bytes .../luci-static/vssr/emoji/2x/1f1ec-1f1f6.png | Bin 0 -> 1058 bytes .../luci-static/vssr/emoji/2x/1f1ec-1f1f7.png | Bin 0 -> 1023 bytes .../luci-static/vssr/emoji/2x/1f1ec-1f1f8.png | Bin 0 -> 1342 bytes .../luci-static/vssr/emoji/2x/1f1ec-1f1f9.png | Bin 0 -> 798 bytes .../luci-static/vssr/emoji/2x/1f1ec-1f1fa.png | Bin 0 -> 778 bytes .../luci-static/vssr/emoji/2x/1f1ec-1f1fc.png | Bin 0 -> 952 bytes .../luci-static/vssr/emoji/2x/1f1ec-1f1fe.png | Bin 0 -> 1144 bytes .../luci-static/vssr/emoji/2x/1f1ed-1f1f0.png | Bin 0 -> 755 bytes .../luci-static/vssr/emoji/2x/1f1ed-1f1f2.png | Bin 0 -> 1208 bytes .../luci-static/vssr/emoji/2x/1f1ed-1f1f3.png | Bin 0 -> 807 bytes .../luci-static/vssr/emoji/2x/1f1ed-1f1f7.png | Bin 0 -> 1161 bytes .../luci-static/vssr/emoji/2x/1f1ed-1f1f9.png | Bin 0 -> 965 bytes .../luci-static/vssr/emoji/2x/1f1ed-1f1fa.png | Bin 0 -> 911 bytes .../luci-static/vssr/emoji/2x/1f1ee-1f1e8.png | Bin 0 -> 842 bytes .../luci-static/vssr/emoji/2x/1f1ee-1f1e9.png | Bin 0 -> 726 bytes .../luci-static/vssr/emoji/2x/1f1ee-1f1ea.png | Bin 0 -> 692 bytes .../luci-static/vssr/emoji/2x/1f1ee-1f1f1.png | Bin 0 -> 930 bytes .../luci-static/vssr/emoji/2x/1f1ee-1f1f2.png | Bin 0 -> 773 bytes .../luci-static/vssr/emoji/2x/1f1ee-1f1f3.png | Bin 0 -> 1051 bytes .../luci-static/vssr/emoji/2x/1f1ee-1f1f4.png | Bin 0 -> 1823 bytes .../luci-static/vssr/emoji/2x/1f1ee-1f1f6.png | Bin 0 -> 942 bytes .../luci-static/vssr/emoji/2x/1f1ee-1f1f7.png | Bin 0 -> 1096 bytes .../luci-static/vssr/emoji/2x/1f1ee-1f1f8.png | Bin 0 -> 1111 bytes .../luci-static/vssr/emoji/2x/1f1ee-1f1f9.png | Bin 0 -> 675 bytes .../luci-static/vssr/emoji/2x/1f1ef-1f1ea.png | Bin 0 -> 1108 bytes .../luci-static/vssr/emoji/2x/1f1ef-1f1f2.png | Bin 0 -> 985 bytes .../luci-static/vssr/emoji/2x/1f1ef-1f1f4.png | Bin 0 -> 931 bytes .../luci-static/vssr/emoji/2x/1f1ef-1f1f5.png | Bin 0 -> 676 bytes .../luci-static/vssr/emoji/2x/1f1f0-1f1ea.png | Bin 0 -> 1156 bytes .../luci-static/vssr/emoji/2x/1f1f0-1f1ec.png | Bin 0 -> 717 bytes .../luci-static/vssr/emoji/2x/1f1f0-1f1ed.png | Bin 0 -> 988 bytes .../luci-static/vssr/emoji/2x/1f1f0-1f1ee.png | Bin 0 -> 1289 bytes .../luci-static/vssr/emoji/2x/1f1f0-1f1f2.png | Bin 0 -> 1417 bytes .../luci-static/vssr/emoji/2x/1f1f0-1f1f3.png | Bin 0 -> 1186 bytes .../luci-static/vssr/emoji/2x/1f1f0-1f1f5.png | Bin 0 -> 970 bytes .../luci-static/vssr/emoji/2x/1f1f0-1f1f7.png | Bin 0 -> 925 bytes .../luci-static/vssr/emoji/2x/1f1f0-1f1fc.png | Bin 0 -> 896 bytes .../luci-static/vssr/emoji/2x/1f1f0-1f1fe.png | Bin 0 -> 1311 bytes .../luci-static/vssr/emoji/2x/1f1f0-1f1ff.png | Bin 0 -> 853 bytes .../luci-static/vssr/emoji/2x/1f1f1-1f1e6.png | Bin 0 -> 832 bytes .../luci-static/vssr/emoji/2x/1f1f1-1f1e7.png | Bin 0 -> 1058 bytes .../luci-static/vssr/emoji/2x/1f1f1-1f1e8.png | Bin 0 -> 839 bytes .../luci-static/vssr/emoji/2x/1f1f1-1f1ee.png | Bin 0 -> 829 bytes .../luci-static/vssr/emoji/2x/1f1f1-1f1f0.png | Bin 0 -> 911 bytes .../luci-static/vssr/emoji/2x/1f1f1-1f1f7.png | Bin 0 -> 1295 bytes .../luci-static/vssr/emoji/2x/1f1f1-1f1f8.png | Bin 0 -> 983 bytes .../luci-static/vssr/emoji/2x/1f1f1-1f1f9.png | Bin 0 -> 927 bytes .../luci-static/vssr/emoji/2x/1f1f1-1f1fa.png | Bin 0 -> 965 bytes .../luci-static/vssr/emoji/2x/1f1f1-1f1fb.png | Bin 0 -> 749 bytes .../luci-static/vssr/emoji/2x/1f1f1-1f1fe.png | Bin 0 -> 945 bytes .../luci-static/vssr/emoji/2x/1f1f2-1f1e6.png | Bin 0 -> 707 bytes .../luci-static/vssr/emoji/2x/1f1f2-1f1e8.png | Bin 0 -> 744 bytes .../luci-static/vssr/emoji/2x/1f1f2-1f1e9.png | Bin 0 -> 896 bytes .../luci-static/vssr/emoji/2x/1f1f2-1f1ea.png | Bin 0 -> 719 bytes .../luci-static/vssr/emoji/2x/1f1f2-1f1eb.png | Bin 0 -> 703 bytes .../luci-static/vssr/emoji/2x/1f1f2-1f1ec.png | Bin 0 -> 808 bytes .../luci-static/vssr/emoji/2x/1f1f2-1f1ed.png | Bin 0 -> 1128 bytes .../luci-static/vssr/emoji/2x/1f1f2-1f1f0.png | Bin 0 -> 1271 bytes .../luci-static/vssr/emoji/2x/1f1f2-1f1f1.png | Bin 0 -> 715 bytes .../luci-static/vssr/emoji/2x/1f1f2-1f1f2.png | Bin 0 -> 1228 bytes .../luci-static/vssr/emoji/2x/1f1f2-1f1f3.png | Bin 0 -> 796 bytes .../luci-static/vssr/emoji/2x/1f1f2-1f1f4.png | Bin 0 -> 685 bytes .../luci-static/vssr/emoji/2x/1f1f2-1f1f5.png | Bin 0 -> 1093 bytes .../luci-static/vssr/emoji/2x/1f1f2-1f1f6.png | Bin 0 -> 947 bytes .../luci-static/vssr/emoji/2x/1f1f2-1f1f7.png | Bin 0 -> 949 bytes .../luci-static/vssr/emoji/2x/1f1f2-1f1f8.png | Bin 0 -> 1402 bytes .../luci-static/vssr/emoji/2x/1f1f2-1f1f9.png | Bin 0 -> 754 bytes .../luci-static/vssr/emoji/2x/1f1f2-1f1fa.png | Bin 0 -> 1117 bytes .../luci-static/vssr/emoji/2x/1f1f2-1f1fb.png | Bin 0 -> 797 bytes .../luci-static/vssr/emoji/2x/1f1f2-1f1fc.png | Bin 0 -> 895 bytes .../luci-static/vssr/emoji/2x/1f1f2-1f1fd.png | Bin 0 -> 839 bytes .../luci-static/vssr/emoji/2x/1f1f2-1f1fe.png | Bin 0 -> 1549 bytes .../luci-static/vssr/emoji/2x/1f1f2-1f1ff.png | Bin 0 -> 1148 bytes .../luci-static/vssr/emoji/2x/1f1f3-1f1e6.png | Bin 0 -> 1199 bytes .../luci-static/vssr/emoji/2x/1f1f3-1f1e8.png | Bin 0 -> 1161 bytes .../luci-static/vssr/emoji/2x/1f1f3-1f1ea.png | Bin 0 -> 1010 bytes .../luci-static/vssr/emoji/2x/1f1f3-1f1eb.png | Bin 0 -> 747 bytes .../luci-static/vssr/emoji/2x/1f1f3-1f1ec.png | Bin 0 -> 605 bytes .../luci-static/vssr/emoji/2x/1f1f3-1f1ee.png | Bin 0 -> 906 bytes .../luci-static/vssr/emoji/2x/1f1f3-1f1f1.png | Bin 0 -> 839 bytes .../luci-static/vssr/emoji/2x/1f1f3-1f1f4.png | Bin 0 -> 1148 bytes .../luci-static/vssr/emoji/2x/1f1f3-1f1f5.png | Bin 0 -> 659 bytes .../luci-static/vssr/emoji/2x/1f1f3-1f1f7.png | Bin 0 -> 793 bytes .../luci-static/vssr/emoji/2x/1f1f3-1f1fa.png | Bin 0 -> 1413 bytes .../luci-static/vssr/emoji/2x/1f1f3-1f1ff.png | Bin 0 -> 1109 bytes .../luci-static/vssr/emoji/2x/1f1f4-1f1f2.png | Bin 0 -> 1028 bytes .../luci-static/vssr/emoji/2x/1f1f5-1f1e6.png | Bin 0 -> 1037 bytes .../luci-static/vssr/emoji/2x/1f1f5-1f1ea.png | Bin 0 -> 609 bytes .../luci-static/vssr/emoji/2x/1f1f5-1f1eb.png | Bin 0 -> 1042 bytes .../luci-static/vssr/emoji/2x/1f1f5-1f1ec.png | Bin 0 -> 954 bytes .../luci-static/vssr/emoji/2x/1f1f5-1f1ed.png | Bin 0 -> 1125 bytes .../luci-static/vssr/emoji/2x/1f1f5-1f1f0.png | Bin 0 -> 745 bytes .../luci-static/vssr/emoji/2x/1f1f5-1f1f1.png | Bin 0 -> 694 bytes .../luci-static/vssr/emoji/2x/1f1f5-1f1f2.png | Bin 0 -> 1794 bytes .../luci-static/vssr/emoji/2x/1f1f5-1f1f3.png | Bin 0 -> 1475 bytes .../luci-static/vssr/emoji/2x/1f1f5-1f1f7.png | Bin 0 -> 1124 bytes .../luci-static/vssr/emoji/2x/1f1f5-1f1f8.png | Bin 0 -> 803 bytes .../luci-static/vssr/emoji/2x/1f1f5-1f1f9.png | Bin 0 -> 1092 bytes .../luci-static/vssr/emoji/2x/1f1f5-1f1fc.png | Bin 0 -> 692 bytes .../luci-static/vssr/emoji/2x/1f1f5-1f1fe.png | Bin 0 -> 1028 bytes .../luci-static/vssr/emoji/2x/1f1f6-1f1e6.png | Bin 0 -> 682 bytes .../luci-static/vssr/emoji/2x/1f1f7-1f1ea.png | Bin 0 -> 1268 bytes .../luci-static/vssr/emoji/2x/1f1f7-1f1f4.png | Bin 0 -> 634 bytes .../luci-static/vssr/emoji/2x/1f1f7-1f1f8.png | Bin 0 -> 1230 bytes .../luci-static/vssr/emoji/2x/1f1f7-1f1fa.png | Bin 0 -> 894 bytes .../luci-static/vssr/emoji/2x/1f1f7-1f1fc.png | Bin 0 -> 1102 bytes .../luci-static/vssr/emoji/2x/1f1f8-1f1e6.png | Bin 0 -> 600 bytes .../luci-static/vssr/emoji/2x/1f1f8-1f1e7.png | Bin 0 -> 1096 bytes .../luci-static/vssr/emoji/2x/1f1f8-1f1e8.png | Bin 0 -> 1196 bytes .../luci-static/vssr/emoji/2x/1f1f8-1f1e9.png | Bin 0 -> 866 bytes .../luci-static/vssr/emoji/2x/1f1f8-1f1ea.png | Bin 0 -> 977 bytes .../luci-static/vssr/emoji/2x/1f1f8-1f1ec.png | Bin 0 -> 860 bytes .../luci-static/vssr/emoji/2x/1f1f8-1f1ed.png | Bin 0 -> 1251 bytes .../luci-static/vssr/emoji/2x/1f1f8-1f1ee.png | Bin 0 -> 1066 bytes .../luci-static/vssr/emoji/2x/1f1f8-1f1ef.png | Bin 0 -> 1148 bytes .../luci-static/vssr/emoji/2x/1f1f8-1f1f0.png | Bin 0 -> 1135 bytes .../luci-static/vssr/emoji/2x/1f1f8-1f1f1.png | Bin 0 -> 903 bytes .../luci-static/vssr/emoji/2x/1f1f8-1f1f2.png | Bin 0 -> 1042 bytes .../luci-static/vssr/emoji/2x/1f1f8-1f1f3.png | Bin 0 -> 812 bytes .../luci-static/vssr/emoji/2x/1f1f8-1f1f4.png | Bin 0 -> 606 bytes .../luci-static/vssr/emoji/2x/1f1f8-1f1f7.png | Bin 0 -> 1105 bytes .../luci-static/vssr/emoji/2x/1f1f8-1f1f8.png | Bin 0 -> 1104 bytes .../luci-static/vssr/emoji/2x/1f1f8-1f1f9.png | Bin 0 -> 1040 bytes .../luci-static/vssr/emoji/2x/1f1f8-1f1fb.png | Bin 0 -> 922 bytes .../luci-static/vssr/emoji/2x/1f1f8-1f1fd.png | Bin 0 -> 1036 bytes .../luci-static/vssr/emoji/2x/1f1f8-1f1fe.png | Bin 0 -> 933 bytes .../luci-static/vssr/emoji/2x/1f1f8-1f1ff.png | Bin 0 -> 1553 bytes .../luci-static/vssr/emoji/2x/1f1f9-1f1e6.png | Bin 0 -> 1251 bytes .../luci-static/vssr/emoji/2x/1f1f9-1f1e8.png | Bin 0 -> 1381 bytes .../luci-static/vssr/emoji/2x/1f1f9-1f1e9.png | Bin 0 -> 673 bytes .../luci-static/vssr/emoji/2x/1f1f9-1f1eb.png | Bin 0 -> 760 bytes .../luci-static/vssr/emoji/2x/1f1f9-1f1ec.png | Bin 0 -> 1188 bytes .../luci-static/vssr/emoji/2x/1f1f9-1f1ed.png | Bin 0 -> 1154 bytes .../luci-static/vssr/emoji/2x/1f1f9-1f1ef.png | Bin 0 -> 1038 bytes .../luci-static/vssr/emoji/2x/1f1f9-1f1f0.png | Bin 0 -> 805 bytes .../luci-static/vssr/emoji/2x/1f1f9-1f1f1.png | Bin 0 -> 932 bytes .../luci-static/vssr/emoji/2x/1f1f9-1f1f2.png | Bin 0 -> 793 bytes .../luci-static/vssr/emoji/2x/1f1f9-1f1f3.png | Bin 0 -> 738 bytes .../luci-static/vssr/emoji/2x/1f1f9-1f1f4.png | Bin 0 -> 829 bytes .../luci-static/vssr/emoji/2x/1f1f9-1f1f7.png | Bin 0 -> 789 bytes .../luci-static/vssr/emoji/2x/1f1f9-1f1f9.png | Bin 0 -> 960 bytes .../luci-static/vssr/emoji/2x/1f1f9-1f1fb.png | Bin 0 -> 1353 bytes .../luci-static/vssr/emoji/2x/1f1f9-1f1fc.png | Bin 0 -> 892 bytes .../luci-static/vssr/emoji/2x/1f1f9-1f1ff.png | Bin 0 -> 1188 bytes .../luci-static/vssr/emoji/2x/1f1fa-1f1e6.png | Bin 0 -> 774 bytes .../luci-static/vssr/emoji/2x/1f1fa-1f1ec.png | Bin 0 -> 1323 bytes .../luci-static/vssr/emoji/2x/1f1fa-1f1f2.png | Bin 0 -> 1534 bytes .../luci-static/vssr/emoji/2x/1f1fa-1f1f3.png | Bin 0 -> 664 bytes .../luci-static/vssr/emoji/2x/1f1fa-1f1f8.png | Bin 0 -> 1534 bytes .../luci-static/vssr/emoji/2x/1f1fa-1f1fe.png | Bin 0 -> 1180 bytes .../luci-static/vssr/emoji/2x/1f1fa-1f1ff.png | Bin 0 -> 1125 bytes .../luci-static/vssr/emoji/2x/1f1fb-1f1e6.png | Bin 0 -> 809 bytes .../luci-static/vssr/emoji/2x/1f1fb-1f1e8.png | Bin 0 -> 895 bytes .../luci-static/vssr/emoji/2x/1f1fb-1f1ea.png | Bin 0 -> 1072 bytes .../luci-static/vssr/emoji/2x/1f1fb-1f1ec.png | Bin 0 -> 1308 bytes .../luci-static/vssr/emoji/2x/1f1fb-1f1ee.png | Bin 0 -> 1425 bytes .../luci-static/vssr/emoji/2x/1f1fb-1f1f3.png | Bin 0 -> 645 bytes .../luci-static/vssr/emoji/2x/1f1fb-1f1fa.png | Bin 0 -> 1053 bytes .../luci-static/vssr/emoji/2x/1f1fc-1f1eb.png | Bin 0 -> 887 bytes .../luci-static/vssr/emoji/2x/1f1fc-1f1f8.png | Bin 0 -> 776 bytes .../luci-static/vssr/emoji/2x/1f1fd-1f1f0.png | Bin 0 -> 673 bytes .../luci-static/vssr/emoji/2x/1f1fe-1f1ea.png | Bin 0 -> 833 bytes .../luci-static/vssr/emoji/2x/1f1fe-1f1f9.png | Bin 0 -> 912 bytes .../luci-static/vssr/emoji/2x/1f1ff-1f1e6.png | Bin 0 -> 1378 bytes .../luci-static/vssr/emoji/2x/1f1ff-1f1f2.png | Bin 0 -> 720 bytes .../luci-static/vssr/emoji/2x/1f1ff-1f1fc.png | Bin 0 -> 1596 bytes .../www/luci-static/vssr/flags/4x3/ad.svg | 150 + .../www/luci-static/vssr/flags/4x3/ae.svg | 6 + .../www/luci-static/vssr/flags/4x3/af.svg | 81 + .../www/luci-static/vssr/flags/4x3/ag.svg | 14 + .../www/luci-static/vssr/flags/4x3/ai.svg | 763 + .../www/luci-static/vssr/flags/4x3/al.svg | 5 + .../www/luci-static/vssr/flags/4x3/am.svg | 5 + .../www/luci-static/vssr/flags/4x3/ao.svg | 13 + .../www/luci-static/vssr/flags/4x3/aq.svg | 5 + .../www/luci-static/vssr/flags/4x3/ar.svg | 31 + .../www/luci-static/vssr/flags/4x3/as.svg | 33 + .../www/luci-static/vssr/flags/4x3/at.svg | 6 + .../www/luci-static/vssr/flags/4x3/au.svg | 9 + .../www/luci-static/vssr/flags/4x3/aw.svg | 186 + .../www/luci-static/vssr/flags/4x3/ax.svg | 18 + .../www/luci-static/vssr/flags/4x3/az.svg | 8 + .../www/luci-static/vssr/flags/4x3/ba.svg | 12 + .../www/luci-static/vssr/flags/4x3/bb.svg | 6 + .../www/luci-static/vssr/flags/4x3/bd.svg | 4 + .../www/luci-static/vssr/flags/4x3/be.svg | 7 + .../www/luci-static/vssr/flags/4x3/bf.svg | 7 + .../www/luci-static/vssr/flags/4x3/bg.svg | 7 + .../www/luci-static/vssr/flags/4x3/bh.svg | 9 + .../www/luci-static/vssr/flags/4x3/bi.svg | 15 + .../www/luci-static/vssr/flags/4x3/bj.svg | 14 + .../www/luci-static/vssr/flags/4x3/bl.svg | 7 + .../www/luci-static/vssr/flags/4x3/bm.svg | 98 + .../www/luci-static/vssr/flags/4x3/bn.svg | 36 + .../www/luci-static/vssr/flags/4x3/bo.svg | 676 + .../www/luci-static/vssr/flags/4x3/bq.svg | 5 + .../www/luci-static/vssr/flags/4x3/br.svg | 45 + .../www/luci-static/vssr/flags/4x3/bs.svg | 13 + .../www/luci-static/vssr/flags/4x3/bt.svg | 89 + .../www/luci-static/vssr/flags/4x3/bv.svg | 13 + .../www/luci-static/vssr/flags/4x3/bw.svg | 7 + .../www/luci-static/vssr/flags/4x3/by.svg | 20 + .../www/luci-static/vssr/flags/4x3/bz.svg | 145 + .../www/luci-static/vssr/flags/4x3/ca.svg | 4 + .../www/luci-static/vssr/flags/4x3/cc.svg | 19 + .../www/luci-static/vssr/flags/4x3/cd.svg | 5 + .../www/luci-static/vssr/flags/4x3/cf.svg | 15 + .../www/luci-static/vssr/flags/4x3/cg.svg | 12 + .../www/luci-static/vssr/flags/4x3/ch.svg | 9 + .../www/luci-static/vssr/flags/4x3/ci.svg | 7 + .../www/luci-static/vssr/flags/4x3/ck.svg | 9 + .../www/luci-static/vssr/flags/4x3/cl.svg | 13 + .../www/luci-static/vssr/flags/4x3/cm.svg | 15 + .../www/luci-static/vssr/flags/4x3/cn.svg | 11 + .../www/luci-static/vssr/flags/4x3/co.svg | 7 + .../www/luci-static/vssr/flags/4x3/cr.svg | 7 + .../www/luci-static/vssr/flags/4x3/cu.svg | 13 + .../www/luci-static/vssr/flags/4x3/cv.svg | 13 + .../www/luci-static/vssr/flags/4x3/cw.svg | 14 + .../www/luci-static/vssr/flags/4x3/cx.svg | 15 + .../www/luci-static/vssr/flags/4x3/cy.svg | 6 + .../www/luci-static/vssr/flags/4x3/cz.svg | 12 + .../www/luci-static/vssr/flags/4x3/de.svg | 5 + .../www/luci-static/vssr/flags/4x3/dj.svg | 13 + .../www/luci-static/vssr/flags/4x3/dk.svg | 5 + .../www/luci-static/vssr/flags/4x3/dm.svg | 152 + .../www/luci-static/vssr/flags/4x3/do.svg | 6745 ++ .../www/luci-static/vssr/flags/4x3/dz.svg | 5 + .../www/luci-static/vssr/flags/4x3/ec.svg | 138 + .../www/luci-static/vssr/flags/4x3/ee.svg | 7 + .../www/luci-static/vssr/flags/4x3/eg.svg | 38 + .../www/luci-static/vssr/flags/4x3/eh.svg | 15 + .../www/luci-static/vssr/flags/4x3/er.svg | 8 + .../www/luci-static/vssr/flags/4x3/es-ca.svg | 4 + .../www/luci-static/vssr/flags/4x3/es.svg | 544 + .../www/luci-static/vssr/flags/4x3/et.svg | 14 + .../www/luci-static/vssr/flags/4x3/eu.svg | 28 + .../www/luci-static/vssr/flags/4x3/fi.svg | 5 + .../www/luci-static/vssr/flags/4x3/fj.svg | 122 + .../www/luci-static/vssr/flags/4x3/fk.svg | 90 + .../www/luci-static/vssr/flags/4x3/fm.svg | 11 + .../www/luci-static/vssr/flags/4x3/fo.svg | 12 + .../www/luci-static/vssr/flags/4x3/fr.svg | 7 + .../www/luci-static/vssr/flags/4x3/ga.svg | 7 + .../www/luci-static/vssr/flags/4x3/gb-eng.svg | 5 + .../www/luci-static/vssr/flags/4x3/gb-nir.svg | 132 + .../www/luci-static/vssr/flags/4x3/gb-sct.svg | 4 + .../www/luci-static/vssr/flags/4x3/gb-wls.svg | 9 + .../www/luci-static/vssr/flags/4x3/gb.svg | 7 + .../www/luci-static/vssr/flags/4x3/gd.svg | 27 + .../www/luci-static/vssr/flags/4x3/ge.svg | 6 + .../www/luci-static/vssr/flags/4x3/gf.svg | 7 + .../www/luci-static/vssr/flags/4x3/gg.svg | 9 + .../www/luci-static/vssr/flags/4x3/gh.svg | 6 + .../www/luci-static/vssr/flags/4x3/gi.svg | 32 + .../www/luci-static/vssr/flags/4x3/gl.svg | 4 + .../www/luci-static/vssr/flags/4x3/gm.svg | 14 + .../www/luci-static/vssr/flags/4x3/gn.svg | 7 + .../www/luci-static/vssr/flags/4x3/gp.svg | 7 + .../www/luci-static/vssr/flags/4x3/gq.svg | 23 + .../www/luci-static/vssr/flags/4x3/gr.svg | 16 + .../www/luci-static/vssr/flags/4x3/gs.svg | 201 + .../www/luci-static/vssr/flags/4x3/gt.svg | 204 + .../www/luci-static/vssr/flags/4x3/gu.svg | 39 + .../www/luci-static/vssr/flags/4x3/gw.svg | 13 + .../www/luci-static/vssr/flags/4x3/gy.svg | 9 + .../www/luci-static/vssr/flags/4x3/hk.svg | 30 + .../www/luci-static/vssr/flags/4x3/hm.svg | 9 + .../www/luci-static/vssr/flags/4x3/hn.svg | 18 + .../www/luci-static/vssr/flags/4x3/hr.svg | 58 + .../www/luci-static/vssr/flags/4x3/ht.svg | 116 + .../www/luci-static/vssr/flags/4x3/hu.svg | 7 + .../www/luci-static/vssr/flags/4x3/id.svg | 6 + .../www/luci-static/vssr/flags/4x3/ie.svg | 7 + .../www/luci-static/vssr/flags/4x3/il.svg | 14 + .../www/luci-static/vssr/flags/4x3/im.svg | 36 + .../www/luci-static/vssr/flags/4x3/in.svg | 25 + .../www/luci-static/vssr/flags/4x3/io.svg | 138 + .../www/luci-static/vssr/flags/4x3/iq.svg | 10 + .../www/luci-static/vssr/flags/4x3/ir.svg | 219 + .../www/luci-static/vssr/flags/4x3/is.svg | 12 + .../www/luci-static/vssr/flags/4x3/it.svg | 7 + .../www/luci-static/vssr/flags/4x3/je.svg | 29 + .../www/luci-static/vssr/flags/4x3/jm.svg | 8 + .../www/luci-static/vssr/flags/4x3/jo.svg | 16 + .../www/luci-static/vssr/flags/4x3/jp.svg | 11 + .../www/luci-static/vssr/flags/4x3/ke.svg | 23 + .../www/luci-static/vssr/flags/4x3/kg.svg | 15 + .../www/luci-static/vssr/flags/4x3/kh.svg | 61 + .../www/luci-static/vssr/flags/4x3/ki.svg | 36 + .../www/luci-static/vssr/flags/4x3/km.svg | 16 + .../www/luci-static/vssr/flags/4x3/kn.svg | 14 + .../www/luci-static/vssr/flags/4x3/kp.svg | 15 + .../www/luci-static/vssr/flags/4x3/kr.svg | 24 + .../www/luci-static/vssr/flags/4x3/kw.svg | 13 + .../www/luci-static/vssr/flags/4x3/ky.svg | 63 + .../www/luci-static/vssr/flags/4x3/kz.svg | 23 + .../www/luci-static/vssr/flags/4x3/la.svg | 12 + .../www/luci-static/vssr/flags/4x3/lb.svg | 15 + .../www/luci-static/vssr/flags/4x3/lc.svg | 8 + .../www/luci-static/vssr/flags/4x3/li.svg | 43 + .../www/luci-static/vssr/flags/4x3/lk.svg | 22 + .../www/luci-static/vssr/flags/4x3/lr.svg | 14 + .../www/luci-static/vssr/flags/4x3/ls.svg | 8 + .../www/luci-static/vssr/flags/4x3/lt.svg | 7 + .../www/luci-static/vssr/flags/4x3/lu.svg | 5 + .../www/luci-static/vssr/flags/4x3/lv.svg | 6 + .../www/luci-static/vssr/flags/4x3/ly.svg | 13 + .../www/luci-static/vssr/flags/4x3/ma.svg | 4 + .../www/luci-static/vssr/flags/4x3/mc.svg | 6 + .../www/luci-static/vssr/flags/4x3/md.svg | 70 + .../www/luci-static/vssr/flags/4x3/me.svg | 116 + .../www/luci-static/vssr/flags/4x3/mf.svg | 7 + .../www/luci-static/vssr/flags/4x3/mg.svg | 7 + .../www/luci-static/vssr/flags/4x3/mh.svg | 7 + .../www/luci-static/vssr/flags/4x3/mk.svg | 5 + .../www/luci-static/vssr/flags/4x3/ml.svg | 7 + .../www/luci-static/vssr/flags/4x3/mm.svg | 16 + .../www/luci-static/vssr/flags/4x3/mn.svg | 13 + .../www/luci-static/vssr/flags/4x3/mo.svg | 9 + .../www/luci-static/vssr/flags/4x3/mp.svg | 86 + .../www/luci-static/vssr/flags/4x3/mq.svg | 7 + .../www/luci-static/vssr/flags/4x3/mr.svg | 6 + .../www/luci-static/vssr/flags/4x3/ms.svg | 78 + .../www/luci-static/vssr/flags/4x3/mt.svg | 49 + .../www/luci-static/vssr/flags/4x3/mu.svg | 8 + .../www/luci-static/vssr/flags/4x3/mv.svg | 6 + .../www/luci-static/vssr/flags/4x3/mw.svg | 10 + .../www/luci-static/vssr/flags/4x3/mx.svg | 382 + .../www/luci-static/vssr/flags/4x3/my.svg | 15 + .../www/luci-static/vssr/flags/4x3/mz.svg | 21 + .../www/luci-static/vssr/flags/4x3/na.svg | 16 + .../www/luci-static/vssr/flags/4x3/nc.svg | 14 + .../www/luci-static/vssr/flags/4x3/ne.svg | 6 + .../www/luci-static/vssr/flags/4x3/nf.svg | 9 + .../www/luci-static/vssr/flags/4x3/ng.svg | 6 + .../www/luci-static/vssr/flags/4x3/ni.svg | 129 + .../www/luci-static/vssr/flags/4x3/nl.svg | 5 + .../www/luci-static/vssr/flags/4x3/no.svg | 7 + .../www/luci-static/vssr/flags/4x3/np.svg | 14 + .../www/luci-static/vssr/flags/4x3/nr.svg | 12 + .../www/luci-static/vssr/flags/4x3/nu.svg | 26 + .../www/luci-static/vssr/flags/4x3/nz.svg | 41 + .../www/luci-static/vssr/flags/4x3/om.svg | 115 + .../www/luci-static/vssr/flags/4x3/pa.svg | 14 + .../www/luci-static/vssr/flags/4x3/pe.svg | 244 + .../www/luci-static/vssr/flags/4x3/pf.svg | 19 + .../www/luci-static/vssr/flags/4x3/pg.svg | 9 + .../www/luci-static/vssr/flags/4x3/ph.svg | 9 + .../www/luci-static/vssr/flags/4x3/pk.svg | 15 + .../www/luci-static/vssr/flags/4x3/pl.svg | 6 + .../www/luci-static/vssr/flags/4x3/pm.svg | 7 + .../www/luci-static/vssr/flags/4x3/pn.svg | 62 + .../www/luci-static/vssr/flags/4x3/pr.svg | 13 + .../www/luci-static/vssr/flags/4x3/ps.svg | 15 + .../www/luci-static/vssr/flags/4x3/pt.svg | 57 + .../www/luci-static/vssr/flags/4x3/pw.svg | 11 + .../www/luci-static/vssr/flags/4x3/py.svg | 157 + .../www/luci-static/vssr/flags/4x3/qa.svg | 4 + .../www/luci-static/vssr/flags/4x3/re.svg | 7 + .../www/luci-static/vssr/flags/4x3/ro.svg | 7 + .../www/luci-static/vssr/flags/4x3/rs.svg | 292 + .../www/luci-static/vssr/flags/4x3/ru.svg | 7 + .../www/luci-static/vssr/flags/4x3/rw.svg | 13 + .../www/luci-static/vssr/flags/4x3/sa.svg | 26 + .../www/luci-static/vssr/flags/4x3/sb.svg | 13 + .../www/luci-static/vssr/flags/4x3/sc.svg | 14 + .../www/luci-static/vssr/flags/4x3/sd.svg | 13 + .../www/luci-static/vssr/flags/4x3/se.svg | 16 + .../www/luci-static/vssr/flags/4x3/sg.svg | 13 + .../www/luci-static/vssr/flags/4x3/sh.svg | 74 + .../www/luci-static/vssr/flags/4x3/si.svg | 18 + .../www/luci-static/vssr/flags/4x3/sj.svg | 7 + .../www/luci-static/vssr/flags/4x3/sk.svg | 9 + .../www/luci-static/vssr/flags/4x3/sl.svg | 7 + .../www/luci-static/vssr/flags/4x3/sm.svg | 91 + .../www/luci-static/vssr/flags/4x3/sn.svg | 8 + .../www/luci-static/vssr/flags/4x3/so.svg | 11 + .../www/luci-static/vssr/flags/4x3/sr.svg | 6 + .../www/luci-static/vssr/flags/4x3/ss.svg | 8 + .../www/luci-static/vssr/flags/4x3/st.svg | 16 + .../www/luci-static/vssr/flags/4x3/sv.svg | 594 + .../www/luci-static/vssr/flags/4x3/sx.svg | 56 + .../www/luci-static/vssr/flags/4x3/sy.svg | 6 + .../www/luci-static/vssr/flags/4x3/sz.svg | 45 + .../www/luci-static/vssr/flags/4x3/tc.svg | 67 + .../www/luci-static/vssr/flags/4x3/td.svg | 7 + .../www/luci-static/vssr/flags/4x3/tf.svg | 15 + .../www/luci-static/vssr/flags/4x3/tg.svg | 14 + .../www/luci-static/vssr/flags/4x3/th.svg | 7 + .../www/luci-static/vssr/flags/4x3/tj.svg | 22 + .../www/luci-static/vssr/flags/4x3/tk.svg | 5 + .../www/luci-static/vssr/flags/4x3/tl.svg | 13 + .../www/luci-static/vssr/flags/4x3/tm.svg | 206 + .../www/luci-static/vssr/flags/4x3/tn.svg | 13 + .../www/luci-static/vssr/flags/4x3/to.svg | 10 + .../www/luci-static/vssr/flags/4x3/tr.svg | 8 + .../www/luci-static/vssr/flags/4x3/tt.svg | 5 + .../www/luci-static/vssr/flags/4x3/tv.svg | 16 + .../www/luci-static/vssr/flags/4x3/tw.svg | 14 + .../www/luci-static/vssr/flags/4x3/tz.svg | 13 + .../www/luci-static/vssr/flags/4x3/ua.svg | 6 + .../www/luci-static/vssr/flags/4x3/ug.svg | 30 + .../www/luci-static/vssr/flags/4x3/um.svg | 15 + .../www/luci-static/vssr/flags/4x3/un.svg | 16 + .../www/luci-static/vssr/flags/4x3/us.svg | 10 + .../www/luci-static/vssr/flags/4x3/uy.svg | 28 + .../www/luci-static/vssr/flags/4x3/uz.svg | 30 + .../www/luci-static/vssr/flags/4x3/va.svg | 479 + .../www/luci-static/vssr/flags/4x3/vc.svg | 8 + .../www/luci-static/vssr/flags/4x3/ve.svg | 26 + .../www/luci-static/vssr/flags/4x3/vg.svg | 127 + .../www/luci-static/vssr/flags/4x3/vi.svg | 28 + .../www/luci-static/vssr/flags/4x3/vn.svg | 11 + .../www/luci-static/vssr/flags/4x3/vu.svg | 18 + .../www/luci-static/vssr/flags/4x3/wf.svg | 7 + .../www/luci-static/vssr/flags/4x3/ws.svg | 7 + .../www/luci-static/vssr/flags/4x3/xk.svg | 16 + .../www/luci-static/vssr/flags/4x3/ye.svg | 7 + .../www/luci-static/vssr/flags/4x3/yt.svg | 7 + .../www/luci-static/vssr/flags/4x3/za.svg | 17 + .../www/luci-static/vssr/flags/4x3/zm.svg | 27 + .../www/luci-static/vssr/flags/4x3/zw.svg | 21 + .../root/www/luci-static/vssr/img/client.svg | 12 + .../root/www/luci-static/vssr/img/pdnsd.svg | 25 + .../luci-static/vssr/img/site_icon1_01.jpg | Bin 0 -> 6262 bytes .../luci-static/vssr/img/site_icon1_02.jpg | Bin 0 -> 5206 bytes .../luci-static/vssr/img/site_icon1_03.jpg | Bin 0 -> 4207 bytes .../luci-static/vssr/img/site_icon1_04.jpg | Bin 0 -> 4327 bytes .../www/luci-static/vssr/img/site_icon_01.jpg | Bin 0 -> 8985 bytes .../www/luci-static/vssr/img/site_icon_02.jpg | Bin 0 -> 8602 bytes .../www/luci-static/vssr/img/site_icon_03.jpg | Bin 0 -> 6612 bytes .../www/luci-static/vssr/img/site_icon_04.jpg | Bin 0 -> 7559 bytes .../root/www/luci-static/vssr/img/socks5.svg | 38 + .../root/www/luci-static/vssr/img/udp.svg | 16 + package/ctcgfw/luci-lib-docker/Makefile | 46 + .../ctcgfw/luci-lib-docker/luasrc/docker.lua | 421 + package/ctcgfw/luci-theme-argon/Makefile | 16 + .../htdocs/luci-static/argon/cascade.css | 3065 + .../htdocs/luci-static/argon/cascade.css.map | 1 + .../htdocs/luci-static/argon/cascade.less | 3669 + .../htdocs/luci-static/argon/custom.css | 46 + .../htdocs/luci-static/argon/favicon.ico | Bin 0 -> 2462 bytes .../luci-static/argon/fonts/TypoGraphica.eot | Bin 0 -> 33846 bytes .../luci-static/argon/fonts/TypoGraphica.svg | 1191 + .../luci-static/argon/fonts/TypoGraphica.ttf | Bin 0 -> 33632 bytes .../luci-static/argon/fonts/TypoGraphica.woff | Bin 0 -> 17816 bytes .../htdocs/luci-static/argon/fonts/argon.eot | Bin 0 -> 7284 bytes .../htdocs/luci-static/argon/fonts/argon.svg | 33 + .../htdocs/luci-static/argon/fonts/argon.ttf | Bin 0 -> 7128 bytes .../htdocs/luci-static/argon/fonts/argon.woff | Bin 0 -> 7204 bytes .../htdocs/luci-static/argon/head-icon.jpg | Bin 0 -> 15773 bytes .../luci-static/argon/icons/spinner.svg | 1 + .../htdocs/luci-static/argon/img/bg1.jpg | Bin 0 -> 281579 bytes .../htdocs/luci-static/argon/img/bg2.jpg | Bin 0 -> 397491 bytes .../htdocs/luci-static/argon/img/bg3.jpg | Bin 0 -> 169771 bytes .../htdocs/luci-static/argon/img/bg4.jpg | Bin 0 -> 159265 bytes .../htdocs/luci-static/argon/js/jquery.min.js | 2 + .../htdocs/luci-static/argon/js/script.js | 220 + .../htdocs/luci-static/argon/logo.png | Bin 0 -> 6742 bytes .../luasrc/view/themes/argon/footer.htm | 51 + .../luasrc/view/themes/argon/header.htm | 265 + .../root/etc/uci-defaults/30_luci-theme-argon | 7 + package/ctcgfw/oaf/Makefile | 48 + package/ctcgfw/oaf/src/Makefile | 2 + package/ctcgfw/oaf/src/af_client.c | 277 + package/ctcgfw/oaf/src/af_client.h | 65 + package/ctcgfw/oaf/src/af_client_fs.c | 222 + package/ctcgfw/oaf/src/af_client_fs.h | 7 + package/ctcgfw/oaf/src/af_log.c | 69 + package/ctcgfw/oaf/src/af_log.h | 32 + package/ctcgfw/oaf/src/af_utils.c | 296 + package/ctcgfw/oaf/src/af_utils.h | 13 + package/ctcgfw/oaf/src/app_filter.c | 962 + package/ctcgfw/oaf/src/app_filter.h | 115 + package/ctcgfw/oaf/src/app_filter_config.c | 294 + package/ctcgfw/oaf/src/cJSON.c | 519 + package/ctcgfw/oaf/src/cJSON.h | 94 + package/ctcgfw/oaf/src/regexp.c | 302 + package/ctcgfw/open-app-filter/Makefile | 47 + .../open-app-filter/files/appfilter.config | 3 + .../open-app-filter/files/appfilter.init | 11 + .../ctcgfw/open-app-filter/files/appfilter.sh | 65 + .../ctcgfw/open-app-filter/files/feature.cfg | 167 + .../ctcgfw/open-app-filter/files/gen_class.sh | 32 + package/ctcgfw/openwrt-chinadns-ng/Makefile | 40 + package/ctcgfw/openwrt-simple-obfs/Makefile | 83 + package/ctcgfw/openwrt-ssocks/Makefile | 51 + package/ctcgfw/openwrt-udpspeeder/Makefile | 57 + package/ctcgfw/openwrt-v2ray-plugin/Makefile | 73 + package/ctcgfw/parted/Makefile | 49 + package/ctcgfw/port-mirroring/Makefile | 108 + package/ctcgfw/rclone-webui-react/Makefile | 58 + package/ctcgfw/rclone/Makefile | 74 + .../rclone/patches/000-disable-plugins.patch | 22 + package/ctcgfw/tcping/Makefile | 58 + package/jsda/AdGuardHome/Makefile | 76 + package/jsda/AdGuardHome/conf/big_space.yaml | 230 + .../jsda/AdGuardHome/conf/small_flash.yaml | 150 + package/jsda/clash/Makefile | 64 + package/jsda/clash/file/core_version | 1 + package/jsda/cpulimit-ng/.svn/entries | 1 + package/jsda/cpulimit-ng/.svn/format | 1 + ...5249ab85b7f736854b13720614236af95.svn-base | 154 + ...06dc291766b7865b51bf3dac4a1e3ffdf.svn-base | 601 + ...b43bc5c084d5eb04ef6a61b06223a84f8.svn-base | 20 + ...7283be6e6944114df69ca13f8f52bb434.svn-base | 76 + ...5ba6ec8875e3b72738e1b7ef6f79b27d8.svn-base | 94 + ...5d9aec8d579f1c275122c039d0274fd2f.svn-base | 2 + ...0ddbf58512ac7e37d5abe866bf9b2758b.svn-base | 88 + ...e6f0b946a5c3f2abb79b5e3724ef909bc.svn-base | 283 + ...c7cea777dff780ce210a467da64228e2c.svn-base | 143 + ...4a1b0881a70c715488fb183ed9f172b4b.svn-base | 544 + ...7853a6ceb541df6edae8ac0d500efe25f.svn-base | 47 + package/jsda/cpulimit-ng/.svn/wc.db | Bin 0 -> 40960 bytes package/jsda/cpulimit-ng/Makefile | 76 + package/jsda/cpulimit-ng/readme-ng.txt | 2 + package/jsda/cpulimit-ng/src/Makefile | 20 + package/jsda/cpulimit-ng/src/README | 47 + package/jsda/cpulimit-ng/src/cpulimit.c | 601 + package/jsda/cpulimit-ng/src/list.c | 154 + package/jsda/cpulimit-ng/src/list.h | 143 + package/jsda/cpulimit-ng/src/process.c | 283 + package/jsda/cpulimit-ng/src/process.h | 88 + package/jsda/cpulimit-ng/src/procutils.c | 544 + package/jsda/cpulimit-ng/src/procutils.h | 94 + package/jsda/cpulimit/Makefile | 33 + package/jsda/cpulimit/src/Makefile | 49 + package/jsda/cpulimit/src/cpulimit.c | 560 + package/jsda/cpulimit/src/list.c | 146 + package/jsda/cpulimit/src/list.h | 138 + package/jsda/cpulimit/src/memrchr.c | 39 + package/jsda/cpulimit/src/process_group.c | 205 + package/jsda/cpulimit/src/process_group.h | 54 + package/jsda/cpulimit/src/process_iterator.c | 55 + package/jsda/cpulimit/src/process_iterator.h | 97 + .../cpulimit/src/process_iterator_apple.c | 154 + .../cpulimit/src/process_iterator_freebsd.c | 111 + .../cpulimit/src/process_iterator_linux.c | 188 + .../cpulimit/src/process_iterator_solaris.c | 118 + package/jsda/dnscrypt-proxy-full/Makefile | 73 + package/jsda/dvb/dvb-firmware/Makefile | 40 + .../dvb-firmware/src/dvb-demod-mn88472-02.fw | Bin 0 -> 2012 bytes .../dvb-firmware/src/dvb-demod-mn88473-01.fw | Bin 0 -> 2271 bytes .../dvb-firmware/src/dvb-demod-si2168-01.fw | Bin 0 -> 2720 bytes .../dvb-firmware/src/dvb-demod-si2168-02.fw | Bin 0 -> 2728 bytes .../src/dvb-demod-si2168-a20-01.fw | Bin 0 -> 28656 bytes .../src/dvb-demod-si2168-a30-01.fw | Bin 0 -> 17576 bytes .../src/dvb-demod-si2168-b40-01.fw | Bin 0 -> 15827 bytes .../src/dvb-demod-si2168-d60-01.fw | Bin 0 -> 3349 bytes .../src/dvb-demod-si2183-b60-01.fw | Bin 0 -> 3349 bytes .../dvb/dvb-firmware/src/dvb-fe-ds3000.fw | Bin 0 -> 8192 bytes .../src/dvb-tuner-si2141-a10-01.fw | Bin 0 -> 1666 bytes .../src/dvb-tuner-si2158-a20-01.fw | Bin 0 -> 5015 bytes .../dvb/dvb-firmware/src/dvb-usb-dw2101.fw | Bin 0 -> 8192 bytes .../dvb/dvb-firmware/src/dvb-usb-dw2102.fw | Bin 0 -> 8192 bytes .../dvb/dvb-firmware/src/dvb-usb-dw2104.fw | Bin 0 -> 8192 bytes .../dvb/dvb-firmware/src/dvb-usb-dw3101.fw | Bin 0 -> 8192 bytes .../src/dvb-usb-tbsqbox-id5521.fw | Bin 0 -> 8192 bytes package/jsda/dvb/libdvbcsa/Makefile | 57 + package/jsda/fcgiwrap/Makefile | 45 + package/jsda/fcgiwrap/files/fcgiwrap.init | 62 + package/jsda/fcgiwrap/src/fcgiwrap.c | 901 + .../jsda/luci-app-advancedsetting/Makefile | 15 + .../luasrc/controller/advancedsetting.lua | 13 + .../luasrc/model/cbi/advancedsetting.lua | 75 + .../po/zh-cn/advancedsetting.po | 21 + .../root/etc/config/advancedsetting | 1 + package/jsda/luci-app-aliddns/Makefile | 84 + .../files/luci/controller/aliddns.lua | 4 + .../files/luci/i18n/aliddns.zh-cn.po | 44 + .../files/luci/model/cbi/aliddns.lua | 56 + .../files/root/etc/config/aliddns | 4 + .../files/root/etc/init.d/aliddns | 64 + .../files/root/etc/uci-defaults/luci-aliddns | 10 + .../files/root/usr/sbin/aliddns | 164 + .../luci-app-aliddns/tools/po2lmo/Makefile | 12 + .../tools/po2lmo/src/po2lmo.c | 247 + .../tools/po2lmo/src/template_lmo.c | 328 + .../tools/po2lmo/src/template_lmo.h | 92 + package/jsda/luci-app-brook/LICENSE | 622 + package/jsda/luci-app-brook/Makefile | 114 + package/jsda/luci-app-brook/README.md | 108 + .../files/luci/controller/brook.lua | 110 + .../files/luci/i18n/brook.zh-cn.po | 155 + .../luci/model/cbi/brook/client-config.lua | 44 + .../files/luci/model/cbi/brook/client.lua | 106 + .../luci/model/cbi/brook/gfwlist-custom.lua | 23 + .../files/luci/model/cbi/brook/status.lua | 118 + .../files/luci/view/brook/refresh.htm | 38 + .../files/root/etc/china_ip.txt | 7689 ++ .../files/root/etc/config/brook | 15 + .../root/etc/dnsmasq.brook/custom_list.conf | 2 + .../root/etc/dnsmasq.brook/gfw_list.conf | 9163 ++ .../files/root/etc/init.d/brook | 228 + .../files/root/etc/uci-defaults/luci-brook | 17 + .../files/root/usr/bin/brook-ad | 5 + .../files/root/usr/bin/brook-gfw | 28 + .../jsda/luci-app-brook/tools/po2lmo/Makefile | 12 + .../luci-app-brook/tools/po2lmo/src/po2lmo.c | 247 + .../tools/po2lmo/src/template_lmo.c | 328 + .../tools/po2lmo/src/template_lmo.h | 92 + package/jsda/luci-app-cd8021x/.gitattributes | 8 + package/jsda/luci-app-cd8021x/.gitignore | 9 + package/jsda/luci-app-cd8021x/LICENSE | 674 + package/jsda/luci-app-cd8021x/Makefile | 53 + package/jsda/luci-app-cd8021x/README.md | 46 + package/jsda/luci-app-cd8021x/README_zh.md | 46 + .../files/root/etc/config/cd8021x | 5 + .../files/root/etc/init.d/cd8021x | 55 + .../usr/lib/lua/luci/controller/cd8021x.lua | 8 + .../usr/lib/lua/luci/i18n/cd8021x.zh-cn.po | 14 + .../usr/lib/lua/luci/model/cbi/cd8021x.lua | 41 + .../jsda/luci-app-cd8021x/screenshot_en.png | Bin 0 -> 14612 bytes .../jsda/luci-app-cd8021x/screenshot_zh.png | Bin 0 -> 14692 bytes .../luci-app-cd8021x/tool/po2lmo/Makefile | 13 + .../luci-app-cd8021x/tool/po2lmo/src/po2lmo.c | 248 + .../tool/po2lmo/src/template_lmo.c | 329 + .../tool/po2lmo/src/template_lmo.h | 93 + package/jsda/luci-app-cifs/Makefile | 15 + .../luci-app-cifs/luasrc/controller/cifs.lua | 16 + .../luci-app-cifs/luasrc/model/cbi/cifs.lua | 109 + package/jsda/luci-app-cifs/po/zh-cn/cifs.po | 41 + .../jsda/luci-app-cifs/root/etc/config/cifs | 8 + .../jsda/luci-app-cifs/root/etc/init.d/cifs | 184 + .../luci-app-cifs/root/uci-defaults/luci-cifs | 14 + package/jsda/luci-app-clash/Makefile | 152 + package/jsda/luci-app-clash/luasrc/clash.lua | 244 + .../luasrc/controller/clash.lua | 378 + .../luasrc/model/cbi/clash/actconfig.lua | 69 + .../luasrc/model/cbi/clash/client.lua | 50 + .../luasrc/model/cbi/clash/config.lua | 365 + .../luasrc/model/cbi/clash/create.lua | 248 + .../luasrc/model/cbi/clash/dns.lua | 102 + .../luasrc/model/cbi/clash/game-rule.lua | 64 + .../luasrc/model/cbi/clash/game-settings.lua | 179 + .../luasrc/model/cbi/clash/geoip.lua | 141 + .../luasrc/model/cbi/clash/groups.lua | 75 + .../luasrc/model/cbi/clash/import.lua | 141 + .../luasrc/model/cbi/clash/list.lua | 59 + .../luasrc/model/cbi/clash/log.lua | 50 + .../luasrc/model/cbi/clash/overview.lua | 13 + .../luasrc/model/cbi/clash/port.lua | 96 + .../model/cbi/clash/provider-config.lua | 140 + .../luasrc/model/cbi/clash/servers-config.lua | 277 + .../luasrc/model/cbi/clash/update.lua | 62 + .../luasrc/view/clash/clash_dvalue.htm | 9 + .../luasrc/view/clash/clash_upload.htm | 6 + .../luci-app-clash/luasrc/view/clash/conf.htm | 23 + .../luasrc/view/clash/core_check.htm | 76 + .../luasrc/view/clash/game_rule.htm | 38 + .../luasrc/view/clash/geoip.htm | 77 + .../luci-app-clash/luasrc/view/clash/list.htm | 31 + .../luasrc/view/clash/other_button.htm | 7 + .../luci-app-clash/luasrc/view/clash/ping.htm | 5 + .../luasrc/view/clash/start_stop.htm | 25 + .../luasrc/view/clash/status.htm | 332 + .../luasrc/view/clash/status_log.htm | 26 + .../luasrc/view/clash/tvalue.htm | 6 + .../luasrc/view/clash/update.htm | 240 + package/jsda/luci-app-clash/po/zh-cn/clash.po | 939 + .../root/etc/clash/Country.mmdb | Bin 0 -> 3921743 bytes .../jsda/luci-app-clash/root/etc/config/clash | 53 + .../jsda/luci-app-clash/root/etc/init.d/clash | 689 + .../share/clash/check_clashr_core_version.sh | 11 + .../clash/check_clashtun_core_version.sh | 12 + .../usr/share/clash/check_core_version.sh | 11 + .../usr/share/clash/check_luci_version.sh | 11 + .../root/usr/share/clash/clash-watchdog.sh | 35 + .../root/usr/share/clash/clash.sh | 66 + .../root/usr/share/clash/clash.txt | 1 + .../root/usr/share/clash/clash_game_rule.sh | 78 + .../root/usr/share/clash/clash_real.txt | 1 + .../root/usr/share/clash/core_download.sh | 219 + .../root/usr/share/clash/cuslist.sh | 11 + .../root/usr/share/clash/custom_rule.yaml | 1538 + .../img/33343e6117c37aaef8886179007ba6b5.png | Bin 0 -> 6115 bytes .../root/usr/share/clash/dashboard/index.html | 12 + .../js/1.bundle.0bddb85299f970595cb5.min.js | 2 + .../js/bundle.0bddb85299f970595cb5.min.js | 1 + .../dashboard/main.0bddb85299f970595cb5.css | 27 + .../root/usr/share/clash/dns.yaml | 32 + .../root/usr/share/clash/game-groups.sh | 31 + .../root/usr/share/clash/game.sh | 70 + .../root/usr/share/clash/geoip.sh | 26 + .../root/usr/share/clash/groups.sh | 31 + .../root/usr/share/clash/list.sh | 68 + .../root/usr/share/clash/load.sh | 656 + .../root/usr/share/clash/load_groups.sh | 170 + .../root/usr/share/clash/logstatus_check | 1 + .../root/usr/share/clash/luci_version | 1 + .../root/usr/share/clash/proxy.sh | 648 + .../root/usr/share/clash/rmlist.sh | 13 + .../root/usr/share/clash/rule.sh | 23 + .../usr/share/clash/rules/g_rules/Steam.rules | 949 + .../root/usr/share/clash/rules/rules.list | 140 + .../root/usr/share/clash/server.list | 81 + .../root/usr/share/clash/tundns.yaml | 22 + .../root/usr/share/clash/update.sh | 968 + .../root/usr/share/clash/update_all.sh | 981 + .../root/usr/share/clash/uplist.sh | 7 + .../root/usr/share/clash/v2ssr.sh | 942 + .../root/usr/share/clash/v2ssr/policygroup | 28 + .../share/clash/v2ssr/v2ssr_custom_rule.yaml | 1534 + .../root/usr/share/clash/yum_change.sh | 201 + .../jsda/luci-app-clash/tools/po2lmo/Makefile | 12 + .../luci-app-clash/tools/po2lmo/src/po2lmo.c | 247 + .../tools/po2lmo/src/template_lmo.c | 328 + .../tools/po2lmo/src/template_lmo.h | 92 + package/jsda/luci-app-cpulimit/Makefile | 14 + .../luasrc/controller/cpulimit.lua | 15 + .../luasrc/model/cbi/cpulimit.lua | 38 + .../luci-app-cpulimit/po/zh-cn/cpulimit.po | 30 + .../root/etc/config/cpulimit | 6 + .../root/etc/init.d/cpulimit | 17 + .../root/etc/uci-defaults/luci-app-cpulimit | 13 + .../root/usr/bin/cpulimit.sh | 35 + package/jsda/luci-app-eqos/LICENSE | 674 + package/jsda/luci-app-eqos/Makefile | 100 + package/jsda/luci-app-eqos/README.md | 32 + package/jsda/luci-app-eqos/README_ZH.md | 32 + package/jsda/luci-app-eqos/files/eqos-cbi.lua | 39 + .../luci-app-eqos/files/eqos-controller.lua | 12 + package/jsda/luci-app-eqos/files/eqos.config | 12 + package/jsda/luci-app-eqos/files/eqos.hotplug | 5 + package/jsda/luci-app-eqos/files/eqos.init | 39 + package/jsda/luci-app-eqos/files/eqos.sh | 60 + .../jsda/luci-app-eqos/files/po/zh-cn/eqos.po | 44 + .../luci-app-eqos/files/uci-defaults-eqos | 9 + package/jsda/luci-app-kcptun/Makefile | 37 + .../luasrc/controller/kcptun.lua | 80 + .../model/cbi/kcptun/servers-detail.lua | 238 + .../luasrc/model/cbi/kcptun/servers.lua | 71 + .../luasrc/model/cbi/kcptun/settings.lua | 82 + .../luci-app-kcptun/luasrc/model/kcptun.lua | 58 + .../luasrc/view/kcptun/log_view.htm | 72 + .../luasrc/view/kcptun/status.htm | 87 + .../luci-app-kcptun/po/templates/kcptun.pot | 413 + .../jsda/luci-app-kcptun/po/zh-cn/kcptun.po | 497 + .../luci-app-kcptun/root/etc/config/kcptun | 17 + .../luci-app-kcptun/root/etc/init.d/kcptun | 230 + .../root/etc/uci-defaults/40_luci-kcptun | 25 + package/jsda/luci-app-koolproxy/Makefile | 95 + package/jsda/luci-app-koolproxy/files/bin/arm | Bin 0 -> 473736 bytes .../jsda/luci-app-koolproxy/files/bin/i386 | Bin 0 -> 605688 bytes .../jsda/luci-app-koolproxy/files/bin/mips | Bin 0 -> 486696 bytes .../jsda/luci-app-koolproxy/files/bin/mipsel | Bin 0 -> 490188 bytes .../jsda/luci-app-koolproxy/files/bin/x86_64 | Bin 0 -> 620220 bytes .../files/etc/adblocklist/adblock | 0 .../files/etc/adblocklist/adblockip | 0 .../files/etc/adblocklist/adbypass | 0 .../files/etc/adblocklist/adbypassip | 0 .../files/etc/config/koolproxy | 18 + .../files/etc/init.d/koolproxy | 475 + .../files/etc/uci-defaults/luci-koolproxy | 17 + .../files/lib/upgrade/keep.d/koolproxy | 3 + .../usr/lib/lua/luci/controller/koolproxy.lua | 8 + .../usr/lib/lua/luci/i18n/koolproxy.zh-cn.lmo | Bin 0 -> 2508 bytes .../lua/luci/model/cbi/koolproxy/global.lua | 375 + .../lua/luci/model/cbi/koolproxy/rss_rule.lua | 36 + .../lib/lua/luci/view/koolproxy/cadvalue.htm | 8 + .../lib/lua/luci/view/koolproxy/caupload.htm | 5 + .../lib/lua/luci/view/koolproxy/dvalue.htm | 3 + .../usr/lib/lua/luci/view/koolproxy/index.htm | 16 + .../files/usr/sbin/adblockplus | 23 + .../files/usr/share/koolproxy/adblock.conf | 0 .../files/usr/share/koolproxy/camanagement | 66 + .../files/usr/share/koolproxy/data/gen_ca.sh | 29 + .../usr/share/koolproxy/data/openssl.cnf | 132 + .../koolproxy/data/rules/easylistchina.txt | 27466 ++++++ .../usr/share/koolproxy/data/rules/fanboy.txt | 21620 +++++ .../usr/share/koolproxy/data/rules/kp.dat | Bin 0 -> 36400 bytes .../usr/share/koolproxy/data/rules/user.txt | 49 + .../usr/share/koolproxy/data/rules/yhosts.txt | 16265 ++++ .../usr/share/koolproxy/data/source.list | 5 + .../files/usr/share/koolproxy/data/user.txt | 49 + .../files/usr/share/koolproxy/dnsmasq.adblock | 4903 + .../usr/share/koolproxy/koolproxy_ipset.conf | 6584 ++ .../files/usr/share/koolproxy/kpupdate | 152 + .../luci-app-koolproxy/koolproxyupdate.sh | 12 + package/jsda/luci-app-macvlan/Makefile | 78 + .../files/luci/controller/macvlan.lua | 12 + .../files/luci/i18n/macvlan.zh-cn.po | 14 + .../files/luci/model/cbi/macvlan/macvlan.lua | 20 + .../files/root/etc/config/macvlan | 0 .../files/root/etc/init.d/macvlan | 59 + .../root/etc/uci-defaults/40_luci-app-macvlan | 11 + package/jsda/luci-app-netdata/Makefile | 16 + .../luasrc/controller/netdata.lua | 9 + .../luci-app-netdata/luasrc/view/netdata.htm | 9 + .../jsda/luci-app-netdata/po/zh-cn/netdata.po | 5 + package/jsda/luci-app-nfs/LICENSE | 622 + package/jsda/luci-app-nfs/Makefile | 89 + .../files/luci/controller/nfs.lua | 18 + .../luci-app-nfs/files/luci/i18n/nfs.zh-cn.po | 59 + .../luci-app-nfs/files/luci/model/cbi/nfs.lua | 79 + .../luci-app-nfs/files/root/etc/config/nfs | 11 + .../luci-app-nfs/files/root/etc/firewall.nfs | 5 + .../luci-app-nfs/files/root/etc/init.d/nfs | 244 + .../files/root/etc/uci-defaults/luci-nfs | 21 + .../jsda/luci-app-nfs/tools/po2lmo/Makefile | 12 + .../luci-app-nfs/tools/po2lmo/src/po2lmo.c | 247 + .../tools/po2lmo/src/template_lmo.c | 328 + .../tools/po2lmo/src/template_lmo.h | 92 + package/jsda/luci-app-ngrokc/Makefile | 54 + .../luci-app-ngrokc/files/etc/config/ngrokc | 15 + .../luci-app-ngrokc/files/etc/init.d/ngrokc | 67 + .../files/etc/uci-defaults/luci-app-ngrokc | 11 + .../usr/lib/lua/luci/controller/ngrokc.lua | 22 + .../lib/lua/luci/model/cbi/ngrokc/detail.lua | 82 + .../lua/luci/model/cbi/ngrokc/overview.lua | 108 + .../lua/luci/view/ngrokc/ngrokc_script.htm | 10 + .../lua/luci/view/ngrokc/overview_enabled.htm | 15 + .../lua/luci/view/ngrokc/overview_value.htm | 8 + .../i18n/zh-cn/ngrokc.zh-cn.po | 71 + .../luci-app-ngrokc/tools/po2lmo/Makefile | 12 + .../luci-app-ngrokc/tools/po2lmo/src/po2lmo | Bin 0 -> 19272 bytes .../luci-app-ngrokc/tools/po2lmo/src/po2lmo.c | 247 + .../tools/po2lmo/src/template_lmo.c | 328 + .../tools/po2lmo/src/template_lmo.h | 92 + package/jsda/luci-app-njitclient/LICENSE | 674 + package/jsda/luci-app-njitclient/Makefile | 46 + package/jsda/luci-app-njitclient/README.md | 14 + .../files/root/etc/config/njitclient | 5 + .../files/root/etc/init.d/njitclient | 42 + .../lib/lua/luci/controller/njitclient.lua | 5 + .../usr/lib/lua/luci/model/cbi/njitclient.lua | 39 + package/jsda/luci-app-oscam/Makefile | 15 + .../luasrc/controller/oscam.lua | 14 + .../luci-app-oscam/luasrc/model/cbi/oscam.lua | 50 + package/jsda/luci-app-oscam/po/zh-cn/oscam.po | 32 + .../jsda/luci-app-oscam/root/etc/config/oscam | 3 + .../root/etc/uci-defaults/luci-oscam | 14 + package/jsda/luci-app-qosv4/Makefile | 49 + .../luci-app-qosv4/files/etc/config/qosv4 | 29 + .../luci-app-qosv4/files/etc/init.d/qosv4 | 16 + .../files/etc/uci-defaults/luci-qosv4 | 10 + .../jsda/luci-app-qosv4/files/usr/bin/qosv4 | 432 + .../usr/lib/lua/luci/controller/qosv4.lua | 17 + .../usr/lib/lua/luci/i18n/qosv4.zh-cn.lmo | Bin 0 -> 2532 bytes .../usr/lib/lua/luci/model/cbi/qosv4.lua | 163 + package/jsda/luci-app-rtorrent/.gitignore | 6 + package/jsda/luci-app-rtorrent/LICENSE | 674 + package/jsda/luci-app-rtorrent/Makefile | 60 + package/jsda/luci-app-rtorrent/README.md | 116 + .../jsda/luci-app-rtorrent/control/conffiles | 3 + .../jsda/luci-app-rtorrent/control/control | 8 + .../jsda/luci-app-rtorrent/control/postinst | 6 + package/jsda/luci-app-rtorrent/control/prerm | 5 + .../luci-app-rtorrent/doc/lua-bencode_license | 26 + .../luci-app-rtorrent/doc/lua-xml-rpc_license | 34 + .../doc/luci-app-rtorrent_license | 14 + .../luci-app-rtorrent/src/etc/config/rtorrent | 0 .../luci-app-rtorrent/src/etc/cookies.txt | 14 + .../luci-app-rtorrent/src/etc/init.d/rtorrent | 17 + .../src/etc/uci-defaults/rtorrent | 6 + .../luci-app-rtorrent/src/root/.rtorrent.rc | 89 + .../src/usr/lib/lua/bencode.lua | 180 + .../usr/lib/lua/luci/controller/rtorrent.lua | 35 + .../lib/lua/luci/model/cbi/rtorrent/add.lua | 74 + .../lua/luci/model/cbi/rtorrent/admin/rss.lua | 48 + .../model/cbi/rtorrent/admin/rtorrent.lua | 126 + .../lua/luci/model/cbi/rtorrent/common.lua | 116 + .../lua/luci/model/cbi/rtorrent/download.lua | 66 + .../lib/lua/luci/model/cbi/rtorrent/main.lua | 288 + .../lua/luci/model/cbi/rtorrent/rss-rule.lua | 52 + .../lib/lua/luci/model/cbi/rtorrent/rss.lua | 39 + .../lua/luci/model/cbi/rtorrent/string.lua | 30 + .../luci/model/cbi/rtorrent/torrent/files.lua | 138 + .../luci/model/cbi/rtorrent/torrent/info.lua | 49 + .../luci/model/cbi/rtorrent/torrent/peers.lua | 118 + .../model/cbi/rtorrent/torrent/trackers.lua | 90 + .../usr/lib/lua/luci/view/rtorrent/button.htm | 3 + .../lua/luci/view/rtorrent/buttonsection.htm | 5 + .../usr/lib/lua/luci/view/rtorrent/empty.htm | 1 + .../usr/lib/lua/luci/view/rtorrent/fvalue.htm | 11 + .../usr/lib/lua/luci/view/rtorrent/list.htm | 51 + .../usr/lib/lua/luci/view/rtorrent/lvalue.htm | 20 + .../lua/luci/view/rtorrent/rss_addrule.htm | 10 + .../lib/lua/luci/view/rtorrent/tabmenu.htm | 9 + .../usr/lib/lua/luci/view/rtorrent/tvalue.htm | 7 + .../src/usr/lib/lua/rss_downloader.lua | 161 + .../src/usr/lib/lua/rtorrent.lua | 103 + .../src/usr/lib/lua/xmlrpc/init.lua | 608 + .../src/usr/lib/lua/xmlrpc/scgi.lua | 76 + .../src/www/cgi-bin/rtorrent | 4 + .../resources/icons/filetypes/7z.png | 1 + .../resources/icons/filetypes/ac3.png | 1 + .../resources/icons/filetypes/app.png | Bin 0 -> 464 bytes .../resources/icons/filetypes/archive.png | Bin 0 -> 386 bytes .../resources/icons/filetypes/arj.png | 1 + .../resources/icons/filetypes/avi.png | 1 + .../resources/icons/filetypes/bat.png | 1 + .../resources/icons/filetypes/bmp.png | 1 + .../resources/icons/filetypes/bz2.png | 1 + .../resources/icons/filetypes/c.png | 1 + .../resources/icons/filetypes/cab.png | 1 + .../resources/icons/filetypes/cgi.png | 1 + .../resources/icons/filetypes/code.png | Bin 0 -> 603 bytes .../resources/icons/filetypes/cpp.png | 1 + .../resources/icons/filetypes/css.png | Bin 0 -> 618 bytes .../resources/icons/filetypes/db.png | Bin 0 -> 579 bytes .../resources/icons/filetypes/dir.png | Bin 0 -> 537 bytes .../resources/icons/filetypes/doc.png | Bin 0 -> 651 bytes .../resources/icons/filetypes/dts.png | 1 + .../resources/icons/filetypes/elf.png | 1 + .../resources/icons/filetypes/exe.png | 1 + .../resources/icons/filetypes/f4v.png | 1 + .../resources/icons/filetypes/file.png | Bin 0 -> 294 bytes .../resources/icons/filetypes/flac.png | 1 + .../resources/icons/filetypes/flash.png | Bin 0 -> 582 bytes .../resources/icons/filetypes/flv.png | 1 + .../resources/icons/filetypes/gif.png | 1 + .../resources/icons/filetypes/gz.png | 1 + .../resources/icons/filetypes/h.png | 1 + .../resources/icons/filetypes/htm.png | 1 + .../resources/icons/filetypes/html.png | Bin 0 -> 734 bytes .../resources/icons/filetypes/image.png | Bin 0 -> 606 bytes .../resources/icons/filetypes/iso.png | 1 + .../resources/icons/filetypes/jar.png | 1 + .../resources/icons/filetypes/java.png | Bin 0 -> 633 bytes .../resources/icons/filetypes/jpeg.png | 1 + .../resources/icons/filetypes/jpg.png | 1 + .../resources/icons/filetypes/linux.png | Bin 0 -> 668 bytes .../resources/icons/filetypes/lua.png | 1 + .../resources/icons/filetypes/mkv.png | 1 + .../resources/icons/filetypes/mov.png | 1 + .../resources/icons/filetypes/mp3.png | 1 + .../resources/icons/filetypes/mp4.png | 1 + .../resources/icons/filetypes/music.png | Bin 0 -> 385 bytes .../resources/icons/filetypes/nfo.png | 1 + .../resources/icons/filetypes/pdf.png | Bin 0 -> 591 bytes .../resources/icons/filetypes/php.png | Bin 0 -> 538 bytes .../resources/icons/filetypes/pl.png | 1 + .../resources/icons/filetypes/png.png | 1 + .../resources/icons/filetypes/ppt.png | Bin 0 -> 588 bytes .../resources/icons/filetypes/psd.png | Bin 0 -> 856 bytes .../resources/icons/filetypes/rar.png | 1 + .../resources/icons/filetypes/script.png | Bin 0 -> 859 bytes .../resources/icons/filetypes/sh.png | 1 + .../resources/icons/filetypes/sqlite.png | 1 + .../resources/icons/filetypes/srt.png | 1 + .../resources/icons/filetypes/tar.png | 1 + .../resources/icons/filetypes/tgz.png | 1 + .../resources/icons/filetypes/txt.png | Bin 0 -> 342 bytes .../resources/icons/filetypes/up.png | Bin 0 -> 3332 bytes .../resources/icons/filetypes/video.png | Bin 0 -> 653 bytes .../resources/icons/filetypes/wma.png | 1 + .../resources/icons/filetypes/wmv.png | 1 + .../resources/icons/filetypes/xls.png | Bin 0 -> 663 bytes .../resources/icons/filetypes/zip.png | 1 + .../resources/icons/unknown_tracker.png | Bin 0 -> 744 bytes package/jsda/luci-app-scutclient/Makefile | 12 + package/jsda/luci-app-scutclient/README.md | 5 + .../luasrc/controller/scutclient.lua | 140 + .../model/cbi/scutclient/scutclient.lua | 92 + .../luasrc/view/scutclient/about.htm | 24 + .../luasrc/view/scutclient/logs.htm | 67 + .../luasrc/view/scutclient/status.htm | 287 + .../root/etc/uci-defaults/99-luci-scutclient | 14 + .../jsda/luci-app-shadowsocksr-alex/Makefile | 43 + .../jsda/luci-app-shadowsocksr-alex/README.md | 98 + .../files/etc/config/ssrr | 17 + .../files/etc/config/ssrrmore | 2 + .../files/etc/init.d/ssrr | 614 + .../files/etc/ssrr/china_route | 8351 ++ .../files/etc/ssrr/shadowsocksr.json | 14 + .../files/etc/ssrr/ssrr_watchdog | 18 + .../files/etc/ssrr/update_chinaroute.sh | 22 + .../files/etc/ssrr/user_local_ip | 6 + .../files/etc/ssrr/user_remote_ip | 7 + .../usr/lib/lua/luci/controller/ssrr.lua | 10 + .../luci/model/cbi/shadowsocksr/general.lua | 221 + .../luci/model/cbi/shadowsocksr/gfwlist.lua | 69 + .../i18n/zh-cn/shadowsocksR.zh-cn.po | 161 + .../tools/po2lmo/Makefile | 12 + .../tools/po2lmo/src/po2lmo | Bin 0 -> 19328 bytes .../tools/po2lmo/src/po2lmo.c | 247 + .../tools/po2lmo/src/template_lmo.c | 328 + .../tools/po2lmo/src/template_lmo.h | 92 + package/jsda/luci-app-smartdns/Makefile | 14 + .../luasrc/controller/smartdns.lua | 83 + .../luasrc/model/cbi/smartdns/smartdns.lua | 329 + .../luasrc/model/cbi/smartdns/upstream.lua | 120 + .../luasrc/model/smartdns.lua | 31 + .../luasrc/view/smartdns/smartdns_status.htm | 41 + .../luci-app-smartdns/po/zh-cn/smartdns.po | 282 + .../root/etc/uci-defaults/50_luci-smartdns | 26 + package/jsda/luci-app-softethervpn5/Makefile | 15 + .../luasrc/controller/softethervpn5.lua | 17 + .../luasrc/model/cbi/softethervpn5/bridge.lua | 26 + .../luasrc/model/cbi/softethervpn5/client.lua | 27 + .../luasrc/model/cbi/softethervpn5/server.lua | 26 + .../model/cbi/softethervpn5/setting.lua | 36 + .../luasrc/model/cbi/softethervpn5/status.lua | 59 + .../po/zh-cn/softethervpn5.po | 44 + .../root/etc/config/softethervpn5 | 6 + .../root/etc/init.d/softethervpn5 | 62 + .../root/etc/uci-defaults/luci-softethervpn5 | 13 + package/jsda/luci-app-speederv2/Makefile | 73 + .../files/luci/controller/speederv2.lua | 23 + .../files/luci/i18n/speederv2.zh-cn.lmo | Bin 0 -> 1272 bytes .../files/luci/i18n/speederv2.zh-cn.po | 134 + .../luci/model/cbi/speederv2/general.lua | 41 + .../model/cbi/speederv2/servers-details.lua | 120 + .../luci/model/cbi/speederv2/servers.lua | 68 + .../files/luci/view/speederv2/dynamiclist.htm | 98 + .../files/luci/view/speederv2/status.htm | 29 + .../files/root/etc/config/speederv2 | 14 + .../files/root/etc/init.d/speederv2 | 117 + .../root/etc/uci-defaults/luci-speederv2 | 25 + .../luci-app-speederv2/tools/po2lmo/Makefile | 12 + .../tools/po2lmo/src/po2lmo.c | 247 + .../tools/po2lmo/src/template_lmo.c | 328 + .../tools/po2lmo/src/template_lmo.h | 92 + package/jsda/luci-app-sysuh3c/Makefile | 15 + .../luasrc/controller/sysuh3c.lua | 5 + .../luasrc/model/cbi/sysuh3c.lua | 56 + package/jsda/luci-app-terminal/Makefile | 16 + .../luasrc/controller/terminal.lua | 9 + .../luasrc/view/terminal.htm | 9 + .../luci-app-terminal/po/zh-cn/terminal.po | 5 + .../luci-app-terminal/root/etc/init.d/ttyd | 26 + package/jsda/luci-app-udp2raw/Makefile | 73 + .../files/luci/controller/udp2raw.lua | 30 + .../files/luci/i18n/udp2raw.zh-cn.lmo | Bin 0 -> 1372 bytes .../files/luci/i18n/udp2raw.zh-cn.po | 120 + .../files/luci/model/cbi/udp2raw/general.lua | 39 + .../model/cbi/udp2raw/servers-details.lua | 92 + .../files/luci/model/cbi/udp2raw/servers.lua | 56 + .../files/luci/view/udp2raw/dynamiclist.htm | 98 + .../files/luci/view/udp2raw/status.htm | 29 + .../files/root/etc/config/udp2raw | 16 + .../files/root/etc/init.d/udp2raw | 156 + .../files/root/etc/init.d/udp2raw.init | 167 + .../files/root/etc/uci-defaults/luci-udp2raw | 29 + .../luci-app-udp2raw/tools/po2lmo/Makefile | 12 + .../tools/po2lmo/src/po2lmo.c | 247 + .../tools/po2lmo/src/template_lmo.c | 328 + .../tools/po2lmo/src/template_lmo.h | 92 + package/jsda/mentohust/Makefile | 71 + package/jsda/minieap/Makefile | 54 + package/jsda/mysql/Makefile | 190 + package/jsda/mysql/conf/my.cnf | 54 + package/jsda/mysql/files/mysqld.init | 32 + .../jsda/mysql/patches/100-fix_hostname.patch | 11 + .../mysql/patches/110-cross_compile.patch | 179 + .../jsda/mysql/patches/120-bison-compat.patch | 3290 + package/jsda/ndpi-netfilter/Makefile | 65 + .../ndpi-netfilter/patches/001-main.patch | 13 + package/jsda/ngrokc/Makefile | 35 + package/jsda/njitclient/Install.html | 61 + .../License/gpl-3.0-standalone.html | 692 + package/jsda/njitclient/License/gpl-3.0.txt | 674 + package/jsda/njitclient/Makefile | 101 + package/jsda/njitclient/Makefile.am | 7 + package/jsda/njitclient/README.md | 50 + package/jsda/njitclient/ReadMe.html | 89 + package/jsda/njitclient/configure.ac | 9 + .../jsda/njitclient/documents/Documents.html | 100 + .../jsda/njitclient/documents/h3c_AES_MD5.md | 98 + .../jsda/njitclient/documents/h3c_AES_MD5.png | Bin 0 -> 45401 bytes package/jsda/njitclient/help | 20 + .../jsda/njitclient/src-gui/gtkgui/AUTHORS | 0 .../jsda/njitclient/src-gui/gtkgui/COPYING | 674 + .../jsda/njitclient/src-gui/gtkgui/ChangeLog | 0 .../jsda/njitclient/src-gui/gtkgui/HACKING | 0 .../njitclient/src-gui/gtkgui/Makefile.am | 12 + package/jsda/njitclient/src-gui/gtkgui/NEWS | 0 package/jsda/njitclient/src-gui/gtkgui/README | 0 .../jsda/njitclient/src-gui/gtkgui/config.c | 24 + .../njitclient/src-gui/gtkgui/configure.ac | 26 + .../jsda/njitclient/src-gui/gtkgui/hello.c | 135 + .../jsda/njitclient/src-gui/gtkgui/hello.h | 10 + .../njitclient/src-gui/gtkgui/m4/.gitignore | 0 .../src-gui/gtkgui/po/Makefile.in.in | 217 + .../njitclient/src-gui/gtkgui/po/POTFILES.in | 1 + .../njitclient/src-gui/gtkgui/po/zh_CN.po | 49 + .../src-gui/gtkgui/tests/Makefile.am | 0 .../src-gui/luci/luci_controller_njit.lua | 5 + package/jsda/njitclient/src-gui/luci/njit.lua | 61 + package/jsda/njitclient/src-gui/luci/readme | 2 + .../njitclient/src-gui/qt4gui/ReadMe.html | 18 + .../src-gui/qt4gui/dialogs/mainDlg.cpp | 263 + .../src-gui/qt4gui/dialogs/mainDlg.h | 52 + .../jsda/njitclient/src-gui/qt4gui/main.cpp | 20 + package/jsda/njitclient/src-gui/qt4gui/main.h | 25 + .../jsda/njitclient/src-gui/qt4gui/qt4gui.pro | 12 + package/jsda/njitclient/src/Makefile.am | 28 + package/jsda/njitclient/src/RefreshIP.py | 59 + package/jsda/njitclient/src/aes.c | 583 + package/jsda/njitclient/src/aes.h | 40 + package/jsda/njitclient/src/auth.c | 727 + package/jsda/njitclient/src/configure.ac | 28 + package/jsda/njitclient/src/debug.h | 35 + .../jsda/njitclient/src/fillmd5-libcrypto.c | 29 + .../jsda/njitclient/src/fillmd5-libgcrypt.c | 29 + package/jsda/njitclient/src/h3c_AES_MD5.c | 152 + package/jsda/njitclient/src/h3c_AES_MD5.h | 7 + package/jsda/njitclient/src/h3c_dict.h | 41 + package/jsda/njitclient/src/ip.c | 44 + package/jsda/njitclient/src/m4/README | 3 + .../jsda/njitclient/src/m4/tcpdump-aclocal.m4 | 1209 + package/jsda/njitclient/src/main.c | 61 + .../njitclient/src/md5-buildin/Makefile.am | 12 + .../njitclient/src/md5-buildin/configure.ac | 12 + package/jsda/njitclient/src/md5-buildin/help | 20 + .../njitclient/src/md5-buildin/md5_dgst.c | 573 + .../jsda/njitclient/src/md5-buildin/md5_one.c | 97 + .../jsda/njitclient/src/md5-buildin/md5test.c | 134 + .../jsda/njitclient/src/md5-buildin/mem_clr.c | 77 + package/jsda/njitclient/src/njit8021xclient.c | 24 + package/jsda/njitclient/src/njit8021xclient.h | 10 + package/jsda/njitclient/src/tests/Makefile | 100 + package/jsda/njitclient/src/tests/ifchk.c | 61 + package/jsda/njitclient/src/tests/ifchk.mk | 17 + package/jsda/njitclient/src/tests/md5test.c | 134 + package/jsda/njitclient/src/tests/md5test.mk | 16 + package/jsda/openvpn-easy-rsa-whisky/Makefile | 47 + .../patches/100-fix_EASYRSA_REQ_CN.patch | 11 + .../patches/101-static_EASYRSA.patch | 20 + package/jsda/openwrt-Pcap_DNSProxy/Makefile | 171 + .../files/configs/WhiteList.txt | 4 + .../files/pcap-dnsproxy.config | 4 + .../files/pcap-dnsproxy.hotplug | 34 + .../files/pcap-dnsproxy.procd.init | 109 + ...-cmake-dependency-scanner-workaround.patch | 41 + package/jsda/openwrt-chinadns/Makefile | 50 + package/jsda/openwrt-dnsforwarder/Makefile | 36 + package/jsda/openwrt-pdnsd-full/Makefile | 61 + .../jsda/openwrt-pdnsd-full/files/pdnsd.conf | 33 + .../jsda/openwrt-shadowvpn-master/.gitignore | 1 + package/jsda/openwrt-shadowvpn-master/LICENSE | 622 + .../jsda/openwrt-shadowvpn-master/Makefile | 62 + .../jsda/openwrt-shadowvpn-master/README.md | 68 + .../files/client_down.sh | 44 + .../files/client_up.sh | 59 + .../files/shadowvpn.config | 12 + .../files/shadowvpn.hotplug | 10 + .../files/shadowvpn.init | 71 + .../patches/000-fix-autoconf.patch | 71 + package/jsda/openwrt-udp2raw/Makefile | 57 + package/jsda/oscam/Config.in | 241 + package/jsda/oscam/Makefile | 158 + package/jsda/oscam/files/oscam-watchdog.sh | 31 + package/jsda/oscam/files/oscam.conf | 48 + package/jsda/oscam/files/oscam.dvbapi | 31 + package/jsda/oscam/files/oscam.init | 45 + package/jsda/oscam/files/oscam.server | 14 + package/jsda/oscam/files/oscam.user | 27 + package/jsda/rtl8192du/.gitignore | 97 + package/jsda/rtl8192du/Makefile | 70 + package/jsda/scutclient/Makefile | 64 + .../jsda/scutclient/files/scutclient.config | 16 + .../jsda/scutclient/files/scutclient.hotplug | 8 + package/jsda/scutclient/files/scutclient.init | 114 + package/jsda/smartdns/Makefile | 69 + package/jsda/smartdns/conf/custom.conf | 79 + package/jsda/sysuh3c/Makefile | 35 + package/jsda/sysuh3c/files/sysuh3c.config | 6 + package/jsda/sysuh3c/files/sysuh3c.defaults | 11 + package/jsda/sysuh3c/files/sysuh3c.init | 43 + package/lienol/brook/Makefile | 71 + package/lienol/dns-forwarder/Makefile | 55 + .../dns-forwarder/files/dns-forwarder.config | 6 + .../dns-forwarder/files/dns-forwarder.init | 46 + package/lienol/dns2socks/Makefile | 66 + package/lienol/luci-app-brook-server/Makefile | 19 + .../luasrc/controller/brook_server.lua | 72 + .../model/cbi/brook_server/api/brook.lua | 338 + .../luasrc/model/cbi/brook_server/config.lua | 32 + .../luasrc/model/cbi/brook_server/index.lua | 66 + .../luasrc/view/brook_server/brook.htm | 169 + .../luasrc/view/brook_server/log.htm | 31 + .../view/brook_server/users_list_status.htm | 23 + .../luasrc/view/brook_server/users_status.htm | 3 + .../po/zh-cn/brook_server.po | 83 + .../root/etc/config/brook_server | 12 + .../root/etc/init.d/brook_server | 64 + .../etc/uci-defaults/luci-app-brook-server | 21 + .../usr/share/brook_server/firewall.include | 25 + .../lienol/luci-app-fileassistant/Makefile | 14 + .../resources/fileassistant/fb.css | 68 + .../luci-static/resources/fileassistant/fb.js | 288 + .../resources/fileassistant/file-icon.png | Bin 0 -> 1098 bytes .../resources/fileassistant/folder-icon.png | Bin 0 -> 1292 bytes .../resources/fileassistant/link-icon.png | Bin 0 -> 1622 bytes .../luasrc/controller/fileassistant.lua | 230 + .../luasrc/view/fileassistant.htm | 20 + package/lienol/luci-app-mia/Makefile | 17 + .../luci-app-mia/luasrc/controller/mia.lua | 17 + .../luci-app-mia/luasrc/model/cbi/mia.lua | 44 + .../luci-app-mia/luasrc/view/mia/index.htm | 17 + .../luci-app-mia/luasrc/view/mia/mia.htm | 3 + package/lienol/luci-app-mia/po/zh-cn/mia.po | 2 + .../lienol/luci-app-mia/root/etc/config/mia | 3 + .../lienol/luci-app-mia/root/etc/init.d/mia | 111 + .../etc/uci-defaults/luci-app-control-mia | 11 + package/lienol/luci-app-passwall/Makefile | 136 + .../luasrc/controller/passwall.lua | 359 + .../luasrc/model/cbi/passwall/acl.lua | 103 + .../luasrc/model/cbi/passwall/api/api.lua | 183 + .../luasrc/model/cbi/passwall/api/brook.lua | 166 + .../api/gen_trojan_client_config_file.lua | 37 + .../api/gen_v2ray_client_config_file.lua | 141 + .../luasrc/model/cbi/passwall/api/kcptun.lua | 207 + .../luasrc/model/cbi/passwall/api/v2ray.lua | 173 + .../luasrc/model/cbi/passwall/auto_switch.lua | 43 + .../luasrc/model/cbi/passwall/balancing.lua | 103 + .../luasrc/model/cbi/passwall/global.lua | 218 + .../luasrc/model/cbi/passwall/log.lua | 3 + .../luasrc/model/cbi/passwall/node_config.lua | 461 + .../luasrc/model/cbi/passwall/node_list.lua | 146 + .../luasrc/model/cbi/passwall/other.lua | 170 + .../luasrc/model/cbi/passwall/rule.lua | 131 + .../luasrc/model/cbi/passwall/rule_list.lua | 83 + .../luasrc/view/passwall/global/status.htm | 433 + .../luasrc/view/passwall/global/status2.htm | 287 + .../luasrc/view/passwall/global/tips.htm | 6 + .../luasrc/view/passwall/haproxy/status.htm | 24 + .../luasrc/view/passwall/log/log.htm | 35 + .../view/passwall/node_list/auto_ping.htm | 3 + .../view/passwall/node_list/link_add_node.htm | 89 + .../view/passwall/node_list/node_list.htm | 267 + .../luasrc/view/passwall/node_list/ping.htm | 11 + .../view/passwall/rule/brook_version.htm | 159 + .../view/passwall/rule/kcptun_version.htm | 175 + .../view/passwall/rule/rule_version.htm | 93 + .../view/passwall/rule/v2ray_version.htm | 175 + .../luci-app-passwall/po/zh-cn/passwall.po | 821 + .../root/etc/config/passwall | 63 + .../etc/config/passwall_rule/blacklist_host | 5 + .../etc/config/passwall_rule/blacklist_ip | 5 + .../root/etc/config/passwall_rule/chnlist | 73618 ++++++++++++++++ .../root/etc/config/passwall_rule/chnroute | 5777 ++ .../etc/config/passwall_rule/gfwlist.conf | 11166 +++ .../root/etc/config/passwall_rule/router | 10 + .../root/etc/config/passwall_rule/user.conf | 0 .../etc/config/passwall_rule/whitelist_host | 2 + .../etc/config/passwall_rule/whitelist_ip | 9 + .../root/etc/config/passwall_show | 0 .../root/etc/init.d/passwall | 21 + .../root/etc/uci-defaults/luci-app-passwall | 14 + .../root/usr/share/passwall/app.sh | 1176 + .../root/usr/share/passwall/iptables.sh | 617 + .../root/usr/share/passwall/monitor.sh | 102 + .../root/usr/share/passwall/rule_update.sh | 181 + .../root/usr/share/passwall/subscription.sh | 577 + .../root/usr/share/passwall/test.sh | 148 + .../lienol/luci-app-ssr-libev-server/Makefile | 18 + .../luasrc/controller/ssr_libev_server.lua | 29 + .../model/cbi/ssr_libev_server/config.lua | 65 + .../model/cbi/ssr_libev_server/index.lua | 61 + .../ssr_libev_server/users_list_status.htm | 23 + .../view/ssr_libev_server/users_status.htm | 3 + .../po/zh-cn/ssr_libev_server.po | 65 + .../root/etc/config/ssr_libev_server | 16 + .../root/etc/init.d/ssr_libev_server | 74 + .../uci-defaults/luci-app-ssr-libev-server | 21 + .../share/ssr_libev_server/firewall.include | 27 + package/lienol/luci-app-timewol/Makefile | 17 + .../luasrc/controller/timewol.lua | 16 + .../luasrc/model/cbi/timewol.lua | 37 + .../luasrc/view/timewol/index.htm | 18 + .../luasrc/view/timewol/timewol.htm | 3 + .../luci-app-timewol/po/zh-cn/timewol.po | 2 + .../luci-app-timewol/root/etc/config/timewol | 3 + .../luci-app-timewol/root/etc/init.d/timewol | 74 + .../etc/uci-defaults/luci-app-control-timewol | 11 + .../lienol/luci-app-trojan-server/Makefile | 17 + .../luasrc/controller/trojan_server.lua | 41 + .../api/gen_trojan_config_file.lua | 40 + .../luasrc/model/cbi/trojan_server/config.lua | 54 + .../luasrc/model/cbi/trojan_server/index.lua | 58 + .../luasrc/view/trojan_server/log.htm | 31 + .../view/trojan_server/users_list_status.htm | 23 + .../view/trojan_server/users_status.htm | 3 + .../po/zh-cn/trojan_server.po | 68 + .../root/etc/config/trojan_server | 13 + .../root/etc/init.d/trojan_server | 61 + .../etc/uci-defaults/luci-app-trojan-server | 21 + .../usr/share/trojan_server/firewall.include | 25 + package/lienol/luci-app-v2ray-server/Makefile | 19 + .../luasrc/controller/v2ray_server.lua | 66 + .../cbi/v2ray_server/api/genv2rayconfig.lua | 91 + .../model/cbi/v2ray_server/api/v2ray.lua | 328 + .../luasrc/model/cbi/v2ray_server/config.lua | 220 + .../luasrc/model/cbi/v2ray_server/index.lua | 105 + .../luasrc/view/v2ray_server/log.htm | 31 + .../view/v2ray_server/users_list_status.htm | 23 + .../luasrc/view/v2ray_server/users_status.htm | 3 + .../luasrc/view/v2ray_server/v2ray.htm | 182 + .../po/zh-cn/v2ray_server.po | 137 + .../root/etc/config/v2ray_server | 45 + .../root/etc/init.d/v2ray_server | 59 + .../etc/uci-defaults/luci-app-v2ray-server | 21 + .../usr/share/v2ray_server/firewall.include | 29 + .../lienol/luci-app-webrestriction/Makefile | 17 + .../luasrc/controller/webrestriction.lua | 16 + .../luasrc/model/cbi/webrestriction.lua | 30 + .../luasrc/view/webrestriction/index.htm | 18 + .../view/webrestriction/webrestriction.htm | 3 + .../po/zh-cn/webrestriction.po | 2 + .../root/etc/config/webrestriction | 5 + .../root/etc/init.d/webrestriction | 86 + .../luci-app-control-webrestriction | 11 + package/lienol/luci-app-weburl/Makefile | 18 + .../luasrc/controller/weburl.lua | 16 + .../luasrc/model/cbi/weburl.lua | 36 + .../luasrc/view/weburl/index.htm | 18 + .../luasrc/view/weburl/weburl.htm | 3 + .../lienol/luci-app-weburl/po/zh-cn/weburl.po | 2 + .../luci-app-weburl/root/etc/config/weburl | 22 + .../luci-app-weburl/root/etc/init.d/weburl | 88 + .../etc/uci-defaults/luci-app-control-weburl | 11 + package/lienol/luci-theme-argon-mc/Makefile | 16 + .../luci-static/argon_mc1/css/purecss.css | 7 + .../luci-static/argon_mc1/css/style.css | 3600 + .../htdocs/luci-static/argon_mc1/favicon.ico | Bin 0 -> 2462 bytes .../argon_mc1/fonts/TypoGraphica.eot | Bin 0 -> 33846 bytes .../argon_mc1/fonts/TypoGraphica.svg | 1191 + .../argon_mc1/fonts/TypoGraphica.ttf | Bin 0 -> 33632 bytes .../argon_mc1/fonts/TypoGraphica.woff | Bin 0 -> 17816 bytes .../luci-static/argon_mc1/fonts/font.eot | Bin 0 -> 1912 bytes .../luci-static/argon_mc1/fonts/font.svg | 16 + .../luci-static/argon_mc1/fonts/font.ttf | Bin 0 -> 1748 bytes .../luci-static/argon_mc1/fonts/font.woff | Bin 0 -> 1824 bytes .../luci-static/argon_mc1/fonts/icomoon.eot | Bin 0 -> 1476 bytes .../luci-static/argon_mc1/fonts/icomoon.svg | 12 + .../luci-static/argon_mc1/fonts/icomoon.ttf | Bin 0 -> 1312 bytes .../luci-static/argon_mc1/fonts/icomoon.woff | Bin 0 -> 1388 bytes .../luci-static/argon_mc1/fonts/ssr.eot | Bin 0 -> 7232 bytes .../luci-static/argon_mc1/fonts/ssr.svg | 25 + .../luci-static/argon_mc1/fonts/ssr.ttf | Bin 0 -> 7084 bytes .../luci-static/argon_mc1/fonts/ssr.woff | Bin 0 -> 7160 bytes .../htdocs/luci-static/argon_mc1/img/bg1.jpg | Bin 0 -> 76341 bytes .../htdocs/luci-static/argon_mc1/img/bg2.jpg | Bin 0 -> 169771 bytes .../htdocs/luci-static/argon_mc1/img/bg3.jpg | Bin 0 -> 159265 bytes .../luci-static/argon_mc1/js/jquery.min.js | 2 + .../htdocs/luci-static/argon_mc1/js/script.js | 288 + .../htdocs/luci-static/argon_mc1/logo.png | Bin 0 -> 6742 bytes .../luci-static/argon_mc2/css/style.css | 2577 + .../htdocs/luci-static/argon_mc2/favicon.ico | Bin 0 -> 2462 bytes .../luci-static/argon_mc2/fonts/font.eot | Bin 0 -> 1912 bytes .../luci-static/argon_mc2/fonts/font.svg | 16 + .../luci-static/argon_mc2/fonts/font.ttf | Bin 0 -> 1748 bytes .../luci-static/argon_mc2/fonts/font.woff | Bin 0 -> 1824 bytes .../luci-static/argon_mc2/fonts/ssr.eot | Bin 0 -> 7232 bytes .../luci-static/argon_mc2/fonts/ssr.svg | 25 + .../luci-static/argon_mc2/fonts/ssr.ttf | Bin 0 -> 7084 bytes .../luci-static/argon_mc2/fonts/ssr.woff | Bin 0 -> 7160 bytes .../luci-static/argon_mc2/js/jquery.min.js | 6 + .../htdocs/luci-static/argon_mc2/js/script.js | 251 + .../htdocs/luci-static/argon_mc2/logo.png | Bin 0 -> 2224 bytes .../luasrc/view/themes/argon_mc1/footer.htm | 63 + .../luasrc/view/themes/argon_mc1/header.htm | 301 + .../luasrc/view/themes/argon_mc2/footer.htm | 51 + .../luasrc/view/themes/argon_mc2/header.htm | 257 + .../etc/uci-defaults/30_luci-theme-argon-mc | 7 + package/lienol/luci-theme-argon-mod/Makefile | 16 + .../luci-static/argon_dark/css/style.css | 2577 + .../htdocs/luci-static/argon_dark/favicon.ico | Bin 0 -> 2462 bytes .../luci-static/argon_dark/fonts/font.eot | Bin 0 -> 1912 bytes .../luci-static/argon_dark/fonts/font.svg | 16 + .../luci-static/argon_dark/fonts/font.ttf | Bin 0 -> 1748 bytes .../luci-static/argon_dark/fonts/font.woff | Bin 0 -> 1824 bytes .../luci-static/argon_dark/fonts/ssr.eot | Bin 0 -> 7232 bytes .../luci-static/argon_dark/fonts/ssr.svg | 25 + .../luci-static/argon_dark/fonts/ssr.ttf | Bin 0 -> 7084 bytes .../luci-static/argon_dark/fonts/ssr.woff | Bin 0 -> 7160 bytes .../luci-static/argon_dark/js/jquery.min.js | 6 + .../luci-static/argon_dark/js/script.js | 251 + .../htdocs/luci-static/argon_dark/logo.png | Bin 0 -> 7138 bytes .../argon_dark_purple/css/style.css | 2574 + .../luci-static/argon_dark_purple/favicon.ico | Bin 0 -> 2462 bytes .../argon_dark_purple/fonts/font.eot | Bin 0 -> 1912 bytes .../argon_dark_purple/fonts/font.svg | 16 + .../argon_dark_purple/fonts/font.ttf | Bin 0 -> 1748 bytes .../argon_dark_purple/fonts/font.woff | Bin 0 -> 1824 bytes .../argon_dark_purple/fonts/ssr.eot | Bin 0 -> 7232 bytes .../argon_dark_purple/fonts/ssr.svg | 25 + .../argon_dark_purple/fonts/ssr.ttf | Bin 0 -> 7084 bytes .../argon_dark_purple/fonts/ssr.woff | Bin 0 -> 7160 bytes .../argon_dark_purple/js/jquery.min.js | 6 + .../argon_dark_purple/js/script.js | 251 + .../luci-static/argon_dark_purple/logo.png | Bin 0 -> 7138 bytes .../luci-static/argon_light/css/purecss.css | 7 + .../luci-static/argon_light/css/style.css | 3597 + .../luci-static/argon_light/favicon.ico | Bin 0 -> 31346 bytes .../argon_light/fonts/TypoGraphica.eot | Bin 0 -> 33846 bytes .../argon_light/fonts/TypoGraphica.svg | 1191 + .../argon_light/fonts/TypoGraphica.ttf | Bin 0 -> 33632 bytes .../argon_light/fonts/TypoGraphica.woff | Bin 0 -> 17816 bytes .../luci-static/argon_light/fonts/font.eot | Bin 0 -> 1912 bytes .../luci-static/argon_light/fonts/font.svg | 16 + .../luci-static/argon_light/fonts/font.ttf | Bin 0 -> 1748 bytes .../luci-static/argon_light/fonts/font.woff | Bin 0 -> 1824 bytes .../luci-static/argon_light/fonts/icomoon.eot | Bin 0 -> 1476 bytes .../luci-static/argon_light/fonts/icomoon.svg | 12 + .../luci-static/argon_light/fonts/icomoon.ttf | Bin 0 -> 1312 bytes .../argon_light/fonts/icomoon.woff | Bin 0 -> 1388 bytes .../luci-static/argon_light/fonts/ssr.eot | Bin 0 -> 7232 bytes .../luci-static/argon_light/fonts/ssr.svg | 25 + .../luci-static/argon_light/fonts/ssr.ttf | Bin 0 -> 7084 bytes .../luci-static/argon_light/fonts/ssr.woff | Bin 0 -> 7160 bytes .../luci-static/argon_light/img/bg1.jpg | Bin 0 -> 169716 bytes .../luci-static/argon_light/img/bg2.jpg | Bin 0 -> 264224 bytes .../luci-static/argon_light/img/bg3.jpg | Bin 0 -> 248828 bytes .../luci-static/argon_light/js/jquery.min.js | 2 + .../luci-static/argon_light/js/script.js | 288 + .../htdocs/luci-static/argon_light/logo.png | Bin 0 -> 7138 bytes .../argon_light_green/css/purecss.css | 7 + .../argon_light_green/css/style.css | 3597 + .../luci-static/argon_light_green/favicon.ico | Bin 0 -> 31346 bytes .../argon_light_green/fonts/TypoGraphica.eot | Bin 0 -> 33846 bytes .../argon_light_green/fonts/TypoGraphica.svg | 1191 + .../argon_light_green/fonts/TypoGraphica.ttf | Bin 0 -> 33632 bytes .../argon_light_green/fonts/TypoGraphica.woff | Bin 0 -> 17816 bytes .../argon_light_green/fonts/font.eot | Bin 0 -> 1912 bytes .../argon_light_green/fonts/font.svg | 16 + .../argon_light_green/fonts/font.ttf | Bin 0 -> 1748 bytes .../argon_light_green/fonts/font.woff | Bin 0 -> 1824 bytes .../argon_light_green/fonts/icomoon.eot | Bin 0 -> 1476 bytes .../argon_light_green/fonts/icomoon.svg | 12 + .../argon_light_green/fonts/icomoon.ttf | Bin 0 -> 1312 bytes .../argon_light_green/fonts/icomoon.woff | Bin 0 -> 1388 bytes .../argon_light_green/fonts/ssr.eot | Bin 0 -> 7232 bytes .../argon_light_green/fonts/ssr.svg | 25 + .../argon_light_green/fonts/ssr.ttf | Bin 0 -> 7084 bytes .../argon_light_green/fonts/ssr.woff | Bin 0 -> 7160 bytes .../luci-static/argon_light_green/img/bg1.jpg | Bin 0 -> 169716 bytes .../luci-static/argon_light_green/img/bg2.jpg | Bin 0 -> 264224 bytes .../luci-static/argon_light_green/img/bg3.jpg | Bin 0 -> 248828 bytes .../argon_light_green/js/jquery.min.js | 2 + .../argon_light_green/js/script.js | 288 + .../luci-static/argon_light_green/logo.png | Bin 0 -> 7138 bytes .../luasrc/view/themes/argon_dark/footer.htm | 51 + .../luasrc/view/themes/argon_dark/header.htm | 257 + .../view/themes/argon_dark_purple/footer.htm | 51 + .../view/themes/argon_dark_purple/header.htm | 257 + .../luasrc/view/themes/argon_light/footer.htm | 63 + .../luasrc/view/themes/argon_light/header.htm | 301 + .../view/themes/argon_light_green/footer.htm | 63 + .../view/themes/argon_light_green/header.htm | 301 + .../etc/uci-defaults/30_luci-theme-argon-mod | 11 + .../lienol/luci-theme-bootstrap-mc/Makefile | 15 + .../htdocs/luci-static/bootstrap_blue/bg.jpg | Bin 0 -> 76341 bytes .../luci-static/bootstrap_blue/cascade.css | 1541 + .../luci-static/bootstrap_blue/favicon.ico | Bin 0 -> 1150 bytes .../luci-static/bootstrap_blue/html5.js | 3 + .../luci-static/bootstrap_blue/mobile.css | 82 + .../luci-static/bootstrap_blue/wifi.png | Bin 0 -> 21597 bytes .../luci-static/bootstrap_purple/bg.jpg | Bin 0 -> 76341 bytes .../luci-static/bootstrap_purple/cascade.css | 1545 + .../luci-static/bootstrap_purple/favicon.ico | Bin 0 -> 1150 bytes .../luci-static/bootstrap_purple/html5.js | 3 + .../luci-static/bootstrap_purple/mobile.css | 82 + .../luci-static/bootstrap_purple/wifi.png | Bin 0 -> 21597 bytes .../view/themes/bootstrap_blue/footer.htm | 55 + .../view/themes/bootstrap_blue/header.htm | 214 + .../view/themes/bootstrap_purple/footer.htm | 55 + .../view/themes/bootstrap_purple/header.htm | 214 + .../uci-defaults/30_luci-theme-bootstrap-mc | 7 + .../lienol/luci-theme-bootstrap-mod/Makefile | 15 + .../htdocs/luci-static/bootstrap_blue/bg.jpg | Bin 0 -> 76341 bytes .../luci-static/bootstrap_blue/cascade.css | 1543 + .../luci-static/bootstrap_blue/favicon.ico | Bin 0 -> 1150 bytes .../luci-static/bootstrap_blue/html5.js | 3 + .../luci-static/bootstrap_blue/mobile.css | 82 + .../luci-static/bootstrap_blue/wifi.png | Bin 0 -> 21597 bytes .../luci-static/bootstrap_purple/bg.jpg | Bin 0 -> 76341 bytes .../luci-static/bootstrap_purple/cascade.css | 1547 + .../luci-static/bootstrap_purple/favicon.ico | Bin 0 -> 1150 bytes .../luci-static/bootstrap_purple/html5.js | 3 + .../luci-static/bootstrap_purple/mobile.css | 82 + .../luci-static/bootstrap_purple/wifi.png | Bin 0 -> 21597 bytes .../view/themes/bootstrap_blue/footer.htm | 55 + .../view/themes/bootstrap_blue/header.htm | 220 + .../view/themes/bootstrap_purple/footer.htm | 55 + .../view/themes/bootstrap_purple/header.htm | 220 + .../uci-defaults/30_luci-theme-bootstrap-mod | 7 + package/lienol/luci-theme-netgear-mc/Makefile | 15 + .../luci-static/netgear_mc/css/style.css | 2242 + .../htdocs/luci-static/netgear_mc/favicon.ico | Bin 0 -> 2462 bytes .../fonts/Roboto-Medium-webfont.woff | Bin 0 -> 70200 bytes .../fonts/Roboto-Regular-webfont.woff | Bin 0 -> 68776 bytes .../netgear_mc/fonts/advancedtomato.eot | Bin 0 -> 8480 bytes .../netgear_mc/fonts/advancedtomato.svg | 53 + .../netgear_mc/fonts/advancedtomato.ttf | Bin 0 -> 8288 bytes .../netgear_mc/fonts/advancedtomato.woff | Bin 0 -> 6272 bytes .../luci-static/netgear_mc/fonts/font.eot | Bin 0 -> 1912 bytes .../luci-static/netgear_mc/fonts/font.svg | 16 + .../luci-static/netgear_mc/fonts/font.ttf | Bin 0 -> 1748 bytes .../luci-static/netgear_mc/fonts/font.woff | Bin 0 -> 1824 bytes .../luci-static/netgear_mc/js/jquery.min.js | 6 + .../luci-static/netgear_mc/js/script.js | 238 + .../htdocs/luci-static/netgear_mc/logo.png | Bin 0 -> 2224 bytes .../htdocs/luci-static/netgear_mc/nlogo.png | Bin 0 -> 22674 bytes .../luasrc/view/themes/netgear_mc/footer.htm | 51 + .../luasrc/view/themes/netgear_mc/header.htm | 220 + .../etc/uci-defaults/30_luci-theme-netgear-mc | 6 + package/lienol/redsocks2/Makefile | 54 + .../lienol/redsocks2/files/redsocks2.template | 28 + package/lienol/tcping/Makefile | 42 + 2374 files changed, 534382 insertions(+), 1 deletion(-) create mode 100644 package/ctcgfw/ChinaDNS/Makefile create mode 100644 package/ctcgfw/GoQuiet/Makefile create mode 100644 package/ctcgfw/UnblockNeteaseMusic-Go/Makefile create mode 100644 package/ctcgfw/UnblockNeteaseMusic-Go/cert/server.crt create mode 100644 package/ctcgfw/UnblockNeteaseMusic-Go/cert/server.key create mode 100644 package/ctcgfw/baidupcs-web/Makefile create mode 100644 package/ctcgfw/bbr-bbrplus/Makefile create mode 100644 package/ctcgfw/bbr-bbrplus/src/Makefile create mode 100644 package/ctcgfw/bbr-bbrplus/src/tcp_bbr_bbrplus.c create mode 100644 package/ctcgfw/bbr-mod/Makefile create mode 100644 package/ctcgfw/bbr-mod/src/Makefile create mode 100644 package/ctcgfw/bbr-mod/src/tcp_bbr_mod.c create mode 100644 package/ctcgfw/bbr-nanqinlang/Makefile create mode 100644 package/ctcgfw/bbr-nanqinlang/src/Makefile create mode 100644 package/ctcgfw/bbr-nanqinlang/src/tcp_bbr_nanqinlang.c create mode 100644 package/ctcgfw/bbr-tsunami/Makefile create mode 100644 package/ctcgfw/bbr-tsunami/src/Makefile create mode 100644 package/ctcgfw/bbr-tsunami/src/tcp_bbr_tsunami.c create mode 100644 package/ctcgfw/cups-bjnp/Makefile create mode 100644 package/ctcgfw/cups/Makefile create mode 100755 package/ctcgfw/cups/files/cupsd.init create mode 100644 package/ctcgfw/cups/files/etc/cups/classes.conf create mode 100644 package/ctcgfw/cups/files/etc/cups/client.conf create mode 100644 package/ctcgfw/cups/files/etc/cups/cupsd.conf create mode 100644 package/ctcgfw/cups/files/etc/cups/printers.conf create mode 100644 package/ctcgfw/cups/patches/100-target.patch create mode 100644 package/ctcgfw/cups/patches/140-uname.patch create mode 100644 package/ctcgfw/cups/patches/150-64bit_host_fix.patch create mode 100644 package/ctcgfw/cups/patches/160-ppdc.patch create mode 100644 package/ctcgfw/filebrowser/Makefile create mode 100644 package/ctcgfw/iptvhelper/Makefile create mode 100644 package/ctcgfw/iptvhelper/files/etc/config/iptvhelper create mode 100755 package/ctcgfw/iptvhelper/files/etc/firewall.iptvhelper create mode 100755 package/ctcgfw/iptvhelper/files/etc/init.d/iptvhelper create mode 100755 package/ctcgfw/iptvhelper/files/usr/sbin/iptvhelper.sh create mode 100644 package/ctcgfw/luci-app-adguardhome/Makefile create mode 100644 package/ctcgfw/luci-app-adguardhome/luasrc/controller/AdGuardHome.lua create mode 100644 package/ctcgfw/luci-app-adguardhome/luasrc/model/cbi/AdGuardHome/base.lua create mode 100644 package/ctcgfw/luci-app-adguardhome/luasrc/model/cbi/AdGuardHome/log.lua create mode 100644 package/ctcgfw/luci-app-adguardhome/luasrc/model/cbi/AdGuardHome/manual.lua create mode 100644 package/ctcgfw/luci-app-adguardhome/luasrc/view/AdGuardHome/AdGuardHome_check.htm create mode 100644 package/ctcgfw/luci-app-adguardhome/luasrc/view/AdGuardHome/AdGuardHome_chpass.htm create mode 100644 package/ctcgfw/luci-app-adguardhome/luasrc/view/AdGuardHome/AdGuardHome_status.htm create mode 100644 package/ctcgfw/luci-app-adguardhome/luasrc/view/AdGuardHome/log.htm create mode 100644 package/ctcgfw/luci-app-adguardhome/luasrc/view/AdGuardHome/yamleditor.htm create mode 100644 package/ctcgfw/luci-app-adguardhome/po/zh-cn/AdGuardHome.po create mode 100644 package/ctcgfw/luci-app-adguardhome/root/etc/config/AdGuardHome create mode 100755 package/ctcgfw/luci-app-adguardhome/root/etc/init.d/AdGuardHome create mode 100755 package/ctcgfw/luci-app-adguardhome/root/etc/uci-defaults/40_luci-AdGuardHome create mode 100644 package/ctcgfw/luci-app-adguardhome/root/usr/share/AdGuardHome/AdGuardHome_template.yaml create mode 100755 package/ctcgfw/luci-app-adguardhome/root/usr/share/AdGuardHome/addhost.sh create mode 100755 package/ctcgfw/luci-app-adguardhome/root/usr/share/AdGuardHome/firewall.start create mode 100755 package/ctcgfw/luci-app-adguardhome/root/usr/share/AdGuardHome/getsyslog.sh create mode 100755 package/ctcgfw/luci-app-adguardhome/root/usr/share/AdGuardHome/gfw2adg.sh create mode 100644 package/ctcgfw/luci-app-adguardhome/root/usr/share/AdGuardHome/links.txt create mode 100755 package/ctcgfw/luci-app-adguardhome/root/usr/share/AdGuardHome/tailto.sh create mode 100755 package/ctcgfw/luci-app-adguardhome/root/usr/share/AdGuardHome/update_core.sh create mode 100755 package/ctcgfw/luci-app-adguardhome/root/usr/share/AdGuardHome/waitnet.sh create mode 100755 package/ctcgfw/luci-app-adguardhome/root/usr/share/AdGuardHome/watchconfig.sh create mode 100644 package/ctcgfw/luci-app-adguardhome/root/www/luci-static/resources/codemirror/addon/fold/foldcode.js create mode 100644 package/ctcgfw/luci-app-adguardhome/root/www/luci-static/resources/codemirror/addon/fold/foldgutter.css create mode 100644 package/ctcgfw/luci-app-adguardhome/root/www/luci-static/resources/codemirror/addon/fold/foldgutter.js create mode 100644 package/ctcgfw/luci-app-adguardhome/root/www/luci-static/resources/codemirror/addon/fold/indent-fold.js create mode 100644 package/ctcgfw/luci-app-adguardhome/root/www/luci-static/resources/codemirror/lib/codemirror.css create mode 100644 package/ctcgfw/luci-app-adguardhome/root/www/luci-static/resources/codemirror/lib/codemirror.js create mode 100644 package/ctcgfw/luci-app-adguardhome/root/www/luci-static/resources/codemirror/mode/yaml/yaml.js create mode 100644 package/ctcgfw/luci-app-adguardhome/root/www/luci-static/resources/codemirror/theme/dracula.css create mode 100644 package/ctcgfw/luci-app-adguardhome/root/www/luci-static/resources/twin-bcrypt.min.js create mode 100644 package/ctcgfw/luci-app-airwhu/Makefile create mode 100755 package/ctcgfw/luci-app-airwhu/files/root/bin/ipv6masq.sh create mode 100644 package/ctcgfw/luci-app-airwhu/files/root/etc/config/airwhu create mode 100755 package/ctcgfw/luci-app-airwhu/files/root/etc/hotplug.d/iface/99-ipv6nat create mode 100755 package/ctcgfw/luci-app-airwhu/files/root/etc/init.d/mentohust create mode 100644 package/ctcgfw/luci-app-airwhu/files/root/usr/lib/lua/luci/controller/airwhu.lua create mode 100644 package/ctcgfw/luci-app-airwhu/files/root/usr/lib/lua/luci/model/cbi/airwhu.lua create mode 100644 package/ctcgfw/luci-app-airwhu/po/airwhu.zh-cn.po create mode 100644 package/ctcgfw/luci-app-airwhu/tools/po2lmo/Makefile create mode 100755 package/ctcgfw/luci-app-airwhu/tools/po2lmo/src/po2lmo create mode 100644 package/ctcgfw/luci-app-airwhu/tools/po2lmo/src/po2lmo.c create mode 100644 package/ctcgfw/luci-app-airwhu/tools/po2lmo/src/template_lmo.c create mode 100644 package/ctcgfw/luci-app-airwhu/tools/po2lmo/src/template_lmo.h create mode 100644 package/ctcgfw/luci-app-appfilter/Makefile create mode 100644 package/ctcgfw/luci-app-appfilter/luasrc/controller/appfilter.lua create mode 100644 package/ctcgfw/luci-app-appfilter/luasrc/model/cbi/appfilter/appfilter.lua create mode 100644 package/ctcgfw/luci-app-appfilter/luasrc/view/admin_network/user_status.htm create mode 100644 package/ctcgfw/luci-app-appfilter/po/zh-cn/oaf.po create mode 100755 package/ctcgfw/luci-app-appfilter/root/etc/uci-defaults/91_luci-oaf create mode 100644 package/ctcgfw/luci-app-autoipsetadder/Makefile create mode 100644 package/ctcgfw/luci-app-autoipsetadder/luasrc/controller/autoipsetadder.lua create mode 100644 package/ctcgfw/luci-app-autoipsetadder/luasrc/model/cbi/autoipsetadder.lua create mode 100644 package/ctcgfw/luci-app-autoipsetadder/luasrc/view/autoipsetadder/check.htm create mode 100644 package/ctcgfw/luci-app-autoipsetadder/luasrc/view/autoipsetadder/status.htm create mode 100644 package/ctcgfw/luci-app-autoipsetadder/root/etc/config/autoipsetadder create mode 100755 package/ctcgfw/luci-app-autoipsetadder/root/etc/init.d/autoipsetadder create mode 100755 package/ctcgfw/luci-app-autoipsetadder/root/etc/uci-defaults/40_luci-autoipsetadder create mode 100755 package/ctcgfw/luci-app-autoipsetadder/root/usr/bin/autoipsetadder/autoaddlist.sh create mode 100755 package/ctcgfw/luci-app-autoipsetadder/root/usr/bin/autoipsetadder/debugip.sh create mode 100755 package/ctcgfw/luci-app-autoipsetadder/root/usr/bin/autoipsetadder/tailto.sh create mode 100755 package/ctcgfw/luci-app-autoipsetadder/root/usr/bin/autoipsetadder/testip.sh create mode 100644 package/ctcgfw/luci-app-baidupcs-web/Makefile create mode 100644 package/ctcgfw/luci-app-baidupcs-web/luasrc/controller/baidupcs-web.lua create mode 100644 package/ctcgfw/luci-app-baidupcs-web/luasrc/model/cbi/baidupcs-web.lua create mode 100644 package/ctcgfw/luci-app-baidupcs-web/luasrc/view/baidupcs-web/baidupcs-web_status.htm create mode 100644 package/ctcgfw/luci-app-baidupcs-web/root/etc/config/baidupcs-web create mode 100755 package/ctcgfw/luci-app-baidupcs-web/root/etc/init.d/baidupcs-web create mode 100755 package/ctcgfw/luci-app-baidupcs-web/root/etc/uci-defaults/luci-baidupcs-web create mode 100644 package/ctcgfw/luci-app-chinadns/Makefile create mode 100644 package/ctcgfw/luci-app-chinadns/files/luci/controller/chinadns.lua create mode 100644 package/ctcgfw/luci-app-chinadns/files/luci/i18n/chinadns.zh-cn.po create mode 100644 package/ctcgfw/luci-app-chinadns/files/luci/model/cbi/chinadns.lua create mode 100644 package/ctcgfw/luci-app-chinadns/files/luci/view/chinadns/chinadns_status.htm create mode 100644 package/ctcgfw/luci-app-chinadns/files/root/etc/config/chinadns create mode 100755 package/ctcgfw/luci-app-chinadns/files/root/etc/init.d/chinadns create mode 100755 package/ctcgfw/luci-app-chinadns/files/root/etc/uci-defaults/luci-chinadns create mode 100644 package/ctcgfw/luci-app-chinadns/tools/po2lmo/Makefile create mode 100644 package/ctcgfw/luci-app-chinadns/tools/po2lmo/src/po2lmo.c create mode 100644 package/ctcgfw/luci-app-chinadns/tools/po2lmo/src/template_lmo.c create mode 100644 package/ctcgfw/luci-app-chinadns/tools/po2lmo/src/template_lmo.h create mode 100644 package/ctcgfw/luci-app-diskman/Makefile create mode 100644 package/ctcgfw/luci-app-diskman/depends.lst create mode 100644 package/ctcgfw/luci-app-diskman/luasrc/controller/diskman.lua create mode 100644 package/ctcgfw/luci-app-diskman/luasrc/model/cbi/diskman/disks.lua create mode 100644 package/ctcgfw/luci-app-diskman/luasrc/model/cbi/diskman/partition.lua create mode 100644 package/ctcgfw/luci-app-diskman/luasrc/model/diskman.lua create mode 100644 package/ctcgfw/luci-app-diskman/luasrc/view/diskman/cbi/disabled_button.htm create mode 100644 package/ctcgfw/luci-app-diskman/luasrc/view/diskman/cbi/inlinebutton.htm create mode 100644 package/ctcgfw/luci-app-diskman/luasrc/view/diskman/cbi/xnullsection.htm create mode 100644 package/ctcgfw/luci-app-diskman/luasrc/view/diskman/cbi/xsimpleform.htm create mode 100644 package/ctcgfw/luci-app-diskman/luasrc/view/diskman/disk_info_tab.htm create mode 100644 package/ctcgfw/luci-app-diskman/luasrc/view/diskman/partition_info.htm create mode 100644 package/ctcgfw/luci-app-diskman/luasrc/view/diskman/smart_detail.htm create mode 100644 package/ctcgfw/luci-app-diskman/po/pl/diskman.po create mode 100644 package/ctcgfw/luci-app-diskman/po/zh-cn/diskman.po create mode 100644 package/ctcgfw/luci-app-dockerman/Makefile create mode 100644 package/ctcgfw/luci-app-dockerman/luasrc/controller/dockerman.lua create mode 100644 package/ctcgfw/luci-app-dockerman/luasrc/model/cbi/docker/container.lua create mode 100644 package/ctcgfw/luci-app-dockerman/luasrc/model/cbi/docker/containers.lua create mode 100644 package/ctcgfw/luci-app-dockerman/luasrc/model/cbi/docker/images.lua create mode 100644 package/ctcgfw/luci-app-dockerman/luasrc/model/cbi/docker/networks.lua create mode 100644 package/ctcgfw/luci-app-dockerman/luasrc/model/cbi/docker/newcontainer.lua create mode 100644 package/ctcgfw/luci-app-dockerman/luasrc/model/cbi/docker/newnetwork.lua create mode 100644 package/ctcgfw/luci-app-dockerman/luasrc/model/cbi/docker/overview.lua create mode 100644 package/ctcgfw/luci-app-dockerman/luasrc/model/cbi/docker/volumes.lua create mode 100644 package/ctcgfw/luci-app-dockerman/luasrc/model/docker.lua create mode 100644 package/ctcgfw/luci-app-dockerman/luasrc/view/docker/apply_widget.htm create mode 100644 package/ctcgfw/luci-app-dockerman/luasrc/view/docker/cbi/dummyvalue.htm create mode 100644 package/ctcgfw/luci-app-dockerman/luasrc/view/docker/cbi/inlinebutton.htm create mode 100644 package/ctcgfw/luci-app-dockerman/luasrc/view/docker/cbi/inlinevalue.htm create mode 100644 package/ctcgfw/luci-app-dockerman/luasrc/view/docker/cbi/xdynlist.htm create mode 100644 package/ctcgfw/luci-app-dockerman/luasrc/view/docker/cbi/xfvalue.htm create mode 100644 package/ctcgfw/luci-app-dockerman/luasrc/view/docker/cbi/xsimpleform.htm create mode 100644 package/ctcgfw/luci-app-dockerman/luasrc/view/docker/container.htm create mode 100644 package/ctcgfw/luci-app-dockerman/luasrc/view/docker/logs.htm create mode 100644 package/ctcgfw/luci-app-dockerman/luasrc/view/docker/overview.htm create mode 100644 package/ctcgfw/luci-app-dockerman/luasrc/view/docker/resolv_container.htm create mode 100644 package/ctcgfw/luci-app-dockerman/luasrc/view/docker/stats.htm create mode 100644 package/ctcgfw/luci-app-dockerman/po/zh-cn/dockerman.po create mode 100644 package/ctcgfw/luci-app-dockerman/root/etc/config/docker create mode 100644 package/ctcgfw/luci-app-filebrowser/Makefile create mode 100644 package/ctcgfw/luci-app-filebrowser/luasrc/controller/filebrowser.lua create mode 100644 package/ctcgfw/luci-app-filebrowser/luasrc/model/cbi/filebrowser.lua create mode 100644 package/ctcgfw/luci-app-filebrowser/root/etc/config/filebrowser create mode 100755 package/ctcgfw/luci-app-filebrowser/root/etc/init.d/filebrowser create mode 100755 package/ctcgfw/luci-app-filebrowser/root/etc/uci-defaults/luci-filebrowser create mode 100644 package/ctcgfw/luci-app-iptvhelper/Makefile create mode 100644 package/ctcgfw/luci-app-iptvhelper/luasrc/controller/iptvhelper.lua create mode 100644 package/ctcgfw/luci-app-iptvhelper/luasrc/model/cbi/iptvhelper.lua create mode 100644 package/ctcgfw/luci-app-iptvhelper/po/templates/iptvhelper.pot create mode 100644 package/ctcgfw/luci-app-iptvhelper/po/zh-cn/iptvhelper.po create mode 100755 package/ctcgfw/luci-app-iptvhelper/root/etc/uci-defaults/40_iptvhelper create mode 100644 package/ctcgfw/luci-app-k3screenctrl/Makefile create mode 100644 package/ctcgfw/luci-app-k3screenctrl/files/luci/controller/k3screenctrl.lua create mode 100644 package/ctcgfw/luci-app-k3screenctrl/files/luci/i18n/k3screenctrl.zh-cn.lmo create mode 100644 package/ctcgfw/luci-app-k3screenctrl/files/luci/i18n/k3screenctrl.zh-cn.po create mode 100644 package/ctcgfw/luci-app-k3screenctrl/files/luci/model/cbi/k3screenctrl.lua create mode 100644 package/ctcgfw/luci-app-koolproxyR/Makefile create mode 100755 package/ctcgfw/luci-app-koolproxyR/files/bin/arm create mode 100755 package/ctcgfw/luci-app-koolproxyR/files/bin/i386 create mode 100755 package/ctcgfw/luci-app-koolproxyR/files/bin/mips create mode 100755 package/ctcgfw/luci-app-koolproxyR/files/bin/mipsel create mode 100755 package/ctcgfw/luci-app-koolproxyR/files/bin/x86_64 create mode 100644 package/ctcgfw/luci-app-koolproxyR/files/etc/adblocklist/adblock create mode 100644 package/ctcgfw/luci-app-koolproxyR/files/etc/adblocklist/adblockip create mode 100644 package/ctcgfw/luci-app-koolproxyR/files/etc/adblocklist/adbypass create mode 100644 package/ctcgfw/luci-app-koolproxyR/files/etc/adblocklist/adbypassip create mode 100644 package/ctcgfw/luci-app-koolproxyR/files/etc/config/koolproxy create mode 100755 package/ctcgfw/luci-app-koolproxyR/files/etc/init.d/koolproxy create mode 100755 package/ctcgfw/luci-app-koolproxyR/files/etc/uci-defaults/luci-koolproxy create mode 100755 package/ctcgfw/luci-app-koolproxyR/files/lib/upgrade/keep.d/koolproxy create mode 100644 package/ctcgfw/luci-app-koolproxyR/files/usr/lib/lua/luci/controller/koolproxy.lua create mode 100644 package/ctcgfw/luci-app-koolproxyR/files/usr/lib/lua/luci/i18n/koolproxy.zh-cn.lmo create mode 100644 package/ctcgfw/luci-app-koolproxyR/files/usr/lib/lua/luci/model/cbi/koolproxy/global.lua create mode 100644 package/ctcgfw/luci-app-koolproxyR/files/usr/lib/lua/luci/model/cbi/koolproxy/rss_rule.lua create mode 100644 package/ctcgfw/luci-app-koolproxyR/files/usr/lib/lua/luci/view/koolproxy/cadvalue.htm create mode 100644 package/ctcgfw/luci-app-koolproxyR/files/usr/lib/lua/luci/view/koolproxy/caupload.htm create mode 100644 package/ctcgfw/luci-app-koolproxyR/files/usr/lib/lua/luci/view/koolproxy/dvalue.htm create mode 100644 package/ctcgfw/luci-app-koolproxyR/files/usr/lib/lua/luci/view/koolproxy/index.htm create mode 100755 package/ctcgfw/luci-app-koolproxyR/files/usr/sbin/adblockplus create mode 100644 package/ctcgfw/luci-app-koolproxyR/files/usr/share/koolproxy/adblock.conf create mode 100755 package/ctcgfw/luci-app-koolproxyR/files/usr/share/koolproxy/camanagement create mode 100755 package/ctcgfw/luci-app-koolproxyR/files/usr/share/koolproxy/data/gen_ca.sh create mode 100755 package/ctcgfw/luci-app-koolproxyR/files/usr/share/koolproxy/data/openssl.cnf create mode 100644 package/ctcgfw/luci-app-koolproxyR/files/usr/share/koolproxy/data/rules/easylistchina.txt create mode 100644 package/ctcgfw/luci-app-koolproxyR/files/usr/share/koolproxy/data/rules/fanboy.txt create mode 100644 package/ctcgfw/luci-app-koolproxyR/files/usr/share/koolproxy/data/rules/kp.dat create mode 100644 package/ctcgfw/luci-app-koolproxyR/files/usr/share/koolproxy/data/rules/user.txt create mode 100644 package/ctcgfw/luci-app-koolproxyR/files/usr/share/koolproxy/data/rules/yhosts.txt create mode 100644 package/ctcgfw/luci-app-koolproxyR/files/usr/share/koolproxy/data/source.list create mode 100644 package/ctcgfw/luci-app-koolproxyR/files/usr/share/koolproxy/data/user.txt create mode 100644 package/ctcgfw/luci-app-koolproxyR/files/usr/share/koolproxy/dnsmasq.adblock create mode 100644 package/ctcgfw/luci-app-koolproxyR/files/usr/share/koolproxy/koolproxy_ipset.conf create mode 100755 package/ctcgfw/luci-app-koolproxyR/files/usr/share/koolproxy/kpupdate create mode 100644 package/ctcgfw/luci-app-koolproxyR/koolproxy.txt create mode 100755 package/ctcgfw/luci-app-koolproxyR/koolproxyupdate.sh create mode 100644 package/ctcgfw/luci-app-mentohust/Makefile create mode 100644 package/ctcgfw/luci-app-mentohust/files/luci/controller/mentohust.lua create mode 100644 package/ctcgfw/luci-app-mentohust/files/luci/i18n/mentohust.zh-cn.po create mode 100644 package/ctcgfw/luci-app-mentohust/files/luci/model/cbi/mentohust/general.lua create mode 100644 package/ctcgfw/luci-app-mentohust/files/luci/model/cbi/mentohust/log.lua create mode 100644 package/ctcgfw/luci-app-mentohust/files/root/etc/config/mentohust create mode 100755 package/ctcgfw/luci-app-mentohust/files/root/etc/init.d/mentohust create mode 100644 package/ctcgfw/luci-app-onliner/Makefile create mode 100644 package/ctcgfw/luci-app-onliner/luasrc/controller/onliner.lua create mode 100644 package/ctcgfw/luci-app-onliner/luasrc/view/onliner/display.htm create mode 100644 package/ctcgfw/luci-app-onliner/luasrc/view/onliner/onliner.htm create mode 100644 package/ctcgfw/luci-app-onliner/po/zh-cn/onliner.po create mode 100755 package/ctcgfw/luci-app-onliner/root/usr/share/onliner/setnlbw.sh create mode 100644 package/ctcgfw/luci-app-openclash/Makefile create mode 100644 package/ctcgfw/luci-app-openclash/files/etc/config/openclash create mode 100755 package/ctcgfw/luci-app-openclash/files/etc/init.d/openclash create mode 100644 package/ctcgfw/luci-app-openclash/files/etc/openclash/ConnersHua.yaml create mode 100644 package/ctcgfw/luci-app-openclash/files/etc/openclash/ConnersHua_return.yaml create mode 100644 package/ctcgfw/luci-app-openclash/files/etc/openclash/Country.mmdb create mode 100644 package/ctcgfw/luci-app-openclash/files/etc/openclash/custom/openclash_custom_fake_black.conf create mode 100644 package/ctcgfw/luci-app-openclash/files/etc/openclash/custom/openclash_custom_hosts.list create mode 100644 package/ctcgfw/luci-app-openclash/files/etc/openclash/custom/openclash_custom_rules.list create mode 100644 package/ctcgfw/luci-app-openclash/files/etc/openclash/default.yaml create mode 100644 package/ctcgfw/luci-app-openclash/files/etc/openclash/game_rules.list create mode 100644 package/ctcgfw/luci-app-openclash/files/etc/openclash/game_rules/CS-GO.rules create mode 100644 package/ctcgfw/luci-app-openclash/files/etc/openclash/game_rules/Monster-Hunter-World.rules create mode 100644 package/ctcgfw/luci-app-openclash/files/etc/openclash/game_rules/PUBG-Asia%26-Southeast-Asia.rules create mode 100644 package/ctcgfw/luci-app-openclash/files/etc/openclash/game_rules/Steam.rules create mode 100644 package/ctcgfw/luci-app-openclash/files/etc/openclash/lhie1.yaml create mode 100644 package/ctcgfw/luci-app-openclash/files/etc/openclash/openclash_version create mode 100644 package/ctcgfw/luci-app-openclash/files/usr/lib/lua/luci/controller/openclash.lua create mode 100644 package/ctcgfw/luci-app-openclash/files/usr/lib/lua/luci/model/cbi/openclash/client.lua create mode 100644 package/ctcgfw/luci-app-openclash/files/usr/lib/lua/luci/model/cbi/openclash/config-subscribe.lua create mode 100644 package/ctcgfw/luci-app-openclash/files/usr/lib/lua/luci/model/cbi/openclash/config.lua create mode 100644 package/ctcgfw/luci-app-openclash/files/usr/lib/lua/luci/model/cbi/openclash/game-settings.lua create mode 100644 package/ctcgfw/luci-app-openclash/files/usr/lib/lua/luci/model/cbi/openclash/groups-config.lua create mode 100644 package/ctcgfw/luci-app-openclash/files/usr/lib/lua/luci/model/cbi/openclash/log.lua create mode 100644 package/ctcgfw/luci-app-openclash/files/usr/lib/lua/luci/model/cbi/openclash/proxy-provider-config.lua create mode 100644 package/ctcgfw/luci-app-openclash/files/usr/lib/lua/luci/model/cbi/openclash/servers-config.lua create mode 100644 package/ctcgfw/luci-app-openclash/files/usr/lib/lua/luci/model/cbi/openclash/servers.lua create mode 100644 package/ctcgfw/luci-app-openclash/files/usr/lib/lua/luci/model/cbi/openclash/settings.lua create mode 100644 package/ctcgfw/luci-app-openclash/files/usr/lib/lua/luci/openclash.lua create mode 100644 package/ctcgfw/luci-app-openclash/files/usr/lib/lua/luci/view/openclash/developer.htm create mode 100644 package/ctcgfw/luci-app-openclash/files/usr/lib/lua/luci/view/openclash/download_game_rule.htm create mode 100644 package/ctcgfw/luci-app-openclash/files/usr/lib/lua/luci/view/openclash/dvalue.htm create mode 100644 package/ctcgfw/luci-app-openclash/files/usr/lib/lua/luci/view/openclash/myip.htm create mode 100644 package/ctcgfw/luci-app-openclash/files/usr/lib/lua/luci/view/openclash/other_button.htm create mode 100644 package/ctcgfw/luci-app-openclash/files/usr/lib/lua/luci/view/openclash/ping.htm create mode 100644 package/ctcgfw/luci-app-openclash/files/usr/lib/lua/luci/view/openclash/server_list.htm create mode 100644 package/ctcgfw/luci-app-openclash/files/usr/lib/lua/luci/view/openclash/state.htm create mode 100644 package/ctcgfw/luci-app-openclash/files/usr/lib/lua/luci/view/openclash/status.htm create mode 100644 package/ctcgfw/luci-app-openclash/files/usr/lib/lua/luci/view/openclash/update.htm create mode 100644 package/ctcgfw/luci-app-openclash/files/usr/lib/lua/luci/view/openclash/upload.htm create mode 100755 package/ctcgfw/luci-app-openclash/files/usr/share/openclash/cfg_servers_address_fake_block.sh create mode 100755 package/ctcgfw/luci-app-openclash/files/usr/share/openclash/cfg_unused_servers_del.sh create mode 100755 package/ctcgfw/luci-app-openclash/files/usr/share/openclash/clash_version.sh create mode 100644 package/ctcgfw/luci-app-openclash/files/usr/share/openclash/dashboard/CNAME create mode 100644 package/ctcgfw/luci-app-openclash/files/usr/share/openclash/dashboard/img/33343e6117c37aaef8886179007ba6b5.png create mode 100644 package/ctcgfw/luci-app-openclash/files/usr/share/openclash/dashboard/index.html create mode 100644 package/ctcgfw/luci-app-openclash/files/usr/share/openclash/dashboard/js/1.bundle.0bddb85299f970595cb5.min.js create mode 100644 package/ctcgfw/luci-app-openclash/files/usr/share/openclash/dashboard/js/1.bundle.0bddb85299f970595cb5.min.js.LICENSE create mode 100644 package/ctcgfw/luci-app-openclash/files/usr/share/openclash/dashboard/js/bundle.0bddb85299f970595cb5.min.js create mode 100644 package/ctcgfw/luci-app-openclash/files/usr/share/openclash/dashboard/main.0bddb85299f970595cb5.css create mode 100755 package/ctcgfw/luci-app-openclash/files/usr/share/openclash/openclash.sh create mode 100755 package/ctcgfw/luci-app-openclash/files/usr/share/openclash/openclash_core.sh create mode 100755 package/ctcgfw/luci-app-openclash/files/usr/share/openclash/openclash_fake_block.sh create mode 100755 package/ctcgfw/luci-app-openclash/files/usr/share/openclash/openclash_game_rule.sh create mode 100755 package/ctcgfw/luci-app-openclash/files/usr/share/openclash/openclash_ipdb.sh create mode 100755 package/ctcgfw/luci-app-openclash/files/usr/share/openclash/openclash_rule.sh create mode 100755 package/ctcgfw/luci-app-openclash/files/usr/share/openclash/openclash_update.sh create mode 100755 package/ctcgfw/luci-app-openclash/files/usr/share/openclash/openclash_version.sh create mode 100755 package/ctcgfw/luci-app-openclash/files/usr/share/openclash/openclash_watchdog.sh create mode 100644 package/ctcgfw/luci-app-openclash/files/usr/share/openclash/yacd/8.788ab61adcbd1ce75d98.js create mode 100644 package/ctcgfw/luci-app-openclash/files/usr/share/openclash/yacd/8.788ab61adcbd1ce75d98.js.LICENSE create mode 100644 package/ctcgfw/luci-app-openclash/files/usr/share/openclash/yacd/CNAME create mode 100644 package/ctcgfw/luci-app-openclash/files/usr/share/openclash/yacd/app.02ba11cfe63c3d5e1e73.css create mode 100644 package/ctcgfw/luci-app-openclash/files/usr/share/openclash/yacd/app.9f29cd9cb7f46e88a014.js create mode 100644 package/ctcgfw/luci-app-openclash/files/usr/share/openclash/yacd/app.9f29cd9cb7f46e88a014.js.LICENSE create mode 100644 package/ctcgfw/luci-app-openclash/files/usr/share/openclash/yacd/core-js~app.bee8eb27b94a9dc46ebe.js create mode 100644 package/ctcgfw/luci-app-openclash/files/usr/share/openclash/yacd/index.html create mode 100644 package/ctcgfw/luci-app-openclash/files/usr/share/openclash/yacd/proxies.6cc15bdf1bc70c0d1a8d.js create mode 100644 package/ctcgfw/luci-app-openclash/files/usr/share/openclash/yacd/proxies.d435411ad74e5f59ce94.css create mode 100644 package/ctcgfw/luci-app-openclash/files/usr/share/openclash/yacd/react~app.0e7d4c38821c1ecfbf2f.js create mode 100644 package/ctcgfw/luci-app-openclash/files/usr/share/openclash/yacd/react~app.0e7d4c38821c1ecfbf2f.js.LICENSE create mode 100644 package/ctcgfw/luci-app-openclash/files/usr/share/openclash/yacd/report.html create mode 100644 package/ctcgfw/luci-app-openclash/files/usr/share/openclash/yacd/rules.32658050e64361773fc6.js create mode 100644 package/ctcgfw/luci-app-openclash/files/usr/share/openclash/yacd/rules.f60a65ba29535b87ba96.css create mode 100644 package/ctcgfw/luci-app-openclash/files/usr/share/openclash/yacd/runtime.ded9d303f4333455472b.js create mode 100644 package/ctcgfw/luci-app-openclash/files/usr/share/openclash/yacd/vendors~chartjs.0775b8169f7ef69511b0.js create mode 100644 package/ctcgfw/luci-app-openclash/files/usr/share/openclash/yacd/vendors~chartjs.0775b8169f7ef69511b0.js.LICENSE create mode 100644 package/ctcgfw/luci-app-openclash/files/usr/share/openclash/yacd/vendors~proxies.7b8f1dc3f02b17f47fdd.js create mode 100644 package/ctcgfw/luci-app-openclash/files/usr/share/openclash/yacd/vendors~proxies.7b8f1dc3f02b17f47fdd.js.LICENSE create mode 100644 package/ctcgfw/luci-app-openclash/files/usr/share/openclash/yacd/yacd-128.png create mode 100644 package/ctcgfw/luci-app-openclash/files/usr/share/openclash/yacd/yacd-64.png create mode 100644 package/ctcgfw/luci-app-openclash/files/usr/share/openclash/yacd/yacd.ico create mode 100755 package/ctcgfw/luci-app-openclash/files/usr/share/openclash/yml_change.sh create mode 100755 package/ctcgfw/luci-app-openclash/files/usr/share/openclash/yml_groups_get.sh create mode 100755 package/ctcgfw/luci-app-openclash/files/usr/share/openclash/yml_groups_name_ch.sh create mode 100755 package/ctcgfw/luci-app-openclash/files/usr/share/openclash/yml_groups_name_get.sh create mode 100755 package/ctcgfw/luci-app-openclash/files/usr/share/openclash/yml_groups_set.sh create mode 100755 package/ctcgfw/luci-app-openclash/files/usr/share/openclash/yml_proxys_get.sh create mode 100755 package/ctcgfw/luci-app-openclash/files/usr/share/openclash/yml_proxys_set.sh create mode 100755 package/ctcgfw/luci-app-openclash/files/usr/share/openclash/yml_rules_change.sh create mode 100644 package/ctcgfw/luci-app-openclash/i18n/zh-cn/openclash.zh-cn.po create mode 100644 package/ctcgfw/luci-app-openclash/tools/po2lmo/Makefile create mode 100755 package/ctcgfw/luci-app-openclash/tools/po2lmo/src/po2lmo create mode 100644 package/ctcgfw/luci-app-openclash/tools/po2lmo/src/po2lmo.c create mode 100644 package/ctcgfw/luci-app-openclash/tools/po2lmo/src/template_lmo.c create mode 100644 package/ctcgfw/luci-app-openclash/tools/po2lmo/src/template_lmo.h create mode 100644 package/ctcgfw/luci-app-rclone/Makefile create mode 100644 package/ctcgfw/luci-app-rclone/luasrc/controller/rclone.lua create mode 100644 package/ctcgfw/luci-app-rclone/luasrc/model/cbi/rclone.lua create mode 100644 package/ctcgfw/luci-app-rclone/po/en/rclone.po create mode 100644 package/ctcgfw/luci-app-rclone/po/templates/rclone.pot create mode 100644 package/ctcgfw/luci-app-rclone/po/zh-cn/rclone.po create mode 100644 package/ctcgfw/luci-app-rclone/root/etc/config/rclone create mode 100755 package/ctcgfw/luci-app-rclone/root/etc/init.d/rclone create mode 100755 package/ctcgfw/luci-app-rclone/root/etc/uci-defaults/100_luci-rclone create mode 100644 package/ctcgfw/luci-app-serverchan/Makefile create mode 100644 package/ctcgfw/luci-app-serverchan/luasrc/controller/serverchan.lua create mode 100644 package/ctcgfw/luci-app-serverchan/luasrc/model/cbi/serverchan.lua create mode 100644 package/ctcgfw/luci-app-serverchan/luasrc/view/serverchan/serverchan_status.htm create mode 100644 package/ctcgfw/luci-app-serverchan/root/etc/config/serverchan create mode 100755 package/ctcgfw/luci-app-serverchan/root/etc/init.d/serverchan create mode 100755 package/ctcgfw/luci-app-serverchan/root/usr/bin/serverchan/serverchan create mode 100644 package/ctcgfw/luci-app-smartinfo/Makefile create mode 100644 package/ctcgfw/luci-app-smartinfo/luasrc/controller/smartinfo.lua create mode 100644 package/ctcgfw/luci-app-smartinfo/luasrc/model/cbi/smartinfo.lua create mode 100644 package/ctcgfw/luci-app-smartinfo/luasrc/view/admin_status/index/smartinfo.htm create mode 100644 package/ctcgfw/luci-app-smartinfo/luasrc/view/smartinfo/detail_begin_flag.htm create mode 100644 package/ctcgfw/luci-app-smartinfo/luasrc/view/smartinfo/detail_begin_value.htm create mode 100644 package/ctcgfw/luci-app-smartinfo/luasrc/view/smartinfo/detail_end_listvalue.htm create mode 100644 package/ctcgfw/luci-app-smartinfo/luasrc/view/smartinfo/detail_end_value.htm create mode 100644 package/ctcgfw/luci-app-smartinfo/luasrc/view/smartinfo/smart_detail.htm create mode 100644 package/ctcgfw/luci-app-smartinfo/luasrc/view/smartinfo/smart_status.htm create mode 100644 package/ctcgfw/luci-app-smartinfo/po/zh-cn/smartinfo.po create mode 100644 package/ctcgfw/luci-app-smartinfo/root/etc/config/smartinfo create mode 100755 package/ctcgfw/luci-app-smartinfo/root/etc/init.d/smartinfo create mode 100755 package/ctcgfw/luci-app-smartinfo/root/usr/lib/smartinfo/smart_checker.sh create mode 100755 package/ctcgfw/luci-app-smartinfo/root/usr/lib/smartinfo/smart_functions.sh create mode 100755 package/ctcgfw/luci-app-smartinfo/root/usr/lib/smartinfo/smart_status.sh create mode 100644 package/ctcgfw/luci-app-smstool/Makefile create mode 100644 package/ctcgfw/luci-app-smstool/files/usr/lib/lua/luci/controller/sms.lua create mode 100644 package/ctcgfw/luci-app-smstool/files/usr/lib/lua/luci/view/sms.htm create mode 100644 package/ctcgfw/luci-app-ssocks/Makefile create mode 100644 package/ctcgfw/luci-app-ssocks/luasrc/controller/ssocks.lua create mode 100644 package/ctcgfw/luci-app-ssocks/luasrc/model/cbi/ssocks.lua create mode 100644 package/ctcgfw/luci-app-ssocks/luasrc/view/ssocks/ssocks_status.htm create mode 100644 package/ctcgfw/luci-app-ssocks/po/zh-cn/ssocks.po create mode 100644 package/ctcgfw/luci-app-ssocks/root/etc/config/ssocks create mode 100644 package/ctcgfw/luci-app-ssocks/root/etc/config/ssocks-authorization create mode 100755 package/ctcgfw/luci-app-ssocks/root/etc/init.d/ssocks create mode 100755 package/ctcgfw/luci-app-ssocks/root/etc/uci-defaults/ssocks create mode 100644 package/ctcgfw/luci-app-ssr-plus-Jo/Makefile create mode 100644 package/ctcgfw/luci-app-ssr-plus-Jo/luasrc/controller/shadowsocksr.lua create mode 100644 package/ctcgfw/luci-app-ssr-plus-Jo/luasrc/model/cbi/shadowsocksr/advanced.lua create mode 100644 package/ctcgfw/luci-app-ssr-plus-Jo/luasrc/model/cbi/shadowsocksr/appointlist.lua create mode 100644 package/ctcgfw/luci-app-ssr-plus-Jo/luasrc/model/cbi/shadowsocksr/automatic.lua create mode 100644 package/ctcgfw/luci-app-ssr-plus-Jo/luasrc/model/cbi/shadowsocksr/client-config.lua create mode 100644 package/ctcgfw/luci-app-ssr-plus-Jo/luasrc/model/cbi/shadowsocksr/client.lua create mode 100644 package/ctcgfw/luci-app-ssr-plus-Jo/luasrc/model/cbi/shadowsocksr/control.lua create mode 100644 package/ctcgfw/luci-app-ssr-plus-Jo/luasrc/model/cbi/shadowsocksr/list.lua create mode 100644 package/ctcgfw/luci-app-ssr-plus-Jo/luasrc/model/cbi/shadowsocksr/log.lua create mode 100644 package/ctcgfw/luci-app-ssr-plus-Jo/luasrc/model/cbi/shadowsocksr/server-config.lua create mode 100644 package/ctcgfw/luci-app-ssr-plus-Jo/luasrc/model/cbi/shadowsocksr/server.lua create mode 100644 package/ctcgfw/luci-app-ssr-plus-Jo/luasrc/model/cbi/shadowsocksr/servers.lua create mode 100644 package/ctcgfw/luci-app-ssr-plus-Jo/luasrc/model/cbi/shadowsocksr/status.lua create mode 100644 package/ctcgfw/luci-app-ssr-plus-Jo/luasrc/model/cbi/shadowsocksr/subscription.lua create mode 100644 package/ctcgfw/luci-app-ssr-plus-Jo/luasrc/view/shadowsocksr/check.htm create mode 100644 package/ctcgfw/luci-app-ssr-plus-Jo/luasrc/view/shadowsocksr/checkport.htm create mode 100644 package/ctcgfw/luci-app-ssr-plus-Jo/luasrc/view/shadowsocksr/feedback.htm create mode 100644 package/ctcgfw/luci-app-ssr-plus-Jo/luasrc/view/shadowsocksr/myip.htm create mode 100644 package/ctcgfw/luci-app-ssr-plus-Jo/luasrc/view/shadowsocksr/ping.htm create mode 100644 package/ctcgfw/luci-app-ssr-plus-Jo/luasrc/view/shadowsocksr/refresh.htm create mode 100644 package/ctcgfw/luci-app-ssr-plus-Jo/luasrc/view/shadowsocksr/server_list.htm create mode 100644 package/ctcgfw/luci-app-ssr-plus-Jo/luasrc/view/shadowsocksr/ssrurl.htm create mode 100644 package/ctcgfw/luci-app-ssr-plus-Jo/luasrc/view/shadowsocksr/status.htm create mode 100644 package/ctcgfw/luci-app-ssr-plus-Jo/luasrc/view/shadowsocksr/status2.htm create mode 100644 package/ctcgfw/luci-app-ssr-plus-Jo/po/zh-cn/ssr-plus.zh-cn.lmo create mode 100644 package/ctcgfw/luci-app-ssr-plus-Jo/root/etc/china_ssr.txt create mode 100644 package/ctcgfw/luci-app-ssr-plus-Jo/root/etc/config/black.list create mode 100644 package/ctcgfw/luci-app-ssr-plus-Jo/root/etc/config/gfw.list create mode 100644 package/ctcgfw/luci-app-ssr-plus-Jo/root/etc/config/google_fu_mode create mode 100644 package/ctcgfw/luci-app-ssr-plus-Jo/root/etc/config/shadowsocksr create mode 100644 package/ctcgfw/luci-app-ssr-plus-Jo/root/etc/config/white.list create mode 100644 package/ctcgfw/luci-app-ssr-plus-Jo/root/etc/dnsmasq.oversea/base_list.conf create mode 100644 package/ctcgfw/luci-app-ssr-plus-Jo/root/etc/dnsmasq.oversea/oversea_list.conf create mode 100644 package/ctcgfw/luci-app-ssr-plus-Jo/root/etc/dnsmasq.ssr/ad.conf create mode 100644 package/ctcgfw/luci-app-ssr-plus-Jo/root/etc/dnsmasq.ssr/appoint_list.conf create mode 100644 package/ctcgfw/luci-app-ssr-plus-Jo/root/etc/dnsmasq.ssr/custom_forward.conf create mode 100644 package/ctcgfw/luci-app-ssr-plus-Jo/root/etc/dnsmasq.ssr/gfw_base.conf create mode 100644 package/ctcgfw/luci-app-ssr-plus-Jo/root/etc/dnsmasq.ssr/gfw_list.conf create mode 100755 package/ctcgfw/luci-app-ssr-plus-Jo/root/etc/init.d/shadowsocksr create mode 100755 package/ctcgfw/luci-app-ssr-plus-Jo/root/etc/uci-defaults/luci-ssr-plus create mode 100755 package/ctcgfw/luci-app-ssr-plus-Jo/root/usr/bin/ssr-ad create mode 100755 package/ctcgfw/luci-app-ssr-plus-Jo/root/usr/bin/ssr-gfw create mode 100755 package/ctcgfw/luci-app-ssr-plus-Jo/root/usr/bin/ssr-monitor create mode 100755 package/ctcgfw/luci-app-ssr-plus-Jo/root/usr/bin/ssr-rules create mode 100755 package/ctcgfw/luci-app-ssr-plus-Jo/root/usr/bin/ssr-switch create mode 100755 package/ctcgfw/luci-app-ssr-plus-Jo/root/usr/share/shadowsocksr/chinaipset.sh create mode 100644 package/ctcgfw/luci-app-ssr-plus-Jo/root/usr/share/shadowsocksr/gentrojanconfig.lua create mode 100644 package/ctcgfw/luci-app-ssr-plus-Jo/root/usr/share/shadowsocksr/genv2config.lua create mode 100644 package/ctcgfw/luci-app-ssr-plus-Jo/root/usr/share/shadowsocksr/genv2config_haproxy.lua create mode 100644 package/ctcgfw/luci-app-ssr-plus-Jo/root/usr/share/shadowsocksr/genv2config_local.lua create mode 100644 package/ctcgfw/luci-app-ssr-plus-Jo/root/usr/share/shadowsocksr/genv2config_server.lua create mode 100755 package/ctcgfw/luci-app-ssr-plus-Jo/root/usr/share/shadowsocksr/gfw2ipset.sh create mode 100755 package/ctcgfw/luci-app-ssr-plus-Jo/root/usr/share/shadowsocksr/subscribe.sh create mode 100755 package/ctcgfw/luci-app-ssr-plus-Jo/root/usr/share/shadowsocksr/update.sh create mode 100644 package/ctcgfw/luci-app-ssr-plus-Jo/root/usr/share/shadowsocksr/v2ray_update1.sh create mode 100644 package/ctcgfw/luci-app-unblockneteasemusic-go/Makefile create mode 100644 package/ctcgfw/luci-app-unblockneteasemusic-go/luasrc/controller/unblockneteasemusic-go.lua create mode 100644 package/ctcgfw/luci-app-unblockneteasemusic-go/luasrc/model/cbi/unblockneteasemusic-go.lua create mode 100644 package/ctcgfw/luci-app-unblockneteasemusic-go/luasrc/model/cbi/unblockneteasemusicgo_log.lua create mode 100644 package/ctcgfw/luci-app-unblockneteasemusic-go/luasrc/view/unblockneteasemusic-go/unblockneteasemusic_go_status.htm create mode 100644 package/ctcgfw/luci-app-unblockneteasemusic-go/root/etc/config/unblockneteasemusic-go create mode 100755 package/ctcgfw/luci-app-unblockneteasemusic-go/root/etc/init.d/unblockneteasemusic-go create mode 100755 package/ctcgfw/luci-app-unblockneteasemusic-go/root/etc/ppp/ip-up.d/unblockneteasemusic-go create mode 100755 package/ctcgfw/luci-app-unblockneteasemusic-go/root/etc/uci-defaults/unblockneteasemusic-go create mode 100755 package/ctcgfw/luci-app-unblockneteasemusic-go/root/usr/share/UnblockNeteaseMusic-Go/log_check.sh create mode 100644 package/ctcgfw/luci-app-unblockneteasemusic-mini/Makefile create mode 100644 package/ctcgfw/luci-app-unblockneteasemusic-mini/luasrc/controller/unblockneteasemusic-mini.lua create mode 100644 package/ctcgfw/luci-app-unblockneteasemusic-mini/luasrc/model/cbi/unblockneteasemusic-mini.lua create mode 100644 package/ctcgfw/luci-app-unblockneteasemusic-mini/luasrc/view/unblockneteasemusic-mini/unblockneteasemusic_mini_status.htm create mode 100644 package/ctcgfw/luci-app-unblockneteasemusic-mini/root/etc/config/unblockneteasemusic-mini create mode 100755 package/ctcgfw/luci-app-unblockneteasemusic-mini/root/etc/init.d/unblockneteasemusic-mini create mode 100755 package/ctcgfw/luci-app-unblockneteasemusic-mini/root/etc/ppp/ip-up.d/unblockneteasemusic-mini create mode 100755 package/ctcgfw/luci-app-unblockneteasemusic-mini/root/etc/uci-defaults/unblockneteasemusic-mini create mode 100644 package/ctcgfw/luci-app-unblockneteasemusic/Makefile create mode 100644 package/ctcgfw/luci-app-unblockneteasemusic/luasrc/controller/unblockneteasemusic.lua create mode 100644 package/ctcgfw/luci-app-unblockneteasemusic/luasrc/model/cbi/unblockneteasemusic.lua create mode 100644 package/ctcgfw/luci-app-unblockneteasemusic/luasrc/model/cbi/unblockneteasemusic_upcore.lua create mode 100644 package/ctcgfw/luci-app-unblockneteasemusic/luasrc/model/cbi/unblockneteasemusiclog.lua create mode 100644 package/ctcgfw/luci-app-unblockneteasemusic/luasrc/view/unblockneteasemusic/unblockneteasemusic_status.htm create mode 100644 package/ctcgfw/luci-app-unblockneteasemusic/luasrc/view/unblockneteasemusic/update_core.htm create mode 100644 package/ctcgfw/luci-app-unblockneteasemusic/root/etc/config/unblockneteasemusic create mode 100755 package/ctcgfw/luci-app-unblockneteasemusic/root/etc/init.d/unblockneteasemusic create mode 100755 package/ctcgfw/luci-app-unblockneteasemusic/root/etc/ppp/ip-up.d/unblockneteasemusic create mode 100755 package/ctcgfw/luci-app-unblockneteasemusic/root/etc/uci-defaults/unblockneteasemusic create mode 100755 package/ctcgfw/luci-app-unblockneteasemusic/root/usr/share/unblockneteasemusic/log_check.sh create mode 100755 package/ctcgfw/luci-app-unblockneteasemusic/root/usr/share/unblockneteasemusic/update_core.sh create mode 100644 package/ctcgfw/luci-app-usb3disable/Makefile create mode 100644 package/ctcgfw/luci-app-usb3disable/luasrc/controller/usb3disable.lua create mode 100644 package/ctcgfw/luci-app-usb3disable/luasrc/model/cbi/usb3disable.lua create mode 100644 package/ctcgfw/luci-app-usb3disable/root/etc/config/usb3disable create mode 100644 package/ctcgfw/luci-app-vssr/Makefile create mode 100644 package/ctcgfw/luci-app-vssr/luasrc/controller/vssr.lua create mode 100644 package/ctcgfw/luci-app-vssr/luasrc/model/cbi/vssr/advanced.lua create mode 100644 package/ctcgfw/luci-app-vssr/luasrc/model/cbi/vssr/client-config.lua create mode 100644 package/ctcgfw/luci-app-vssr/luasrc/model/cbi/vssr/client.lua create mode 100644 package/ctcgfw/luci-app-vssr/luasrc/model/cbi/vssr/control.lua create mode 100644 package/ctcgfw/luci-app-vssr/luasrc/model/cbi/vssr/list.lua create mode 100644 package/ctcgfw/luci-app-vssr/luasrc/model/cbi/vssr/log.lua create mode 100644 package/ctcgfw/luci-app-vssr/luasrc/model/cbi/vssr/server-config.lua create mode 100644 package/ctcgfw/luci-app-vssr/luasrc/model/cbi/vssr/server.lua create mode 100644 package/ctcgfw/luci-app-vssr/luasrc/model/cbi/vssr/servers.lua create mode 100644 package/ctcgfw/luci-app-vssr/luasrc/model/cbi/vssr/status.lua create mode 100644 package/ctcgfw/luci-app-vssr/luasrc/model/cbi/vssr/subscription.lua create mode 100644 package/ctcgfw/luci-app-vssr/luasrc/view/vssr/cell_valuefooter.htm create mode 100644 package/ctcgfw/luci-app-vssr/luasrc/view/vssr/cell_valueheader.htm create mode 100644 package/ctcgfw/luci-app-vssr/luasrc/view/vssr/check.htm create mode 100644 package/ctcgfw/luci-app-vssr/luasrc/view/vssr/checkport.htm create mode 100644 package/ctcgfw/luci-app-vssr/luasrc/view/vssr/ping.htm create mode 100644 package/ctcgfw/luci-app-vssr/luasrc/view/vssr/refresh.htm create mode 100644 package/ctcgfw/luci-app-vssr/luasrc/view/vssr/server_list.htm create mode 100644 package/ctcgfw/luci-app-vssr/luasrc/view/vssr/ssrurl.htm create mode 100644 package/ctcgfw/luci-app-vssr/luasrc/view/vssr/status.htm create mode 100644 package/ctcgfw/luci-app-vssr/luasrc/view/vssr/status2.htm create mode 100644 package/ctcgfw/luci-app-vssr/luasrc/view/vssr/tblsection.htm create mode 100644 package/ctcgfw/luci-app-vssr/luasrc/view/vssr/update_subscribe.htm create mode 100644 package/ctcgfw/luci-app-vssr/po/zh-cn/vssr.po create mode 100644 package/ctcgfw/luci-app-vssr/root/etc/china_ssr.txt create mode 100644 package/ctcgfw/luci-app-vssr/root/etc/config/black.list create mode 100644 package/ctcgfw/luci-app-vssr/root/etc/config/gfw.list create mode 100644 package/ctcgfw/luci-app-vssr/root/etc/config/google_fu_mode create mode 100644 package/ctcgfw/luci-app-vssr/root/etc/config/vssr create mode 100644 package/ctcgfw/luci-app-vssr/root/etc/config/white.list create mode 100644 package/ctcgfw/luci-app-vssr/root/etc/dnsmasq.oversea/oversea_list.conf create mode 100644 package/ctcgfw/luci-app-vssr/root/etc/dnsmasq.ssr/ad.conf create mode 100644 package/ctcgfw/luci-app-vssr/root/etc/dnsmasq.ssr/gfw_base.conf create mode 100644 package/ctcgfw/luci-app-vssr/root/etc/dnsmasq.ssr/gfw_list.conf create mode 100755 package/ctcgfw/luci-app-vssr/root/etc/init.d/vssr create mode 100755 package/ctcgfw/luci-app-vssr/root/etc/uci-defaults/luci-vssr create mode 100755 package/ctcgfw/luci-app-vssr/root/usr/bin/vssr-ad create mode 100755 package/ctcgfw/luci-app-vssr/root/usr/bin/vssr-gfw create mode 100755 package/ctcgfw/luci-app-vssr/root/usr/bin/vssr-monitor create mode 100755 package/ctcgfw/luci-app-vssr/root/usr/bin/vssr-qucikswitch create mode 100755 package/ctcgfw/luci-app-vssr/root/usr/bin/vssr-rules create mode 100755 package/ctcgfw/luci-app-vssr/root/usr/bin/vssr-switch create mode 100644 package/ctcgfw/luci-app-vssr/root/usr/share/vssr/GeoLite2-Country.mmdb create mode 100755 package/ctcgfw/luci-app-vssr/root/usr/share/vssr/chinaipset.sh create mode 100755 package/ctcgfw/luci-app-vssr/root/usr/share/vssr/genconfig_ss.lua create mode 100755 package/ctcgfw/luci-app-vssr/root/usr/share/vssr/genconfig_ssr.lua create mode 100755 package/ctcgfw/luci-app-vssr/root/usr/share/vssr/genconfig_v2ray.lua create mode 100755 package/ctcgfw/luci-app-vssr/root/usr/share/vssr/genconfig_v2ray_s.lua create mode 100755 package/ctcgfw/luci-app-vssr/root/usr/share/vssr/gentrojanconfig.lua create mode 100755 package/ctcgfw/luci-app-vssr/root/usr/share/vssr/genv2config.lua create mode 100755 package/ctcgfw/luci-app-vssr/root/usr/share/vssr/genv2config_local.lua create mode 100755 package/ctcgfw/luci-app-vssr/root/usr/share/vssr/getflag.sh create mode 100755 package/ctcgfw/luci-app-vssr/root/usr/share/vssr/getip.sh create mode 100755 package/ctcgfw/luci-app-vssr/root/usr/share/vssr/gfw2ipset.sh create mode 100755 package/ctcgfw/luci-app-vssr/root/usr/share/vssr/subscribe.sh create mode 100755 package/ctcgfw/luci-app-vssr/root/usr/share/vssr/update.sh create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/css/flag-icon.min.css create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/css/vssr.css create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji.js create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/1f1e6-1f1e8.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/1f1e6-1f1e9.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/1f1e6-1f1ea.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/1f1e6-1f1eb.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/1f1e6-1f1ec.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/1f1e6-1f1ee.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/1f1e6-1f1f1.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/1f1e6-1f1f2.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/1f1e6-1f1f4.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/1f1e6-1f1f6.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/1f1e6-1f1f7.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/1f1e6-1f1f8.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/1f1e6-1f1f9.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/1f1e6-1f1fa.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/1f1e6-1f1fc.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/1f1e6-1f1fd.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/1f1e6-1f1ff.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/1f1e7-1f1e6.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/1f1e7-1f1e7.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/1f1e7-1f1e9.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/1f1e7-1f1ea.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/1f1e7-1f1eb.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/1f1e7-1f1ec.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/1f1e7-1f1ed.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/1f1e7-1f1ee.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/1f1e7-1f1ef.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/1f1e7-1f1f1.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/1f1e7-1f1f2.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/1f1e7-1f1f3.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/1f1e7-1f1f4.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/1f1e7-1f1f6.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/1f1e7-1f1f7.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/1f1e7-1f1f8.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/1f1e7-1f1f9.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/1f1e7-1f1fb.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/1f1e7-1f1fc.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/1f1e7-1f1fe.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/1f1e7-1f1ff.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/1f1e8-1f1e6.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/1f1e8-1f1e8.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/1f1e8-1f1e9.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/1f1e8-1f1eb.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/1f1e8-1f1ec.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/1f1e8-1f1ed.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/1f1e8-1f1ee.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/1f1e8-1f1f0.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/1f1e8-1f1f1.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/1f1e8-1f1f2.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/1f1e8-1f1f3.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/1f1e8-1f1f4.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/1f1e8-1f1f5.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/1f1e8-1f1f7.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/1f1e8-1f1fa.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/1f1e8-1f1fb.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/1f1e8-1f1fc.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/1f1e8-1f1fd.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/1f1e8-1f1fe.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/1f1e8-1f1ff.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/1f1e9-1f1ea.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/1f1e9-1f1ec.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/1f1e9-1f1ef.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/1f1e9-1f1f0.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/1f1e9-1f1f2.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/1f1e9-1f1f4.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/1f1e9-1f1ff.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/1f1ea-1f1e6.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/1f1ea-1f1e8.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/1f1ea-1f1ea.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/1f1ea-1f1ec.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/1f1ea-1f1ed.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/1f1ea-1f1f7.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/1f1ea-1f1f8.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/1f1ea-1f1f9.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/1f1ea-1f1fa.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/1f1eb-1f1ee.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/1f1eb-1f1ef.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/1f1eb-1f1f0.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/1f1eb-1f1f2.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/1f1eb-1f1f4.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/1f1eb-1f1f7.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/1f1ec-1f1e6.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/1f1ec-1f1e7.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/1f1ec-1f1e9.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/1f1ec-1f1ea.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/1f1ec-1f1eb.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/1f1ec-1f1ec.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/1f1ec-1f1ed.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/1f1ec-1f1ee.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/1f1ec-1f1f1.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/1f1ec-1f1f2.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/1f1ec-1f1f3.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/1f1ec-1f1f5.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/1f1ec-1f1f6.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/1f1ec-1f1f7.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/1f1ec-1f1f8.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/1f1ec-1f1f9.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/1f1ec-1f1fa.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/1f1ec-1f1fc.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/1f1ec-1f1fe.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/1f1ed-1f1f0.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/1f1ed-1f1f2.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/1f1ed-1f1f3.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/1f1ed-1f1f7.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/1f1ed-1f1f9.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/1f1ed-1f1fa.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/1f1ee-1f1e8.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/1f1ee-1f1e9.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/1f1ee-1f1ea.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/1f1ee-1f1f1.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/1f1ee-1f1f2.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/1f1ee-1f1f3.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/1f1ee-1f1f4.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/1f1ee-1f1f6.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/1f1ee-1f1f7.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/1f1ee-1f1f8.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/1f1ee-1f1f9.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/1f1ef-1f1ea.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/1f1ef-1f1f2.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/1f1ef-1f1f4.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/1f1ef-1f1f5.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/1f1f0-1f1ea.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/1f1f0-1f1ec.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/1f1f0-1f1ed.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/1f1f0-1f1ee.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/1f1f0-1f1f2.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/1f1f0-1f1f3.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/1f1f0-1f1f5.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/1f1f0-1f1f7.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/1f1f0-1f1fc.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/1f1f0-1f1fe.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/1f1f0-1f1ff.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/1f1f1-1f1e6.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/1f1f1-1f1e7.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/1f1f1-1f1e8.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/1f1f1-1f1ee.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/1f1f1-1f1f0.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/1f1f1-1f1f7.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/1f1f1-1f1f8.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/1f1f1-1f1f9.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/1f1f1-1f1fa.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/1f1f1-1f1fb.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/1f1f1-1f1fe.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/1f1f2-1f1e6.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/1f1f2-1f1e8.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/1f1f2-1f1e9.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/1f1f2-1f1ea.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/1f1f2-1f1eb.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/1f1f2-1f1ec.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/1f1f2-1f1ed.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/1f1f2-1f1f0.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/1f1f2-1f1f1.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/1f1f2-1f1f2.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/1f1f2-1f1f3.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/1f1f2-1f1f4.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/1f1f2-1f1f5.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/1f1f2-1f1f6.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/1f1f2-1f1f7.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/1f1f2-1f1f8.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/1f1f2-1f1f9.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/1f1f2-1f1fa.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/1f1f2-1f1fb.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/1f1f2-1f1fc.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/1f1f2-1f1fd.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/1f1f2-1f1fe.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/1f1f2-1f1ff.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/1f1f3-1f1e6.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/1f1f3-1f1e8.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/1f1f3-1f1ea.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/1f1f3-1f1eb.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/1f1f3-1f1ec.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/1f1f3-1f1ee.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/1f1f3-1f1f1.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/1f1f3-1f1f4.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/1f1f3-1f1f5.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/1f1f3-1f1f7.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/1f1f3-1f1fa.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/1f1f3-1f1ff.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/1f1f4-1f1f2.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/1f1f5-1f1e6.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/1f1f5-1f1ea.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/1f1f5-1f1eb.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/1f1f5-1f1ec.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/1f1f5-1f1ed.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/1f1f5-1f1f0.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/1f1f5-1f1f1.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/1f1f5-1f1f2.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/1f1f5-1f1f3.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/1f1f5-1f1f7.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/1f1f5-1f1f8.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/1f1f5-1f1f9.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/1f1f5-1f1fc.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/1f1f5-1f1fe.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/1f1f6-1f1e6.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/1f1f7-1f1ea.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/1f1f7-1f1f4.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/1f1f7-1f1f8.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/1f1f7-1f1fa.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/1f1f7-1f1fc.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/1f1f8-1f1e6.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/1f1f8-1f1e7.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/1f1f8-1f1e8.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/1f1f8-1f1e9.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/1f1f8-1f1ea.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/1f1f8-1f1ec.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/1f1f8-1f1ed.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/1f1f8-1f1ee.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/1f1f8-1f1ef.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/1f1f8-1f1f0.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/1f1f8-1f1f1.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/1f1f8-1f1f2.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/1f1f8-1f1f3.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/1f1f8-1f1f4.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/1f1f8-1f1f7.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/1f1f8-1f1f8.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/1f1f8-1f1f9.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/1f1f8-1f1fb.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/1f1f8-1f1fd.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/1f1f8-1f1fe.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/1f1f8-1f1ff.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/1f1f9-1f1e6.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/1f1f9-1f1e8.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/1f1f9-1f1e9.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/1f1f9-1f1eb.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/1f1f9-1f1ec.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/1f1f9-1f1ed.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/1f1f9-1f1ef.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/1f1f9-1f1f0.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/1f1f9-1f1f1.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/1f1f9-1f1f2.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/1f1f9-1f1f3.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/1f1f9-1f1f4.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/1f1f9-1f1f7.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/1f1f9-1f1f9.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/1f1f9-1f1fb.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/1f1f9-1f1fc.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/1f1f9-1f1ff.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/1f1fa-1f1e6.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/1f1fa-1f1ec.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/1f1fa-1f1f2.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/1f1fa-1f1f3.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/1f1fa-1f1f8.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/1f1fa-1f1fe.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/1f1fa-1f1ff.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/1f1fb-1f1e6.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/1f1fb-1f1e8.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/1f1fb-1f1ea.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/1f1fb-1f1ec.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/1f1fb-1f1ee.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/1f1fb-1f1f3.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/1f1fb-1f1fa.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/1f1fc-1f1eb.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/1f1fc-1f1f8.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/1f1fd-1f1f0.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/1f1fe-1f1ea.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/1f1fe-1f1f9.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/1f1ff-1f1e6.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/1f1ff-1f1f2.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/1f1ff-1f1fc.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/2x/1f1e6-1f1e8.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/2x/1f1e6-1f1e9.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/2x/1f1e6-1f1ea.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/2x/1f1e6-1f1eb.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/2x/1f1e6-1f1ec.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/2x/1f1e6-1f1ee.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/2x/1f1e6-1f1f1.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/2x/1f1e6-1f1f2.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/2x/1f1e6-1f1f4.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/2x/1f1e6-1f1f6.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/2x/1f1e6-1f1f7.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/2x/1f1e6-1f1f8.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/2x/1f1e6-1f1f9.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/2x/1f1e6-1f1fa.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/2x/1f1e6-1f1fc.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/2x/1f1e6-1f1fd.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/2x/1f1e6-1f1ff.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/2x/1f1e7-1f1e6.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/2x/1f1e7-1f1e7.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/2x/1f1e7-1f1e9.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/2x/1f1e7-1f1ea.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/2x/1f1e7-1f1eb.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/2x/1f1e7-1f1ec.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/2x/1f1e7-1f1ed.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/2x/1f1e7-1f1ee.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/2x/1f1e7-1f1ef.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/2x/1f1e7-1f1f1.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/2x/1f1e7-1f1f2.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/2x/1f1e7-1f1f3.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/2x/1f1e7-1f1f4.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/2x/1f1e7-1f1f6.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/2x/1f1e7-1f1f7.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/2x/1f1e7-1f1f8.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/2x/1f1e7-1f1f9.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/2x/1f1e7-1f1fb.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/2x/1f1e7-1f1fc.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/2x/1f1e7-1f1fe.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/2x/1f1e7-1f1ff.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/2x/1f1e8-1f1e6.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/2x/1f1e8-1f1e8.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/2x/1f1e8-1f1e9.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/2x/1f1e8-1f1eb.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/2x/1f1e8-1f1ec.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/2x/1f1e8-1f1ed.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/2x/1f1e8-1f1ee.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/2x/1f1e8-1f1f0.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/2x/1f1e8-1f1f1.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/2x/1f1e8-1f1f2.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/2x/1f1e8-1f1f3.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/2x/1f1e8-1f1f4.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/2x/1f1e8-1f1f5.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/2x/1f1e8-1f1f7.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/2x/1f1e8-1f1fa.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/2x/1f1e8-1f1fb.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/2x/1f1e8-1f1fc.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/2x/1f1e8-1f1fd.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/2x/1f1e8-1f1fe.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/2x/1f1e8-1f1ff.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/2x/1f1e9-1f1ea.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/2x/1f1e9-1f1ec.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/2x/1f1e9-1f1ef.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/2x/1f1e9-1f1f0.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/2x/1f1e9-1f1f2.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/2x/1f1e9-1f1f4.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/2x/1f1e9-1f1ff.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/2x/1f1ea-1f1e6.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/2x/1f1ea-1f1e8.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/2x/1f1ea-1f1ea.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/2x/1f1ea-1f1ec.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/2x/1f1ea-1f1ed.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/2x/1f1ea-1f1f7.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/2x/1f1ea-1f1f8.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/2x/1f1ea-1f1f9.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/2x/1f1ea-1f1fa.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/2x/1f1eb-1f1ee.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/2x/1f1eb-1f1ef.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/2x/1f1eb-1f1f0.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/2x/1f1eb-1f1f2.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/2x/1f1eb-1f1f4.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/2x/1f1eb-1f1f7.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/2x/1f1ec-1f1e6.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/2x/1f1ec-1f1e7.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/2x/1f1ec-1f1e9.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/2x/1f1ec-1f1ea.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/2x/1f1ec-1f1eb.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/2x/1f1ec-1f1ec.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/2x/1f1ec-1f1ed.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/2x/1f1ec-1f1ee.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/2x/1f1ec-1f1f1.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/2x/1f1ec-1f1f2.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/2x/1f1ec-1f1f3.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/2x/1f1ec-1f1f5.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/2x/1f1ec-1f1f6.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/2x/1f1ec-1f1f7.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/2x/1f1ec-1f1f8.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/2x/1f1ec-1f1f9.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/2x/1f1ec-1f1fa.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/2x/1f1ec-1f1fc.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/2x/1f1ec-1f1fe.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/2x/1f1ed-1f1f0.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/2x/1f1ed-1f1f2.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/2x/1f1ed-1f1f3.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/2x/1f1ed-1f1f7.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/2x/1f1ed-1f1f9.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/2x/1f1ed-1f1fa.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/2x/1f1ee-1f1e8.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/2x/1f1ee-1f1e9.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/2x/1f1ee-1f1ea.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/2x/1f1ee-1f1f1.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/2x/1f1ee-1f1f2.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/2x/1f1ee-1f1f3.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/2x/1f1ee-1f1f4.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/2x/1f1ee-1f1f6.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/2x/1f1ee-1f1f7.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/2x/1f1ee-1f1f8.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/2x/1f1ee-1f1f9.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/2x/1f1ef-1f1ea.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/2x/1f1ef-1f1f2.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/2x/1f1ef-1f1f4.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/2x/1f1ef-1f1f5.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/2x/1f1f0-1f1ea.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/2x/1f1f0-1f1ec.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/2x/1f1f0-1f1ed.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/2x/1f1f0-1f1ee.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/2x/1f1f0-1f1f2.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/2x/1f1f0-1f1f3.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/2x/1f1f0-1f1f5.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/2x/1f1f0-1f1f7.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/2x/1f1f0-1f1fc.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/2x/1f1f0-1f1fe.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/2x/1f1f0-1f1ff.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/2x/1f1f1-1f1e6.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/2x/1f1f1-1f1e7.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/2x/1f1f1-1f1e8.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/2x/1f1f1-1f1ee.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/2x/1f1f1-1f1f0.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/2x/1f1f1-1f1f7.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/2x/1f1f1-1f1f8.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/2x/1f1f1-1f1f9.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/2x/1f1f1-1f1fa.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/2x/1f1f1-1f1fb.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/2x/1f1f1-1f1fe.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/2x/1f1f2-1f1e6.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/2x/1f1f2-1f1e8.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/2x/1f1f2-1f1e9.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/2x/1f1f2-1f1ea.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/2x/1f1f2-1f1eb.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/2x/1f1f2-1f1ec.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/2x/1f1f2-1f1ed.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/2x/1f1f2-1f1f0.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/2x/1f1f2-1f1f1.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/2x/1f1f2-1f1f2.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/2x/1f1f2-1f1f3.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/2x/1f1f2-1f1f4.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/2x/1f1f2-1f1f5.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/2x/1f1f2-1f1f6.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/2x/1f1f2-1f1f7.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/2x/1f1f2-1f1f8.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/2x/1f1f2-1f1f9.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/2x/1f1f2-1f1fa.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/2x/1f1f2-1f1fb.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/2x/1f1f2-1f1fc.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/2x/1f1f2-1f1fd.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/2x/1f1f2-1f1fe.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/2x/1f1f2-1f1ff.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/2x/1f1f3-1f1e6.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/2x/1f1f3-1f1e8.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/2x/1f1f3-1f1ea.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/2x/1f1f3-1f1eb.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/2x/1f1f3-1f1ec.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/2x/1f1f3-1f1ee.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/2x/1f1f3-1f1f1.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/2x/1f1f3-1f1f4.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/2x/1f1f3-1f1f5.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/2x/1f1f3-1f1f7.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/2x/1f1f3-1f1fa.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/2x/1f1f3-1f1ff.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/2x/1f1f4-1f1f2.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/2x/1f1f5-1f1e6.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/2x/1f1f5-1f1ea.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/2x/1f1f5-1f1eb.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/2x/1f1f5-1f1ec.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/2x/1f1f5-1f1ed.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/2x/1f1f5-1f1f0.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/2x/1f1f5-1f1f1.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/2x/1f1f5-1f1f2.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/2x/1f1f5-1f1f3.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/2x/1f1f5-1f1f7.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/2x/1f1f5-1f1f8.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/2x/1f1f5-1f1f9.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/2x/1f1f5-1f1fc.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/2x/1f1f5-1f1fe.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/2x/1f1f6-1f1e6.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/2x/1f1f7-1f1ea.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/2x/1f1f7-1f1f4.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/2x/1f1f7-1f1f8.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/2x/1f1f7-1f1fa.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/2x/1f1f7-1f1fc.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/2x/1f1f8-1f1e6.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/2x/1f1f8-1f1e7.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/2x/1f1f8-1f1e8.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/2x/1f1f8-1f1e9.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/2x/1f1f8-1f1ea.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/2x/1f1f8-1f1ec.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/2x/1f1f8-1f1ed.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/2x/1f1f8-1f1ee.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/2x/1f1f8-1f1ef.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/2x/1f1f8-1f1f0.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/2x/1f1f8-1f1f1.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/2x/1f1f8-1f1f2.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/2x/1f1f8-1f1f3.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/2x/1f1f8-1f1f4.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/2x/1f1f8-1f1f7.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/2x/1f1f8-1f1f8.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/2x/1f1f8-1f1f9.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/2x/1f1f8-1f1fb.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/2x/1f1f8-1f1fd.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/2x/1f1f8-1f1fe.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/2x/1f1f8-1f1ff.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/2x/1f1f9-1f1e6.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/2x/1f1f9-1f1e8.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/2x/1f1f9-1f1e9.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/2x/1f1f9-1f1eb.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/2x/1f1f9-1f1ec.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/2x/1f1f9-1f1ed.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/2x/1f1f9-1f1ef.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/2x/1f1f9-1f1f0.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/2x/1f1f9-1f1f1.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/2x/1f1f9-1f1f2.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/2x/1f1f9-1f1f3.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/2x/1f1f9-1f1f4.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/2x/1f1f9-1f1f7.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/2x/1f1f9-1f1f9.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/2x/1f1f9-1f1fb.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/2x/1f1f9-1f1fc.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/2x/1f1f9-1f1ff.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/2x/1f1fa-1f1e6.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/2x/1f1fa-1f1ec.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/2x/1f1fa-1f1f2.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/2x/1f1fa-1f1f3.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/2x/1f1fa-1f1f8.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/2x/1f1fa-1f1fe.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/2x/1f1fa-1f1ff.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/2x/1f1fb-1f1e6.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/2x/1f1fb-1f1e8.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/2x/1f1fb-1f1ea.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/2x/1f1fb-1f1ec.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/2x/1f1fb-1f1ee.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/2x/1f1fb-1f1f3.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/2x/1f1fb-1f1fa.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/2x/1f1fc-1f1eb.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/2x/1f1fc-1f1f8.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/2x/1f1fd-1f1f0.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/2x/1f1fe-1f1ea.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/2x/1f1fe-1f1f9.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/2x/1f1ff-1f1e6.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/2x/1f1ff-1f1f2.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/emoji/2x/1f1ff-1f1fc.png create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/flags/4x3/ad.svg create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/flags/4x3/ae.svg create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/flags/4x3/af.svg create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/flags/4x3/ag.svg create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/flags/4x3/ai.svg create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/flags/4x3/al.svg create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/flags/4x3/am.svg create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/flags/4x3/ao.svg create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/flags/4x3/aq.svg create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/flags/4x3/ar.svg create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/flags/4x3/as.svg create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/flags/4x3/at.svg create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/flags/4x3/au.svg create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/flags/4x3/aw.svg create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/flags/4x3/ax.svg create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/flags/4x3/az.svg create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/flags/4x3/ba.svg create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/flags/4x3/bb.svg create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/flags/4x3/bd.svg create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/flags/4x3/be.svg create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/flags/4x3/bf.svg create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/flags/4x3/bg.svg create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/flags/4x3/bh.svg create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/flags/4x3/bi.svg create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/flags/4x3/bj.svg create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/flags/4x3/bl.svg create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/flags/4x3/bm.svg create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/flags/4x3/bn.svg create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/flags/4x3/bo.svg create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/flags/4x3/bq.svg create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/flags/4x3/br.svg create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/flags/4x3/bs.svg create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/flags/4x3/bt.svg create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/flags/4x3/bv.svg create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/flags/4x3/bw.svg create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/flags/4x3/by.svg create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/flags/4x3/bz.svg create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/flags/4x3/ca.svg create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/flags/4x3/cc.svg create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/flags/4x3/cd.svg create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/flags/4x3/cf.svg create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/flags/4x3/cg.svg create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/flags/4x3/ch.svg create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/flags/4x3/ci.svg create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/flags/4x3/ck.svg create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/flags/4x3/cl.svg create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/flags/4x3/cm.svg create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/flags/4x3/cn.svg create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/flags/4x3/co.svg create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/flags/4x3/cr.svg create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/flags/4x3/cu.svg create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/flags/4x3/cv.svg create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/flags/4x3/cw.svg create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/flags/4x3/cx.svg create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/flags/4x3/cy.svg create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/flags/4x3/cz.svg create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/flags/4x3/de.svg create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/flags/4x3/dj.svg create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/flags/4x3/dk.svg create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/flags/4x3/dm.svg create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/flags/4x3/do.svg create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/flags/4x3/dz.svg create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/flags/4x3/ec.svg create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/flags/4x3/ee.svg create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/flags/4x3/eg.svg create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/flags/4x3/eh.svg create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/flags/4x3/er.svg create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/flags/4x3/es-ca.svg create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/flags/4x3/es.svg create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/flags/4x3/et.svg create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/flags/4x3/eu.svg create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/flags/4x3/fi.svg create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/flags/4x3/fj.svg create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/flags/4x3/fk.svg create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/flags/4x3/fm.svg create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/flags/4x3/fo.svg create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/flags/4x3/fr.svg create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/flags/4x3/ga.svg create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/flags/4x3/gb-eng.svg create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/flags/4x3/gb-nir.svg create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/flags/4x3/gb-sct.svg create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/flags/4x3/gb-wls.svg create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/flags/4x3/gb.svg create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/flags/4x3/gd.svg create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/flags/4x3/ge.svg create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/flags/4x3/gf.svg create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/flags/4x3/gg.svg create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/flags/4x3/gh.svg create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/flags/4x3/gi.svg create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/flags/4x3/gl.svg create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/flags/4x3/gm.svg create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/flags/4x3/gn.svg create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/flags/4x3/gp.svg create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/flags/4x3/gq.svg create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/flags/4x3/gr.svg create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/flags/4x3/gs.svg create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/flags/4x3/gt.svg create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/flags/4x3/gu.svg create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/flags/4x3/gw.svg create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/flags/4x3/gy.svg create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/flags/4x3/hk.svg create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/flags/4x3/hm.svg create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/flags/4x3/hn.svg create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/flags/4x3/hr.svg create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/flags/4x3/ht.svg create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/flags/4x3/hu.svg create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/flags/4x3/id.svg create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/flags/4x3/ie.svg create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/flags/4x3/il.svg create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/flags/4x3/im.svg create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/flags/4x3/in.svg create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/flags/4x3/io.svg create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/flags/4x3/iq.svg create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/flags/4x3/ir.svg create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/flags/4x3/is.svg create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/flags/4x3/it.svg create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/flags/4x3/je.svg create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/flags/4x3/jm.svg create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/flags/4x3/jo.svg create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/flags/4x3/jp.svg create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/flags/4x3/ke.svg create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/flags/4x3/kg.svg create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/flags/4x3/kh.svg create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/flags/4x3/ki.svg create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/flags/4x3/km.svg create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/flags/4x3/kn.svg create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/flags/4x3/kp.svg create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/flags/4x3/kr.svg create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/flags/4x3/kw.svg create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/flags/4x3/ky.svg create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/flags/4x3/kz.svg create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/flags/4x3/la.svg create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/flags/4x3/lb.svg create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/flags/4x3/lc.svg create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/flags/4x3/li.svg create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/flags/4x3/lk.svg create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/flags/4x3/lr.svg create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/flags/4x3/ls.svg create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/flags/4x3/lt.svg create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/flags/4x3/lu.svg create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/flags/4x3/lv.svg create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/flags/4x3/ly.svg create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/flags/4x3/ma.svg create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/flags/4x3/mc.svg create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/flags/4x3/md.svg create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/flags/4x3/me.svg create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/flags/4x3/mf.svg create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/flags/4x3/mg.svg create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/flags/4x3/mh.svg create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/flags/4x3/mk.svg create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/flags/4x3/ml.svg create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/flags/4x3/mm.svg create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/flags/4x3/mn.svg create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/flags/4x3/mo.svg create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/flags/4x3/mp.svg create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/flags/4x3/mq.svg create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/flags/4x3/mr.svg create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/flags/4x3/ms.svg create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/flags/4x3/mt.svg create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/flags/4x3/mu.svg create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/flags/4x3/mv.svg create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/flags/4x3/mw.svg create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/flags/4x3/mx.svg create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/flags/4x3/my.svg create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/flags/4x3/mz.svg create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/flags/4x3/na.svg create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/flags/4x3/nc.svg create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/flags/4x3/ne.svg create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/flags/4x3/nf.svg create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/flags/4x3/ng.svg create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/flags/4x3/ni.svg create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/flags/4x3/nl.svg create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/flags/4x3/no.svg create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/flags/4x3/np.svg create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/flags/4x3/nr.svg create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/flags/4x3/nu.svg create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/flags/4x3/nz.svg create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/flags/4x3/om.svg create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/flags/4x3/pa.svg create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/flags/4x3/pe.svg create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/flags/4x3/pf.svg create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/flags/4x3/pg.svg create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/flags/4x3/ph.svg create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/flags/4x3/pk.svg create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/flags/4x3/pl.svg create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/flags/4x3/pm.svg create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/flags/4x3/pn.svg create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/flags/4x3/pr.svg create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/flags/4x3/ps.svg create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/flags/4x3/pt.svg create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/flags/4x3/pw.svg create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/flags/4x3/py.svg create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/flags/4x3/qa.svg create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/flags/4x3/re.svg create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/flags/4x3/ro.svg create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/flags/4x3/rs.svg create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/flags/4x3/ru.svg create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/flags/4x3/rw.svg create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/flags/4x3/sa.svg create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/flags/4x3/sb.svg create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/flags/4x3/sc.svg create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/flags/4x3/sd.svg create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/flags/4x3/se.svg create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/flags/4x3/sg.svg create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/flags/4x3/sh.svg create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/flags/4x3/si.svg create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/flags/4x3/sj.svg create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/flags/4x3/sk.svg create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/flags/4x3/sl.svg create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/flags/4x3/sm.svg create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/flags/4x3/sn.svg create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/flags/4x3/so.svg create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/flags/4x3/sr.svg create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/flags/4x3/ss.svg create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/flags/4x3/st.svg create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/flags/4x3/sv.svg create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/flags/4x3/sx.svg create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/flags/4x3/sy.svg create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/flags/4x3/sz.svg create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/flags/4x3/tc.svg create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/flags/4x3/td.svg create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/flags/4x3/tf.svg create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/flags/4x3/tg.svg create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/flags/4x3/th.svg create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/flags/4x3/tj.svg create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/flags/4x3/tk.svg create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/flags/4x3/tl.svg create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/flags/4x3/tm.svg create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/flags/4x3/tn.svg create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/flags/4x3/to.svg create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/flags/4x3/tr.svg create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/flags/4x3/tt.svg create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/flags/4x3/tv.svg create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/flags/4x3/tw.svg create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/flags/4x3/tz.svg create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/flags/4x3/ua.svg create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/flags/4x3/ug.svg create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/flags/4x3/um.svg create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/flags/4x3/un.svg create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/flags/4x3/us.svg create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/flags/4x3/uy.svg create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/flags/4x3/uz.svg create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/flags/4x3/va.svg create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/flags/4x3/vc.svg create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/flags/4x3/ve.svg create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/flags/4x3/vg.svg create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/flags/4x3/vi.svg create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/flags/4x3/vn.svg create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/flags/4x3/vu.svg create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/flags/4x3/wf.svg create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/flags/4x3/ws.svg create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/flags/4x3/xk.svg create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/flags/4x3/ye.svg create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/flags/4x3/yt.svg create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/flags/4x3/za.svg create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/flags/4x3/zm.svg create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/flags/4x3/zw.svg create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/img/client.svg create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/img/pdnsd.svg create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/img/site_icon1_01.jpg create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/img/site_icon1_02.jpg create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/img/site_icon1_03.jpg create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/img/site_icon1_04.jpg create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/img/site_icon_01.jpg create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/img/site_icon_02.jpg create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/img/site_icon_03.jpg create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/img/site_icon_04.jpg create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/img/socks5.svg create mode 100644 package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/img/udp.svg create mode 100644 package/ctcgfw/luci-lib-docker/Makefile create mode 100644 package/ctcgfw/luci-lib-docker/luasrc/docker.lua create mode 100644 package/ctcgfw/luci-theme-argon/Makefile create mode 100644 package/ctcgfw/luci-theme-argon/htdocs/luci-static/argon/cascade.css create mode 100644 package/ctcgfw/luci-theme-argon/htdocs/luci-static/argon/cascade.css.map create mode 100644 package/ctcgfw/luci-theme-argon/htdocs/luci-static/argon/cascade.less create mode 100644 package/ctcgfw/luci-theme-argon/htdocs/luci-static/argon/custom.css create mode 100644 package/ctcgfw/luci-theme-argon/htdocs/luci-static/argon/favicon.ico create mode 100644 package/ctcgfw/luci-theme-argon/htdocs/luci-static/argon/fonts/TypoGraphica.eot create mode 100644 package/ctcgfw/luci-theme-argon/htdocs/luci-static/argon/fonts/TypoGraphica.svg create mode 100644 package/ctcgfw/luci-theme-argon/htdocs/luci-static/argon/fonts/TypoGraphica.ttf create mode 100644 package/ctcgfw/luci-theme-argon/htdocs/luci-static/argon/fonts/TypoGraphica.woff create mode 100644 package/ctcgfw/luci-theme-argon/htdocs/luci-static/argon/fonts/argon.eot create mode 100644 package/ctcgfw/luci-theme-argon/htdocs/luci-static/argon/fonts/argon.svg create mode 100644 package/ctcgfw/luci-theme-argon/htdocs/luci-static/argon/fonts/argon.ttf create mode 100644 package/ctcgfw/luci-theme-argon/htdocs/luci-static/argon/fonts/argon.woff create mode 100644 package/ctcgfw/luci-theme-argon/htdocs/luci-static/argon/head-icon.jpg create mode 100644 package/ctcgfw/luci-theme-argon/htdocs/luci-static/argon/icons/spinner.svg create mode 100644 package/ctcgfw/luci-theme-argon/htdocs/luci-static/argon/img/bg1.jpg create mode 100644 package/ctcgfw/luci-theme-argon/htdocs/luci-static/argon/img/bg2.jpg create mode 100644 package/ctcgfw/luci-theme-argon/htdocs/luci-static/argon/img/bg3.jpg create mode 100644 package/ctcgfw/luci-theme-argon/htdocs/luci-static/argon/img/bg4.jpg create mode 100644 package/ctcgfw/luci-theme-argon/htdocs/luci-static/argon/js/jquery.min.js create mode 100644 package/ctcgfw/luci-theme-argon/htdocs/luci-static/argon/js/script.js create mode 100644 package/ctcgfw/luci-theme-argon/htdocs/luci-static/argon/logo.png create mode 100644 package/ctcgfw/luci-theme-argon/luasrc/view/themes/argon/footer.htm create mode 100644 package/ctcgfw/luci-theme-argon/luasrc/view/themes/argon/header.htm create mode 100755 package/ctcgfw/luci-theme-argon/root/etc/uci-defaults/30_luci-theme-argon create mode 100644 package/ctcgfw/oaf/Makefile create mode 100644 package/ctcgfw/oaf/src/Makefile create mode 100644 package/ctcgfw/oaf/src/af_client.c create mode 100644 package/ctcgfw/oaf/src/af_client.h create mode 100644 package/ctcgfw/oaf/src/af_client_fs.c create mode 100644 package/ctcgfw/oaf/src/af_client_fs.h create mode 100644 package/ctcgfw/oaf/src/af_log.c create mode 100644 package/ctcgfw/oaf/src/af_log.h create mode 100644 package/ctcgfw/oaf/src/af_utils.c create mode 100644 package/ctcgfw/oaf/src/af_utils.h create mode 100644 package/ctcgfw/oaf/src/app_filter.c create mode 100644 package/ctcgfw/oaf/src/app_filter.h create mode 100644 package/ctcgfw/oaf/src/app_filter_config.c create mode 100644 package/ctcgfw/oaf/src/cJSON.c create mode 100644 package/ctcgfw/oaf/src/cJSON.h create mode 100644 package/ctcgfw/oaf/src/regexp.c create mode 100755 package/ctcgfw/open-app-filter/Makefile create mode 100755 package/ctcgfw/open-app-filter/files/appfilter.config create mode 100755 package/ctcgfw/open-app-filter/files/appfilter.init create mode 100755 package/ctcgfw/open-app-filter/files/appfilter.sh create mode 100644 package/ctcgfw/open-app-filter/files/feature.cfg create mode 100755 package/ctcgfw/open-app-filter/files/gen_class.sh create mode 100644 package/ctcgfw/openwrt-chinadns-ng/Makefile create mode 100644 package/ctcgfw/openwrt-simple-obfs/Makefile create mode 100644 package/ctcgfw/openwrt-ssocks/Makefile create mode 100644 package/ctcgfw/openwrt-udpspeeder/Makefile create mode 100644 package/ctcgfw/openwrt-v2ray-plugin/Makefile create mode 100644 package/ctcgfw/parted/Makefile create mode 100644 package/ctcgfw/port-mirroring/Makefile create mode 100644 package/ctcgfw/rclone-webui-react/Makefile create mode 100644 package/ctcgfw/rclone/Makefile create mode 100644 package/ctcgfw/rclone/patches/000-disable-plugins.patch create mode 100644 package/ctcgfw/tcping/Makefile create mode 100644 package/jsda/AdGuardHome/Makefile create mode 100644 package/jsda/AdGuardHome/conf/big_space.yaml create mode 100644 package/jsda/AdGuardHome/conf/small_flash.yaml create mode 100644 package/jsda/clash/Makefile create mode 100644 package/jsda/clash/file/core_version create mode 100755 package/jsda/cpulimit-ng/.svn/entries create mode 100755 package/jsda/cpulimit-ng/.svn/format create mode 100755 package/jsda/cpulimit-ng/.svn/pristine/01/014cc3b5249ab85b7f736854b13720614236af95.svn-base create mode 100755 package/jsda/cpulimit-ng/.svn/pristine/01/017cd9106dc291766b7865b51bf3dac4a1e3ffdf.svn-base create mode 100755 package/jsda/cpulimit-ng/.svn/pristine/08/082e091b43bc5c084d5eb04ef6a61b06223a84f8.svn-base create mode 100755 package/jsda/cpulimit-ng/.svn/pristine/2a/2a189807283be6e6944114df69ca13f8f52bb434.svn-base create mode 100755 package/jsda/cpulimit-ng/.svn/pristine/85/850938d5ba6ec8875e3b72738e1b7ef6f79b27d8.svn-base create mode 100755 package/jsda/cpulimit-ng/.svn/pristine/90/90187d65d9aec8d579f1c275122c039d0274fd2f.svn-base create mode 100755 package/jsda/cpulimit-ng/.svn/pristine/92/9235e0e0ddbf58512ac7e37d5abe866bf9b2758b.svn-base create mode 100755 package/jsda/cpulimit-ng/.svn/pristine/9b/9bf53bde6f0b946a5c3f2abb79b5e3724ef909bc.svn-base create mode 100755 package/jsda/cpulimit-ng/.svn/pristine/ab/ab83effc7cea777dff780ce210a467da64228e2c.svn-base create mode 100755 package/jsda/cpulimit-ng/.svn/pristine/b1/b1aea664a1b0881a70c715488fb183ed9f172b4b.svn-base create mode 100755 package/jsda/cpulimit-ng/.svn/pristine/d2/d219ad87853a6ceb541df6edae8ac0d500efe25f.svn-base create mode 100755 package/jsda/cpulimit-ng/.svn/wc.db create mode 100644 package/jsda/cpulimit-ng/Makefile create mode 100644 package/jsda/cpulimit-ng/readme-ng.txt create mode 100644 package/jsda/cpulimit-ng/src/Makefile create mode 100644 package/jsda/cpulimit-ng/src/README create mode 100644 package/jsda/cpulimit-ng/src/cpulimit.c create mode 100644 package/jsda/cpulimit-ng/src/list.c create mode 100644 package/jsda/cpulimit-ng/src/list.h create mode 100644 package/jsda/cpulimit-ng/src/process.c create mode 100644 package/jsda/cpulimit-ng/src/process.h create mode 100644 package/jsda/cpulimit-ng/src/procutils.c create mode 100644 package/jsda/cpulimit-ng/src/procutils.h create mode 100644 package/jsda/cpulimit/Makefile create mode 100644 package/jsda/cpulimit/src/Makefile create mode 100644 package/jsda/cpulimit/src/cpulimit.c create mode 100644 package/jsda/cpulimit/src/list.c create mode 100644 package/jsda/cpulimit/src/list.h create mode 100644 package/jsda/cpulimit/src/memrchr.c create mode 100644 package/jsda/cpulimit/src/process_group.c create mode 100644 package/jsda/cpulimit/src/process_group.h create mode 100644 package/jsda/cpulimit/src/process_iterator.c create mode 100644 package/jsda/cpulimit/src/process_iterator.h create mode 100644 package/jsda/cpulimit/src/process_iterator_apple.c create mode 100644 package/jsda/cpulimit/src/process_iterator_freebsd.c create mode 100644 package/jsda/cpulimit/src/process_iterator_linux.c create mode 100644 package/jsda/cpulimit/src/process_iterator_solaris.c create mode 100644 package/jsda/dnscrypt-proxy-full/Makefile create mode 100644 package/jsda/dvb/dvb-firmware/Makefile create mode 100755 package/jsda/dvb/dvb-firmware/src/dvb-demod-mn88472-02.fw create mode 100755 package/jsda/dvb/dvb-firmware/src/dvb-demod-mn88473-01.fw create mode 100755 package/jsda/dvb/dvb-firmware/src/dvb-demod-si2168-01.fw create mode 100755 package/jsda/dvb/dvb-firmware/src/dvb-demod-si2168-02.fw create mode 100755 package/jsda/dvb/dvb-firmware/src/dvb-demod-si2168-a20-01.fw create mode 100755 package/jsda/dvb/dvb-firmware/src/dvb-demod-si2168-a30-01.fw create mode 100755 package/jsda/dvb/dvb-firmware/src/dvb-demod-si2168-b40-01.fw create mode 100755 package/jsda/dvb/dvb-firmware/src/dvb-demod-si2168-d60-01.fw create mode 100755 package/jsda/dvb/dvb-firmware/src/dvb-demod-si2183-b60-01.fw create mode 100755 package/jsda/dvb/dvb-firmware/src/dvb-fe-ds3000.fw create mode 100755 package/jsda/dvb/dvb-firmware/src/dvb-tuner-si2141-a10-01.fw create mode 100755 package/jsda/dvb/dvb-firmware/src/dvb-tuner-si2158-a20-01.fw create mode 100755 package/jsda/dvb/dvb-firmware/src/dvb-usb-dw2101.fw create mode 100755 package/jsda/dvb/dvb-firmware/src/dvb-usb-dw2102.fw create mode 100755 package/jsda/dvb/dvb-firmware/src/dvb-usb-dw2104.fw create mode 100755 package/jsda/dvb/dvb-firmware/src/dvb-usb-dw3101.fw create mode 100755 package/jsda/dvb/dvb-firmware/src/dvb-usb-tbsqbox-id5521.fw create mode 100644 package/jsda/dvb/libdvbcsa/Makefile create mode 100644 package/jsda/fcgiwrap/Makefile create mode 100755 package/jsda/fcgiwrap/files/fcgiwrap.init create mode 100644 package/jsda/fcgiwrap/src/fcgiwrap.c create mode 100644 package/jsda/luci-app-advancedsetting/Makefile create mode 100644 package/jsda/luci-app-advancedsetting/luasrc/controller/advancedsetting.lua create mode 100644 package/jsda/luci-app-advancedsetting/luasrc/model/cbi/advancedsetting.lua create mode 100644 package/jsda/luci-app-advancedsetting/po/zh-cn/advancedsetting.po create mode 100644 package/jsda/luci-app-advancedsetting/root/etc/config/advancedsetting create mode 100644 package/jsda/luci-app-aliddns/Makefile create mode 100644 package/jsda/luci-app-aliddns/files/luci/controller/aliddns.lua create mode 100644 package/jsda/luci-app-aliddns/files/luci/i18n/aliddns.zh-cn.po create mode 100644 package/jsda/luci-app-aliddns/files/luci/model/cbi/aliddns.lua create mode 100644 package/jsda/luci-app-aliddns/files/root/etc/config/aliddns create mode 100755 package/jsda/luci-app-aliddns/files/root/etc/init.d/aliddns create mode 100755 package/jsda/luci-app-aliddns/files/root/etc/uci-defaults/luci-aliddns create mode 100755 package/jsda/luci-app-aliddns/files/root/usr/sbin/aliddns create mode 100644 package/jsda/luci-app-aliddns/tools/po2lmo/Makefile create mode 100644 package/jsda/luci-app-aliddns/tools/po2lmo/src/po2lmo.c create mode 100644 package/jsda/luci-app-aliddns/tools/po2lmo/src/template_lmo.c create mode 100644 package/jsda/luci-app-aliddns/tools/po2lmo/src/template_lmo.h create mode 100644 package/jsda/luci-app-brook/LICENSE create mode 100644 package/jsda/luci-app-brook/Makefile create mode 100644 package/jsda/luci-app-brook/README.md create mode 100644 package/jsda/luci-app-brook/files/luci/controller/brook.lua create mode 100644 package/jsda/luci-app-brook/files/luci/i18n/brook.zh-cn.po create mode 100644 package/jsda/luci-app-brook/files/luci/model/cbi/brook/client-config.lua create mode 100644 package/jsda/luci-app-brook/files/luci/model/cbi/brook/client.lua create mode 100644 package/jsda/luci-app-brook/files/luci/model/cbi/brook/gfwlist-custom.lua create mode 100644 package/jsda/luci-app-brook/files/luci/model/cbi/brook/status.lua create mode 100644 package/jsda/luci-app-brook/files/luci/view/brook/refresh.htm create mode 100644 package/jsda/luci-app-brook/files/root/etc/china_ip.txt create mode 100644 package/jsda/luci-app-brook/files/root/etc/config/brook create mode 100644 package/jsda/luci-app-brook/files/root/etc/dnsmasq.brook/custom_list.conf create mode 100644 package/jsda/luci-app-brook/files/root/etc/dnsmasq.brook/gfw_list.conf create mode 100755 package/jsda/luci-app-brook/files/root/etc/init.d/brook create mode 100755 package/jsda/luci-app-brook/files/root/etc/uci-defaults/luci-brook create mode 100755 package/jsda/luci-app-brook/files/root/usr/bin/brook-ad create mode 100755 package/jsda/luci-app-brook/files/root/usr/bin/brook-gfw create mode 100644 package/jsda/luci-app-brook/tools/po2lmo/Makefile create mode 100644 package/jsda/luci-app-brook/tools/po2lmo/src/po2lmo.c create mode 100644 package/jsda/luci-app-brook/tools/po2lmo/src/template_lmo.c create mode 100644 package/jsda/luci-app-brook/tools/po2lmo/src/template_lmo.h create mode 100644 package/jsda/luci-app-cd8021x/.gitattributes create mode 100644 package/jsda/luci-app-cd8021x/.gitignore create mode 100644 package/jsda/luci-app-cd8021x/LICENSE create mode 100644 package/jsda/luci-app-cd8021x/Makefile create mode 100644 package/jsda/luci-app-cd8021x/README.md create mode 100644 package/jsda/luci-app-cd8021x/README_zh.md create mode 100644 package/jsda/luci-app-cd8021x/files/root/etc/config/cd8021x create mode 100755 package/jsda/luci-app-cd8021x/files/root/etc/init.d/cd8021x create mode 100644 package/jsda/luci-app-cd8021x/files/root/usr/lib/lua/luci/controller/cd8021x.lua create mode 100644 package/jsda/luci-app-cd8021x/files/root/usr/lib/lua/luci/i18n/cd8021x.zh-cn.po create mode 100644 package/jsda/luci-app-cd8021x/files/root/usr/lib/lua/luci/model/cbi/cd8021x.lua create mode 100644 package/jsda/luci-app-cd8021x/screenshot_en.png create mode 100644 package/jsda/luci-app-cd8021x/screenshot_zh.png create mode 100644 package/jsda/luci-app-cd8021x/tool/po2lmo/Makefile create mode 100644 package/jsda/luci-app-cd8021x/tool/po2lmo/src/po2lmo.c create mode 100644 package/jsda/luci-app-cd8021x/tool/po2lmo/src/template_lmo.c create mode 100644 package/jsda/luci-app-cd8021x/tool/po2lmo/src/template_lmo.h create mode 100644 package/jsda/luci-app-cifs/Makefile create mode 100644 package/jsda/luci-app-cifs/luasrc/controller/cifs.lua create mode 100644 package/jsda/luci-app-cifs/luasrc/model/cbi/cifs.lua create mode 100644 package/jsda/luci-app-cifs/po/zh-cn/cifs.po create mode 100644 package/jsda/luci-app-cifs/root/etc/config/cifs create mode 100755 package/jsda/luci-app-cifs/root/etc/init.d/cifs create mode 100755 package/jsda/luci-app-cifs/root/uci-defaults/luci-cifs create mode 100644 package/jsda/luci-app-clash/Makefile create mode 100644 package/jsda/luci-app-clash/luasrc/clash.lua create mode 100644 package/jsda/luci-app-clash/luasrc/controller/clash.lua create mode 100644 package/jsda/luci-app-clash/luasrc/model/cbi/clash/actconfig.lua create mode 100644 package/jsda/luci-app-clash/luasrc/model/cbi/clash/client.lua create mode 100644 package/jsda/luci-app-clash/luasrc/model/cbi/clash/config.lua create mode 100644 package/jsda/luci-app-clash/luasrc/model/cbi/clash/create.lua create mode 100644 package/jsda/luci-app-clash/luasrc/model/cbi/clash/dns.lua create mode 100644 package/jsda/luci-app-clash/luasrc/model/cbi/clash/game-rule.lua create mode 100644 package/jsda/luci-app-clash/luasrc/model/cbi/clash/game-settings.lua create mode 100644 package/jsda/luci-app-clash/luasrc/model/cbi/clash/geoip.lua create mode 100644 package/jsda/luci-app-clash/luasrc/model/cbi/clash/groups.lua create mode 100644 package/jsda/luci-app-clash/luasrc/model/cbi/clash/import.lua create mode 100644 package/jsda/luci-app-clash/luasrc/model/cbi/clash/list.lua create mode 100644 package/jsda/luci-app-clash/luasrc/model/cbi/clash/log.lua create mode 100644 package/jsda/luci-app-clash/luasrc/model/cbi/clash/overview.lua create mode 100644 package/jsda/luci-app-clash/luasrc/model/cbi/clash/port.lua create mode 100644 package/jsda/luci-app-clash/luasrc/model/cbi/clash/provider-config.lua create mode 100644 package/jsda/luci-app-clash/luasrc/model/cbi/clash/servers-config.lua create mode 100644 package/jsda/luci-app-clash/luasrc/model/cbi/clash/update.lua create mode 100644 package/jsda/luci-app-clash/luasrc/view/clash/clash_dvalue.htm create mode 100644 package/jsda/luci-app-clash/luasrc/view/clash/clash_upload.htm create mode 100644 package/jsda/luci-app-clash/luasrc/view/clash/conf.htm create mode 100644 package/jsda/luci-app-clash/luasrc/view/clash/core_check.htm create mode 100644 package/jsda/luci-app-clash/luasrc/view/clash/game_rule.htm create mode 100644 package/jsda/luci-app-clash/luasrc/view/clash/geoip.htm create mode 100644 package/jsda/luci-app-clash/luasrc/view/clash/list.htm create mode 100644 package/jsda/luci-app-clash/luasrc/view/clash/other_button.htm create mode 100644 package/jsda/luci-app-clash/luasrc/view/clash/ping.htm create mode 100644 package/jsda/luci-app-clash/luasrc/view/clash/start_stop.htm create mode 100644 package/jsda/luci-app-clash/luasrc/view/clash/status.htm create mode 100644 package/jsda/luci-app-clash/luasrc/view/clash/status_log.htm create mode 100644 package/jsda/luci-app-clash/luasrc/view/clash/tvalue.htm create mode 100644 package/jsda/luci-app-clash/luasrc/view/clash/update.htm create mode 100644 package/jsda/luci-app-clash/po/zh-cn/clash.po create mode 100644 package/jsda/luci-app-clash/root/etc/clash/Country.mmdb create mode 100644 package/jsda/luci-app-clash/root/etc/config/clash create mode 100755 package/jsda/luci-app-clash/root/etc/init.d/clash create mode 100755 package/jsda/luci-app-clash/root/usr/share/clash/check_clashr_core_version.sh create mode 100755 package/jsda/luci-app-clash/root/usr/share/clash/check_clashtun_core_version.sh create mode 100755 package/jsda/luci-app-clash/root/usr/share/clash/check_core_version.sh create mode 100755 package/jsda/luci-app-clash/root/usr/share/clash/check_luci_version.sh create mode 100755 package/jsda/luci-app-clash/root/usr/share/clash/clash-watchdog.sh create mode 100755 package/jsda/luci-app-clash/root/usr/share/clash/clash.sh create mode 100644 package/jsda/luci-app-clash/root/usr/share/clash/clash.txt create mode 100755 package/jsda/luci-app-clash/root/usr/share/clash/clash_game_rule.sh create mode 100644 package/jsda/luci-app-clash/root/usr/share/clash/clash_real.txt create mode 100755 package/jsda/luci-app-clash/root/usr/share/clash/core_download.sh create mode 100755 package/jsda/luci-app-clash/root/usr/share/clash/cuslist.sh create mode 100644 package/jsda/luci-app-clash/root/usr/share/clash/custom_rule.yaml create mode 100644 package/jsda/luci-app-clash/root/usr/share/clash/dashboard/img/33343e6117c37aaef8886179007ba6b5.png create mode 100644 package/jsda/luci-app-clash/root/usr/share/clash/dashboard/index.html create mode 100644 package/jsda/luci-app-clash/root/usr/share/clash/dashboard/js/1.bundle.0bddb85299f970595cb5.min.js create mode 100644 package/jsda/luci-app-clash/root/usr/share/clash/dashboard/js/bundle.0bddb85299f970595cb5.min.js create mode 100644 package/jsda/luci-app-clash/root/usr/share/clash/dashboard/main.0bddb85299f970595cb5.css create mode 100644 package/jsda/luci-app-clash/root/usr/share/clash/dns.yaml create mode 100755 package/jsda/luci-app-clash/root/usr/share/clash/game-groups.sh create mode 100755 package/jsda/luci-app-clash/root/usr/share/clash/game.sh create mode 100755 package/jsda/luci-app-clash/root/usr/share/clash/geoip.sh create mode 100755 package/jsda/luci-app-clash/root/usr/share/clash/groups.sh create mode 100755 package/jsda/luci-app-clash/root/usr/share/clash/list.sh create mode 100755 package/jsda/luci-app-clash/root/usr/share/clash/load.sh create mode 100755 package/jsda/luci-app-clash/root/usr/share/clash/load_groups.sh create mode 100644 package/jsda/luci-app-clash/root/usr/share/clash/logstatus_check create mode 100644 package/jsda/luci-app-clash/root/usr/share/clash/luci_version create mode 100755 package/jsda/luci-app-clash/root/usr/share/clash/proxy.sh create mode 100755 package/jsda/luci-app-clash/root/usr/share/clash/rmlist.sh create mode 100755 package/jsda/luci-app-clash/root/usr/share/clash/rule.sh create mode 100644 package/jsda/luci-app-clash/root/usr/share/clash/rules/g_rules/Steam.rules create mode 100644 package/jsda/luci-app-clash/root/usr/share/clash/rules/rules.list create mode 100644 package/jsda/luci-app-clash/root/usr/share/clash/server.list create mode 100644 package/jsda/luci-app-clash/root/usr/share/clash/tundns.yaml create mode 100755 package/jsda/luci-app-clash/root/usr/share/clash/update.sh create mode 100755 package/jsda/luci-app-clash/root/usr/share/clash/update_all.sh create mode 100755 package/jsda/luci-app-clash/root/usr/share/clash/uplist.sh create mode 100755 package/jsda/luci-app-clash/root/usr/share/clash/v2ssr.sh create mode 100644 package/jsda/luci-app-clash/root/usr/share/clash/v2ssr/policygroup create mode 100644 package/jsda/luci-app-clash/root/usr/share/clash/v2ssr/v2ssr_custom_rule.yaml create mode 100755 package/jsda/luci-app-clash/root/usr/share/clash/yum_change.sh create mode 100644 package/jsda/luci-app-clash/tools/po2lmo/Makefile create mode 100644 package/jsda/luci-app-clash/tools/po2lmo/src/po2lmo.c create mode 100644 package/jsda/luci-app-clash/tools/po2lmo/src/template_lmo.c create mode 100644 package/jsda/luci-app-clash/tools/po2lmo/src/template_lmo.h create mode 100644 package/jsda/luci-app-cpulimit/Makefile create mode 100644 package/jsda/luci-app-cpulimit/luasrc/controller/cpulimit.lua create mode 100644 package/jsda/luci-app-cpulimit/luasrc/model/cbi/cpulimit.lua create mode 100644 package/jsda/luci-app-cpulimit/po/zh-cn/cpulimit.po create mode 100644 package/jsda/luci-app-cpulimit/root/etc/config/cpulimit create mode 100755 package/jsda/luci-app-cpulimit/root/etc/init.d/cpulimit create mode 100755 package/jsda/luci-app-cpulimit/root/etc/uci-defaults/luci-app-cpulimit create mode 100755 package/jsda/luci-app-cpulimit/root/usr/bin/cpulimit.sh create mode 100644 package/jsda/luci-app-eqos/LICENSE create mode 100644 package/jsda/luci-app-eqos/Makefile create mode 100644 package/jsda/luci-app-eqos/README.md create mode 100644 package/jsda/luci-app-eqos/README_ZH.md create mode 100644 package/jsda/luci-app-eqos/files/eqos-cbi.lua create mode 100644 package/jsda/luci-app-eqos/files/eqos-controller.lua create mode 100755 package/jsda/luci-app-eqos/files/eqos.config create mode 100755 package/jsda/luci-app-eqos/files/eqos.hotplug create mode 100755 package/jsda/luci-app-eqos/files/eqos.init create mode 100755 package/jsda/luci-app-eqos/files/eqos.sh create mode 100644 package/jsda/luci-app-eqos/files/po/zh-cn/eqos.po create mode 100755 package/jsda/luci-app-eqos/files/uci-defaults-eqos create mode 100644 package/jsda/luci-app-kcptun/Makefile create mode 100644 package/jsda/luci-app-kcptun/luasrc/controller/kcptun.lua create mode 100644 package/jsda/luci-app-kcptun/luasrc/model/cbi/kcptun/servers-detail.lua create mode 100644 package/jsda/luci-app-kcptun/luasrc/model/cbi/kcptun/servers.lua create mode 100644 package/jsda/luci-app-kcptun/luasrc/model/cbi/kcptun/settings.lua create mode 100644 package/jsda/luci-app-kcptun/luasrc/model/kcptun.lua create mode 100644 package/jsda/luci-app-kcptun/luasrc/view/kcptun/log_view.htm create mode 100644 package/jsda/luci-app-kcptun/luasrc/view/kcptun/status.htm create mode 100644 package/jsda/luci-app-kcptun/po/templates/kcptun.pot create mode 100644 package/jsda/luci-app-kcptun/po/zh-cn/kcptun.po create mode 100644 package/jsda/luci-app-kcptun/root/etc/config/kcptun create mode 100755 package/jsda/luci-app-kcptun/root/etc/init.d/kcptun create mode 100755 package/jsda/luci-app-kcptun/root/etc/uci-defaults/40_luci-kcptun create mode 100644 package/jsda/luci-app-koolproxy/Makefile create mode 100755 package/jsda/luci-app-koolproxy/files/bin/arm create mode 100755 package/jsda/luci-app-koolproxy/files/bin/i386 create mode 100755 package/jsda/luci-app-koolproxy/files/bin/mips create mode 100755 package/jsda/luci-app-koolproxy/files/bin/mipsel create mode 100755 package/jsda/luci-app-koolproxy/files/bin/x86_64 create mode 100644 package/jsda/luci-app-koolproxy/files/etc/adblocklist/adblock create mode 100644 package/jsda/luci-app-koolproxy/files/etc/adblocklist/adblockip create mode 100644 package/jsda/luci-app-koolproxy/files/etc/adblocklist/adbypass create mode 100644 package/jsda/luci-app-koolproxy/files/etc/adblocklist/adbypassip create mode 100644 package/jsda/luci-app-koolproxy/files/etc/config/koolproxy create mode 100755 package/jsda/luci-app-koolproxy/files/etc/init.d/koolproxy create mode 100755 package/jsda/luci-app-koolproxy/files/etc/uci-defaults/luci-koolproxy create mode 100755 package/jsda/luci-app-koolproxy/files/lib/upgrade/keep.d/koolproxy create mode 100644 package/jsda/luci-app-koolproxy/files/usr/lib/lua/luci/controller/koolproxy.lua create mode 100644 package/jsda/luci-app-koolproxy/files/usr/lib/lua/luci/i18n/koolproxy.zh-cn.lmo create mode 100644 package/jsda/luci-app-koolproxy/files/usr/lib/lua/luci/model/cbi/koolproxy/global.lua create mode 100644 package/jsda/luci-app-koolproxy/files/usr/lib/lua/luci/model/cbi/koolproxy/rss_rule.lua create mode 100644 package/jsda/luci-app-koolproxy/files/usr/lib/lua/luci/view/koolproxy/cadvalue.htm create mode 100644 package/jsda/luci-app-koolproxy/files/usr/lib/lua/luci/view/koolproxy/caupload.htm create mode 100644 package/jsda/luci-app-koolproxy/files/usr/lib/lua/luci/view/koolproxy/dvalue.htm create mode 100644 package/jsda/luci-app-koolproxy/files/usr/lib/lua/luci/view/koolproxy/index.htm create mode 100755 package/jsda/luci-app-koolproxy/files/usr/sbin/adblockplus create mode 100644 package/jsda/luci-app-koolproxy/files/usr/share/koolproxy/adblock.conf create mode 100755 package/jsda/luci-app-koolproxy/files/usr/share/koolproxy/camanagement create mode 100755 package/jsda/luci-app-koolproxy/files/usr/share/koolproxy/data/gen_ca.sh create mode 100755 package/jsda/luci-app-koolproxy/files/usr/share/koolproxy/data/openssl.cnf create mode 100644 package/jsda/luci-app-koolproxy/files/usr/share/koolproxy/data/rules/easylistchina.txt create mode 100644 package/jsda/luci-app-koolproxy/files/usr/share/koolproxy/data/rules/fanboy.txt create mode 100644 package/jsda/luci-app-koolproxy/files/usr/share/koolproxy/data/rules/kp.dat create mode 100644 package/jsda/luci-app-koolproxy/files/usr/share/koolproxy/data/rules/user.txt create mode 100644 package/jsda/luci-app-koolproxy/files/usr/share/koolproxy/data/rules/yhosts.txt create mode 100644 package/jsda/luci-app-koolproxy/files/usr/share/koolproxy/data/source.list create mode 100644 package/jsda/luci-app-koolproxy/files/usr/share/koolproxy/data/user.txt create mode 100644 package/jsda/luci-app-koolproxy/files/usr/share/koolproxy/dnsmasq.adblock create mode 100644 package/jsda/luci-app-koolproxy/files/usr/share/koolproxy/koolproxy_ipset.conf create mode 100755 package/jsda/luci-app-koolproxy/files/usr/share/koolproxy/kpupdate create mode 100755 package/jsda/luci-app-koolproxy/koolproxyupdate.sh create mode 100644 package/jsda/luci-app-macvlan/Makefile create mode 100644 package/jsda/luci-app-macvlan/files/luci/controller/macvlan.lua create mode 100644 package/jsda/luci-app-macvlan/files/luci/i18n/macvlan.zh-cn.po create mode 100644 package/jsda/luci-app-macvlan/files/luci/model/cbi/macvlan/macvlan.lua create mode 100644 package/jsda/luci-app-macvlan/files/root/etc/config/macvlan create mode 100755 package/jsda/luci-app-macvlan/files/root/etc/init.d/macvlan create mode 100755 package/jsda/luci-app-macvlan/files/root/etc/uci-defaults/40_luci-app-macvlan create mode 100644 package/jsda/luci-app-netdata/Makefile create mode 100644 package/jsda/luci-app-netdata/luasrc/controller/netdata.lua create mode 100644 package/jsda/luci-app-netdata/luasrc/view/netdata.htm create mode 100644 package/jsda/luci-app-netdata/po/zh-cn/netdata.po create mode 100644 package/jsda/luci-app-nfs/LICENSE create mode 100644 package/jsda/luci-app-nfs/Makefile create mode 100644 package/jsda/luci-app-nfs/files/luci/controller/nfs.lua create mode 100644 package/jsda/luci-app-nfs/files/luci/i18n/nfs.zh-cn.po create mode 100644 package/jsda/luci-app-nfs/files/luci/model/cbi/nfs.lua create mode 100644 package/jsda/luci-app-nfs/files/root/etc/config/nfs create mode 100755 package/jsda/luci-app-nfs/files/root/etc/firewall.nfs create mode 100755 package/jsda/luci-app-nfs/files/root/etc/init.d/nfs create mode 100755 package/jsda/luci-app-nfs/files/root/etc/uci-defaults/luci-nfs create mode 100644 package/jsda/luci-app-nfs/tools/po2lmo/Makefile create mode 100644 package/jsda/luci-app-nfs/tools/po2lmo/src/po2lmo.c create mode 100644 package/jsda/luci-app-nfs/tools/po2lmo/src/template_lmo.c create mode 100644 package/jsda/luci-app-nfs/tools/po2lmo/src/template_lmo.h create mode 100644 package/jsda/luci-app-ngrokc/Makefile create mode 100644 package/jsda/luci-app-ngrokc/files/etc/config/ngrokc create mode 100755 package/jsda/luci-app-ngrokc/files/etc/init.d/ngrokc create mode 100755 package/jsda/luci-app-ngrokc/files/etc/uci-defaults/luci-app-ngrokc create mode 100644 package/jsda/luci-app-ngrokc/files/usr/lib/lua/luci/controller/ngrokc.lua create mode 100644 package/jsda/luci-app-ngrokc/files/usr/lib/lua/luci/model/cbi/ngrokc/detail.lua create mode 100644 package/jsda/luci-app-ngrokc/files/usr/lib/lua/luci/model/cbi/ngrokc/overview.lua create mode 100644 package/jsda/luci-app-ngrokc/files/usr/lib/lua/luci/view/ngrokc/ngrokc_script.htm create mode 100644 package/jsda/luci-app-ngrokc/files/usr/lib/lua/luci/view/ngrokc/overview_enabled.htm create mode 100644 package/jsda/luci-app-ngrokc/files/usr/lib/lua/luci/view/ngrokc/overview_value.htm create mode 100644 package/jsda/luci-app-ngrokc/i18n/zh-cn/ngrokc.zh-cn.po create mode 100644 package/jsda/luci-app-ngrokc/tools/po2lmo/Makefile create mode 100755 package/jsda/luci-app-ngrokc/tools/po2lmo/src/po2lmo create mode 100644 package/jsda/luci-app-ngrokc/tools/po2lmo/src/po2lmo.c create mode 100644 package/jsda/luci-app-ngrokc/tools/po2lmo/src/template_lmo.c create mode 100644 package/jsda/luci-app-ngrokc/tools/po2lmo/src/template_lmo.h create mode 100644 package/jsda/luci-app-njitclient/LICENSE create mode 100644 package/jsda/luci-app-njitclient/Makefile create mode 100644 package/jsda/luci-app-njitclient/README.md create mode 100644 package/jsda/luci-app-njitclient/files/root/etc/config/njitclient create mode 100755 package/jsda/luci-app-njitclient/files/root/etc/init.d/njitclient create mode 100644 package/jsda/luci-app-njitclient/files/root/usr/lib/lua/luci/controller/njitclient.lua create mode 100644 package/jsda/luci-app-njitclient/files/root/usr/lib/lua/luci/model/cbi/njitclient.lua create mode 100644 package/jsda/luci-app-oscam/Makefile create mode 100644 package/jsda/luci-app-oscam/luasrc/controller/oscam.lua create mode 100644 package/jsda/luci-app-oscam/luasrc/model/cbi/oscam.lua create mode 100644 package/jsda/luci-app-oscam/po/zh-cn/oscam.po create mode 100644 package/jsda/luci-app-oscam/root/etc/config/oscam create mode 100755 package/jsda/luci-app-oscam/root/etc/uci-defaults/luci-oscam create mode 100644 package/jsda/luci-app-qosv4/Makefile create mode 100644 package/jsda/luci-app-qosv4/files/etc/config/qosv4 create mode 100755 package/jsda/luci-app-qosv4/files/etc/init.d/qosv4 create mode 100755 package/jsda/luci-app-qosv4/files/etc/uci-defaults/luci-qosv4 create mode 100755 package/jsda/luci-app-qosv4/files/usr/bin/qosv4 create mode 100644 package/jsda/luci-app-qosv4/files/usr/lib/lua/luci/controller/qosv4.lua create mode 100644 package/jsda/luci-app-qosv4/files/usr/lib/lua/luci/i18n/qosv4.zh-cn.lmo create mode 100644 package/jsda/luci-app-qosv4/files/usr/lib/lua/luci/model/cbi/qosv4.lua create mode 100644 package/jsda/luci-app-rtorrent/.gitignore create mode 100644 package/jsda/luci-app-rtorrent/LICENSE create mode 100644 package/jsda/luci-app-rtorrent/Makefile create mode 100644 package/jsda/luci-app-rtorrent/README.md create mode 100755 package/jsda/luci-app-rtorrent/control/conffiles create mode 100755 package/jsda/luci-app-rtorrent/control/control create mode 100755 package/jsda/luci-app-rtorrent/control/postinst create mode 100755 package/jsda/luci-app-rtorrent/control/prerm create mode 100755 package/jsda/luci-app-rtorrent/doc/lua-bencode_license create mode 100755 package/jsda/luci-app-rtorrent/doc/lua-xml-rpc_license create mode 100755 package/jsda/luci-app-rtorrent/doc/luci-app-rtorrent_license create mode 100644 package/jsda/luci-app-rtorrent/src/etc/config/rtorrent create mode 100644 package/jsda/luci-app-rtorrent/src/etc/cookies.txt create mode 100755 package/jsda/luci-app-rtorrent/src/etc/init.d/rtorrent create mode 100755 package/jsda/luci-app-rtorrent/src/etc/uci-defaults/rtorrent create mode 100644 package/jsda/luci-app-rtorrent/src/root/.rtorrent.rc create mode 100644 package/jsda/luci-app-rtorrent/src/usr/lib/lua/bencode.lua create mode 100644 package/jsda/luci-app-rtorrent/src/usr/lib/lua/luci/controller/rtorrent.lua create mode 100644 package/jsda/luci-app-rtorrent/src/usr/lib/lua/luci/model/cbi/rtorrent/add.lua create mode 100644 package/jsda/luci-app-rtorrent/src/usr/lib/lua/luci/model/cbi/rtorrent/admin/rss.lua create mode 100644 package/jsda/luci-app-rtorrent/src/usr/lib/lua/luci/model/cbi/rtorrent/admin/rtorrent.lua create mode 100644 package/jsda/luci-app-rtorrent/src/usr/lib/lua/luci/model/cbi/rtorrent/common.lua create mode 100644 package/jsda/luci-app-rtorrent/src/usr/lib/lua/luci/model/cbi/rtorrent/download.lua create mode 100644 package/jsda/luci-app-rtorrent/src/usr/lib/lua/luci/model/cbi/rtorrent/main.lua create mode 100644 package/jsda/luci-app-rtorrent/src/usr/lib/lua/luci/model/cbi/rtorrent/rss-rule.lua create mode 100644 package/jsda/luci-app-rtorrent/src/usr/lib/lua/luci/model/cbi/rtorrent/rss.lua create mode 100644 package/jsda/luci-app-rtorrent/src/usr/lib/lua/luci/model/cbi/rtorrent/string.lua create mode 100644 package/jsda/luci-app-rtorrent/src/usr/lib/lua/luci/model/cbi/rtorrent/torrent/files.lua create mode 100644 package/jsda/luci-app-rtorrent/src/usr/lib/lua/luci/model/cbi/rtorrent/torrent/info.lua create mode 100644 package/jsda/luci-app-rtorrent/src/usr/lib/lua/luci/model/cbi/rtorrent/torrent/peers.lua create mode 100644 package/jsda/luci-app-rtorrent/src/usr/lib/lua/luci/model/cbi/rtorrent/torrent/trackers.lua create mode 100644 package/jsda/luci-app-rtorrent/src/usr/lib/lua/luci/view/rtorrent/button.htm create mode 100644 package/jsda/luci-app-rtorrent/src/usr/lib/lua/luci/view/rtorrent/buttonsection.htm create mode 100644 package/jsda/luci-app-rtorrent/src/usr/lib/lua/luci/view/rtorrent/empty.htm create mode 100644 package/jsda/luci-app-rtorrent/src/usr/lib/lua/luci/view/rtorrent/fvalue.htm create mode 100644 package/jsda/luci-app-rtorrent/src/usr/lib/lua/luci/view/rtorrent/list.htm create mode 100644 package/jsda/luci-app-rtorrent/src/usr/lib/lua/luci/view/rtorrent/lvalue.htm create mode 100644 package/jsda/luci-app-rtorrent/src/usr/lib/lua/luci/view/rtorrent/rss_addrule.htm create mode 100644 package/jsda/luci-app-rtorrent/src/usr/lib/lua/luci/view/rtorrent/tabmenu.htm create mode 100644 package/jsda/luci-app-rtorrent/src/usr/lib/lua/luci/view/rtorrent/tvalue.htm create mode 100644 package/jsda/luci-app-rtorrent/src/usr/lib/lua/rss_downloader.lua create mode 100644 package/jsda/luci-app-rtorrent/src/usr/lib/lua/rtorrent.lua create mode 100644 package/jsda/luci-app-rtorrent/src/usr/lib/lua/xmlrpc/init.lua create mode 100644 package/jsda/luci-app-rtorrent/src/usr/lib/lua/xmlrpc/scgi.lua create mode 100755 package/jsda/luci-app-rtorrent/src/www/cgi-bin/rtorrent create mode 100644 package/jsda/luci-app-rtorrent/src/www/luci-static/resources/icons/filetypes/7z.png create mode 100644 package/jsda/luci-app-rtorrent/src/www/luci-static/resources/icons/filetypes/ac3.png create mode 100644 package/jsda/luci-app-rtorrent/src/www/luci-static/resources/icons/filetypes/app.png create mode 100644 package/jsda/luci-app-rtorrent/src/www/luci-static/resources/icons/filetypes/archive.png create mode 100644 package/jsda/luci-app-rtorrent/src/www/luci-static/resources/icons/filetypes/arj.png create mode 100644 package/jsda/luci-app-rtorrent/src/www/luci-static/resources/icons/filetypes/avi.png create mode 100644 package/jsda/luci-app-rtorrent/src/www/luci-static/resources/icons/filetypes/bat.png create mode 100644 package/jsda/luci-app-rtorrent/src/www/luci-static/resources/icons/filetypes/bmp.png create mode 100644 package/jsda/luci-app-rtorrent/src/www/luci-static/resources/icons/filetypes/bz2.png create mode 100644 package/jsda/luci-app-rtorrent/src/www/luci-static/resources/icons/filetypes/c.png create mode 100644 package/jsda/luci-app-rtorrent/src/www/luci-static/resources/icons/filetypes/cab.png create mode 100644 package/jsda/luci-app-rtorrent/src/www/luci-static/resources/icons/filetypes/cgi.png create mode 100644 package/jsda/luci-app-rtorrent/src/www/luci-static/resources/icons/filetypes/code.png create mode 100644 package/jsda/luci-app-rtorrent/src/www/luci-static/resources/icons/filetypes/cpp.png create mode 100644 package/jsda/luci-app-rtorrent/src/www/luci-static/resources/icons/filetypes/css.png create mode 100644 package/jsda/luci-app-rtorrent/src/www/luci-static/resources/icons/filetypes/db.png create mode 100644 package/jsda/luci-app-rtorrent/src/www/luci-static/resources/icons/filetypes/dir.png create mode 100644 package/jsda/luci-app-rtorrent/src/www/luci-static/resources/icons/filetypes/doc.png create mode 100644 package/jsda/luci-app-rtorrent/src/www/luci-static/resources/icons/filetypes/dts.png create mode 100644 package/jsda/luci-app-rtorrent/src/www/luci-static/resources/icons/filetypes/elf.png create mode 100644 package/jsda/luci-app-rtorrent/src/www/luci-static/resources/icons/filetypes/exe.png create mode 100644 package/jsda/luci-app-rtorrent/src/www/luci-static/resources/icons/filetypes/f4v.png create mode 100644 package/jsda/luci-app-rtorrent/src/www/luci-static/resources/icons/filetypes/file.png create mode 100644 package/jsda/luci-app-rtorrent/src/www/luci-static/resources/icons/filetypes/flac.png create mode 100644 package/jsda/luci-app-rtorrent/src/www/luci-static/resources/icons/filetypes/flash.png create mode 100644 package/jsda/luci-app-rtorrent/src/www/luci-static/resources/icons/filetypes/flv.png create mode 100644 package/jsda/luci-app-rtorrent/src/www/luci-static/resources/icons/filetypes/gif.png create mode 100644 package/jsda/luci-app-rtorrent/src/www/luci-static/resources/icons/filetypes/gz.png create mode 100644 package/jsda/luci-app-rtorrent/src/www/luci-static/resources/icons/filetypes/h.png create mode 100644 package/jsda/luci-app-rtorrent/src/www/luci-static/resources/icons/filetypes/htm.png create mode 100644 package/jsda/luci-app-rtorrent/src/www/luci-static/resources/icons/filetypes/html.png create mode 100644 package/jsda/luci-app-rtorrent/src/www/luci-static/resources/icons/filetypes/image.png create mode 100644 package/jsda/luci-app-rtorrent/src/www/luci-static/resources/icons/filetypes/iso.png create mode 100644 package/jsda/luci-app-rtorrent/src/www/luci-static/resources/icons/filetypes/jar.png create mode 100644 package/jsda/luci-app-rtorrent/src/www/luci-static/resources/icons/filetypes/java.png create mode 100644 package/jsda/luci-app-rtorrent/src/www/luci-static/resources/icons/filetypes/jpeg.png create mode 100644 package/jsda/luci-app-rtorrent/src/www/luci-static/resources/icons/filetypes/jpg.png create mode 100644 package/jsda/luci-app-rtorrent/src/www/luci-static/resources/icons/filetypes/linux.png create mode 100644 package/jsda/luci-app-rtorrent/src/www/luci-static/resources/icons/filetypes/lua.png create mode 100644 package/jsda/luci-app-rtorrent/src/www/luci-static/resources/icons/filetypes/mkv.png create mode 100644 package/jsda/luci-app-rtorrent/src/www/luci-static/resources/icons/filetypes/mov.png create mode 100644 package/jsda/luci-app-rtorrent/src/www/luci-static/resources/icons/filetypes/mp3.png create mode 100644 package/jsda/luci-app-rtorrent/src/www/luci-static/resources/icons/filetypes/mp4.png create mode 100644 package/jsda/luci-app-rtorrent/src/www/luci-static/resources/icons/filetypes/music.png create mode 100644 package/jsda/luci-app-rtorrent/src/www/luci-static/resources/icons/filetypes/nfo.png create mode 100644 package/jsda/luci-app-rtorrent/src/www/luci-static/resources/icons/filetypes/pdf.png create mode 100644 package/jsda/luci-app-rtorrent/src/www/luci-static/resources/icons/filetypes/php.png create mode 100644 package/jsda/luci-app-rtorrent/src/www/luci-static/resources/icons/filetypes/pl.png create mode 100644 package/jsda/luci-app-rtorrent/src/www/luci-static/resources/icons/filetypes/png.png create mode 100644 package/jsda/luci-app-rtorrent/src/www/luci-static/resources/icons/filetypes/ppt.png create mode 100644 package/jsda/luci-app-rtorrent/src/www/luci-static/resources/icons/filetypes/psd.png create mode 100644 package/jsda/luci-app-rtorrent/src/www/luci-static/resources/icons/filetypes/rar.png create mode 100644 package/jsda/luci-app-rtorrent/src/www/luci-static/resources/icons/filetypes/script.png create mode 100644 package/jsda/luci-app-rtorrent/src/www/luci-static/resources/icons/filetypes/sh.png create mode 100644 package/jsda/luci-app-rtorrent/src/www/luci-static/resources/icons/filetypes/sqlite.png create mode 100644 package/jsda/luci-app-rtorrent/src/www/luci-static/resources/icons/filetypes/srt.png create mode 100644 package/jsda/luci-app-rtorrent/src/www/luci-static/resources/icons/filetypes/tar.png create mode 100644 package/jsda/luci-app-rtorrent/src/www/luci-static/resources/icons/filetypes/tgz.png create mode 100644 package/jsda/luci-app-rtorrent/src/www/luci-static/resources/icons/filetypes/txt.png create mode 100644 package/jsda/luci-app-rtorrent/src/www/luci-static/resources/icons/filetypes/up.png create mode 100644 package/jsda/luci-app-rtorrent/src/www/luci-static/resources/icons/filetypes/video.png create mode 100644 package/jsda/luci-app-rtorrent/src/www/luci-static/resources/icons/filetypes/wma.png create mode 100644 package/jsda/luci-app-rtorrent/src/www/luci-static/resources/icons/filetypes/wmv.png create mode 100644 package/jsda/luci-app-rtorrent/src/www/luci-static/resources/icons/filetypes/xls.png create mode 100644 package/jsda/luci-app-rtorrent/src/www/luci-static/resources/icons/filetypes/zip.png create mode 100644 package/jsda/luci-app-rtorrent/src/www/luci-static/resources/icons/unknown_tracker.png create mode 100644 package/jsda/luci-app-scutclient/Makefile create mode 100644 package/jsda/luci-app-scutclient/README.md create mode 100644 package/jsda/luci-app-scutclient/luasrc/controller/scutclient.lua create mode 100644 package/jsda/luci-app-scutclient/luasrc/model/cbi/scutclient/scutclient.lua create mode 100644 package/jsda/luci-app-scutclient/luasrc/view/scutclient/about.htm create mode 100644 package/jsda/luci-app-scutclient/luasrc/view/scutclient/logs.htm create mode 100644 package/jsda/luci-app-scutclient/luasrc/view/scutclient/status.htm create mode 100755 package/jsda/luci-app-scutclient/root/etc/uci-defaults/99-luci-scutclient create mode 100644 package/jsda/luci-app-shadowsocksr-alex/Makefile create mode 100644 package/jsda/luci-app-shadowsocksr-alex/README.md create mode 100644 package/jsda/luci-app-shadowsocksr-alex/files/etc/config/ssrr create mode 100644 package/jsda/luci-app-shadowsocksr-alex/files/etc/config/ssrrmore create mode 100755 package/jsda/luci-app-shadowsocksr-alex/files/etc/init.d/ssrr create mode 100755 package/jsda/luci-app-shadowsocksr-alex/files/etc/ssrr/china_route create mode 100644 package/jsda/luci-app-shadowsocksr-alex/files/etc/ssrr/shadowsocksr.json create mode 100755 package/jsda/luci-app-shadowsocksr-alex/files/etc/ssrr/ssrr_watchdog create mode 100755 package/jsda/luci-app-shadowsocksr-alex/files/etc/ssrr/update_chinaroute.sh create mode 100755 package/jsda/luci-app-shadowsocksr-alex/files/etc/ssrr/user_local_ip create mode 100755 package/jsda/luci-app-shadowsocksr-alex/files/etc/ssrr/user_remote_ip create mode 100644 package/jsda/luci-app-shadowsocksr-alex/files/usr/lib/lua/luci/controller/ssrr.lua create mode 100644 package/jsda/luci-app-shadowsocksr-alex/files/usr/lib/lua/luci/model/cbi/shadowsocksr/general.lua create mode 100644 package/jsda/luci-app-shadowsocksr-alex/files/usr/lib/lua/luci/model/cbi/shadowsocksr/gfwlist.lua create mode 100644 package/jsda/luci-app-shadowsocksr-alex/i18n/zh-cn/shadowsocksR.zh-cn.po create mode 100644 package/jsda/luci-app-shadowsocksr-alex/tools/po2lmo/Makefile create mode 100755 package/jsda/luci-app-shadowsocksr-alex/tools/po2lmo/src/po2lmo create mode 100644 package/jsda/luci-app-shadowsocksr-alex/tools/po2lmo/src/po2lmo.c create mode 100644 package/jsda/luci-app-shadowsocksr-alex/tools/po2lmo/src/template_lmo.c create mode 100644 package/jsda/luci-app-shadowsocksr-alex/tools/po2lmo/src/template_lmo.h create mode 100644 package/jsda/luci-app-smartdns/Makefile create mode 100644 package/jsda/luci-app-smartdns/luasrc/controller/smartdns.lua create mode 100644 package/jsda/luci-app-smartdns/luasrc/model/cbi/smartdns/smartdns.lua create mode 100644 package/jsda/luci-app-smartdns/luasrc/model/cbi/smartdns/upstream.lua create mode 100644 package/jsda/luci-app-smartdns/luasrc/model/smartdns.lua create mode 100644 package/jsda/luci-app-smartdns/luasrc/view/smartdns/smartdns_status.htm create mode 100644 package/jsda/luci-app-smartdns/po/zh-cn/smartdns.po create mode 100755 package/jsda/luci-app-smartdns/root/etc/uci-defaults/50_luci-smartdns create mode 100644 package/jsda/luci-app-softethervpn5/Makefile create mode 100644 package/jsda/luci-app-softethervpn5/luasrc/controller/softethervpn5.lua create mode 100644 package/jsda/luci-app-softethervpn5/luasrc/model/cbi/softethervpn5/bridge.lua create mode 100644 package/jsda/luci-app-softethervpn5/luasrc/model/cbi/softethervpn5/client.lua create mode 100644 package/jsda/luci-app-softethervpn5/luasrc/model/cbi/softethervpn5/server.lua create mode 100644 package/jsda/luci-app-softethervpn5/luasrc/model/cbi/softethervpn5/setting.lua create mode 100644 package/jsda/luci-app-softethervpn5/luasrc/model/cbi/softethervpn5/status.lua create mode 100644 package/jsda/luci-app-softethervpn5/po/zh-cn/softethervpn5.po create mode 100644 package/jsda/luci-app-softethervpn5/root/etc/config/softethervpn5 create mode 100755 package/jsda/luci-app-softethervpn5/root/etc/init.d/softethervpn5 create mode 100755 package/jsda/luci-app-softethervpn5/root/etc/uci-defaults/luci-softethervpn5 create mode 100644 package/jsda/luci-app-speederv2/Makefile create mode 100644 package/jsda/luci-app-speederv2/files/luci/controller/speederv2.lua create mode 100644 package/jsda/luci-app-speederv2/files/luci/i18n/speederv2.zh-cn.lmo create mode 100644 package/jsda/luci-app-speederv2/files/luci/i18n/speederv2.zh-cn.po create mode 100644 package/jsda/luci-app-speederv2/files/luci/model/cbi/speederv2/general.lua create mode 100644 package/jsda/luci-app-speederv2/files/luci/model/cbi/speederv2/servers-details.lua create mode 100644 package/jsda/luci-app-speederv2/files/luci/model/cbi/speederv2/servers.lua create mode 100644 package/jsda/luci-app-speederv2/files/luci/view/speederv2/dynamiclist.htm create mode 100644 package/jsda/luci-app-speederv2/files/luci/view/speederv2/status.htm create mode 100644 package/jsda/luci-app-speederv2/files/root/etc/config/speederv2 create mode 100755 package/jsda/luci-app-speederv2/files/root/etc/init.d/speederv2 create mode 100755 package/jsda/luci-app-speederv2/files/root/etc/uci-defaults/luci-speederv2 create mode 100644 package/jsda/luci-app-speederv2/tools/po2lmo/Makefile create mode 100644 package/jsda/luci-app-speederv2/tools/po2lmo/src/po2lmo.c create mode 100644 package/jsda/luci-app-speederv2/tools/po2lmo/src/template_lmo.c create mode 100644 package/jsda/luci-app-speederv2/tools/po2lmo/src/template_lmo.h create mode 100644 package/jsda/luci-app-sysuh3c/Makefile create mode 100644 package/jsda/luci-app-sysuh3c/luasrc/controller/sysuh3c.lua create mode 100644 package/jsda/luci-app-sysuh3c/luasrc/model/cbi/sysuh3c.lua create mode 100644 package/jsda/luci-app-terminal/Makefile create mode 100644 package/jsda/luci-app-terminal/luasrc/controller/terminal.lua create mode 100644 package/jsda/luci-app-terminal/luasrc/view/terminal.htm create mode 100644 package/jsda/luci-app-terminal/po/zh-cn/terminal.po create mode 100755 package/jsda/luci-app-terminal/root/etc/init.d/ttyd create mode 100644 package/jsda/luci-app-udp2raw/Makefile create mode 100644 package/jsda/luci-app-udp2raw/files/luci/controller/udp2raw.lua create mode 100644 package/jsda/luci-app-udp2raw/files/luci/i18n/udp2raw.zh-cn.lmo create mode 100644 package/jsda/luci-app-udp2raw/files/luci/i18n/udp2raw.zh-cn.po create mode 100644 package/jsda/luci-app-udp2raw/files/luci/model/cbi/udp2raw/general.lua create mode 100644 package/jsda/luci-app-udp2raw/files/luci/model/cbi/udp2raw/servers-details.lua create mode 100644 package/jsda/luci-app-udp2raw/files/luci/model/cbi/udp2raw/servers.lua create mode 100644 package/jsda/luci-app-udp2raw/files/luci/view/udp2raw/dynamiclist.htm create mode 100644 package/jsda/luci-app-udp2raw/files/luci/view/udp2raw/status.htm create mode 100644 package/jsda/luci-app-udp2raw/files/root/etc/config/udp2raw create mode 100755 package/jsda/luci-app-udp2raw/files/root/etc/init.d/udp2raw create mode 100755 package/jsda/luci-app-udp2raw/files/root/etc/init.d/udp2raw.init create mode 100755 package/jsda/luci-app-udp2raw/files/root/etc/uci-defaults/luci-udp2raw create mode 100644 package/jsda/luci-app-udp2raw/tools/po2lmo/Makefile create mode 100644 package/jsda/luci-app-udp2raw/tools/po2lmo/src/po2lmo.c create mode 100644 package/jsda/luci-app-udp2raw/tools/po2lmo/src/template_lmo.c create mode 100644 package/jsda/luci-app-udp2raw/tools/po2lmo/src/template_lmo.h create mode 100644 package/jsda/mentohust/Makefile create mode 100644 package/jsda/minieap/Makefile create mode 100644 package/jsda/mysql/Makefile create mode 100755 package/jsda/mysql/conf/my.cnf create mode 100755 package/jsda/mysql/files/mysqld.init create mode 100644 package/jsda/mysql/patches/100-fix_hostname.patch create mode 100644 package/jsda/mysql/patches/110-cross_compile.patch create mode 100644 package/jsda/mysql/patches/120-bison-compat.patch create mode 100644 package/jsda/ndpi-netfilter/Makefile create mode 100644 package/jsda/ndpi-netfilter/patches/001-main.patch create mode 100644 package/jsda/ngrokc/Makefile create mode 100644 package/jsda/njitclient/Install.html create mode 100644 package/jsda/njitclient/License/gpl-3.0-standalone.html create mode 100644 package/jsda/njitclient/License/gpl-3.0.txt create mode 100644 package/jsda/njitclient/Makefile create mode 100644 package/jsda/njitclient/Makefile.am create mode 100644 package/jsda/njitclient/README.md create mode 100644 package/jsda/njitclient/ReadMe.html create mode 100644 package/jsda/njitclient/configure.ac create mode 100644 package/jsda/njitclient/documents/Documents.html create mode 100644 package/jsda/njitclient/documents/h3c_AES_MD5.md create mode 100644 package/jsda/njitclient/documents/h3c_AES_MD5.png create mode 100755 package/jsda/njitclient/help create mode 100644 package/jsda/njitclient/src-gui/gtkgui/AUTHORS create mode 100644 package/jsda/njitclient/src-gui/gtkgui/COPYING create mode 100644 package/jsda/njitclient/src-gui/gtkgui/ChangeLog create mode 100644 package/jsda/njitclient/src-gui/gtkgui/HACKING create mode 100644 package/jsda/njitclient/src-gui/gtkgui/Makefile.am create mode 100644 package/jsda/njitclient/src-gui/gtkgui/NEWS create mode 100644 package/jsda/njitclient/src-gui/gtkgui/README create mode 100644 package/jsda/njitclient/src-gui/gtkgui/config.c create mode 100644 package/jsda/njitclient/src-gui/gtkgui/configure.ac create mode 100644 package/jsda/njitclient/src-gui/gtkgui/hello.c create mode 100644 package/jsda/njitclient/src-gui/gtkgui/hello.h create mode 100644 package/jsda/njitclient/src-gui/gtkgui/m4/.gitignore create mode 100644 package/jsda/njitclient/src-gui/gtkgui/po/Makefile.in.in create mode 100644 package/jsda/njitclient/src-gui/gtkgui/po/POTFILES.in create mode 100644 package/jsda/njitclient/src-gui/gtkgui/po/zh_CN.po create mode 100644 package/jsda/njitclient/src-gui/gtkgui/tests/Makefile.am create mode 100644 package/jsda/njitclient/src-gui/luci/luci_controller_njit.lua create mode 100644 package/jsda/njitclient/src-gui/luci/njit.lua create mode 100644 package/jsda/njitclient/src-gui/luci/readme create mode 100644 package/jsda/njitclient/src-gui/qt4gui/ReadMe.html create mode 100644 package/jsda/njitclient/src-gui/qt4gui/dialogs/mainDlg.cpp create mode 100644 package/jsda/njitclient/src-gui/qt4gui/dialogs/mainDlg.h create mode 100644 package/jsda/njitclient/src-gui/qt4gui/main.cpp create mode 100644 package/jsda/njitclient/src-gui/qt4gui/main.h create mode 100644 package/jsda/njitclient/src-gui/qt4gui/qt4gui.pro create mode 100644 package/jsda/njitclient/src/Makefile.am create mode 100755 package/jsda/njitclient/src/RefreshIP.py create mode 100644 package/jsda/njitclient/src/aes.c create mode 100644 package/jsda/njitclient/src/aes.h create mode 100644 package/jsda/njitclient/src/auth.c create mode 100644 package/jsda/njitclient/src/configure.ac create mode 100644 package/jsda/njitclient/src/debug.h create mode 100644 package/jsda/njitclient/src/fillmd5-libcrypto.c create mode 100644 package/jsda/njitclient/src/fillmd5-libgcrypt.c create mode 100644 package/jsda/njitclient/src/h3c_AES_MD5.c create mode 100644 package/jsda/njitclient/src/h3c_AES_MD5.h create mode 100644 package/jsda/njitclient/src/h3c_dict.h create mode 100644 package/jsda/njitclient/src/ip.c create mode 100644 package/jsda/njitclient/src/m4/README create mode 100644 package/jsda/njitclient/src/m4/tcpdump-aclocal.m4 create mode 100644 package/jsda/njitclient/src/main.c create mode 100644 package/jsda/njitclient/src/md5-buildin/Makefile.am create mode 100644 package/jsda/njitclient/src/md5-buildin/configure.ac create mode 100755 package/jsda/njitclient/src/md5-buildin/help create mode 100644 package/jsda/njitclient/src/md5-buildin/md5_dgst.c create mode 100644 package/jsda/njitclient/src/md5-buildin/md5_one.c create mode 100644 package/jsda/njitclient/src/md5-buildin/md5test.c create mode 100644 package/jsda/njitclient/src/md5-buildin/mem_clr.c create mode 100644 package/jsda/njitclient/src/njit8021xclient.c create mode 100644 package/jsda/njitclient/src/njit8021xclient.h create mode 100644 package/jsda/njitclient/src/tests/Makefile create mode 100644 package/jsda/njitclient/src/tests/ifchk.c create mode 100644 package/jsda/njitclient/src/tests/ifchk.mk create mode 100644 package/jsda/njitclient/src/tests/md5test.c create mode 100644 package/jsda/njitclient/src/tests/md5test.mk create mode 100644 package/jsda/openvpn-easy-rsa-whisky/Makefile create mode 100644 package/jsda/openvpn-easy-rsa-whisky/patches/100-fix_EASYRSA_REQ_CN.patch create mode 100644 package/jsda/openvpn-easy-rsa-whisky/patches/101-static_EASYRSA.patch create mode 100644 package/jsda/openwrt-Pcap_DNSProxy/Makefile create mode 100644 package/jsda/openwrt-Pcap_DNSProxy/files/configs/WhiteList.txt create mode 100755 package/jsda/openwrt-Pcap_DNSProxy/files/pcap-dnsproxy.config create mode 100755 package/jsda/openwrt-Pcap_DNSProxy/files/pcap-dnsproxy.hotplug create mode 100755 package/jsda/openwrt-Pcap_DNSProxy/files/pcap-dnsproxy.procd.init create mode 100644 package/jsda/openwrt-Pcap_DNSProxy/patches/002-cmake-dependency-scanner-workaround.patch create mode 100644 package/jsda/openwrt-chinadns/Makefile create mode 100644 package/jsda/openwrt-dnsforwarder/Makefile create mode 100644 package/jsda/openwrt-pdnsd-full/Makefile create mode 100644 package/jsda/openwrt-pdnsd-full/files/pdnsd.conf create mode 100644 package/jsda/openwrt-shadowvpn-master/.gitignore create mode 100644 package/jsda/openwrt-shadowvpn-master/LICENSE create mode 100644 package/jsda/openwrt-shadowvpn-master/Makefile create mode 100644 package/jsda/openwrt-shadowvpn-master/README.md create mode 100755 package/jsda/openwrt-shadowvpn-master/files/client_down.sh create mode 100755 package/jsda/openwrt-shadowvpn-master/files/client_up.sh create mode 100755 package/jsda/openwrt-shadowvpn-master/files/shadowvpn.config create mode 100755 package/jsda/openwrt-shadowvpn-master/files/shadowvpn.hotplug create mode 100755 package/jsda/openwrt-shadowvpn-master/files/shadowvpn.init create mode 100644 package/jsda/openwrt-shadowvpn-master/patches/000-fix-autoconf.patch create mode 100644 package/jsda/openwrt-udp2raw/Makefile create mode 100644 package/jsda/oscam/Config.in create mode 100644 package/jsda/oscam/Makefile create mode 100755 package/jsda/oscam/files/oscam-watchdog.sh create mode 100644 package/jsda/oscam/files/oscam.conf create mode 100755 package/jsda/oscam/files/oscam.dvbapi create mode 100755 package/jsda/oscam/files/oscam.init create mode 100755 package/jsda/oscam/files/oscam.server create mode 100755 package/jsda/oscam/files/oscam.user create mode 100644 package/jsda/rtl8192du/.gitignore create mode 100644 package/jsda/rtl8192du/Makefile create mode 100644 package/jsda/scutclient/Makefile create mode 100755 package/jsda/scutclient/files/scutclient.config create mode 100755 package/jsda/scutclient/files/scutclient.hotplug create mode 100755 package/jsda/scutclient/files/scutclient.init create mode 100644 package/jsda/smartdns/Makefile create mode 100644 package/jsda/smartdns/conf/custom.conf create mode 100644 package/jsda/sysuh3c/Makefile create mode 100755 package/jsda/sysuh3c/files/sysuh3c.config create mode 100755 package/jsda/sysuh3c/files/sysuh3c.defaults create mode 100755 package/jsda/sysuh3c/files/sysuh3c.init create mode 100644 package/lienol/brook/Makefile create mode 100644 package/lienol/dns-forwarder/Makefile create mode 100644 package/lienol/dns-forwarder/files/dns-forwarder.config create mode 100755 package/lienol/dns-forwarder/files/dns-forwarder.init create mode 100644 package/lienol/dns2socks/Makefile create mode 100644 package/lienol/luci-app-brook-server/Makefile create mode 100644 package/lienol/luci-app-brook-server/luasrc/controller/brook_server.lua create mode 100644 package/lienol/luci-app-brook-server/luasrc/model/cbi/brook_server/api/brook.lua create mode 100644 package/lienol/luci-app-brook-server/luasrc/model/cbi/brook_server/config.lua create mode 100644 package/lienol/luci-app-brook-server/luasrc/model/cbi/brook_server/index.lua create mode 100644 package/lienol/luci-app-brook-server/luasrc/view/brook_server/brook.htm create mode 100644 package/lienol/luci-app-brook-server/luasrc/view/brook_server/log.htm create mode 100644 package/lienol/luci-app-brook-server/luasrc/view/brook_server/users_list_status.htm create mode 100644 package/lienol/luci-app-brook-server/luasrc/view/brook_server/users_status.htm create mode 100644 package/lienol/luci-app-brook-server/po/zh-cn/brook_server.po create mode 100644 package/lienol/luci-app-brook-server/root/etc/config/brook_server create mode 100755 package/lienol/luci-app-brook-server/root/etc/init.d/brook_server create mode 100644 package/lienol/luci-app-brook-server/root/etc/uci-defaults/luci-app-brook-server create mode 100644 package/lienol/luci-app-brook-server/root/usr/share/brook_server/firewall.include create mode 100644 package/lienol/luci-app-fileassistant/Makefile create mode 100644 package/lienol/luci-app-fileassistant/htdocs/luci-static/resources/fileassistant/fb.css create mode 100644 package/lienol/luci-app-fileassistant/htdocs/luci-static/resources/fileassistant/fb.js create mode 100644 package/lienol/luci-app-fileassistant/htdocs/luci-static/resources/fileassistant/file-icon.png create mode 100644 package/lienol/luci-app-fileassistant/htdocs/luci-static/resources/fileassistant/folder-icon.png create mode 100644 package/lienol/luci-app-fileassistant/htdocs/luci-static/resources/fileassistant/link-icon.png create mode 100644 package/lienol/luci-app-fileassistant/luasrc/controller/fileassistant.lua create mode 100644 package/lienol/luci-app-fileassistant/luasrc/view/fileassistant.htm create mode 100644 package/lienol/luci-app-mia/Makefile create mode 100644 package/lienol/luci-app-mia/luasrc/controller/mia.lua create mode 100644 package/lienol/luci-app-mia/luasrc/model/cbi/mia.lua create mode 100644 package/lienol/luci-app-mia/luasrc/view/mia/index.htm create mode 100644 package/lienol/luci-app-mia/luasrc/view/mia/mia.htm create mode 100644 package/lienol/luci-app-mia/po/zh-cn/mia.po create mode 100644 package/lienol/luci-app-mia/root/etc/config/mia create mode 100755 package/lienol/luci-app-mia/root/etc/init.d/mia create mode 100755 package/lienol/luci-app-mia/root/etc/uci-defaults/luci-app-control-mia create mode 100644 package/lienol/luci-app-passwall/Makefile create mode 100644 package/lienol/luci-app-passwall/luasrc/controller/passwall.lua create mode 100644 package/lienol/luci-app-passwall/luasrc/model/cbi/passwall/acl.lua create mode 100644 package/lienol/luci-app-passwall/luasrc/model/cbi/passwall/api/api.lua create mode 100644 package/lienol/luci-app-passwall/luasrc/model/cbi/passwall/api/brook.lua create mode 100755 package/lienol/luci-app-passwall/luasrc/model/cbi/passwall/api/gen_trojan_client_config_file.lua create mode 100755 package/lienol/luci-app-passwall/luasrc/model/cbi/passwall/api/gen_v2ray_client_config_file.lua create mode 100644 package/lienol/luci-app-passwall/luasrc/model/cbi/passwall/api/kcptun.lua create mode 100644 package/lienol/luci-app-passwall/luasrc/model/cbi/passwall/api/v2ray.lua create mode 100644 package/lienol/luci-app-passwall/luasrc/model/cbi/passwall/auto_switch.lua create mode 100644 package/lienol/luci-app-passwall/luasrc/model/cbi/passwall/balancing.lua create mode 100644 package/lienol/luci-app-passwall/luasrc/model/cbi/passwall/global.lua create mode 100644 package/lienol/luci-app-passwall/luasrc/model/cbi/passwall/log.lua create mode 100644 package/lienol/luci-app-passwall/luasrc/model/cbi/passwall/node_config.lua create mode 100644 package/lienol/luci-app-passwall/luasrc/model/cbi/passwall/node_list.lua create mode 100644 package/lienol/luci-app-passwall/luasrc/model/cbi/passwall/other.lua create mode 100644 package/lienol/luci-app-passwall/luasrc/model/cbi/passwall/rule.lua create mode 100644 package/lienol/luci-app-passwall/luasrc/model/cbi/passwall/rule_list.lua create mode 100644 package/lienol/luci-app-passwall/luasrc/view/passwall/global/status.htm create mode 100644 package/lienol/luci-app-passwall/luasrc/view/passwall/global/status2.htm create mode 100644 package/lienol/luci-app-passwall/luasrc/view/passwall/global/tips.htm create mode 100644 package/lienol/luci-app-passwall/luasrc/view/passwall/haproxy/status.htm create mode 100644 package/lienol/luci-app-passwall/luasrc/view/passwall/log/log.htm create mode 100644 package/lienol/luci-app-passwall/luasrc/view/passwall/node_list/auto_ping.htm create mode 100644 package/lienol/luci-app-passwall/luasrc/view/passwall/node_list/link_add_node.htm create mode 100644 package/lienol/luci-app-passwall/luasrc/view/passwall/node_list/node_list.htm create mode 100644 package/lienol/luci-app-passwall/luasrc/view/passwall/node_list/ping.htm create mode 100644 package/lienol/luci-app-passwall/luasrc/view/passwall/rule/brook_version.htm create mode 100644 package/lienol/luci-app-passwall/luasrc/view/passwall/rule/kcptun_version.htm create mode 100644 package/lienol/luci-app-passwall/luasrc/view/passwall/rule/rule_version.htm create mode 100644 package/lienol/luci-app-passwall/luasrc/view/passwall/rule/v2ray_version.htm create mode 100644 package/lienol/luci-app-passwall/po/zh-cn/passwall.po create mode 100644 package/lienol/luci-app-passwall/root/etc/config/passwall create mode 100644 package/lienol/luci-app-passwall/root/etc/config/passwall_rule/blacklist_host create mode 100644 package/lienol/luci-app-passwall/root/etc/config/passwall_rule/blacklist_ip create mode 100644 package/lienol/luci-app-passwall/root/etc/config/passwall_rule/chnlist create mode 100644 package/lienol/luci-app-passwall/root/etc/config/passwall_rule/chnroute create mode 100644 package/lienol/luci-app-passwall/root/etc/config/passwall_rule/gfwlist.conf create mode 100644 package/lienol/luci-app-passwall/root/etc/config/passwall_rule/router create mode 100644 package/lienol/luci-app-passwall/root/etc/config/passwall_rule/user.conf create mode 100644 package/lienol/luci-app-passwall/root/etc/config/passwall_rule/whitelist_host create mode 100644 package/lienol/luci-app-passwall/root/etc/config/passwall_rule/whitelist_ip create mode 100644 package/lienol/luci-app-passwall/root/etc/config/passwall_show create mode 100755 package/lienol/luci-app-passwall/root/etc/init.d/passwall create mode 100755 package/lienol/luci-app-passwall/root/etc/uci-defaults/luci-app-passwall create mode 100755 package/lienol/luci-app-passwall/root/usr/share/passwall/app.sh create mode 100755 package/lienol/luci-app-passwall/root/usr/share/passwall/iptables.sh create mode 100755 package/lienol/luci-app-passwall/root/usr/share/passwall/monitor.sh create mode 100755 package/lienol/luci-app-passwall/root/usr/share/passwall/rule_update.sh create mode 100755 package/lienol/luci-app-passwall/root/usr/share/passwall/subscription.sh create mode 100755 package/lienol/luci-app-passwall/root/usr/share/passwall/test.sh create mode 100644 package/lienol/luci-app-ssr-libev-server/Makefile create mode 100644 package/lienol/luci-app-ssr-libev-server/luasrc/controller/ssr_libev_server.lua create mode 100644 package/lienol/luci-app-ssr-libev-server/luasrc/model/cbi/ssr_libev_server/config.lua create mode 100644 package/lienol/luci-app-ssr-libev-server/luasrc/model/cbi/ssr_libev_server/index.lua create mode 100644 package/lienol/luci-app-ssr-libev-server/luasrc/view/ssr_libev_server/users_list_status.htm create mode 100644 package/lienol/luci-app-ssr-libev-server/luasrc/view/ssr_libev_server/users_status.htm create mode 100644 package/lienol/luci-app-ssr-libev-server/po/zh-cn/ssr_libev_server.po create mode 100644 package/lienol/luci-app-ssr-libev-server/root/etc/config/ssr_libev_server create mode 100755 package/lienol/luci-app-ssr-libev-server/root/etc/init.d/ssr_libev_server create mode 100755 package/lienol/luci-app-ssr-libev-server/root/etc/uci-defaults/luci-app-ssr-libev-server create mode 100755 package/lienol/luci-app-ssr-libev-server/root/usr/share/ssr_libev_server/firewall.include create mode 100644 package/lienol/luci-app-timewol/Makefile create mode 100644 package/lienol/luci-app-timewol/luasrc/controller/timewol.lua create mode 100644 package/lienol/luci-app-timewol/luasrc/model/cbi/timewol.lua create mode 100644 package/lienol/luci-app-timewol/luasrc/view/timewol/index.htm create mode 100644 package/lienol/luci-app-timewol/luasrc/view/timewol/timewol.htm create mode 100644 package/lienol/luci-app-timewol/po/zh-cn/timewol.po create mode 100644 package/lienol/luci-app-timewol/root/etc/config/timewol create mode 100755 package/lienol/luci-app-timewol/root/etc/init.d/timewol create mode 100755 package/lienol/luci-app-timewol/root/etc/uci-defaults/luci-app-control-timewol create mode 100644 package/lienol/luci-app-trojan-server/Makefile create mode 100644 package/lienol/luci-app-trojan-server/luasrc/controller/trojan_server.lua create mode 100644 package/lienol/luci-app-trojan-server/luasrc/model/cbi/trojan_server/api/gen_trojan_config_file.lua create mode 100644 package/lienol/luci-app-trojan-server/luasrc/model/cbi/trojan_server/config.lua create mode 100644 package/lienol/luci-app-trojan-server/luasrc/model/cbi/trojan_server/index.lua create mode 100644 package/lienol/luci-app-trojan-server/luasrc/view/trojan_server/log.htm create mode 100644 package/lienol/luci-app-trojan-server/luasrc/view/trojan_server/users_list_status.htm create mode 100644 package/lienol/luci-app-trojan-server/luasrc/view/trojan_server/users_status.htm create mode 100644 package/lienol/luci-app-trojan-server/po/zh-cn/trojan_server.po create mode 100644 package/lienol/luci-app-trojan-server/root/etc/config/trojan_server create mode 100755 package/lienol/luci-app-trojan-server/root/etc/init.d/trojan_server create mode 100755 package/lienol/luci-app-trojan-server/root/etc/uci-defaults/luci-app-trojan-server create mode 100755 package/lienol/luci-app-trojan-server/root/usr/share/trojan_server/firewall.include create mode 100755 package/lienol/luci-app-v2ray-server/Makefile create mode 100644 package/lienol/luci-app-v2ray-server/luasrc/controller/v2ray_server.lua create mode 100644 package/lienol/luci-app-v2ray-server/luasrc/model/cbi/v2ray_server/api/genv2rayconfig.lua create mode 100644 package/lienol/luci-app-v2ray-server/luasrc/model/cbi/v2ray_server/api/v2ray.lua create mode 100644 package/lienol/luci-app-v2ray-server/luasrc/model/cbi/v2ray_server/config.lua create mode 100644 package/lienol/luci-app-v2ray-server/luasrc/model/cbi/v2ray_server/index.lua create mode 100644 package/lienol/luci-app-v2ray-server/luasrc/view/v2ray_server/log.htm create mode 100644 package/lienol/luci-app-v2ray-server/luasrc/view/v2ray_server/users_list_status.htm create mode 100644 package/lienol/luci-app-v2ray-server/luasrc/view/v2ray_server/users_status.htm create mode 100644 package/lienol/luci-app-v2ray-server/luasrc/view/v2ray_server/v2ray.htm create mode 100644 package/lienol/luci-app-v2ray-server/po/zh-cn/v2ray_server.po create mode 100644 package/lienol/luci-app-v2ray-server/root/etc/config/v2ray_server create mode 100755 package/lienol/luci-app-v2ray-server/root/etc/init.d/v2ray_server create mode 100755 package/lienol/luci-app-v2ray-server/root/etc/uci-defaults/luci-app-v2ray-server create mode 100755 package/lienol/luci-app-v2ray-server/root/usr/share/v2ray_server/firewall.include create mode 100644 package/lienol/luci-app-webrestriction/Makefile create mode 100644 package/lienol/luci-app-webrestriction/luasrc/controller/webrestriction.lua create mode 100644 package/lienol/luci-app-webrestriction/luasrc/model/cbi/webrestriction.lua create mode 100644 package/lienol/luci-app-webrestriction/luasrc/view/webrestriction/index.htm create mode 100644 package/lienol/luci-app-webrestriction/luasrc/view/webrestriction/webrestriction.htm create mode 100644 package/lienol/luci-app-webrestriction/po/zh-cn/webrestriction.po create mode 100644 package/lienol/luci-app-webrestriction/root/etc/config/webrestriction create mode 100755 package/lienol/luci-app-webrestriction/root/etc/init.d/webrestriction create mode 100755 package/lienol/luci-app-webrestriction/root/etc/uci-defaults/luci-app-control-webrestriction create mode 100644 package/lienol/luci-app-weburl/Makefile create mode 100644 package/lienol/luci-app-weburl/luasrc/controller/weburl.lua create mode 100644 package/lienol/luci-app-weburl/luasrc/model/cbi/weburl.lua create mode 100644 package/lienol/luci-app-weburl/luasrc/view/weburl/index.htm create mode 100644 package/lienol/luci-app-weburl/luasrc/view/weburl/weburl.htm create mode 100644 package/lienol/luci-app-weburl/po/zh-cn/weburl.po create mode 100644 package/lienol/luci-app-weburl/root/etc/config/weburl create mode 100755 package/lienol/luci-app-weburl/root/etc/init.d/weburl create mode 100755 package/lienol/luci-app-weburl/root/etc/uci-defaults/luci-app-control-weburl create mode 100644 package/lienol/luci-theme-argon-mc/Makefile create mode 100644 package/lienol/luci-theme-argon-mc/htdocs/luci-static/argon_mc1/css/purecss.css create mode 100644 package/lienol/luci-theme-argon-mc/htdocs/luci-static/argon_mc1/css/style.css create mode 100644 package/lienol/luci-theme-argon-mc/htdocs/luci-static/argon_mc1/favicon.ico create mode 100644 package/lienol/luci-theme-argon-mc/htdocs/luci-static/argon_mc1/fonts/TypoGraphica.eot create mode 100644 package/lienol/luci-theme-argon-mc/htdocs/luci-static/argon_mc1/fonts/TypoGraphica.svg create mode 100644 package/lienol/luci-theme-argon-mc/htdocs/luci-static/argon_mc1/fonts/TypoGraphica.ttf create mode 100644 package/lienol/luci-theme-argon-mc/htdocs/luci-static/argon_mc1/fonts/TypoGraphica.woff create mode 100644 package/lienol/luci-theme-argon-mc/htdocs/luci-static/argon_mc1/fonts/font.eot create mode 100644 package/lienol/luci-theme-argon-mc/htdocs/luci-static/argon_mc1/fonts/font.svg create mode 100644 package/lienol/luci-theme-argon-mc/htdocs/luci-static/argon_mc1/fonts/font.ttf create mode 100644 package/lienol/luci-theme-argon-mc/htdocs/luci-static/argon_mc1/fonts/font.woff create mode 100644 package/lienol/luci-theme-argon-mc/htdocs/luci-static/argon_mc1/fonts/icomoon.eot create mode 100644 package/lienol/luci-theme-argon-mc/htdocs/luci-static/argon_mc1/fonts/icomoon.svg create mode 100644 package/lienol/luci-theme-argon-mc/htdocs/luci-static/argon_mc1/fonts/icomoon.ttf create mode 100644 package/lienol/luci-theme-argon-mc/htdocs/luci-static/argon_mc1/fonts/icomoon.woff create mode 100644 package/lienol/luci-theme-argon-mc/htdocs/luci-static/argon_mc1/fonts/ssr.eot create mode 100644 package/lienol/luci-theme-argon-mc/htdocs/luci-static/argon_mc1/fonts/ssr.svg create mode 100644 package/lienol/luci-theme-argon-mc/htdocs/luci-static/argon_mc1/fonts/ssr.ttf create mode 100644 package/lienol/luci-theme-argon-mc/htdocs/luci-static/argon_mc1/fonts/ssr.woff create mode 100644 package/lienol/luci-theme-argon-mc/htdocs/luci-static/argon_mc1/img/bg1.jpg create mode 100644 package/lienol/luci-theme-argon-mc/htdocs/luci-static/argon_mc1/img/bg2.jpg create mode 100644 package/lienol/luci-theme-argon-mc/htdocs/luci-static/argon_mc1/img/bg3.jpg create mode 100644 package/lienol/luci-theme-argon-mc/htdocs/luci-static/argon_mc1/js/jquery.min.js create mode 100644 package/lienol/luci-theme-argon-mc/htdocs/luci-static/argon_mc1/js/script.js create mode 100644 package/lienol/luci-theme-argon-mc/htdocs/luci-static/argon_mc1/logo.png create mode 100644 package/lienol/luci-theme-argon-mc/htdocs/luci-static/argon_mc2/css/style.css create mode 100644 package/lienol/luci-theme-argon-mc/htdocs/luci-static/argon_mc2/favicon.ico create mode 100644 package/lienol/luci-theme-argon-mc/htdocs/luci-static/argon_mc2/fonts/font.eot create mode 100644 package/lienol/luci-theme-argon-mc/htdocs/luci-static/argon_mc2/fonts/font.svg create mode 100644 package/lienol/luci-theme-argon-mc/htdocs/luci-static/argon_mc2/fonts/font.ttf create mode 100644 package/lienol/luci-theme-argon-mc/htdocs/luci-static/argon_mc2/fonts/font.woff create mode 100644 package/lienol/luci-theme-argon-mc/htdocs/luci-static/argon_mc2/fonts/ssr.eot create mode 100644 package/lienol/luci-theme-argon-mc/htdocs/luci-static/argon_mc2/fonts/ssr.svg create mode 100644 package/lienol/luci-theme-argon-mc/htdocs/luci-static/argon_mc2/fonts/ssr.ttf create mode 100644 package/lienol/luci-theme-argon-mc/htdocs/luci-static/argon_mc2/fonts/ssr.woff create mode 100644 package/lienol/luci-theme-argon-mc/htdocs/luci-static/argon_mc2/js/jquery.min.js create mode 100644 package/lienol/luci-theme-argon-mc/htdocs/luci-static/argon_mc2/js/script.js create mode 100644 package/lienol/luci-theme-argon-mc/htdocs/luci-static/argon_mc2/logo.png create mode 100644 package/lienol/luci-theme-argon-mc/luasrc/view/themes/argon_mc1/footer.htm create mode 100644 package/lienol/luci-theme-argon-mc/luasrc/view/themes/argon_mc1/header.htm create mode 100644 package/lienol/luci-theme-argon-mc/luasrc/view/themes/argon_mc2/footer.htm create mode 100644 package/lienol/luci-theme-argon-mc/luasrc/view/themes/argon_mc2/header.htm create mode 100755 package/lienol/luci-theme-argon-mc/root/etc/uci-defaults/30_luci-theme-argon-mc create mode 100644 package/lienol/luci-theme-argon-mod/Makefile create mode 100644 package/lienol/luci-theme-argon-mod/htdocs/luci-static/argon_dark/css/style.css create mode 100644 package/lienol/luci-theme-argon-mod/htdocs/luci-static/argon_dark/favicon.ico create mode 100644 package/lienol/luci-theme-argon-mod/htdocs/luci-static/argon_dark/fonts/font.eot create mode 100644 package/lienol/luci-theme-argon-mod/htdocs/luci-static/argon_dark/fonts/font.svg create mode 100644 package/lienol/luci-theme-argon-mod/htdocs/luci-static/argon_dark/fonts/font.ttf create mode 100644 package/lienol/luci-theme-argon-mod/htdocs/luci-static/argon_dark/fonts/font.woff create mode 100644 package/lienol/luci-theme-argon-mod/htdocs/luci-static/argon_dark/fonts/ssr.eot create mode 100644 package/lienol/luci-theme-argon-mod/htdocs/luci-static/argon_dark/fonts/ssr.svg create mode 100644 package/lienol/luci-theme-argon-mod/htdocs/luci-static/argon_dark/fonts/ssr.ttf create mode 100644 package/lienol/luci-theme-argon-mod/htdocs/luci-static/argon_dark/fonts/ssr.woff create mode 100644 package/lienol/luci-theme-argon-mod/htdocs/luci-static/argon_dark/js/jquery.min.js create mode 100644 package/lienol/luci-theme-argon-mod/htdocs/luci-static/argon_dark/js/script.js create mode 100644 package/lienol/luci-theme-argon-mod/htdocs/luci-static/argon_dark/logo.png create mode 100644 package/lienol/luci-theme-argon-mod/htdocs/luci-static/argon_dark_purple/css/style.css create mode 100644 package/lienol/luci-theme-argon-mod/htdocs/luci-static/argon_dark_purple/favicon.ico create mode 100644 package/lienol/luci-theme-argon-mod/htdocs/luci-static/argon_dark_purple/fonts/font.eot create mode 100644 package/lienol/luci-theme-argon-mod/htdocs/luci-static/argon_dark_purple/fonts/font.svg create mode 100644 package/lienol/luci-theme-argon-mod/htdocs/luci-static/argon_dark_purple/fonts/font.ttf create mode 100644 package/lienol/luci-theme-argon-mod/htdocs/luci-static/argon_dark_purple/fonts/font.woff create mode 100644 package/lienol/luci-theme-argon-mod/htdocs/luci-static/argon_dark_purple/fonts/ssr.eot create mode 100644 package/lienol/luci-theme-argon-mod/htdocs/luci-static/argon_dark_purple/fonts/ssr.svg create mode 100644 package/lienol/luci-theme-argon-mod/htdocs/luci-static/argon_dark_purple/fonts/ssr.ttf create mode 100644 package/lienol/luci-theme-argon-mod/htdocs/luci-static/argon_dark_purple/fonts/ssr.woff create mode 100644 package/lienol/luci-theme-argon-mod/htdocs/luci-static/argon_dark_purple/js/jquery.min.js create mode 100644 package/lienol/luci-theme-argon-mod/htdocs/luci-static/argon_dark_purple/js/script.js create mode 100644 package/lienol/luci-theme-argon-mod/htdocs/luci-static/argon_dark_purple/logo.png create mode 100644 package/lienol/luci-theme-argon-mod/htdocs/luci-static/argon_light/css/purecss.css create mode 100644 package/lienol/luci-theme-argon-mod/htdocs/luci-static/argon_light/css/style.css create mode 100644 package/lienol/luci-theme-argon-mod/htdocs/luci-static/argon_light/favicon.ico create mode 100644 package/lienol/luci-theme-argon-mod/htdocs/luci-static/argon_light/fonts/TypoGraphica.eot create mode 100644 package/lienol/luci-theme-argon-mod/htdocs/luci-static/argon_light/fonts/TypoGraphica.svg create mode 100644 package/lienol/luci-theme-argon-mod/htdocs/luci-static/argon_light/fonts/TypoGraphica.ttf create mode 100644 package/lienol/luci-theme-argon-mod/htdocs/luci-static/argon_light/fonts/TypoGraphica.woff create mode 100644 package/lienol/luci-theme-argon-mod/htdocs/luci-static/argon_light/fonts/font.eot create mode 100644 package/lienol/luci-theme-argon-mod/htdocs/luci-static/argon_light/fonts/font.svg create mode 100644 package/lienol/luci-theme-argon-mod/htdocs/luci-static/argon_light/fonts/font.ttf create mode 100644 package/lienol/luci-theme-argon-mod/htdocs/luci-static/argon_light/fonts/font.woff create mode 100644 package/lienol/luci-theme-argon-mod/htdocs/luci-static/argon_light/fonts/icomoon.eot create mode 100644 package/lienol/luci-theme-argon-mod/htdocs/luci-static/argon_light/fonts/icomoon.svg create mode 100644 package/lienol/luci-theme-argon-mod/htdocs/luci-static/argon_light/fonts/icomoon.ttf create mode 100644 package/lienol/luci-theme-argon-mod/htdocs/luci-static/argon_light/fonts/icomoon.woff create mode 100644 package/lienol/luci-theme-argon-mod/htdocs/luci-static/argon_light/fonts/ssr.eot create mode 100644 package/lienol/luci-theme-argon-mod/htdocs/luci-static/argon_light/fonts/ssr.svg create mode 100644 package/lienol/luci-theme-argon-mod/htdocs/luci-static/argon_light/fonts/ssr.ttf create mode 100644 package/lienol/luci-theme-argon-mod/htdocs/luci-static/argon_light/fonts/ssr.woff create mode 100644 package/lienol/luci-theme-argon-mod/htdocs/luci-static/argon_light/img/bg1.jpg create mode 100644 package/lienol/luci-theme-argon-mod/htdocs/luci-static/argon_light/img/bg2.jpg create mode 100644 package/lienol/luci-theme-argon-mod/htdocs/luci-static/argon_light/img/bg3.jpg create mode 100644 package/lienol/luci-theme-argon-mod/htdocs/luci-static/argon_light/js/jquery.min.js create mode 100644 package/lienol/luci-theme-argon-mod/htdocs/luci-static/argon_light/js/script.js create mode 100644 package/lienol/luci-theme-argon-mod/htdocs/luci-static/argon_light/logo.png create mode 100644 package/lienol/luci-theme-argon-mod/htdocs/luci-static/argon_light_green/css/purecss.css create mode 100644 package/lienol/luci-theme-argon-mod/htdocs/luci-static/argon_light_green/css/style.css create mode 100644 package/lienol/luci-theme-argon-mod/htdocs/luci-static/argon_light_green/favicon.ico create mode 100644 package/lienol/luci-theme-argon-mod/htdocs/luci-static/argon_light_green/fonts/TypoGraphica.eot create mode 100644 package/lienol/luci-theme-argon-mod/htdocs/luci-static/argon_light_green/fonts/TypoGraphica.svg create mode 100644 package/lienol/luci-theme-argon-mod/htdocs/luci-static/argon_light_green/fonts/TypoGraphica.ttf create mode 100644 package/lienol/luci-theme-argon-mod/htdocs/luci-static/argon_light_green/fonts/TypoGraphica.woff create mode 100644 package/lienol/luci-theme-argon-mod/htdocs/luci-static/argon_light_green/fonts/font.eot create mode 100644 package/lienol/luci-theme-argon-mod/htdocs/luci-static/argon_light_green/fonts/font.svg create mode 100644 package/lienol/luci-theme-argon-mod/htdocs/luci-static/argon_light_green/fonts/font.ttf create mode 100644 package/lienol/luci-theme-argon-mod/htdocs/luci-static/argon_light_green/fonts/font.woff create mode 100644 package/lienol/luci-theme-argon-mod/htdocs/luci-static/argon_light_green/fonts/icomoon.eot create mode 100644 package/lienol/luci-theme-argon-mod/htdocs/luci-static/argon_light_green/fonts/icomoon.svg create mode 100644 package/lienol/luci-theme-argon-mod/htdocs/luci-static/argon_light_green/fonts/icomoon.ttf create mode 100644 package/lienol/luci-theme-argon-mod/htdocs/luci-static/argon_light_green/fonts/icomoon.woff create mode 100644 package/lienol/luci-theme-argon-mod/htdocs/luci-static/argon_light_green/fonts/ssr.eot create mode 100644 package/lienol/luci-theme-argon-mod/htdocs/luci-static/argon_light_green/fonts/ssr.svg create mode 100644 package/lienol/luci-theme-argon-mod/htdocs/luci-static/argon_light_green/fonts/ssr.ttf create mode 100644 package/lienol/luci-theme-argon-mod/htdocs/luci-static/argon_light_green/fonts/ssr.woff create mode 100644 package/lienol/luci-theme-argon-mod/htdocs/luci-static/argon_light_green/img/bg1.jpg create mode 100644 package/lienol/luci-theme-argon-mod/htdocs/luci-static/argon_light_green/img/bg2.jpg create mode 100644 package/lienol/luci-theme-argon-mod/htdocs/luci-static/argon_light_green/img/bg3.jpg create mode 100644 package/lienol/luci-theme-argon-mod/htdocs/luci-static/argon_light_green/js/jquery.min.js create mode 100644 package/lienol/luci-theme-argon-mod/htdocs/luci-static/argon_light_green/js/script.js create mode 100644 package/lienol/luci-theme-argon-mod/htdocs/luci-static/argon_light_green/logo.png create mode 100644 package/lienol/luci-theme-argon-mod/luasrc/view/themes/argon_dark/footer.htm create mode 100644 package/lienol/luci-theme-argon-mod/luasrc/view/themes/argon_dark/header.htm create mode 100644 package/lienol/luci-theme-argon-mod/luasrc/view/themes/argon_dark_purple/footer.htm create mode 100644 package/lienol/luci-theme-argon-mod/luasrc/view/themes/argon_dark_purple/header.htm create mode 100644 package/lienol/luci-theme-argon-mod/luasrc/view/themes/argon_light/footer.htm create mode 100644 package/lienol/luci-theme-argon-mod/luasrc/view/themes/argon_light/header.htm create mode 100644 package/lienol/luci-theme-argon-mod/luasrc/view/themes/argon_light_green/footer.htm create mode 100644 package/lienol/luci-theme-argon-mod/luasrc/view/themes/argon_light_green/header.htm create mode 100755 package/lienol/luci-theme-argon-mod/root/etc/uci-defaults/30_luci-theme-argon-mod create mode 100644 package/lienol/luci-theme-bootstrap-mc/Makefile create mode 100644 package/lienol/luci-theme-bootstrap-mc/htdocs/luci-static/bootstrap_blue/bg.jpg create mode 100644 package/lienol/luci-theme-bootstrap-mc/htdocs/luci-static/bootstrap_blue/cascade.css create mode 100644 package/lienol/luci-theme-bootstrap-mc/htdocs/luci-static/bootstrap_blue/favicon.ico create mode 100644 package/lienol/luci-theme-bootstrap-mc/htdocs/luci-static/bootstrap_blue/html5.js create mode 100644 package/lienol/luci-theme-bootstrap-mc/htdocs/luci-static/bootstrap_blue/mobile.css create mode 100644 package/lienol/luci-theme-bootstrap-mc/htdocs/luci-static/bootstrap_blue/wifi.png create mode 100644 package/lienol/luci-theme-bootstrap-mc/htdocs/luci-static/bootstrap_purple/bg.jpg create mode 100644 package/lienol/luci-theme-bootstrap-mc/htdocs/luci-static/bootstrap_purple/cascade.css create mode 100644 package/lienol/luci-theme-bootstrap-mc/htdocs/luci-static/bootstrap_purple/favicon.ico create mode 100644 package/lienol/luci-theme-bootstrap-mc/htdocs/luci-static/bootstrap_purple/html5.js create mode 100644 package/lienol/luci-theme-bootstrap-mc/htdocs/luci-static/bootstrap_purple/mobile.css create mode 100644 package/lienol/luci-theme-bootstrap-mc/htdocs/luci-static/bootstrap_purple/wifi.png create mode 100644 package/lienol/luci-theme-bootstrap-mc/luasrc/view/themes/bootstrap_blue/footer.htm create mode 100644 package/lienol/luci-theme-bootstrap-mc/luasrc/view/themes/bootstrap_blue/header.htm create mode 100644 package/lienol/luci-theme-bootstrap-mc/luasrc/view/themes/bootstrap_purple/footer.htm create mode 100644 package/lienol/luci-theme-bootstrap-mc/luasrc/view/themes/bootstrap_purple/header.htm create mode 100755 package/lienol/luci-theme-bootstrap-mc/root/etc/uci-defaults/30_luci-theme-bootstrap-mc create mode 100644 package/lienol/luci-theme-bootstrap-mod/Makefile create mode 100644 package/lienol/luci-theme-bootstrap-mod/htdocs/luci-static/bootstrap_blue/bg.jpg create mode 100644 package/lienol/luci-theme-bootstrap-mod/htdocs/luci-static/bootstrap_blue/cascade.css create mode 100644 package/lienol/luci-theme-bootstrap-mod/htdocs/luci-static/bootstrap_blue/favicon.ico create mode 100644 package/lienol/luci-theme-bootstrap-mod/htdocs/luci-static/bootstrap_blue/html5.js create mode 100644 package/lienol/luci-theme-bootstrap-mod/htdocs/luci-static/bootstrap_blue/mobile.css create mode 100644 package/lienol/luci-theme-bootstrap-mod/htdocs/luci-static/bootstrap_blue/wifi.png create mode 100644 package/lienol/luci-theme-bootstrap-mod/htdocs/luci-static/bootstrap_purple/bg.jpg create mode 100644 package/lienol/luci-theme-bootstrap-mod/htdocs/luci-static/bootstrap_purple/cascade.css create mode 100644 package/lienol/luci-theme-bootstrap-mod/htdocs/luci-static/bootstrap_purple/favicon.ico create mode 100644 package/lienol/luci-theme-bootstrap-mod/htdocs/luci-static/bootstrap_purple/html5.js create mode 100644 package/lienol/luci-theme-bootstrap-mod/htdocs/luci-static/bootstrap_purple/mobile.css create mode 100644 package/lienol/luci-theme-bootstrap-mod/htdocs/luci-static/bootstrap_purple/wifi.png create mode 100644 package/lienol/luci-theme-bootstrap-mod/luasrc/view/themes/bootstrap_blue/footer.htm create mode 100644 package/lienol/luci-theme-bootstrap-mod/luasrc/view/themes/bootstrap_blue/header.htm create mode 100644 package/lienol/luci-theme-bootstrap-mod/luasrc/view/themes/bootstrap_purple/footer.htm create mode 100644 package/lienol/luci-theme-bootstrap-mod/luasrc/view/themes/bootstrap_purple/header.htm create mode 100755 package/lienol/luci-theme-bootstrap-mod/root/etc/uci-defaults/30_luci-theme-bootstrap-mod create mode 100644 package/lienol/luci-theme-netgear-mc/Makefile create mode 100644 package/lienol/luci-theme-netgear-mc/htdocs/luci-static/netgear_mc/css/style.css create mode 100644 package/lienol/luci-theme-netgear-mc/htdocs/luci-static/netgear_mc/favicon.ico create mode 100644 package/lienol/luci-theme-netgear-mc/htdocs/luci-static/netgear_mc/fonts/Roboto-Medium-webfont.woff create mode 100644 package/lienol/luci-theme-netgear-mc/htdocs/luci-static/netgear_mc/fonts/Roboto-Regular-webfont.woff create mode 100644 package/lienol/luci-theme-netgear-mc/htdocs/luci-static/netgear_mc/fonts/advancedtomato.eot create mode 100644 package/lienol/luci-theme-netgear-mc/htdocs/luci-static/netgear_mc/fonts/advancedtomato.svg create mode 100644 package/lienol/luci-theme-netgear-mc/htdocs/luci-static/netgear_mc/fonts/advancedtomato.ttf create mode 100644 package/lienol/luci-theme-netgear-mc/htdocs/luci-static/netgear_mc/fonts/advancedtomato.woff create mode 100644 package/lienol/luci-theme-netgear-mc/htdocs/luci-static/netgear_mc/fonts/font.eot create mode 100644 package/lienol/luci-theme-netgear-mc/htdocs/luci-static/netgear_mc/fonts/font.svg create mode 100644 package/lienol/luci-theme-netgear-mc/htdocs/luci-static/netgear_mc/fonts/font.ttf create mode 100644 package/lienol/luci-theme-netgear-mc/htdocs/luci-static/netgear_mc/fonts/font.woff create mode 100644 package/lienol/luci-theme-netgear-mc/htdocs/luci-static/netgear_mc/js/jquery.min.js create mode 100644 package/lienol/luci-theme-netgear-mc/htdocs/luci-static/netgear_mc/js/script.js create mode 100644 package/lienol/luci-theme-netgear-mc/htdocs/luci-static/netgear_mc/logo.png create mode 100644 package/lienol/luci-theme-netgear-mc/htdocs/luci-static/netgear_mc/nlogo.png create mode 100644 package/lienol/luci-theme-netgear-mc/luasrc/view/themes/netgear_mc/footer.htm create mode 100644 package/lienol/luci-theme-netgear-mc/luasrc/view/themes/netgear_mc/header.htm create mode 100755 package/lienol/luci-theme-netgear-mc/root/etc/uci-defaults/30_luci-theme-netgear-mc create mode 100644 package/lienol/redsocks2/Makefile create mode 100644 package/lienol/redsocks2/files/redsocks2.template create mode 100644 package/lienol/tcping/Makefile diff --git a/include/target.mk b/include/target.mk index 2402f465a5..29ea3c5661 100644 --- a/include/target.mk +++ b/include/target.mk @@ -15,7 +15,8 @@ DEVICE_TYPE?=router # Default packages - the really basic set DEFAULT_PACKAGES:=base-files libc libgcc busybox dropbear mtd uci opkg netifd fstools uclient-fetch logd urandom-seed urngd \ kmod-nf-nathelper kmod-nf-nathelper-extra kmod-ipt-raw wget libustream-openssl ca-certificates \ - default-settings luci luci-compat luci-lib-ipkg + default-settings luci luci-compat luci-lib-ipkg \ + luci-app-sfe luci-app-flowoffload # For nas targets DEFAULT_PACKAGES.nas:=block-mount fdisk lsblk mdadm # For router targets diff --git a/package/ctcgfw/ChinaDNS/Makefile b/package/ctcgfw/ChinaDNS/Makefile new file mode 100644 index 0000000000..02985ea162 --- /dev/null +++ b/package/ctcgfw/ChinaDNS/Makefile @@ -0,0 +1,54 @@ +# +# Copyright (C) 2014-2018 OpenWrt-dist +# Copyright (C) 2014-2018 Jian Chang +# +# This is free software, licensed under the GNU General Public License v3. +# See /LICENSE for more information. +# + +include $(TOPDIR)/rules.mk + +PKG_NAME:=ChinaDNS +PKG_VERSION:=2.0.1 +PKG_RELEASE:=1 + +PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz +PKG_SOURCE_URL:=https://github.com/lrinQVQ/openwrt-chinadns/releases/download/v$(PKG_VERSION) +PKG_MD5SUM:=5c7aa6a89a969a1dd6469b4808b0759b + +PKG_LICENSE:=GPLv3 +PKG_LICENSE_FILES:=LICENSE +PKG_MAINTAINER:=Jian Chang + +PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)/$(PKG_NAME)-$(PKG_VERSION) + +PKG_INSTALL:=1 +PKG_FIXUP:=autoreconf +PKG_USE_MIPS16:=0 +PKG_BUILD_PARALLEL:=1 + +include $(INCLUDE_DIR)/package.mk + +define Package/ChinaDNS + SECTION:=net + CATEGORY:=Network + TITLE:=Protect yourself against DNS poisoning in China. + URL:=https://github.com/shadowsocks/ChinaDNS +endef + +define Package/ChinaDNS/description +Protect yourself against DNS poisoning in China. +endef + +define Package/ChinaDNS/conffiles +/etc/chinadns_chnroute.txt +endef + +define Package/ChinaDNS/install + $(INSTALL_DIR) $(1)/etc + $(INSTALL_CONF) $(PKG_BUILD_DIR)/chnroute.txt $(1)/etc/chinadns_chnroute.txt + $(INSTALL_DIR) $(1)/usr/sbin + $(INSTALL_BIN) $(PKG_BUILD_DIR)/src/chinadns $(1)/usr/sbin +endef + +$(eval $(call BuildPackage,ChinaDNS)) diff --git a/package/ctcgfw/GoQuiet/Makefile b/package/ctcgfw/GoQuiet/Makefile new file mode 100644 index 0000000000..d850dde9c7 --- /dev/null +++ b/package/ctcgfw/GoQuiet/Makefile @@ -0,0 +1,86 @@ +# +# Copyright (C) 2015-2016 OpenWrt.org +# +# This is free software, licensed under the GNU General Public License v3. +# + +include $(TOPDIR)/rules.mk + +PKG_NAME:=gq-client +PKG_VERSION:=1.2.2 +PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)-$(PKG_VERSION) + +include $(INCLUDE_DIR)/package.mk + +define Package/$(PKG_NAME)/temple + SECTION:=net + CATEGORY:=Network + TITLE:=GoQuiet + DEPENDS:=+libpthread + URL:=https://github.com/cbeuw/GoQuiet +endef + +define Package/$(PKG_NAME) + $(call Package/$(PKG_NAME)/temple) +endef + +define Package/gq-server + $(call Package/$(PKG_NAME)/temple) +endef + +define Package/$(PKG_NAME)/description +GoQuiet-client +endef + +define Package/gq-server/description +GoQuiet-server +endef + +ifeq ($(ARCH),x86_64) + GOQUIET_NAME:=gq-client-linux-amd64-$(PKG_VERSION) + GOQUIETSERVER_NAME:=gq-server-linux-amd64-$(PKG_VERSION) +endif +ifeq ($(ARCH),i386) + GOQUIET_NAME:=gq-client-linux-386-$(PKG_VERSION) + GOQUIETSERVER_NAME:=gq-server-linux-386-$(PKG_VERSION) +endif +ifeq ($(ARCH),mipsel) + GOQUIET_NAME:=gq-client-linux-mips64-$(PKG_VERSION) +endif +ifeq ($(ARCH),mips) + GOQUIET_NAME:=gq-client-linux-mips-$(PKG_VERSION) +endif +ifeq ($(ARCH),arm) + GOQUIET_NAME:=gq-client-linux-arm-$(PKG_VERSION) + GOQUIETSERVER_NAME:=gq-server-linux-arm-$(PKG_VERSION) +endif +ifeq ($(ARCH),aarch64) + GOQUIET_NAME:=gq-client-linux-arm64-$(PKG_VERSION) + GOQUIETSERVER_NAME:=gq-server-linux-arm64-$(PKG_VERSION) +endif + +define Build/Prepare + [ ! -f $(PKG_BUILD_DIR)/gq-client ] && wget -O $(PKG_BUILD_DIR)/gq-client https://github.com/cbeuw/GoQuiet/releases/download/v$(PKG_VERSION)/$(GOQUIET_NAME) + [ ! -f $(PKG_BUILD_DIR)/gq-server ] && wget -O $(PKG_BUILD_DIR)/gq-server https://github.com/cbeuw/GoQuiet/releases/download/v$(PKG_VERSION)/$(GOQUIETSERVER_NAME) +endef + +define Build/Configure + chmod +x $(PKG_BUILD_DIR)/gq-client && upx --ultra-brute $(PKG_BUILD_DIR)/gq-client + chmod +x $(PKG_BUILD_DIR)/gq-server && upx --ultra-brute $(PKG_BUILD_DIR)/gq-server +endef + +define Build/Compile +endef + +define Package/$(PKG_NAME)/install + $(INSTALL_DIR) $(1)/usr/bin + $(INSTALL_BIN) $(PKG_BUILD_DIR)/gq-client $(1)/usr/bin/ +endef + +define Package/gq-server/install + $(INSTALL_DIR) $(1)/usr/bin + $(INSTALL_BIN) $(PKG_BUILD_DIR)/gq-server $(1)/usr/bin/ +endef + +$(eval $(call BuildPackage,$(PKG_NAME))) +$(eval $(call BuildPackage,gq-server)) diff --git a/package/ctcgfw/UnblockNeteaseMusic-Go/Makefile b/package/ctcgfw/UnblockNeteaseMusic-Go/Makefile new file mode 100644 index 0000000000..ee8913ce78 --- /dev/null +++ b/package/ctcgfw/UnblockNeteaseMusic-Go/Makefile @@ -0,0 +1,72 @@ +# +# Copyright (C) 2015-2016 OpenWrt.org +# +# This is free software, licensed under the GNU General Public License v3. +# + +include $(TOPDIR)/rules.mk + +PKG_NAME:=UnblockNeteaseMusic-Go +PKG_VERSION:=snapshot +PKG_RELEASE:=r29-c39dcc6 + +ifeq ($(ARCH),x86_64) + PKG_ARCH_UnblockNeteaseMusic:=linux_amd64 +endif +ifeq ($(ARCH),i386) + PKG_ARCH_UnblockNeteaseMusic:=linux_386 +endif +ifeq ($(ARCH),mipsel) + PKG_ARCH_UnblockNeteaseMusic:=linux_mipsle +endif +ifeq ($(ARCH),mips) + PKG_ARCH_UnblockNeteaseMusic:=linux_mips +endif +ifeq ($(ARCH),arm) +ifeq ($(BOARD),kirkwood) + PKG_ARCH_UnblockNeteaseMusic:=linux_arm5 +else ifeq ($(BOARD),bcm53xx) + PKG_ARCH_UnblockNeteaseMusic:=linux_arm5 +else + PKG_ARCH_UnblockNeteaseMusic:=linux_arm7 +endif +endif +ifeq ($(ARCH),aarch64) + PKG_ARCH_UnblockNeteaseMusic:=linux_arm64 +endif + +PKG_SOURCE:=UnblockNeteaseMusic_$(PKG_ARCH_UnblockNeteaseMusic).tar.gz +PKG_SOURCE_URL:=https://package.project-openwrt.eu.org/utils/UnblockNeteaseMusic-Go/$(PKG_RELEASE)/ +PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)-$(PKG_VERSION)-$(PKG_RELEASE) +PKG_HASH:=skip + +include $(INCLUDE_DIR)/package.mk + +define Package/$(PKG_NAME) + SECTION:=net + CATEGORY:=Network + TITLE:=Revive unavailable songs for Netease Cloud Music (Golang) + URL:=https://github.com/cnsilvan/UnblockNeteaseMusic +endef + +define Build/Prepare + tar -xzf $(DL_DIR)/$(PKG_SOURCE) -C $(PKG_BUILD_DIR) +endef + +define Build/Configure +endef + +define Build/Compile + chmod 0755 $(PKG_BUILD_DIR)/UnblockNeteaseMusic +endef + +define Package/$(PKG_NAME)/install + $(INSTALL_DIR) $(1)/usr/bin + $(INSTALL_BIN) $(PKG_BUILD_DIR)/UnblockNeteaseMusic $(1)/usr/bin/UnblockNeteaseMusic + $(INSTALL_DIR) $(1)/usr/share/UnblockNeteaseMusic-Go + $(INSTALL_CONF) ./cert/server.crt $(1)/usr/share/UnblockNeteaseMusic-Go/server.crt + $(INSTALL_CONF) ./cert/server.key $(1)/usr/share/UnblockNeteaseMusic-Go/server.key + +endef + +$(eval $(call BuildPackage,$(PKG_NAME))) diff --git a/package/ctcgfw/UnblockNeteaseMusic-Go/cert/server.crt b/package/ctcgfw/UnblockNeteaseMusic-Go/cert/server.crt new file mode 100644 index 0000000000..b58111aee7 --- /dev/null +++ b/package/ctcgfw/UnblockNeteaseMusic-Go/cert/server.crt @@ -0,0 +1,21 @@ +-----BEGIN CERTIFICATE----- +MIIDfTCCAmWgAwIBAgIJAKTlW9B59i1HMA0GCSqGSIb3DQEBCwUAMFIxCzAJBgNV +BAYTAkNOMSQwIgYDVQQDDBtVbmJsb2NrTmV0ZWFzZU11c2ljIFJvb3QgQ0ExHTAb +BgNVBAoMFEdpdEh1Yi5jb20gQG5vbmRhbmVlMB4XDTE5MDUxODE2MDYxOFoXDTIw +MDUxNzE2MDYxOFowezELMAkGA1UEBhMCQ04xETAPBgNVBAcMCEhhbmd6aG91MSww +KgYDVQQKDCNOZXRFYXNlIChIYW5nemhvdSkgTmV0d29yayBDby4sIEx0ZDERMA8G +A1UECwwISVQgRGVwdC4xGDAWBgNVBAMMDyoubXVzaWMuMTYzLmNvbTCCASIwDQYJ +KoZIhvcNAQEBBQADggEPADCCAQoCggEBALobECypwEoe8VqM/FJvBRR3p2T+ZWdi +MSPrwfiRJr5p7OMtWBlLveCBV85+R3feidYbQTXlvVTdToY+GN6mFE1x6zG2dvLD +s4UuRnipmvGcFYhIRTX8J4AJiN8VMtW0TNXscRMudpz/FAVtsRrggRaThYg4f/rI +oAPMqKMsS4JoYhxs9ED6E6/tpj3XmSg1ekaXhgacYSYHeyxizZwoOFVCLH3TG5sF +sD6CYNnukYol8bR+VRpvHftIYss5Yz+DyyhYEAMJm1CfQo+xoGR3D0ozbT3hUnzm +fEoOhmSp3sALrFVE4iJSuajoh2/3xhmcyi3xZdWyq4F8hpb+URyaoW0CAwEAAaMt +MCswKQYDVR0RBCIwIIINbXVzaWMuMTYzLmNvbYIPKi5tdXNpYy4xNjMuY29tMA0G +CSqGSIb3DQEBCwUAA4IBAQB32SVz5jHUYv3ZG7SNF/LFJ904/LI8QlTe9R+Abb9z +bpXmQeo4pvNNOk3LgcTyuSIPQSHEFn32hk/MedB6Q2cKaGVKQq7Usne1jsV0JirG +wMx3PTcKPnX+XexRY8s6v6cNKSx5YlMQNFeH7p8MgKqdM/UX/dNCxT04X/ClmP1K +/rKqonXn4i3wmWprl7Q7Z1wqt0ygQRkNJKqdYKTu4oQcPON8/dRcseYdJzSoK2/G +H6cOJwKrRLzuUqQlphe6wyUsyTIbIJiFu1a1Gml6zB4lhLZhL89H2lYwdS8wWlc+ +M+wYi+XTM/ylNHEIoKsOe2nscnwi/hTfHJOPPchHbEuM +-----END CERTIFICATE----- diff --git a/package/ctcgfw/UnblockNeteaseMusic-Go/cert/server.key b/package/ctcgfw/UnblockNeteaseMusic-Go/cert/server.key new file mode 100644 index 0000000000..ce16c73adc --- /dev/null +++ b/package/ctcgfw/UnblockNeteaseMusic-Go/cert/server.key @@ -0,0 +1,27 @@ +-----BEGIN RSA PRIVATE KEY----- +MIIEowIBAAKCAQEAuhsQLKnASh7xWoz8Um8FFHenZP5lZ2IxI+vB+JEmvmns4y1Y +GUu94IFXzn5Hd96J1htBNeW9VN1Ohj4Y3qYUTXHrMbZ28sOzhS5GeKma8ZwViEhF +NfwngAmI3xUy1bRM1exxEy52nP8UBW2xGuCBFpOFiDh/+sigA8yooyxLgmhiHGz0 +QPoTr+2mPdeZKDV6RpeGBpxhJgd7LGLNnCg4VUIsfdMbmwWwPoJg2e6RiiXxtH5V +Gm8d+0hiyzljP4PLKFgQAwmbUJ9Cj7GgZHcPSjNtPeFSfOZ8Sg6GZKnewAusVUTi +IlK5qOiHb/fGGZzKLfFl1bKrgXyGlv5RHJqhbQIDAQABAoIBAEmAvtalBMlBh1mY +LV/xcTQwPfDpeOtoILhrOOUPjxnNhD4FfrIe9BNjgmaQAXIadp4VjZ/X6PtHnOfw +RqpJNeOQhq/PvRMMsC59pF+rvQKH/wkgYhV8Ta2IFoLlQHqfB2nGRLKquzYumJ28 +QSK4YMOl6CtxBTrrWiemAUTRDdGm8tARiipJH1SEJrS6d/NoRoJx2vixFgD2eS6X +bjnhGjIzvX/w5FWjctqj+SFITP1UI62b6DyWsPOkoosKNteK+Ulz+K6ZFvOx7day +XgUoTcVpwCVr2dVGhJtOrbKPcl1jYCYHJAHwzUZND4x4yftm1mnnsi3bthYqbtHQ +vxLE9YECgYEA9hiZxwiVvLjSe1xT/D75HbB8S1XSnwzpMmqgzStguxCQ0Qg5yiLI +UKRDY8UZvEDV4i2bQGy7mk8lFvX1q2z7Q30+dtT9r2N9a6ujMk5RMfo2BZg/poI6 +yDWe2tKUg9cTwfgni4TutLOYkpz3VDPIQHs3k2mpNh7f+8X4RIybDqkCgYEAwZhp +uWMV38Bb0WytswHXL1dRuwBskKqALUBY61dtXkyBuocj8AuRRxfxfZpgJRrHFxDX +O9bQ2nxpVlwKsR6DJDUdxU3+kvwyPfseU5XUBey8WdkuAKD7cKZOHMhFVWccks0U +YJzykNrxB+rGTiwVKa0MOhipuJ7boerwwaN2SyUCgYBP9Ow5o4tq9q3EUNoksZ0k +zUuE+oxlCr/VlplKL9bM0HQMxlxoVWa59LTEfKyA4pvbUbAIfYtydlZ5oE5CdTUp +105tM4R88Jk2W1y5ooJ093OH29CKW/OXSvyi4hpIv592vRa0GOupoFRpBkDBhdWB +RcdnyMOmht+FIOwp8XkLiQKBgAUK3j4Y6ZnxXbLfvMp70soF4TgYs7s05a/IDEjc +9xlMrthX6sS22GrcocqeucBdqS/dnW2Ok9QNB4VbUl/4pnvL8mGQPYBAl2Jr5wdQ +ULxyxRkmAf+8MbBmdIRlZwDpdaIRO2Wk0OCbA0osgEvK9CYovrfIqqsHYDsgbnLs +ugkNAoGBAJok06BN05caPXXLQ2pMwI/7mjcZFjcOMxSloYi7LFkxlyvoTqReAeSa +yOb6W/7obS1X8ms/EAkqiyzJuPtNZJCW/nvV0iCoZ/NxLuyHnFaO344GBAweol+S +Jx0MY8KuDCyeGErc2xdz/yr3ld2PSTq71dhBluGyba2YX+peJ2Yv +-----END RSA PRIVATE KEY----- diff --git a/package/ctcgfw/baidupcs-web/Makefile b/package/ctcgfw/baidupcs-web/Makefile new file mode 100644 index 0000000000..e938bcc68a --- /dev/null +++ b/package/ctcgfw/baidupcs-web/Makefile @@ -0,0 +1,82 @@ +# +# Copyright (C) 2019 OpenWrt.org +# +# KFERMercer +# +# This is free software, licensed under the GNU General Public License v3. +# + +include $(TOPDIR)/rules.mk + +PKG_NAME:=baidupcs-web +PKG_VERSION:=3.7.0 +PKG_RELEASE:=1 + +include $(INCLUDE_DIR)/package.mk + +define Package/$(PKG_NAME) + SECTION:=net + CATEGORY:=Network + TITLE:=BaiduPCS-Web is a web controller for BaiduPCS-Go + URL:=https://github.com/liuzhuoling2011/baidupcs-web +endef + + +define Package/$(PKG_NAME)/description +BaiduPCS-Web is a web controller for BaiduPCS-Go +endef + +# 禁止OpenWrt对二进制文件进行strip +STRIP:=true + +ifeq ($(ARCH),i386) + PKG_ARCH_BAIDUPCS-WEB:=86 +endif + +ifeq ($(ARCH),x86_64) + PKG_ARCH_BAIDUPCS-WEB:=amd64 +endif + +ifeq ($(ARCH),mipsel) + PKG_ARCH_BAIDUPCS-WEB:=mipsle +endif + +ifeq ($(ARCH),mips) + PKG_ARCH_BAIDUPCS-WEB:=mipsle +endif + +ifeq ($(ARCH),arm) + PKG_ARCH_BAIDUPCS-WEB:=arm +endif + +ifeq ($(ARCH),aarch64) + PKG_ARCH_BAIDUPCS-WEB:=arm64 +endif + + +PKG_SOURCE:=BaiduPCS-Go-$(PKG_VERSION)-linux-$(PKG_ARCH_BAIDUPCS-WEB).zip + +PKG_SOURCE_URL:=https://github.com/liuzhuoling2011/baidupcs-web/releases/download/$(PKG_VERSION)/ + +UNZIP_DIR:=$(BUILD_DIR)/$(PKG_NAME)-$(PKG_VERSION)/$(PKG_NAME)-unzip + +PKG_HASH:=skip + +define Build/Prepare + mkdir -vp $(UNZIP_DIR) + unzip -od $(UNZIP_DIR) $(DL_DIR)/$(PKG_SOURCE) +endef + +define Build/Configure +endef + +define Build/Compile +endef + +define Package/$(PKG_NAME)/install + $(INSTALL_DIR) $(1)/usr/bin + $(INSTALL_BIN) $(UNZIP_DIR)/*/BaiduPCS-Go $(1)/usr/bin/$(PKG_NAME) + chmod 755 $(1)/usr/bin/$(PKG_NAME) +endef + +$(eval $(call BuildPackage,$(PKG_NAME))) diff --git a/package/ctcgfw/bbr-bbrplus/Makefile b/package/ctcgfw/bbr-bbrplus/Makefile new file mode 100644 index 0000000000..796ae7422a --- /dev/null +++ b/package/ctcgfw/bbr-bbrplus/Makefile @@ -0,0 +1,46 @@ +include $(TOPDIR)/rules.mk +include $(INCLUDE_DIR)/kernel.mk + +PKG_NAME:=tcp-bbr-bbrplus +PKG_RELEASE:=1 + +include $(INCLUDE_DIR)/package.mk + +define KernelPackage/$(PKG_NAME) + SUBMENU:=Network Support + TITLE:=Modified bbr tcp congestion control + DEPENDS:=@LINUX_4_14 + FILES:=$(PKG_BUILD_DIR)/tcp_bbr_bbrplus.ko + KCONFIG:= +endef + +define KernelPackage/$(PKG_NAME)/description + Kernel module of modified BBR tcp congestion control +endef + +EXTRA_KCONFIG:= \ + + +EXTRA_CFLAGS:= \ + $(patsubst CONFIG_%, -DCONFIG_%=1, $(patsubst %=m,%,$(filter %=m,$(EXTRA_KCONFIG)))) \ + $(patsubst CONFIG_%, -DCONFIG_%=1, $(patsubst %=y,%,$(filter %=y,$(EXTRA_KCONFIG)))) \ + +MAKE_OPTS:= \ + ARCH="$(LINUX_KARCH)" \ + CROSS_COMPILE="$(TARGET_CROSS)" \ + SUBDIRS="$(PKG_BUILD_DIR)" \ + EXTRA_CFLAGS="$(EXTRA_CFLAGS)" \ + $(EXTRA_KCONFIG) + +define Build/Prepare + mkdir -p $(PKG_BUILD_DIR) + $(CP) ./src/* $(PKG_BUILD_DIR)/ +endef + +define Build/Compile + $(MAKE) -C "$(LINUX_DIR)" \ + $(MAKE_OPTS) \ + modules +endef + +$(eval $(call KernelPackage,$(PKG_NAME))) diff --git a/package/ctcgfw/bbr-bbrplus/src/Makefile b/package/ctcgfw/bbr-bbrplus/src/Makefile new file mode 100644 index 0000000000..9754713cc8 --- /dev/null +++ b/package/ctcgfw/bbr-bbrplus/src/Makefile @@ -0,0 +1 @@ +obj-m := tcp_bbr_bbrplus.o diff --git a/package/ctcgfw/bbr-bbrplus/src/tcp_bbr_bbrplus.c b/package/ctcgfw/bbr-bbrplus/src/tcp_bbr_bbrplus.c new file mode 100644 index 0000000000..f772a4d1e7 --- /dev/null +++ b/package/ctcgfw/bbr-bbrplus/src/tcp_bbr_bbrplus.c @@ -0,0 +1,1171 @@ +/* Bottleneck Bandwidth and RTT (BBR) congestion control + * + * BBR congestion control computes the sending rate based on the delivery + * rate (throughput) estimated from ACKs. In a nutshell: + * + * On each ACK, update our model of the network path: + * bottleneck_bandwidth = windowed_max(delivered / elapsed, 10 round trips) + * min_rtt = windowed_min(rtt, 10 seconds) + * pacing_rate = pacing_gain * bottleneck_bandwidth + * cwnd = max(cwnd_gain * bottleneck_bandwidth * min_rtt, 4) + * + * The core algorithm does not react directly to packet losses or delays, + * although BBR may adjust the size of next send per ACK when loss is + * observed, or adjust the sending rate if it estimates there is a + * traffic policer, in order to keep the drop rate reasonable. + * + * Here is a state transition diagram for BBR: + * + * | + * V + * +---> STARTUP ----+ + * | | | + * | V | + * | DRAIN ----+ + * | | | + * | V | + * +---> PROBE_BW ----+ + * | ^ | | + * | | | | + * | +----+ | + * | | + * +---- PROBE_RTT <--+ + * + * A BBR flow starts in STARTUP, and ramps up its sending rate quickly. + * When it estimates the pipe is full, it enters DRAIN to drain the queue. + * In steady state a BBR flow only uses PROBE_BW and PROBE_RTT. + * A long-lived BBR flow spends the vast majority of its time remaining + * (repeatedly) in PROBE_BW, fully probing and utilizing the pipe's bandwidth + * in a fair manner, with a small, bounded queue. *If* a flow has been + * continuously sending for the entire min_rtt window, and hasn't seen an RTT + * sample that matches or decreases its min_rtt estimate for 10 seconds, then + * it briefly enters PROBE_RTT to cut inflight to a minimum value to re-probe + * the path's two-way propagation delay (min_rtt). When exiting PROBE_RTT, if + * we estimated that we reached the full bw of the pipe then we enter PROBE_BW; + * otherwise we enter STARTUP to try to fill the pipe. + * + * BBR is described in detail in: + * "BBR: Congestion-Based Congestion Control", + * Neal Cardwell, Yuchung Cheng, C. Stephen Gunn, Soheil Hassas Yeganeh, + * Van Jacobson. ACM Queue, Vol. 14 No. 5, September-October 2016. + * + * There is a public e-mail list for discussing BBR development and testing: + * https://groups.google.com/forum/#!forum/bbr-dev + * + * NOTE: BBR might be used with the fq qdisc ("man tc-fq") with pacing enabled, + * otherwise TCP stack falls back to an internal pacing using one high + * resolution timer per TCP socket and may use more resources. + */ +#include +#include +#include +#include +#include +#include + +/* Scale factor for rate in pkt/uSec unit to avoid truncation in bandwidth + * estimation. The rate unit ~= (1500 bytes / 1 usec / 2^24) ~= 715 bps. + * This handles bandwidths from 0.06pps (715bps) to 256Mpps (3Tbps) in a u32. + * Since the minimum window is >=4 packets, the lower bound isn't + * an issue. The upper bound isn't an issue with existing technologies. + */ +#define BW_SCALE 24 +#define BW_UNIT (1 << BW_SCALE) + +#define BBR_SCALE 8 /* scaling factor for fractions in BBR (e.g. gains) */ +#define BBR_UNIT (1 << BBR_SCALE) + +/* BBR has the following modes for deciding how fast to send: */ +enum bbr_mode { + BBR_STARTUP, /* ramp up sending rate rapidly to fill pipe */ + BBR_DRAIN, /* drain any queue created during startup */ + BBR_PROBE_BW, /* discover, share bw: pace around estimated bw */ + BBR_PROBE_RTT, /* cut inflight to min to probe min_rtt */ +}; + +/* BBR congestion control block */ +struct bbr { + u32 min_rtt_us; /* min RTT in min_rtt_win_sec window */ + u32 min_rtt_stamp; /* timestamp of min_rtt_us */ + u32 probe_rtt_done_stamp; /* end time for BBR_PROBE_RTT mode */ + struct minmax bw; /* Max recent delivery rate in pkts/uS << 24 */ + u32 rtt_cnt; /* count of packet-timed rounds elapsed */ + u32 next_rtt_delivered; /* scb->tx.delivered at end of round */ + u64 cycle_mstamp; /* time of this cycle phase start */ + u32 mode:3, /* current bbr_mode in state machine */ + prev_ca_state:3, /* CA state on previous ACK */ + packet_conservation:1, /* use packet conservation? */ + restore_cwnd:1, /* decided to revert cwnd to old value */ + round_start:1, /* start of packet-timed tx->ack round? */ + cycle_len:4, /* phases in this PROBE_BW gain cycle */ + tso_segs_goal:7, /* segments we want in each skb we send */ + idle_restart:1, /* restarting after idle? */ + probe_rtt_round_done:1, /* a BBR_PROBE_RTT round at 4 pkts? */ + unused:8, + lt_is_sampling:1, /* taking long-term ("LT") samples now? */ + lt_rtt_cnt:7, /* round trips in long-term interval */ + lt_use_bw:1; /* use lt_bw as our bw estimate? */ + u32 lt_bw; /* LT est delivery rate in pkts/uS << 24 */ + u32 lt_last_delivered; /* LT intvl start: tp->delivered */ + u32 lt_last_stamp; /* LT intvl start: tp->delivered_mstamp */ + u32 lt_last_lost; /* LT intvl start: tp->lost */ + u32 pacing_gain:10, /* current gain for setting pacing rate */ + cwnd_gain:10, /* current gain for setting cwnd */ + full_bw_cnt:3, /* number of rounds without large bw gains */ + cycle_idx:3, /* current index in pacing_gain cycle array */ + has_seen_rtt:1, /* have we seen an RTT sample yet? */ + unused_b:5; + u32 prior_cwnd; /* prior cwnd upon entering loss recovery */ + u32 full_bw; /* recent bw, to estimate if pipe is full */ + /* For tracking ACK aggregation: */ + u64 ack_epoch_mstamp; + /* start of ACK sampling epoch */ + u16 extra_acked[2]; + /* max excess data ACKed in epoch */ + u32 ack_epoch_acked:20, /* packets (S)ACKed in sampling epoch */ + extra_acked_win_rtts:5, /* age of extra_acked, in round trips */ + extra_acked_win_idx:1, /* current index in extra_acked array */ + unused1:6; +}; + +#define CYCLE_LEN 8 /* number of phases in a pacing gain cycle */ + +/* Window length of bw filter (in rounds): */ +static const int bbr_bw_rtts = CYCLE_LEN + 2; +/* Window length of min_rtt filter (in sec): */ +static const u32 bbr_min_rtt_win_sec = 10; +/* Minimum time (in ms) spent at bbr_cwnd_min_target in BBR_PROBE_RTT mode: */ +static const u32 bbr_probe_rtt_mode_ms = 200; +/* Skip TSO below the following bandwidth (bits/sec): */ +static const int bbr_min_tso_rate = 1200000; + +/* We use a high_gain value of 2/ln(2) because it's the smallest pacing gain + * that will allow a smoothly increasing pacing rate that will double each RTT + * and send the same number of packets per RTT that an un-paced, slow-starting + * Reno or CUBIC flow would: + */ +static const int bbr_high_gain = BBR_UNIT * 2885 / 1000 + 1; +/* The pacing gain of 1/high_gain in BBR_DRAIN is calculated to typically drain + * the queue created in BBR_STARTUP in a single round: + */ +static const int bbr_drain_gain = BBR_UNIT * 1000 / 2885; +/* The gain for deriving steady-state cwnd tolerates delayed/stretched ACKs: */ +static const int bbr_cwnd_gain = BBR_UNIT * 2; + +enum bbr_pacing_gain_phase { + BBR_BW_PROBE_UP = 0, + BBR_BW_PROBE_DOWN = 1, + BBR_BW_PROBE_CRUISE = 2, +}; + + +/* The pacing_gain values for the PROBE_BW gain cycle, to discover/share bw: */ +static const int bbr_pacing_gain[] = { + BBR_UNIT * 5 / 4, /* probe for more available bw */ + BBR_UNIT * 3 / 4, /* drain queue and/or yield bw to other flows */ + BBR_UNIT, BBR_UNIT, BBR_UNIT, /* cruise at 1.0*bw to utilize pipe, */ + BBR_UNIT, BBR_UNIT, BBR_UNIT /* without creating excess queue... */ +}; +/* Randomize the starting gain cycling phase over N phases: */ +static const u32 bbr_cycle_rand = 7; + +/* Try to keep at least this many packets in flight, if things go smoothly. For + * smooth functioning, a sliding window protocol ACKing every other packet + * needs at least 4 packets in flight: + */ +static const u32 bbr_cwnd_min_target = 4; + +/* To estimate if BBR_STARTUP mode (i.e. high_gain) has filled pipe... */ +/* If bw has increased significantly (1.25x), there may be more bw available: */ +static const u32 bbr_full_bw_thresh = BBR_UNIT * 5 / 4; +/* But after 3 rounds w/o significant bw growth, estimate pipe is full: */ +static const u32 bbr_full_bw_cnt = 3; + +/* "long-term" ("LT") bandwidth estimator parameters... */ +/* The minimum number of rounds in an LT bw sampling interval: */ +static const u32 bbr_lt_intvl_min_rtts = 4; +/* If lost/delivered ratio > 20%, interval is "lossy" and we may be policed: */ +static const u32 bbr_lt_loss_thresh = 50; +/* If 2 intervals have a bw ratio <= 1/8, their bw is "consistent": */ +static const u32 bbr_lt_bw_ratio = BBR_UNIT / 8; +/* If 2 intervals have a bw diff <= 4 Kbit/sec their bw is "consistent": */ +static const u32 bbr_lt_bw_diff = 4000 / 8; +/* If we estimate we're policed, use lt_bw for this many round trips: */ +static const u32 bbr_lt_bw_max_rtts = 48; + +/* Gain factor for adding extra_acked to target cwnd: */ +static const int bbr_extra_acked_gain = BBR_UNIT; +/* Window length of extra_acked window. Max allowed val is 31. */ +static const u32 bbr_extra_acked_win_rtts = 10; +/* Max allowed val for ack_epoch_acked, after which sampling epoch is reset */ +static const u32 bbr_ack_epoch_acked_reset_thresh = 1U << 20; +/* Time period for clamping cwnd increment due to ack aggregation */ +static const u32 bbr_extra_acked_max_us = 100 * 1000; + +/* Each cycle, try to hold sub-unity gain until inflight <= BDP. */ +static const bool bbr_drain_to_target = true; /* default: enabled */ + +extern bool tcp_snd_wnd_test(const struct tcp_sock *tp, + const struct sk_buff *skb, + unsigned int cur_mss); + +/* Do we estimate that STARTUP filled the pipe? */ +static bool bbr_full_bw_reached(const struct sock *sk) +{ + const struct bbr *bbr = inet_csk_ca(sk); + + return bbr->full_bw_cnt >= bbr_full_bw_cnt; +} + +static void bbr_set_cycle_idx(struct sock *sk, int cycle_idx) +{ + struct bbr *bbr = inet_csk_ca(sk); + bbr->cycle_idx = cycle_idx; + bbr->pacing_gain = bbr->lt_use_bw ? + BBR_UNIT : bbr_pacing_gain[bbr->cycle_idx]; +} + +u32 bbr_max_bw(const struct sock *sk); +u32 bbr_inflight(struct sock *sk, u32 bw, int gain); +u32 bbr_max_bw(const struct sock *sk); + +static void bbr_drain_to_target_cycling(struct sock *sk, + const struct rate_sample *rs) +{ + struct tcp_sock *tp = tcp_sk(sk); + struct bbr *bbr = inet_csk_ca(sk); + u32 elapsed_us = + tcp_stamp_us_delta(tp->delivered_mstamp, bbr->cycle_mstamp); + u32 inflight, bw; + if (bbr->mode != BBR_PROBE_BW) + return; + + /* Always need to probe for bw before we forget good bw estimate. */ + if (elapsed_us > bbr->cycle_len * bbr->min_rtt_us) { + /* Start a new PROBE_BW probing cycle of [2 to 8] x min_rtt. */ + bbr->cycle_mstamp = tp->delivered_mstamp; + bbr->cycle_len = CYCLE_LEN - prandom_u32_max(bbr_cycle_rand); + bbr_set_cycle_idx(sk, BBR_BW_PROBE_UP); /* probe bandwidth */ + return; + } + /* The pacing_gain of 1.0 paces at the estimated bw to try to fully + * use the pipe without increasing the queue. + */ + if (bbr->pacing_gain == BBR_UNIT) + return; + inflight = rs->prior_in_flight; /* what was in-flight before ACK? */ + bw = bbr_max_bw(sk); + /* A pacing_gain < 1.0 tries to drain extra queue we added if bw + * probing didn't find more bw. If inflight falls to match BDP then we + * estimate queue is drained; persisting would underutilize the pipe. + */ + if (bbr->pacing_gain < BBR_UNIT) { + if (inflight <= bbr_inflight(sk, bw, BBR_UNIT)) + bbr_set_cycle_idx(sk, BBR_BW_PROBE_CRUISE); /* cruise */ + return; + } + /* A pacing_gain > 1.0 probes for bw by trying to raise inflight to at + * least pacing_gain*BDP; this may take more than min_rtt if min_rtt is + * small (e.g. on a LAN). We do not persist if packets are lost, since + * a path with small buffers may not hold that much. Similarly we exit + * if we were prevented by app/recv-win from reaching the target. + */ + if (elapsed_us > bbr->min_rtt_us && + (inflight >= bbr_inflight(sk, bw, bbr->pacing_gain) || + rs->losses || /* perhaps pacing_gain*BDP won't fit */ + rs->is_app_limited || /* previously app-limited */ + !tcp_send_head(sk) || /* currently app/rwin-limited */ + !tcp_snd_wnd_test(tp, tcp_send_head(sk), tp->mss_cache))) { + bbr_set_cycle_idx(sk, BBR_BW_PROBE_DOWN); /* drain queue */ + return; + } +} + + +/* Return maximum extra acked in past k-2k round trips, + * where k = bbr_extra_acked_win_rtts. + */ +static u16 bbr_extra_acked(const struct sock *sk) +{ + struct bbr *bbr = inet_csk_ca(sk); + return max(bbr->extra_acked[0], bbr->extra_acked[1]); +} + + +/* Return the windowed max recent bandwidth sample, in pkts/uS << BW_SCALE. */ +u32 bbr_max_bw(const struct sock *sk) +{ + struct bbr *bbr = inet_csk_ca(sk); + + return minmax_get(&bbr->bw); +} + +/* Return the estimated bandwidth of the path, in pkts/uS << BW_SCALE. */ +static u32 bbr_bw(const struct sock *sk) +{ + struct bbr *bbr = inet_csk_ca(sk); + + return bbr->lt_use_bw ? bbr->lt_bw : bbr_max_bw(sk); +} + +/* Return rate in bytes per second, optionally with a gain. + * The order here is chosen carefully to avoid overflow of u64. This should + * work for input rates of up to 2.9Tbit/sec and gain of 2.89x. + */ +static u64 bbr_rate_bytes_per_sec(struct sock *sk, u64 rate, int gain) +{ + rate *= tcp_mss_to_mtu(sk, tcp_sk(sk)->mss_cache); + rate *= gain; + rate >>= BBR_SCALE; + rate *= USEC_PER_SEC; + return rate >> BW_SCALE; +} + +/* Convert a BBR bw and gain factor to a pacing rate in bytes per second. */ +static u32 bbr_bw_to_pacing_rate(struct sock *sk, u32 bw, int gain) +{ + u64 rate = bw; + + rate = bbr_rate_bytes_per_sec(sk, rate, gain); + rate = min_t(u64, rate, sk->sk_max_pacing_rate); + return rate; +} + +/* Initialize pacing rate to: high_gain * init_cwnd / RTT. */ +static void bbr_init_pacing_rate_from_rtt(struct sock *sk) +{ + struct tcp_sock *tp = tcp_sk(sk); + struct bbr *bbr = inet_csk_ca(sk); + u64 bw; + u32 rtt_us; + + if (tp->srtt_us) { /* any RTT sample yet? */ + rtt_us = max(tp->srtt_us >> 3, 1U); + bbr->has_seen_rtt = 1; + } else { /* no RTT sample yet */ + rtt_us = USEC_PER_MSEC; /* use nominal default RTT */ + } + bw = (u64)tp->snd_cwnd * BW_UNIT; + do_div(bw, rtt_us); + sk->sk_pacing_rate = bbr_bw_to_pacing_rate(sk, bw, bbr_high_gain); +} + +/* Pace using current bw estimate and a gain factor. In order to help drive the + * network toward lower queues while maintaining high utilization and low + * latency, the average pacing rate aims to be slightly (~1%) lower than the + * estimated bandwidth. This is an important aspect of the design. In this + * implementation this slightly lower pacing rate is achieved implicitly by not + * including link-layer headers in the packet size used for the pacing rate. + */ +static void bbr_set_pacing_rate(struct sock *sk, u32 bw, int gain) +{ + struct tcp_sock *tp = tcp_sk(sk); + struct bbr *bbr = inet_csk_ca(sk); + u32 rate = bbr_bw_to_pacing_rate(sk, bw, gain); + + if (unlikely(!bbr->has_seen_rtt && tp->srtt_us)) + bbr_init_pacing_rate_from_rtt(sk); + if (bbr_full_bw_reached(sk) || rate > sk->sk_pacing_rate) + sk->sk_pacing_rate = rate; +} + +/* Return count of segments we want in the skbs we send, or 0 for default. */ +static u32 bbr_tso_segs_goal(struct sock *sk) +{ + struct bbr *bbr = inet_csk_ca(sk); + + return bbr->tso_segs_goal; +} + +static void bbr_set_tso_segs_goal(struct sock *sk) +{ + struct tcp_sock *tp = tcp_sk(sk); + struct bbr *bbr = inet_csk_ca(sk); + u32 min_segs; + + min_segs = sk->sk_pacing_rate < (bbr_min_tso_rate >> 3) ? 1 : 2; + bbr->tso_segs_goal = min(tcp_tso_autosize(sk, tp->mss_cache, min_segs), + 0x7FU); +} + +/* Save "last known good" cwnd so we can restore it after losses or PROBE_RTT */ +static void bbr_save_cwnd(struct sock *sk) +{ + struct tcp_sock *tp = tcp_sk(sk); + struct bbr *bbr = inet_csk_ca(sk); + + if (bbr->prev_ca_state < TCP_CA_Recovery && bbr->mode != BBR_PROBE_RTT) + bbr->prior_cwnd = tp->snd_cwnd; /* this cwnd is good enough */ + else /* loss recovery or BBR_PROBE_RTT have temporarily cut cwnd */ + bbr->prior_cwnd = max(bbr->prior_cwnd, tp->snd_cwnd); +} + +static void bbr_cwnd_event(struct sock *sk, enum tcp_ca_event event) +{ + struct tcp_sock *tp = tcp_sk(sk); + struct bbr *bbr = inet_csk_ca(sk); + + if (event == CA_EVENT_TX_START && tp->app_limited) { + bbr->idle_restart = 1; + bbr->ack_epoch_mstamp = tp->tcp_mstamp; + bbr->ack_epoch_acked = 0; + + /* Avoid pointless buffer overflows: pace at est. bw if we don't + * need more speed (we're restarting from idle and app-limited). + */ + if (bbr->mode == BBR_PROBE_BW) + bbr_set_pacing_rate(sk, bbr_bw(sk), BBR_UNIT); + } +} + +/* Find target cwnd. Right-size the cwnd based on min RTT and the + * estimated bottleneck bandwidth: + * + * cwnd = bw * min_rtt * gain = BDP * gain + * + * The key factor, gain, controls the amount of queue. While a small gain + * builds a smaller queue, it becomes more vulnerable to noise in RTT + * measurements (e.g., delayed ACKs or other ACK compression effects). This + * noise may cause BBR to under-estimate the rate. + * + * To achieve full performance in high-speed paths, we budget enough cwnd to + * fit full-sized skbs in-flight on both end hosts to fully utilize the path: + * - one skb in sending host Qdisc, + * - one skb in sending host TSO/GSO engine + * - one skb being received by receiver host LRO/GRO/delayed-ACK engine + * Don't worry, at low rates (bbr_min_tso_rate) this won't bloat cwnd because + * in such cases tso_segs_goal is 1. The minimum cwnd is 4 packets, + * which allows 2 outstanding 2-packet sequences, to try to keep pipe + * full even with ACK-every-other-packet delayed ACKs. + */ +static u32 bbr_bdp(struct sock *sk, u32 bw, int gain) +{ + struct bbr *bbr = inet_csk_ca(sk); + u32 bdp; + u64 w; + + /* If we've never had a valid RTT sample, cap cwnd at the initial + * default. This should only happen when the connection is not using TCP + * timestamps and has retransmitted all of the SYN/SYNACK/data packets + * ACKed so far. In this case, an RTO can cut cwnd to 1, in which + * case we need to slow-start up toward something safe: TCP_INIT_CWND. + */ + if (unlikely(bbr->min_rtt_us == ~0U)) /* no valid RTT samples yet? */ + return TCP_INIT_CWND; /* be safe: cap at default initial cwnd*/ + + w = (u64)bw * bbr->min_rtt_us; + + /* Apply a gain to the given value, then remove the BW_SCALE shift. */ + bdp = (((w * gain) >> BBR_SCALE) + BW_UNIT - 1) / BW_UNIT; + + return bdp; +} + +static u32 bbr_quantization_budget(struct sock *sk, u32 cwnd, int gain) +{ + + /* Allow enough full-sized skbs in flight to utilize end systems. */ + cwnd += 3 * bbr_tso_segs_goal(sk); + + return cwnd; +} + +/* Find inflight based on min RTT and the estimated bottleneck bandwidth. */ +u32 bbr_inflight(struct sock *sk, u32 bw, int gain) +{ + u32 inflight; + inflight = bbr_bdp(sk, bw, gain); + inflight = bbr_quantization_budget(sk, inflight, gain); + return inflight; + +} + +/* Find the cwnd increment based on estimate of ack aggregation */ +static u32 bbr_ack_aggregation_cwnd(struct sock *sk) +{ + u32 max_aggr_cwnd, aggr_cwnd = 0; + if (bbr_extra_acked_gain && bbr_full_bw_reached(sk)) { + max_aggr_cwnd = ((u64)bbr_bw(sk) * bbr_extra_acked_max_us) + / BW_UNIT; + aggr_cwnd = (bbr_extra_acked_gain * bbr_extra_acked(sk)) + >> BBR_SCALE; + aggr_cwnd = min(aggr_cwnd, max_aggr_cwnd); + } + return aggr_cwnd; +} + + +/* An optimization in BBR to reduce losses: On the first round of recovery, we + * follow the packet conservation principle: send P packets per P packets acked. + * After that, we slow-start and send at most 2*P packets per P packets acked. + * After recovery finishes, or upon undo, we restore the cwnd we had when + * recovery started (capped by the target cwnd based on estimated BDP). + * + * TODO(ycheng/ncardwell): implement a rate-based approach. + */ +static bool bbr_set_cwnd_to_recover_or_restore( + struct sock *sk, const struct rate_sample *rs, u32 acked, u32 *new_cwnd) +{ + struct tcp_sock *tp = tcp_sk(sk); + struct bbr *bbr = inet_csk_ca(sk); + u8 prev_state = bbr->prev_ca_state, state = inet_csk(sk)->icsk_ca_state; + u32 cwnd = tp->snd_cwnd; + + /* An ACK for P pkts should release at most 2*P packets. We do this + * in two steps. First, here we deduct the number of lost packets. + * Then, in bbr_set_cwnd() we slow start up toward the target cwnd. + */ + if (rs->losses > 0) + cwnd = max_t(s32, cwnd - rs->losses, 1); + + if (state == TCP_CA_Recovery && prev_state != TCP_CA_Recovery) { + /* Starting 1st round of Recovery, so do packet conservation. */ + bbr->packet_conservation = 1; + bbr->next_rtt_delivered = tp->delivered; /* start round now */ + /* Cut unused cwnd from app behavior, TSQ, or TSO deferral: */ + cwnd = tcp_packets_in_flight(tp) + acked; + } else if (prev_state >= TCP_CA_Recovery && state < TCP_CA_Recovery) { + /* Exiting loss recovery; restore cwnd saved before recovery. */ + bbr->restore_cwnd = 1; + bbr->packet_conservation = 0; + } + bbr->prev_ca_state = state; + + if (bbr->restore_cwnd) { + /* Restore cwnd after exiting loss recovery or PROBE_RTT. */ + cwnd = max(cwnd, bbr->prior_cwnd); + bbr->restore_cwnd = 0; + } + + if (bbr->packet_conservation) { + *new_cwnd = max(cwnd, tcp_packets_in_flight(tp) + acked); + return true; /* yes, using packet conservation */ + } + *new_cwnd = cwnd; + return false; +} + +/* Slow-start up toward target cwnd (if bw estimate is growing, or packet loss + * has drawn us down below target), or snap down to target if we're above it. + */ +static void bbr_set_cwnd(struct sock *sk, const struct rate_sample *rs, + u32 acked, u32 bw, int gain) +{ + struct tcp_sock *tp = tcp_sk(sk); + struct bbr *bbr = inet_csk_ca(sk); + u32 cwnd = 0, target_cwnd = 0; + + if (!acked) + return; + + if (bbr_set_cwnd_to_recover_or_restore(sk, rs, acked, &cwnd)) + goto done; + + /* If we're below target cwnd, slow start cwnd toward target cwnd. */ + target_cwnd = bbr_bdp(sk, bw, gain); + //// + /* Increment the cwnd to account for excess ACKed data that seems + * due to aggregation (of data and/or ACKs) visible in the ACK stream. + */ + target_cwnd += bbr_ack_aggregation_cwnd(sk); + //// + target_cwnd = bbr_quantization_budget(sk, target_cwnd, gain); + if (bbr_full_bw_reached(sk)) /* only cut cwnd if we filled the pipe */ + cwnd = min(cwnd + acked, target_cwnd); + else if (cwnd < target_cwnd || tp->delivered < TCP_INIT_CWND) + cwnd = cwnd + acked; + cwnd = max(cwnd, bbr_cwnd_min_target); + +done: + tp->snd_cwnd = min(cwnd, tp->snd_cwnd_clamp); /* apply global cap */ + if (bbr->mode == BBR_PROBE_RTT) /* drain queue, refresh min_rtt */ + tp->snd_cwnd = min(tp->snd_cwnd, bbr_cwnd_min_target); +} + +/* End cycle phase if it's time and/or we hit the phase's in-flight target. */ +static bool bbr_is_next_cycle_phase(struct sock *sk, + const struct rate_sample *rs) +{ + struct tcp_sock *tp = tcp_sk(sk); + struct bbr *bbr = inet_csk_ca(sk); + bool is_full_length = + tcp_stamp_us_delta(tp->delivered_mstamp, bbr->cycle_mstamp) > + bbr->min_rtt_us; + u32 inflight, bw; + + /* The pacing_gain of 1.0 paces at the estimated bw to try to fully + * use the pipe without increasing the queue. + */ + if (bbr->pacing_gain == BBR_UNIT) + return is_full_length; /* just use wall clock time */ + + inflight = rs->prior_in_flight; /* what was in-flight before ACK? */ + bw = bbr_max_bw(sk); + + /* A pacing_gain > 1.0 probes for bw by trying to raise inflight to at + * least pacing_gain*BDP; this may take more than min_rtt if min_rtt is + * small (e.g. on a LAN). We do not persist if packets are lost, since + * a path with small buffers may not hold that much. + */ + if (bbr->pacing_gain > BBR_UNIT) + return is_full_length && + (rs->losses || /* perhaps pacing_gain*BDP won't fit */ + inflight >= bbr_inflight(sk, bw, bbr->pacing_gain)); + + /* A pacing_gain < 1.0 tries to drain extra queue we added if bw + * probing didn't find more bw. If inflight falls to match BDP then we + * estimate queue is drained; persisting would underutilize the pipe. + */ + return is_full_length || + inflight <= bbr_inflight(sk, bw, BBR_UNIT); +} + +static void bbr_advance_cycle_phase(struct sock *sk) +{ + struct tcp_sock *tp = tcp_sk(sk); + struct bbr *bbr = inet_csk_ca(sk); + + + bbr->cycle_idx = (bbr->cycle_idx + 1) & (CYCLE_LEN - 1); + bbr->cycle_mstamp = tp->delivered_mstamp; + bbr->pacing_gain = bbr_pacing_gain[bbr->cycle_idx]; +} + +/* Gain cycling: cycle pacing gain to converge to fair share of available bw. */ +static void bbr_update_cycle_phase(struct sock *sk, + const struct rate_sample *rs) +{ + struct bbr *bbr = inet_csk_ca(sk); + + if (bbr_drain_to_target) { + bbr_drain_to_target_cycling(sk, rs); + return; + } + + if ((bbr->mode == BBR_PROBE_BW) && !bbr->lt_use_bw && + bbr_is_next_cycle_phase(sk, rs)) + bbr_advance_cycle_phase(sk); +} + +static void bbr_reset_startup_mode(struct sock *sk) +{ + struct bbr *bbr = inet_csk_ca(sk); + + bbr->mode = BBR_STARTUP; + bbr->pacing_gain = bbr_high_gain; + bbr->cwnd_gain = bbr_high_gain; +} + +static void bbr_reset_probe_bw_mode(struct sock *sk) +{ + struct bbr *bbr = inet_csk_ca(sk); + + bbr->mode = BBR_PROBE_BW; + bbr->pacing_gain = BBR_UNIT; + bbr->cwnd_gain = bbr_cwnd_gain; + bbr->cycle_idx = CYCLE_LEN - 1 - prandom_u32_max(bbr_cycle_rand); + bbr_advance_cycle_phase(sk); /* flip to next phase of gain cycle */ +} + +static void bbr_reset_mode(struct sock *sk) +{ + if (!bbr_full_bw_reached(sk)) + bbr_reset_startup_mode(sk); + else + bbr_reset_probe_bw_mode(sk); +} + +/* Start a new long-term sampling interval. */ +static void bbr_reset_lt_bw_sampling_interval(struct sock *sk) +{ + struct tcp_sock *tp = tcp_sk(sk); + struct bbr *bbr = inet_csk_ca(sk); + + bbr->lt_last_stamp = div_u64(tp->delivered_mstamp, USEC_PER_MSEC); + bbr->lt_last_delivered = tp->delivered; + bbr->lt_last_lost = tp->lost; + bbr->lt_rtt_cnt = 0; +} + +/* Completely reset long-term bandwidth sampling. */ +static void bbr_reset_lt_bw_sampling(struct sock *sk) +{ + struct bbr *bbr = inet_csk_ca(sk); + + bbr->lt_bw = 0; + bbr->lt_use_bw = 0; + bbr->lt_is_sampling = false; + bbr_reset_lt_bw_sampling_interval(sk); +} + +/* Long-term bw sampling interval is done. Estimate whether we're policed. */ +static void bbr_lt_bw_interval_done(struct sock *sk, u32 bw) +{ + struct bbr *bbr = inet_csk_ca(sk); + u32 diff; + + if (bbr->lt_bw) { /* do we have bw from a previous interval? */ + /* Is new bw close to the lt_bw from the previous interval? */ + diff = abs(bw - bbr->lt_bw); + if ((diff * BBR_UNIT <= bbr_lt_bw_ratio * bbr->lt_bw) || + (bbr_rate_bytes_per_sec(sk, diff, BBR_UNIT) <= + bbr_lt_bw_diff)) { + /* All criteria are met; estimate we're policed. */ + bbr->lt_bw = (bw + bbr->lt_bw) >> 1; /* avg 2 intvls */ + bbr->lt_use_bw = 1; + bbr->pacing_gain = BBR_UNIT; /* try to avoid drops */ + bbr->lt_rtt_cnt = 0; + return; + } + } + bbr->lt_bw = bw; + bbr_reset_lt_bw_sampling_interval(sk); +} + +/* Token-bucket traffic policers are common (see "An Internet-Wide Analysis of + * Traffic Policing", SIGCOMM 2016). BBR detects token-bucket policers and + * explicitly models their policed rate, to reduce unnecessary losses. We + * estimate that we're policed if we see 2 consecutive sampling intervals with + * consistent throughput and high packet loss. If we think we're being policed, + * set lt_bw to the "long-term" average delivery rate from those 2 intervals. + */ +static void bbr_lt_bw_sampling(struct sock *sk, const struct rate_sample *rs) +{ + struct tcp_sock *tp = tcp_sk(sk); + struct bbr *bbr = inet_csk_ca(sk); + u32 lost, delivered; + u64 bw; + u32 t; + + if (bbr->lt_use_bw) { /* already using long-term rate, lt_bw? */ + if (bbr->mode == BBR_PROBE_BW && bbr->round_start && + ++bbr->lt_rtt_cnt >= bbr_lt_bw_max_rtts) { + bbr_reset_lt_bw_sampling(sk); /* stop using lt_bw */ + bbr_reset_probe_bw_mode(sk); /* restart gain cycling */ + } + return; + } + + /* Wait for the first loss before sampling, to let the policer exhaust + * its tokens and estimate the steady-state rate allowed by the policer. + * Starting samples earlier includes bursts that over-estimate the bw. + */ + if (!bbr->lt_is_sampling) { + if (!rs->losses) + return; + bbr_reset_lt_bw_sampling_interval(sk); + bbr->lt_is_sampling = true; + } + + /* To avoid underestimates, reset sampling if we run out of data. */ + if (rs->is_app_limited) { + bbr_reset_lt_bw_sampling(sk); + return; + } + + if (bbr->round_start) + bbr->lt_rtt_cnt++; /* count round trips in this interval */ + if (bbr->lt_rtt_cnt < bbr_lt_intvl_min_rtts) + return; /* sampling interval needs to be longer */ + if (bbr->lt_rtt_cnt > 4 * bbr_lt_intvl_min_rtts) { + bbr_reset_lt_bw_sampling(sk); /* interval is too long */ + return; + } + + /* End sampling interval when a packet is lost, so we estimate the + * policer tokens were exhausted. Stopping the sampling before the + * tokens are exhausted under-estimates the policed rate. + */ + if (!rs->losses) + return; + + /* Calculate packets lost and delivered in sampling interval. */ + lost = tp->lost - bbr->lt_last_lost; + delivered = tp->delivered - bbr->lt_last_delivered; + /* Is loss rate (lost/delivered) >= lt_loss_thresh? If not, wait. */ + if (!delivered || (lost << BBR_SCALE) < bbr_lt_loss_thresh * delivered) + return; + + /* Find average delivery rate in this sampling interval. */ + t = div_u64(tp->delivered_mstamp, USEC_PER_MSEC) - bbr->lt_last_stamp; + if ((s32)t < 1) + return; /* interval is less than one ms, so wait */ + /* Check if can multiply without overflow */ + if (t >= ~0U / USEC_PER_MSEC) { + bbr_reset_lt_bw_sampling(sk); /* interval too long; reset */ + return; + } + t *= USEC_PER_MSEC; + bw = (u64)delivered * BW_UNIT; + do_div(bw, t); + bbr_lt_bw_interval_done(sk, bw); +} + +/* Estimate the bandwidth based on how fast packets are delivered */ +static void bbr_update_bw(struct sock *sk, const struct rate_sample *rs) +{ + struct tcp_sock *tp = tcp_sk(sk); + struct bbr *bbr = inet_csk_ca(sk); + u64 bw; + + bbr->round_start = 0; + if (rs->delivered < 0 || rs->interval_us <= 0) + return; /* Not a valid observation */ + + /* See if we've reached the next RTT */ + if (!before(rs->prior_delivered, bbr->next_rtt_delivered)) { + bbr->next_rtt_delivered = tp->delivered; + bbr->rtt_cnt++; + bbr->round_start = 1; + bbr->packet_conservation = 0; + } + + bbr_lt_bw_sampling(sk, rs); + + /* Divide delivered by the interval to find a (lower bound) bottleneck + * bandwidth sample. Delivered is in packets and interval_us in uS and + * ratio will be <<1 for most connections. So delivered is first scaled. + */ + bw = (u64)rs->delivered * BW_UNIT; + do_div(bw, rs->interval_us); + + /* If this sample is application-limited, it is likely to have a very + * low delivered count that represents application behavior rather than + * the available network rate. Such a sample could drag down estimated + * bw, causing needless slow-down. Thus, to continue to send at the + * last measured network rate, we filter out app-limited samples unless + * they describe the path bw at least as well as our bw model. + * + * So the goal during app-limited phase is to proceed with the best + * network rate no matter how long. We automatically leave this + * phase when app writes faster than the network can deliver :) + */ + if (!rs->is_app_limited || bw >= bbr_max_bw(sk)) { + /* Incorporate new sample into our max bw filter. */ + minmax_running_max(&bbr->bw, bbr_bw_rtts, bbr->rtt_cnt, bw); + } +} + +/* Estimate when the pipe is full, using the change in delivery rate: BBR + * estimates that STARTUP filled the pipe if the estimated bw hasn't changed by + * at least bbr_full_bw_thresh (25%) after bbr_full_bw_cnt (3) non-app-limited + * rounds. Why 3 rounds: 1: rwin autotuning grows the rwin, 2: we fill the + * higher rwin, 3: we get higher delivery rate samples. Or transient + * cross-traffic or radio noise can go away. CUBIC Hystart shares a similar + * design goal, but uses delay and inter-ACK spacing instead of bandwidth. + */ +static void bbr_check_full_bw_reached(struct sock *sk, + const struct rate_sample *rs) +{ + struct bbr *bbr = inet_csk_ca(sk); + u32 bw_thresh; + + if (bbr_full_bw_reached(sk) || !bbr->round_start || rs->is_app_limited) + return; + + bw_thresh = (u64)bbr->full_bw * bbr_full_bw_thresh >> BBR_SCALE; + if (bbr_max_bw(sk) >= bw_thresh) { + bbr->full_bw = bbr_max_bw(sk); + bbr->full_bw_cnt = 0; + return; + } + ++bbr->full_bw_cnt; +} + +/* If pipe is probably full, drain the queue and then enter steady-state. */ +static void bbr_check_drain(struct sock *sk, const struct rate_sample *rs) +{ + struct bbr *bbr = inet_csk_ca(sk); + + if (bbr->mode == BBR_STARTUP && bbr_full_bw_reached(sk)) { + bbr->mode = BBR_DRAIN; /* drain queue we created */ + bbr->pacing_gain = bbr_drain_gain; /* pace slow to drain */ + bbr->cwnd_gain = bbr_high_gain; /* maintain cwnd */ + } /* fall through to check if in-flight is already small: */ + if (bbr->mode == BBR_DRAIN && + tcp_packets_in_flight(tcp_sk(sk)) <= bbr_inflight(sk, bbr_max_bw(sk), BBR_UNIT)) + bbr_reset_probe_bw_mode(sk); /* we estimate queue is drained */ +} + + +/* Estimates the windowed max degree of ack aggregation. + * This is used to provision extra in-flight data to keep sending during + * inter-ACK silences. + * + * Degree of ack aggregation is estimated as extra data acked beyond expected. + * + * max_extra_acked = "maximum recent excess data ACKed beyond max_bw * interval" + * cwnd += max_extra_acked + * + * Max extra_acked is clamped by cwnd and bw * bbr_extra_acked_max_us (100 ms). + * Max filter is an approximate sliding window of 10-20 (packet timed) round + * trips. + */ + static void bbr_update_ack_aggregation(struct sock *sk, + const struct rate_sample *rs) + { + u32 epoch_us, expected_acked, extra_acked; + struct bbr *bbr = inet_csk_ca(sk); + struct tcp_sock *tp = tcp_sk(sk); + if (!bbr_extra_acked_gain || rs->acked_sacked <= 0 || + rs->delivered < 0 || rs->interval_us <= 0) + return; + if (bbr->round_start) { + bbr->extra_acked_win_rtts = min(0x1F, + bbr->extra_acked_win_rtts + 1); + if (bbr->extra_acked_win_rtts >= bbr_extra_acked_win_rtts) { + bbr->extra_acked_win_rtts = 0; + bbr->extra_acked_win_idx = bbr->extra_acked_win_idx ?0 : 1; + bbr->extra_acked[bbr->extra_acked_win_idx] = 0; + } + } + /* Compute how many packets we expected to be delivered over epoch. */ + epoch_us = tcp_stamp_us_delta(tp->delivered_mstamp, + bbr->ack_epoch_mstamp); + expected_acked = ((u64)bbr_bw(sk) * epoch_us) / BW_UNIT; + /* Reset the aggregation epoch if ACK rate is below expected rate or + * significantly large no. of ack received since epoch (potentially + * quite old epoch). + */ + if (bbr->ack_epoch_acked <= expected_acked || + (bbr->ack_epoch_acked + rs->acked_sacked >= + bbr_ack_epoch_acked_reset_thresh)) { + bbr->ack_epoch_acked = 0; + bbr->ack_epoch_mstamp = tp->delivered_mstamp; + expected_acked = 0; + } + /* Compute excess data delivered, beyond what was expected. */ + bbr->ack_epoch_acked = min(0xFFFFFU, + bbr->ack_epoch_acked + rs->acked_sacked); + extra_acked = bbr->ack_epoch_acked - expected_acked; + extra_acked = min(extra_acked, tp->snd_cwnd); + if (extra_acked > bbr->extra_acked[bbr->extra_acked_win_idx]) + bbr->extra_acked[bbr->extra_acked_win_idx] = extra_acked; +} + +/* The goal of PROBE_RTT mode is to have BBR flows cooperatively and + * periodically drain the bottleneck queue, to converge to measure the true + * min_rtt (unloaded propagation delay). This allows the flows to keep queues + * small (reducing queuing delay and packet loss) and achieve fairness among + * BBR flows. + * + * The min_rtt filter window is 10 seconds. When the min_rtt estimate expires, + * we enter PROBE_RTT mode and cap the cwnd at bbr_cwnd_min_target=4 packets. + * After at least bbr_probe_rtt_mode_ms=200ms and at least one packet-timed + * round trip elapsed with that flight size <= 4, we leave PROBE_RTT mode and + * re-enter the previous mode. BBR uses 200ms to approximately bound the + * performance penalty of PROBE_RTT's cwnd capping to roughly 2% (200ms/10s). + * + * Note that flows need only pay 2% if they are busy sending over the last 10 + * seconds. Interactive applications (e.g., Web, RPCs, video chunks) often have + * natural silences or low-rate periods within 10 seconds where the rate is low + * enough for long enough to drain its queue in the bottleneck. We pick up + * these min RTT measurements opportunistically with our min_rtt filter. :-) + */ + +static void bbr_update_min_rtt(struct sock *sk, const struct rate_sample *rs) +{ + struct tcp_sock *tp = tcp_sk(sk); + struct bbr *bbr = inet_csk_ca(sk); + bool filter_expired; + + /* Track min RTT seen in the min_rtt_win_sec filter window: */ + filter_expired = after(tcp_jiffies32, + bbr->min_rtt_stamp + bbr_min_rtt_win_sec * HZ); + if (rs->rtt_us >= 0 && + (rs->rtt_us <= bbr->min_rtt_us || filter_expired)) { + bbr->min_rtt_us = rs->rtt_us; + bbr->min_rtt_stamp = tcp_jiffies32; + } + + if (bbr_probe_rtt_mode_ms > 0 && filter_expired && + !bbr->idle_restart && bbr->mode != BBR_PROBE_RTT) { + bbr->mode = BBR_PROBE_RTT; /* dip, drain queue */ + bbr->pacing_gain = BBR_UNIT; + bbr->cwnd_gain = BBR_UNIT; + bbr_save_cwnd(sk); /* note cwnd so we can restore it */ + bbr->probe_rtt_done_stamp = 0; + } + + if (bbr->mode == BBR_PROBE_RTT) { + /* Ignore low rate samples during this mode. */ + tp->app_limited = + (tp->delivered + tcp_packets_in_flight(tp)) ? : 1; + /* Maintain min packets in flight for max(200 ms, 1 round). */ + if (!bbr->probe_rtt_done_stamp && + tcp_packets_in_flight(tp) <= bbr_cwnd_min_target) { + bbr->probe_rtt_done_stamp = tcp_jiffies32 + + msecs_to_jiffies(bbr_probe_rtt_mode_ms); + bbr->probe_rtt_round_done = 0; + bbr->next_rtt_delivered = tp->delivered; + } else if (bbr->probe_rtt_done_stamp) { + if (bbr->round_start) + bbr->probe_rtt_round_done = 1; + if (bbr->probe_rtt_round_done && + after(tcp_jiffies32, bbr->probe_rtt_done_stamp)) { + bbr->min_rtt_stamp = tcp_jiffies32; + bbr->restore_cwnd = 1; /* snap to prior_cwnd */ + bbr_reset_mode(sk); + } + } + } + bbr->idle_restart = 0; +} + +static void bbr_update_model(struct sock *sk, const struct rate_sample *rs) +{ + bbr_update_bw(sk, rs); + bbr_update_ack_aggregation(sk, rs); + bbr_update_cycle_phase(sk, rs); + bbr_check_full_bw_reached(sk, rs); + bbr_check_drain(sk, rs); + bbr_update_min_rtt(sk, rs); +} + +static void bbr_main(struct sock *sk, const struct rate_sample *rs) +{ + struct bbr *bbr = inet_csk_ca(sk); + u32 bw; + + bbr_update_model(sk, rs); + + bw = bbr_bw(sk); + bbr_set_pacing_rate(sk, bw, bbr->pacing_gain); + bbr_set_tso_segs_goal(sk); + bbr_set_cwnd(sk, rs, rs->acked_sacked, bw, bbr->cwnd_gain); +} + +static void bbr_init(struct sock *sk) +{ + struct tcp_sock *tp = tcp_sk(sk); + struct bbr *bbr = inet_csk_ca(sk); + + bbr->prior_cwnd = 0; + bbr->tso_segs_goal = 0; /* default segs per skb until first ACK */ + bbr->rtt_cnt = 0; + bbr->next_rtt_delivered = 0; + bbr->prev_ca_state = TCP_CA_Open; + bbr->packet_conservation = 0; + + bbr->probe_rtt_done_stamp = 0; + bbr->probe_rtt_round_done = 0; + bbr->min_rtt_us = tcp_min_rtt(tp); + bbr->min_rtt_stamp = tcp_jiffies32; + + minmax_reset(&bbr->bw, bbr->rtt_cnt, 0); /* init max bw to 0 */ + + bbr->has_seen_rtt = 0; + bbr_init_pacing_rate_from_rtt(sk); + + bbr->restore_cwnd = 0; + bbr->round_start = 0; + bbr->idle_restart = 0; + bbr->full_bw = 0; + bbr->full_bw_cnt = 0; + bbr->cycle_mstamp = 0; + bbr->cycle_idx = 0; + bbr->cycle_len = 0; + bbr_reset_lt_bw_sampling(sk); + bbr_reset_startup_mode(sk); + bbr->ack_epoch_mstamp = tp->tcp_mstamp; + bbr->ack_epoch_acked = 0; + bbr->extra_acked_win_rtts = 0; + bbr->extra_acked_win_idx = 0; + bbr->extra_acked[0] = 0; + bbr->extra_acked[1] = 0; + + cmpxchg(&sk->sk_pacing_status, SK_PACING_NONE, SK_PACING_NEEDED); +} + +static u32 bbr_sndbuf_expand(struct sock *sk) +{ + /* Provision 3 * cwnd since BBR may slow-start even during recovery. */ + return 3; +} + +/* In theory BBR does not need to undo the cwnd since it does not + * always reduce cwnd on losses (see bbr_main()). Keep it for now. + */ +static u32 bbr_undo_cwnd(struct sock *sk) +{ + return tcp_sk(sk)->snd_cwnd; +} + +/* Entering loss recovery, so save cwnd for when we exit or undo recovery. */ +static u32 bbr_ssthresh(struct sock *sk) +{ + bbr_save_cwnd(sk); + return TCP_INFINITE_SSTHRESH; /* BBR does not use ssthresh */ +} + +static size_t bbr_get_info(struct sock *sk, u32 ext, int *attr, + union tcp_cc_info *info) +{ + if (ext & (1 << (INET_DIAG_BBRINFO - 1)) || + ext & (1 << (INET_DIAG_VEGASINFO - 1))) { + struct tcp_sock *tp = tcp_sk(sk); + struct bbr *bbr = inet_csk_ca(sk); + u64 bw = bbr_bw(sk); + + bw = bw * tp->mss_cache * USEC_PER_SEC >> BW_SCALE; + memset(&info->bbr, 0, sizeof(info->bbr)); + info->bbr.bbr_bw_lo = (u32)bw; + info->bbr.bbr_bw_hi = (u32)(bw >> 32); + info->bbr.bbr_min_rtt = bbr->min_rtt_us; + info->bbr.bbr_pacing_gain = bbr->pacing_gain; + info->bbr.bbr_cwnd_gain = bbr->cwnd_gain; + *attr = INET_DIAG_BBRINFO; + return sizeof(info->bbr); + } + return 0; +} + +static void bbr_set_state(struct sock *sk, u8 new_state) +{ + struct bbr *bbr = inet_csk_ca(sk); + + if (new_state == TCP_CA_Loss) { + struct rate_sample rs = { .losses = 1 }; + + bbr->prev_ca_state = TCP_CA_Loss; + bbr->full_bw = 0; + bbr->round_start = 1; /* treat RTO like end of a round */ + bbr_lt_bw_sampling(sk, &rs); + } +} + +static struct tcp_congestion_ops tcp_bbr_cong_ops __read_mostly = { + .flags = TCP_CONG_NON_RESTRICTED, + .name = "bbrplus", + .owner = THIS_MODULE, + .init = bbr_init, + .cong_control = bbr_main, + .sndbuf_expand = bbr_sndbuf_expand, + .undo_cwnd = bbr_undo_cwnd, + .cwnd_event = bbr_cwnd_event, + .ssthresh = bbr_ssthresh, + .tso_segs_goal = bbr_tso_segs_goal, + .get_info = bbr_get_info, + .set_state = bbr_set_state, +}; + +static int __init bbr_register(void) +{ + BUILD_BUG_ON(sizeof(struct bbr) > ICSK_CA_PRIV_SIZE); + return tcp_register_congestion_control(&tcp_bbr_cong_ops); +} + +static void __exit bbr_unregister(void) +{ + tcp_unregister_congestion_control(&tcp_bbr_cong_ops); +} + +module_init(bbr_register); +module_exit(bbr_unregister); + +MODULE_AUTHOR("Van Jacobson "); +MODULE_AUTHOR("Neal Cardwell "); +MODULE_AUTHOR("Yuchung Cheng "); +MODULE_AUTHOR("Soheil Hassas Yeganeh "); +MODULE_LICENSE("Dual BSD/GPL"); +MODULE_DESCRIPTION("TCP BBR (Bottleneck Bandwidth and RTT)"); \ No newline at end of file diff --git a/package/ctcgfw/bbr-mod/Makefile b/package/ctcgfw/bbr-mod/Makefile new file mode 100644 index 0000000000..55c8c82344 --- /dev/null +++ b/package/ctcgfw/bbr-mod/Makefile @@ -0,0 +1,47 @@ +include $(TOPDIR)/rules.mk +include $(INCLUDE_DIR)/kernel.mk + +PKG_NAME:=tcp-bbr-mod +PKG_RELEASE:=1 + +include $(INCLUDE_DIR)/package.mk + +define KernelPackage/$(PKG_NAME) + SUBMENU:=Network Support + TITLE:=Modified bbr tcp congestion control + DEPENDS:=@LINUX_4_14 + FILES:=$(PKG_BUILD_DIR)/tcp_bbr_mod.ko + AUTOLOAD:=$(call AutoLoad,99,tcp-bbr-mod) + KCONFIG:= +endef + +define KernelPackage/$(PKG_NAME)/description + Kernel module of modified BBR tcp congestion control +endef + +EXTRA_KCONFIG:= \ + + +EXTRA_CFLAGS:= \ + $(patsubst CONFIG_%, -DCONFIG_%=1, $(patsubst %=m,%,$(filter %=m,$(EXTRA_KCONFIG)))) \ + $(patsubst CONFIG_%, -DCONFIG_%=1, $(patsubst %=y,%,$(filter %=y,$(EXTRA_KCONFIG)))) \ + +MAKE_OPTS:= \ + ARCH="$(LINUX_KARCH)" \ + CROSS_COMPILE="$(TARGET_CROSS)" \ + SUBDIRS="$(PKG_BUILD_DIR)" \ + EXTRA_CFLAGS="$(EXTRA_CFLAGS)" \ + $(EXTRA_KCONFIG) + +define Build/Prepare + mkdir -p $(PKG_BUILD_DIR) + $(CP) ./src/* $(PKG_BUILD_DIR)/ +endef + +define Build/Compile + $(MAKE) -C "$(LINUX_DIR)" \ + $(MAKE_OPTS) \ + modules +endef + +$(eval $(call KernelPackage,$(PKG_NAME))) diff --git a/package/ctcgfw/bbr-mod/src/Makefile b/package/ctcgfw/bbr-mod/src/Makefile new file mode 100644 index 0000000000..ec3e7d1834 --- /dev/null +++ b/package/ctcgfw/bbr-mod/src/Makefile @@ -0,0 +1 @@ +obj-m := tcp_bbr_mod.o diff --git a/package/ctcgfw/bbr-mod/src/tcp_bbr_mod.c b/package/ctcgfw/bbr-mod/src/tcp_bbr_mod.c new file mode 100644 index 0000000000..6aac1e34c3 --- /dev/null +++ b/package/ctcgfw/bbr-mod/src/tcp_bbr_mod.c @@ -0,0 +1,962 @@ +/* Bottleneck Bandwidth and RTT (BBR) congestion control + * + * BBR congestion control computes the sending rate based on the delivery + * rate (throughput) estimated from ACKs. In a nutshell: + * + * On each ACK, update our model of the network path: + * bottleneck_bandwidth = windowed_max(delivered / elapsed, 10 round trips) + * min_rtt = windowed_min(rtt, 10 seconds) + * pacing_rate = pacing_gain * bottleneck_bandwidth + * cwnd = max(cwnd_gain * bottleneck_bandwidth * min_rtt, 4) + * + * The core algorithm does not react directly to packet losses or delays, + * although BBR may adjust the size of next send per ACK when loss is + * observed, or adjust the sending rate if it estimates there is a + * traffic policer, in order to keep the drop rate reasonable. + * + * Here is a state transition diagram for BBR: + * + * | + * V + * +---> STARTUP ----+ + * | | | + * | V | + * | DRAIN ----+ + * | | | + * | V | + * +---> PROBE_BW ----+ + * | ^ | | + * | | | | + * | +----+ | + * | | + * +---- PROBE_RTT <--+ + * + * A BBR flow starts in STARTUP, and ramps up its sending rate quickly. + * When it estimates the pipe is full, it enters DRAIN to drain the queue. + * In steady state a BBR flow only uses PROBE_BW and PROBE_RTT. + * A long-lived BBR flow spends the vast majority of its time remaining + * (repeatedly) in PROBE_BW, fully probing and utilizing the pipe's bandwidth + * in a fair manner, with a small, bounded queue. *If* a flow has been + * continuously sending for the entire min_rtt window, and hasn't seen an RTT + * sample that matches or decreases its min_rtt estimate for 10 seconds, then + * it briefly enters PROBE_RTT to cut inflight to a minimum value to re-probe + * the path's two-way propagation delay (min_rtt). When exiting PROBE_RTT, if + * we estimated that we reached the full bw of the pipe then we enter PROBE_BW; + * otherwise we enter STARTUP to try to fill the pipe. + * + * BBR is described in detail in: + * "BBR: Congestion-Based Congestion Control", + * Neal Cardwell, Yuchung Cheng, C. Stephen Gunn, Soheil Hassas Yeganeh, + * Van Jacobson. ACM Queue, Vol. 14 No. 5, September-October 2016. + * + * There is a public e-mail list for discussing BBR development and testing: + * https://groups.google.com/forum/#!forum/bbr-dev + * + * NOTE: BBR might be used with the fq qdisc ("man tc-fq") with pacing enabled, + * otherwise TCP stack falls back to an internal pacing using one high + * resolution timer per TCP socket and may use more resources. + */ +#include +#include +#include +#include +#include +#include + +/* Scale factor for rate in pkt/uSec unit to avoid truncation in bandwidth + * estimation. The rate unit ~= (1500 bytes / 1 usec / 2^24) ~= 715 bps. + * This handles bandwidths from 0.06pps (715bps) to 256Mpps (3Tbps) in a u32. + * Since the minimum window is >=4 packets, the lower bound isn't + * an issue. The upper bound isn't an issue with existing technologies. + */ +#define BW_SCALE 24 +#define BW_UNIT (1 << BW_SCALE) + +#define BBR_SCALE 8 /* scaling factor for fractions in BBR (e.g. gains) */ +#define BBR_UNIT (1 << BBR_SCALE) + +/* BBR has the following modes for deciding how fast to send: */ +enum bbr_mode { + BBR_STARTUP, /* ramp up sending rate rapidly to fill pipe */ + BBR_DRAIN, /* drain any queue created during startup */ + BBR_PROBE_BW, /* discover, share bw: pace around estimated bw */ + BBR_PROBE_RTT, /* cut inflight to min to probe min_rtt */ +}; + +/* BBR congestion control block */ +struct bbr { + u32 min_rtt_us; /* min RTT in min_rtt_win_sec window */ + u32 min_rtt_stamp; /* timestamp of min_rtt_us */ + u32 probe_rtt_done_stamp; /* end time for BBR_PROBE_RTT mode */ + struct minmax bw; /* Max recent delivery rate in pkts/uS << 24 */ + u32 rtt_cnt; /* count of packet-timed rounds elapsed */ + u32 next_rtt_delivered; /* scb->tx.delivered at end of round */ + u64 cycle_mstamp; /* time of this cycle phase start */ + u32 mode:3, /* current bbr_mode in state machine */ + prev_ca_state:3, /* CA state on previous ACK */ + packet_conservation:1, /* use packet conservation? */ + restore_cwnd:1, /* decided to revert cwnd to old value */ + round_start:1, /* start of packet-timed tx->ack round? */ + tso_segs_goal:7, /* segments we want in each skb we send */ + idle_restart:1, /* restarting after idle? */ + probe_rtt_round_done:1, /* a BBR_PROBE_RTT round at 4 pkts? */ + unused:5, + lt_is_sampling:1, /* taking long-term ("LT") samples now? */ + lt_rtt_cnt:7, /* round trips in long-term interval */ + lt_use_bw:1; /* use lt_bw as our bw estimate? */ + u32 lt_bw; /* LT est delivery rate in pkts/uS << 24 */ + u32 lt_last_delivered; /* LT intvl start: tp->delivered */ + u32 lt_last_stamp; /* LT intvl start: tp->delivered_mstamp */ + u32 lt_last_lost; /* LT intvl start: tp->lost */ + u32 pacing_gain:10, /* current gain for setting pacing rate */ + cwnd_gain:10, /* current gain for setting cwnd */ + full_bw_reached:1, /* reached full bw in Startup? */ + full_bw_cnt:2, /* number of rounds without large bw gains */ + cycle_idx:3, /* current index in pacing_gain cycle array */ + has_seen_rtt:1, /* have we seen an RTT sample yet? */ + unused_b:5; + u32 prior_cwnd; /* prior cwnd upon entering loss recovery */ + u32 full_bw; /* recent bw, to estimate if pipe is full */ +}; + +#define CYCLE_LEN 8 /* number of phases in a pacing gain cycle */ + +/* Window length of bw filter (in rounds): */ +static const int bbr_bw_rtts = CYCLE_LEN + 2; +/* Window length of min_rtt filter (in sec): */ +static const u32 bbr_min_rtt_win_sec = 10; +/* Minimum time (in ms) spent at bbr_cwnd_min_target in BBR_PROBE_RTT mode: */ +static const u32 bbr_probe_rtt_mode_ms = 100; +/* Skip TSO below the following bandwidth (bits/sec): */ +static const int bbr_min_tso_rate = 1200000; + +/* We use a high_gain value of 2/ln(2) because it's the smallest pacing gain + * that will allow a smoothly increasing pacing rate that will double each RTT + * and send the same number of packets per RTT that an un-paced, slow-starting + * Reno or CUBIC flow would: + */ +static const int bbr_high_gain = BBR_UNIT * 3000 / 1000 + 1; +/* The pacing gain of 1/high_gain in BBR_DRAIN is calculated to typically drain + * the queue created in BBR_STARTUP in a single round: + */ +static const int bbr_drain_gain = BBR_UNIT * 1000 / 3000; +/* The gain for deriving steady-state cwnd tolerates delayed/stretched ACKs: */ +static const int bbr_cwnd_gain = BBR_UNIT * 2; +/* The pacing_gain values for the PROBE_BW gain cycle, to discover/share bw: */ +static const int bbr_pacing_gain[] = { + BBR_UNIT * 6 / 4, /* probe for more available bw */ + BBR_UNIT * 3 / 4, /* drain queue and/or yield bw to other flows */ + BBR_UNIT * 5 / 4, BBR_UNIT * 5 / 4, BBR_UNIT * 5 / 4, /* cruise at 1.0*bw to utilize pipe, */ + BBR_UNIT * 6 / 4, BBR_UNIT * 6 / 4, BBR_UNIT * 6 / 4 /* without creating excess queue... */ +}; +/* Randomize the starting gain cycling phase over N phases: */ +static const u32 bbr_cycle_rand = 7; + +/* Try to keep at least this many packets in flight, if things go smoothly. For + * smooth functioning, a sliding window protocol ACKing every other packet + * needs at least 4 packets in flight: + */ +static const u32 bbr_cwnd_min_target = 4; + +/* To estimate if BBR_STARTUP mode (i.e. high_gain) has filled pipe... */ +/* If bw has increased significantly (1.25x), there may be more bw available: */ +static const u32 bbr_full_bw_thresh = BBR_UNIT * 5 / 4; +/* But after 3 rounds w/o significant bw growth, estimate pipe is full: */ +static const u32 bbr_full_bw_cnt = 3; + +/* "long-term" ("LT") bandwidth estimator parameters... */ +/* The minimum number of rounds in an LT bw sampling interval: */ +static const u32 bbr_lt_intvl_min_rtts = 4; +/* If lost/delivered ratio > 20%, interval is "lossy" and we may be policed: */ +static const u32 bbr_lt_loss_thresh = 50; +/* If 2 intervals have a bw ratio <= 1/8, their bw is "consistent": */ +static const u32 bbr_lt_bw_ratio = BBR_UNIT / 4; +/* If 2 intervals have a bw diff <= 4 Kbit/sec their bw is "consistent": */ +static const u32 bbr_lt_bw_diff = 4000 / 4; +/* If we estimate we're policed, use lt_bw for this many round trips: */ +static const u32 bbr_lt_bw_max_rtts = 48; + +/* Do we estimate that STARTUP filled the pipe? */ +static bool bbr_full_bw_reached(const struct sock *sk) +{ + const struct bbr *bbr = inet_csk_ca(sk); + + return bbr->full_bw_reached; +} + +/* Return the windowed max recent bandwidth sample, in pkts/uS << BW_SCALE. */ +static u32 bbr_max_bw(const struct sock *sk) +{ + struct bbr *bbr = inet_csk_ca(sk); + + return minmax_get(&bbr->bw); +} + +/* Return the estimated bandwidth of the path, in pkts/uS << BW_SCALE. */ +static u32 bbr_bw(const struct sock *sk) +{ + struct bbr *bbr = inet_csk_ca(sk); + + return bbr->lt_use_bw ? bbr->lt_bw : bbr_max_bw(sk); +} + +/* Return rate in bytes per second, optionally with a gain. + * The order here is chosen carefully to avoid overflow of u64. This should + * work for input rates of up to 2.9Tbit/sec and gain of 2.89x. + */ +static u64 bbr_rate_bytes_per_sec(struct sock *sk, u64 rate, int gain) +{ + rate *= tcp_mss_to_mtu(sk, tcp_sk(sk)->mss_cache); + rate *= gain; + rate >>= BBR_SCALE; + rate *= USEC_PER_SEC; + return rate >> BW_SCALE; +} + +/* Convert a BBR bw and gain factor to a pacing rate in bytes per second. */ +static u32 bbr_bw_to_pacing_rate(struct sock *sk, u32 bw, int gain) +{ + u64 rate = bw; + + rate = bbr_rate_bytes_per_sec(sk, rate, gain); + rate = min_t(u64, rate, sk->sk_max_pacing_rate); + return rate; +} + +/* Initialize pacing rate to: high_gain * init_cwnd / RTT. */ +static void bbr_init_pacing_rate_from_rtt(struct sock *sk) +{ + struct tcp_sock *tp = tcp_sk(sk); + struct bbr *bbr = inet_csk_ca(sk); + u64 bw; + u32 rtt_us; + + if (tp->srtt_us) { /* any RTT sample yet? */ + rtt_us = max(tp->srtt_us >> 3, 1U); + bbr->has_seen_rtt = 1; + } else { /* no RTT sample yet */ + rtt_us = USEC_PER_MSEC; /* use nominal default RTT */ + } + bw = (u64)tp->snd_cwnd * BW_UNIT; + do_div(bw, rtt_us); + sk->sk_pacing_rate = bbr_bw_to_pacing_rate(sk, bw, bbr_high_gain); +} + +/* Pace using current bw estimate and a gain factor. In order to help drive the + * network toward lower queues while maintaining high utilization and low + * latency, the average pacing rate aims to be slightly (~1%) lower than the + * estimated bandwidth. This is an important aspect of the design. In this + * implementation this slightly lower pacing rate is achieved implicitly by not + * including link-layer headers in the packet size used for the pacing rate. + */ +static void bbr_set_pacing_rate(struct sock *sk, u32 bw, int gain) +{ + struct tcp_sock *tp = tcp_sk(sk); + struct bbr *bbr = inet_csk_ca(sk); + u32 rate = bbr_bw_to_pacing_rate(sk, bw, gain); + + if (unlikely(!bbr->has_seen_rtt && tp->srtt_us)) + bbr_init_pacing_rate_from_rtt(sk); + if (bbr_full_bw_reached(sk) || rate > sk->sk_pacing_rate) + sk->sk_pacing_rate = rate; +} + +/* Return count of segments we want in the skbs we send, or 0 for default. */ +static u32 bbr_tso_segs_goal(struct sock *sk) +{ + struct bbr *bbr = inet_csk_ca(sk); + + return bbr->tso_segs_goal; +} + +static void bbr_set_tso_segs_goal(struct sock *sk) +{ + struct tcp_sock *tp = tcp_sk(sk); + struct bbr *bbr = inet_csk_ca(sk); + u32 min_segs; + + min_segs = sk->sk_pacing_rate < (bbr_min_tso_rate >> 3) ? 1 : 2; + bbr->tso_segs_goal = min(tcp_tso_autosize(sk, tp->mss_cache, min_segs), + 0x7FU); +} + +/* Save "last known good" cwnd so we can restore it after losses or PROBE_RTT */ +static void bbr_save_cwnd(struct sock *sk) +{ + struct tcp_sock *tp = tcp_sk(sk); + struct bbr *bbr = inet_csk_ca(sk); + + if (bbr->prev_ca_state < TCP_CA_Recovery && bbr->mode != BBR_PROBE_RTT) + bbr->prior_cwnd = tp->snd_cwnd; /* this cwnd is good enough */ + else /* loss recovery or BBR_PROBE_RTT have temporarily cut cwnd */ + bbr->prior_cwnd = max(bbr->prior_cwnd, tp->snd_cwnd); +} + +static void bbr_cwnd_event(struct sock *sk, enum tcp_ca_event event) +{ + struct tcp_sock *tp = tcp_sk(sk); + struct bbr *bbr = inet_csk_ca(sk); + + if (event == CA_EVENT_TX_START && tp->app_limited) { + bbr->idle_restart = 1; + /* Avoid pointless buffer overflows: pace at est. bw if we don't + * need more speed (we're restarting from idle and app-limited). + */ + if (bbr->mode == BBR_PROBE_BW) + bbr_set_pacing_rate(sk, bbr_bw(sk), BBR_UNIT); + } +} + +/* Find target cwnd. Right-size the cwnd based on min RTT and the + * estimated bottleneck bandwidth: + * + * cwnd = bw * min_rtt * gain = BDP * gain + * + * The key factor, gain, controls the amount of queue. While a small gain + * builds a smaller queue, it becomes more vulnerable to noise in RTT + * measurements (e.g., delayed ACKs or other ACK compression effects). This + * noise may cause BBR to under-estimate the rate. + * + * To achieve full performance in high-speed paths, we budget enough cwnd to + * fit full-sized skbs in-flight on both end hosts to fully utilize the path: + * - one skb in sending host Qdisc, + * - one skb in sending host TSO/GSO engine + * - one skb being received by receiver host LRO/GRO/delayed-ACK engine + * Don't worry, at low rates (bbr_min_tso_rate) this won't bloat cwnd because + * in such cases tso_segs_goal is 1. The minimum cwnd is 4 packets, + * which allows 2 outstanding 2-packet sequences, to try to keep pipe + * full even with ACK-every-other-packet delayed ACKs. + */ +static u32 bbr_target_cwnd(struct sock *sk, u32 bw, int gain) +{ + struct bbr *bbr = inet_csk_ca(sk); + u32 cwnd; + u64 w; + + /* If we've never had a valid RTT sample, cap cwnd at the initial + * default. This should only happen when the connection is not using TCP + * timestamps and has retransmitted all of the SYN/SYNACK/data packets + * ACKed so far. In this case, an RTO can cut cwnd to 1, in which + * case we need to slow-start up toward something safe: TCP_INIT_CWND. + */ + if (unlikely(bbr->min_rtt_us == ~0U)) /* no valid RTT samples yet? */ + return TCP_INIT_CWND; /* be safe: cap at default initial cwnd*/ + + w = (u64)bw * bbr->min_rtt_us; + + /* Apply a gain to the given value, then remove the BW_SCALE shift. */ + cwnd = (((w * gain) >> BBR_SCALE) + BW_UNIT - 1) / BW_UNIT; + + /* Allow enough full-sized skbs in flight to utilize end systems. */ + cwnd += 3 * bbr->tso_segs_goal; + + /* Reduce delayed ACKs by rounding up cwnd to the next even number. */ + cwnd = (cwnd + 1) & ~1U; + + return cwnd; +} + +/* An optimization in BBR to reduce losses: On the first round of recovery, we + * follow the packet conservation principle: send P packets per P packets acked. + * After that, we slow-start and send at most 2*P packets per P packets acked. + * After recovery finishes, or upon undo, we restore the cwnd we had when + * recovery started (capped by the target cwnd based on estimated BDP). + * + * TODO(ycheng/ncardwell): implement a rate-based approach. + */ +static bool bbr_set_cwnd_to_recover_or_restore( + struct sock *sk, const struct rate_sample *rs, u32 acked, u32 *new_cwnd) +{ + struct tcp_sock *tp = tcp_sk(sk); + struct bbr *bbr = inet_csk_ca(sk); + u8 prev_state = bbr->prev_ca_state, state = inet_csk(sk)->icsk_ca_state; + u32 cwnd = tp->snd_cwnd; + + /* An ACK for P pkts should release at most 2*P packets. We do this + * in two steps. First, here we deduct the number of lost packets. + * Then, in bbr_set_cwnd() we slow start up toward the target cwnd. + */ + if (rs->losses > 0) + cwnd = max_t(s32, cwnd - rs->losses, 1); + + if (state == TCP_CA_Recovery && prev_state != TCP_CA_Recovery) { + /* Starting 1st round of Recovery, so do packet conservation. */ + bbr->packet_conservation = 1; + bbr->next_rtt_delivered = tp->delivered; /* start round now */ + /* Cut unused cwnd from app behavior, TSQ, or TSO deferral: */ + cwnd = tcp_packets_in_flight(tp) + acked; + } else if (prev_state >= TCP_CA_Recovery && state < TCP_CA_Recovery) { + /* Exiting loss recovery; restore cwnd saved before recovery. */ + bbr->restore_cwnd = 1; + bbr->packet_conservation = 0; + } + bbr->prev_ca_state = state; + + if (bbr->restore_cwnd) { + /* Restore cwnd after exiting loss recovery or PROBE_RTT. */ + cwnd = max(cwnd, bbr->prior_cwnd); + bbr->restore_cwnd = 0; + } + + if (bbr->packet_conservation) { + *new_cwnd = max(cwnd, tcp_packets_in_flight(tp) + acked); + return true; /* yes, using packet conservation */ + } + *new_cwnd = cwnd; + return false; +} + +/* Slow-start up toward target cwnd (if bw estimate is growing, or packet loss + * has drawn us down below target), or snap down to target if we're above it. + */ +static void bbr_set_cwnd(struct sock *sk, const struct rate_sample *rs, + u32 acked, u32 bw, int gain) +{ + struct tcp_sock *tp = tcp_sk(sk); + struct bbr *bbr = inet_csk_ca(sk); + u32 cwnd = 0, target_cwnd = 0; + + if (!acked) + return; + + if (bbr_set_cwnd_to_recover_or_restore(sk, rs, acked, &cwnd)) + goto done; + + /* If we're below target cwnd, slow start cwnd toward target cwnd. */ + target_cwnd = bbr_target_cwnd(sk, bw, gain); + if (bbr_full_bw_reached(sk)) /* only cut cwnd if we filled the pipe */ + cwnd = min(cwnd + acked, target_cwnd); + else if (cwnd < target_cwnd || tp->delivered < TCP_INIT_CWND) + cwnd = cwnd + acked; + cwnd = max(cwnd, bbr_cwnd_min_target); + +done: + tp->snd_cwnd = min(cwnd, tp->snd_cwnd_clamp); /* apply global cap */ + if (bbr->mode == BBR_PROBE_RTT) /* drain queue, refresh min_rtt */ + tp->snd_cwnd = min(tp->snd_cwnd, bbr_cwnd_min_target); +} + +/* End cycle phase if it's time and/or we hit the phase's in-flight target. */ +static bool bbr_is_next_cycle_phase(struct sock *sk, + const struct rate_sample *rs) +{ + struct tcp_sock *tp = tcp_sk(sk); + struct bbr *bbr = inet_csk_ca(sk); + bool is_full_length = + tcp_stamp_us_delta(tp->delivered_mstamp, bbr->cycle_mstamp) > + bbr->min_rtt_us; + u32 inflight, bw; + + /* The pacing_gain of 1.0 paces at the estimated bw to try to fully + * use the pipe without increasing the queue. + */ + if (bbr->pacing_gain == BBR_UNIT) + return is_full_length; /* just use wall clock time */ + + inflight = rs->prior_in_flight; /* what was in-flight before ACK? */ + bw = bbr_max_bw(sk); + + /* A pacing_gain > 1.0 probes for bw by trying to raise inflight to at + * least pacing_gain*BDP; this may take more than min_rtt if min_rtt is + * small (e.g. on a LAN). We do not persist if packets are lost, since + * a path with small buffers may not hold that much. + */ + if (bbr->pacing_gain > BBR_UNIT) + return is_full_length && + (rs->losses || /* perhaps pacing_gain*BDP won't fit */ + inflight >= bbr_target_cwnd(sk, bw, bbr->pacing_gain)); + + /* A pacing_gain < 1.0 tries to drain extra queue we added if bw + * probing didn't find more bw. If inflight falls to match BDP then we + * estimate queue is drained; persisting would underutilize the pipe. + */ + return is_full_length || + inflight <= bbr_target_cwnd(sk, bw, BBR_UNIT); +} + +static void bbr_advance_cycle_phase(struct sock *sk) +{ + struct tcp_sock *tp = tcp_sk(sk); + struct bbr *bbr = inet_csk_ca(sk); + + bbr->cycle_idx = (bbr->cycle_idx + 1) & (CYCLE_LEN - 1); + bbr->cycle_mstamp = tp->delivered_mstamp; + bbr->pacing_gain = bbr->lt_use_bw ? BBR_UNIT : + bbr_pacing_gain[bbr->cycle_idx]; +} + +/* Gain cycling: cycle pacing gain to converge to fair share of available bw. */ +static void bbr_update_cycle_phase(struct sock *sk, + const struct rate_sample *rs) +{ + struct bbr *bbr = inet_csk_ca(sk); + + if (bbr->mode == BBR_PROBE_BW && bbr_is_next_cycle_phase(sk, rs)) + bbr_advance_cycle_phase(sk); +} + +static void bbr_reset_startup_mode(struct sock *sk) +{ + struct bbr *bbr = inet_csk_ca(sk); + + bbr->mode = BBR_STARTUP; + bbr->pacing_gain = bbr_high_gain; + bbr->cwnd_gain = bbr_high_gain; +} + +static void bbr_reset_probe_bw_mode(struct sock *sk) +{ + struct bbr *bbr = inet_csk_ca(sk); + + bbr->mode = BBR_PROBE_BW; + bbr->pacing_gain = BBR_UNIT; + bbr->cwnd_gain = bbr_cwnd_gain; + bbr->cycle_idx = CYCLE_LEN - 1 - prandom_u32_max(bbr_cycle_rand); + bbr_advance_cycle_phase(sk); /* flip to next phase of gain cycle */ +} + +static void bbr_reset_mode(struct sock *sk) +{ + if (!bbr_full_bw_reached(sk)) + bbr_reset_startup_mode(sk); + else + bbr_reset_probe_bw_mode(sk); +} + +/* Start a new long-term sampling interval. */ +static void bbr_reset_lt_bw_sampling_interval(struct sock *sk) +{ + struct tcp_sock *tp = tcp_sk(sk); + struct bbr *bbr = inet_csk_ca(sk); + + bbr->lt_last_stamp = div_u64(tp->delivered_mstamp, USEC_PER_MSEC); + bbr->lt_last_delivered = tp->delivered; + bbr->lt_last_lost = tp->lost; + bbr->lt_rtt_cnt = 0; +} + +/* Completely reset long-term bandwidth sampling. */ +static void bbr_reset_lt_bw_sampling(struct sock *sk) +{ + struct bbr *bbr = inet_csk_ca(sk); + + bbr->lt_bw = 0; + bbr->lt_use_bw = 0; + bbr->lt_is_sampling = false; + bbr_reset_lt_bw_sampling_interval(sk); +} + +/* Long-term bw sampling interval is done. Estimate whether we're policed. */ +static void bbr_lt_bw_interval_done(struct sock *sk, u32 bw) +{ + struct bbr *bbr = inet_csk_ca(sk); + u32 diff; + + if (bbr->lt_bw) { /* do we have bw from a previous interval? */ + /* Is new bw close to the lt_bw from the previous interval? */ + diff = abs(bw - bbr->lt_bw); + if ((diff * BBR_UNIT <= bbr_lt_bw_ratio * bbr->lt_bw) || + (bbr_rate_bytes_per_sec(sk, diff, BBR_UNIT) <= + bbr_lt_bw_diff)) { + /* All criteria are met; estimate we're policed. */ + bbr->lt_bw = (bw + bbr->lt_bw) >> 1; /* avg 2 intvls */ + bbr->lt_use_bw = 1; + bbr->pacing_gain = BBR_UNIT; /* try to avoid drops */ + bbr->lt_rtt_cnt = 0; + return; + } + } + bbr->lt_bw = bw; + bbr_reset_lt_bw_sampling_interval(sk); +} + +/* Token-bucket traffic policers are common (see "An Internet-Wide Analysis of + * Traffic Policing", SIGCOMM 2016). BBR detects token-bucket policers and + * explicitly models their policed rate, to reduce unnecessary losses. We + * estimate that we're policed if we see 2 consecutive sampling intervals with + * consistent throughput and high packet loss. If we think we're being policed, + * set lt_bw to the "long-term" average delivery rate from those 2 intervals. + */ +static void bbr_lt_bw_sampling(struct sock *sk, const struct rate_sample *rs) +{ + struct tcp_sock *tp = tcp_sk(sk); + struct bbr *bbr = inet_csk_ca(sk); + u32 lost, delivered; + u64 bw; + u32 t; + + if (bbr->lt_use_bw) { /* already using long-term rate, lt_bw? */ + if (bbr->mode == BBR_PROBE_BW && bbr->round_start && + ++bbr->lt_rtt_cnt >= bbr_lt_bw_max_rtts) { + bbr_reset_lt_bw_sampling(sk); /* stop using lt_bw */ + bbr_reset_probe_bw_mode(sk); /* restart gain cycling */ + } + return; + } + + /* Wait for the first loss before sampling, to let the policer exhaust + * its tokens and estimate the steady-state rate allowed by the policer. + * Starting samples earlier includes bursts that over-estimate the bw. + */ + if (!bbr->lt_is_sampling) { + if (!rs->losses) + return; + bbr_reset_lt_bw_sampling_interval(sk); + bbr->lt_is_sampling = true; + } + + /* To avoid underestimates, reset sampling if we run out of data. */ + if (rs->is_app_limited) { + bbr_reset_lt_bw_sampling(sk); + return; + } + + if (bbr->round_start) + bbr->lt_rtt_cnt++; /* count round trips in this interval */ + if (bbr->lt_rtt_cnt < bbr_lt_intvl_min_rtts) + return; /* sampling interval needs to be longer */ + if (bbr->lt_rtt_cnt > 4 * bbr_lt_intvl_min_rtts) { + bbr_reset_lt_bw_sampling(sk); /* interval is too long */ + return; + } + + /* End sampling interval when a packet is lost, so we estimate the + * policer tokens were exhausted. Stopping the sampling before the + * tokens are exhausted under-estimates the policed rate. + */ + if (!rs->losses) + return; + + /* Calculate packets lost and delivered in sampling interval. */ + lost = tp->lost - bbr->lt_last_lost; + delivered = tp->delivered - bbr->lt_last_delivered; + /* Is loss rate (lost/delivered) >= lt_loss_thresh? If not, wait. */ + if (!delivered || (lost << BBR_SCALE) < bbr_lt_loss_thresh * delivered) + return; + + /* Find average delivery rate in this sampling interval. */ + t = div_u64(tp->delivered_mstamp, USEC_PER_MSEC) - bbr->lt_last_stamp; + if ((s32)t < 1) + return; /* interval is less than one ms, so wait */ + /* Check if can multiply without overflow */ + if (t >= ~0U / USEC_PER_MSEC) { + bbr_reset_lt_bw_sampling(sk); /* interval too long; reset */ + return; + } + t *= USEC_PER_MSEC; + bw = (u64)delivered * BW_UNIT; + do_div(bw, t); + bbr_lt_bw_interval_done(sk, bw); +} + +/* Estimate the bandwidth based on how fast packets are delivered */ +static void bbr_update_bw(struct sock *sk, const struct rate_sample *rs) +{ + struct tcp_sock *tp = tcp_sk(sk); + struct bbr *bbr = inet_csk_ca(sk); + u64 bw; + + bbr->round_start = 0; + if (rs->delivered < 0 || rs->interval_us <= 0) + return; /* Not a valid observation */ + + /* See if we've reached the next RTT */ + if (!before(rs->prior_delivered, bbr->next_rtt_delivered)) { + bbr->next_rtt_delivered = tp->delivered; + bbr->rtt_cnt++; + bbr->round_start = 1; + bbr->packet_conservation = 0; + } + + bbr_lt_bw_sampling(sk, rs); + + /* Divide delivered by the interval to find a (lower bound) bottleneck + * bandwidth sample. Delivered is in packets and interval_us in uS and + * ratio will be <<1 for most connections. So delivered is first scaled. + */ + bw = (u64)rs->delivered * BW_UNIT; + do_div(bw, rs->interval_us); + + /* If this sample is application-limited, it is likely to have a very + * low delivered count that represents application behavior rather than + * the available network rate. Such a sample could drag down estimated + * bw, causing needless slow-down. Thus, to continue to send at the + * last measured network rate, we filter out app-limited samples unless + * they describe the path bw at least as well as our bw model. + * + * So the goal during app-limited phase is to proceed with the best + * network rate no matter how long. We automatically leave this + * phase when app writes faster than the network can deliver :) + */ + if (!rs->is_app_limited || bw >= bbr_max_bw(sk)) { + /* Incorporate new sample into our max bw filter. */ + minmax_running_max(&bbr->bw, bbr_bw_rtts, bbr->rtt_cnt, bw); + } +} + +/* Estimate when the pipe is full, using the change in delivery rate: BBR + * estimates that STARTUP filled the pipe if the estimated bw hasn't changed by + * at least bbr_full_bw_thresh (25%) after bbr_full_bw_cnt (3) non-app-limited + * rounds. Why 3 rounds: 1: rwin autotuning grows the rwin, 2: we fill the + * higher rwin, 3: we get higher delivery rate samples. Or transient + * cross-traffic or radio noise can go away. CUBIC Hystart shares a similar + * design goal, but uses delay and inter-ACK spacing instead of bandwidth. + */ +static void bbr_check_full_bw_reached(struct sock *sk, + const struct rate_sample *rs) +{ + struct bbr *bbr = inet_csk_ca(sk); + u32 bw_thresh; + + if (bbr_full_bw_reached(sk) || !bbr->round_start || rs->is_app_limited) + return; + + bw_thresh = (u64)bbr->full_bw * bbr_full_bw_thresh >> BBR_SCALE; + if (bbr_max_bw(sk) >= bw_thresh) { + bbr->full_bw = bbr_max_bw(sk); + bbr->full_bw_cnt = 0; + return; + } + ++bbr->full_bw_cnt; + bbr->full_bw_reached = bbr->full_bw_cnt >= bbr_full_bw_cnt; +} + +/* If pipe is probably full, drain the queue and then enter steady-state. */ +static void bbr_check_drain(struct sock *sk, const struct rate_sample *rs) +{ + struct bbr *bbr = inet_csk_ca(sk); + + if (bbr->mode == BBR_STARTUP && bbr_full_bw_reached(sk)) { + bbr->mode = BBR_DRAIN; /* drain queue we created */ + bbr->pacing_gain = bbr_drain_gain; /* pace slow to drain */ + bbr->cwnd_gain = bbr_high_gain; /* maintain cwnd */ + } /* fall through to check if in-flight is already small: */ + if (bbr->mode == BBR_DRAIN && + tcp_packets_in_flight(tcp_sk(sk)) <= + bbr_target_cwnd(sk, bbr_max_bw(sk), BBR_UNIT)) + bbr_reset_probe_bw_mode(sk); /* we estimate queue is drained */ +} + +/* The goal of PROBE_RTT mode is to have BBR flows cooperatively and + * periodically drain the bottleneck queue, to converge to measure the true + * min_rtt (unloaded propagation delay). This allows the flows to keep queues + * small (reducing queuing delay and packet loss) and achieve fairness among + * BBR flows. + * + * The min_rtt filter window is 10 seconds. When the min_rtt estimate expires, + * we enter PROBE_RTT mode and cap the cwnd at bbr_cwnd_min_target=4 packets. + * After at least bbr_probe_rtt_mode_ms=200ms and at least one packet-timed + * round trip elapsed with that flight size <= 4, we leave PROBE_RTT mode and + * re-enter the previous mode. BBR uses 200ms to approximately bound the + * performance penalty of PROBE_RTT's cwnd capping to roughly 2% (200ms/10s). + * + * Note that flows need only pay 2% if they are busy sending over the last 10 + * seconds. Interactive applications (e.g., Web, RPCs, video chunks) often have + * natural silences or low-rate periods within 10 seconds where the rate is low + * enough for long enough to drain its queue in the bottleneck. We pick up + * these min RTT measurements opportunistically with our min_rtt filter. :-) + */ +static void bbr_update_min_rtt(struct sock *sk, const struct rate_sample *rs) +{ + struct tcp_sock *tp = tcp_sk(sk); + struct bbr *bbr = inet_csk_ca(sk); + bool filter_expired; + + /* Track min RTT seen in the min_rtt_win_sec filter window: */ + filter_expired = after(tcp_jiffies32, + bbr->min_rtt_stamp + bbr_min_rtt_win_sec * HZ); + if (rs->rtt_us >= 0 && + (rs->rtt_us <= bbr->min_rtt_us || filter_expired)) { + bbr->min_rtt_us = rs->rtt_us; + bbr->min_rtt_stamp = tcp_jiffies32; + } + + if (bbr_probe_rtt_mode_ms > 0 && filter_expired && + !bbr->idle_restart && bbr->mode != BBR_PROBE_RTT) { + bbr->mode = BBR_PROBE_RTT; /* dip, drain queue */ + bbr->pacing_gain = BBR_UNIT; + bbr->cwnd_gain = BBR_UNIT; + bbr_save_cwnd(sk); /* note cwnd so we can restore it */ + bbr->probe_rtt_done_stamp = 0; + } + + if (bbr->mode == BBR_PROBE_RTT) { + /* Ignore low rate samples during this mode. */ + tp->app_limited = + (tp->delivered + tcp_packets_in_flight(tp)) ? : 1; + /* Maintain min packets in flight for max(200 ms, 1 round). */ + if (!bbr->probe_rtt_done_stamp && + tcp_packets_in_flight(tp) <= bbr_cwnd_min_target) { + bbr->probe_rtt_done_stamp = tcp_jiffies32 + + msecs_to_jiffies(bbr_probe_rtt_mode_ms); + bbr->probe_rtt_round_done = 0; + bbr->next_rtt_delivered = tp->delivered; + } else if (bbr->probe_rtt_done_stamp) { + if (bbr->round_start) + bbr->probe_rtt_round_done = 1; + if (bbr->probe_rtt_round_done && + after(tcp_jiffies32, bbr->probe_rtt_done_stamp)) { + bbr->min_rtt_stamp = tcp_jiffies32; + bbr->restore_cwnd = 1; /* snap to prior_cwnd */ + bbr_reset_mode(sk); + } + } + } + bbr->idle_restart = 0; +} + +static void bbr_update_model(struct sock *sk, const struct rate_sample *rs) +{ + bbr_update_bw(sk, rs); + bbr_update_cycle_phase(sk, rs); + bbr_check_full_bw_reached(sk, rs); + bbr_check_drain(sk, rs); + bbr_update_min_rtt(sk, rs); +} + +static void bbr_main(struct sock *sk, const struct rate_sample *rs) +{ + struct bbr *bbr = inet_csk_ca(sk); + u32 bw; + + bbr_update_model(sk, rs); + + bw = bbr_bw(sk); + bbr_set_pacing_rate(sk, bw, bbr->pacing_gain); + bbr_set_tso_segs_goal(sk); + bbr_set_cwnd(sk, rs, rs->acked_sacked, bw, bbr->cwnd_gain); +} + +static void bbr_init(struct sock *sk) +{ + struct tcp_sock *tp = tcp_sk(sk); + struct bbr *bbr = inet_csk_ca(sk); + + bbr->prior_cwnd = 0; + bbr->tso_segs_goal = 0; /* default segs per skb until first ACK */ + bbr->rtt_cnt = 0; + bbr->next_rtt_delivered = 0; + bbr->prev_ca_state = TCP_CA_Open; + bbr->packet_conservation = 0; + + bbr->probe_rtt_done_stamp = 0; + bbr->probe_rtt_round_done = 0; + bbr->min_rtt_us = tcp_min_rtt(tp); + bbr->min_rtt_stamp = tcp_jiffies32; + + minmax_reset(&bbr->bw, bbr->rtt_cnt, 0); /* init max bw to 0 */ + + bbr->has_seen_rtt = 0; + bbr_init_pacing_rate_from_rtt(sk); + + bbr->restore_cwnd = 0; + bbr->round_start = 0; + bbr->idle_restart = 0; + bbr->full_bw_reached = 0; + bbr->full_bw = 0; + bbr->full_bw_cnt = 0; + bbr->cycle_mstamp = 0; + bbr->cycle_idx = 0; + bbr_reset_lt_bw_sampling(sk); + bbr_reset_startup_mode(sk); + + cmpxchg(&sk->sk_pacing_status, SK_PACING_NONE, SK_PACING_NEEDED); +} + +static u32 bbr_sndbuf_expand(struct sock *sk) +{ + /* Provision 3 * cwnd since BBR may slow-start even during recovery. */ + return 3; +} + +/* In theory BBR does not need to undo the cwnd since it does not + * always reduce cwnd on losses (see bbr_main()). Keep it for now. + */ +static u32 bbr_undo_cwnd(struct sock *sk) +{ + struct bbr *bbr = inet_csk_ca(sk); + + bbr->full_bw = 0; /* spurious slow-down; reset full pipe detection */ + bbr->full_bw_cnt = 0; + bbr_reset_lt_bw_sampling(sk); + return tcp_sk(sk)->snd_cwnd; +} + +/* Entering loss recovery, so save cwnd for when we exit or undo recovery. */ +static u32 bbr_ssthresh(struct sock *sk) +{ + bbr_save_cwnd(sk); + return TCP_INFINITE_SSTHRESH; /* BBR does not use ssthresh */ +} + +static size_t bbr_get_info(struct sock *sk, u32 ext, int *attr, + union tcp_cc_info *info) +{ + if (ext & (1 << (INET_DIAG_BBRINFO - 1)) || + ext & (1 << (INET_DIAG_VEGASINFO - 1))) { + struct tcp_sock *tp = tcp_sk(sk); + struct bbr *bbr = inet_csk_ca(sk); + u64 bw = bbr_bw(sk); + + bw = bw * tp->mss_cache * USEC_PER_SEC >> BW_SCALE; + memset(&info->bbr, 0, sizeof(info->bbr)); + info->bbr.bbr_bw_lo = (u32)bw; + info->bbr.bbr_bw_hi = (u32)(bw >> 32); + info->bbr.bbr_min_rtt = bbr->min_rtt_us; + info->bbr.bbr_pacing_gain = bbr->pacing_gain; + info->bbr.bbr_cwnd_gain = bbr->cwnd_gain; + *attr = INET_DIAG_BBRINFO; + return sizeof(info->bbr); + } + return 0; +} + +static void bbr_set_state(struct sock *sk, u8 new_state) +{ + struct bbr *bbr = inet_csk_ca(sk); + + if (new_state == TCP_CA_Loss) { + struct rate_sample rs = { .losses = 1 }; + + bbr->prev_ca_state = TCP_CA_Loss; + bbr->full_bw = 0; + bbr->round_start = 1; /* treat RTO like end of a round */ + bbr_lt_bw_sampling(sk, &rs); + } +} + +static struct tcp_congestion_ops tcp_bbr_cong_ops __read_mostly = { + .flags = TCP_CONG_NON_RESTRICTED, + .name = "tcp_bbr_mod", + .owner = THIS_MODULE, + .init = bbr_init, + .cong_control = bbr_main, + .sndbuf_expand = bbr_sndbuf_expand, + .undo_cwnd = bbr_undo_cwnd, + .cwnd_event = bbr_cwnd_event, + .ssthresh = bbr_ssthresh, + .tso_segs_goal = bbr_tso_segs_goal, + .get_info = bbr_get_info, + .set_state = bbr_set_state, +}; + +static int __init bbr_register(void) +{ + BUILD_BUG_ON(sizeof(struct bbr) > ICSK_CA_PRIV_SIZE); + return tcp_register_congestion_control(&tcp_bbr_cong_ops); +} + +static void __exit bbr_unregister(void) +{ + tcp_unregister_congestion_control(&tcp_bbr_cong_ops); +} + +module_init(bbr_register); +module_exit(bbr_unregister); + +MODULE_AUTHOR("Van Jacobson "); +MODULE_AUTHOR("Neal Cardwell "); +MODULE_AUTHOR("Yuchung Cheng "); +MODULE_AUTHOR("Soheil Hassas Yeganeh "); +MODULE_LICENSE("Dual BSD/GPL"); +MODULE_DESCRIPTION("TCP BBR (Bottleneck Bandwidth and RTT)"); \ No newline at end of file diff --git a/package/ctcgfw/bbr-nanqinlang/Makefile b/package/ctcgfw/bbr-nanqinlang/Makefile new file mode 100644 index 0000000000..7f53cc11aa --- /dev/null +++ b/package/ctcgfw/bbr-nanqinlang/Makefile @@ -0,0 +1,47 @@ +include $(TOPDIR)/rules.mk +include $(INCLUDE_DIR)/kernel.mk + +PKG_NAME:=tcp-bbr-nanqinlang +PKG_RELEASE:=1 + +include $(INCLUDE_DIR)/package.mk + +define KernelPackage/$(PKG_NAME) + SUBMENU:=Network Support + TITLE:=Modified bbr tcp congestion control + DEPENDS:=@LINUX_4_14 + FILES:=$(PKG_BUILD_DIR)/tcp_bbr_nanqinlang.ko + AUTOLOAD:=$(call AutoLoad,99,tcp-bbr-nanqinlang) + KCONFIG:= +endef + +define KernelPackage/$(PKG_NAME)/description + Kernel module of modified BBR tcp congestion control +endef + +EXTRA_KCONFIG:= \ + + +EXTRA_CFLAGS:= \ + $(patsubst CONFIG_%, -DCONFIG_%=1, $(patsubst %=m,%,$(filter %=m,$(EXTRA_KCONFIG)))) \ + $(patsubst CONFIG_%, -DCONFIG_%=1, $(patsubst %=y,%,$(filter %=y,$(EXTRA_KCONFIG)))) \ + +MAKE_OPTS:= \ + ARCH="$(LINUX_KARCH)" \ + CROSS_COMPILE="$(TARGET_CROSS)" \ + SUBDIRS="$(PKG_BUILD_DIR)" \ + EXTRA_CFLAGS="$(EXTRA_CFLAGS)" \ + $(EXTRA_KCONFIG) + +define Build/Prepare + mkdir -p $(PKG_BUILD_DIR) + $(CP) ./src/* $(PKG_BUILD_DIR)/ +endef + +define Build/Compile + $(MAKE) -C "$(LINUX_DIR)" \ + $(MAKE_OPTS) \ + modules +endef + +$(eval $(call KernelPackage,$(PKG_NAME))) diff --git a/package/ctcgfw/bbr-nanqinlang/src/Makefile b/package/ctcgfw/bbr-nanqinlang/src/Makefile new file mode 100644 index 0000000000..af66109374 --- /dev/null +++ b/package/ctcgfw/bbr-nanqinlang/src/Makefile @@ -0,0 +1 @@ +obj-m := tcp_bbr_nanqinlang.o diff --git a/package/ctcgfw/bbr-nanqinlang/src/tcp_bbr_nanqinlang.c b/package/ctcgfw/bbr-nanqinlang/src/tcp_bbr_nanqinlang.c new file mode 100644 index 0000000000..00fe217039 --- /dev/null +++ b/package/ctcgfw/bbr-nanqinlang/src/tcp_bbr_nanqinlang.c @@ -0,0 +1,968 @@ +/* tcp_nanqinlang + + * Debian + + * kernel v4.14 + + × New BBR Congestion Control + + * Modified by (C) 2017 nanqinlang + + ******************************************************************************* + Bottleneck Bandwidth and RTT (BBR) congestion control + * + * BBR congestion control computes the sending rate based on the delivery + * rate (throughput) estimated from ACKs. In a nutshell: + * + * On each ACK, update our model of the network path: + * bottleneck_bandwidth = windowed_max(delivered / elapsed, 10 round trips) + * min_rtt = windowed_min(rtt, 10 seconds) + * pacing_rate = pacing_gain * bottleneck_bandwidth + * cwnd = max(cwnd_gain * bottleneck_bandwidth * min_rtt, 4) + * + * The core algorithm does not react directly to packet losses or delays, + * although BBR may adjust the size of next send per ACK when loss is + * observed, or adjust the sending rate if it estimates there is a + * traffic policer, in order to keep the drop rate reasonable. + * + * Here is a state transition diagram for BBR: + * + * | + * V + * +---> STARTUP ----+ + * | | | + * | V | + * | DRAIN ----+ + * | | | + * | V | + * +---> PROBE_BW ----+ + * | ^ | | + * | | | | + * | +----+ | + * | | + * +---- PROBE_RTT <--+ + * + * A BBR flow starts in STARTUP, and ramps up its sending rate quickly. + * When it estimates the pipe is full, it enters DRAIN to drain the queue. + * In steady state a BBR flow only uses PROBE_BW and PROBE_RTT. + * A long-lived BBR flow spends the vast majority of its time remaining + * (repeatedly) in PROBE_BW, fully probing and utilizing the pipe's bandwidth + * in a fair manner, with a small, bounded queue. *If* a flow has been + * continuously sending for the entire min_rtt window, and hasn't seen an RTT + * sample that matches or decreases its min_rtt estimate for 10 seconds, then + * it briefly enters PROBE_RTT to cut inflight to a minimum value to re-probe + * the path's two-way propagation delay (min_rtt). When exiting PROBE_RTT, if + * we estimated that we reached the full bw of the pipe then we enter PROBE_BW; + * otherwise we enter STARTUP to try to fill the pipe. + * + * BBR is described in detail in: + * "BBR: Congestion-Based Congestion Control", + * Neal Cardwell, Yuchung Cheng, C. Stephen Gunn, Soheil Hassas Yeganeh, + * Van Jacobson. ACM Queue, Vol. 14 No. 5, September-October 2016. + * + * There is a public e-mail list for discussing BBR development and testing: + * https://groups.google.com/forum/#!forum/bbr-dev + * + * NOTE: BBR might be used with the fq qdisc ("man tc-fq") with pacing enabled, + * otherwise TCP stack falls back to an internal pacing using one high + * resolution timer per TCP socket and may use more resources. + */ +#include +#include +#include +#include +#include +#include + +/* Scale factor for rate in pkt/uSec unit to avoid truncation in bandwidth + * estimation. The rate unit ~= (1500 bytes / 1 usec / 2^24) ~= 715 bps. + * This handles bandwidths from 0.06pps (715bps) to 256Mpps (3Tbps) in a u32. + * Since the minimum window is >=4 packets, the lower bound isn't + * an issue. The upper bound isn't an issue with existing technologies. + */ +#define BW_SCALE 24 +#define BW_UNIT (1 << BW_SCALE) + +#define BBR_SCALE 8 /* scaling factor for fractions in BBR (e.g. gains) */ +#define BBR_UNIT (1 << BBR_SCALE) + +#define CYCLE_LEN 8 /* number of phases in a pacing gain cycle */ + + +/* BBR has the following modes for deciding how fast to send: */ +enum bbr_mode { + BBR_STARTUP, /* ramp up sending rate rapidly to fill pipe */ + BBR_DRAIN, /* drain any queue created during startup */ + BBR_PROBE_BW, /* discover, share bw: pace around estimated bw */ + BBR_PROBE_RTT, /* cut inflight to min to probe min_rtt */ +}; + +/* BBR congestion control block */ +struct bbr { + u32 min_rtt_us; /* min RTT in min_rtt_win_sec window */ + u32 min_rtt_stamp; /* timestamp of min_rtt_us */ + u32 probe_rtt_done_stamp; /* end time for BBR_PROBE_RTT mode */ + struct minmax bw; /* Max recent delivery rate in pkts/uS << 24 */ + u32 rtt_cnt; /* count of packet-timed rounds elapsed */ + u32 next_rtt_delivered; /* scb->tx.delivered at end of round */ + u64 cycle_mstamp; /* time of this cycle phase start */ + u32 mode:3, /* current bbr_mode in state machine */ + prev_ca_state:3, /* CA state on previous ACK */ + packet_conservation:1, /* use packet conservation? */ + restore_cwnd:1, /* decided to revert cwnd to old value */ + round_start:1, /* start of packet-timed tx->ack round? */ + tso_segs_goal:7, /* segments we want in each skb we send */ + idle_restart:1, /* restarting after idle? */ + probe_rtt_round_done:1, /* a BBR_PROBE_RTT round at 4 pkts? */ + unused:5, + lt_is_sampling:1, /* taking long-term ("LT") samples now? */ + lt_rtt_cnt:7, /* round trips in long-term interval */ + lt_use_bw:1; /* use lt_bw as our bw estimate? */ + u32 lt_bw; /* LT est delivery rate in pkts/uS << 24 */ + u32 lt_last_delivered; /* LT intvl start: tp->delivered */ + u32 lt_last_stamp; /* LT intvl start: tp->delivered_mstamp */ + u32 lt_last_lost; /* LT intvl start: tp->lost */ + u32 pacing_gain:10, /* current gain for setting pacing rate */ + cwnd_gain:10, /* current gain for setting cwnd */ + full_bw_cnt:3, /* number of rounds without large bw gains */ + cycle_idx:3, /* current index in pacing_gain cycle array */ + has_seen_rtt:1, /* have we seen an RTT sample yet? */ + unused_b:5; + u32 prior_cwnd; /* prior cwnd upon entering loss recovery */ + u32 full_bw; /* recent bw, to estimate if pipe is full */ +}; + + +/* Window length of bw filter (in rounds): */ +static const int bbr_bw_rtts = CYCLE_LEN + 2; +/* Window length of min_rtt filter (in sec): */ +static const u32 bbr_min_rtt_win_sec = 10; +/* Minimum time (in ms) spent at bbr_cwnd_min_target in BBR_PROBE_RTT mode: */ +static const u32 bbr_probe_rtt_mode_ms = 100; +/* Skip TSO below the following bandwidth (bits/sec): */ +static const int bbr_min_tso_rate = 1200000; + +/* We use a high_gain value of 2/ln(2) because it's the smallest pacing gain + * that will allow a smoothly increasing pacing rate that will double each RTT + * and send the same number of packets per RTT that an un-paced, slow-starting + * Reno or CUBIC flow would: + */ +static const int bbr_high_gain = BBR_UNIT * 3000 / 1000 + 1; +/* The pacing gain of 1/high_gain in BBR_DRAIN is calculated to typically drain + * the queue created in BBR_STARTUP in a single round: + */ +static const int bbr_drain_gain = BBR_UNIT * 1000 / 3000; +/* The gain for deriving steady-state cwnd tolerates delayed/stretched ACKs: */ +static const int bbr_cwnd_gain = BBR_UNIT * 2; +/* The pacing_gain values for the PROBE_BW gain cycle, to discover/share bw: */ +static const int bbr_pacing_gain[] = { + BBR_UNIT * 6 / 4, /* probe for more available bw */ + BBR_UNIT * 3 / 4, /* drain queue and/or yield bw to other flows */ + BBR_UNIT * 5 / 4, BBR_UNIT * 5 / 4, BBR_UNIT * 5 / 4, /* cruise at 1.0*bw to utilize pipe, */ + BBR_UNIT * 6 / 4, BBR_UNIT * 6 / 4, BBR_UNIT * 6 / 4 /* without creating excess queue... */ +}; +/* Randomize the starting gain cycling phase over N phases: */ +static const u32 bbr_cycle_rand = 7; + +/* Try to keep at least this many packets in flight, if things go smoothly. For + * smooth functioning, a sliding window protocol ACKing every other packet + * needs at least 4 packets in flight: + */ +static const u32 bbr_cwnd_min_target = 4; + +/* To estimate if BBR_STARTUP mode (i.e. high_gain) has filled pipe... */ +/* If bw has increased significantly (1.25x), there may be more bw available: */ +static const u32 bbr_full_bw_thresh = BBR_UNIT * 5 / 4; +/* But after 3 rounds w/o significant bw growth, estimate pipe is full: */ +static const u32 bbr_full_bw_cnt = 3; + +/* "long-term" ("LT") bandwidth estimator parameters... */ +/* The minimum number of rounds in an LT bw sampling interval: */ +static const u32 bbr_lt_intvl_min_rtts = 4; +/* If lost/delivered ratio > 20%, interval is "lossy" and we may be policed: */ +static const u32 bbr_lt_loss_thresh = 50; +/* If 2 intervals have a bw ratio <= 1/8, their bw is "consistent": */ +static const u32 bbr_lt_bw_ratio = BBR_UNIT / 4; +/* If 2 intervals have a bw diff <= 4 Kbit/sec their bw is "consistent": */ +static const u32 bbr_lt_bw_diff = 4000 / 4; +/* If we estimate we're policed, use lt_bw for this many round trips: */ +static const u32 bbr_lt_bw_max_rtts = 48; + +/* Do we estimate that STARTUP filled the pipe? */ +static bool bbr_full_bw_reached(const struct sock *sk) +{ + const struct bbr *bbr = inet_csk_ca(sk); + + return bbr->full_bw_cnt >= bbr_full_bw_cnt; +} + +/* Return the windowed max recent bandwidth sample, in pkts/uS << BW_SCALE. */ +static u32 bbr_max_bw(const struct sock *sk) +{ + struct bbr *bbr = inet_csk_ca(sk); + + return minmax_get(&bbr->bw); +} + +/* Return the estimated bandwidth of the path, in pkts/uS << BW_SCALE. */ +static u32 bbr_bw(const struct sock *sk) +{ + struct bbr *bbr = inet_csk_ca(sk); + + return bbr->lt_use_bw ? bbr->lt_bw : bbr_max_bw(sk); +} + +/* Return rate in bytes per second, optionally with a gain. + * The order here is chosen carefully to avoid overflow of u64. This should + * work for input rates of up to 2.9Tbit/sec and gain of 2.89x. + */ +static u64 bbr_rate_bytes_per_sec(struct sock *sk, u64 rate, int gain) +{ + rate *= tcp_mss_to_mtu(sk, tcp_sk(sk)->mss_cache); + rate *= gain; + rate >>= BBR_SCALE; + rate *= USEC_PER_SEC; + return rate >> BW_SCALE; +} + +/* Convert a BBR bw and gain factor to a pacing rate in bytes per second. */ +static u32 bbr_bw_to_pacing_rate(struct sock *sk, u32 bw, int gain) +{ + u64 rate = bw; + + rate = bbr_rate_bytes_per_sec(sk, rate, gain); + rate = min_t(u64, rate, sk->sk_max_pacing_rate); + return rate; +} + +/* Initialize pacing rate to: high_gain * init_cwnd / RTT. */ +static void bbr_init_pacing_rate_from_rtt(struct sock *sk) +{ + struct tcp_sock *tp = tcp_sk(sk); + struct bbr *bbr = inet_csk_ca(sk); + u64 bw; + u32 rtt_us; + + if (tp->srtt_us) { /* any RTT sample yet? */ + rtt_us = max(tp->srtt_us >> 3, 1U); + bbr->has_seen_rtt = 1; + } else { /* no RTT sample yet */ + rtt_us = USEC_PER_MSEC; /* use nominal default RTT */ + } + bw = (u64)tp->snd_cwnd * BW_UNIT; + do_div(bw, rtt_us); + sk->sk_pacing_rate = bbr_bw_to_pacing_rate(sk, bw, bbr_high_gain); +} + +/* Pace using current bw estimate and a gain factor. In order to help drive the + * network toward lower queues while maintaining high utilization and low + * latency, the average pacing rate aims to be slightly (~1%) lower than the + * estimated bandwidth. This is an important aspect of the design. In this + * implementation this slightly lower pacing rate is achieved implicitly by not + * including link-layer headers in the packet size used for the pacing rate. + */ +static void bbr_set_pacing_rate(struct sock *sk, u32 bw, int gain) +{ + struct tcp_sock *tp = tcp_sk(sk); + struct bbr *bbr = inet_csk_ca(sk); + u32 rate = bbr_bw_to_pacing_rate(sk, bw, gain); + + if (unlikely(!bbr->has_seen_rtt && tp->srtt_us)) + bbr_init_pacing_rate_from_rtt(sk); + if (bbr_full_bw_reached(sk) || rate > sk->sk_pacing_rate) + sk->sk_pacing_rate = rate; +} + +/* Return count of segments we want in the skbs we send, or 0 for default. */ +static u32 bbr_tso_segs_goal(struct sock *sk) +{ + struct bbr *bbr = inet_csk_ca(sk); + + return bbr->tso_segs_goal; +} + +static void bbr_set_tso_segs_goal(struct sock *sk) +{ + struct tcp_sock *tp = tcp_sk(sk); + struct bbr *bbr = inet_csk_ca(sk); + u32 min_segs; + + min_segs = sk->sk_pacing_rate < (bbr_min_tso_rate >> 3) ? 1 : 2; + bbr->tso_segs_goal = min(tcp_tso_autosize(sk, tp->mss_cache, min_segs), + 0x7FU); +} + +/* Save "last known good" cwnd so we can restore it after losses or PROBE_RTT */ +static void bbr_save_cwnd(struct sock *sk) +{ + struct tcp_sock *tp = tcp_sk(sk); + struct bbr *bbr = inet_csk_ca(sk); + + if (bbr->prev_ca_state < TCP_CA_Recovery && bbr->mode != BBR_PROBE_RTT) + bbr->prior_cwnd = tp->snd_cwnd; /* this cwnd is good enough */ + else /* loss recovery or BBR_PROBE_RTT have temporarily cut cwnd */ + bbr->prior_cwnd = max(bbr->prior_cwnd, tp->snd_cwnd); +} + +static void bbr_cwnd_event(struct sock *sk, enum tcp_ca_event event) +{ + struct tcp_sock *tp = tcp_sk(sk); + struct bbr *bbr = inet_csk_ca(sk); + + if (event == CA_EVENT_TX_START && tp->app_limited) { + bbr->idle_restart = 1; + /* Avoid pointless buffer overflows: pace at est. bw if we don't + * need more speed (we're restarting from idle and app-limited). + */ + if (bbr->mode == BBR_PROBE_BW) + bbr_set_pacing_rate(sk, bbr_bw(sk), BBR_UNIT); + } +} + +/* Find target cwnd. Right-size the cwnd based on min RTT and the + * estimated bottleneck bandwidth: + * + * cwnd = bw * min_rtt * gain = BDP * gain + * + * The key factor, gain, controls the amount of queue. While a small gain + * builds a smaller queue, it becomes more vulnerable to noise in RTT + * measurements (e.g., delayed ACKs or other ACK compression effects). This + * noise may cause BBR to under-estimate the rate. + * + * To achieve full performance in high-speed paths, we budget enough cwnd to + * fit full-sized skbs in-flight on both end hosts to fully utilize the path: + * - one skb in sending host Qdisc, + * - one skb in sending host TSO/GSO engine + * - one skb being received by receiver host LRO/GRO/delayed-ACK engine + * Don't worry, at low rates (bbr_min_tso_rate) this won't bloat cwnd because + * in such cases tso_segs_goal is 1. The minimum cwnd is 4 packets, + * which allows 2 outstanding 2-packet sequences, to try to keep pipe + * full even with ACK-every-other-packet delayed ACKs. + */ +static u32 bbr_target_cwnd(struct sock *sk, u32 bw, int gain) +{ + struct bbr *bbr = inet_csk_ca(sk); + u32 cwnd; + u64 w; + + /* If we've never had a valid RTT sample, cap cwnd at the initial + * default. This should only happen when the connection is not using TCP + * timestamps and has retransmitted all of the SYN/SYNACK/data packets + * ACKed so far. In this case, an RTO can cut cwnd to 1, in which + * case we need to slow-start up toward something safe: TCP_INIT_CWND. + */ + if (unlikely(bbr->min_rtt_us == ~0U)) /* no valid RTT samples yet? */ + return TCP_INIT_CWND; /* be safe: cap at default initial cwnd*/ + + w = (u64)bw * bbr->min_rtt_us; + + /* Apply a gain to the given value, then remove the BW_SCALE shift. */ + cwnd = (((w * gain) >> BBR_SCALE) + BW_UNIT - 1) / BW_UNIT; + + /* Allow enough full-sized skbs in flight to utilize end systems. */ + cwnd += 3 * bbr->tso_segs_goal; + + /* Reduce delayed ACKs by rounding up cwnd to the next even number. */ + cwnd = (cwnd + 1) & ~1U; + + return cwnd; +} + +/* An optimization in BBR to reduce losses: On the first round of recovery, we + * follow the packet conservation principle: send P packets per P packets acked. + * After that, we slow-start and send at most 2*P packets per P packets acked. + * After recovery finishes, or upon undo, we restore the cwnd we had when + * recovery started (capped by the target cwnd based on estimated BDP). + * + * TODO(ycheng/ncardwell): implement a rate-based approach. + */ +static bool bbr_set_cwnd_to_recover_or_restore( + struct sock *sk, const struct rate_sample *rs, u32 acked, u32 *new_cwnd) +{ + struct tcp_sock *tp = tcp_sk(sk); + struct bbr *bbr = inet_csk_ca(sk); + u8 prev_state = bbr->prev_ca_state, state = inet_csk(sk)->icsk_ca_state; + u32 cwnd = tp->snd_cwnd; + + /* An ACK for P pkts should release at most 2*P packets. We do this + * in two steps. First, here we deduct the number of lost packets. + * Then, in bbr_set_cwnd() we slow start up toward the target cwnd. + */ + if (rs->losses > 0) + cwnd = max_t(s32, cwnd - rs->losses, 1); + + if (state == TCP_CA_Recovery && prev_state != TCP_CA_Recovery) { + /* Starting 1st round of Recovery, so do packet conservation. */ + bbr->packet_conservation = 1; + bbr->next_rtt_delivered = tp->delivered; /* start round now */ + /* Cut unused cwnd from app behavior, TSQ, or TSO deferral: */ + cwnd = tcp_packets_in_flight(tp) + acked; + } else if (prev_state >= TCP_CA_Recovery && state < TCP_CA_Recovery) { + /* Exiting loss recovery; restore cwnd saved before recovery. */ + bbr->restore_cwnd = 1; + bbr->packet_conservation = 0; + } + bbr->prev_ca_state = state; + + if (bbr->restore_cwnd) { + /* Restore cwnd after exiting loss recovery or PROBE_RTT. */ + cwnd = max(cwnd, bbr->prior_cwnd); + bbr->restore_cwnd = 0; + } + + if (bbr->packet_conservation) { + *new_cwnd = max(cwnd, tcp_packets_in_flight(tp) + acked); + return true; /* yes, using packet conservation */ + } + *new_cwnd = cwnd; + return false; +} + +/* Slow-start up toward target cwnd (if bw estimate is growing, or packet loss + * has drawn us down below target), or snap down to target if we're above it. + */ +static void bbr_set_cwnd(struct sock *sk, const struct rate_sample *rs, + u32 acked, u32 bw, int gain) +{ + struct tcp_sock *tp = tcp_sk(sk); + struct bbr *bbr = inet_csk_ca(sk); + u32 cwnd = 0, target_cwnd = 0; + + if (!acked) + return; + + if (bbr_set_cwnd_to_recover_or_restore(sk, rs, acked, &cwnd)) + goto done; + + /* If we're below target cwnd, slow start cwnd toward target cwnd. */ + target_cwnd = bbr_target_cwnd(sk, bw, gain); + if (bbr_full_bw_reached(sk)) /* only cut cwnd if we filled the pipe */ + cwnd = min(cwnd + acked, target_cwnd); + else if (cwnd < target_cwnd || tp->delivered < TCP_INIT_CWND) + cwnd = cwnd + acked; + cwnd = max(cwnd, bbr_cwnd_min_target); + +done: + tp->snd_cwnd = min(cwnd, tp->snd_cwnd_clamp); /* apply global cap */ + if (bbr->mode == BBR_PROBE_RTT) /* drain queue, refresh min_rtt */ + tp->snd_cwnd = min(tp->snd_cwnd, bbr_cwnd_min_target); +} + +/* End cycle phase if it's time and/or we hit the phase's in-flight target. */ +static bool bbr_is_next_cycle_phase(struct sock *sk, + const struct rate_sample *rs) +{ + struct tcp_sock *tp = tcp_sk(sk); + struct bbr *bbr = inet_csk_ca(sk); + bool is_full_length = + tcp_stamp_us_delta(tp->delivered_mstamp, bbr->cycle_mstamp) > + bbr->min_rtt_us; + u32 inflight, bw; + + /* The pacing_gain of 1.0 paces at the estimated bw to try to fully + * use the pipe without increasing the queue. + */ + if (bbr->pacing_gain == BBR_UNIT) + return is_full_length; /* just use wall clock time */ + + inflight = rs->prior_in_flight; /* what was in-flight before ACK? */ + bw = bbr_max_bw(sk); + + /* A pacing_gain > 1.0 probes for bw by trying to raise inflight to at + * least pacing_gain*BDP; this may take more than min_rtt if min_rtt is + * small (e.g. on a LAN). We do not persist if packets are lost, since + * a path with small buffers may not hold that much. + */ + if (bbr->pacing_gain > BBR_UNIT) + return is_full_length && + (rs->losses || /* perhaps pacing_gain*BDP won't fit */ + inflight >= bbr_target_cwnd(sk, bw, bbr->pacing_gain)); + + /* A pacing_gain < 1.0 tries to drain extra queue we added if bw + * probing didn't find more bw. If inflight falls to match BDP then we + * estimate queue is drained; persisting would underutilize the pipe. + */ + return is_full_length || + inflight <= bbr_target_cwnd(sk, bw, BBR_UNIT); +} + +static void bbr_advance_cycle_phase(struct sock *sk) +{ + struct tcp_sock *tp = tcp_sk(sk); + struct bbr *bbr = inet_csk_ca(sk); + + bbr->cycle_idx = (bbr->cycle_idx + 1) & (CYCLE_LEN - 1); + bbr->cycle_mstamp = tp->delivered_mstamp; + bbr->pacing_gain = bbr_pacing_gain[bbr->cycle_idx]; +} + +/* Gain cycling: cycle pacing gain to converge to fair share of available bw. */ +static void bbr_update_cycle_phase(struct sock *sk, + const struct rate_sample *rs) +{ + struct bbr *bbr = inet_csk_ca(sk); + + if ((bbr->mode == BBR_PROBE_BW) && !bbr->lt_use_bw && + bbr_is_next_cycle_phase(sk, rs)) + bbr_advance_cycle_phase(sk); +} + +static void bbr_reset_startup_mode(struct sock *sk) +{ + struct bbr *bbr = inet_csk_ca(sk); + + bbr->mode = BBR_STARTUP; + bbr->pacing_gain = bbr_high_gain; + bbr->cwnd_gain = bbr_high_gain; +} + +static void bbr_reset_probe_bw_mode(struct sock *sk) +{ + struct bbr *bbr = inet_csk_ca(sk); + + bbr->mode = BBR_PROBE_BW; + bbr->pacing_gain = BBR_UNIT; + bbr->cwnd_gain = bbr_cwnd_gain; + bbr->cycle_idx = CYCLE_LEN - 1 - prandom_u32_max(bbr_cycle_rand); + bbr_advance_cycle_phase(sk); /* flip to next phase of gain cycle */ +} + +static void bbr_reset_mode(struct sock *sk) +{ + if (!bbr_full_bw_reached(sk)) + bbr_reset_startup_mode(sk); + else + bbr_reset_probe_bw_mode(sk); +} + +/* Start a new long-term sampling interval. */ +static void bbr_reset_lt_bw_sampling_interval(struct sock *sk) +{ + struct tcp_sock *tp = tcp_sk(sk); + struct bbr *bbr = inet_csk_ca(sk); + + bbr->lt_last_stamp = div_u64(tp->delivered_mstamp, USEC_PER_MSEC); + bbr->lt_last_delivered = tp->delivered; + bbr->lt_last_lost = tp->lost; + bbr->lt_rtt_cnt = 0; +} + +/* Completely reset long-term bandwidth sampling. */ +static void bbr_reset_lt_bw_sampling(struct sock *sk) +{ + struct bbr *bbr = inet_csk_ca(sk); + + bbr->lt_bw = 0; + bbr->lt_use_bw = 0; + bbr->lt_is_sampling = false; + bbr_reset_lt_bw_sampling_interval(sk); +} + +/* Long-term bw sampling interval is done. Estimate whether we're policed. */ +static void bbr_lt_bw_interval_done(struct sock *sk, u32 bw) +{ + struct bbr *bbr = inet_csk_ca(sk); + u32 diff; + + if (bbr->lt_bw) { /* do we have bw from a previous interval? */ + /* Is new bw close to the lt_bw from the previous interval? */ + diff = abs(bw - bbr->lt_bw); + if ((diff * BBR_UNIT <= bbr_lt_bw_ratio * bbr->lt_bw) || + (bbr_rate_bytes_per_sec(sk, diff, BBR_UNIT) <= + bbr_lt_bw_diff)) { + /* All criteria are met; estimate we're policed. */ + bbr->lt_bw = (bw + bbr->lt_bw) >> 1; /* avg 2 intvls */ + bbr->lt_use_bw = 1; + bbr->pacing_gain = BBR_UNIT; /* try to avoid drops */ + bbr->lt_rtt_cnt = 0; + return; + } + } + bbr->lt_bw = bw; + bbr_reset_lt_bw_sampling_interval(sk); +} + +/* Token-bucket traffic policers are common (see "An Internet-Wide Analysis of + * Traffic Policing", SIGCOMM 2016). BBR detects token-bucket policers and + * explicitly models their policed rate, to reduce unnecessary losses. We + * estimate that we're policed if we see 2 consecutive sampling intervals with + * consistent throughput and high packet loss. If we think we're being policed, + * set lt_bw to the "long-term" average delivery rate from those 2 intervals. + */ +static void bbr_lt_bw_sampling(struct sock *sk, const struct rate_sample *rs) +{ + struct tcp_sock *tp = tcp_sk(sk); + struct bbr *bbr = inet_csk_ca(sk); + u32 lost, delivered; + u64 bw; + u32 t; + + if (bbr->lt_use_bw) { /* already using long-term rate, lt_bw? */ + if (bbr->mode == BBR_PROBE_BW && bbr->round_start && + ++bbr->lt_rtt_cnt >= bbr_lt_bw_max_rtts) { + bbr_reset_lt_bw_sampling(sk); /* stop using lt_bw */ + bbr_reset_probe_bw_mode(sk); /* restart gain cycling */ + } + return; + } + + /* Wait for the first loss before sampling, to let the policer exhaust + * its tokens and estimate the steady-state rate allowed by the policer. + * Starting samples earlier includes bursts that over-estimate the bw. + */ + if (!bbr->lt_is_sampling) { + if (!rs->losses) + return; + bbr_reset_lt_bw_sampling_interval(sk); + bbr->lt_is_sampling = true; + } + + /* To avoid underestimates, reset sampling if we run out of data. */ + if (rs->is_app_limited) { + bbr_reset_lt_bw_sampling(sk); + return; + } + + if (bbr->round_start) + bbr->lt_rtt_cnt++; /* count round trips in this interval */ + if (bbr->lt_rtt_cnt < bbr_lt_intvl_min_rtts) + return; /* sampling interval needs to be longer */ + if (bbr->lt_rtt_cnt > 4 * bbr_lt_intvl_min_rtts) { + bbr_reset_lt_bw_sampling(sk); /* interval is too long */ + return; + } + + /* End sampling interval when a packet is lost, so we estimate the + * policer tokens were exhausted. Stopping the sampling before the + * tokens are exhausted under-estimates the policed rate. + */ + if (!rs->losses) + return; + + /* Calculate packets lost and delivered in sampling interval. */ + lost = tp->lost - bbr->lt_last_lost; + delivered = tp->delivered - bbr->lt_last_delivered; + /* Is loss rate (lost/delivered) >= lt_loss_thresh? If not, wait. */ + if (!delivered || (lost << BBR_SCALE) < bbr_lt_loss_thresh * delivered) + return; + + /* Find average delivery rate in this sampling interval. */ + t = div_u64(tp->delivered_mstamp, USEC_PER_MSEC) - bbr->lt_last_stamp; + if ((s32)t < 1) + return; /* interval is less than one ms, so wait */ + /* Check if can multiply without overflow */ + if (t >= ~0U / USEC_PER_MSEC) { + bbr_reset_lt_bw_sampling(sk); /* interval too long; reset */ + return; + } + t *= USEC_PER_MSEC; + bw = (u64)delivered * BW_UNIT; + do_div(bw, t); + bbr_lt_bw_interval_done(sk, bw); +} + +/* Estimate the bandwidth based on how fast packets are delivered */ +static void bbr_update_bw(struct sock *sk, const struct rate_sample *rs) +{ + struct tcp_sock *tp = tcp_sk(sk); + struct bbr *bbr = inet_csk_ca(sk); + u64 bw; + + bbr->round_start = 0; + if (rs->delivered < 0 || rs->interval_us <= 0) + return; /* Not a valid observation */ + + /* See if we've reached the next RTT */ + if (!before(rs->prior_delivered, bbr->next_rtt_delivered)) { + bbr->next_rtt_delivered = tp->delivered; + bbr->rtt_cnt++; + bbr->round_start = 1; + bbr->packet_conservation = 0; + } + + bbr_lt_bw_sampling(sk, rs); + + /* Divide delivered by the interval to find a (lower bound) bottleneck + * bandwidth sample. Delivered is in packets and interval_us in uS and + * ratio will be <<1 for most connections. So delivered is first scaled. + */ + bw = (u64)rs->delivered * BW_UNIT; + do_div(bw, rs->interval_us); + + /* If this sample is application-limited, it is likely to have a very + * low delivered count that represents application behavior rather than + * the available network rate. Such a sample could drag down estimated + * bw, causing needless slow-down. Thus, to continue to send at the + * last measured network rate, we filter out app-limited samples unless + * they describe the path bw at least as well as our bw model. + * + * So the goal during app-limited phase is to proceed with the best + * network rate no matter how long. We automatically leave this + * phase when app writes faster than the network can deliver :) + */ + if (!rs->is_app_limited || bw >= bbr_max_bw(sk)) { + /* Incorporate new sample into our max bw filter. */ + minmax_running_max(&bbr->bw, bbr_bw_rtts, bbr->rtt_cnt, bw); + } +} + +/* Estimate when the pipe is full, using the change in delivery rate: BBR + * estimates that STARTUP filled the pipe if the estimated bw hasn't changed by + * at least bbr_full_bw_thresh (25%) after bbr_full_bw_cnt (3) non-app-limited + * rounds. Why 3 rounds: 1: rwin autotuning grows the rwin, 2: we fill the + * higher rwin, 3: we get higher delivery rate samples. Or transient + * cross-traffic or radio noise can go away. CUBIC Hystart shares a similar + * design goal, but uses delay and inter-ACK spacing instead of bandwidth. + */ +static void bbr_check_full_bw_reached(struct sock *sk, + const struct rate_sample *rs) +{ + struct bbr *bbr = inet_csk_ca(sk); + u32 bw_thresh; + + if (bbr_full_bw_reached(sk) || !bbr->round_start || rs->is_app_limited) + return; + + bw_thresh = (u64)bbr->full_bw * bbr_full_bw_thresh >> BBR_SCALE; + if (bbr_max_bw(sk) >= bw_thresh) { + bbr->full_bw = bbr_max_bw(sk); + bbr->full_bw_cnt = 0; + return; + } + ++bbr->full_bw_cnt; +} + +/* If pipe is probably full, drain the queue and then enter steady-state. */ +static void bbr_check_drain(struct sock *sk, const struct rate_sample *rs) +{ + struct bbr *bbr = inet_csk_ca(sk); + + if (bbr->mode == BBR_STARTUP && bbr_full_bw_reached(sk)) { + bbr->mode = BBR_DRAIN; /* drain queue we created */ + bbr->pacing_gain = bbr_drain_gain; /* pace slow to drain */ + bbr->cwnd_gain = bbr_high_gain; /* maintain cwnd */ + } /* fall through to check if in-flight is already small: */ + if (bbr->mode == BBR_DRAIN && + tcp_packets_in_flight(tcp_sk(sk)) <= + bbr_target_cwnd(sk, bbr_max_bw(sk), BBR_UNIT)) + bbr_reset_probe_bw_mode(sk); /* we estimate queue is drained */ +} + +/* The goal of PROBE_RTT mode is to have BBR flows cooperatively and + * periodically drain the bottleneck queue, to converge to measure the true + * min_rtt (unloaded propagation delay). This allows the flows to keep queues + * small (reducing queuing delay and packet loss) and achieve fairness among + * BBR flows. + * + * The min_rtt filter window is 10 seconds. When the min_rtt estimate expires, + * we enter PROBE_RTT mode and cap the cwnd at bbr_cwnd_min_target=4 packets. + * After at least bbr_probe_rtt_mode_ms=200ms and at least one packet-timed + * round trip elapsed with that flight size <= 4, we leave PROBE_RTT mode and + * re-enter the previous mode. BBR uses 200ms to approximately bound the + * performance penalty of PROBE_RTT's cwnd capping to roughly 2% (200ms/10s). + * + * Note that flows need only pay 2% if they are busy sending over the last 10 + * seconds. Interactive applications (e.g., Web, RPCs, video chunks) often have + * natural silences or low-rate periods within 10 seconds where the rate is low + * enough for long enough to drain its queue in the bottleneck. We pick up + * these min RTT measurements opportunistically with our min_rtt filter. :-) + */ +static void bbr_update_min_rtt(struct sock *sk, const struct rate_sample *rs) +{ + struct tcp_sock *tp = tcp_sk(sk); + struct bbr *bbr = inet_csk_ca(sk); + bool filter_expired; + + /* Track min RTT seen in the min_rtt_win_sec filter window: */ + filter_expired = after(tcp_jiffies32, + bbr->min_rtt_stamp + bbr_min_rtt_win_sec * HZ); + if (rs->rtt_us >= 0 && + (rs->rtt_us <= bbr->min_rtt_us || filter_expired)) { + bbr->min_rtt_us = rs->rtt_us; + bbr->min_rtt_stamp = tcp_jiffies32; + } + + if (bbr_probe_rtt_mode_ms > 0 && filter_expired && + !bbr->idle_restart && bbr->mode != BBR_PROBE_RTT) { + bbr->mode = BBR_PROBE_RTT; /* dip, drain queue */ + bbr->pacing_gain = BBR_UNIT; + bbr->cwnd_gain = BBR_UNIT; + bbr_save_cwnd(sk); /* note cwnd so we can restore it */ + bbr->probe_rtt_done_stamp = 0; + } + + if (bbr->mode == BBR_PROBE_RTT) { + /* Ignore low rate samples during this mode. */ + tp->app_limited = + (tp->delivered + tcp_packets_in_flight(tp)) ? : 1; + /* Maintain min packets in flight for max(200 ms, 1 round). */ + if (!bbr->probe_rtt_done_stamp && + tcp_packets_in_flight(tp) <= bbr_cwnd_min_target) { + bbr->probe_rtt_done_stamp = tcp_jiffies32 + + msecs_to_jiffies(bbr_probe_rtt_mode_ms); + bbr->probe_rtt_round_done = 0; + bbr->next_rtt_delivered = tp->delivered; + } else if (bbr->probe_rtt_done_stamp) { + if (bbr->round_start) + bbr->probe_rtt_round_done = 1; + if (bbr->probe_rtt_round_done && + after(tcp_jiffies32, bbr->probe_rtt_done_stamp)) { + bbr->min_rtt_stamp = tcp_jiffies32; + bbr->restore_cwnd = 1; /* snap to prior_cwnd */ + bbr_reset_mode(sk); + } + } + } + bbr->idle_restart = 0; +} + +static void bbr_update_model(struct sock *sk, const struct rate_sample *rs) +{ + bbr_update_bw(sk, rs); + bbr_update_cycle_phase(sk, rs); + bbr_check_full_bw_reached(sk, rs); + bbr_check_drain(sk, rs); + bbr_update_min_rtt(sk, rs); +} + +static void bbr_main(struct sock *sk, const struct rate_sample *rs) +{ + struct bbr *bbr = inet_csk_ca(sk); + u32 bw; + + bbr_update_model(sk, rs); + + bw = bbr_bw(sk); + bbr_set_pacing_rate(sk, bw, bbr->pacing_gain); + bbr_set_tso_segs_goal(sk); + bbr_set_cwnd(sk, rs, rs->acked_sacked, bw, bbr->cwnd_gain); +} + +static void bbr_init(struct sock *sk) +{ + struct tcp_sock *tp = tcp_sk(sk); + struct bbr *bbr = inet_csk_ca(sk); + + bbr->prior_cwnd = 0; + bbr->tso_segs_goal = 0; /* default segs per skb until first ACK */ + bbr->rtt_cnt = 0; + bbr->next_rtt_delivered = 0; + bbr->prev_ca_state = TCP_CA_Open; + bbr->packet_conservation = 0; + + bbr->probe_rtt_done_stamp = 0; + bbr->probe_rtt_round_done = 0; + bbr->min_rtt_us = tcp_min_rtt(tp); + bbr->min_rtt_stamp = tcp_jiffies32; + + minmax_reset(&bbr->bw, bbr->rtt_cnt, 0); /* init max bw to 0 */ + + bbr->has_seen_rtt = 0; + bbr_init_pacing_rate_from_rtt(sk); + + bbr->restore_cwnd = 0; + bbr->round_start = 0; + bbr->idle_restart = 0; + bbr->full_bw = 0; + bbr->full_bw_cnt = 0; + bbr->cycle_mstamp = 0; + bbr->cycle_idx = 0; + bbr_reset_lt_bw_sampling(sk); + bbr_reset_startup_mode(sk); + + cmpxchg(&sk->sk_pacing_status, SK_PACING_NONE, SK_PACING_NEEDED); +} + +static u32 bbr_sndbuf_expand(struct sock *sk) +{ + /* Provision 3 * cwnd since BBR may slow-start even during recovery. */ + return 3; +} + +/* In theory BBR does not need to undo the cwnd since it does not + * always reduce cwnd on losses (see bbr_main()). Keep it for now. + */ +static u32 bbr_undo_cwnd(struct sock *sk) +{ + return tcp_sk(sk)->snd_cwnd; +} + +/* Entering loss recovery, so save cwnd for when we exit or undo recovery. */ +static u32 bbr_ssthresh(struct sock *sk) +{ + bbr_save_cwnd(sk); + return TCP_INFINITE_SSTHRESH; /* BBR does not use ssthresh */ +} + +static size_t bbr_get_info(struct sock *sk, u32 ext, int *attr, + union tcp_cc_info *info) +{ + if (ext & (1 << (INET_DIAG_BBRINFO - 1)) || + ext & (1 << (INET_DIAG_VEGASINFO - 1))) { + struct tcp_sock *tp = tcp_sk(sk); + struct bbr *bbr = inet_csk_ca(sk); + u64 bw = bbr_bw(sk); + + bw = bw * tp->mss_cache * USEC_PER_SEC >> BW_SCALE; + memset(&info->bbr, 0, sizeof(info->bbr)); + info->bbr.bbr_bw_lo = (u32)bw; + info->bbr.bbr_bw_hi = (u32)(bw >> 32); + info->bbr.bbr_min_rtt = bbr->min_rtt_us; + info->bbr.bbr_pacing_gain = bbr->pacing_gain; + info->bbr.bbr_cwnd_gain = bbr->cwnd_gain; + *attr = INET_DIAG_BBRINFO; + return sizeof(info->bbr); + } + return 0; +} + +static void bbr_set_state(struct sock *sk, u8 new_state) +{ + struct bbr *bbr = inet_csk_ca(sk); + + if (new_state == TCP_CA_Loss) { + struct rate_sample rs = { .losses = 1 }; + + bbr->prev_ca_state = TCP_CA_Loss; + bbr->full_bw = 0; + bbr->round_start = 1; /* treat RTO like end of a round */ + bbr_lt_bw_sampling(sk, &rs); + } +} + +static struct tcp_congestion_ops tcp_bbr_cong_ops __read_mostly = { + .flags = TCP_CONG_NON_RESTRICTED, + .name = "nanqinlang", + .owner = THIS_MODULE, + .init = bbr_init, + .cong_control = bbr_main, + .sndbuf_expand = bbr_sndbuf_expand, + .undo_cwnd = bbr_undo_cwnd, + .cwnd_event = bbr_cwnd_event, + .ssthresh = bbr_ssthresh, + .tso_segs_goal = bbr_tso_segs_goal, + .get_info = bbr_get_info, + .set_state = bbr_set_state, +}; + +static int __init bbr_register(void) +{ + BUILD_BUG_ON(sizeof(struct bbr) > ICSK_CA_PRIV_SIZE); + return tcp_register_congestion_control(&tcp_bbr_cong_ops); +} + +static void __exit bbr_unregister(void) +{ + tcp_unregister_congestion_control(&tcp_bbr_cong_ops); +} + +module_init(bbr_register); +module_exit(bbr_unregister); + +MODULE_AUTHOR("Van Jacobson "); +MODULE_AUTHOR("Neal Cardwell "); +MODULE_AUTHOR("Yuchung Cheng "); +MODULE_AUTHOR("Soheil Hassas Yeganeh "); +MODULE_LICENSE("Dual BSD/GPL"); +MODULE_DESCRIPTION("TCP BBR (Bottleneck Bandwidth and RTT)"); +MODULE_AUTHOR("Nanqinlang "); \ No newline at end of file diff --git a/package/ctcgfw/bbr-tsunami/Makefile b/package/ctcgfw/bbr-tsunami/Makefile new file mode 100644 index 0000000000..0d8fa2cfa2 --- /dev/null +++ b/package/ctcgfw/bbr-tsunami/Makefile @@ -0,0 +1,46 @@ +include $(TOPDIR)/rules.mk +include $(INCLUDE_DIR)/kernel.mk + +PKG_NAME:=tcp-bbr-tsunami +PKG_RELEASE:=1 + +include $(INCLUDE_DIR)/package.mk + +define KernelPackage/$(PKG_NAME) + SUBMENU:=Network Support + TITLE:=Modified bbr tcp congestion control + DEPENDS:=@LINUX_4_14 + FILES:=$(PKG_BUILD_DIR)/tcp_bbr_tsunami.ko + KCONFIG:= +endef + +define KernelPackage/$(PKG_NAME)/description + Kernel module of modified BBR tcp congestion control +endef + +EXTRA_KCONFIG:= \ + + +EXTRA_CFLAGS:= \ + $(patsubst CONFIG_%, -DCONFIG_%=1, $(patsubst %=m,%,$(filter %=m,$(EXTRA_KCONFIG)))) \ + $(patsubst CONFIG_%, -DCONFIG_%=1, $(patsubst %=y,%,$(filter %=y,$(EXTRA_KCONFIG)))) \ + +MAKE_OPTS:= \ + ARCH="$(LINUX_KARCH)" \ + CROSS_COMPILE="$(TARGET_CROSS)" \ + SUBDIRS="$(PKG_BUILD_DIR)" \ + EXTRA_CFLAGS="$(EXTRA_CFLAGS)" \ + $(EXTRA_KCONFIG) + +define Build/Prepare + mkdir -p $(PKG_BUILD_DIR) + $(CP) ./src/* $(PKG_BUILD_DIR)/ +endef + +define Build/Compile + $(MAKE) -C "$(LINUX_DIR)" \ + $(MAKE_OPTS) \ + modules +endef + +$(eval $(call KernelPackage,$(PKG_NAME))) diff --git a/package/ctcgfw/bbr-tsunami/src/Makefile b/package/ctcgfw/bbr-tsunami/src/Makefile new file mode 100644 index 0000000000..e75eebfb33 --- /dev/null +++ b/package/ctcgfw/bbr-tsunami/src/Makefile @@ -0,0 +1 @@ +obj-m := tcp_bbr_tsunami.o diff --git a/package/ctcgfw/bbr-tsunami/src/tcp_bbr_tsunami.c b/package/ctcgfw/bbr-tsunami/src/tcp_bbr_tsunami.c new file mode 100644 index 0000000000..4d6ffe8bcb --- /dev/null +++ b/package/ctcgfw/bbr-tsunami/src/tcp_bbr_tsunami.c @@ -0,0 +1,905 @@ +/* Bottleneck Bandwidth and RTT (BBR) congestion control + * + * BBR congestion control computes the sending rate based on the delivery + * rate (throughput) estimated from ACKs. In a nutshell: + * + * On each ACK, update our model of the network path: + * bottleneck_bandwidth = windowed_max(delivered / elapsed, 10 round trips) + * min_rtt = windowed_min(rtt, 10 seconds) + * pacing_rate = pacing_gain * bottleneck_bandwidth + * cwnd = max(cwnd_gain * bottleneck_bandwidth * min_rtt, 4) + * + * The core algorithm does not react directly to packet losses or delays, + * although BBR may adjust the size of next send per ACK when loss is + * observed, or adjust the sending rate if it estimates there is a + * traffic policer, in order to keep the drop rate reasonable. + * + * BBR is described in detail in: + * "BBR: Congestion-Based Congestion Control", + * Neal Cardwell, Yuchung Cheng, C. Stephen Gunn, Soheil Hassas Yeganeh, + * Van Jacobson. ACM Queue, Vol. 14 No. 5, September-October 2016. + * + * There is a public e-mail list for discussing BBR development and testing: + * https://groups.google.com/forum/#!forum/bbr-dev + * + * NOTE: BBR *must* be used with the fq qdisc ("man tc-fq") with pacing enabled, + * since pacing is integral to the BBR design and implementation. + * BBR without pacing would not function properly, and may incur unnecessary + * high packet loss rates. + */ +#include +#include +#include +#include +#include +#include + +/* Scale factor for rate in pkt/uSec unit to avoid truncation in bandwidth + * estimation. The rate unit ~= (1500 bytes / 1 usec / 2^24) ~= 715 bps. + * This handles bandwidths from 0.06pps (715bps) to 256Mpps (3Tbps) in a u32. + * Since the minimum window is >=4 packets, the lower bound isn't + * an issue. The upper bound isn't an issue with existing technologies. + */ +#define BW_SCALE 24 +#define BW_UNIT (1 << BW_SCALE) + +#define BBR_SCALE 8 /* scaling factor for fractions in BBR (e.g. gains) */ +#define BBR_UNIT (1 << BBR_SCALE) + +/* BBR has the following modes for deciding how fast to send: */ +enum bbr_mode { + BBR_STARTUP, /* ramp up sending rate rapidly to fill pipe */ + BBR_DRAIN, /* drain any queue created during startup */ + BBR_PROBE_BW, /* discover, share bw: pace around estimated bw */ + BBR_PROBE_RTT, /* cut cwnd to min to probe min_rtt */ +}; + +/* BBR congestion control block */ +struct bbr { + u32 min_rtt_us; /* min RTT in min_rtt_win_sec window */ +//deprecated u32 rtt_us; + u32 min_rtt_stamp; /* timestamp of min_rtt_us */ + u32 probe_rtt_done_stamp; /* end time for BBR_PROBE_RTT mode */ +//deprecated struct minmax max_rtt; + struct minmax bw; /* Max recent delivery rate in pkts/uS << 24 */ + u32 rtt_cnt; /* count of packet-timed rounds elapsed */ + u32 next_rtt_delivered; /* scb->tx.delivered at end of round */ + struct skb_mstamp cycle_mstamp; /* time of this cycle phase start */ + u32 mode:3, /* current bbr_mode in state machine */ + prev_ca_state:3, /* CA state on previous ACK */ + packet_conservation:1, /* use packet conservation? */ + restore_cwnd:1, /* decided to revert cwnd to old value */ + round_start:1, /* start of packet-timed tx->ack round? */ + tso_segs_goal:7, /* segments we want in each skb we send */ + idle_restart:1, /* restarting after idle? */ + probe_rtt_round_done:1, /* a BBR_PROBE_RTT round at 4 pkts? */ + unused:5, + lt_is_sampling:1, /* taking long-term ("LT") samples now? */ + lt_rtt_cnt:7, /* round trips in long-term interval */ + lt_use_bw:1; /* use lt_bw as our bw estimate? */ + u32 lt_bw; /* LT est delivery rate in pkts/uS << 24 */ + u32 lt_last_delivered; /* LT intvl start: tp->delivered */ + u32 lt_last_stamp; /* LT intvl start: tp->delivered_mstamp */ + u32 lt_last_lost; /* LT intvl start: tp->lost */ + u32 pacing_gain:10, /* current gain for setting pacing rate */ + cwnd_gain:10, /* current gain for setting cwnd */ + full_bw_cnt:3, /* number of rounds without large bw gains */ + cycle_idx:3, /* current index in pacing_gain cycle array */ + unused_b:6; + u32 prior_cwnd; /* prior cwnd upon entering loss recovery */ + u32 full_bw; /* recent bw, to estimate if pipe is full */ +}; + +#define CYCLE_LEN 8 /* number of phases in a pacing gain cycle */ + +/* Window length of bw filter (in rounds): */ +static const int bbr_bw_rtts = CYCLE_LEN + 7; +/* Window length of min_rtt filter (in sec): */ +static const u32 bbr_min_rtt_win_sec = 20; +/* Minimum time (in ms) spent at bbr_cwnd_min_target in BBR_PROBE_RTT mode: */ +static const u32 bbr_probe_rtt_mode_ms = 200; +/* Skip TSO below the following bandwidth (bits/sec): */ +static const int bbr_min_tso_rate = 1200000; + +/* We use a high_gain value of 2/ln(2) because it's the smallest pacing gain + * that will allow a smoothly increasing pacing rate that will double each RTT + * and send the same number of packets per RTT that an un-paced, slow-starting + * Reno or CUBIC flow would: + */ +static const int bbr_high_gain = BBR_UNIT * 2885 / 1000 + 1; +/* The pacing gain of 1/high_gain in BBR_DRAIN is calculated to typically drain + * the queue created in BBR_STARTUP in a single round: + */ +static const int bbr_drain_gain = BBR_UNIT * 1200 / 2885; +/* The gain for deriving steady-state cwnd tolerates delayed/stretched ACKs: */ +static const int bbr_cwnd_gain = BBR_UNIT * 2; +/* The pacing_gain values for the PROBE_BW gain cycle, to discover/share bw: */ +static const int bbr_pacing_gain[] = { + BBR_UNIT * 3 / 2, /* probe for more available bw */ + BBR_UNIT * 3 / 4, /* drain queue and/or yield bw to other flows */ + BBR_UNIT * 9 / 8, BBR_UNIT * 9 / 8, BBR_UNIT * 9 / 8, /* cruise at 1.0*bw to utilize pipe, */ + BBR_UNIT * 9 / 8, BBR_UNIT * 9 / 8, BBR_UNIT * 9 / 8 /* without creating excess queue... */ +}; +/* Randomize the starting gain cycling phase over N phases: */ +static const u32 bbr_cycle_rand = 7; + +/* Try to keep at least this many packets in flight, if things go smoothly. For + * smooth functioning, a sliding window protocol ACKing every other packet + * needs at least 4 packets in flight: + */ +static const u32 bbr_cwnd_min_target = 4; + +/* To estimate if BBR_STARTUP mode (i.e. high_gain) has filled pipe... */ +/* If bw has increased significantly (1.25x), there may be more bw available: */ +static const u32 bbr_full_bw_thresh = BBR_UNIT * 5 / 4; +/* But after 3 rounds w/o significant bw growth, estimate pipe is full: */ +static const u32 bbr_full_bw_cnt = 3; + +/* "long-term" ("LT") bandwidth estimator parameters... */ +/* The minimum number of rounds in an LT bw sampling interval: */ +static const u32 bbr_lt_intvl_min_rtts = 4; +/* If lost/delivered ratio > 20%, interval is "lossy" and we may be policed: */ +static const u32 bbr_lt_loss_thresh = 50; +/* If 2 intervals have a bw ratio <= 1/8, their bw is "consistent": */ +static const u32 bbr_lt_bw_ratio = BBR_UNIT / 8; +/* If 2 intervals have a bw diff <= 4 Kbit/sec their bw is "consistent": */ +static const u32 bbr_lt_bw_diff = 4000 / 8; +/* If we estimate we're policed, use lt_bw for this many round trips: */ +static const u32 bbr_lt_bw_max_rtts = 48; + +/* Do we estimate that STARTUP filled the pipe? */ +static bool bbr_full_bw_reached(const struct sock *sk) +{ + const struct bbr *bbr = inet_csk_ca(sk); + + return bbr->full_bw_cnt >= bbr_full_bw_cnt; +} + +/* Return the windowed max recent bandwidth sample, in pkts/uS << BW_SCALE. */ +static u32 bbr_max_bw(const struct sock *sk) +{ + struct bbr *bbr = inet_csk_ca(sk); + + return minmax_get(&bbr->bw); +} + +/* Return the estimated bandwidth of the path, in pkts/uS << BW_SCALE. */ +static u32 bbr_bw(const struct sock *sk) +{ + struct bbr *bbr = inet_csk_ca(sk); + + return bbr->lt_use_bw ? bbr->lt_bw : bbr_max_bw(sk); +} + +/* Return rate in bytes per second, optionally with a gain. + * The order here is chosen carefully to avoid overflow of u64. This should + * work for input rates of up to 2.9Tbit/sec and gain of 2.89x. + */ +static u64 bbr_rate_bytes_per_sec(struct sock *sk, u64 rate, int gain) +{ + rate *= tcp_mss_to_mtu(sk, tcp_sk(sk)->mss_cache); + rate *= gain; + rate >>= BBR_SCALE; + rate *= USEC_PER_SEC; + return rate >> BW_SCALE; +} + +/* Pace using current bw estimate and a gain factor. In order to help drive the + * network toward lower queues while maintaining high utilization and low + * latency, the average pacing rate aims to be slightly (~1%) lower than the + * estimated bandwidth. This is an important aspect of the design. In this + * implementation this slightly lower pacing rate is achieved implicitly by not + * including link-layer headers in the packet size used for the pacing rate. + */ +static void bbr_set_pacing_rate(struct sock *sk, u32 bw, int gain) +{ + struct bbr *bbr = inet_csk_ca(sk); + u64 rate = bw; + + rate = bbr_rate_bytes_per_sec(sk, rate, gain); + rate = min_t(u64, rate, sk->sk_max_pacing_rate); + if (bbr->mode != BBR_STARTUP || rate > sk->sk_pacing_rate) + sk->sk_pacing_rate = rate; +} + +/* Return count of segments we want in the skbs we send, or 0 for default. */ +static u32 bbr_tso_segs_goal(struct sock *sk) +{ + struct bbr *bbr = inet_csk_ca(sk); + + return bbr->tso_segs_goal; +} + +static void bbr_set_tso_segs_goal(struct sock *sk) +{ + struct tcp_sock *tp = tcp_sk(sk); + struct bbr *bbr = inet_csk_ca(sk); + u32 min_segs; + + min_segs = sk->sk_pacing_rate < (bbr_min_tso_rate >> 3) ? 1 : 2; + bbr->tso_segs_goal = min(tcp_tso_autosize(sk, tp->mss_cache, min_segs), + 0x7FU); +} + +/* Save "last known good" cwnd so we can restore it after losses or PROBE_RTT */ +static void bbr_save_cwnd(struct sock *sk) +{ + struct tcp_sock *tp = tcp_sk(sk); + struct bbr *bbr = inet_csk_ca(sk); + + if (bbr->prev_ca_state < TCP_CA_Recovery && bbr->mode != BBR_PROBE_RTT) + bbr->prior_cwnd = tp->snd_cwnd; /* this cwnd is good enough */ + else /* loss recovery or BBR_PROBE_RTT have temporarily cut cwnd */ + bbr->prior_cwnd = max(bbr->prior_cwnd, tp->snd_cwnd); +} + +static void bbr_cwnd_event(struct sock *sk, enum tcp_ca_event event) +{ + struct tcp_sock *tp = tcp_sk(sk); + struct bbr *bbr = inet_csk_ca(sk); + + if (event == CA_EVENT_TX_START && tp->app_limited) { + bbr->idle_restart = 1; + /* Avoid pointless buffer overflows: pace at est. bw if we don't + * need more speed (we're restarting from idle and app-limited). + */ + if (bbr->mode == BBR_PROBE_BW) + bbr_set_pacing_rate(sk, bbr_bw(sk), BBR_UNIT); + } +} + +/* Find target cwnd. Right-size the cwnd based on min RTT and the + * estimated bottleneck bandwidth: + * + * cwnd = bw * min_rtt * gain = BDP * gain + * + * The key factor, gain, controls the amount of queue. While a small gain + * builds a smaller queue, it becomes more vulnerable to noise in RTT + * measurements (e.g., delayed ACKs or other ACK compression effects). This + * noise may cause BBR to under-estimate the rate. + * + * To achieve full performance in high-speed paths, we budget enough cwnd to + * fit full-sized skbs in-flight on both end hosts to fully utilize the path: + * - one skb in sending host Qdisc, + * - one skb in sending host TSO/GSO engine + * - one skb being received by receiver host LRO/GRO/delayed-ACK engine + * Don't worry, at low rates (bbr_min_tso_rate) this won't bloat cwnd because + * in such cases tso_segs_goal is 1. The minimum cwnd is 4 packets, + * which allows 2 outstanding 2-packet sequences, to try to keep pipe + * full even with ACK-every-other-packet delayed ACKs. + */ +static u32 bbr_target_cwnd(struct sock *sk, u32 bw, int gain) +{ + struct bbr *bbr = inet_csk_ca(sk); + u32 cwnd; + u64 w; + + /* If we've never had a valid RTT sample, cap cwnd at the initial + * default. This should only happen when the connection is not using TCP + * timestamps and has retransmitted all of the SYN/SYNACK/data packets + * ACKed so far. In this case, an RTO can cut cwnd to 1, in which + * case we need to slow-start up toward something safe: TCP_INIT_CWND. + */ + if (unlikely(bbr->min_rtt_us == ~0U)) /* no valid RTT samples yet? */ + return TCP_INIT_CWND; /* be safe: cap at default initial cwnd*/ + + w = (u64)bw * bbr->min_rtt_us; + + /* Apply a gain to the given value, then remove the BW_SCALE shift. */ + cwnd = (((w * gain) >> BBR_SCALE) + BW_UNIT - 1) / BW_UNIT; + + /* Allow enough full-sized skbs in flight to utilize end systems. */ + cwnd += 3 * bbr->tso_segs_goal; + + /* Reduce delayed ACKs by rounding up cwnd to the next even number. */ + cwnd = (cwnd + 1) & ~1U; + + return cwnd; +} + +/* An optimization in BBR to reduce losses: On the first round of recovery, we + * follow the packet conservation principle: send P packets per P packets acked. + * After that, we slow-start and send at most 2*P packets per P packets acked. + * After recovery finishes, or upon undo, we restore the cwnd we had when + * recovery started (capped by the target cwnd based on estimated BDP). + * + * TODO(ycheng/ncardwell): implement a rate-based approach. + */ +static bool bbr_set_cwnd_to_recover_or_restore( + struct sock *sk, const struct rate_sample *rs, u32 acked, u32 *new_cwnd) +{ + struct tcp_sock *tp = tcp_sk(sk); + struct bbr *bbr = inet_csk_ca(sk); + u8 prev_state = bbr->prev_ca_state, state = inet_csk(sk)->icsk_ca_state; + u32 cwnd = tp->snd_cwnd; + + /* An ACK for P pkts should release at most 2*P packets. We do this + * in two steps. First, here we deduct the number of lost packets. + * Then, in bbr_set_cwnd() we slow start up toward the target cwnd. + */ + if (rs->losses > 0) + cwnd = max_t(s32, cwnd - rs->losses, 1); + + if (state == TCP_CA_Recovery && prev_state != TCP_CA_Recovery) { + /* Starting 1st round of Recovery, so do packet conservation. */ + bbr->packet_conservation = 1; + bbr->next_rtt_delivered = tp->delivered; /* start round now */ + /* Cut unused cwnd from app behavior, TSQ, or TSO deferral: */ + cwnd = tcp_packets_in_flight(tp) + acked; + } else if (prev_state >= TCP_CA_Recovery && state < TCP_CA_Recovery) { + /* Exiting loss recovery; restore cwnd saved before recovery. */ + bbr->restore_cwnd = 1; + bbr->packet_conservation = 0; + } + bbr->prev_ca_state = state; + + if (bbr->restore_cwnd) { + /* Restore cwnd after exiting loss recovery or PROBE_RTT. */ + cwnd = max(cwnd, bbr->prior_cwnd); + bbr->restore_cwnd = 0; + } + + if (bbr->packet_conservation) { + *new_cwnd = max(cwnd, tcp_packets_in_flight(tp) + acked); + return true; /* yes, using packet conservation */ + } + *new_cwnd = cwnd; + return false; +} + +/* Slow-start up toward target cwnd (if bw estimate is growing, or packet loss + * has drawn us down below target), or snap down to target if we're above it. + */ +static void bbr_set_cwnd(struct sock *sk, const struct rate_sample *rs, + u32 acked, u32 bw, int gain) +{ + struct tcp_sock *tp = tcp_sk(sk); + struct bbr *bbr = inet_csk_ca(sk); + u32 cwnd = 0, target_cwnd = 0; + + if (!acked) + return; + + if (bbr_set_cwnd_to_recover_or_restore(sk, rs, acked, &cwnd)) + goto done; + + /* If we're below target cwnd, slow start cwnd toward target cwnd. */ + target_cwnd = bbr_target_cwnd(sk, bw, gain); + if (bbr_full_bw_reached(sk)) /* only cut cwnd if we filled the pipe */ + cwnd = min(cwnd + acked, target_cwnd); + else if (cwnd < target_cwnd || tp->delivered < TCP_INIT_CWND) + cwnd = cwnd + acked; + cwnd = max(cwnd, bbr_cwnd_min_target); + +done: + tp->snd_cwnd = min(cwnd, tp->snd_cwnd_clamp); /* apply global cap */ + if (bbr->mode == BBR_PROBE_RTT) /* drain queue, refresh min_rtt */ + tp->snd_cwnd = max(tp->snd_cwnd >> 1, bbr_cwnd_min_target); +} + +/* End cycle phase if it's time and/or we hit the phase's in-flight target. */ +static bool bbr_is_next_cycle_phase(struct sock *sk, + const struct rate_sample *rs) +{ + struct tcp_sock *tp = tcp_sk(sk); + struct bbr *bbr = inet_csk_ca(sk); + bool is_full_length = + skb_mstamp_us_delta(&tp->delivered_mstamp, &bbr->cycle_mstamp) > + bbr->min_rtt_us; + u32 inflight, bw; + + /* The pacing_gain of 1.0 paces at the estimated bw to try to fully + * use the pipe without increasing the queue. + */ + if (bbr->pacing_gain == BBR_UNIT) + return is_full_length; /* just use wall clock time */ + + inflight = rs->prior_in_flight; /* what was in-flight before ACK? */ + bw = bbr_max_bw(sk); + + /* A pacing_gain > 1.0 probes for bw by trying to raise inflight to at + * least pacing_gain*BDP; this may take more than min_rtt if min_rtt is + * small (e.g. on a LAN). We do not persist if packets are lost, since + * a path with small buffers may not hold that much. + */ + if (bbr->pacing_gain > BBR_UNIT) + return is_full_length && + (rs->losses || /* perhaps pacing_gain*BDP won't fit */ + inflight >= bbr_target_cwnd(sk, bw, bbr->pacing_gain)); + + /* A pacing_gain < 1.0 tries to drain extra queue we added if bw + * probing didn't find more bw. If inflight falls to match BDP then we + * estimate queue is drained; persisting would underutilize the pipe. + */ + return is_full_length || + inflight <= bbr_target_cwnd(sk, bw, BBR_UNIT); +} + +static void bbr_advance_cycle_phase(struct sock *sk) +{ + struct tcp_sock *tp = tcp_sk(sk); + struct bbr *bbr = inet_csk_ca(sk); + + bbr->cycle_idx = (bbr->cycle_idx + 1) & (CYCLE_LEN - 1); + bbr->cycle_mstamp = tp->delivered_mstamp; + bbr->pacing_gain = bbr_pacing_gain[bbr->cycle_idx]; +} + +/* Gain cycling: cycle pacing gain to converge to fair share of available bw. */ +static void bbr_update_cycle_phase(struct sock *sk, + const struct rate_sample *rs) +{ + struct bbr *bbr = inet_csk_ca(sk); + + if ((bbr->mode == BBR_PROBE_BW) && !bbr->lt_use_bw && + bbr_is_next_cycle_phase(sk, rs)) + bbr_advance_cycle_phase(sk); +} + +static void bbr_reset_startup_mode(struct sock *sk) +{ + struct bbr *bbr = inet_csk_ca(sk); + + bbr->mode = BBR_STARTUP; + bbr->pacing_gain = bbr_high_gain; + bbr->cwnd_gain = bbr_high_gain; +} + +static void bbr_reset_probe_bw_mode(struct sock *sk) +{ + struct bbr *bbr = inet_csk_ca(sk); + + bbr->mode = BBR_PROBE_BW; + bbr->pacing_gain = BBR_UNIT; + bbr->cwnd_gain = bbr_cwnd_gain; + bbr->cycle_idx = CYCLE_LEN - 1 - prandom_u32_max(bbr_cycle_rand); + bbr_advance_cycle_phase(sk); /* flip to next phase of gain cycle */ +} + +static void bbr_reset_mode(struct sock *sk) +{ + if (!bbr_full_bw_reached(sk)) + bbr_reset_startup_mode(sk); + else + bbr_reset_probe_bw_mode(sk); +} + +/* Start a new long-term sampling interval. */ +static void bbr_reset_lt_bw_sampling_interval(struct sock *sk) +{ + struct tcp_sock *tp = tcp_sk(sk); + struct bbr *bbr = inet_csk_ca(sk); + + bbr->lt_last_stamp = tp->delivered_mstamp.stamp_jiffies; + bbr->lt_last_delivered = tp->delivered; + bbr->lt_last_lost = tp->lost; + bbr->lt_rtt_cnt = 0; +} + +/* Completely reset long-term bandwidth sampling. */ +static void bbr_reset_lt_bw_sampling(struct sock *sk) +{ + struct bbr *bbr = inet_csk_ca(sk); + + bbr->lt_bw = 0; + bbr->lt_use_bw = 0; + bbr->lt_is_sampling = false; + bbr_reset_lt_bw_sampling_interval(sk); +} + +/* Long-term bw sampling interval is done. Estimate whether we're policed. */ +static void bbr_lt_bw_interval_done(struct sock *sk, u32 bw) +{ + struct bbr *bbr = inet_csk_ca(sk); + u32 diff; + + if (bbr->lt_bw) { /* do we have bw from a previous interval? */ + /* Is new bw close to the lt_bw from the previous interval? */ + diff = abs(bw - bbr->lt_bw); + if ((diff * BBR_UNIT <= bbr_lt_bw_ratio * bbr->lt_bw) || + (bbr_rate_bytes_per_sec(sk, diff, BBR_UNIT) <= + bbr_lt_bw_diff)) { + /* All criteria are met; estimate we're policed. */ + bbr->lt_bw = (bw + bbr->lt_bw) >> 1; /* avg 2 intvls */ + bbr->lt_use_bw = 1; + bbr->pacing_gain = BBR_UNIT; /* try to avoid drops */ + bbr->lt_rtt_cnt = 0; + return; + } + } + bbr->lt_bw = bw; + bbr_reset_lt_bw_sampling_interval(sk); +} + +/* Token-bucket traffic policers are common (see "An Internet-Wide Analysis of + * Traffic Policing", SIGCOMM 2016). BBR detects token-bucket policers and + * explicitly models their policed rate, to reduce unnecessary losses. We + * estimate that we're policed if we see 2 consecutive sampling intervals with + * consistent throughput and high packet loss. If we think we're being policed, + * set lt_bw to the "long-term" average delivery rate from those 2 intervals. + */ +static void bbr_lt_bw_sampling(struct sock *sk, const struct rate_sample *rs) +{ + struct tcp_sock *tp = tcp_sk(sk); + struct bbr *bbr = inet_csk_ca(sk); + u32 lost, delivered; + u64 bw; + s32 t; + + if (bbr->lt_use_bw) { /* already using long-term rate, lt_bw? */ + if (bbr->mode == BBR_PROBE_BW && bbr->round_start && + ++bbr->lt_rtt_cnt >= bbr_lt_bw_max_rtts) { + bbr_reset_lt_bw_sampling(sk); /* stop using lt_bw */ + bbr_reset_probe_bw_mode(sk); /* restart gain cycling */ + } + return; + } + + /* Wait for the first loss before sampling, to let the policer exhaust + * its tokens and estimate the steady-state rate allowed by the policer. + * Starting samples earlier includes bursts that over-estimate the bw. + */ + if (!bbr->lt_is_sampling) { + if (!rs->losses) + return; + bbr_reset_lt_bw_sampling_interval(sk); + bbr->lt_is_sampling = true; + } + + /* To avoid underestimates, reset sampling if we run out of data. */ + if (rs->is_app_limited) { + bbr_reset_lt_bw_sampling(sk); + return; + } + + if (bbr->round_start) + bbr->lt_rtt_cnt++; /* count round trips in this interval */ + if (bbr->lt_rtt_cnt < bbr_lt_intvl_min_rtts) + return; /* sampling interval needs to be longer */ + if (bbr->lt_rtt_cnt > 4 * bbr_lt_intvl_min_rtts) { + bbr_reset_lt_bw_sampling(sk); /* interval is too long */ + return; + } + + /* End sampling interval when a packet is lost, so we estimate the + * policer tokens were exhausted. Stopping the sampling before the + * tokens are exhausted under-estimates the policed rate. + */ + if (!rs->losses) + return; + + /* Calculate packets lost and delivered in sampling interval. */ + lost = tp->lost - bbr->lt_last_lost; + delivered = tp->delivered - bbr->lt_last_delivered; + /* Is loss rate (lost/delivered) >= lt_loss_thresh? If not, wait. */ + if (!delivered || (lost << BBR_SCALE) < bbr_lt_loss_thresh * delivered) + return; + + /* Find average delivery rate in this sampling interval. */ + t = (s32)(tp->delivered_mstamp.stamp_jiffies - bbr->lt_last_stamp); + if (t < 1) + return; /* interval is less than one jiffy, so wait */ + t = jiffies_to_usecs(t); + /* Interval long enough for jiffies_to_usecs() to return a bogus 0? */ + if (t < 1) { + bbr_reset_lt_bw_sampling(sk); /* interval too long; reset */ + return; + } + bw = (u64)delivered * BW_UNIT; + do_div(bw, t); + bbr_lt_bw_interval_done(sk, bw); +} + +/* Estimate the bandwidth based on how fast packets are delivered */ +static void bbr_update_bw(struct sock *sk, const struct rate_sample *rs) +{ + struct tcp_sock *tp = tcp_sk(sk); + struct bbr *bbr = inet_csk_ca(sk); + u64 bw; + + bbr->round_start = 0; + if (rs->delivered < 0 || rs->interval_us <= 0) + return; /* Not a valid observation */ + + /* See if we've reached the next RTT */ + if (!before(rs->prior_delivered, bbr->next_rtt_delivered)) { + bbr->next_rtt_delivered = tp->delivered; + bbr->rtt_cnt++; + bbr->round_start = 1; + bbr->packet_conservation = 0; + } + + bbr_lt_bw_sampling(sk, rs); + + /* Divide delivered by the interval to find a (lower bound) bottleneck + * bandwidth sample. Delivered is in packets and interval_us in uS and + * ratio will be <<1 for most connections. So delivered is first scaled. + */ + bw = (u64)rs->delivered * BW_UNIT; + do_div(bw, rs->interval_us); + + /* If this sample is application-limited, it is likely to have a very + * low delivered count that represents application behavior rather than + * the available network rate. Such a sample could drag down estimated + * bw, causing needless slow-down. Thus, to continue to send at the + * last measured network rate, we filter out app-limited samples unless + * they describe the path bw at least as well as our bw model. + * + * So the goal during app-limited phase is to proceed with the best + * network rate no matter how long. We automatically leave this + * phase when app writes faster than the network can deliver :) + */ + if (!rs->is_app_limited || bw >= bbr_max_bw(sk)) { + /* Incorporate new sample into our max bw filter. */ + minmax_running_max(&bbr->bw, bbr_bw_rtts, bbr->rtt_cnt, bw); + } +} + +/* Estimate when the pipe is full, using the change in delivery rate: BBR + * estimates that STARTUP filled the pipe if the estimated bw hasn't changed by + * at least bbr_full_bw_thresh (25%) after bbr_full_bw_cnt (3) non-app-limited + * rounds. Why 3 rounds: 1: rwin autotuning grows the rwin, 2: we fill the + * higher rwin, 3: we get higher delivery rate samples. Or transient + * cross-traffic or radio noise can go away. CUBIC Hystart shares a similar + * design goal, but uses delay and inter-ACK spacing instead of bandwidth. + */ +static void bbr_check_full_bw_reached(struct sock *sk, + const struct rate_sample *rs) +{ + struct bbr *bbr = inet_csk_ca(sk); + u32 bw_thresh; + + if (bbr_full_bw_reached(sk) || !bbr->round_start || rs->is_app_limited) + return; + + bw_thresh = (u64)bbr->full_bw * bbr_full_bw_thresh >> BBR_SCALE; + if (bbr_max_bw(sk) >= bw_thresh) { + bbr->full_bw = bbr_max_bw(sk); + bbr->full_bw_cnt = 0; + return; + } + ++bbr->full_bw_cnt; +} + +/* If pipe is probably full, drain the queue and then enter steady-state. */ +static void bbr_check_drain(struct sock *sk, const struct rate_sample *rs) +{ + struct bbr *bbr = inet_csk_ca(sk); + + if (bbr->mode == BBR_STARTUP && bbr_full_bw_reached(sk)) { + bbr->mode = BBR_DRAIN; /* drain queue we created */ + bbr->pacing_gain = bbr_drain_gain; /* pace slow to drain */ + bbr->cwnd_gain = bbr_high_gain; /* maintain cwnd */ + } /* fall through to check if in-flight is already small: */ + if (bbr->mode == BBR_DRAIN && + tcp_packets_in_flight(tcp_sk(sk)) <= + bbr_target_cwnd(sk, bbr_max_bw(sk), BBR_UNIT)) + bbr_reset_probe_bw_mode(sk); /* we estimate queue is drained */ +} + +/* The goal of PROBE_RTT mode is to have BBR flows cooperatively and + * periodically drain the bottleneck queue, to converge to measure the true + * min_rtt (unloaded propagation delay). This allows the flows to keep queues + * small (reducing queuing delay and packet loss) and achieve fairness among + * BBR flows. + * + * The min_rtt filter window is 10 seconds. When the min_rtt estimate expires, + * we enter PROBE_RTT mode and cap the cwnd at bbr_cwnd_min_target=4 packets. + * After at least bbr_probe_rtt_mode_ms=200ms and at least one packet-timed + * round trip elapsed with that flight size <= 4, we leave PROBE_RTT mode and + * re-enter the previous mode. BBR uses 200ms to approximately bound the + * performance penalty of PROBE_RTT's cwnd capping to roughly 2% (200ms/10s). + * + * Note that flows need only pay 2% if they are busy sending over the last 10 + * seconds. Interactive applications (e.g., Web, RPCs, video chunks) often have + * natural silences or low-rate periods within 10 seconds where the rate is low + * enough for long enough to drain its queue in the bottleneck. We pick up + * these min RTT measurements opportunistically with our min_rtt filter. :-) + */ +static void bbr_update_min_rtt(struct sock *sk, const struct rate_sample *rs) +{ + struct tcp_sock *tp = tcp_sk(sk); + struct bbr *bbr = inet_csk_ca(sk); +//deprecated u32 rtt_prior = 0; + bool filter_expired; + + /* Track min RTT seen in the min_rtt_win_sec filter window: */ + filter_expired = after(tcp_time_stamp, + bbr->min_rtt_stamp + bbr_min_rtt_win_sec * HZ); + if (rs->rtt_us >= 0 && + (rs->rtt_us <= bbr->min_rtt_us || filter_expired)) { + bbr->min_rtt_us = rs->rtt_us; + bbr->min_rtt_stamp = tcp_time_stamp; +//deprecated bbr->rtt_us = rs->rtt_us; + } +//deprecated bbr->rtt_us = rs->rtt_us; +//deprecated rtt_prior = minmax_get(&bbr->max_rtt); +//deprecated bbr->rtt_us = min(bbr->rtt_us, rtt_prior); + +//deprecated minmax_running_max(&bbr->max_rtt, bbr_bw_rtts, bbr->rtt_cnt, rs->rtt_us); + + if (bbr_probe_rtt_mode_ms > 0 && filter_expired && + !bbr->idle_restart && bbr->mode != BBR_PROBE_RTT) { + bbr->mode = BBR_PROBE_RTT; /* dip, drain queue */ + bbr->pacing_gain = BBR_UNIT; + bbr->cwnd_gain = BBR_UNIT; + bbr_save_cwnd(sk); /* note cwnd so we can restore it */ + bbr->probe_rtt_done_stamp = 0; + } + + if (bbr->mode == BBR_PROBE_RTT) { + /* Ignore low rate samples during this mode. */ + tp->app_limited = + (tp->delivered + tcp_packets_in_flight(tp)) ? : 1; + /* Maintain min packets in flight for max(200 ms, 1 round). */ + if (!bbr->probe_rtt_done_stamp && + tcp_packets_in_flight(tp) <= bbr_cwnd_min_target) { + bbr->probe_rtt_done_stamp = tcp_time_stamp + + msecs_to_jiffies(bbr_probe_rtt_mode_ms >> 1); + bbr->probe_rtt_round_done = 0; + bbr->next_rtt_delivered = tp->delivered; + } else if (bbr->probe_rtt_done_stamp) { + if (bbr->round_start) + bbr->probe_rtt_round_done = 1; + if (bbr->probe_rtt_round_done && + after(tcp_time_stamp, bbr->probe_rtt_done_stamp)) { + bbr->min_rtt_stamp = tcp_time_stamp; + bbr->restore_cwnd = 1; /* snap to prior_cwnd */ + bbr_reset_mode(sk); + } + } + } + bbr->idle_restart = 0; +} + +static void bbr_update_model(struct sock *sk, const struct rate_sample *rs) +{ + bbr_update_bw(sk, rs); + bbr_update_cycle_phase(sk, rs); + bbr_check_full_bw_reached(sk, rs); + bbr_check_drain(sk, rs); + bbr_update_min_rtt(sk, rs); +} + +static void bbr_main(struct sock *sk, const struct rate_sample *rs) +{ + struct bbr *bbr = inet_csk_ca(sk); + u32 bw; + + bbr_update_model(sk, rs); + + bw = bbr_bw(sk); + bbr_set_pacing_rate(sk, bw, bbr->pacing_gain); + bbr_set_tso_segs_goal(sk); + bbr_set_cwnd(sk, rs, rs->acked_sacked, bw, bbr->cwnd_gain); +} + +static void bbr_init(struct sock *sk) +{ + struct tcp_sock *tp = tcp_sk(sk); + struct bbr *bbr = inet_csk_ca(sk); + u64 bw; + + bbr->prior_cwnd = 0; + bbr->tso_segs_goal = 0; /* default segs per skb until first ACK */ + bbr->rtt_cnt = 0; + bbr->next_rtt_delivered = 0; + bbr->prev_ca_state = TCP_CA_Open; + bbr->packet_conservation = 0; + + bbr->probe_rtt_done_stamp = 0; + bbr->probe_rtt_round_done = 0; + bbr->min_rtt_us = tcp_min_rtt(tp); + bbr->min_rtt_stamp = tcp_time_stamp; + + minmax_reset(&bbr->bw, bbr->rtt_cnt, 0); /* init max bw to 0 */ + + /* Initialize pacing rate to: high_gain * init_cwnd / RTT. */ + bw = (u64)tp->snd_cwnd * BW_UNIT; + do_div(bw, (tp->srtt_us >> 3) ? : USEC_PER_MSEC); + sk->sk_pacing_rate = 0; /* force an update of sk_pacing_rate */ + bbr_set_pacing_rate(sk, bw, bbr_high_gain); + + bbr->restore_cwnd = 0; + bbr->round_start = 0; + bbr->idle_restart = 0; + bbr->full_bw = 0; + bbr->full_bw_cnt = 0; + bbr->cycle_mstamp.v64 = 0; + bbr->cycle_idx = 0; + bbr_reset_lt_bw_sampling(sk); + bbr_reset_startup_mode(sk); +} + +static u32 bbr_sndbuf_expand(struct sock *sk) +{ + /* Provision 3 * cwnd since BBR may slow-start even during recovery. */ + return 3; +} + +/* In theory BBR does not need to undo the cwnd since it does not + * always reduce cwnd on losses (see bbr_main()). Keep it for now. + */ +static u32 bbr_undo_cwnd(struct sock *sk) +{ + return tcp_sk(sk)->snd_cwnd; +} + +/* Entering loss recovery, so save cwnd for when we exit or undo recovery. */ +static u32 bbr_ssthresh(struct sock *sk) +{ + bbr_save_cwnd(sk); + return TCP_INFINITE_SSTHRESH; /* BBR does not use ssthresh */ +} + +static size_t bbr_get_info(struct sock *sk, u32 ext, int *attr, + union tcp_cc_info *info) +{ + if (ext & (1 << (INET_DIAG_BBRINFO - 1)) || + ext & (1 << (INET_DIAG_VEGASINFO - 1))) { + struct tcp_sock *tp = tcp_sk(sk); + struct bbr *bbr = inet_csk_ca(sk); + u64 bw = bbr_bw(sk); + + bw = bw * tp->mss_cache * USEC_PER_SEC >> BW_SCALE; + memset(&info->bbr, 0, sizeof(info->bbr)); + info->bbr.bbr_bw_lo = (u32)bw; + info->bbr.bbr_bw_hi = (u32)(bw >> 32); + info->bbr.bbr_min_rtt = bbr->min_rtt_us; + info->bbr.bbr_pacing_gain = bbr->pacing_gain; + info->bbr.bbr_cwnd_gain = bbr->cwnd_gain; + *attr = INET_DIAG_BBRINFO; + return sizeof(info->bbr); + } + return 0; +} + +static void bbr_set_state(struct sock *sk, u8 new_state) +{ + struct bbr *bbr = inet_csk_ca(sk); + + if (new_state == TCP_CA_Loss) { + struct rate_sample rs = { .losses = 1 }; + + bbr->prev_ca_state = TCP_CA_Loss; + bbr->full_bw = 0; + bbr->round_start = 1; /* treat RTO like end of a round */ + bbr_lt_bw_sampling(sk, &rs); + } +} + +static struct tcp_congestion_ops tcp_bbr_cong_ops __read_mostly = { + .flags = TCP_CONG_NON_RESTRICTED, + .name = "tsunami", + .owner = THIS_MODULE, + .init = bbr_init, + .cong_control = bbr_main, + .sndbuf_expand = bbr_sndbuf_expand, + .undo_cwnd = bbr_undo_cwnd, + .cwnd_event = bbr_cwnd_event, + .ssthresh = bbr_ssthresh, + .tso_segs_goal = bbr_tso_segs_goal, + .get_info = bbr_get_info, + .set_state = bbr_set_state, +}; + +static int __init bbr_register(void) +{ + BUILD_BUG_ON(sizeof(struct bbr) > ICSK_CA_PRIV_SIZE); + return tcp_register_congestion_control(&tcp_bbr_cong_ops); +} + +static void __exit bbr_unregister(void) +{ + tcp_unregister_congestion_control(&tcp_bbr_cong_ops); +} + +module_init(bbr_register); +module_exit(bbr_unregister); + +MODULE_AUTHOR("Van Jacobson "); +MODULE_AUTHOR("Neal Cardwell "); +MODULE_AUTHOR("Yuchung Cheng "); +MODULE_AUTHOR("Soheil Hassas Yeganeh "); +MODULE_LICENSE("Dual BSD/GPL"); +MODULE_DESCRIPTION("TCP BBR (Bottleneck Bandwidth and RTT)"); \ No newline at end of file diff --git a/package/ctcgfw/cups-bjnp/Makefile b/package/ctcgfw/cups-bjnp/Makefile new file mode 100644 index 0000000000..0c8a592b4b --- /dev/null +++ b/package/ctcgfw/cups-bjnp/Makefile @@ -0,0 +1,48 @@ +# +# Copyright (C) 2010 OpenWrt.org +# +# This is free software, licensed under the GNU General Public License v2. +# See /LICENSE for more information. +# + +include $(TOPDIR)/rules.mk + +PKG_NAME:=cups-bjnp +PKG_VERSION:=2.0 +PKG_RELEASE:=1 + +PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz +PKG_SOURCE_URL:=@SF/cups-bjnp +PKG_MD5SUM:=8a337091b65abfdd70191129efefb9b3 + +PKG_BUILD_DEPENDS:=cups + +include $(INCLUDE_DIR)/package.mk + +define Package/cups-bjnp + SECTION:=net + CATEGORY:=Network + TITLE:=BJNP protocol backend for CUPS + URL:=http://sourceforge.net/projects/cups-bjnp/ + DEPENDS:=cups + SUBMENU:=Printing +endef + +define Package/cups-bjnp/description +CUPS backend for the canon printers using the proprietary USB over +IP BJNP protocol. This backend allows Cups to print over the network +to a Canon printer. It currently supports Cups 1.2 and Cups 1.3 and +is designed by reverse engineering. +endef + +CONFIGURE_ARGS += --with-cupsbackenddir=$(STAGING_DIR)/usr/include/cups + +TARGET_CFLAGS+=-Wl,-rpath-link=$(STAGING_DIR)/usr/lib + +define Package/cups-bjnp/install + $(INSTALL_DIR) $(1)/usr/lib/cups/backend + $(INSTALL_BIN) $(PKG_BUILD_DIR)/bjnp $(1)/usr/lib/cups/backend +endef + + +$(eval $(call BuildPackage,cups-bjnp)) diff --git a/package/ctcgfw/cups/Makefile b/package/ctcgfw/cups/Makefile new file mode 100644 index 0000000000..62df2e608e --- /dev/null +++ b/package/ctcgfw/cups/Makefile @@ -0,0 +1,321 @@ +# +# Copyright (C) 2006-2016 OpenWrt.org +# Copyright (C) 2016 lede-project.org +# +# This is free software, licensed under the GNU General Public License v2. +# See /LICENSE for more information. +# + +include $(TOPDIR)/rules.mk + +PKG_NAME:=cups +PKG_VERSION:=2.1.4 +PKG_RELEASE:=1 + +PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION)-source.tar.gz +PKG_SOURCE_URL:=http://www.cups.org/software/$(PKG_VERSION) +PKG_MD5SUM:=9f9bf6e3b9c20a3519b4dc409666d6e7 + +TARGET_LDFLAGS+=-Wl,-rpath-link=$(STAGING_DIR)/usr/lib + +include $(INCLUDE_DIR)/package.mk + +define Package/cups/Default + URL:=http://www.cups.org/ + SUBMENU:=Printing +endef + +define Package/cups +$(call Package/cups/Default) + SECTION:=net + CATEGORY:=Network + DEPENDS:=+libcups +libcupsmime +libcupscgi +libcupsppdc +libusb-1.0 + TITLE:=Common UNIX Printing System (daemon) +endef + +define Package/cups/description + Common UNIX Printing System (daemon) +endef + +define Package/cups/conffiles +/etc/cups/classes.conf +/etc/cups/cupsd.conf +/etc/cups/printers.conf +endef + +define Package/cups-bsd +$(call Package/cups/Default) + SECTION:=net + CATEGORY:=Network + DEPENDS:=+libcups + TITLE:=Common UNIX Printing System - BSD commands (old) +endef + +define Package/cups-bsd/description + Common UNIX Printing System - BSD commands (old) +endef + +define Package/cups-client +$(call Package/cups/Default) + SECTION:=net + CATEGORY:=Network + DEPENDS:=+libcups +libcupsimage +libcupsmime + TITLE:=Common UNIX Printing System - Client commands +endef + +define Package/cups-client/conffiles +/etc/cups/client.conf +endef + +define Package/cups-client/description + Common UNIX Printing System - Client commands +endef + +define Package/cups-filters +$(call Package/cups/Default) + SECTION:=net + CATEGORY:=Network + DEPENDS:=+libcupsimage + TITLE:=Common UNIX Printing System - Filter +endef + +define Package/cups-filters/description + Common UNIX Printing System - Filter +endef + +define Package/cups-ppdc +$(call Package/cups/Default) + SECTION:=net + CATEGORY:=Network + DEPENDS:=+libcupsppdc + TITLE:=Common UNIX Printing System - PPDC utils +endef + +define Package/cups-ppdc/description + Common UNIX Printing System - PPDC utils +endef + +define Package/libcups +$(call Package/cups/Default) + SECTION:=libs + CATEGORY:=Libraries + DEPENDS:=+zlib +libpthread +libpng +libjpeg + TITLE:=Common UNIX Printing System - Core library +endef + +define Package/libcups/description + Common UNIX Printing System - Core library +endef + +define Package/libcupscgi +$(call Package/cups/Default) + SECTION:=libs + CATEGORY:=Libraries + DEPENDS:=+libcups + TITLE:=Common UNIX Printing System - CGI library +endef + +define Package/libcupscgi/description + Common UNIX Printing System - CGI library +endef + +define Package/libcupsimage +$(call Package/cups/Default) + SECTION:=libs + CATEGORY:=Libraries + DEPENDS:=+libcups + TITLE:=Common UNIX Printing System - Image library +endef + +define Package/libcupsimage/description + Common UNIX Printing System - Image library +endef + +define Package/libcupsmime +$(call Package/cups/Default) + SECTION:=libs + CATEGORY:=Libraries + DEPENDS:=+libcups + TITLE:=Common UNIX Printing System - MIME library +endef + +define Package/libcupsmime/description + Common UNIX Printing System - MIME library +endef + +define Package/libcupsppdc +$(call Package/cups/Default) + SECTION:=libs + CATEGORY:=Libraries + DEPENDS:=+libcups +libstdcpp + TITLE:=Common UNIX Printing System - PPDC library +endef + +define Package/libcupsppdc/description + Common UNIX Printing System - PPDC library +endef + +define Build/Configure + $(call Build/Configure/Default, \ + --with-cups-user="nobody" \ + --with-cups-group="nogroup" \ + --with-system-groups="root" \ + --with-pdftops="none" \ + --without-perl \ + --without-python \ + --without-php \ + --enable-default-shared \ + --enable-shared \ + --enable-image \ + --enable-libusb \ + --disable-acl \ + --disable-dnssd \ + --disable-dbus \ + --disable-avahi \ + --disable-launchd \ + --disable-ldap \ + --disable-pam \ + --disable-slp \ + --disable-gnutls \ + --disable-openssl \ + --disable-cdsassl \ + --disable-ssl \ + --disable-gssapi \ + --disable-tiff, \ + UNAME="Linux" \ + LIBS="$(TARGET_LDFLAGS) -lz -lpng -ljpeg" \ + ) +endef + +define Build/Compile + $(MAKE) -C $(PKG_BUILD_DIR) \ + $(TARGET_CONFIGURE_OPTS) \ + DSTROOT="$(PKG_INSTALL_DIR)" \ + STRIP="/bin/true" \ + all install +endef + +define Package/cups/install + rm -rf $(1)/etc/cups + $(INSTALL_DIR) $(1)/etc/cups + $(CP) $(PKG_INSTALL_DIR)/etc/cups/* $(1)/etc/cups/ + rm -rf $(1)/etc/cups/certs + ln -sf /tmp $(1)/etc/cups/certs + rm -f $(1)/usr/bin/cups-config + $(INSTALL_DIR) $(1)/usr/lib/cups + $(CP) $(PKG_INSTALL_DIR)/usr/lib/cups/backend $(1)/usr/lib/cups + $(CP) $(PKG_INSTALL_DIR)/usr/lib/cups/cgi-bin $(1)/usr/lib/cups + $(CP) $(PKG_INSTALL_DIR)/usr/lib/cups/daemon $(1)/usr/lib/cups + $(CP) $(PKG_INSTALL_DIR)/usr/lib/cups/driver $(1)/usr/lib/cups + $(CP) $(PKG_INSTALL_DIR)/usr/lib/cups/monitor $(1)/usr/lib/cups + $(INSTALL_DIR) $(1)/usr/lib/cups/filter + $(CP) $(PKG_INSTALL_DIR)/usr/lib/cups/filter/{commandtops,pstops} \ + $(PKG_INSTALL_DIR)/usr/lib/cups/filter/gziptoany \ + $(1)/usr/lib/cups/filter + $(INSTALL_DIR) $(1)/usr/share/cups/templates + $(CP) $(PKG_INSTALL_DIR)/usr/share/cups/templates/*.tmpl \ + $(1)/usr/share/cups/templates/ + $(INSTALL_DIR) $(1)/usr/share/cups/mime + $(CP) $(PKG_INSTALL_DIR)/usr/share/cups/mime/* $(1)/usr/share/cups/mime/ + ### Do install docs: cups web interface relies on them + $(INSTALL_DIR) $(1)/usr/share/doc/cups + $(CP) $(PKG_INSTALL_DIR)/usr/share/doc/cups/*.*html \ + $(1)/usr/share/doc/cups/ + $(CP) $(PKG_INSTALL_DIR)/usr/share/doc/cups/*.css \ + $(1)/usr/share/doc/cups/ + $(CP) $(PKG_INSTALL_DIR)/usr/share/doc/cups/*.txt \ + $(1)/usr/share/doc/cups/ + $(CP) $(PKG_INSTALL_DIR)/usr/share/doc/cups/images \ + $(1)/usr/share/doc/cups/ + $(INSTALL_DIR) $(1)/usr/sbin + # overwrite default config with our own + $(CP) ./files/etc/cups/* $(1)/etc/cups/ + # install initscript with priority 60 + $(INSTALL_DIR) $(1)/etc/init.d + $(INSTALL_BIN) ./files/cupsd.init $(1)/etc/init.d/cupsd + $(INSTALL_BIN) \ + $(PKG_INSTALL_DIR)/usr/sbin/{cupsctl,cupsd} \ + $(1)/usr/sbin/ + # needed for cups to find usb printers per http://wiki.openwrt.org/doc/howto/cups.server + chmod 700 $(1)/usr/lib/cups/backend/usb +endef + +define Package/cups-bsd/install + $(INSTALL_DIR) $(1)/usr/bin + $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/bin/{lprm,lpq,lpr} $(1)/usr/bin/ + $(INSTALL_DIR) $(1)/usr/sbin + $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/sbin/lpc $(1)/usr/sbin/ +endef + +define Package/cups-client/install + $(INSTALL_DIR) $(1)/usr/bin + $(INSTALL_BIN) \ + $(PKG_INSTALL_DIR)/usr/bin/{lp,cancel,cupstestppd,cupstestdsc} \ + $(PKG_INSTALL_DIR)/usr/bin/{ipptool,lpoptions,lpstat} \ + $(1)/usr/bin/ + $(INSTALL_DIR) $(1)/usr/sbin + $(INSTALL_BIN) \ + $(PKG_INSTALL_DIR)/usr/sbin/{cupsaccept,cupsaddsmb,cupsfilter} \ + $(PKG_INSTALL_DIR)/usr/sbin/{lpadmin,lpinfo,lpmove} \ + $(1)/usr/sbin/ + (cd $(1)/usr/sbin; ln -sf cupsaccept accept; ln -sf cupsaccept cupsenable; ln -sf cupsaccept cupsdisable; ln -sf cupsaccept reject; ln -sf cupsaccept cupsreject;) +endef + +define Package/cups-filters/install + $(INSTALL_DIR) $(1)/usr/lib/cups/filter + $(CP) $(PKG_INSTALL_DIR)/usr/lib/cups/filter/{commandtops,gziptoany,pstops,rastertoepson,rastertohp,rastertolabel,rastertopwg} \ + $(1)/usr/lib/cups/filter + (cd $(1)/usr/lib/cups/filter; ln -sf rastertolabel rastertodymo;) +endef + +define Package/cups-ppdc/install + $(INSTALL_DIR) $(1)/usr/bin + $(INSTALL_BIN) \ + $(PKG_INSTALL_DIR)/usr/bin/{ppdc,ppdhtml,ppdi,ppdmerge,ppdpo} \ + $(1)/usr/bin/ +endef + +define Package/libcups/install + $(INSTALL_DIR) $(1)/usr/lib + $(CP) $(PKG_INSTALL_DIR)/usr/lib/libcups.so* $(1)/usr/lib/ +endef + +define Package/libcupscgi/install + $(INSTALL_DIR) $(1)/usr/lib + $(CP) $(PKG_INSTALL_DIR)/usr/lib/libcupscgi.so* $(1)/usr/lib/ +endef + +define Package/libcupsimage/install + $(INSTALL_DIR) $(1)/usr/lib + $(CP) $(PKG_INSTALL_DIR)/usr/lib/libcupsimage.so* $(1)/usr/lib/ +endef + +define Package/libcupsmime/install + $(INSTALL_DIR) $(1)/usr/lib + $(CP) $(PKG_INSTALL_DIR)/usr/lib/libcupsmime.so* $(1)/usr/lib/ +endef + +define Package/libcupsppdc/install + $(INSTALL_DIR) $(1)/usr/lib + $(CP) $(PKG_INSTALL_DIR)/usr/lib/libcupsppdc.so* $(1)/usr/lib/ +endef + +define Build/InstallDev + $(INSTALL_DIR) $(2)/bin + $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/bin/cups-config $(2)/bin/ + $(INSTALL_DIR) $(1)/usr/include + $(CP) $(PKG_INSTALL_DIR)/usr/include/cups $(1)/usr/include/ + $(INSTALL_DIR) $(1)/usr/lib + $(CP) $(PKG_INSTALL_DIR)/usr/lib/libcups*.so* $(1)/usr/lib/ +endef + +$(eval $(call BuildPackage,cups)) +$(eval $(call BuildPackage,libcups)) +$(eval $(call BuildPackage,libcupscgi)) +$(eval $(call BuildPackage,libcupsimage)) +$(eval $(call BuildPackage,libcupsmime)) +$(eval $(call BuildPackage,libcupsppdc)) +$(eval $(call BuildPackage,cups-bsd)) +$(eval $(call BuildPackage,cups-client)) +$(eval $(call BuildPackage,cups-filters)) +$(eval $(call BuildPackage,cups-ppdc)) diff --git a/package/ctcgfw/cups/files/cupsd.init b/package/ctcgfw/cups/files/cupsd.init new file mode 100755 index 0000000000..e5f00da9a4 --- /dev/null +++ b/package/ctcgfw/cups/files/cupsd.init @@ -0,0 +1,19 @@ +#!/bin/sh /etc/rc.common +# Copyright (C) 2006-2011 OpenWrt.org + +START=50 + +start() { + mkdir -m 0755 -p /var/cache/cups + mkdir -m 0755 -p /var/cups + mkdir -m 0755 -p /var/spool/cups/tmp + service_start /usr/sbin/cupsd +} + +stop() { + service_stop /usr/sbin/cupsd +} + +reload() { + service_reload /usr/sbin/cupsd +} diff --git a/package/ctcgfw/cups/files/etc/cups/classes.conf b/package/ctcgfw/cups/files/etc/cups/classes.conf new file mode 100644 index 0000000000..15afda75a2 --- /dev/null +++ b/package/ctcgfw/cups/files/etc/cups/classes.conf @@ -0,0 +1,7 @@ +######################################################################## +# # +# This is a sample class configuration file. This file is included # +# from the main configuration file (cups.conf) and lists all of the # +# printer classes known to the system. # +# # +######################################################################## diff --git a/package/ctcgfw/cups/files/etc/cups/client.conf b/package/ctcgfw/cups/files/etc/cups/client.conf new file mode 100644 index 0000000000..c8d9f910ed --- /dev/null +++ b/package/ctcgfw/cups/files/etc/cups/client.conf @@ -0,0 +1,9 @@ +######################################################################## +# # +# This is the CUPS client configuration file. This file is used to # +# define client-specific parameters, such as the default server or # +# default encryption settings. # +# # +######################################################################## + +Encryption Never diff --git a/package/ctcgfw/cups/files/etc/cups/cupsd.conf b/package/ctcgfw/cups/files/etc/cups/cupsd.conf new file mode 100644 index 0000000000..48c4188386 --- /dev/null +++ b/package/ctcgfw/cups/files/etc/cups/cupsd.conf @@ -0,0 +1,58 @@ +######################################################################## +# # +# This is the CUPS configuration file. If you are familiar with # +# Apache or any of the other popular web servers, we've followed the # +# same format. Any configuration variable used here has the same # +# semantics as the corresponding variable in Apache. If we need # +# different functionality then a different name is used to avoid # +# confusion... # +# # +######################################################################## + + +AccessLog syslog +ErrorLog syslog +LogLevel info +PageLog syslog +PreserveJobHistory No +PreserveJobFiles No +AutoPurgeJobs Yes +MaxJobs 25 +MaxPrinterHistory 10 +#Printcap /etc/printcap +#PrintcapFormat BSD +RequestRoot /var/cups +#RemoteRoot remroot +#User nobody +#Group nogroup +# root permissions required to make cups work with the usb backend +User root +Group root +RIPCache auto +TempDir /var/cups +Port 631 +HostNameLookups On +KeepAlive On +# No: "BrowseOrder" "BrowseAllow" "BrowseRemoteProtocols" +Browsing Yes +BrowsingWebIF Yes +BrowseLocalProtocols DNSSD +DefaultShared Yes +WebInterface no +Listen /var/run/cups/cups.sock + +ServerAlias * + + +Order Allow,Deny +Allow From 127.0.0.1 +Allow From 192.168.1.0/24 + + + +AuthType Basic +AuthClass System +Order Allow,Deny +Allow From 127.0.0.1 +Allow From 192.168.1.0/24 + diff --git a/package/ctcgfw/cups/files/etc/cups/printers.conf b/package/ctcgfw/cups/files/etc/cups/printers.conf new file mode 100644 index 0000000000..88bba1b133 --- /dev/null +++ b/package/ctcgfw/cups/files/etc/cups/printers.conf @@ -0,0 +1,23 @@ + +Info USB Printer +Location +DeviceURI usb:/dev/usb/lp0 +State Idle +Accepting Yes +JobSheets none none +QuotaPeriod 0 +PageLimit 0 +KLimit 0 + + + +Info Parallel Port Printer +Location +DeviceURI parallel:/dev/printers/0 +State Idle +Accepting Yes +JobSheets none none +QuotaPeriod 0 +PageLimit 0 +KLimit 0 + diff --git a/package/ctcgfw/cups/patches/100-target.patch b/package/ctcgfw/cups/patches/100-target.patch new file mode 100644 index 0000000000..571cce1a69 --- /dev/null +++ b/package/ctcgfw/cups/patches/100-target.patch @@ -0,0 +1,11 @@ +--- a/configure ++++ b/configure +@@ -5896,7 +5896,7 @@ fi + + case "$COMPONENTS" in + all) +- BUILDDIRS="filter backend berkeley cgi-bin monitor notifier ppdc scheduler systemv conf data desktop locale man doc examples templates" ++ BUILDDIRS="filter backend berkeley cgi-bin monitor ppdc scheduler systemv conf data desktop locale doc examples templates" + ;; + + core) diff --git a/package/ctcgfw/cups/patches/140-uname.patch b/package/ctcgfw/cups/patches/140-uname.patch new file mode 100644 index 0000000000..3261de6187 --- /dev/null +++ b/package/ctcgfw/cups/patches/140-uname.patch @@ -0,0 +1,11 @@ +--- a/configure ++++ b/configure +@@ -1966,7 +1966,7 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu + + + +-uname=`uname` ++uname=${UNAME:-`uname`} + uversion=`uname -r | sed -e '1,$s/^[^0-9]*\([0-9]*\)\.\([0-9]*\).*/\1\2/'` + uarch=`uname -m` + diff --git a/package/ctcgfw/cups/patches/150-64bit_host_fix.patch b/package/ctcgfw/cups/patches/150-64bit_host_fix.patch new file mode 100644 index 0000000000..db46c44268 --- /dev/null +++ b/package/ctcgfw/cups/patches/150-64bit_host_fix.patch @@ -0,0 +1,33 @@ +--- a/config-scripts/cups-directories.m4 ++++ b/config-scripts/cups-directories.m4 +@@ -104,7 +104,7 @@ if test "$libdir" = "\${exec_prefix}/lib + case "$uname" in + Linux*) + if test -d /usr/lib64 -a ! -d /usr/lib64/fakeroot; then +- libdir="$exec_prefix/lib64" ++ libdir="$exec_prefix/lib" + fi + ;; + esac +--- a/configure ++++ b/configure +@@ -5998,7 +5998,7 @@ if test "$libdir" = "\${exec_prefix}/lib + case "$uname" in + Linux*) + if test -d /usr/lib64 -a ! -d /usr/lib64/fakeroot; then +- libdir="$exec_prefix/lib64" ++ libdir="$exec_prefix/lib" + fi + ;; + esac +--- a/cups-config.in ++++ b/cups-config.in +@@ -50,7 +50,7 @@ else + CFLAGS="$CFLAGS -I$includedir" + fi + +- if test $libdir != /usr/lib -a $libdir != /usr/lib32 -a $libdir != /usr/lib64; then ++ if test $libdir != /usr/lib -a $libdir != /usr/lib -a $libdir != /usr/lib; then + LDFLAGS="$LDFLAGS -L$libdir" + fi + fi diff --git a/package/ctcgfw/cups/patches/160-ppdc.patch b/package/ctcgfw/cups/patches/160-ppdc.patch new file mode 100644 index 0000000000..b92780a10b --- /dev/null +++ b/package/ctcgfw/cups/patches/160-ppdc.patch @@ -0,0 +1,17 @@ +--- a/ppdc/Makefile ++++ b/ppdc/Makefile +@@ -238,13 +238,7 @@ framedhelp: + + genstrings: genstrings.o libcupsppdc.a ../cups/$(LIBCUPSSTATIC) \ + sample.drv ../data/media.defs +- echo Linking $@... +- $(CXX) $(ARCHFLAGS) $(LDFLAGS) -o genstrings genstrings.o \ +- libcupsppdc.a ../cups/$(LIBCUPSSTATIC) $(LIBGSSAPI) $(SSLLIBS) \ +- $(DNSSDLIBS) $(COMMONLIBS) $(LIBZ) +- echo Generating localization strings... +- ./genstrings >sample.c +- ++ echo Not Linking $@... + + # + # ppdc, the PPD compiler. diff --git a/package/ctcgfw/filebrowser/Makefile b/package/ctcgfw/filebrowser/Makefile new file mode 100644 index 0000000000..a4d4723dce --- /dev/null +++ b/package/ctcgfw/filebrowser/Makefile @@ -0,0 +1,77 @@ +# +# Copyright (C) 2014-2018 OpenWrt-dist +# Copyright (C) 2019 [CTCGFW] Project OpenWRT +# +# This is free software, licensed under the GNU General Public License v3. +# See /LICENSE for more information. +# + +include $(TOPDIR)/rules.mk + +PKG_NAME:=filebrowser +PKG_VERSION:=snapshot +PKG_RELEASE:=6ce44f7 + +PKG_LICENSE:=GPLv3 +PKG_MAINTAINER:=[CTCGFW] Project OpenWRT + +ifeq ($(ARCH),x86_64) + PKG_ARCH_filebrowser:=linux_amd64 +endif +ifeq ($(ARCH),i386) + PKG_ARCH_filebrowser:=linux_386 +endif +ifeq ($(ARCH),mipsel) + PKG_ARCH_filebrowser:=linux_mipsle +endif +ifeq ($(ARCH),mips) + PKG_ARCH_filebrowser:=linux_mips +endif +ifeq ($(ARCH),arm) +ifeq ($(BOARD),kirkwood) + PKG_ARCH_filebrowser:=linux_arm5 +else ifeq ($(BOARD),bcm53xx) + PKG_ARCH_filebrowser:=linux_arm5 +else + PKG_ARCH_filebrowser:=linux_arm7 +endif +endif +ifeq ($(ARCH),aarch64) + PKG_ARCH_filebrowser:=linux_arm64 +endif + +PKG_SOURCE:=filebrowser_$(PKG_ARCH_filebrowser).tar.gz +PKG_SOURCE_URL:=https://package.project-openwrt.eu.org/utils/filebrowser/$(PKG_RELEASE)/ +PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)-$(PKG_VERSION)-$(PKG_RELEASE) +PKG_HASH:=skip + +include $(INCLUDE_DIR)/package.mk + +define Package/$(PKG_NAME) + SECTION:=utils + CATEGORY:=Utilities + TITLE:=OpenWrt Support for FileBrowser. + URL:=https://github.com/filebrowser/filebrowser +endef + +define Package/$(PKG_NAME)/description +OpenWrt Support for FileBrowser. +endef + +define Build/Prepare + tar -xzf $(DL_DIR)/$(PKG_SOURCE) -C $(PKG_BUILD_DIR) +endef + +define Build/Configure +endef + +define Build/Compile + chmod 0755 $(PKG_BUILD_DIR)/filebrowser +endef + +define Package/$(PKG_NAME)/install + $(INSTALL_DIR) $(1)/usr/bin + $(INSTALL_BIN) $(PKG_BUILD_DIR)/filebrowser $(1)/usr/bin/filebrowser +endef + +$(eval $(call BuildPackage,$(PKG_NAME))) diff --git a/package/ctcgfw/iptvhelper/Makefile b/package/ctcgfw/iptvhelper/Makefile new file mode 100644 index 0000000000..7ecad4eedd --- /dev/null +++ b/package/ctcgfw/iptvhelper/Makefile @@ -0,0 +1,50 @@ +# Copyright 2019 Shun Li +# Licensed to the public under the GNU General Public License v3. + +include $(TOPDIR)/rules.mk + +PKG_NAME:=iptvhelper +PKG_VERSION:=0.1.1 +PKG_RELEASE:=1 +PKG_MAINTAINER:=Shun Li +PKG_LICENSE:=GPL-3.0 + +include $(INCLUDE_DIR)/package.mk + +define Package/iptvhelper + SECTION:=net + CATEGORY:=Network + SUBMENU:=Routing and Redirection + DEPENDS:= \ + +ipset \ + +iptables + TITLE:=Scripts for configure IPTV easily + MAINTAINER:=Shun Li + PKGARCH:=all +endef + +define Package/iptvhelper/description +Scripts for configure IPTV easily +endef + +define Package/iptvhelper/conffiles +/etc/config/iptvhelper +/etc/firewall.iptvhelper +endef + +define Build/Compile +endef + +define Package/iptvhelper/postinst +#!/bin/sh +endef + +define Package/iptvhelper/postrm +#!/bin/sh +endef + +define Package/iptvhelper/install +$(CP) ./files/* $(1) +endef + +$(eval $(call BuildPackage,iptvhelper)) \ No newline at end of file diff --git a/package/ctcgfw/iptvhelper/files/etc/config/iptvhelper b/package/ctcgfw/iptvhelper/files/etc/config/iptvhelper new file mode 100644 index 0000000000..bad77043cd --- /dev/null +++ b/package/ctcgfw/iptvhelper/files/etc/config/iptvhelper @@ -0,0 +1,8 @@ +config tvbox 'default' + option disabled '1' + option respawn '1' + option mac '00:00:00:00:00:00' + option ipset '1' + option dns_redir '1' + + diff --git a/package/ctcgfw/iptvhelper/files/etc/firewall.iptvhelper b/package/ctcgfw/iptvhelper/files/etc/firewall.iptvhelper new file mode 100755 index 0000000000..edf6ad7f6c --- /dev/null +++ b/package/ctcgfw/iptvhelper/files/etc/firewall.iptvhelper @@ -0,0 +1,2 @@ +#!/bin/sh +test -s "/etc/init.d/iptvhelper" && /etc/init.d/iptvhelper reload \ No newline at end of file diff --git a/package/ctcgfw/iptvhelper/files/etc/init.d/iptvhelper b/package/ctcgfw/iptvhelper/files/etc/init.d/iptvhelper new file mode 100755 index 0000000000..e189cda15d --- /dev/null +++ b/package/ctcgfw/iptvhelper/files/etc/init.d/iptvhelper @@ -0,0 +1,127 @@ +#!/bin/sh /etc/rc.common +# Copyright 2019 Shun Li +# Licensed to the public under the GNU General Public License v3. + +START=95 +USE_PROCD=1 + +_ipt() { + cmd="$(echo "$@" | sed 's|-A|-D|g;s|-I|-D|g')" + while iptables $cmd &>/dev/null; do + : + done + iptables $@ +} + +destroy_iptv_ipset() { + for ip_set in $(ipset list | awk '/iptvhelper/ {print $2}'); do ipset destroy $ip_set; done +} + +clear_iptv_rules() { + iptables-save --counters | grep -v "iptvhelper-rule" | iptables-restore --counters +} + +append_arg() { + local cfg="$1" + local var="$2" + local opt="$3" + local def="$4" + local val + + config_get val "$cfg" "$var" + [ -n "$val" -o -n "$def" ] && procd_append_param command $opt "${val:-$def}" +} + +append_bool() { + local cfg="$1" + local var="$2" + local opt="$3" + local def="$4" + local val + + config_get_bool val "$cfg" "$var" "$def" + [ "$val" = 1 ] && procd_append_param command "$opt" +} + +start_instance() { + local cfg="$1" + local aux + + config_get_bool aux "$cfg" 'disabled' '0' + [ "$aux" = 1 ] && return 1 + + logger "iptvhelper.$cfg: instance starting" + + local IPTV_MAC + local IPTV_DNS_REDIR + local IPTV_IPSET + + config_get IPTV_MAC $cfg mac + config_get IPTV_DNS_REDIR $cfg dns_redir + config_get IPTV_IPSET $cfg ipset + logger "iptvhelper.$cfg: topbox mac=$IPTV_MAC" + + if [[ $IPTV_DNS_REDIR == '1' ]]; then + logger "iptvhelper.$cfg: topbox DNS redierct enabled" + _ipt -t nat -A PREROUTING -m mac --mac-source $IPTV_MAC -m comment --comment "iptvhelper-rule" -p udp --dport 53 -j REDIRECT --to-ports 53 + fi + + if [[ $IPTV_IPSET='1' ]]; then + logger "iptvhelper.$cfg: topbox ipset enabled" + if ! ipset -q list iptvhelper_$cfg >/dev/null; then + ipset create iptvhelper_$cfg nethash + fi + _ipt -t nat -I PREROUTING -m mac --mac-source $IPTV_MAC -m comment --comment "iptvhelper-rule" -m set ! --match-set iptvhelper_$cfg dst -m conntrack --ctstate NEW -j LOG --log-prefix "iptvhelper.$cfg:" + procd_open_instance + procd_set_param command /usr/sbin/iptvhelper.sh $cfg + config_get_bool aux "$cfg" 'respawn' '0' + [ "$aux" = 1 ] && procd_set_param respawn + procd_set_param pidfile /var/run/iptvhelper_$cfg.pid + procd_close_instance + fi +} + +service_triggers() { + procd_add_reload_trigger "iptvhelper" +} + +start_service() { + logger "iptvhelper: starting" + echo "iptvhelper: starting" + config_load iptvhelper + config_foreach start_instance tvbox + if uci -q show firewall >/dev/null; then + if ! uci -q get firewall.iptvhelper >/dev/null; then + uci -q batch <<-EOF >/dev/null + set firewall.iptvhelper=include + set firewall.iptvhelper.type='script' + set firewall.iptvhelper.path='/etc/firewall.iptvhelper' + set firewall.iptvhelper.family='any' + set firewall.iptvhelper.reload='1' + commit firewall + EOF + fi + fi +} + +stop_service() { + if uci -q show firewall >/dev/null; then + if uci -q get firewall.iptvhelper >/dev/null; then + uci delete firewall.iptvhelper + uci commit firewall + fi + fi + for pid in $(ps | grep -v awk | awk '/iptvhelper.sh/ {print $1}'); do kill -9 $pid; done + for pid in $(ps | grep -v awk | awk '/logread -e iptvhelper/ {print $1}'); do kill -9 $pid; done + clear_iptv_rules + destroy_iptv_ipset + logger "iptvhelper: stopped" + echo "iptvhelper: stopped" +} + +reload_service() { + logger "iptvhelper: reloading" + echo "iptvhelper: reloading" + stop + start +} diff --git a/package/ctcgfw/iptvhelper/files/usr/sbin/iptvhelper.sh b/package/ctcgfw/iptvhelper/files/usr/sbin/iptvhelper.sh new file mode 100755 index 0000000000..ca746b63cb --- /dev/null +++ b/package/ctcgfw/iptvhelper/files/usr/sbin/iptvhelper.sh @@ -0,0 +1,24 @@ +#!/bin/sh + +# Copyright 2019 Shun Li +# Licensed to the public under the GNU General Public License v3. + +add_to_set() { + local ip=$1 + local cfg=$2 + local subnet=$ip/24 + ping -W1 -c1 $ip &>/dev/null && return + if ! ipset -q test iptvhelper_$cfg $subnet; then + ipset add iptvhelper_$cfg $subnet + echo added $subnet to set iptvhelper_$cfg + fi +} + +echo $1 + +logread -e "iptvhelper\.$1" -f | + while read line; do + ip=$(echo "$line" | sed -r 's|.*DST=([0-9.]+).*|\1|') + echo requested $ip + add_to_set $ip $1 & + done diff --git a/package/ctcgfw/luci-app-adguardhome/Makefile b/package/ctcgfw/luci-app-adguardhome/Makefile new file mode 100644 index 0000000000..f3b3c35589 --- /dev/null +++ b/package/ctcgfw/luci-app-adguardhome/Makefile @@ -0,0 +1,75 @@ +# Copyright (C) 2018-2019 Lienol +# +# This is free software, licensed under the Apache License, Version 2.0 . +# + +include $(TOPDIR)/rules.mk + +PKG_NAME:=luci-app-adguardhome +PKG_VERSION:=1.8 +PKG_RELEASE:=11 + +PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME) + +include $(INCLUDE_DIR)/package.mk + +define Package/luci-app-adguardhome + SECTION:=luci + CATEGORY:=LuCI + SUBMENU:=3. Applications + TITLE:=LuCI app for adguardhome + PKG_MAINTAINER:= + PKGARCH:=all + DEPENDS:=+!wget&&!curl:wget +endef + +define Package/luci-app-adguardhome/description + LuCI support for adguardhome +endef + +define Build/Prepare +endef + +define Build/Compile +endef + +define Package/luci-app-adguardhome/conffiles +/usr/share/AdGuardHome/links.txt +/etc/config/AdGuardHome +endef + +define Package/luci-app-adguardhome/install + $(INSTALL_DIR) $(1)/usr/lib/lua/luci + cp -pR ./luasrc/* $(1)/usr/lib/lua/luci + $(INSTALL_DIR) $(1)/ + cp -pR ./root/* $(1)/ + $(INSTALL_DIR) $(1)/usr/lib/lua/luci/i18n + po2lmo ./po/zh-cn/AdGuardHome.po $(1)/usr/lib/lua/luci/i18n/AdGuardHome.zh-cn.lmo +endef + +define Package/luci-app-adguardhome/postinst +#!/bin/sh + /etc/init.d/AdGuardHome enable >/dev/null 2>&1 + enable=$(uci get AdGuardHome.AdGuardHome.enabled 2>/dev/null) + if [ "$enable" == "1" ]; then + /etc/init.d/AdGuardHome reload + fi + rm -f /tmp/luci-indexcache + rm -f /tmp/luci-modulecache/* +exit 0 +endef + +define Package/luci-app-adguardhome/prerm +#!/bin/sh +if [ -z "$${IPKG_INSTROOT}" ]; then + /etc/init.d/AdGuardHome disable + /etc/init.d/AdGuardHome stop +uci -q batch <<-EOF >/dev/null 2>&1 + delete ucitrack.@AdGuardHome[-1] + commit ucitrack +EOF +fi +exit 0 +endef + +$(eval $(call BuildPackage,luci-app-adguardhome)) diff --git a/package/ctcgfw/luci-app-adguardhome/luasrc/controller/AdGuardHome.lua b/package/ctcgfw/luci-app-adguardhome/luasrc/controller/AdGuardHome.lua new file mode 100644 index 0000000000..96da08a953 --- /dev/null +++ b/package/ctcgfw/luci-app-adguardhome/luasrc/controller/AdGuardHome.lua @@ -0,0 +1,127 @@ +module("luci.controller.AdGuardHome",package.seeall) +local fs=require"nixio.fs" +local http=require"luci.http" +local uci=require"luci.model.uci".cursor() +function index() +entry({"admin", "services", "AdGuardHome"},alias("admin", "services", "AdGuardHome", "base"),_("AdGuard Home"), 10).dependent = true +entry({"admin","services","AdGuardHome","base"},cbi("AdGuardHome/base"),_("Base Setting"),1).leaf = true +entry({"admin","services","AdGuardHome","log"},form("AdGuardHome/log"),_("Log"),2).leaf = true +entry({"admin","services","AdGuardHome","manual"},cbi("AdGuardHome/manual"),_("Manual Config"),3).leaf = true +entry({"admin","services","AdGuardHome","status"},call("act_status")).leaf=true +entry({"admin", "services", "AdGuardHome", "check"}, call("check_update")) +entry({"admin", "services", "AdGuardHome", "doupdate"}, call("do_update")) +entry({"admin", "services", "AdGuardHome", "getlog"}, call("get_log")) +entry({"admin", "services", "AdGuardHome", "dodellog"}, call("do_dellog")) +entry({"admin", "services", "AdGuardHome", "reloadconfig"}, call("reload_config")) +entry({"admin", "services", "AdGuardHome", "gettemplateconfig"}, call("get_template_config")) +end +function get_template_config() + local b + local d="" + for cnt in io.lines("/tmp/resolv.conf.auto") do + b=string.match (cnt,"^[^#]*nameserver%s+([^%s]+)$") + if (b~=nil) then + d=d.." - "..b.."\n" + end + end + local f=io.open("/usr/share/AdGuardHome/AdGuardHome_template.yaml", "r+") + local tbl = {} + local a="" + while (1) do + a=f:read("*l") + if (a=="#bootstrap_dns") then + a=d + elseif (a=="#upstream_dns") then + a=d + elseif (a==nil) then + break + end + table.insert(tbl, a) + end + f:close() + http.prepare_content("text/plain; charset=utf-8") + http.write(table.concat(tbl, "\n")) +end +function reload_config() + fs.remove("/tmp/AdGuardHometmpconfig.yaml") + http.prepare_content("application/json") + http.write('') +end +function act_status() + local e={} + local binpath=uci:get("AdGuardHome","AdGuardHome","binpath") + e.running=luci.sys.call("pgrep "..binpath.." >/dev/null")==0 + e.redirect=(fs.readfile("/var/run/AdGredir")=="1") + http.prepare_content("application/json") + http.write_json(e) +end +function do_update() + fs.writefile("/var/run/lucilogpos","0") + http.prepare_content("application/json") + http.write('') + local arg + if luci.http.formvalue("force") == "1" then + arg="force" + else + arg="" + end + if fs.access("/var/run/update_core") then + if arg=="force" then + luci.sys.exec("kill $(pgrep /usr/share/AdGuardHome/update_core.sh) ; sh /usr/share/AdGuardHome/update_core.sh "..arg.." >/tmp/AdGuardHome_update.log 2>&1 &") + end + else + luci.sys.exec("sh /usr/share/AdGuardHome/update_core.sh "..arg.." >/tmp/AdGuardHome_update.log 2>&1 &") + end +end +function get_log() + local logfile=uci:get("AdGuardHome","AdGuardHome","logfile") + if (logfile==nil) then + http.write("no log available\n") + return + elseif (logfile=="syslog") then + if not fs.access("/var/run/AdGuardHomesyslog") then + luci.sys.exec("(/usr/share/AdGuardHome/getsyslog.sh &); sleep 1;") + end + logfile="/tmp/AdGuardHometmp.log" + fs.writefile("/var/run/AdGuardHomesyslog","1") + elseif not fs.access(logfile) then + http.write("") + return + end + http.prepare_content("text/plain; charset=utf-8") + local fdp + if fs.access("/var/run/lucilogreload") then + fdp=0 + fs.remove("/var/run/lucilogreload") + else + fdp=tonumber(fs.readfile("/var/run/lucilogpos")) or 0 + end + local f=io.open(logfile, "r+") + f:seek("set",fdp) + local a=f:read(2048000) or "" + fdp=f:seek() + fs.writefile("/var/run/lucilogpos",tostring(fdp)) + f:close() + http.write(a) +end +function do_dellog() + local logfile=uci:get("AdGuardHome","AdGuardHome","logfile") + fs.writefile(logfile,"") + http.prepare_content("application/json") + http.write('') +end +function check_update() + http.prepare_content("text/plain; charset=utf-8") + local fdp=tonumber(fs.readfile("/var/run/lucilogpos")) or 0 + local f=io.open("/tmp/AdGuardHome_update.log", "r+") + f:seek("set",fdp) + local a=f:read(2048000) or "" + fdp=f:seek() + fs.writefile("/var/run/lucilogpos",tostring(fdp)) + f:close() +if fs.access("/var/run/update_core") then + http.write(a) +else + http.write(a.."\0") +end +end diff --git a/package/ctcgfw/luci-app-adguardhome/luasrc/model/cbi/AdGuardHome/base.lua b/package/ctcgfw/luci-app-adguardhome/luasrc/model/cbi/AdGuardHome/base.lua new file mode 100644 index 0000000000..9e53163fb3 --- /dev/null +++ b/package/ctcgfw/luci-app-adguardhome/luasrc/model/cbi/AdGuardHome/base.lua @@ -0,0 +1,304 @@ +require("luci.sys") +require("luci.util") +require("io") +local m,s,o,o1 +local fs=require"nixio.fs" +local uci=require"luci.model.uci".cursor() +local configpath=uci:get("AdGuardHome","AdGuardHome","configpath") or "/etc/AdGuardHome.yaml" +local binpath=uci:get("AdGuardHome","AdGuardHome","binpath") or "/usr/bin/AdGuardHome/AdGuardHome" +httpport=uci:get("AdGuardHome","AdGuardHome","httpport") or "3000" +m = Map("AdGuardHome", "AdGuard Home") +m.description = translate("Free and open source, powerful network-wide ads & trackers blocking DNS server.") +m:section(SimpleSection).template = "AdGuardHome/AdGuardHome_status" + +s = m:section(TypedSection, "AdGuardHome") +s.anonymous=true +s.addremove=false +---- enable +o = s:option(Flag, "enabled", translate("Enable")) +o.default = 0 +o.optional = false +---- httpport +o =s:option(Value,"httpport",translate("Browser management port")) +o.placeholder=3000 +o.default=3000 +o.datatype="port" +o.optional = false +o.description = translate("") +---- update warning not safe +local binmtime=uci:get("AdGuardHome","AdGuardHome","binmtime") or "0" +local e="" +if not fs.access(configpath) then + e=e.." "..translate("no config") +end +if not fs.access(binpath) then + e=e.." "..translate("no core") +else + local version=uci:get("AdGuardHome","AdGuardHome","version") + local testtime=fs.stat(binpath,"mtime") + if testtime~=tonumber(binmtime) or version==nil then + local tmp=luci.sys.exec(binpath.." -c /dev/null --check-config 2>&1| grep -m 1 -E 'v[0-9.]+' -o") + version=string.sub(tmp, 1, -2) + if version=="" then version="core error" end + uci:set("AdGuardHome","AdGuardHome","version",version) + uci:set("AdGuardHome","AdGuardHome","binmtime",testtime) + uci:save("AdGuardHome") + end + e=version..e +end +o=s:option(Button,"restart",translate("Update")) +o.inputtitle=translate("Update core version") +o.template = "AdGuardHome/AdGuardHome_check" +o.showfastconfig=(not fs.access(configpath)) +o.description=string.format(translate("core version:").."%s ",e) +---- port warning not safe +local port=luci.sys.exec("awk '/ port:/{printf($2);exit;}' "..configpath.." 2>nul") +if (port=="") then port="?" end +---- Redirect +o = s:option(ListValue, "redirect", port..translate("Redirect"), translate("AdGuardHome redirect mode")) +o.placeholder = "none" +o:value("none", translate("none")) +o:value("dnsmasq-upstream", translate("Run as dnsmasq upstream server")) +o:value("redirect", translate("Redirect 53 port to AdGuardHome")) +o:value("exchange", translate("Use port 53 replace dnsmasq")) +o.default = "none" +o.optional = true +---- bin path +o = s:option(Value, "binpath", translate("Bin Path"), translate("AdGuardHome Bin path if no bin will auto download")) +o.default = "/usr/bin/AdGuardHome/AdGuardHome" +o.datatype = "string" +o.optional = false +o.rmempty=false +o.validate=function(self, value) +if value=="" then return nil end +if fs.stat(value,"type")=="dir" then + fs.rmdir(value) +end +if fs.stat(value,"type")=="dir" then + if (m.message) then + m.message =m.message.."\nerror!bin path is a dir" + else + m.message ="error!bin path is a dir" + end + return nil +end +return value +end +--- upx +o = s:option(ListValue, "upxflag", translate("use upx to compress bin after download")) +o:value("", translate("none")) +o:value("-1", translate("compress faster")) +o:value("-9", translate("compress better")) +o:value("--best", translate("compress best(can be slow for big files)")) +o:value("--brute", translate("try all available compression methods & filters [slow]")) +o:value("--ultra-brute", translate("try even more compression variants [very slow]")) +o.default = "" +o.description=translate("bin use less space,but may have compatibility issues") +o.rmempty = true +---- config path +o = s:option(Value, "configpath", translate("Config Path"), translate("AdGuardHome config path")) +o.default = "/etc/AdGuardHome.yaml" +o.datatype = "string" +o.optional = false +o.rmempty=false +o.validate=function(self, value) +if value==nil then return nil end +if fs.stat(value,"type")=="dir" then + fs.rmdir(value) +end +if fs.stat(value,"type")=="dir" then + if m.message then + m.message =m.message.."\nerror!config path is a dir" + else + m.message ="error!config path is a dir" + end + return nil +end +return value +end +---- work dir +o = s:option(Value, "workdir", translate("Work dir"), translate("AdGuardHome work dir include rules,audit log and database")) +o.default = "/usr/bin/AdGuardHome" +o.datatype = "string" +o.optional = false +o.rmempty=false +o.validate=function(self, value) +if value=="" then return nil end +if fs.stat(value,"type")=="reg" then + if m.message then + m.message =m.message.."\nerror!work dir is a file" + else + m.message ="error!work dir is a file" + end + return nil +end +if string.sub(value, -1)=="/" then + return string.sub(value, 1, -2) +else + return value +end +end +---- log file +o = s:option(Value, "logfile", translate("Runtime log file"), translate("AdGuardHome runtime Log file if 'syslog': write to system log;if empty no log")) +o.datatype = "string" +o.rmempty = true +o.validate=function(self, value) +if fs.stat(value,"type")=="dir" then + fs.rmdir(value) +end +if fs.stat(value,"type")=="dir" then + if m.message then + m.message =m.message.."\nerror!log file is a dir" + else + m.message ="error!log file is a dir" + end + return nil +end +return value +end +---- debug +o = s:option(Flag, "verbose", translate("Verbose log")) +o.default = 0 +o.optional = true +---- gfwlist +local a=luci.sys.call("grep -m 1 -q programadd "..configpath) +if (a==0) then +a="Added" +else +a="Not added" +end +o=s:option(Button,"gfwdel",translate("Del gfwlist"),translate(a)) +o.optional = true +o.inputtitle=translate("Del") +o.write=function() + luci.sys.exec("sh /usr/share/AdGuardHome/gfw2adg.sh del 2>&1") + luci.http.redirect(luci.dispatcher.build_url("admin","services","AdGuardHome")) +end +o=s:option(Button,"gfwadd",translate("Add gfwlist"),translate(a)) +o.optional = true +o.inputtitle=translate("Add") +o.write=function() + luci.sys.exec("sh /usr/share/AdGuardHome/gfw2adg.sh 2>&1") + luci.http.redirect(luci.dispatcher.build_url("admin","services","AdGuardHome")) +end +o = s:option(Value, "gfwupstream", translate("Gfwlist upstream dns server"), translate("Gfwlist domain upstream dns service")..translate(a)) +o.default = "tcp://208.67.220.220:5353" +o.datatype = "string" +o.optional = true +---- chpass +o = s:option(Value, "hashpass", translate("Change browser management password"), translate("Press load culculate model and culculate finally save/apply")) +o.default = "" +o.datatype = "string" +o.template = "AdGuardHome/AdGuardHome_chpass" +o.optional = true +---- upgrade protect +o = s:option(MultiValue, "upprotect", translate("Keep files when system upgrade")) +o:value("$binpath",translate("core bin")) +o:value("$configpath",translate("config file")) +o:value("$logfile",translate("log file")) +o:value("$workdir/data/sessions.db",translate("sessions.db")) +o:value("$workdir/data/stats.db",translate("stats.db")) +o:value("$workdir/data/querylog.json",translate("querylog.json")) +o:value("$workdir/data/filters",translate("filters")) +o.widget = "checkbox" +o.default = nil +o.optional=true +---- wait net on boot +o = s:option(Flag, "waitonboot", translate("On boot when network ok restart")) +o.default = 1 +o.optional = true +---- backup workdir on shutdown +local workdir=uci:get("AdGuardHome","AdGuardHome","workdir") or "/usr/bin/AdGuardHome" +o = s:option(MultiValue, "backupfile", translate("Backup workdir files when shutdown")) +o1 = s:option(Value, "backupwdpath", translate("Backup workdir path")) +local name +o:value("filters","filters") +o:value("stats.db","stats.db") +o:value("querylog.json","querylog.json") +o:value("sessions.db","sessions.db") +o1:depends ("backupfile", "filters") +o1:depends ("backupfile", "stats.db") +o1:depends ("backupfile", "querylog.json") +o1:depends ("backupfile", "sessions.db") +for name in fs.glob(workdir.."/data/*") +do + name=fs.basename (name) + if name~="filters" and name~="stats.db" and name~="querylog.json" and name~="sessions.db" then + o:value(name,name) + o1:depends ("backupfile", name) + end +end +o.widget = "checkbox" +o.default = nil +o.optional=false +o.description=translate("Will be restore when workdir/data is empty") +----backup workdir path + +o1.default = "/usr/bin/AdGuardHome" +o1.datatype = "string" +o1.optional = false +o1.validate=function(self, value) +if fs.stat(value,"type")=="reg" then + if m.message then + m.message =m.message.."\nerror!backup dir is a file" + else + m.message ="error!backup dir is a file" + end + return nil +end +if string.sub(value,-1)=="/" then + return string.sub(value, 1, -2) +else + return value +end +end + +----Crontab +o = s:option(MultiValue, "crontab", translate("Crontab task"),translate("Please change time and args in crontab")) +o:value("autoupdate",translate("Auto update core")) +o:value("cutquerylog",translate("Auto tail querylog")) +o:value("cutruntimelog",translate("Auto tail runtime log")) +o:value("autohost",translate("Auto update ipv6 hosts and restart adh")) +o:value("autogfw",translate("Auto update gfwlist and restart adh")) +o.widget = "checkbox" +o.default = nil +o.optional=true + +----downloadpath +o = s:option(TextValue, "downloadlinks",translate("Download links for update")) +o.optional = false +o.rows = 4 +o.wrap = "soft" +o.cfgvalue = function(self, section) + return fs.readfile("/usr/share/AdGuardHome/links.txt") +end +o.write = function(self, section, value) + fs.writefile("/usr/share/AdGuardHome/links.txt", value:gsub("\r\n", "\n")) +end +fs.writefile("/var/run/lucilogpos","0") +function m.on_commit(map) + if (fs.access("/var/run/AdGserverdis")) then + io.popen("/etc/init.d/AdGuardHome reload &") + return + end + local ucitracktest=uci:get("AdGuardHome","AdGuardHome","ucitracktest") + if ucitracktest=="1" then + return + elseif ucitracktest=="0" then + io.popen("/etc/init.d/AdGuardHome reload &") + else + if (fs.access("/var/run/AdGlucitest")) then + uci:set("AdGuardHome","AdGuardHome","ucitracktest","0") + io.popen("/etc/init.d/AdGuardHome reload &") + else + fs.writefile("/var/run/AdGlucitest","") + if (ucitracktest=="2") then + uci:set("AdGuardHome","AdGuardHome","ucitracktest","1") + else + uci:set("AdGuardHome","AdGuardHome","ucitracktest","2") + end + end + uci:save("AdGuardHome") + end +end +return m \ No newline at end of file diff --git a/package/ctcgfw/luci-app-adguardhome/luasrc/model/cbi/AdGuardHome/log.lua b/package/ctcgfw/luci-app-adguardhome/luasrc/model/cbi/AdGuardHome/log.lua new file mode 100644 index 0000000000..5d18a88db4 --- /dev/null +++ b/package/ctcgfw/luci-app-adguardhome/luasrc/model/cbi/AdGuardHome/log.lua @@ -0,0 +1,16 @@ +local fs=require"nixio.fs" +local uci=require"luci.model.uci".cursor() +local f,t +f=SimpleForm("logview") +f.reset = false +f.submit = false +t=f:field(TextValue,"conf") +t.rmempty=true +t.rows=20 +t.template="AdGuardHome/log" +t.readonly="readonly" +local logfile=uci:get("AdGuardHome","AdGuardHome","logfile") or "" +t.timereplace=(logfile~="syslog" and logfile~="" ) +t.pollcheck=logfile~="" +fs.writefile("/var/run/lucilogreload","") +return f diff --git a/package/ctcgfw/luci-app-adguardhome/luasrc/model/cbi/AdGuardHome/manual.lua b/package/ctcgfw/luci-app-adguardhome/luasrc/model/cbi/AdGuardHome/manual.lua new file mode 100644 index 0000000000..72a2ebffde --- /dev/null +++ b/package/ctcgfw/luci-app-adguardhome/luasrc/model/cbi/AdGuardHome/manual.lua @@ -0,0 +1,97 @@ +local m, s, o +local fs = require "nixio.fs" +local uci=require"luci.model.uci".cursor() +local sys=require"luci.sys" +require("string") +require("io") +require("table") +function gen_template_config() + local b + local d="" + for cnt in io.lines("/tmp/resolv.conf.auto") do + b=string.match (cnt,"^[^#]*nameserver%s+([^%s]+)$") + if (b~=nil) then + d=d.." - "..b.."\n" + end + end + local f=io.open("/usr/share/AdGuardHome/AdGuardHome_template.yaml", "r+") + local tbl = {} + local a="" + while (1) do + a=f:read("*l") + if (a=="#bootstrap_dns") then + a=d + elseif (a=="#upstream_dns") then + a=d + elseif (a==nil) then + break + end + table.insert(tbl, a) + end + f:close() + return table.concat(tbl, "\n") +end +m = Map("AdGuardHome") +local configpath = uci:get("AdGuardHome","AdGuardHome","configpath") +local binpath = uci:get("AdGuardHome","AdGuardHome","binpath") +s = m:section(TypedSection, "AdGuardHome") +s.anonymous=true +s.addremove=false +--- config +o = s:option(TextValue, "escconf") +o.rows = 66 +o.wrap = "off" +o.rmempty = true +o.cfgvalue = function(self, section) + return fs.readfile("/tmp/AdGuardHometmpconfig.yaml") or fs.readfile(configpath) or gen_template_config() or "" +end +o.validate=function(self, value) + fs.writefile("/tmp/AdGuardHometmpconfig.yaml", value:gsub("\r\n", "\n")) + if fs.access(binpath) then + if (sys.call(binpath.." -c /tmp/AdGuardHometmpconfig.yaml --check-config 2> /tmp/AdGuardHometest.log")==0) then + return value + end + else + return value + end + luci.http.redirect(luci.dispatcher.build_url("admin","services","AdGuardHome","manual")) + return nil +end +o.write = function(self, section, value) + fs.move("/tmp/AdGuardHometmpconfig.yaml",configpath) +end +o.remove = function(self, section, value) + fs.writefile(configpath, "") +end +--- js and reload button +o = s:option(DummyValue, "") +o.anonymous=true +o.template = "AdGuardHome/yamleditor" +if not fs.access(binpath) then + o.description=translate("WARNING!!! no bin found apply config will not be test") +end +--- log +if (fs.access("/tmp/AdGuardHometmpconfig.yaml")) then +local c=fs.readfile("/tmp/AdGuardHometest.log") +if (c~="") then +o = s:option(TextValue, "") +o.readonly=true +o.rows = 5 +o.rmempty = true +o.name="" +o.cfgvalue = function(self, section) + return fs.readfile("/tmp/AdGuardHometest.log") +end +end +end +function m.on_commit(map) + local ucitracktest=uci:get("AdGuardHome","AdGuardHome","ucitracktest") + if ucitracktest=="1" then + return + elseif ucitracktest=="0" then + io.popen("/etc/init.d/AdGuardHome reload &") + else + fs.writefile("/var/run/AdGlucitest","") + end +end +return m \ No newline at end of file diff --git a/package/ctcgfw/luci-app-adguardhome/luasrc/view/AdGuardHome/AdGuardHome_check.htm b/package/ctcgfw/luci-app-adguardhome/luasrc/view/AdGuardHome/AdGuardHome_check.htm new file mode 100644 index 0000000000..52315ef7e4 --- /dev/null +++ b/package/ctcgfw/luci-app-adguardhome/luasrc/view/AdGuardHome/AdGuardHome_check.htm @@ -0,0 +1,78 @@ +<%+cbi/valueheader%> +<%local fs=require"nixio.fs"%> + + +<% if self.showfastconfig then %> + +<%end%> + + +<%+cbi/valuefooter%> \ No newline at end of file diff --git a/package/ctcgfw/luci-app-adguardhome/luasrc/view/AdGuardHome/AdGuardHome_chpass.htm b/package/ctcgfw/luci-app-adguardhome/luasrc/view/AdGuardHome/AdGuardHome_chpass.htm new file mode 100644 index 0000000000..440eafd970 --- /dev/null +++ b/package/ctcgfw/luci-app-adguardhome/luasrc/view/AdGuardHome/AdGuardHome_chpass.htm @@ -0,0 +1,49 @@ +<%+cbi/valueheader%> + + 0, "data-choices", { self.keylist, self.vallist }) + %> /> + <% if self.password then %><% end %> + +<%+cbi/valuefooter%> \ No newline at end of file diff --git a/package/ctcgfw/luci-app-adguardhome/luasrc/view/AdGuardHome/AdGuardHome_status.htm b/package/ctcgfw/luci-app-adguardhome/luasrc/view/AdGuardHome/AdGuardHome_status.htm new file mode 100644 index 0000000000..7e924d1195 --- /dev/null +++ b/package/ctcgfw/luci-app-adguardhome/luasrc/view/AdGuardHome/AdGuardHome_status.htm @@ -0,0 +1,27 @@ + + +
+

+ <%:Collecting data...%> +

+
\ No newline at end of file diff --git a/package/ctcgfw/luci-app-adguardhome/luasrc/view/AdGuardHome/log.htm b/package/ctcgfw/luci-app-adguardhome/luasrc/view/AdGuardHome/log.htm new file mode 100644 index 0000000000..44b3da0b1f --- /dev/null +++ b/package/ctcgfw/luci-app-adguardhome/luasrc/view/AdGuardHome/log.htm @@ -0,0 +1,110 @@ +<%+cbi/valueheader%> +<%:reverse%> +<%if self.timereplace then%> +<%:localtime%>
+<%end%> + + + + +<%+cbi/valuefooter%> \ No newline at end of file diff --git a/package/ctcgfw/luci-app-adguardhome/luasrc/view/AdGuardHome/yamleditor.htm b/package/ctcgfw/luci-app-adguardhome/luasrc/view/AdGuardHome/yamleditor.htm new file mode 100644 index 0000000000..639cb99888 --- /dev/null +++ b/package/ctcgfw/luci-app-adguardhome/luasrc/view/AdGuardHome/yamleditor.htm @@ -0,0 +1,39 @@ +<%+cbi/valueheader%> + + + + + + + + + +<%fs=require"nixio.fs"%> +<%if fs.access("/tmp/AdGuardHometmpconfig.yaml") then%> + +<%end%> + +<%+cbi/valuefooter%> \ No newline at end of file diff --git a/package/ctcgfw/luci-app-adguardhome/po/zh-cn/AdGuardHome.po b/package/ctcgfw/luci-app-adguardhome/po/zh-cn/AdGuardHome.po new file mode 100644 index 0000000000..b0abca72a2 --- /dev/null +++ b/package/ctcgfw/luci-app-adguardhome/po/zh-cn/AdGuardHome.po @@ -0,0 +1,266 @@ +#/cgi-bin/luci/admin/services/AdGuardHome +msgid "Base Setting" +msgstr "基础设置" + +msgid "Log" +msgstr "日志" + +msgid "Manual Config" +msgstr "手动设置" + +msgid "Free and open source, powerful network-wide ads & trackers blocking DNS server." +msgstr "免费开源,功能强大的全网络广告和跟踪程序拦截DNS服务器" + +msgid "RUNNING" +msgstr "运行中" + +msgid "NOT RUNNING" +msgstr "未运行" + +msgid "Redirected" +msgstr "已重定向" + +msgid "Not redirect" +msgstr "未重定向" + +msgid "Collecting data..." +msgstr "获取数据中..." + +msgid "Enable" +msgstr "启用" + +msgid "Browser management port" +msgstr "网页管理端口" + +msgid "Update" +msgstr "更新" +#button change +msgid "Update core version" +msgstr "更新核心版本" + +msgid "Check..." +msgstr "检查中..." + +msgid "Updated" +msgstr "已更新" + +#button hide +msgid "Force update" +msgstr "强制更新" + +msgid "Fast config" +msgstr "快速配置" +# +msgid "core version:" +msgstr "核心版本:" +#description change +msgid "no config" +msgstr "没有配置文件" +msgid "no core" +msgstr "没有核心" +# +msgid "Redirect" +msgstr "重定向" +#inlist +msgid "none" +msgstr "无" + +msgid "Run as dnsmasq upstream server" +msgstr "作为dnsmasq的上游服务器" + +msgid "Redirect 53 port to AdGuardHome" +msgstr "重定向53端口到AdGuardHome" + +msgid "Use port 53 replace dnsmasq" +msgstr "使用53端口替换dnsmasq" +# +msgid "AdGuardHome redirect mode" +msgstr "AdGuardHome重定向模式" + +msgid "Bin Path" +msgstr "执行文件路径" + +msgid "AdGuardHome Bin path if no bin will auto download" +msgstr "AdGuardHome 执行文件路径 如果没有执行文件将自动下载" + +msgid "use upx to compress bin after download" +msgstr "下载后使用upx压缩执行文件" +#inlist +msgid "compress faster" +msgstr "快速压缩" + +msgid "compress better" +msgstr "更好的压缩" + +msgid "compress best(can be slow for big files)" +msgstr "最好的压缩(大文件可能慢)" + +msgid "try all available compression methods & filters [slow]" +msgstr "尝试所有可能的压缩方法和过滤器[慢]" + +msgid "try even more compression variants [very slow]" +msgstr "尝试更多变体压缩手段[很慢]" + +msgid "bin use less space,but may have compatibility issues" +msgstr "减小执行文件空间占用,但是可能压缩后有兼容性问题" +# +msgid "Config Path" +msgstr "配置文件路径" + +msgid "AdGuardHome config path" +msgstr "AdGuardHome 配置文件路径" + +msgid "Work dir" +msgstr "工作目录" + +msgid "AdGuardHome work dir include rules,audit log and database" +msgstr "AdGuardHome 工作目录包含规则,审计日志和数据库" + +msgid "Runtime log file" +msgstr "运行日志" + +msgid "AdGuardHome runtime Log file if 'syslog': write to system log;if empty no log" +msgstr "AdGuardHome 运行日志 如果填syslog将写入系统日志;如果空则不记录日志" + +msgid "Verbose log" +msgstr "详细日志" +#hide div +msgid "Add gfwlist" +msgstr "加入gfw列表" + +msgid "Add" +msgstr "添加" + +msgid "Added" +msgstr "已添加" + +msgid "Not added" +msgstr "未添加" +#hide div +msgid "Del gfwlist" +msgstr "删除gfw列表" + +msgid "Del" +msgstr "删除" +#hide div +msgid "Gfwlist upstream dns server" +msgstr "gfw列表上游服务器" + +msgid "Gfwlist domain upstream dns service" +msgstr "gfw列表域名上游服务器" +#hide div +msgid "Change browser management password" +msgstr "改变网页登录密码" + +msgid "Culculate" +msgstr "计算" +##button change +msgid "Load culculate model" +msgstr "载入计算模块" + +msgid "loading..." +msgstr "载入中" + +msgid "Please save/apply" +msgstr "请提交" + +msgid "is empty" +msgstr "为空" + +msgid "Press load culculate model and culculate finally save/apply" +msgstr "按载入计算模块 然后计算 最后保存/提交" +# +msgid "Keep files when system upgrade" +msgstr "系统升级时保留文件" +#checkbox +msgid "core bin" +msgstr "核心执行文件" + +msgid "config file" +msgstr "配置文件" + +msgid "log file" +msgstr "日志文件" + +msgid "querylog.json" +msgstr "审计日志.json" +# +msgid "On boot when network ok restart" +msgstr "开机后网络准备好时重启" + +msgid "Backup workdir files when shutdown" +msgstr "在关机时备份工作目录文件" + +msgid "Will be restore when workdir/data is empty" +msgstr "在工作目录/data为空的时候恢复" + +msgid "Backup workdir path" +msgstr "工作目录备份路径" + +msgid "Crontab task" +msgstr "计划任务" + +msgid "Auto update core" +msgstr "自动升级核心" + +msgid "Auto tail querylog" +msgstr "自动截短查询日志" + +msgid "Auto tail runtime log" +msgstr "自动截短运行日志" + +msgid "Auto update ipv6 hosts and restart adh" +msgstr "自动更新ipv6主机并重启adh" + +msgid "Auto update gfwlist and restart adh" +msgstr "自动更新gfw列表并重启adh" + +msgid "Please change time and args in crontab" +msgstr "请在计划任务中修改时间和参数" + +msgid "Download links for update" +msgstr "升级用的下载链接" + +#/cgi-bin/luci/admin/services/AdGuardHome/log/ +msgid "reverse" +msgstr "逆序" + +msgid "localtime" +msgstr "本地时间" + +msgid "Please add log path in config to enable log" +msgstr "请在设置里填写日志路径以启用日志" + +msgid "dellog" +msgstr "删除日志" + +msgid "download log" +msgstr "下载日志" + +#/cgi-bin/luci//admin/services/AdGuardHome/manual/ +msgid "Use template" +msgstr "使用模板" +#hide button +msgid "Reload Config" +msgstr "重新载入配置" + +msgid "WARNING!!! no bin found apply config will not be test" +msgstr "警告!!!未找到执行文件,提交配置将不会进行校验" +#unused +msgid "Change browser management username" +msgstr "改变网页登录用户名" + +msgid "Username" +msgstr "用户名" + +msgid "Check Config" +msgstr "检查配置" + +msgid "unknown" +msgstr "未知" + +msgid "Keep database when system upgrade" +msgstr "系统升级时保留数据" + +msgid "Boot delay until network ok" +msgstr "开机时直到网络准备好再启动" \ No newline at end of file diff --git a/package/ctcgfw/luci-app-adguardhome/root/etc/config/AdGuardHome b/package/ctcgfw/luci-app-adguardhome/root/etc/config/AdGuardHome new file mode 100644 index 0000000000..cd0c543215 --- /dev/null +++ b/package/ctcgfw/luci-app-adguardhome/root/etc/config/AdGuardHome @@ -0,0 +1,11 @@ +config AdGuardHome 'AdGuardHome' + option enabled '0' + option httpport '3000' + option redirect 'none' + option configpath '/etc/AdGuardHome.yaml' + option workdir '/usr/bin/AdGuardHome' + option logfile '/tmp/AdGuardHome.log' + option verbose '0' + option binpath '/usr/bin/AdGuardHome/AdGuardHome' + option upxflag '' + diff --git a/package/ctcgfw/luci-app-adguardhome/root/etc/init.d/AdGuardHome b/package/ctcgfw/luci-app-adguardhome/root/etc/init.d/AdGuardHome new file mode 100755 index 0000000000..5018a85d74 --- /dev/null +++ b/package/ctcgfw/luci-app-adguardhome/root/etc/init.d/AdGuardHome @@ -0,0 +1,618 @@ +#!/bin/sh /etc/rc.common + +USE_PROCD=1 + +START=95 +STOP=01 + +CONFIGURATION=AdGuardHome +CRON_FILE=/etc/crontabs/root +EXTRA_COMMANDS="do_redirect testbackup test_crontab force_reload isrunning" +EXTRA_HELP=" do_redirect 0 or 1\ + testbackup backup or restore\ + test_crontab + force_reload + isrunning" +set_forward_dnsmasq() +{ + local PORT="$1" + addr="127.0.0.1#$PORT" + OLD_SERVER="`uci get dhcp.@dnsmasq[0].server 2>/dev/null`" + echo $OLD_SERVER | grep "^$addr" >/dev/null 2>&1 + if [ $? -eq 0 ]; then + return + fi + uci delete dhcp.@dnsmasq[0].server 2>/dev/null + uci add_list dhcp.@dnsmasq[0].server=$addr + for server in $OLD_SERVER; do + if [ "$server" = "$addr" ]; then + continue + fi + uci add_list dhcp.@dnsmasq[0].server=$server + done + uci delete dhcp.@dnsmasq[0].resolvfile 2>/dev/null + uci set dhcp.@dnsmasq[0].noresolv=1 + uci commit dhcp + /etc/init.d/dnsmasq restart +} + +stop_forward_dnsmasq() +{ + local OLD_PORT="$1" + addr="127.0.0.1#$OLD_PORT" + OLD_SERVER="`uci get dhcp.@dnsmasq[0].server 2>/dev/null`" + echo $OLD_SERVER | grep "^$addr" >/dev/null 2>&1 + if [ $? -ne 0 ]; then + return + fi + + uci del_list dhcp.@dnsmasq[0].server=$addr 2>/dev/null + addrlist="`uci get dhcp.@dnsmasq[0].server 2>/dev/null`" + if [ -z "$addrlist" ] ; then + uci set dhcp.@dnsmasq[0].resolvfile=/tmp/resolv.conf.auto 2>/dev/null + uci delete dhcp.@dnsmasq[0].noresolv 2>/dev/null + fi + uci commit dhcp + /etc/init.d/dnsmasq restart +} + +set_iptable() +{ + local ipv6_server=$1 + local tcp_server=$2 + uci -q batch <<-EOF >/dev/null 2>&1 + delete firewall.AdGuardHome + set firewall.AdGuardHome=include + set firewall.AdGuardHome.type=script + set firewall.AdGuardHome.path=/usr/share/AdGuardHome/firewall.start + set firewall.AdGuardHome.reload=1 + commit firewall +EOF + + IPS="`ifconfig | grep "inet addr" | grep -v ":127" | grep "Bcast" | awk '{print $2}' | awk -F : '{print $2}'`" + for IP in $IPS + do + if [ "$tcp_server" == "1" ]; then + iptables -t nat -A PREROUTING -p tcp -d $IP --dport 53 -j REDIRECT --to-ports $AdGuardHome_PORT >/dev/null 2>&1 + fi + iptables -t nat -A PREROUTING -p udp -d $IP --dport 53 -j REDIRECT --to-ports $AdGuardHome_PORT >/dev/null 2>&1 + done + + if [ "$ipv6_server" == 0 ]; then + return + fi + + IPS="`ifconfig | grep "inet6 addr" | grep -v " fe80::" | grep -v " ::1" | grep "Global" | awk '{print $3}'`" + for IP in $IPS + do + if [ "$tcp_server" == "1" ]; then + ip6tables -t nat -A PREROUTING -p tcp -d $IP --dport 53 -j REDIRECT --to-ports $AdGuardHome_PORT >/dev/null 2>&1 + fi + ip6tables -t nat -A PREROUTING -p udp -d $IP --dport 53 -j REDIRECT --to-ports $AdGuardHome_PORT >/dev/null 2>&1 + done + +} + +clear_iptable() +{ + uci -q batch <<-EOF >/dev/null 2>&1 + delete firewall.AdGuardHome + commit firewall +EOF + local OLD_PORT="$1" + local ipv6_server=$2 + IPS="`ifconfig | grep "inet addr" | grep -v ":127" | grep "Bcast" | awk '{print $2}' | awk -F : '{print $2}'`" + for IP in $IPS + do + iptables -t nat -D PREROUTING -p udp -d $IP --dport 53 -j REDIRECT --to-ports $OLD_PORT >/dev/null 2>&1 + iptables -t nat -D PREROUTING -p tcp -d $IP --dport 53 -j REDIRECT --to-ports $OLD_PORT >/dev/null 2>&1 + done + + if [ "$ipv6_server" == 0 ]; then + return + fi + echo "warn ip6tables nat mod is needed" + IPS="`ifconfig | grep "inet6 addr" | grep -v " fe80::" | grep -v " ::1" | grep "Global" | awk '{print $3}'`" + for IP in $IPS + do + ip6tables -t nat -D PREROUTING -p udp -d $IP --dport 53 -j REDIRECT --to-ports $OLD_PORT >/dev/null 2>&1 + ip6tables -t nat -D PREROUTING -p tcp -d $IP --dport 53 -j REDIRECT --to-ports $OLD_PORT >/dev/null 2>&1 + done + +} + +service_triggers() { + procd_add_reload_trigger "$CONFIGURATION" + [ "$(uci get AdGuardHome.AdGuardHome.redirect)" == "redirect" ] && procd_add_reload_trigger firewall +} +isrunning(){ +config_load "${CONFIGURATION}" +_isrunning +local r=$? +([ "$r" == "0" ] && echo "running") || ([ "$r" == "1" ] && echo "not run" ) || echo "no bin" +return $r +} +_isrunning(){ + config_get binpath $CONFIGURATION binpath "/usr/bin/AdGuardHome/AdGuardHome" + [ ! -f "$binpath" ] && return 2 + pgrep $binpath 2>&1 >/dev/null && return 0 + return 1 +} +force_reload(){ + config_load "${CONFIGURATION}" + _isrunning && procd_send_signal "$CONFIGURATION" || start +} +get_tz() +{ + SET_TZ="" + + if [ -e "/etc/localtime" ]; then + return + fi + + for tzfile in /etc/TZ /var/etc/TZ + do + if [ ! -e "$tzfile" ]; then + continue + fi + + tz="`cat $tzfile 2>/dev/null`" + done + + if [ -z "$tz" ]; then + return + fi + + SET_TZ=$tz +} + +rm_port53() +{ + local AdGuardHome_PORT=$(config_editor "dns.port" "" "$configpath" "1") + dnsmasq_port=$(uci get dhcp.@dnsmasq[0].port 2>/dev/null) + if [ -z "$dnsmasq_port" ]; then + dnsmasq_port="53" + fi + if [ "$dnsmasq_port" == "$AdGuardHome_PORT" ]; then + if [ "$dnsmasq_port" == "53" ]; then + dnsmasq_port="1745" + fi + elif [ "$dnsmasq_port" == "53" ]; then + return + fi + config_editor "dns.port" "$dnsmasq_port" "$configpath" + uci set dhcp.@dnsmasq[0].port="53" + uci commit dhcp + /etc/init.d/dnsmasq reload +} + +use_port53() +{ + local AdGuardHome_PORT=$(config_editor "dns.port" "" "$configpath" "1") + dnsmasq_port=$(uci get dhcp.@dnsmasq[0].port 2>/dev/null) + if [ -z "$dnsmasq_port" ]; then + dnsmasq_port="53" + fi + if [ "$dnsmasq_port" == "$AdGuardHome_PORT" ]; then + if [ "$dnsmasq_port" == "53" ]; then + AdGuardHome_PORT="1745" + fi + elif [ "$AdGuardHome_PORT" == "53" ]; then + return + fi + config_editor "dns.port" "53" "$configpath" + uci set dhcp.@dnsmasq[0].port="$AdGuardHome_PORT" + uci commit dhcp + /etc/init.d/dnsmasq reload +} +do_redirect() +{ + config_load "${CONFIGURATION}" + _do_redirect $1 +} +_do_redirect() +{ + local section="$CONFIGURATION" + args="" + ipv6_server=1 + tcp_server=0 + enabled=$1 + if [ "$enabled" == "1" ]; then + echo -n "1">/var/run/AdGredir + else + echo -n "0">/var/run/AdGredir + fi + config_get configpath $CONFIGURATION configpath "/etc/AdGuardHome.yaml" + AdGuardHome_PORT=$(config_editor "dns.port" "" "$configpath" "1") + if [ -z "$AdGuardHome_PORT" ]; then + AdGuardHome_PORT="0" + fi + config_get "redirect" "$section" "redirect" "none" + config_get "old_redirect" "$section" "old_redirect" "none" + config_get "old_port" "$section" "old_port" "0" + config_get "old_enabled" "$section" "old_enabled" "0" + uci get dhcp.@dnsmasq[0].port >/dev/null 2>&1 || uci set dhcp.@dnsmasq[0].port="53" >/dev/null 2>&1 + if [ "$old_enabled" = "1" -a "$old_redirect" == "exchange" ]; then + AdGuardHome_PORT=$(uci get dhcp.@dnsmasq[0].port 2>/dev/null) + fi + + if [ "$old_redirect" != "$redirect" ] || [ "$old_port" != "$AdGuardHome_PORT" ] || [ "$old_enabled" = "1" -a "$enabled" = "0" ]; then + if [ "$old_redirect" != "none" ]; then + if [ "$old_redirect" == "redirect" -a "$old_port" != "0" ]; then + clear_iptable "$old_port" "$ipv6_server" + elif [ "$old_redirect" == "dnsmasq-upstream" ]; then + stop_forward_dnsmasq "$old_port" + elif [ "$old_redirect" == "exchange" ]; then + rm_port53 + fi + fi + elif [ "$old_enabled" = "1" -a "$enabled" = "1" ]; then + if [ "$old_redirect" == "redirect" -a "$old_port" != "0" ]; then + clear_iptable "$old_port" "$ipv6_server" + fi + fi + uci delete AdGuardHome.@AdGuardHome[0].old_redirect 2>/dev/null + uci delete AdGuardHome.@AdGuardHome[0].old_port 2>/dev/null + uci delete AdGuardHome.@AdGuardHome[0].old_enabled 2>/dev/null + uci add_list AdGuardHome.@AdGuardHome[0].old_redirect="$redirect" 2>/dev/null + uci add_list AdGuardHome.@AdGuardHome[0].old_port="$AdGuardHome_PORT" 2>/dev/null + uci add_list AdGuardHome.@AdGuardHome[0].old_enabled="$enabled" 2>/dev/null + uci commit AdGuardHome + [ "$enabled" == "0" ] && return 1 + if [ "$AdGuardHome_PORT" == "0" ]; then + return 1 + fi + if [ "$redirect" = "redirect" ]; then + set_iptable $ipv6_server $tcp_server + elif [ "$redirect" = "dnsmasq-upstream" ]; then + set_forward_dnsmasq "$AdGuardHome_PORT" + elif [ "$redirect" == "exchange" -a "$(uci get dhcp.@dnsmasq[0].port 2>/dev/null)" == "53" ]; then + use_port53 + fi +} +get_filesystem() +{ +# print out path filesystem + echo $1 | awk ' + BEGIN{ + while (("mount"| getline ret) > 0) + { + split(ret,d); + fs[d[3]]=d[5]; + m=index(d[1],":") + if (m==0) + { + pt[d[3]]=d[1] + }else{ + pt[d[3]]=substr(d[1],m+1) + }}}{ + split($0,d,"/"); + if ("/" in fs) + { + result1=fs["/"]; + } + if ("/" in pt) + { + result2=pt["/"]; + } + for (i=2;i<=length(d);i++) + { + p[i]=p[i-1]"/"d[i]; + if (p[i] in fs) + { + result1=fs[p[i]]; + result2=pt[p[i]]; + } + } + if (result2 in fs){ + result=fs[result2]} + else{ + result=result1} + print(result);}' +} + +config_editor() +{ + awk -v yaml="$1" -v value="$2" -v file="$3" -v ro="$4" ' + BEGIN{split(yaml,part,"\.");s="";i=1;l=length(part);} + { + if (match($0,s""part[i]":")) + { + if (i==l) + { + split($0,t,": "); + if (ro==""){ + system("sed -i '\''"FNR"c \\"t[1]": "value"'\'' "file); + }else{ + print(t[2]); + } + exit; + } + s=s"[- ]{2}"; + i++; + } + }' $3 +} + +boot_service() { + rm /var/run/AdGserverdis >/dev/null 2>&1 + config_load "${CONFIGURATION}" + config_get waitonboot $CONFIGURATION waitonboot "0" + config_get_bool enabled $CONFIGURATION enabled 0 + config_get binpath $CONFIGURATION binpath "/usr/bin/AdGuardHome/AdGuardHome" + [ -f "$binpath" ] && start_service + if [ "$enabled" == "1" ] && [ "$waitonboot" == "1" ]; then + procd_open_instance "waitnet" + procd_set_param command "/usr/share/AdGuardHome/waitnet.sh" + procd_close_instance + echo "no net start pinging" + fi +} + +testbackup(){ + config_load "${CONFIGURATION}" + if [ "$1" == "backup" ]; then + backup + elif [ "$1" == "restore" ]; then + restore + fi +} +restore() +{ + config_get workdir $CONFIGURATION workdir "/usr/bin/AdGuardHome" + config_get backupwdpath $CONFIGURATION backupwdpath "/usr/bin/AdGuardHome" + cp -u -r -f $backupwdpath/data $workdir +} +backup() { + config_get backupwdpath $CONFIGURATION backupwdpath "/usr/bin/AdGuardHome" + mkdir -p $backupwdpath/data + config_get workdir $CONFIGURATION workdir "/usr/bin/AdGuardHome" + config_get backupfile $CONFIGURATION backupfile "" + for one in $backupfile; + do + while : + do + if [ -d "$backupwdpath/data/$one" ]; then + cpret=$(cp -u -r -f $workdir/data/$one $backupwdpath/data 2>&1) + else + cpret=$(cp -u -r -f $workdir/data/$one $backupwdpath/data/$one 2>&1) + fi + echo "$cpret" + echo "$cpret" | grep "no space left on device" + if [ "$?" == "0" ]; then + echo "磁盘已满,删除log重试中" + del_querylog && continue + rm -f -r $backupwdpath/data/filters + rm -f -r $workdir/data/filters && continue + echo "backup failed" + fi + break + done + done +} +start_service() { + # Reading config + rm /var/run/AdGserverdis >/dev/null 2>&1 + config_load "${CONFIGURATION}" + # update password + config_get hashpass $CONFIGURATION hashpass "" + config_get configpath $CONFIGURATION configpath "/etc/AdGuardHome.yaml" + if [ -n "$hashpass" ]; then + config_editor "users.password" "$hashpass" "$configpath" + uci set $CONFIGURATION.$CONFIGURATION.hashpass="" + fi + local enabled + config_get_bool enabled $CONFIGURATION enabled 0 + # update crontab + do_crontab + if [ "$enabled" == "0" ]; then + _do_redirect 0 + return + fi + #what need to do before reload + config_get workdir $CONFIGURATION workdir "/usr/bin/AdGuardHome" + + config_get backupfile $CONFIGURATION backupfile "" + mkdir -p $workdir/data + if [ -n "$backupfile" ] && [ ! -d "$workdir/data" ]; then + restore + fi + # for overlay data-stk-oo not suppport + local cwdfs=$(get_filesystem $workdir) + echo "workdir is a $cwdfs filesystem" + if [ "$cwdfs" == "jffs2" ]; then + echo "fs error ln db to tmp $workdir $cwdfs" + logger "AdGuardHome" "warning db redirect to tmp" + touch $workdir/data/stats.db + if [ ! -L $workdir/data/stats.db ]; then + mv -f $workdir/data/stats.db /tmp/stats.db 2>/dev/null + ln -s /tmp/stats.db $workdir/data/stats.db 2>/dev/null + fi + touch $workdir/data/sessions.db + if [ ! -L $workdir/data/sessions.db ]; then + mv -f $workdir/data/sessions.db /tmp/sessions.db 2>/dev/null + ln -s /tmp/sessions.db $workdir/data/sessions.db 2>/dev/null + fi + fi + local ADDITIONAL_ARGS="" + config_get binpath $CONFIGURATION binpath "/usr/bin/AdGuardHome/AdGuardHome" + + mkdir -p ${binpath%/*} + ADDITIONAL_ARGS="$ADDITIONAL_ARGS -c $configpath" + ADDITIONAL_ARGS="$ADDITIONAL_ARGS -w $workdir" + config_get httpport $CONFIGURATION httpport 3000 + ADDITIONAL_ARGS="$ADDITIONAL_ARGS -p $httpport" + + # hack to save config file when upgrade system + config_get upprotect $CONFIGURATION upprotect "" + eval upprotect=${upprotect// /\\\\n} + echo -e "$upprotect">/lib/upgrade/keep.d/luci-app-adguardhome + + config_get logfile $CONFIGURATION logfile "" + if [ -n "$logfile" ]; then + ADDITIONAL_ARGS="$ADDITIONAL_ARGS -l $logfile" + fi + + if [ ! -f "$binpath" ]; then + _do_redirect 0 + /usr/share/AdGuardHome/update_core.sh 2>&1 >/tmp/AdGuardHome_update.log & + exit 0 + fi + + config_get_bool verbose $CONFIGURATION verbose 0 + if [ "$verbose" -eq 1 ]; then + ADDITIONAL_ARGS="$ADDITIONAL_ARGS -v" + fi + + procd_open_instance + get_tz + if [ -n "$SET_TZ" ]; then + procd_set_param env TZ="$SET_TZ" + fi + procd_set_param respawn ${respawn_threshold:-3600} ${respawn_timeout:-5} ${respawn_retry:-5} + procd_set_param limits core="unlimited" nofile="65535 65535" + procd_set_param stderr 1 + procd_set_param command $binpath $ADDITIONAL_ARGS + procd_set_param file "$configpath" "/etc/hosts" "/etc/config/AdGuardHome" + procd_close_instance + if [ -f "$configpath" ]; then + _do_redirect 1 + else + _do_redirect 0 + config_get "redirect" "AdGuardHome" "redirect" "none" + if [ "$redirect" != "none" ]; then + procd_open_instance "waitconfig" + procd_set_param command "/usr/share/AdGuardHome/watchconfig.sh" + procd_close_instance + echo "no config start watching" + fi + fi + echo "AdGuardHome service enabled" + echo "luci enable switch=$enabled" + (sleep 10 && [ -z "$(pgrep $binpath)" ] && logger "AdGuardHome" "no process in 10s cancel redirect" && _do_redirect 0 )& +} +reload_service() +{ + rm /var/run/AdGlucitest >/dev/null 2>&1 + echo "AdGuardHome reloading" + start +} + +del_querylog(){ +local btarget=$(ls $backupwdpath/data | grep -F "querylog.json" | sort -r | head -n 1) +local wtarget=$(ls $workdir/data | grep -F "querylog.json" | sort -r | head -n 1) +if [ "$btarget"x == "$wtarget"x ]; then + [ -z "$btarget" ] && return 1 + rm -f $workdir/data/$wtarget + rm -f $backupwdpath/data/$btarget + return 0 +fi +if [ "$btarget" \> "$wtarget" ]; then + rm -f $backupwdpath/data/$btarget + return 0 +else + rm -f $workdir/data/$wtarget + return 0 +fi +} +stop_service() +{ + config_load "${CONFIGURATION}" + _do_redirect 0 + do_crontab + if [ "$1" != "nobackup" ]; then + config_get backupfile $CONFIGURATION backupfile "0" + if [ -n "$backupfile" ]; then + backup + fi + fi + echo "AdGuardHome service disabled" + touch /var/run/AdGserverdis +} +boot() { + rc_procd boot_service "$@" + if eval "type service_started" 2>/dev/null >/dev/null; then + service_started + fi +} +test_crontab(){ +config_load "${CONFIGURATION}" +do_crontab +} +do_crontab(){ + config_get_bool enabled $CONFIGURATION enabled 0 + config_get crontab $CONFIGURATION crontab "" + local findstr default cronenable replace commit + local cronreload=0 + local commit=0 + findstr="/usr/share/AdGuardHome/update_core.sh" + default="30 3 * * * /usr/share/AdGuardHome/update_core.sh 2>&1" + [ "$enabled" == "0" ] || [ "${crontab//autoupdate/}" == "$crontab" ] && cronenable=0 || cronenable=1 + crontab_editor + + config_get workdir $CONFIGURATION workdir "/usr/bin/AdGuardHome" + config_get lastworkdir $CONFIGURATION lastworkdir "/usr/bin/AdGuardHome" + findstr="/usr/share/AdGuardHome/tailto.sh [0-9]* \$(uci get AdGuardHome.AdGuardHome.workdir)/data/querylog.json" + #[ -n "$lastworkdir" ] && findstr="/usr/share/AdGuardHome/tailto.sh [0-9]* $lastworkdir/data/querylog.json" && [ "$lastworkdir" != "$workdir" ] && replace="${lastworkdir//\//\\/}/${workdir//\//\\/}" + default="0 * * * * /usr/share/AdGuardHome/tailto.sh 2000 \$(uci get AdGuardHome.AdGuardHome.workdir)/data/querylog.json" + [ "$enabled" == "0" ] || [ "${crontab//cutquerylog/}" == "$crontab" ] && cronenable=0 || cronenable=1 + crontab_editor + #[ "$lastworkdir" != "$workdir" ] && uci set AdGuardHome.AdGuardHome.lastworkdir="$workdir" && commit=1 + + config_get logfile $CONFIGURATION logfile "" + config_get lastlogfile $CONFIGURATION lastlogfile "" + findstr="/usr/share/AdGuardHome/tailto.sh [0-9]* \$(uci get AdGuardHome.AdGuardHome.logfile)" + default="30 3 * * * /usr/share/AdGuardHome/tailto.sh 2000 \$(uci get AdGuardHome.AdGuardHome.logfile)" + #[ -n "$lastlogfile" ] && findstr="/usr/share/AdGuardHome/tailto.sh [0-9]* $lastlogfile" && [ -n "$logfile" ] && [ "$lastlogfile" != "$logfile" ] && replace="${lastlogfile//\//\\/}/${logfile//\//\\/}" + [ "$logfile" == "syslog" ] || [ "$logfile" == "" ] || [ "$enabled" == "0" ] || [ "${crontab//cutruntimelog/}" == "$crontab" ] && cronenable=0 || cronenable=1 + crontab_editor + #[ -n "$logfile" ] && [ "$lastlogfile" != "$logfile" ] && uci set AdGuardHome.AdGuardHome.lastlogfile="$logfile" && commit=1 + + findstr="/usr/share/AdGuardHome/addhost.sh" + default="0 * * * * /usr/share/AdGuardHome/addhost.sh" + [ "$enabled" == "0" ] || [ "${crontab//autohost/}" == "$crontab" ] && cronenable=0 || cronenable=1 + crontab_editor + [ "$cronenable" == "0" ] && /usr/share/AdGuardHome/addhost.sh "del" "noreload" || /usr/share/AdGuardHome/addhost.sh "" "noreload" + + findstr="/usr/share/AdGuardHome/gfw2adg.sh" + default="30 3 * * * /usr/share/AdGuardHome/gfw2adg.sh" + [ "$enabled" == "0" ] || [ "${crontab//autogfw/}" == "$crontab" ] && cronenable=0 || cronenable=1 + crontab_editor + [ "$cronreload" -gt 0 ] && /etc/init.d/cron restart + #[ "$commit" -gt 0 ] && uci commit AdGuardHome +} +crontab_editor(){ + #usage input: + #findstr= + #default= + #cronenable= + #replace="${last//\//\\/}/${now//\//\\/}" + #output:cronreload:if >1 please /etc/init.d/cron restart manual + local testline reload + local line="$(grep "$findstr" $CRON_FILE)" + [ -n "$replace" ] && [ -n "$line" ] && eval testline="\${line//$replace}" && [ "$testline" != "$line" ] && line="$testline" && reload="1" && replace="" + if [ "${line:0:1}" != "#" ]; then + if [ $cronenable -eq 1 ]; then + [ -z "$line" ] && line="$default" && reload="1" + if [ -n "$reload" ]; then + sed -i "\,$findstr,d" $CRON_FILE + echo "$line" >> $CRON_FILE + cronreload=$((cronreload+1)) + fi + elif [ -n "$line" ]; then + sed -i "\,$findstr,d" $CRON_FILE + echo "#$line" >> $CRON_FILE + cronreload=$((cronreload+1)) + fi + else + if [ $cronenable -eq 1 ]; then + sed -i "\,$findstr,d" $CRON_FILE + echo "${line:1}" >> $CRON_FILE + cronreload=$((cronreload+1)) + elif [ -z "$reload" ]; then + sed -i "\,$findstr,d" $CRON_FILE + echo "$line" >> $CRON_FILE + fi + fi + +} diff --git a/package/ctcgfw/luci-app-adguardhome/root/etc/uci-defaults/40_luci-AdGuardHome b/package/ctcgfw/luci-app-adguardhome/root/etc/uci-defaults/40_luci-AdGuardHome new file mode 100755 index 0000000000..2d467df980 --- /dev/null +++ b/package/ctcgfw/luci-app-adguardhome/root/etc/uci-defaults/40_luci-AdGuardHome @@ -0,0 +1,12 @@ +#!/bin/sh + +uci -q batch <<-EOF >/dev/null 2>&1 + delete ucitrack.@AdGuardHome[-1] + add ucitrack AdGuardHome + set ucitrack.@AdGuardHome[-1].init=AdGuardHome + commit ucitrack + delete AdGuardHome.AdGuardHome.ucitracktest +EOF + +rm -f /tmp/luci-indexcache +exit 0 diff --git a/package/ctcgfw/luci-app-adguardhome/root/usr/share/AdGuardHome/AdGuardHome_template.yaml b/package/ctcgfw/luci-app-adguardhome/root/usr/share/AdGuardHome/AdGuardHome_template.yaml new file mode 100644 index 0000000000..7e6a66abc7 --- /dev/null +++ b/package/ctcgfw/luci-app-adguardhome/root/usr/share/AdGuardHome/AdGuardHome_template.yaml @@ -0,0 +1,109 @@ +#提交就可以直接用的配置模板文件 +#a template config can be use with a apply +bind_host: 0.0.0.0 +bind_port: 3000 +users: +- name: root + password: $2y$10$FfeQavihMUiXCuJhHuQwy.6EOXDvkXb/S50qI5fXizqarNT/ShhQm +language: "" +rlimit_nofile: 0 +dns: + bind_host: 0.0.0.0 + port: 5553 + statistics_interval: 1 + protection_enabled: true + filtering_enabled: true + filters_update_interval: 24 + blocking_mode: nxdomain + blocked_response_ttl: 10 + querylog_enabled: false + querylog_interval: 1 + ratelimit: 0 + ratelimit_whitelist: [] + refuse_any: false + bootstrap_dns: +#bootstrap_dns + all_servers: false + allowed_clients: [] + disallowed_clients: [] + blocked_hosts: [] + parental_block_host: "" + safebrowsing_block_host: "" + blocked_services: [] + cache_size: 4194304 + parental_sensitivity: 13 + 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: [] + upstream_dns: +#upstream_dns +tls: + enabled: false + server_name: "" + force_https: false + port_https: 443 + port_dns_over_tls: 853 + certificate_chain: "" + private_key: "" + certificate_path: "" + private_key_path: "" +filters: +- enabled: true + url: https://adguardteam.github.io/AdGuardSDNSFilter/Filters/filter.txt + name: AdGuard Simplified Domain Names filter + id: 1 +- enabled: true + url: https://adaway.org/hosts.txt + name: AdAway + id: 2 +- enabled: false + url: https://hosts-file.net/ad_servers.txt + name: hpHosts - Ad and Tracking servers only + id: 3 +- enabled: true + url: https://www.malwaredomainlist.com/hostslist/hosts.txt + name: MalwareDomainList.com Hosts List + id: 4 +- enabled: false + url: https://raw.githubusercontent.com/vokins/yhosts/master/data/tvbox.txt + name: tvbox + id: 1575018007 +- enabled: true + url: https://hosts.nfz.moe/full/hosts + name: neoHosts full + id: 1575618240 +- enabled: false + url: https://hosts.nfz.moe/basic/hosts + name: neoHosts basic + id: 1575618241 +- enabled: false + url: http://sbc.io/hosts/hosts + name: StevenBlack host basic + id: 1575618242 +- enabled: false + url: http://sbc.io/hosts/alternates/fakenews-gambling-porn-social/hosts + name: StevenBlack host+fakenews + gambling + porn + social + id: 1575618243 +- enabled: false + url: https://cdn.jsdelivr.net/gh/privacy-protection-tools/anti-AD/anti-ad-easylist.txt + name: anti-AD(Adblock+neohosts+yhosts+cjxlist+adhlist) + id: 1577113202 +user_rules: [] +dhcp: + enabled: false + interface_name: "" + gateway_ip: "" + subnet_mask: "" + range_start: "" + range_end: "" + lease_duration: 86400 + icmp_timeout_msec: 1000 +clients: [] +log_file: "" +verbose: false +schema_version: 5 \ No newline at end of file diff --git a/package/ctcgfw/luci-app-adguardhome/root/usr/share/AdGuardHome/addhost.sh b/package/ctcgfw/luci-app-adguardhome/root/usr/share/AdGuardHome/addhost.sh new file mode 100755 index 0000000000..2461b74dd2 --- /dev/null +++ b/package/ctcgfw/luci-app-adguardhome/root/usr/share/AdGuardHome/addhost.sh @@ -0,0 +1,33 @@ +#!/bin/sh +checkmd5(){ +local nowmd5=$(md5sum /etc/hosts) +nowmd5=${nowmd5%% *} +local lastmd5=$(uci get AdGuardHome.AdGuardHome.hostsmd5 2>/dev/null) +if [ "$nowmd5" != "$lastmd5" ]; then + uci set AdGuardHome.AdGuardHome.hostsmd5="$nowmd5" + uci commit AdGuardHome + [ "$1" == "noreload" ] || /etc/init.d/AdGuardHome reload +fi +} +[ "$1" == "del" ] && sed -i '/programaddstart/,/programaddend/d' /etc/hosts && checkmd5 "$2" && exit 0 +/usr/bin/awk 'BEGIN{ +while ((getline < "/tmp/dhcp.leases") > 0) +{ + a[$2]=$4; +} +while (("ip -6 neighbor show | grep -v fe80" | getline) > 0) +{ + if (a[$5]) {print $1" "a[$5] >"/tmp/tmphost"; } +} +print "#programaddend" >"/tmp/tmphost"; +}' +grep programaddstart /etc/hosts >/dev/null 2>&1 +if [ "$?" == "0" ]; then + sed -i '/programaddstart/,/programaddend/c\#programaddstart' /etc/hosts + sed -i '/programaddstart/'r/tmp/tmphost /etc/hosts +else + echo "#programaddstart" >>/etc/hosts + cat /tmp/tmphost >> /etc/hosts +fi +rm /tmp/tmphost +checkmd5 "$2" \ No newline at end of file diff --git a/package/ctcgfw/luci-app-adguardhome/root/usr/share/AdGuardHome/firewall.start b/package/ctcgfw/luci-app-adguardhome/root/usr/share/AdGuardHome/firewall.start new file mode 100755 index 0000000000..562117e52e --- /dev/null +++ b/package/ctcgfw/luci-app-adguardhome/root/usr/share/AdGuardHome/firewall.start @@ -0,0 +1,8 @@ +#!/bin/sh + +AdGuardHome_enable=$(uci get AdGuardHome.AdGuardHome.enabled) +redirect=$(uci get AdGuardHome.AdGuardHome.redirect) + +if [ $AdGuardHome_enable -eq 1 -a "$redirect" == "redirect" ]; then + /etc/init.d/AdGuardHome do_redirect 1 +fi diff --git a/package/ctcgfw/luci-app-adguardhome/root/usr/share/AdGuardHome/getsyslog.sh b/package/ctcgfw/luci-app-adguardhome/root/usr/share/AdGuardHome/getsyslog.sh new file mode 100755 index 0000000000..c95cc077b3 --- /dev/null +++ b/package/ctcgfw/luci-app-adguardhome/root/usr/share/AdGuardHome/getsyslog.sh @@ -0,0 +1,19 @@ +#!/bin/sh +PATH="/usr/sbin:/usr/bin:/sbin:/bin" +logread -e AdGuardHome > /tmp/AdGuardHometmp.log +logread -e AdGuardHome -f >> /tmp/AdGuardHometmp.log & +pid=$! +echo "1">/var/run/AdGuardHomesyslog +while true +do + sleep 12 + watchdog=$(cat /var/run/AdGuardHomesyslog) + if [ "$watchdog"x == "0"x ]; then + kill $pid + rm /tmp/AdGuardHometmp.log + rm /var/run/AdGuardHomesyslog + exit 0 + else + echo "0">/var/run/AdGuardHomesyslog + fi +done \ No newline at end of file diff --git a/package/ctcgfw/luci-app-adguardhome/root/usr/share/AdGuardHome/gfw2adg.sh b/package/ctcgfw/luci-app-adguardhome/root/usr/share/AdGuardHome/gfw2adg.sh new file mode 100755 index 0000000000..386d4307a8 --- /dev/null +++ b/package/ctcgfw/luci-app-adguardhome/root/usr/share/AdGuardHome/gfw2adg.sh @@ -0,0 +1,86 @@ +#!/bin/sh +PATH="/usr/sbin:/usr/bin:/sbin:/bin" +checkmd5(){ +local nowmd5=$(md5sum /tmp/adguard.list 2>/dev/null) +nowmd5=${nowmd5%% *} +local lastmd5=$(uci get AdGuardHome.AdGuardHome.gfwlistmd5 2>/dev/null) +if [ "$nowmd5" != "$lastmd5" ]; then + uci set AdGuardHome.AdGuardHome.gfwlistmd5="$nowmd5" + uci commit AdGuardHome + [ "$1" == "noreload" ] || /etc/init.d/AdGuardHome reload +fi +} +configpath=$(uci get AdGuardHome.AdGuardHome.configpath 2>/dev/null) +[ "$1" == "del" ] && sed -i '/programaddstart/,/programaddend/d' $configpath && checkmd5 "$2" && exit 0 +gfwupstream=$(uci get AdGuardHome.AdGuardHome.gfwupstream 2>/dev/null) +if [ -z $gfwupstream ]; then +gfwupstream="tcp://208.67.220.220:5353" +fi +if [ ! -f "$configpath" ]; then + echo "please make a config first" + exit 1 +fi +wget-ssl --no-check-certificate https://cdn.jsdelivr.net/gh/gfwlist/gfwlist/gfwlist.txt -O- | base64 -d > /tmp/gfwlist.txt +cat /tmp/gfwlist.txt | awk -v upst="$gfwupstream" 'BEGIN{getline;}{ +s1=substr($0,1,1); +if (s1=="!") +{next;} +if (s1=="@"){ + $0=substr($0,3); + s1=substr($0,1,1); + white=1;} +else{ + white=0; +} + +if (s1=="|") + {s2=substr($0,2,1); + if (s2=="|") + { + $0=substr($0,3); + split($0,d,"/"); + $0=d[1]; + }else{ + split($0,d,"/"); + $0=d[3]; + }} +else{ + split($0,d,"/"); + $0=d[1]; +} +star=index($0,"*"); +if (star!=0) +{ + $0=substr($0,star+1); + dot=index($0,"."); + if (dot!=0) + $0=substr($0,dot+1); + else + next; + s1=substr($0,1,1); +} +if (s1==".") +{fin=substr($0,2);} +else{fin=$0;} +if (index(fin,".")==0) next; +if (index(fin,"%")!=0) next; +if (index(fin,":")!=0) next; +match(fin,"^[0-9\.]+") +if (RSTART==1 && RLENGTH==length(fin)) {print "ipset add gfwlist "fin>"/tmp/doipset.sh";next;} +if (fin=="" || finl==fin) next; +finl=fin; +if (white==0) + {print(" - '\''[/"fin"/]"upst"'\''");} +else{ + print(" - '\''[/"fin"/]#'\''");} +}END{print(" - '\''[/programaddend/]#'\''")}' > /tmp/adguard.list +grep programaddstart $configpath +if [ "$?" == "0" ]; then + sed -i '/programaddstart/,/programaddend/c\ - '\''\[\/programaddstart\/\]#'\''' $configpath + sed -i '/programaddstart/'r/tmp/adguard.list $configpath +else + sed -i '1i\ - '\''[/programaddstart/]#'\''' /tmp/adguard.list + sed -i '/upstream_dns:/'r/tmp/adguard.list $configpath +fi +checkmd5 "$2" +rm -f /tmp/gfwlist.txt /tmp/adguard.list \ No newline at end of file diff --git a/package/ctcgfw/luci-app-adguardhome/root/usr/share/AdGuardHome/links.txt b/package/ctcgfw/luci-app-adguardhome/root/usr/share/AdGuardHome/links.txt new file mode 100644 index 0000000000..1059be5512 --- /dev/null +++ b/package/ctcgfw/luci-app-adguardhome/root/usr/share/AdGuardHome/links.txt @@ -0,0 +1,3 @@ +https://github.com/AdguardTeam/AdGuardHome/releases/download/${latest_ver}/AdGuardHome_linux_${Arch}.tar.gz +https://static.adguard.com/adguardhome/release/AdGuardHome_linux_${Arch}.tar.gz +#https://static.adguard.com/adguardhome/beta/AdGuardHome_linux_${Arch}.tar.gz \ No newline at end of file diff --git a/package/ctcgfw/luci-app-adguardhome/root/usr/share/AdGuardHome/tailto.sh b/package/ctcgfw/luci-app-adguardhome/root/usr/share/AdGuardHome/tailto.sh new file mode 100755 index 0000000000..ab70e3a6ef --- /dev/null +++ b/package/ctcgfw/luci-app-adguardhome/root/usr/share/AdGuardHome/tailto.sh @@ -0,0 +1,4 @@ +#!/bin/sh +tail -n $1 "$2" > /var/run/tailtmp +cat /var/run/tailtmp > "$2" +rm /var/run/tailtmp \ No newline at end of file diff --git a/package/ctcgfw/luci-app-adguardhome/root/usr/share/AdGuardHome/update_core.sh b/package/ctcgfw/luci-app-adguardhome/root/usr/share/AdGuardHome/update_core.sh new file mode 100755 index 0000000000..2469919e31 --- /dev/null +++ b/package/ctcgfw/luci-app-adguardhome/root/usr/share/AdGuardHome/update_core.sh @@ -0,0 +1,231 @@ +#!/bin/bash +PATH="/usr/sbin:/usr/bin:/sbin:/bin" +binpath=$(uci get AdGuardHome.AdGuardHome.binpath) +if [ -z "$binpath" ]; then +uci set AdGuardHome.AdGuardHome.binpath="/tmp/AdGuardHome/AdGuardHome" +binpath="/tmp/AdGuardHome/AdGuardHome" +fi +mkdir -p ${binpath%/*} +upxflag=$(uci get AdGuardHome.AdGuardHome.upxflag 2>/dev/null) + +check_if_already_running(){ + running_tasks="$(ps |grep "AdGuardHome" |grep "update_core" |grep -v "grep" |awk '{print $1}' |wc -l)" + [ "${running_tasks}" -gt "2" ] && echo -e "\nA task is already running." && EXIT 2 +} + +check_wgetcurl(){ + which curl && downloader="curl -L -k --retry 2 --connect-timeout 20 -o" && return + which wget-ssl && downloader="wget-ssl --no-check-certificate -t 2 -T 20 -O" && return + [ -z "$1" ] && opkg update || (echo error opkg && EXIT 1) + [ -z "$1" ] && (opkg remove wget wget-nossl --force-depends ; opkg install wget ; check_wgetcurl 1 ;return) + [ "$1" == "1" ] && (opkg install curl ; check_wgetcurl 2 ; return) + echo error curl and wget && EXIT 1 +} +check_latest_version(){ + check_wgetcurl + latest_ver="$($downloader - https://api.github.com/repos/AdguardTeam/AdGuardHome/releases/latest 2>/dev/null|grep -E 'tag_name' |grep -E 'v[0-9.]+' -o 2>/dev/null)" + if [ -z "${latest_ver}" ]; then + echo -e "\nFailed to check latest version, please try again later." && EXIT 1 + fi + now_ver="$($binpath -c /dev/null --check-config 2>&1| grep -m 1 -E 'v[0-9.]+' -o)" + if [ "${latest_ver}"x != "${now_ver}"x ] || [ "$1" == "force" ]; then + echo -e "Local version: ${now_ver}., cloud version: ${latest_ver}." + doupdate_core + else + echo -e "\nLocal version: ${now_ver}, cloud version: ${latest_ver}." + echo -e "You're already using the latest version." + if [ ! -z "$upxflag" ]; then + filesize=$(ls -l $binpath | awk '{ print $5 }') + if [ $filesize -gt 8000000 ]; then + echo -e "start upx may take a long time" + doupx + mkdir -p "/tmp/AdGuardHomeupdate/AdGuardHome" >/dev/null 2>&1 + rm -fr /tmp/AdGuardHomeupdate/AdGuardHome/${binpath##*/} + /tmp/upx-${upx_latest_ver}-${Arch}_linux/upx $upxflag $binpath -o /tmp/AdGuardHomeupdate/AdGuardHome/${binpath##*/} + rm -rf /tmp/upx-${upx_latest_ver}-${Arch}_linux + /etc/init.d/AdGuardHome stop nobackup + rm $binpath + mv -f /tmp/AdGuardHomeupdate/AdGuardHome/${binpath##*/} $binpath + /etc/init.d/AdGuardHome start + echo -e "finished" + fi + fi + EXIT 0 + fi +} +doupx(){ + Archt="$(opkg info kernel | grep Architecture | awk -F "[ _]" '{print($2)}')" + case $Archt in + "i386") + Arch="i386" + ;; + "i686") + Arch="i386" + echo -e "i686 use $Arch may have bug" + ;; + "x86") + Arch="amd64" + ;; + "mipsel") + Arch="mipsel" + ;; + "mips64el") + Arch="mips64el" + Arch="mipsel" + echo -e "mips64el use $Arch may have bug" + ;; + "mips") + Arch="mips" + ;; + "mips64") + Arch="mips64" + Arch="mips" + echo -e "mips64 use $Arch may have bug" + ;; + "arm") + Arch="arm" + ;; + "armeb") + Arch="armeb" + ;; + "aarch64") + Arch="arm64" + ;; + "powerpc") + Arch="powerpc" + ;; + "powerpc64") + Arch="powerpc64" + ;; + *) + echo -e "error not support $Archt if you can use offical release please issue a bug" + EXIT 1 + ;; + esac + upx_latest_ver="$($downloader - https://api.github.com/repos/upx/upx/releases/latest 2>/dev/null|grep -E 'tag_name' |grep -E '[0-9.]+' -o 2>/dev/null)" + $downloader /tmp/upx-${upx_latest_ver}-${Arch}_linux.tar.xz "https://github.com/upx/upx/releases/download/v${upx_latest_ver}/upx-${upx_latest_ver}-${Arch}_linux.tar.xz" 2>&1 + #tar xvJf + which xz || (opkg list | grep ^xz || opkg update && opkg install xz) || (echo "xz download fail" && EXIT 1) + mkdir -p /tmp/upx-${upx_latest_ver}-${Arch}_linux + xz -d -c /tmp/upx-${upx_latest_ver}-${Arch}_linux.tar.xz| tar -x -C "/tmp" >/dev/null 2>&1 + if [ ! -e "/tmp/upx-${upx_latest_ver}-${Arch}_linux/upx" ]; then + echo -e "Failed to download upx." + EXIT 1 + fi + rm /tmp/upx-${upx_latest_ver}-${Arch}_linux.tar.xz +} +doupdate_core(){ + echo -e "Updating core..." + mkdir -p "/tmp/AdGuardHomeupdate" + rm -rf /tmp/AdGuardHomeupdate/* >/dev/null 2>&1 + Archt="$(opkg info kernel | grep Architecture | awk -F "[ _]" '{print($2)}')" + case $Archt in + "i386") + Arch="386" + ;; + "i686") + Arch="386" + ;; + "x86") + Arch="amd64" + ;; + "mipsel") + Arch="mipsle" + ;; + "mips64el") + Arch="mips64le" + Arch="mipsle" + echo -e "mips64el use $Arch may have bug" + ;; + "mips") + Arch="mips" + ;; + "mips64") + Arch="mips64" + Arch="mips" + echo -e "mips64 use $Arch may have bug" + ;; + "arm") + Arch="arm" + ;; + "aarch64") + Arch="arm64" + ;; + "powerpc") + Arch="ppc" + echo -e "error not support $Archt" + EXIT 1 + ;; + "powerpc64") + Arch="ppc64" + echo -e "error not support $Archt" + EXIT 1 + ;; + *) + echo -e "error not support $Archt if you can use offical release please issue a bug" + EXIT 1 + ;; + esac + echo -e "start download" + grep -v "^#" /usr/share/AdGuardHome/links.txt >/tmp/run/AdHlinks.txt + while read link + do + eval link="$link" + $downloader /tmp/AdGuardHomeupdate/${link##*/} "$link" 2>&1 + if [ "$?" != "0" ]; then + echo "download failed try another download" + rm -f /tmp/AdGuardHomeupdate/${link##*/} + else + local success="1" + break + fi + done < "/tmp/run/AdHlinks.txt" + rm /tmp/run/AdHlinks.txt + [ -z "$success" ] && echo "no download success" && EXIT 1 + if [ "${link##*.}" == "gz" ]; then + tar -zxf "/tmp/AdGuardHomeupdate/${link##*/}" -C "/tmp/AdGuardHomeupdate/" + if [ ! -e "/tmp/AdGuardHomeupdate/AdGuardHome" ]; then + echo -e "Failed to download core." + rm -rf "/tmp/AdGuardHomeupdate" >/dev/null 2>&1 + EXIT 1 + fi + downloadbin="/tmp/AdGuardHomeupdate/AdGuardHome/AdGuardHome" + else + downloadbin="/tmp/AdGuardHomeupdate/${link##*/}" + fi + chmod 755 $downloadbin + echo -e "download success start copy" + if [ -n "$upxflag" ]; then + echo -e "start upx may take a long time" + doupx + /tmp/upx-${upx_latest_ver}-${Arch}_linux/upx $upxflag $downloadbin + rm -rf /tmp/upx-${upx_latest_ver}-${Arch}_linux + fi + echo -e "start copy" + /etc/init.d/AdGuardHome stop nobackup + rm "$binpath" + mv -f "$downloadbin" "$binpath" + if [ "$?" == "1" ]; then + echo "mv failed maybe not enough space please use upx or change bin to /tmp/AdGuardHome" + EXIT 1 + fi + /etc/init.d/AdGuardHome start + rm -rf "/tmp/AdGuardHomeupdate" >/dev/null 2>&1 + echo -e "Succeeded in updating core." + echo -e "Local version: ${latest_ver}, cloud version: ${latest_ver}.\n" + EXIT 0 +} +EXIT(){ + rm /var/run/update_core 2>/dev/null + [ "$1" != "0" ] && touch /var/run/update_core_error + exit $1 +} +main(){ + + check_if_already_running + check_latest_version $1 +} + trap "EXIT 1" SIGTERM SIGINT + touch /var/run/update_core + rm /var/run/update_core_error 2>/dev/null + main $1 diff --git a/package/ctcgfw/luci-app-adguardhome/root/usr/share/AdGuardHome/waitnet.sh b/package/ctcgfw/luci-app-adguardhome/root/usr/share/AdGuardHome/waitnet.sh new file mode 100755 index 0000000000..a79a8bac87 --- /dev/null +++ b/package/ctcgfw/luci-app-adguardhome/root/usr/share/AdGuardHome/waitnet.sh @@ -0,0 +1,34 @@ +#!/bin/sh +PATH="/usr/sbin:/usr/bin:/sbin:/bin" +count=0 +while : +do + ping -c 1 -W 1 -q www.baidu.com 1>/dev/null 2>&1 + if [ "$?" == "0" ]; then + /etc/init.d/AdGuardHome force_reload + break + fi + ping -c 1 -W 1 -q 202.108.22.5 1>/dev/null 2>&1 + if [ "$?" == "0" ]; then + /etc/init.d/AdGuardHome force_reload + break + fi + sleep 5 + ping -c 1 -W 1 -q www.google.com 1>/dev/null 2>&1 + if [ "$?" == "0" ]; then + /etc/init.d/AdGuardHome force_reload + break + fi + ping -c 1 -W 1 -q 8.8.8.8 1>/dev/null 2>&1 + if [ "$?" == "0" ]; then + /etc/init.d/AdGuardHome force_reload + break + fi + sleep 5 + count=$((count+1)) + if [ $count -gt 18 ]; then + /etc/init.d/AdGuardHome force_reload + break + fi +done +return 0 \ No newline at end of file diff --git a/package/ctcgfw/luci-app-adguardhome/root/usr/share/AdGuardHome/watchconfig.sh b/package/ctcgfw/luci-app-adguardhome/root/usr/share/AdGuardHome/watchconfig.sh new file mode 100755 index 0000000000..c5252250b6 --- /dev/null +++ b/package/ctcgfw/luci-app-adguardhome/root/usr/share/AdGuardHome/watchconfig.sh @@ -0,0 +1,12 @@ +#!/bin/sh +PATH="/usr/sbin:/usr/bin:/sbin:/bin" +configpath=$(uci get AdGuardHome.AdGuardHome.configpath) +while : +do + sleep 10 + if [ -f "$configpath" ]; then + /etc/init.d/AdGuardHome do_redirect 1 + break + fi +done +return 0 \ No newline at end of file diff --git a/package/ctcgfw/luci-app-adguardhome/root/www/luci-static/resources/codemirror/addon/fold/foldcode.js b/package/ctcgfw/luci-app-adguardhome/root/www/luci-static/resources/codemirror/addon/fold/foldcode.js new file mode 100644 index 0000000000..f93d42b7fe --- /dev/null +++ b/package/ctcgfw/luci-app-adguardhome/root/www/luci-static/resources/codemirror/addon/fold/foldcode.js @@ -0,0 +1 @@ +!function(n){"object"==typeof exports&&"object"==typeof module?n(require("../../lib/codemirror")):"function"==typeof define&&define.amd?define(["../../lib/codemirror"],n):n(CodeMirror)}(function(n){"use strict";function e(e,o,i,t){if(i&&i.call){var l=i;i=null}else l=r(e,i,"rangeFinder");"number"==typeof o&&(o=n.Pos(o,0));var f=r(e,i,"minFoldSize");function d(n){var r=l(e,o);if(!r||r.to.line-r.from.linee.firstLine();)o=n.Pos(o.line-1,0),u=d(!1);if(u&&!u.cleared&&"unfold"!==t){var a=function(n,e){var o=r(n,e,"widget");if("string"==typeof o){var i=document.createTextNode(o);(o=document.createElement("span")).appendChild(i),o.className="CodeMirror-foldmarker"}else o&&(o=o.cloneNode(!0));return o}(e,i);n.on(a,"mousedown",function(e){c.clear(),n.e_preventDefault(e)});var c=e.markText(u.from,u.to,{replacedWith:a,clearOnEnter:r(e,i,"clearOnEnter"),__isFold:!0});c.on("clear",function(o,r){n.signal(e,"unfold",e,o,r)}),n.signal(e,"fold",e,u.from,u.to)}}n.newFoldFunction=function(n,o){return function(r,i){e(r,i,{rangeFinder:n,widget:o})}},n.defineExtension("foldCode",function(n,o,r){e(this,n,o,r)}),n.defineExtension("isFolded",function(n){for(var e=this.findMarksAt(n),o=0;o=u){if(s&&f&&s.test(f.className))return;i=r(a.indicatorOpen)}}(i||f)&&t.setGutterMarker(n,a.gutter,i)})}function i(t){return new RegExp("(^|\\s)"+t+"(?:$|\\s)\\s*")}function f(t){var o=t.getViewport(),e=t.state.foldGutter;e&&(t.operation(function(){n(t,o.from,o.to)}),e.from=o.from,e.to=o.to)}function a(t,r,n){var i=t.state.foldGutter;if(i){var f=i.options;if(n==f.gutter){var a=e(t,r);a?a.clear():t.foldCode(o(r,0),f)}}}function d(t){var o=t.state.foldGutter;if(o){var e=o.options;o.from=o.to=0,clearTimeout(o.changeUpdate),o.changeUpdate=setTimeout(function(){f(t)},e.foldOnChangeTimeSpan||600)}}function u(t){var o=t.state.foldGutter;if(o){var e=o.options;clearTimeout(o.changeUpdate),o.changeUpdate=setTimeout(function(){var e=t.getViewport();o.from==o.to||e.from-o.to>20||o.from-e.to>20?f(t):t.operation(function(){e.fromo.to&&(n(t,o.to,e.to),o.to=e.to)})},e.updateViewportTimeSpan||400)}}function l(t,o){var e=t.state.foldGutter;if(e){var r=o.line;r>=e.from&&ro))break;r=l}}return r?{from:e.Pos(i.line,t.getLine(i.line).length),to:e.Pos(r,t.getLine(r).length)}:void 0}})}); \ No newline at end of file diff --git a/package/ctcgfw/luci-app-adguardhome/root/www/luci-static/resources/codemirror/lib/codemirror.css b/package/ctcgfw/luci-app-adguardhome/root/www/luci-static/resources/codemirror/lib/codemirror.css new file mode 100644 index 0000000000..43ac1a9fab --- /dev/null +++ b/package/ctcgfw/luci-app-adguardhome/root/www/luci-static/resources/codemirror/lib/codemirror.css @@ -0,0 +1 @@ +.CodeMirror{font-family:monospace;height:500px;color:black;direction:ltr}.CodeMirror-lines{padding:4px 0}.CodeMirror pre.CodeMirror-line,.CodeMirror pre.CodeMirror-line-like{padding:0 4px}.CodeMirror-scrollbar-filler,.CodeMirror-gutter-filler{background-color:white}.CodeMirror-gutters{border-right:1px solid #ddd;background-color:#f7f7f7;white-space:nowrap}.CodeMirror-linenumber{padding:0 3px 0 5px;min-width:20px;text-align:right;color:#999;white-space:nowrap}.CodeMirror-guttermarker{color:black}.CodeMirror-guttermarker-subtle{color:#999}.CodeMirror-cursor{border-left:1px solid black;border-right:0;width:0}.CodeMirror div.CodeMirror-secondarycursor{border-left:1px solid silver}.cm-fat-cursor .CodeMirror-cursor{width:auto;border:0 !important;background:#7e7}.cm-fat-cursor div.CodeMirror-cursors{z-index:1}.cm-fat-cursor-mark{background-color:rgba(20,255,20,0.5);-webkit-animation:blink 1.06s steps(1) infinite;-moz-animation:blink 1.06s steps(1) infinite;animation:blink 1.06s steps(1) infinite}.cm-animate-fat-cursor{width:auto;border:0;-webkit-animation:blink 1.06s steps(1) infinite;-moz-animation:blink 1.06s steps(1) infinite;animation:blink 1.06s steps(1) infinite;background-color:#7e7}@-moz-keyframes blink{50%{background-color:transparent}}@-webkit-keyframes blink{50%{background-color:transparent}}@keyframes blink{50%{background-color:transparent}}.cm-tab{display:inline-block;text-decoration:inherit}.CodeMirror-rulers{position:absolute;left:0;right:0;top:-50px;bottom:0;overflow:hidden}.CodeMirror-ruler{border-left:1px solid #ccc;top:0;bottom:0;position:absolute}.cm-s-default .cm-header{color:blue}.cm-s-default .cm-quote{color:#090}.cm-negative{color:#d44}.cm-positive{color:#292}.cm-header,.cm-strong{font-weight:bold}.cm-em{font-style:italic}.cm-link{text-decoration:underline}.cm-strikethrough{text-decoration:line-through}.cm-s-default .cm-keyword{color:#708}.cm-s-default .cm-atom{color:#219}.cm-s-default .cm-number{color:#164}.cm-s-default .cm-def{color:#00f}.cm-s-default .cm-variable-2{color:#05a}.cm-s-default .cm-variable-3,.cm-s-default .cm-type{color:#085}.cm-s-default .cm-comment{color:#a50}.cm-s-default .cm-string{color:#a11}.cm-s-default .cm-string-2{color:#f50}.cm-s-default .cm-meta{color:#555}.cm-s-default .cm-qualifier{color:#555}.cm-s-default .cm-builtin{color:#30a}.cm-s-default .cm-bracket{color:#997}.cm-s-default .cm-tag{color:#170}.cm-s-default .cm-attribute{color:#00c}.cm-s-default .cm-hr{color:#999}.cm-s-default .cm-link{color:#00c}.cm-s-default .cm-error{color:red}.cm-invalidchar{color:red}.CodeMirror-composing{border-bottom:2px solid}div.CodeMirror span.CodeMirror-matchingbracket{color:#0b0}div.CodeMirror span.CodeMirror-nonmatchingbracket{color:#a22}.CodeMirror-matchingtag{background:rgba(255,150,0,.3)}.CodeMirror-activeline-background{background:#e8f2ff}.CodeMirror{position:relative;overflow:hidden;background:white}.CodeMirror-scroll{overflow:scroll !important;margin-bottom:-30px;margin-right:-30px;padding-bottom:30px;height:100%;outline:0;position:relative}.CodeMirror-sizer{position:relative;border-right:30px solid transparent}.CodeMirror-vscrollbar,.CodeMirror-hscrollbar,.CodeMirror-scrollbar-filler,.CodeMirror-gutter-filler{position:absolute;z-index:6;display:none}.CodeMirror-vscrollbar{right:0;top:0;overflow-x:hidden;overflow-y:scroll}.CodeMirror-hscrollbar{bottom:0;left:0;overflow-y:hidden;overflow-x:scroll}.CodeMirror-scrollbar-filler{right:0;bottom:0}.CodeMirror-gutter-filler{left:0;bottom:0}.CodeMirror-gutters{position:absolute;left:0;top:0;min-height:100%;z-index:3}.CodeMirror-gutter{white-space:normal;height:100%;display:inline-block;vertical-align:top;margin-bottom:-30px}.CodeMirror-gutter-wrapper{position:absolute;z-index:4;background:none !important;border:none !important}.CodeMirror-gutter-background{position:absolute;top:0;bottom:0;z-index:4}.CodeMirror-gutter-elt{position:absolute;cursor:default;z-index:4}.CodeMirror-gutter-wrapper ::selection{background-color:transparent}.CodeMirror-gutter-wrapper ::-moz-selection{background-color:transparent}.CodeMirror-lines{cursor:text;min-height:1px}.CodeMirror pre.CodeMirror-line,.CodeMirror pre.CodeMirror-line-like{-moz-border-radius:0;-webkit-border-radius:0;border-radius:0;border-width:0;background:transparent;font-family:inherit;font-size:inherit;margin:0;white-space:pre;word-wrap:normal;line-height:inherit;color:inherit;z-index:2;position:relative;overflow:visible;-webkit-tap-highlight-color:transparent;-webkit-font-variant-ligatures:contextual;font-variant-ligatures:contextual}.CodeMirror-wrap pre.CodeMirror-line,.CodeMirror-wrap pre.CodeMirror-line-like{word-wrap:break-word;white-space:pre-wrap;word-break:normal}.CodeMirror-linebackground{position:absolute;left:0;right:0;top:0;bottom:0;z-index:0}.CodeMirror-linewidget{position:relative;z-index:2;padding:.1px}.CodeMirror-rtl pre{direction:rtl}.CodeMirror-code{outline:0}.CodeMirror-scroll,.CodeMirror-sizer,.CodeMirror-gutter,.CodeMirror-gutters,.CodeMirror-linenumber{-moz-box-sizing:content-box;box-sizing:content-box}.CodeMirror-measure{position:absolute;width:100%;height:0;overflow:hidden;visibility:hidden}.CodeMirror-cursor{position:absolute;pointer-events:none}.CodeMirror-measure pre{position:static}div.CodeMirror-cursors{visibility:hidden;position:relative;z-index:3}div.CodeMirror-dragcursors{visibility:visible}.CodeMirror-focused div.CodeMirror-cursors{visibility:visible}.CodeMirror-selected{background:#d9d9d9}.CodeMirror-focused .CodeMirror-selected{background:#d7d4f0}.CodeMirror-crosshair{cursor:crosshair}.CodeMirror-line::selection,.CodeMirror-line>span::selection,.CodeMirror-line>span>span::selection{background:#d7d4f0}.CodeMirror-line::-moz-selection,.CodeMirror-line>span::-moz-selection,.CodeMirror-line>span>span::-moz-selection{background:#d7d4f0}.cm-searching{background-color:#ffa;background-color:rgba(255,255,0,.4)}.cm-force-border{padding-right:.1px}@media print{.CodeMirror div.CodeMirror-cursors{visibility:hidden}}.cm-tab-wrap-hack:after{content:''}span.CodeMirror-selectedtext{background:0} diff --git a/package/ctcgfw/luci-app-adguardhome/root/www/luci-static/resources/codemirror/lib/codemirror.js b/package/ctcgfw/luci-app-adguardhome/root/www/luci-static/resources/codemirror/lib/codemirror.js new file mode 100644 index 0000000000..d01f072ee4 --- /dev/null +++ b/package/ctcgfw/luci-app-adguardhome/root/www/luci-static/resources/codemirror/lib/codemirror.js @@ -0,0 +1 @@ +!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):e.CodeMirror=t()}(this,function(){"use strict";var e=navigator.userAgent,t=navigator.platform,r=/gecko\/\d/i.test(e),n=/MSIE \d/.test(e),i=/Trident\/(?:[7-9]|\d{2,})\..*rv:(\d+)/.exec(e),o=/Edge\/(\d+)/.exec(e),l=n||i||o,s=l&&(n?document.documentMode||6:+(o||i)[1]),a=!o&&/WebKit\//.test(e),u=a&&/Qt\/\d+\.\d+/.test(e),c=!o&&/Chrome\//.test(e),h=/Opera\//.test(e),f=/Apple Computer/.test(navigator.vendor),d=/Mac OS X 1\d\D([8-9]|\d\d)\D/.test(e),p=/PhantomJS/.test(e),g=!o&&/AppleWebKit/.test(e)&&/Mobile\/\w+/.test(e),v=/Android/.test(e),m=g||v||/webOS|BlackBerry|Opera Mini|Opera Mobi|IEMobile/i.test(e),y=g||/Mac/.test(t),b=/\bCrOS\b/.test(e),w=/win/i.test(t),x=h&&e.match(/Version\/(\d*\.\d*)/);x&&(x=Number(x[1])),x&&x>=15&&(h=!1,a=!0);var C=y&&(u||h&&(null==x||x<12.11)),S=r||l&&s>=9;function L(e){return new RegExp("(^|\\s)"+e+"(?:$|\\s)\\s*")}var k,T=function(e,t){var r=e.className,n=L(t).exec(r);if(n){var i=r.slice(n.index+n[0].length);e.className=r.slice(0,n.index)+(i?n[1]+i:"")}};function M(e){for(var t=e.childNodes.length;t>0;--t)e.removeChild(e.firstChild);return e}function N(e,t){return M(e).appendChild(t)}function O(e,t,r,n){var i=document.createElement(e);if(r&&(i.className=r),n&&(i.style.cssText=n),"string"==typeof t)i.appendChild(document.createTextNode(t));else if(t)for(var o=0;o=t)return l+(t-o);l+=s-o,l+=r-l%r,o=s+1}}g?P=function(e){e.selectionStart=0,e.selectionEnd=e.value.length}:l&&(P=function(e){try{e.select()}catch(e){}});var R=function(){this.id=null,this.f=null,this.time=0,this.handler=E(this.onTimeout,this)};function B(e,t){for(var r=0;r=t)return n+Math.min(l,t-i);if(i+=o-n,n=o+1,(i+=r-i%r)>=t)return n}}var Y=[""];function _(e){for(;Y.length<=e;)Y.push($(Y)+" ");return Y[e]}function $(e){return e[e.length-1]}function q(e,t){for(var r=[],n=0;n"€"&&(e.toUpperCase()!=e.toLowerCase()||J.test(e))}function te(e,t){return t?!!(t.source.indexOf("\\w")>-1&&ee(e))||t.test(e):ee(e)}function re(e){for(var t in e)if(e.hasOwnProperty(t)&&e[t])return!1;return!0}var ne=/[\u0300-\u036f\u0483-\u0489\u0591-\u05bd\u05bf\u05c1\u05c2\u05c4\u05c5\u05c7\u0610-\u061a\u064b-\u065e\u0670\u06d6-\u06dc\u06de-\u06e4\u06e7\u06e8\u06ea-\u06ed\u0711\u0730-\u074a\u07a6-\u07b0\u07eb-\u07f3\u0816-\u0819\u081b-\u0823\u0825-\u0827\u0829-\u082d\u0900-\u0902\u093c\u0941-\u0948\u094d\u0951-\u0955\u0962\u0963\u0981\u09bc\u09be\u09c1-\u09c4\u09cd\u09d7\u09e2\u09e3\u0a01\u0a02\u0a3c\u0a41\u0a42\u0a47\u0a48\u0a4b-\u0a4d\u0a51\u0a70\u0a71\u0a75\u0a81\u0a82\u0abc\u0ac1-\u0ac5\u0ac7\u0ac8\u0acd\u0ae2\u0ae3\u0b01\u0b3c\u0b3e\u0b3f\u0b41-\u0b44\u0b4d\u0b56\u0b57\u0b62\u0b63\u0b82\u0bbe\u0bc0\u0bcd\u0bd7\u0c3e-\u0c40\u0c46-\u0c48\u0c4a-\u0c4d\u0c55\u0c56\u0c62\u0c63\u0cbc\u0cbf\u0cc2\u0cc6\u0ccc\u0ccd\u0cd5\u0cd6\u0ce2\u0ce3\u0d3e\u0d41-\u0d44\u0d4d\u0d57\u0d62\u0d63\u0dca\u0dcf\u0dd2-\u0dd4\u0dd6\u0ddf\u0e31\u0e34-\u0e3a\u0e47-\u0e4e\u0eb1\u0eb4-\u0eb9\u0ebb\u0ebc\u0ec8-\u0ecd\u0f18\u0f19\u0f35\u0f37\u0f39\u0f71-\u0f7e\u0f80-\u0f84\u0f86\u0f87\u0f90-\u0f97\u0f99-\u0fbc\u0fc6\u102d-\u1030\u1032-\u1037\u1039\u103a\u103d\u103e\u1058\u1059\u105e-\u1060\u1071-\u1074\u1082\u1085\u1086\u108d\u109d\u135f\u1712-\u1714\u1732-\u1734\u1752\u1753\u1772\u1773\u17b7-\u17bd\u17c6\u17c9-\u17d3\u17dd\u180b-\u180d\u18a9\u1920-\u1922\u1927\u1928\u1932\u1939-\u193b\u1a17\u1a18\u1a56\u1a58-\u1a5e\u1a60\u1a62\u1a65-\u1a6c\u1a73-\u1a7c\u1a7f\u1b00-\u1b03\u1b34\u1b36-\u1b3a\u1b3c\u1b42\u1b6b-\u1b73\u1b80\u1b81\u1ba2-\u1ba5\u1ba8\u1ba9\u1c2c-\u1c33\u1c36\u1c37\u1cd0-\u1cd2\u1cd4-\u1ce0\u1ce2-\u1ce8\u1ced\u1dc0-\u1de6\u1dfd-\u1dff\u200c\u200d\u20d0-\u20f0\u2cef-\u2cf1\u2de0-\u2dff\u302a-\u302f\u3099\u309a\ua66f-\ua672\ua67c\ua67d\ua6f0\ua6f1\ua802\ua806\ua80b\ua825\ua826\ua8c4\ua8e0-\ua8f1\ua926-\ua92d\ua947-\ua951\ua980-\ua982\ua9b3\ua9b6-\ua9b9\ua9bc\uaa29-\uaa2e\uaa31\uaa32\uaa35\uaa36\uaa43\uaa4c\uaab0\uaab2-\uaab4\uaab7\uaab8\uaabe\uaabf\uaac1\uabe5\uabe8\uabed\udc00-\udfff\ufb1e\ufe00-\ufe0f\ufe20-\ufe26\uff9e\uff9f]/;function ie(e){return e.charCodeAt(0)>=768&&ne.test(e)}function oe(e,t,r){for(;(r<0?t>0:tr?-1:1;;){if(t==r)return t;var i=(t+r)/2,o=n<0?Math.ceil(i):Math.floor(i);if(o==t)return e(o)?t:r;e(o)?r=o:t=o+n}}var se=null;function ae(e,t,r){var n;se=null;for(var i=0;it)return i;o.to==t&&(o.from!=o.to&&"before"==r?n=i:se=i),o.from==t&&(o.from!=o.to&&"before"!=r?n=i:se=i)}return null!=n?n:se}var ue=function(){var e="bbbbbbbbbtstwsbbbbbbbbbbbbbbssstwNN%%%NNNNNN,N,N1111111111NNNNNNNLLLLLLLLLLLLLLLLLLLLLLLLLLNNNNNNLLLLLLLLLLLLLLLLLLLLLLLLLLNNNNbbbbbbsbbbbbbbbbbbbbbbbbbbbbbbbbb,N%%%%NNNNLNNNNN%%11NLNNN1LNNNNNLLLLLLLLLLLLLLLLLLLLLLLNLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLN",t="nnnnnnNNr%%r,rNNmmmmmmmmmmmrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrmmmmmmmmmmmmmmmmmmmmmnnnnnnnnnn%nnrrrmrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrmmmmmmmnNmmmmmmrrmmNmmmmrr1111111111";var r=/[\u0590-\u05f4\u0600-\u06ff\u0700-\u08ac]/,n=/[stwN]/,i=/[LRr]/,o=/[Lb1n]/,l=/[1n]/;function s(e,t,r){this.level=e,this.from=t,this.to=r}return function(a,u){var c="ltr"==u?"L":"R";if(0==a.length||"ltr"==u&&!r.test(a))return!1;for(var h,f=a.length,d=[],p=0;p-1&&(n[t]=i.slice(0,o).concat(i.slice(o+1)))}}}function ge(e,t){var r=de(e,t);if(r.length)for(var n=Array.prototype.slice.call(arguments,2),i=0;i0}function be(e){e.prototype.on=function(e,t){fe(this,e,t)},e.prototype.off=function(e,t){pe(this,e,t)}}function we(e){e.preventDefault?e.preventDefault():e.returnValue=!1}function xe(e){e.stopPropagation?e.stopPropagation():e.cancelBubble=!0}function Ce(e){return null!=e.defaultPrevented?e.defaultPrevented:0==e.returnValue}function Se(e){we(e),xe(e)}function Le(e){return e.target||e.srcElement}function ke(e){var t=e.which;return null==t&&(1&e.button?t=1:2&e.button?t=3:4&e.button&&(t=2)),y&&e.ctrlKey&&1==t&&(t=3),t}var Te,Me,Ne=function(){if(l&&s<9)return!1;var e=O("div");return"draggable"in e||"dragDrop"in e}();function Oe(e){if(null==Te){var t=O("span","​");N(e,O("span",[t,document.createTextNode("x")])),0!=e.firstChild.offsetHeight&&(Te=t.offsetWidth<=1&&t.offsetHeight>2&&!(l&&s<8))}var r=Te?O("span","​"):O("span"," ",null,"display: inline-block; width: 1px; margin-right: -1px");return r.setAttribute("cm-text",""),r}function Ae(e){if(null!=Me)return Me;var t=N(e,document.createTextNode("AخA")),r=k(t,0,1).getBoundingClientRect(),n=k(t,1,2).getBoundingClientRect();return M(e),!(!r||r.left==r.right)&&(Me=n.right-r.right<3)}var De,We=3!="\n\nb".split(/\n/).length?function(e){for(var t=0,r=[],n=e.length;t<=n;){var i=e.indexOf("\n",t);-1==i&&(i=e.length);var o=e.slice(t,"\r"==e.charAt(i-1)?i-1:i),l=o.indexOf("\r");-1!=l?(r.push(o.slice(0,l)),t+=l+1):(r.push(o),t=i+1)}return r}:function(e){return e.split(/\r\n?|\n/)},He=window.getSelection?function(e){try{return e.selectionStart!=e.selectionEnd}catch(e){return!1}}:function(e){var t;try{t=e.ownerDocument.selection.createRange()}catch(e){}return!(!t||t.parentElement()!=e)&&0!=t.compareEndPoints("StartToEnd",t)},Fe="oncopy"in(De=O("div"))||(De.setAttribute("oncopy","return;"),"function"==typeof De.oncopy),Pe=null;var Ee={},Ie={};function ze(e){if("string"==typeof e&&Ie.hasOwnProperty(e))e=Ie[e];else if(e&&"string"==typeof e.name&&Ie.hasOwnProperty(e.name)){var t=Ie[e.name];"string"==typeof t&&(t={name:t}),(e=Q(t,e)).name=t.name}else{if("string"==typeof e&&/^[\w\-]+\/[\w\-]+\+xml$/.test(e))return ze("application/xml");if("string"==typeof e&&/^[\w\-]+\/[\w\-]+\+json$/.test(e))return ze("application/json")}return"string"==typeof e?{name:e}:e||{name:"null"}}function Re(e,t){t=ze(t);var r=Ee[t.name];if(!r)return Re(e,"text/plain");var n=r(e,t);if(Be.hasOwnProperty(t.name)){var i=Be[t.name];for(var o in i)i.hasOwnProperty(o)&&(n.hasOwnProperty(o)&&(n["_"+o]=n[o]),n[o]=i[o])}if(n.name=t.name,t.helperType&&(n.helperType=t.helperType),t.modeProps)for(var l in t.modeProps)n[l]=t.modeProps[l];return n}var Be={};function Ge(e,t){I(t,Be.hasOwnProperty(e)?Be[e]:Be[e]={})}function Ue(e,t){if(!0===t)return t;if(e.copyState)return e.copyState(t);var r={};for(var n in t){var i=t[n];i instanceof Array&&(i=i.concat([])),r[n]=i}return r}function Ve(e,t){for(var r;e.innerMode&&(r=e.innerMode(t))&&r.mode!=e;)t=r.state,e=r.mode;return r||{mode:e,state:t}}function Ke(e,t,r){return!e.startState||e.startState(t,r)}var je=function(e,t,r){this.pos=this.start=0,this.string=e,this.tabSize=t||8,this.lastColumnPos=this.lastColumnValue=0,this.lineStart=0,this.lineOracle=r};function Xe(e,t){if((t-=e.first)<0||t>=e.size)throw new Error("There is no line "+(t+e.first)+" in the document.");for(var r=e;!r.lines;)for(var n=0;;++n){var i=r.children[n],o=i.chunkSize();if(t=e.first&&tr?et(r,Xe(e,r).text.length):function(e,t){var r=e.ch;return null==r||r>t?et(e.line,t):r<0?et(e.line,0):e}(t,Xe(e,t.line).text.length)}function at(e,t){for(var r=[],n=0;n=this.string.length},je.prototype.sol=function(){return this.pos==this.lineStart},je.prototype.peek=function(){return this.string.charAt(this.pos)||void 0},je.prototype.next=function(){if(this.post},je.prototype.eatSpace=function(){for(var e=this.pos;/[\s\u00a0]/.test(this.string.charAt(this.pos));)++this.pos;return this.pos>e},je.prototype.skipToEnd=function(){this.pos=this.string.length},je.prototype.skipTo=function(e){var t=this.string.indexOf(e,this.pos);if(t>-1)return this.pos=t,!0},je.prototype.backUp=function(e){this.pos-=e},je.prototype.column=function(){return this.lastColumnPos0?null:(n&&!1!==t&&(this.pos+=n[0].length),n)}var i=function(e){return r?e.toLowerCase():e};if(i(this.string.substr(this.pos,e.length))==i(e))return!1!==t&&(this.pos+=e.length),!0},je.prototype.current=function(){return this.string.slice(this.start,this.pos)},je.prototype.hideFirstChars=function(e,t){this.lineStart+=e;try{return t()}finally{this.lineStart-=e}},je.prototype.lookAhead=function(e){var t=this.lineOracle;return t&&t.lookAhead(e)},je.prototype.baseToken=function(){var e=this.lineOracle;return e&&e.baseToken(this.pos)};var ut=function(e,t){this.state=e,this.lookAhead=t},ct=function(e,t,r,n){this.state=t,this.doc=e,this.line=r,this.maxLookAhead=n||0,this.baseTokens=null,this.baseTokenPos=1};function ht(e,t,r,n){var i=[e.state.modeGen],o={};wt(e,t.text,e.doc.mode,r,function(e,t){return i.push(e,t)},o,n);for(var l=r.state,s=function(n){r.baseTokens=i;var s=e.state.overlays[n],a=1,u=0;r.state=!0,wt(e,t.text,s.mode,r,function(e,t){for(var r=a;ue&&i.splice(a,1,e,i[a+1],n),a+=2,u=Math.min(e,n)}if(t)if(s.opaque)i.splice(r,a-r,e,"overlay "+t),a=r+2;else for(;re.options.maxHighlightLength&&Ue(e.doc.mode,n.state),o=ht(e,t,n);i&&(n.state=i),t.stateAfter=n.save(!i),t.styles=o.styles,o.classes?t.styleClasses=o.classes:t.styleClasses&&(t.styleClasses=null),r===e.doc.highlightFrontier&&(e.doc.modeFrontier=Math.max(e.doc.modeFrontier,++e.doc.highlightFrontier))}return t.styles}function dt(e,t,r){var n=e.doc,i=e.display;if(!n.mode.startState)return new ct(n,!0,t);var o=function(e,t,r){for(var n,i,o=e.doc,l=r?-1:t-(e.doc.mode.innerMode?1e3:100),s=t;s>l;--s){if(s<=o.first)return o.first;var a=Xe(o,s-1),u=a.stateAfter;if(u&&(!r||s+(u instanceof ut?u.lookAhead:0)<=o.modeFrontier))return s;var c=z(a.text,null,e.options.tabSize);(null==i||n>c)&&(i=s-1,n=c)}return i}(e,t,r),l=o>n.first&&Xe(n,o-1).stateAfter,s=l?ct.fromSaved(n,l,o):new ct(n,Ke(n.mode),o);return n.iter(o,t,function(r){pt(e,r.text,s);var n=s.line;r.stateAfter=n==t-1||n%5==0||n>=i.viewFrom&&nt.start)return o}throw new Error("Mode "+e.name+" failed to advance stream.")}ct.prototype.lookAhead=function(e){var t=this.doc.getLine(this.line+e);return null!=t&&e>this.maxLookAhead&&(this.maxLookAhead=e),t},ct.prototype.baseToken=function(e){if(!this.baseTokens)return null;for(;this.baseTokens[this.baseTokenPos]<=e;)this.baseTokenPos+=2;var t=this.baseTokens[this.baseTokenPos+1];return{type:t&&t.replace(/( |^)overlay .*/,""),size:this.baseTokens[this.baseTokenPos]-e}},ct.prototype.nextLine=function(){this.line++,this.maxLookAhead>0&&this.maxLookAhead--},ct.fromSaved=function(e,t,r){return t instanceof ut?new ct(e,Ue(e.mode,t.state),r,t.lookAhead):new ct(e,Ue(e.mode,t),r)},ct.prototype.save=function(e){var t=!1!==e?Ue(this.doc.mode,this.state):this.state;return this.maxLookAhead>0?new ut(t,this.maxLookAhead):t};var mt=function(e,t,r){this.start=e.start,this.end=e.pos,this.string=e.current(),this.type=t||null,this.state=r};function yt(e,t,r,n){var i,o,l=e.doc,s=l.mode,a=Xe(l,(t=st(l,t)).line),u=dt(e,t.line,r),c=new je(a.text,e.options.tabSize,u);for(n&&(o=[]);(n||c.pose.options.maxHighlightLength?(s=!1,l&&pt(e,t,n,h.pos),h.pos=t.length,a=null):a=bt(vt(r,h,n.state,f),o),f){var d=f[0].name;d&&(a="m-"+(a?d+" "+a:d))}if(!s||c!=a){for(;u=t:o.to>t);(n||(n=[])).push(new St(l,o.from,s?null:o.to))}}return n}(r,i,l),a=function(e,t,r){var n;if(e)for(var i=0;i=t:o.to>t)||o.from==t&&"bookmark"==l.type&&(!r||o.marker.insertLeft)){var s=null==o.from||(l.inclusiveLeft?o.from<=t:o.from0&&s)for(var b=0;bt)&&(!r||Wt(r,o.marker)<0)&&(r=o.marker)}return r}function It(e,t,r,n,i){var o=Xe(e,t),l=Ct&&o.markedSpans;if(l)for(var s=0;s=0&&h<=0||c<=0&&h>=0)&&(c<=0&&(a.marker.inclusiveRight&&i.inclusiveLeft?tt(u.to,r)>=0:tt(u.to,r)>0)||c>=0&&(a.marker.inclusiveRight&&i.inclusiveLeft?tt(u.from,n)<=0:tt(u.from,n)<0)))return!0}}}function zt(e){for(var t;t=Ft(e);)e=t.find(-1,!0).line;return e}function Rt(e,t){var r=Xe(e,t),n=zt(r);return r==n?t:qe(n)}function Bt(e,t){if(t>e.lastLine())return t;var r,n=Xe(e,t);if(!Gt(e,n))return t;for(;r=Pt(n);)n=r.find(1,!0).line;return qe(n)+1}function Gt(e,t){var r=Ct&&t.markedSpans;if(r)for(var n=void 0,i=0;it.maxLineLength&&(t.maxLineLength=r,t.maxLine=e)})}var Xt=function(e,t,r){this.text=e,Ot(this,t),this.height=r?r(this):1};function Yt(e){e.parent=null,Nt(e)}Xt.prototype.lineNo=function(){return qe(this)},be(Xt);var _t={},$t={};function qt(e,t){if(!e||/^\s*$/.test(e))return null;var r=t.addModeClass?$t:_t;return r[e]||(r[e]=e.replace(/\S+/g,"cm-$&"))}function Zt(e,t){var r=A("span",null,null,a?"padding-right: .1px":null),n={pre:A("pre",[r],"CodeMirror-line"),content:r,col:0,pos:0,cm:e,trailingSpace:!1,splitSpaces:e.getOption("lineWrapping")};t.measure={};for(var i=0;i<=(t.rest?t.rest.length:0);i++){var o=i?t.rest[i-1]:t.line,l=void 0;n.pos=0,n.addToken=Jt,Ae(e.display.measure)&&(l=ce(o,e.doc.direction))&&(n.addToken=er(n.addToken,l)),n.map=[],rr(o,n,ft(e,o,t!=e.display.externalMeasured&&qe(o))),o.styleClasses&&(o.styleClasses.bgClass&&(n.bgClass=F(o.styleClasses.bgClass,n.bgClass||"")),o.styleClasses.textClass&&(n.textClass=F(o.styleClasses.textClass,n.textClass||""))),0==n.map.length&&n.map.push(0,0,n.content.appendChild(Oe(e.display.measure))),0==i?(t.measure.map=n.map,t.measure.cache={}):((t.measure.maps||(t.measure.maps=[])).push(n.map),(t.measure.caches||(t.measure.caches=[])).push({}))}if(a){var s=n.content.lastChild;(/\bcm-tab\b/.test(s.className)||s.querySelector&&s.querySelector(".cm-tab"))&&(n.content.className="cm-tab-wrap-hack")}return ge(e,"renderLine",e,t.line,n.pre),n.pre.className&&(n.textClass=F(n.pre.className,n.textClass||"")),n}function Qt(e){var t=O("span","•","cm-invalidchar");return t.title="\\u"+e.charCodeAt(0).toString(16),t.setAttribute("aria-label",t.title),t}function Jt(e,t,r,n,i,o,a){if(t){var u,c=e.splitSpaces?function(e,t){if(e.length>1&&!/ /.test(e))return e;for(var r=t,n="",i=0;iu&&h.from<=u);f++);if(h.to>=c)return e(r,n,i,o,l,s,a);e(r,n.slice(0,h.to-u),i,o,null,s,a),o=null,n=n.slice(h.to-u),u=h.to}}}function tr(e,t,r,n){var i=!n&&r.widgetNode;i&&e.map.push(e.pos,e.pos+t,i),!n&&e.cm.display.input.needsContentAttribute&&(i||(i=e.content.appendChild(document.createElement("span"))),i.setAttribute("cm-marker",r.id)),i&&(e.cm.display.input.setUneditable(i),e.content.appendChild(i)),e.pos+=t,e.trailingSpace=!1}function rr(e,t,r){var n=e.markedSpans,i=e.text,o=0;if(n)for(var l,s,a,u,c,h,f,d=i.length,p=0,g=1,v="",m=0;;){if(m==p){a=u=c=s="",f=null,h=null,m=1/0;for(var y=[],b=void 0,w=0;wp||C.collapsed&&x.to==p&&x.from==p)){if(null!=x.to&&x.to!=p&&m>x.to&&(m=x.to,u=""),C.className&&(a+=" "+C.className),C.css&&(s=(s?s+";":"")+C.css),C.startStyle&&x.from==p&&(c+=" "+C.startStyle),C.endStyle&&x.to==m&&(b||(b=[])).push(C.endStyle,x.to),C.title&&((f||(f={})).title=C.title),C.attributes)for(var S in C.attributes)(f||(f={}))[S]=C.attributes[S];C.collapsed&&(!h||Wt(h.marker,C)<0)&&(h=x)}else x.from>p&&m>x.from&&(m=x.from)}if(b)for(var L=0;L=d)break;for(var T=Math.min(d,m);;){if(v){var M=p+v.length;if(!h){var N=M>T?v.slice(0,T-p):v;t.addToken(t,N,l?l+a:a,c,p+N.length==m?u:"",s,f)}if(M>=T){v=v.slice(T-p),p=T;break}p=M,c=""}v=i.slice(o,o=r[g++]),l=qt(r[g++],t.cm.options)}}else for(var O=1;Or)return{map:e.measure.maps[i],cache:e.measure.caches[i],before:!0}}function Or(e,t,r,n){return Wr(e,Dr(e,t),r,n)}function Ar(e,t){if(t>=e.display.viewFrom&&t=r.lineN&&t2&&o.push((a.bottom+u.top)/2-r.top)}}o.push(r.bottom-r.top)}}(e,t.view,t.rect),t.hasHeights=!0),(o=function(e,t,r,n){var i,o=Pr(t.map,r,n),a=o.node,u=o.start,c=o.end,h=o.collapse;if(3==a.nodeType){for(var f=0;f<4;f++){for(;u&&ie(t.line.text.charAt(o.coverStart+u));)--u;for(;o.coverStart+c1}(e))return t;var r=screen.logicalXDPI/screen.deviceXDPI,n=screen.logicalYDPI/screen.deviceYDPI;return{left:t.left*r,right:t.right*r,top:t.top*n,bottom:t.bottom*n}}(e.display.measure,i))}else{var d;u>0&&(h=n="right"),i=e.options.lineWrapping&&(d=a.getClientRects()).length>1?d["right"==n?d.length-1:0]:a.getBoundingClientRect()}if(l&&s<9&&!u&&(!i||!i.left&&!i.right)){var p=a.parentNode.getClientRects()[0];i=p?{left:p.left,right:p.left+tn(e.display),top:p.top,bottom:p.bottom}:Fr}for(var g=i.top-t.rect.top,v=i.bottom-t.rect.top,m=(g+v)/2,y=t.view.measure.heights,b=0;bt)&&(i=(o=a-s)-1,t>=a&&(l="right")),null!=i){if(n=e[u+2],s==a&&r==(n.insertLeft?"left":"right")&&(l=r),"left"==r&&0==i)for(;u&&e[u-2]==e[u-3]&&e[u-1].insertLeft;)n=e[2+(u-=3)],l="left";if("right"==r&&i==a-s)for(;u=0&&(r=e[i]).left==r.right;i--);return r}function Ir(e){if(e.measure&&(e.measure.cache={},e.measure.heights=null,e.rest))for(var t=0;t=n.text.length?(a=n.text.length,u="before"):a<=0&&(a=0,u="after"),!s)return l("before"==u?a-1:a,"before"==u);function c(e,t,r){return l(r?e-1:e,1==s[t].level!=r)}var h=ae(s,a,u),f=se,d=c(a,h,"before"==u);return null!=f&&(d.other=c(a,f,"before"!=u)),d}function Yr(e,t){var r=0;t=st(e.doc,t),e.options.lineWrapping||(r=tn(e.display)*t.ch);var n=Xe(e.doc,t.line),i=Vt(n)+Cr(e.display);return{left:r,right:r,top:i,bottom:i+n.height}}function _r(e,t,r,n,i){var o=et(e,t,r);return o.xRel=i,n&&(o.outside=n),o}function $r(e,t,r){var n=e.doc;if((r+=e.display.viewOffset)<0)return _r(n.first,0,null,-1,-1);var i=Ze(n,r),o=n.first+n.size-1;if(i>o)return _r(n.first+n.size-1,Xe(n,o).text.length,null,1,1);t<0&&(t=0);for(var l=Xe(n,i);;){var s=Jr(e,l,i,t,r),a=Et(l,s.ch+(s.xRel>0||s.outside>0?1:0));if(!a)return s;var u=a.find(1);if(u.line==i)return u;l=Xe(n,i=u.line)}}function qr(e,t,r,n){n-=Ur(t);var i=t.text.length,o=le(function(t){return Wr(e,r,t-1).bottom<=n},i,0);return{begin:o,end:i=le(function(t){return Wr(e,r,t).top>n},o,i)}}function Zr(e,t,r,n){return r||(r=Dr(e,t)),qr(e,t,r,Vr(e,t,Wr(e,r,n),"line").top)}function Qr(e,t,r,n){return!(e.bottom<=r)&&(e.top>r||(n?e.left:e.right)>t)}function Jr(e,t,r,n,i){i-=Vt(t);var o=Dr(e,t),l=Ur(t),s=0,a=t.text.length,u=!0,c=ce(t,e.doc.direction);if(c){var h=(e.options.lineWrapping?function(e,t,r,n,i,o,l){var s=qr(e,t,n,l),a=s.begin,u=s.end;/\s/.test(t.text.charAt(u-1))&&u--;for(var c=null,h=null,f=0;f=u||d.to<=a)){var p=1!=d.level,g=Wr(e,n,p?Math.min(u,d.to)-1:Math.max(a,d.from)).right,v=gv)&&(c=d,h=v)}}c||(c=i[i.length-1]);c.fromu&&(c={from:c.from,to:u,level:c.level});return c}:function(e,t,r,n,i,o,l){var s=le(function(s){var a=i[s],u=1!=a.level;return Qr(Xr(e,et(r,u?a.to:a.from,u?"before":"after"),"line",t,n),o,l,!0)},0,i.length-1),a=i[s];if(s>0){var u=1!=a.level,c=Xr(e,et(r,u?a.from:a.to,u?"after":"before"),"line",t,n);Qr(c,o,l,!0)&&c.top>l&&(a=i[s-1])}return a})(e,t,r,o,c,n,i);s=(u=1!=h.level)?h.from:h.to-1,a=u?h.to:h.from-1}var f,d,p=null,g=null,v=le(function(t){var r=Wr(e,o,t);return r.top+=l,r.bottom+=l,!!Qr(r,n,i,!1)&&(r.top<=i&&r.left<=n&&(p=t,g=r),!0)},s,a),m=!1;if(g){var y=n-g.left=w.bottom?1:0}return _r(r,v=oe(t.text,v,1),d,m,n-f)}function en(e){if(null!=e.cachedTextHeight)return e.cachedTextHeight;if(null==Hr){Hr=O("pre",null,"CodeMirror-line-like");for(var t=0;t<49;++t)Hr.appendChild(document.createTextNode("x")),Hr.appendChild(O("br"));Hr.appendChild(document.createTextNode("x"))}N(e.measure,Hr);var r=Hr.offsetHeight/50;return r>3&&(e.cachedTextHeight=r),M(e.measure),r||1}function tn(e){if(null!=e.cachedCharWidth)return e.cachedCharWidth;var t=O("span","xxxxxxxxxx"),r=O("pre",[t],"CodeMirror-line-like");N(e.measure,r);var n=t.getBoundingClientRect(),i=(n.right-n.left)/10;return i>2&&(e.cachedCharWidth=i),i||10}function rn(e){for(var t=e.display,r={},n={},i=t.gutters.clientLeft,o=t.gutters.firstChild,l=0;o;o=o.nextSibling,++l){var s=e.display.gutterSpecs[l].className;r[s]=o.offsetLeft+o.clientLeft+i,n[s]=o.clientWidth}return{fixedPos:nn(t),gutterTotalWidth:t.gutters.offsetWidth,gutterLeft:r,gutterWidth:n,wrapperWidth:t.wrapper.clientWidth}}function nn(e){return e.scroller.getBoundingClientRect().left-e.sizer.getBoundingClientRect().left}function on(e){var t=en(e.display),r=e.options.lineWrapping,n=r&&Math.max(5,e.display.scroller.clientWidth/tn(e.display)-3);return function(i){if(Gt(e.doc,i))return 0;var o=0;if(i.widgets)for(var l=0;l=e.display.viewTo)return null;if((t-=e.display.viewFrom)<0)return null;for(var r=e.display.view,n=0;nt)&&(i.updateLineNumbers=t),e.curOp.viewChanged=!0,t>=i.viewTo)Ct&&Rt(e.doc,t)i.viewFrom?hn(e):(i.viewFrom+=n,i.viewTo+=n);else if(t<=i.viewFrom&&r>=i.viewTo)hn(e);else if(t<=i.viewFrom){var o=fn(e,r,r+n,1);o?(i.view=i.view.slice(o.index),i.viewFrom=o.lineN,i.viewTo+=n):hn(e)}else if(r>=i.viewTo){var l=fn(e,t,t,-1);l?(i.view=i.view.slice(0,l.index),i.viewTo=l.lineN):hn(e)}else{var s=fn(e,t,t,-1),a=fn(e,r,r+n,1);s&&a?(i.view=i.view.slice(0,s.index).concat(ir(e,s.lineN,a.lineN)).concat(i.view.slice(a.index)),i.viewTo+=n):hn(e)}var u=i.externalMeasured;u&&(r=i.lineN&&t=n.viewTo)){var o=n.view[an(e,t)];if(null!=o.node){var l=o.changes||(o.changes=[]);-1==B(l,r)&&l.push(r)}}}function hn(e){e.display.viewFrom=e.display.viewTo=e.doc.first,e.display.view=[],e.display.viewOffset=0}function fn(e,t,r,n){var i,o=an(e,t),l=e.display.view;if(!Ct||r==e.doc.first+e.doc.size)return{index:o,lineN:r};for(var s=e.display.viewFrom,a=0;a0){if(o==l.length-1)return null;i=s+l[o].size-t,o++}else i=s-t;t+=i,r+=i}for(;Rt(e.doc,r)!=r;){if(o==(n<0?0:l.length-1))return null;r+=n*l[o-(n<0?1:0)].size,o+=n}return{index:o,lineN:r}}function dn(e){for(var t=e.display.view,r=0,n=0;n=e.display.viewTo||s.to().linet||t==r&&l.to==t)&&(n(Math.max(l.from,t),Math.min(l.to,r),1==l.level?"rtl":"ltr",o),i=!0)}i||n(t,r,"ltr")}(g,r||0,null==n?f:n,function(e,t,i,h){var v="ltr"==i,m=d(e,v?"left":"right"),y=d(t-1,v?"right":"left"),b=null==r&&0==e,w=null==n&&t==f,x=0==h,C=!g||h==g.length-1;if(y.top-m.top<=3){var S=(u?w:b)&&C,L=(u?b:w)&&x?s:(v?m:y).left,k=S?a:(v?y:m).right;c(L,m.top,k-L,m.bottom)}else{var T,M,N,O;v?(T=u&&b&&x?s:m.left,M=u?a:p(e,i,"before"),N=u?s:p(t,i,"after"),O=u&&w&&C?a:y.right):(T=u?p(e,i,"before"):s,M=!u&&b&&x?a:m.right,N=!u&&w&&C?s:y.left,O=u?p(t,i,"after"):a),c(T,m.top,M-T,m.bottom),m.bottom0?t.blinker=setInterval(function(){return t.cursorDiv.style.visibility=(r=!r)?"":"hidden"},e.options.cursorBlinkRate):e.options.cursorBlinkRate<0&&(t.cursorDiv.style.visibility="hidden")}}function wn(e){e.state.focused||(e.display.input.focus(),Cn(e))}function xn(e){e.state.delayingBlurEvent=!0,setTimeout(function(){e.state.delayingBlurEvent&&(e.state.delayingBlurEvent=!1,Sn(e))},100)}function Cn(e,t){e.state.delayingBlurEvent&&(e.state.delayingBlurEvent=!1),"nocursor"!=e.options.readOnly&&(e.state.focused||(ge(e,"focus",e,t),e.state.focused=!0,H(e.display.wrapper,"CodeMirror-focused"),e.curOp||e.display.selForContextMenu==e.doc.sel||(e.display.input.reset(),a&&setTimeout(function(){return e.display.input.reset(!0)},20)),e.display.input.receivedFocus()),bn(e))}function Sn(e,t){e.state.delayingBlurEvent||(e.state.focused&&(ge(e,"blur",e,t),e.state.focused=!1,T(e.display.wrapper,"CodeMirror-focused")),clearInterval(e.display.blinker),setTimeout(function(){e.state.focused||(e.display.shift=!1)},150))}function Ln(e){for(var t=e.display,r=t.lineDiv.offsetTop,n=0;n.005||f<-.005)&&($e(i.line,a),kn(i.line),i.rest))for(var d=0;de.display.sizerWidth){var p=Math.ceil(u/tn(e.display));p>e.display.maxLineLength&&(e.display.maxLineLength=p,e.display.maxLine=i.line,e.display.maxLineChanged=!0)}}}}function kn(e){if(e.widgets)for(var t=0;t=l&&(o=Ze(t,Vt(Xe(t,a))-e.wrapper.clientHeight),l=a)}return{from:o,to:Math.max(l,o+1)}}function Mn(e,t){var r=e.display,n=en(e.display);t.top<0&&(t.top=0);var i=e.curOp&&null!=e.curOp.scrollTop?e.curOp.scrollTop:r.scroller.scrollTop,o=Mr(e),l={};t.bottom-t.top>o&&(t.bottom=t.top+o);var s=e.doc.height+Sr(r),a=t.tops-n;if(t.topi+o){var c=Math.min(t.top,(u?s:t.bottom)-o);c!=i&&(l.scrollTop=c)}var h=e.curOp&&null!=e.curOp.scrollLeft?e.curOp.scrollLeft:r.scroller.scrollLeft,f=Tr(e)-(e.options.fixedGutter?r.gutters.offsetWidth:0),d=t.right-t.left>f;return d&&(t.right=t.left+f),t.left<10?l.scrollLeft=0:t.leftf+h-3&&(l.scrollLeft=t.right+(d?0:10)-f),l}function Nn(e,t){null!=t&&(Dn(e),e.curOp.scrollTop=(null==e.curOp.scrollTop?e.doc.scrollTop:e.curOp.scrollTop)+t)}function On(e){Dn(e);var t=e.getCursor();e.curOp.scrollToPos={from:t,to:t,margin:e.options.cursorScrollMargin}}function An(e,t,r){null==t&&null==r||Dn(e),null!=t&&(e.curOp.scrollLeft=t),null!=r&&(e.curOp.scrollTop=r)}function Dn(e){var t=e.curOp.scrollToPos;t&&(e.curOp.scrollToPos=null,Wn(e,Yr(e,t.from),Yr(e,t.to),t.margin))}function Wn(e,t,r,n){var i=Mn(e,{left:Math.min(t.left,r.left),top:Math.min(t.top,r.top)-n,right:Math.max(t.right,r.right),bottom:Math.max(t.bottom,r.bottom)+n});An(e,i.scrollLeft,i.scrollTop)}function Hn(e,t){Math.abs(e.doc.scrollTop-t)<2||(r||oi(e,{top:t}),Fn(e,t,!0),r&&oi(e),ei(e,100))}function Fn(e,t,r){t=Math.min(e.display.scroller.scrollHeight-e.display.scroller.clientHeight,t),(e.display.scroller.scrollTop!=t||r)&&(e.doc.scrollTop=t,e.display.scrollbars.setScrollTop(t),e.display.scroller.scrollTop!=t&&(e.display.scroller.scrollTop=t))}function Pn(e,t,r,n){t=Math.min(t,e.display.scroller.scrollWidth-e.display.scroller.clientWidth),(r?t==e.doc.scrollLeft:Math.abs(e.doc.scrollLeft-t)<2)&&!n||(e.doc.scrollLeft=t,ai(e),e.display.scroller.scrollLeft!=t&&(e.display.scroller.scrollLeft=t),e.display.scrollbars.setScrollLeft(t))}function En(e){var t=e.display,r=t.gutters.offsetWidth,n=Math.round(e.doc.height+Sr(e.display));return{clientHeight:t.scroller.clientHeight,viewHeight:t.wrapper.clientHeight,scrollWidth:t.scroller.scrollWidth,clientWidth:t.scroller.clientWidth,viewWidth:t.wrapper.clientWidth,barLeft:e.options.fixedGutter?r:0,docHeight:n,scrollHeight:n+kr(e)+t.barHeight,nativeBarWidth:t.nativeBarWidth,gutterWidth:r}}var In=function(e,t,r){this.cm=r;var n=this.vert=O("div",[O("div",null,null,"min-width: 1px")],"CodeMirror-vscrollbar"),i=this.horiz=O("div",[O("div",null,null,"height: 100%; min-height: 1px")],"CodeMirror-hscrollbar");n.tabIndex=i.tabIndex=-1,e(n),e(i),fe(n,"scroll",function(){n.clientHeight&&t(n.scrollTop,"vertical")}),fe(i,"scroll",function(){i.clientWidth&&t(i.scrollLeft,"horizontal")}),this.checkedZeroWidth=!1,l&&s<8&&(this.horiz.style.minHeight=this.vert.style.minWidth="18px")};In.prototype.update=function(e){var t=e.scrollWidth>e.clientWidth+1,r=e.scrollHeight>e.clientHeight+1,n=e.nativeBarWidth;if(r){this.vert.style.display="block",this.vert.style.bottom=t?n+"px":"0";var i=e.viewHeight-(t?n:0);this.vert.firstChild.style.height=Math.max(0,e.scrollHeight-e.clientHeight+i)+"px"}else this.vert.style.display="",this.vert.firstChild.style.height="0";if(t){this.horiz.style.display="block",this.horiz.style.right=r?n+"px":"0",this.horiz.style.left=e.barLeft+"px";var o=e.viewWidth-e.barLeft-(r?n:0);this.horiz.firstChild.style.width=Math.max(0,e.scrollWidth-e.clientWidth+o)+"px"}else this.horiz.style.display="",this.horiz.firstChild.style.width="0";return!this.checkedZeroWidth&&e.clientHeight>0&&(0==n&&this.zeroWidthHack(),this.checkedZeroWidth=!0),{right:r?n:0,bottom:t?n:0}},In.prototype.setScrollLeft=function(e){this.horiz.scrollLeft!=e&&(this.horiz.scrollLeft=e),this.disableHoriz&&this.enableZeroWidthBar(this.horiz,this.disableHoriz,"horiz")},In.prototype.setScrollTop=function(e){this.vert.scrollTop!=e&&(this.vert.scrollTop=e),this.disableVert&&this.enableZeroWidthBar(this.vert,this.disableVert,"vert")},In.prototype.zeroWidthHack=function(){var e=y&&!d?"12px":"18px";this.horiz.style.height=this.vert.style.width=e,this.horiz.style.pointerEvents=this.vert.style.pointerEvents="none",this.disableHoriz=new R,this.disableVert=new R},In.prototype.enableZeroWidthBar=function(e,t,r){e.style.pointerEvents="auto",t.set(1e3,function n(){var i=e.getBoundingClientRect();("vert"==r?document.elementFromPoint(i.right-1,(i.top+i.bottom)/2):document.elementFromPoint((i.right+i.left)/2,i.bottom-1))!=e?e.style.pointerEvents="none":t.set(1e3,n)})},In.prototype.clear=function(){var e=this.horiz.parentNode;e.removeChild(this.horiz),e.removeChild(this.vert)};var zn=function(){};function Rn(e,t){t||(t=En(e));var r=e.display.barWidth,n=e.display.barHeight;Bn(e,t);for(var i=0;i<4&&r!=e.display.barWidth||n!=e.display.barHeight;i++)r!=e.display.barWidth&&e.options.lineWrapping&&Ln(e),Bn(e,En(e)),r=e.display.barWidth,n=e.display.barHeight}function Bn(e,t){var r=e.display,n=r.scrollbars.update(t);r.sizer.style.paddingRight=(r.barWidth=n.right)+"px",r.sizer.style.paddingBottom=(r.barHeight=n.bottom)+"px",r.heightForcer.style.borderBottom=n.bottom+"px solid transparent",n.right&&n.bottom?(r.scrollbarFiller.style.display="block",r.scrollbarFiller.style.height=n.bottom+"px",r.scrollbarFiller.style.width=n.right+"px"):r.scrollbarFiller.style.display="",n.bottom&&e.options.coverGutterNextToScrollbar&&e.options.fixedGutter?(r.gutterFiller.style.display="block",r.gutterFiller.style.height=n.bottom+"px",r.gutterFiller.style.width=t.gutterWidth+"px"):r.gutterFiller.style.display=""}zn.prototype.update=function(){return{bottom:0,right:0}},zn.prototype.setScrollLeft=function(){},zn.prototype.setScrollTop=function(){},zn.prototype.clear=function(){};var Gn={native:In,null:zn};function Un(e){e.display.scrollbars&&(e.display.scrollbars.clear(),e.display.scrollbars.addClass&&T(e.display.wrapper,e.display.scrollbars.addClass)),e.display.scrollbars=new Gn[e.options.scrollbarStyle](function(t){e.display.wrapper.insertBefore(t,e.display.scrollbarFiller),fe(t,"mousedown",function(){e.state.focused&&setTimeout(function(){return e.display.input.focus()},0)}),t.setAttribute("cm-not-content","true")},function(t,r){"horizontal"==r?Pn(e,t):Hn(e,t)},e),e.display.scrollbars.addClass&&H(e.display.wrapper,e.display.scrollbars.addClass)}var Vn=0;function Kn(e){var t;e.curOp={cm:e,viewChanged:!1,startHeight:e.doc.height,forceUpdate:!1,updateInput:0,typing:!1,changeObjs:null,cursorActivityHandlers:null,cursorActivityCalled:0,selectionChanged:!1,updateMaxLine:!1,scrollLeft:null,scrollTop:null,scrollToPos:null,focus:!1,id:++Vn},t=e.curOp,or?or.ops.push(t):t.ownsGroup=or={ops:[t],delayedCallbacks:[]}}function jn(e){var t=e.curOp;t&&function(e,t){var r=e.ownsGroup;if(r)try{!function(e){var t=e.delayedCallbacks,r=0;do{for(;r=r.viewTo)||r.maxLineChanged&&t.options.lineWrapping,e.update=e.mustUpdate&&new ri(t,e.mustUpdate&&{top:e.scrollTop,ensure:e.scrollToPos},e.forceUpdate)}function Yn(e){var t=e.cm,r=t.display;e.updatedDisplay&&Ln(t),e.barMeasure=En(t),r.maxLineChanged&&!t.options.lineWrapping&&(e.adjustWidthTo=Or(t,r.maxLine,r.maxLine.text.length).left+3,t.display.sizerWidth=e.adjustWidthTo,e.barMeasure.scrollWidth=Math.max(r.scroller.clientWidth,r.sizer.offsetLeft+e.adjustWidthTo+kr(t)+t.display.barWidth),e.maxScrollLeft=Math.max(0,r.sizer.offsetLeft+e.adjustWidthTo-Tr(t))),(e.updatedDisplay||e.selectionChanged)&&(e.preparedSelection=r.input.prepareSelection())}function _n(e){var t=e.cm;null!=e.adjustWidthTo&&(t.display.sizer.style.minWidth=e.adjustWidthTo+"px",e.maxScrollLeft(window.innerHeight||document.documentElement.clientHeight)&&(i=!1),null!=i&&!p){var o=O("div","​",null,"position: absolute;\n top: "+(t.top-r.viewOffset-Cr(e.display))+"px;\n height: "+(t.bottom-t.top+kr(e)+r.barHeight)+"px;\n left: "+t.left+"px; width: "+Math.max(2,t.right-t.left)+"px;");e.display.lineSpace.appendChild(o),o.scrollIntoView(i),e.display.lineSpace.removeChild(o)}}}(t,function(e,t,r,n){var i;null==n&&(n=0),e.options.lineWrapping||t!=r||(r="before"==(t=t.ch?et(t.line,"before"==t.sticky?t.ch-1:t.ch,"after"):t).sticky?et(t.line,t.ch+1,"before"):t);for(var o=0;o<5;o++){var l=!1,s=Xr(e,t),a=r&&r!=t?Xr(e,r):s,u=Mn(e,i={left:Math.min(s.left,a.left),top:Math.min(s.top,a.top)-n,right:Math.max(s.left,a.left),bottom:Math.max(s.bottom,a.bottom)+n}),c=e.doc.scrollTop,h=e.doc.scrollLeft;if(null!=u.scrollTop&&(Hn(e,u.scrollTop),Math.abs(e.doc.scrollTop-c)>1&&(l=!0)),null!=u.scrollLeft&&(Pn(e,u.scrollLeft),Math.abs(e.doc.scrollLeft-h)>1&&(l=!0)),!l)break}return i}(t,st(n,e.scrollToPos.from),st(n,e.scrollToPos.to),e.scrollToPos.margin));var i=e.maybeHiddenMarkers,o=e.maybeUnhiddenMarkers;if(i)for(var l=0;l=e.display.viewTo)){var r=+new Date+e.options.workTime,n=dt(e,t.highlightFrontier),i=[];t.iter(n.line,Math.min(t.first+t.size,e.display.viewTo+500),function(o){if(n.line>=e.display.viewFrom){var l=o.styles,s=o.text.length>e.options.maxHighlightLength?Ue(t.mode,n.state):null,a=ht(e,o,n,!0);s&&(n.state=s),o.styles=a.styles;var u=o.styleClasses,c=a.classes;c?o.styleClasses=c:u&&(o.styleClasses=null);for(var h=!l||l.length!=o.styles.length||u!=c&&(!u||!c||u.bgClass!=c.bgClass||u.textClass!=c.textClass),f=0;!h&&fr)return ei(e,e.options.workDelay),!0}),t.highlightFrontier=n.line,t.modeFrontier=Math.max(t.modeFrontier,n.line),i.length&&qn(e,function(){for(var t=0;t=r.viewFrom&&t.visible.to<=r.viewTo&&(null==r.updateLineNumbers||r.updateLineNumbers>=r.viewTo)&&r.renderedView==r.view&&0==dn(e))return!1;ui(e)&&(hn(e),t.dims=rn(e));var i=n.first+n.size,o=Math.max(t.visible.from-e.options.viewportMargin,n.first),l=Math.min(i,t.visible.to+e.options.viewportMargin);r.viewFroml&&r.viewTo-l<20&&(l=Math.min(i,r.viewTo)),Ct&&(o=Rt(e.doc,o),l=Bt(e.doc,l));var s=o!=r.viewFrom||l!=r.viewTo||r.lastWrapHeight!=t.wrapperHeight||r.lastWrapWidth!=t.wrapperWidth;!function(e,t,r){var n=e.display;0==n.view.length||t>=n.viewTo||r<=n.viewFrom?(n.view=ir(e,t,r),n.viewFrom=t):(n.viewFrom>t?n.view=ir(e,t,n.viewFrom).concat(n.view):n.viewFromr&&(n.view=n.view.slice(0,an(e,r)))),n.viewTo=r}(e,o,l),r.viewOffset=Vt(Xe(e.doc,r.viewFrom)),e.display.mover.style.top=r.viewOffset+"px";var u=dn(e);if(!s&&0==u&&!t.force&&r.renderedView==r.view&&(null==r.updateLineNumbers||r.updateLineNumbers>=r.viewTo))return!1;var c=function(e){if(e.hasFocus())return null;var t=W();if(!t||!D(e.display.lineDiv,t))return null;var r={activeElt:t};if(window.getSelection){var n=window.getSelection();n.anchorNode&&n.extend&&D(e.display.lineDiv,n.anchorNode)&&(r.anchorNode=n.anchorNode,r.anchorOffset=n.anchorOffset,r.focusNode=n.focusNode,r.focusOffset=n.focusOffset)}return r}(e);return u>4&&(r.lineDiv.style.display="none"),function(e,t,r){var n=e.display,i=e.options.lineNumbers,o=n.lineDiv,l=o.firstChild;function s(t){var r=t.nextSibling;return a&&y&&e.display.currentWheelTarget==t?t.style.display="none":t.parentNode.removeChild(t),r}for(var u=n.view,c=n.viewFrom,h=0;h-1&&(d=!1),ur(e,f,c,r)),d&&(M(f.lineNumber),f.lineNumber.appendChild(document.createTextNode(Je(e.options,c)))),l=f.node.nextSibling}else{var p=vr(e,f,c,r);o.insertBefore(p,l)}c+=f.size}for(;l;)l=s(l)}(e,r.updateLineNumbers,t.dims),u>4&&(r.lineDiv.style.display=""),r.renderedView=r.view,function(e){if(e&&e.activeElt&&e.activeElt!=W()&&(e.activeElt.focus(),e.anchorNode&&D(document.body,e.anchorNode)&&D(document.body,e.focusNode))){var t=window.getSelection(),r=document.createRange();r.setEnd(e.anchorNode,e.anchorOffset),r.collapse(!1),t.removeAllRanges(),t.addRange(r),t.extend(e.focusNode,e.focusOffset)}}(c),M(r.cursorDiv),M(r.selectionDiv),r.gutters.style.height=r.sizer.style.minHeight=0,s&&(r.lastWrapHeight=t.wrapperHeight,r.lastWrapWidth=t.wrapperWidth,ei(e,400)),r.updateLineNumbers=null,!0}function ii(e,t){for(var r=t.viewport,n=!0;(n&&e.options.lineWrapping&&t.oldDisplayWidth!=Tr(e)||(r&&null!=r.top&&(r={top:Math.min(e.doc.height+Sr(e.display)-Mr(e),r.top)}),t.visible=Tn(e.display,e.doc,r),!(t.visible.from>=e.display.viewFrom&&t.visible.to<=e.display.viewTo)))&&ni(e,t);n=!1){Ln(e);var i=En(e);pn(e),Rn(e,i),si(e,i),t.force=!1}t.signal(e,"update",e),e.display.viewFrom==e.display.reportedViewFrom&&e.display.viewTo==e.display.reportedViewTo||(t.signal(e,"viewportChange",e,e.display.viewFrom,e.display.viewTo),e.display.reportedViewFrom=e.display.viewFrom,e.display.reportedViewTo=e.display.viewTo)}function oi(e,t){var r=new ri(e,t);if(ni(e,r)){Ln(e),ii(e,r);var n=En(e);pn(e),Rn(e,n),si(e,n),r.finish()}}function li(e){var t=e.gutters.offsetWidth;e.sizer.style.marginLeft=t+"px"}function si(e,t){e.display.sizer.style.minHeight=t.docHeight+"px",e.display.heightForcer.style.top=t.docHeight+"px",e.display.gutters.style.height=t.docHeight+e.display.barHeight+kr(e)+"px"}function ai(e){var t=e.display,r=t.view;if(t.alignWidgets||t.gutters.firstChild&&e.options.fixedGutter){for(var n=nn(t)-t.scroller.scrollLeft+e.doc.scrollLeft,i=t.gutters.offsetWidth,o=n+"px",l=0;ls.clientWidth,c=s.scrollHeight>s.clientHeight;if(i&&u||o&&c){if(o&&y&&a)e:for(var f=t.target,d=l.view;f!=s;f=f.parentNode)for(var p=0;p=0&&tt(e,n.to())<=0)return r}return-1};var bi=function(e,t){this.anchor=e,this.head=t};function wi(e,t,r){var n=e&&e.options.selectionsMayTouch,i=t[r];t.sort(function(e,t){return tt(e.from(),t.from())}),r=B(t,i);for(var o=1;o0:a>=0){var u=ot(s.from(),l.from()),c=it(s.to(),l.to()),h=s.empty()?l.from()==l.head:s.from()==s.head;o<=r&&--r,t.splice(--o,2,new bi(h?c:u,h?u:c))}}return new yi(t,r)}function xi(e,t){return new yi([new bi(e,t||e)],0)}function Ci(e){return e.text?et(e.from.line+e.text.length-1,$(e.text).length+(1==e.text.length?e.from.ch:0)):e.to}function Si(e,t){if(tt(e,t.from)<0)return e;if(tt(e,t.to)<=0)return Ci(t);var r=e.line+t.text.length-(t.to.line-t.from.line)-1,n=e.ch;return e.line==t.to.line&&(n+=Ci(t).ch-t.to.ch),et(r,n)}function Li(e,t){for(var r=[],n=0;n1&&e.remove(s.line+1,p-1),e.insert(s.line+1,m)}sr(e,"change",e,t)}function Ai(e,t,r){!function e(n,i,o){if(n.linked)for(var l=0;ls-(e.cm?e.cm.options.historyEventDelay:500)||"*"==t.origin.charAt(0)))&&(o=function(e,t){return t?(Pi(e.done),$(e.done)):e.done.length&&!$(e.done).ranges?$(e.done):e.done.length>1&&!e.done[e.done.length-2].ranges?(e.done.pop(),$(e.done)):void 0}(i,i.lastOp==n)))l=$(o.changes),0==tt(t.from,t.to)&&0==tt(t.from,l.to)?l.to=Ci(t):o.changes.push(Fi(e,t));else{var a=$(i.done);for(a&&a.ranges||zi(e.sel,i.done),o={changes:[Fi(e,t)],generation:i.generation},i.done.push(o);i.done.length>i.undoDepth;)i.done.shift(),i.done[0].ranges||i.done.shift()}i.done.push(r),i.generation=++i.maxGeneration,i.lastModTime=i.lastSelTime=s,i.lastOp=i.lastSelOp=n,i.lastOrigin=i.lastSelOrigin=t.origin,l||ge(e,"historyAdded")}function Ii(e,t,r,n){var i=e.history,o=n&&n.origin;r==i.lastSelOp||o&&i.lastSelOrigin==o&&(i.lastModTime==i.lastSelTime&&i.lastOrigin==o||function(e,t,r,n){var i=t.charAt(0);return"*"==i||"+"==i&&r.ranges.length==n.ranges.length&&r.somethingSelected()==n.somethingSelected()&&new Date-e.history.lastSelTime<=(e.cm?e.cm.options.historyEventDelay:500)}(e,o,$(i.done),t))?i.done[i.done.length-1]=t:zi(t,i.done),i.lastSelTime=+new Date,i.lastSelOrigin=o,i.lastSelOp=r,n&&!1!==n.clearRedo&&Pi(i.undone)}function zi(e,t){var r=$(t);r&&r.ranges&&r.equals(e)||t.push(e)}function Ri(e,t,r,n){var i=t["spans_"+e.id],o=0;e.iter(Math.max(e.first,r),Math.min(e.first+e.size,n),function(r){r.markedSpans&&((i||(i=t["spans_"+e.id]={}))[o]=r.markedSpans),++o})}function Bi(e){if(!e)return null;for(var t,r=0;r-1&&($(s)[h]=u[h],delete u[h])}}}return n}function Vi(e,t,r,n){if(n){var i=e.anchor;if(r){var o=tt(t,i)<0;o!=tt(r,i)<0?(i=t,t=r):o!=tt(t,r)<0&&(t=r)}return new bi(i,t)}return new bi(r||t,t)}function Ki(e,t,r,n,i){null==i&&(i=e.cm&&(e.cm.display.shift||e.extend)),$i(e,new yi([Vi(e.sel.primary(),t,r,i)],0),n)}function ji(e,t,r){for(var n=[],i=e.cm&&(e.cm.display.shift||e.extend),o=0;o=t.ch:s.to>t.ch))){if(i&&(ge(a,"beforeCursorEnter"),a.explicitlyCleared)){if(o.markedSpans){--l;continue}break}if(!a.atomic)continue;if(r){var h=a.find(n<0?1:-1),f=void 0;if((n<0?c:u)&&(h=ro(e,h,-n,h&&h.line==t.line?o:null)),h&&h.line==t.line&&(f=tt(h,r))&&(n<0?f<0:f>0))return eo(e,h,t,n,i)}var d=a.find(n<0?-1:1);return(n<0?u:c)&&(d=ro(e,d,n,d.line==t.line?o:null)),d?eo(e,d,t,n,i):null}}return t}function to(e,t,r,n,i){var o=n||1,l=eo(e,t,r,o,i)||!i&&eo(e,t,r,o,!0)||eo(e,t,r,-o,i)||!i&&eo(e,t,r,-o,!0);return l||(e.cantEdit=!0,et(e.first,0))}function ro(e,t,r,n){return r<0&&0==t.ch?t.line>e.first?st(e,et(t.line-1)):null:r>0&&t.ch==(n||Xe(e,t.line)).text.length?t.line0)){var c=[a,1],h=tt(u.from,s.from),f=tt(u.to,s.to);(h<0||!l.inclusiveLeft&&!h)&&c.push({from:u.from,to:s.from}),(f>0||!l.inclusiveRight&&!f)&&c.push({from:s.to,to:u.to}),i.splice.apply(i,c),a+=c.length-3}}return i}(e,t.from,t.to);if(n)for(var i=n.length-1;i>=0;--i)lo(e,{from:n[i].from,to:n[i].to,text:i?[""]:t.text,origin:t.origin});else lo(e,t)}}function lo(e,t){if(1!=t.text.length||""!=t.text[0]||0!=tt(t.from,t.to)){var r=Li(e,t);Ei(e,t,r,e.cm?e.cm.curOp.id:NaN),uo(e,t,r,Tt(e,t));var n=[];Ai(e,function(e,r){r||-1!=B(n,e.history)||(po(e.history,t),n.push(e.history)),uo(e,t,null,Tt(e,t))})}}function so(e,t,r){var n=e.cm&&e.cm.state.suppressEdits;if(!n||r){for(var i,o=e.history,l=e.sel,s="undo"==t?o.done:o.undone,a="undo"==t?o.undone:o.done,u=0;u=0;--d){var p=f(d);if(p)return p.v}}}}function ao(e,t){if(0!=t&&(e.first+=t,e.sel=new yi(q(e.sel.ranges,function(e){return new bi(et(e.anchor.line+t,e.anchor.ch),et(e.head.line+t,e.head.ch))}),e.sel.primIndex),e.cm)){un(e.cm,e.first,e.first-t,t);for(var r=e.cm.display,n=r.viewFrom;ne.lastLine())){if(t.from.lineo&&(t={from:t.from,to:et(o,Xe(e,o).text.length),text:[t.text[0]],origin:t.origin}),t.removed=Ye(e,t.from,t.to),r||(r=Li(e,t)),e.cm?function(e,t,r){var n=e.doc,i=e.display,o=t.from,l=t.to,s=!1,a=o.line;e.options.lineWrapping||(a=qe(zt(Xe(n,o.line))),n.iter(a,l.line+1,function(e){if(e==i.maxLine)return s=!0,!0}));n.sel.contains(t.from,t.to)>-1&&me(e);Oi(n,t,r,on(e)),e.options.lineWrapping||(n.iter(a,o.line+t.text.length,function(e){var t=Kt(e);t>i.maxLineLength&&(i.maxLine=e,i.maxLineLength=t,i.maxLineChanged=!0,s=!1)}),s&&(e.curOp.updateMaxLine=!0));(function(e,t){if(e.modeFrontier=Math.min(e.modeFrontier,t),!(e.highlightFrontierr;n--){var i=Xe(e,n).stateAfter;if(i&&(!(i instanceof ut)||n+i.lookAhead1||!(this.children[0]instanceof vo))){var s=[];this.collapse(s),this.children=[new vo(s)],this.children[0].parent=this}},collapse:function(e){for(var t=0;t50){for(var l=i.lines.length%25+25,s=l;s10);e.parent.maybeSpill()}},iterN:function(e,t,r){for(var n=0;n0||0==l&&!1!==o.clearWhenEmpty)return o;if(o.replacedWith&&(o.collapsed=!0,o.widgetNode=A("span",[o.replacedWith],"CodeMirror-widget"),n.handleMouseEvents||o.widgetNode.setAttribute("cm-ignore-events","true"),n.insertLeft&&(o.widgetNode.insertLeft=!0)),o.collapsed){if(It(e,t.line,t,r,o)||t.line!=r.line&&It(e,r.line,t,r,o))throw new Error("Inserting collapsed marker partially overlapping an existing one");Ct=!0}o.addToHistory&&Ei(e,{from:t,to:r,origin:"markText"},e.sel,NaN);var s,a=t.line,u=e.cm;if(e.iter(a,r.line+1,function(e){u&&o.collapsed&&!u.options.lineWrapping&&zt(e)==u.display.maxLine&&(s=!0),o.collapsed&&a!=t.line&&$e(e,0),function(e,t){e.markedSpans=e.markedSpans?e.markedSpans.concat([t]):[t],t.marker.attachLine(e)}(e,new St(o,a==t.line?t.ch:null,a==r.line?r.ch:null)),++a}),o.collapsed&&e.iter(t.line,r.line+1,function(t){Gt(e,t)&&$e(t,0)}),o.clearOnEnter&&fe(o,"beforeCursorEnter",function(){return o.clear()}),o.readOnly&&(xt=!0,(e.history.done.length||e.history.undone.length)&&e.clearHistory()),o.collapsed&&(o.id=++wo,o.atomic=!0),u){if(s&&(u.curOp.updateMaxLine=!0),o.collapsed)un(u,t.line,r.line+1);else if(o.className||o.startStyle||o.endStyle||o.css||o.attributes||o.title)for(var c=t.line;c<=r.line;c++)cn(u,c,"text");o.atomic&&Qi(u.doc),sr(u,"markerAdded",u,o)}return o}xo.prototype.clear=function(){if(!this.explicitlyCleared){var e=this.doc.cm,t=e&&!e.curOp;if(t&&Kn(e),ye(this,"clear")){var r=this.find();r&&sr(this,"clear",r.from,r.to)}for(var n=null,i=null,o=0;oe.display.maxLineLength&&(e.display.maxLine=u,e.display.maxLineLength=c,e.display.maxLineChanged=!0)}null!=n&&e&&this.collapsed&&un(e,n,i+1),this.lines.length=0,this.explicitlyCleared=!0,this.atomic&&this.doc.cantEdit&&(this.doc.cantEdit=!1,e&&Qi(e.doc)),e&&sr(e,"markerCleared",e,this,n,i),t&&jn(e),this.parent&&this.parent.clear()}},xo.prototype.find=function(e,t){var r,n;null==e&&"bookmark"==this.type&&(e=1);for(var i=0;i=0;a--)oo(this,n[a]);s?_i(this,s):this.cm&&On(this.cm)}),undo:Jn(function(){so(this,"undo")}),redo:Jn(function(){so(this,"redo")}),undoSelection:Jn(function(){so(this,"undo",!0)}),redoSelection:Jn(function(){so(this,"redo",!0)}),setExtending:function(e){this.extend=e},getExtending:function(){return this.extend},historySize:function(){for(var e=this.history,t=0,r=0,n=0;n=e.ch)&&t.push(i.marker.parent||i.marker)}return t},findMarks:function(e,t,r){e=st(this,e),t=st(this,t);var n=[],i=e.line;return this.iter(e.line,t.line+1,function(o){var l=o.markedSpans;if(l)for(var s=0;s=a.to||null==a.from&&i!=e.line||null!=a.from&&i==t.line&&a.from>=t.ch||r&&!r(a.marker)||n.push(a.marker.parent||a.marker)}++i}),n},getAllMarks:function(){var e=[];return this.iter(function(t){var r=t.markedSpans;if(r)for(var n=0;ne)return t=e,!0;e-=o,++r}),st(this,et(r,t))},indexFromPos:function(e){var t=(e=st(this,e)).ch;if(e.linet&&(t=e.from),null!=e.to&&e.to-1)return t.state.draggingText(e),void setTimeout(function(){return t.display.input.focus()},20);try{var c=e.dataTransfer.getData("Text");if(c){var h;if(t.state.draggingText&&!t.state.draggingText.copy&&(h=t.listSelections()),qi(t.doc,xi(r,r)),h)for(var f=0;f=0;t--)co(e.doc,"",n[t].from,n[t].to,"+delete");On(e)})}function _o(e,t,r){var n=oe(e.text,t+r,r);return n<0||n>e.text.length?null:n}function $o(e,t,r){var n=_o(e,t.ch,r);return null==n?null:new et(t.line,n,r<0?"after":"before")}function qo(e,t,r,n,i){if(e){var o=ce(r,t.doc.direction);if(o){var l,s=i<0?$(o):o[0],a=i<0==(1==s.level)?"after":"before";if(s.level>0||"rtl"==t.doc.direction){var u=Dr(t,r);l=i<0?r.text.length-1:0;var c=Wr(t,u,l).top;l=le(function(e){return Wr(t,u,e).top==c},i<0==(1==s.level)?s.from:s.to-1,l),"before"==a&&(l=_o(r,l,1))}else l=i<0?s.to:s.from;return new et(n,l,a)}}return new et(n,i<0?r.text.length:0,i<0?"before":"after")}Ro.basic={Left:"goCharLeft",Right:"goCharRight",Up:"goLineUp",Down:"goLineDown",End:"goLineEnd",Home:"goLineStartSmart",PageUp:"goPageUp",PageDown:"goPageDown",Delete:"delCharAfter",Backspace:"delCharBefore","Shift-Backspace":"delCharBefore",Tab:"defaultTab","Shift-Tab":"indentAuto",Enter:"newlineAndIndent",Insert:"toggleOverwrite",Esc:"singleSelection"},Ro.pcDefault={"Ctrl-A":"selectAll","Ctrl-D":"deleteLine","Ctrl-Z":"undo","Shift-Ctrl-Z":"redo","Ctrl-Y":"redo","Ctrl-Home":"goDocStart","Ctrl-End":"goDocEnd","Ctrl-Up":"goLineUp","Ctrl-Down":"goLineDown","Ctrl-Left":"goGroupLeft","Ctrl-Right":"goGroupRight","Alt-Left":"goLineStart","Alt-Right":"goLineEnd","Ctrl-Backspace":"delGroupBefore","Ctrl-Delete":"delGroupAfter","Ctrl-S":"save","Ctrl-F":"find","Ctrl-G":"findNext","Shift-Ctrl-G":"findPrev","Shift-Ctrl-F":"replace","Shift-Ctrl-R":"replaceAll","Ctrl-[":"indentLess","Ctrl-]":"indentMore","Ctrl-U":"undoSelection","Shift-Ctrl-U":"redoSelection","Alt-U":"redoSelection",fallthrough:"basic"},Ro.emacsy={"Ctrl-F":"goCharRight","Ctrl-B":"goCharLeft","Ctrl-P":"goLineUp","Ctrl-N":"goLineDown","Alt-F":"goWordRight","Alt-B":"goWordLeft","Ctrl-A":"goLineStart","Ctrl-E":"goLineEnd","Ctrl-V":"goPageDown","Shift-Ctrl-V":"goPageUp","Ctrl-D":"delCharAfter","Ctrl-H":"delCharBefore","Alt-D":"delWordAfter","Alt-Backspace":"delWordBefore","Ctrl-K":"killLine","Ctrl-T":"transposeChars","Ctrl-O":"openLine"},Ro.macDefault={"Cmd-A":"selectAll","Cmd-D":"deleteLine","Cmd-Z":"undo","Shift-Cmd-Z":"redo","Cmd-Y":"redo","Cmd-Home":"goDocStart","Cmd-Up":"goDocStart","Cmd-End":"goDocEnd","Cmd-Down":"goDocEnd","Alt-Left":"goGroupLeft","Alt-Right":"goGroupRight","Cmd-Left":"goLineLeft","Cmd-Right":"goLineRight","Alt-Backspace":"delGroupBefore","Ctrl-Alt-Backspace":"delGroupAfter","Alt-Delete":"delGroupAfter","Cmd-S":"save","Cmd-F":"find","Cmd-G":"findNext","Shift-Cmd-G":"findPrev","Cmd-Alt-F":"replace","Shift-Cmd-Alt-F":"replaceAll","Cmd-[":"indentLess","Cmd-]":"indentMore","Cmd-Backspace":"delWrappedLineLeft","Cmd-Delete":"delWrappedLineRight","Cmd-U":"undoSelection","Shift-Cmd-U":"redoSelection","Ctrl-Up":"goDocStart","Ctrl-Down":"goDocEnd",fallthrough:["basic","emacsy"]},Ro.default=y?Ro.macDefault:Ro.pcDefault;var Zo={selectAll:no,singleSelection:function(e){return e.setSelection(e.getCursor("anchor"),e.getCursor("head"),V)},killLine:function(e){return Yo(e,function(t){if(t.empty()){var r=Xe(e.doc,t.head.line).text.length;return t.head.ch==r&&t.head.line0)i=new et(i.line,i.ch+1),e.replaceRange(o.charAt(i.ch-1)+o.charAt(i.ch-2),et(i.line,i.ch-2),i,"+transpose");else if(i.line>e.doc.first){var l=Xe(e.doc,i.line-1).text;l&&(i=new et(i.line,1),e.replaceRange(o.charAt(0)+e.doc.lineSeparator()+l.charAt(l.length-1),et(i.line-1,l.length-1),i,"+transpose"))}r.push(new bi(i,i))}e.setSelections(r)})},newlineAndIndent:function(e){return qn(e,function(){for(var t=e.listSelections(),r=t.length-1;r>=0;r--)e.replaceRange(e.doc.lineSeparator(),t[r].anchor,t[r].head,"+input");t=e.listSelections();for(var n=0;n-1&&(tt((i=u.ranges[i]).from(),t)<0||t.xRel>0)&&(tt(i.to(),t)>0||t.xRel<0)?function(e,t,r,n){var i=e.display,o=!1,u=Zn(e,function(t){a&&(i.scroller.draggable=!1),e.state.draggingText=!1,pe(i.wrapper.ownerDocument,"mouseup",u),pe(i.wrapper.ownerDocument,"mousemove",c),pe(i.scroller,"dragstart",h),pe(i.scroller,"drop",u),o||(we(t),n.addNew||Ki(e.doc,r,null,null,n.extend),a||l&&9==s?setTimeout(function(){i.wrapper.ownerDocument.body.focus(),i.input.focus()},20):i.input.focus())}),c=function(e){o=o||Math.abs(t.clientX-e.clientX)+Math.abs(t.clientY-e.clientY)>=10},h=function(){return o=!0};a&&(i.scroller.draggable=!0);e.state.draggingText=u,u.copy=!n.moveOnDrag,i.scroller.dragDrop&&i.scroller.dragDrop();fe(i.wrapper.ownerDocument,"mouseup",u),fe(i.wrapper.ownerDocument,"mousemove",c),fe(i.scroller,"dragstart",h),fe(i.scroller,"drop",u),xn(e),setTimeout(function(){return i.input.focus()},20)}(e,n,t,o):function(e,t,r,n){var i=e.display,o=e.doc;we(t);var l,s,a=o.sel,u=a.ranges;n.addNew&&!n.extend?(s=o.sel.contains(r),l=s>-1?u[s]:new bi(r,r)):(l=o.sel.primary(),s=o.sel.primIndex);if("rectangle"==n.unit)n.addNew||(l=new bi(r,r)),r=sn(e,t,!0,!0),s=-1;else{var c=dl(e,r,n.unit);l=n.extend?Vi(l,c.anchor,c.head,n.extend):c}n.addNew?-1==s?(s=u.length,$i(o,wi(e,u.concat([l]),s),{scroll:!1,origin:"*mouse"})):u.length>1&&u[s].empty()&&"char"==n.unit&&!n.extend?($i(o,wi(e,u.slice(0,s).concat(u.slice(s+1)),0),{scroll:!1,origin:"*mouse"}),a=o.sel):Xi(o,s,l,K):(s=0,$i(o,new yi([l],0),K),a=o.sel);var h=r;function f(t){if(0!=tt(h,t))if(h=t,"rectangle"==n.unit){for(var i=[],u=e.options.tabSize,c=z(Xe(o,r.line).text,r.ch,u),f=z(Xe(o,t.line).text,t.ch,u),d=Math.min(c,f),p=Math.max(c,f),g=Math.min(r.line,t.line),v=Math.min(e.lastLine(),Math.max(r.line,t.line));g<=v;g++){var m=Xe(o,g).text,y=X(m,d,u);d==p?i.push(new bi(et(g,y),et(g,y))):m.length>y&&i.push(new bi(et(g,y),et(g,X(m,p,u))))}i.length||i.push(new bi(r,r)),$i(o,wi(e,a.ranges.slice(0,s).concat(i),s),{origin:"*mouse",scroll:!1}),e.scrollIntoView(t)}else{var b,w=l,x=dl(e,t,n.unit),C=w.anchor;tt(x.anchor,C)>0?(b=x.head,C=ot(w.from(),x.anchor)):(b=x.anchor,C=it(w.to(),x.head));var S=a.ranges.slice(0);S[s]=function(e,t){var r=t.anchor,n=t.head,i=Xe(e.doc,r.line);if(0==tt(r,n)&&r.sticky==n.sticky)return t;var o=ce(i);if(!o)return t;var l=ae(o,r.ch,r.sticky),s=o[l];if(s.from!=r.ch&&s.to!=r.ch)return t;var a,u=l+(s.from==r.ch==(1!=s.level)?0:1);if(0==u||u==o.length)return t;if(n.line!=r.line)a=(n.line-r.line)*("ltr"==e.doc.direction?1:-1)>0;else{var c=ae(o,n.ch,n.sticky),h=c-l||(n.ch-r.ch)*(1==s.level?-1:1);a=c==u-1||c==u?h<0:h>0}var f=o[u+(a?-1:0)],d=a==(1==f.level),p=d?f.from:f.to,g=d?"after":"before";return r.ch==p&&r.sticky==g?t:new bi(new et(r.line,p,g),n)}(e,new bi(st(o,C),b)),$i(o,wi(e,S,s),K)}}var d=i.wrapper.getBoundingClientRect(),p=0;function g(t){e.state.selectingText=!1,p=1/0,t&&(we(t),i.input.focus()),pe(i.wrapper.ownerDocument,"mousemove",v),pe(i.wrapper.ownerDocument,"mouseup",m),o.history.lastSelOrigin=null}var v=Zn(e,function(t){0!==t.buttons&&ke(t)?function t(r){var l=++p;var s=sn(e,r,!0,"rectangle"==n.unit);if(!s)return;if(0!=tt(s,h)){e.curOp.focus=W(),f(s);var a=Tn(i,o);(s.line>=a.to||s.lined.bottom?20:0;u&&setTimeout(Zn(e,function(){p==l&&(i.scroller.scrollTop+=u,t(r))}),50)}}(t):g(t)}),m=Zn(e,g);e.state.selectingText=m,fe(i.wrapper.ownerDocument,"mousemove",v),fe(i.wrapper.ownerDocument,"mouseup",m)}(e,n,t,o)}(t,n,o,e):Le(e)==r.scroller&&we(e):2==i?(n&&Ki(t.doc,n),setTimeout(function(){return r.input.focus()},20)):3==i&&(S?t.display.input.onContextMenu(e):xn(t)))}}function dl(e,t,r){if("char"==r)return new bi(t,t);if("word"==r)return e.findWordAt(t);if("line"==r)return new bi(et(t.line,0),st(e.doc,et(t.line+1,0)));var n=r(e,t);return new bi(n.from,n.to)}function pl(e,t,r,n){var i,o;if(t.touches)i=t.touches[0].clientX,o=t.touches[0].clientY;else try{i=t.clientX,o=t.clientY}catch(t){return!1}if(i>=Math.floor(e.display.gutters.getBoundingClientRect().right))return!1;n&&we(t);var l=e.display,s=l.lineDiv.getBoundingClientRect();if(o>s.bottom||!ye(e,r))return Ce(t);o-=s.top-l.viewOffset;for(var a=0;a=i)return ge(e,r,e,Ze(e.doc,o),e.display.gutterSpecs[a].className,t),Ce(t)}}function gl(e,t){return pl(e,t,"gutterClick",!0)}function vl(e,t){xr(e.display,t)||function(e,t){if(!ye(e,"gutterContextMenu"))return!1;return pl(e,t,"gutterContextMenu",!1)}(e,t)||ve(e,t,"contextmenu")||S||e.display.input.onContextMenu(t)}function ml(e){e.display.wrapper.className=e.display.wrapper.className.replace(/\s*cm-s-\S+/g,"")+e.options.theme.replace(/(^|\s)\s*/g," cm-s-"),Rr(e)}hl.prototype.compare=function(e,t,r){return this.time+400>e&&0==tt(t,this.pos)&&r==this.button};var yl={toString:function(){return"CodeMirror.Init"}},bl={},wl={};function xl(e,t,r){if(!t!=!(r&&r!=yl)){var n=e.display.dragFunctions,i=t?fe:pe;i(e.display.scroller,"dragstart",n.start),i(e.display.scroller,"dragenter",n.enter),i(e.display.scroller,"dragover",n.over),i(e.display.scroller,"dragleave",n.leave),i(e.display.scroller,"drop",n.drop)}}function Cl(e){e.options.lineWrapping?(H(e.display.wrapper,"CodeMirror-wrap"),e.display.sizer.style.minWidth="",e.display.sizerWidth=null):(T(e.display.wrapper,"CodeMirror-wrap"),jt(e)),ln(e),un(e),Rr(e),setTimeout(function(){return Rn(e)},100)}function Sl(e,t){var n=this;if(!(this instanceof Sl))return new Sl(e,t);this.options=t=t?I(t):{},I(bl,t,!1);var i=t.value;"string"==typeof i?i=new Mo(i,t.mode,null,t.lineSeparator,t.direction):t.mode&&(i.modeOption=t.mode),this.doc=i;var o=new Sl.inputStyles[t.inputStyle](this),u=this.display=new function(e,t,n,i){var o=this;this.input=n,o.scrollbarFiller=O("div",null,"CodeMirror-scrollbar-filler"),o.scrollbarFiller.setAttribute("cm-not-content","true"),o.gutterFiller=O("div",null,"CodeMirror-gutter-filler"),o.gutterFiller.setAttribute("cm-not-content","true"),o.lineDiv=A("div",null,"CodeMirror-code"),o.selectionDiv=O("div",null,null,"position: relative; z-index: 1"),o.cursorDiv=O("div",null,"CodeMirror-cursors"),o.measure=O("div",null,"CodeMirror-measure"),o.lineMeasure=O("div",null,"CodeMirror-measure"),o.lineSpace=A("div",[o.measure,o.lineMeasure,o.selectionDiv,o.cursorDiv,o.lineDiv],null,"position: relative; outline: none");var u=A("div",[o.lineSpace],"CodeMirror-lines");o.mover=O("div",[u],null,"position: relative"),o.sizer=O("div",[o.mover],"CodeMirror-sizer"),o.sizerWidth=null,o.heightForcer=O("div",null,null,"position: absolute; height: "+G+"px; width: 1px;"),o.gutters=O("div",null,"CodeMirror-gutters"),o.lineGutter=null,o.scroller=O("div",[o.sizer,o.heightForcer,o.gutters],"CodeMirror-scroll"),o.scroller.setAttribute("tabIndex","-1"),o.wrapper=O("div",[o.scrollbarFiller,o.gutterFiller,o.scroller],"CodeMirror"),l&&s<8&&(o.gutters.style.zIndex=-1,o.scroller.style.paddingRight=0),a||r&&m||(o.scroller.draggable=!0),e&&(e.appendChild?e.appendChild(o.wrapper):e(o.wrapper)),o.viewFrom=o.viewTo=t.first,o.reportedViewFrom=o.reportedViewTo=t.first,o.view=[],o.renderedView=null,o.externalMeasured=null,o.viewOffset=0,o.lastWrapHeight=o.lastWrapWidth=0,o.updateLineNumbers=null,o.nativeBarWidth=o.barHeight=o.barWidth=0,o.scrollbarsClipped=!1,o.lineNumWidth=o.lineNumInnerWidth=o.lineNumChars=null,o.alignWidgets=!1,o.cachedCharWidth=o.cachedTextHeight=o.cachedPaddingH=null,o.maxLine=null,o.maxLineLength=0,o.maxLineChanged=!1,o.wheelDX=o.wheelDY=o.wheelStartX=o.wheelStartY=null,o.shift=!1,o.selForContextMenu=null,o.activeTouch=null,o.gutterSpecs=ci(i.gutters,i.lineNumbers),hi(o),n.init(o)}(e,i,o,t);for(var c in u.wrapper.CodeMirror=this,ml(this),t.lineWrapping&&(this.display.wrapper.className+=" CodeMirror-wrap"),Un(this),this.state={keyMaps:[],overlays:[],modeGen:0,overwrite:!1,delayingBlurEvent:!1,focused:!1,suppressEdits:!1,pasteIncoming:-1,cutIncoming:-1,selectingText:!1,draggingText:!1,highlight:new R,keySeq:null,specialChars:null},t.autofocus&&!m&&u.input.focus(),l&&s<11&&setTimeout(function(){return n.display.input.reset(!0)},20),function(e){var t=e.display;fe(t.scroller,"mousedown",Zn(e,fl)),fe(t.scroller,"dblclick",l&&s<11?Zn(e,function(t){if(!ve(e,t)){var r=sn(e,t);if(r&&!gl(e,t)&&!xr(e.display,t)){we(t);var n=e.findWordAt(r);Ki(e.doc,n.anchor,n.head)}}}):function(t){return ve(e,t)||we(t)});fe(t.scroller,"contextmenu",function(t){return vl(e,t)});var r,n={end:0};function i(){t.activeTouch&&(r=setTimeout(function(){return t.activeTouch=null},1e3),(n=t.activeTouch).end=+new Date)}function o(e,t){if(null==t.left)return!0;var r=t.left-e.left,n=t.top-e.top;return r*r+n*n>400}fe(t.scroller,"touchstart",function(i){if(!ve(e,i)&&!function(e){if(1!=e.touches.length)return!1;var t=e.touches[0];return t.radiusX<=1&&t.radiusY<=1}(i)&&!gl(e,i)){t.input.ensurePolled(),clearTimeout(r);var o=+new Date;t.activeTouch={start:o,moved:!1,prev:o-n.end<=300?n:null},1==i.touches.length&&(t.activeTouch.left=i.touches[0].pageX,t.activeTouch.top=i.touches[0].pageY)}}),fe(t.scroller,"touchmove",function(){t.activeTouch&&(t.activeTouch.moved=!0)}),fe(t.scroller,"touchend",function(r){var n=t.activeTouch;if(n&&!xr(t,r)&&null!=n.left&&!n.moved&&new Date-n.start<300){var l,s=e.coordsChar(t.activeTouch,"page");l=!n.prev||o(n,n.prev)?new bi(s,s):!n.prev.prev||o(n,n.prev.prev)?e.findWordAt(s):new bi(et(s.line,0),st(e.doc,et(s.line+1,0))),e.setSelection(l.anchor,l.head),e.focus(),we(r)}i()}),fe(t.scroller,"touchcancel",i),fe(t.scroller,"scroll",function(){t.scroller.clientHeight&&(Hn(e,t.scroller.scrollTop),Pn(e,t.scroller.scrollLeft,!0),ge(e,"scroll",e))}),fe(t.scroller,"mousewheel",function(t){return mi(e,t)}),fe(t.scroller,"DOMMouseScroll",function(t){return mi(e,t)}),fe(t.wrapper,"scroll",function(){return t.wrapper.scrollTop=t.wrapper.scrollLeft=0}),t.dragFunctions={enter:function(t){ve(e,t)||Se(t)},over:function(t){ve(e,t)||(!function(e,t){var r=sn(e,t);if(r){var n=document.createDocumentFragment();vn(e,r,n),e.display.dragCursor||(e.display.dragCursor=O("div",null,"CodeMirror-cursors CodeMirror-dragcursors"),e.display.lineSpace.insertBefore(e.display.dragCursor,e.display.cursorDiv)),N(e.display.dragCursor,n)}}(e,t),Se(t))},start:function(t){return function(e,t){if(l&&(!e.state.draggingText||+new Date-No<100))Se(t);else if(!ve(e,t)&&!xr(e.display,t)&&(t.dataTransfer.setData("Text",e.getSelection()),t.dataTransfer.effectAllowed="copyMove",t.dataTransfer.setDragImage&&!f)){var r=O("img",null,null,"position: fixed; left: 0; top: 0;");r.src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==",h&&(r.width=r.height=1,e.display.wrapper.appendChild(r),r._top=r.offsetTop),t.dataTransfer.setDragImage(r,0,0),h&&r.parentNode.removeChild(r)}}(e,t)},drop:Zn(e,Oo),leave:function(t){ve(e,t)||Ao(e)}};var a=t.input.getField();fe(a,"keyup",function(t){return sl.call(e,t)}),fe(a,"keydown",Zn(e,ll)),fe(a,"keypress",Zn(e,al)),fe(a,"focus",function(t){return Cn(e,t)}),fe(a,"blur",function(t){return Sn(e,t)})}(this),Ho(),Kn(this),this.curOp.forceUpdate=!0,Di(this,i),t.autofocus&&!m||this.hasFocus()?setTimeout(E(Cn,this),20):Sn(this),wl)wl.hasOwnProperty(c)&&wl[c](n,t[c],yl);ui(this),t.finishInit&&t.finishInit(this);for(var d=0;d150)){if(!n)return;r="prev"}}else u=0,r="not";"prev"==r?u=t>o.first?z(Xe(o,t-1).text,null,l):0:"add"==r?u=a+e.options.indentUnit:"subtract"==r?u=a-e.options.indentUnit:"number"==typeof r&&(u=a+r),u=Math.max(0,u);var h="",f=0;if(e.options.indentWithTabs)for(var d=Math.floor(u/l);d;--d)f+=l,h+="\t";if(fl,a=We(t),u=null;if(s&&n.ranges.length>1)if(Tl&&Tl.text.join("\n")==t){if(n.ranges.length%Tl.text.length==0){u=[];for(var c=0;c=0;f--){var d=n.ranges[f],p=d.from(),g=d.to();d.empty()&&(r&&r>0?p=et(p.line,p.ch-r):e.state.overwrite&&!s?g=et(g.line,Math.min(Xe(o,g.line).text.length,g.ch+$(a).length)):s&&Tl&&Tl.lineWise&&Tl.text.join("\n")==t&&(p=g=et(p.line,0)));var v={from:p,to:g,text:u?u[f%u.length]:a,origin:i||(s?"paste":e.state.cutIncoming>l?"cut":"+input")};oo(e.doc,v),sr(e,"inputRead",e,v)}t&&!s&&Al(e,t),On(e),e.curOp.updateInput<2&&(e.curOp.updateInput=h),e.curOp.typing=!0,e.state.pasteIncoming=e.state.cutIncoming=-1}function Ol(e,t){var r=e.clipboardData&&e.clipboardData.getData("Text");if(r)return e.preventDefault(),t.isReadOnly()||t.options.disableInput||qn(t,function(){return Nl(t,r,0,null,"paste")}),!0}function Al(e,t){if(e.options.electricChars&&e.options.smartIndent)for(var r=e.doc.sel,n=r.ranges.length-1;n>=0;n--){var i=r.ranges[n];if(!(i.head.ch>100||n&&r.ranges[n-1].head.line==i.head.line)){var o=e.getModeAt(i.head),l=!1;if(o.electricChars){for(var s=0;s-1){l=kl(e,i.head.line,"smart");break}}else o.electricInput&&o.electricInput.test(Xe(e.doc,i.head.line).text.slice(0,i.head.ch))&&(l=kl(e,i.head.line,"smart"));l&&sr(e,"electricInput",e,i.head.line)}}}function Dl(e){for(var t=[],r=[],n=0;n=t.text.length?(r.ch=t.text.length,r.sticky="before"):r.ch<=0&&(r.ch=0,r.sticky="after");var o=ae(i,r.ch,r.sticky),l=i[o];if("ltr"==e.doc.direction&&l.level%2==0&&(n>0?l.to>r.ch:l.from=l.from&&f>=c.begin)){var d=h?"before":"after";return new et(r.line,f,d)}}var p=function(e,t,n){for(var o=function(e,t){return t?new et(r.line,a(e,1),"before"):new et(r.line,e,"after")};e>=0&&e0==(1!=l.level),u=s?n.begin:a(n.end,-1);if(l.from<=u&&u0?c.end:a(c.begin,-1);return null==v||n>0&&v==t.text.length||!(g=p(n>0?0:i.length-1,n,u(v)))?null:g}(e.cm,s,t,r):$o(s,t,r))){if(n||(l=t.line+r)=e.first+e.size||(t=new et(l,t.ch,t.sticky),!(s=Xe(e,l))))return!1;t=qo(i,e.cm,s,t.line,r)}else t=o;return!0}if("char"==n)a();else if("column"==n)a(!0);else if("word"==n||"group"==n)for(var u=null,c="group"==n,h=e.cm&&e.cm.getHelper(t,"wordChars"),f=!0;!(r<0)||a(!f);f=!1){var d=s.text.charAt(t.ch)||"\n",p=te(d,h)?"w":c&&"\n"==d?"n":!c||/\s/.test(d)?null:"p";if(!c||f||p||(p="s"),u&&u!=p){r<0&&(r=1,a(),t.sticky="after");break}if(p&&(u=p),r>0&&!a(!f))break}var g=to(e,t,o,l,!0);return rt(o,g)&&(g.hitSide=!0),g}function Pl(e,t,r,n){var i,o,l=e.doc,s=t.left;if("page"==n){var a=Math.min(e.display.wrapper.clientHeight,window.innerHeight||document.documentElement.clientHeight),u=Math.max(a-.5*en(e.display),3);i=(r>0?t.bottom:t.top)+r*u}else"line"==n&&(i=r>0?t.bottom+3:t.top-3);for(;(o=$r(e,s,i)).outside;){if(r<0?i<=0:i>=l.height){o.hitSide=!0;break}i+=5*r}return o}var El=function(e){this.cm=e,this.lastAnchorNode=this.lastAnchorOffset=this.lastFocusNode=this.lastFocusOffset=null,this.polling=new R,this.composing=null,this.gracePeriod=!1,this.readDOMTimeout=null};function Il(e,t){var r=Ar(e,t.line);if(!r||r.hidden)return null;var n=Xe(e.doc,t.line),i=Nr(r,n,t.line),o=ce(n,e.doc.direction),l="left";o&&(l=ae(o,t.ch)%2?"right":"left");var s=Pr(i.map,t.ch,l);return s.offset="right"==s.collapse?s.end:s.start,s}function zl(e,t){return t&&(e.bad=!0),e}function Rl(e,t,r){var n;if(t==e.display.lineDiv){if(!(n=e.display.lineDiv.childNodes[r]))return zl(e.clipPos(et(e.display.viewTo-1)),!0);t=null,r=0}else for(n=t;;n=n.parentNode){if(!n||n==e.display.lineDiv)return null;if(n.parentNode&&n.parentNode==e.display.lineDiv)break}for(var i=0;i=t.display.viewTo||o.line=t.display.viewFrom&&Il(t,i)||{node:a[0].measure.map[2],offset:0},c=o.linen.firstLine()&&(l=et(l.line-1,Xe(n.doc,l.line-1).length)),s.ch==Xe(n.doc,s.line).text.length&&s.linei.viewTo-1)return!1;l.line==i.viewFrom||0==(e=an(n,l.line))?(t=qe(i.view[0].line),r=i.view[0].node):(t=qe(i.view[e].line),r=i.view[e-1].node.nextSibling);var a,u,c=an(n,s.line);if(c==i.view.length-1?(a=i.viewTo-1,u=i.lineDiv.lastChild):(a=qe(i.view[c+1].line)-1,u=i.view[c+1].node.previousSibling),!r)return!1;for(var h=n.doc.splitLines(function(e,t,r,n,i){var o="",l=!1,s=e.doc.lineSeparator(),a=!1;function u(){l&&(o+=s,a&&(o+=s),l=a=!1)}function c(e){e&&(u(),o+=e)}function h(t){if(1==t.nodeType){var r=t.getAttribute("cm-text");if(r)return void c(r);var o,f=t.getAttribute("cm-marker");if(f){var d=e.findMarks(et(n,0),et(i+1,0),(v=+f,function(e){return e.id==v}));return void(d.length&&(o=d[0].find(0))&&c(Ye(e.doc,o.from,o.to).join(s)))}if("false"==t.getAttribute("contenteditable"))return;var p=/^(pre|div|p|li|table|br)$/i.test(t.nodeName);if(!/^br$/i.test(t.nodeName)&&0==t.textContent.length)return;p&&u();for(var g=0;g1&&f.length>1;)if($(h)==$(f))h.pop(),f.pop(),a--;else{if(h[0]!=f[0])break;h.shift(),f.shift(),t++}for(var d=0,p=0,g=h[0],v=f[0],m=Math.min(g.length,v.length);dl.ch&&y.charCodeAt(y.length-p-1)==b.charCodeAt(b.length-p-1);)d--,p++;h[h.length-1]=y.slice(0,y.length-p).replace(/^\u200b+/,""),h[0]=h[0].slice(d).replace(/\u200b+$/,"");var x=et(t,d),C=et(a,f.length?$(f).length-p:0);return h.length>1||h[0]||tt(x,C)?(co(n.doc,h,x,C,"+input"),!0):void 0},El.prototype.ensurePolled=function(){this.forceCompositionEnd()},El.prototype.reset=function(){this.forceCompositionEnd()},El.prototype.forceCompositionEnd=function(){this.composing&&(clearTimeout(this.readDOMTimeout),this.composing=null,this.updateFromDOM(),this.div.blur(),this.div.focus())},El.prototype.readFromDOMSoon=function(){var e=this;null==this.readDOMTimeout&&(this.readDOMTimeout=setTimeout(function(){if(e.readDOMTimeout=null,e.composing){if(!e.composing.done)return;e.composing=null}e.updateFromDOM()},80))},El.prototype.updateFromDOM=function(){var e=this;!this.cm.isReadOnly()&&this.pollContent()||qn(this.cm,function(){return un(e.cm)})},El.prototype.setUneditable=function(e){e.contentEditable="false"},El.prototype.onKeyPress=function(e){0==e.charCode||this.composing||(e.preventDefault(),this.cm.isReadOnly()||Zn(this.cm,Nl)(this.cm,String.fromCharCode(null==e.charCode?e.keyCode:e.charCode),0))},El.prototype.readOnlyChanged=function(e){this.div.contentEditable=String("nocursor"!=e)},El.prototype.onContextMenu=function(){},El.prototype.resetPosition=function(){},El.prototype.needsContentAttribute=!0;var Gl=function(e){this.cm=e,this.prevInput="",this.pollingFast=!1,this.polling=new R,this.hasSelection=!1,this.composing=null};Gl.prototype.init=function(e){var t=this,r=this,n=this.cm;this.createField(e);var i=this.textarea;function o(e){if(!ve(n,e)){if(n.somethingSelected())Ml({lineWise:!1,text:n.getSelections()});else{if(!n.options.lineWiseCopyCut)return;var t=Dl(n);Ml({lineWise:!0,text:t.text}),"cut"==e.type?n.setSelections(t.ranges,null,V):(r.prevInput="",i.value=t.text.join("\n"),P(i))}"cut"==e.type&&(n.state.cutIncoming=+new Date)}}e.wrapper.insertBefore(this.wrapper,e.wrapper.firstChild),g&&(i.style.width="0px"),fe(i,"input",function(){l&&s>=9&&t.hasSelection&&(t.hasSelection=null),r.poll()}),fe(i,"paste",function(e){ve(n,e)||Ol(e,n)||(n.state.pasteIncoming=+new Date,r.fastPoll())}),fe(i,"cut",o),fe(i,"copy",o),fe(e.scroller,"paste",function(t){if(!xr(e,t)&&!ve(n,t)){if(!i.dispatchEvent)return n.state.pasteIncoming=+new Date,void r.focus();var o=new Event("paste");o.clipboardData=t.clipboardData,i.dispatchEvent(o)}}),fe(e.lineSpace,"selectstart",function(t){xr(e,t)||we(t)}),fe(i,"compositionstart",function(){var e=n.getCursor("from");r.composing&&r.composing.range.clear(),r.composing={start:e,range:n.markText(e,n.getCursor("to"),{className:"CodeMirror-composing"})}}),fe(i,"compositionend",function(){r.composing&&(r.poll(),r.composing.range.clear(),r.composing=null)})},Gl.prototype.createField=function(e){this.wrapper=Hl(),this.textarea=this.wrapper.firstChild},Gl.prototype.prepareSelection=function(){var e=this.cm,t=e.display,r=e.doc,n=gn(e);if(e.options.moveInputWithCursor){var i=Xr(e,r.sel.primary().head,"div"),o=t.wrapper.getBoundingClientRect(),l=t.lineDiv.getBoundingClientRect();n.teTop=Math.max(0,Math.min(t.wrapper.clientHeight-10,i.top+l.top-o.top)),n.teLeft=Math.max(0,Math.min(t.wrapper.clientWidth-10,i.left+l.left-o.left))}return n},Gl.prototype.showSelection=function(e){var t=this.cm.display;N(t.cursorDiv,e.cursors),N(t.selectionDiv,e.selection),null!=e.teTop&&(this.wrapper.style.top=e.teTop+"px",this.wrapper.style.left=e.teLeft+"px")},Gl.prototype.reset=function(e){if(!this.contextMenuPending&&!this.composing){var t=this.cm;if(t.somethingSelected()){this.prevInput="";var r=t.getSelection();this.textarea.value=r,t.state.focused&&P(this.textarea),l&&s>=9&&(this.hasSelection=r)}else e||(this.prevInput=this.textarea.value="",l&&s>=9&&(this.hasSelection=null))}},Gl.prototype.getField=function(){return this.textarea},Gl.prototype.supportsTouch=function(){return!1},Gl.prototype.focus=function(){if("nocursor"!=this.cm.options.readOnly&&(!m||W()!=this.textarea))try{this.textarea.focus()}catch(e){}},Gl.prototype.blur=function(){this.textarea.blur()},Gl.prototype.resetPosition=function(){this.wrapper.style.top=this.wrapper.style.left=0},Gl.prototype.receivedFocus=function(){this.slowPoll()},Gl.prototype.slowPoll=function(){var e=this;this.pollingFast||this.polling.set(this.cm.options.pollInterval,function(){e.poll(),e.cm.state.focused&&e.slowPoll()})},Gl.prototype.fastPoll=function(){var e=!1,t=this;t.pollingFast=!0,t.polling.set(20,function r(){t.poll()||e?(t.pollingFast=!1,t.slowPoll()):(e=!0,t.polling.set(60,r))})},Gl.prototype.poll=function(){var e=this,t=this.cm,r=this.textarea,n=this.prevInput;if(this.contextMenuPending||!t.state.focused||He(r)&&!n&&!this.composing||t.isReadOnly()||t.options.disableInput||t.state.keySeq)return!1;var i=r.value;if(i==n&&!t.somethingSelected())return!1;if(l&&s>=9&&this.hasSelection===i||y&&/[\uf700-\uf7ff]/.test(i))return t.display.input.reset(),!1;if(t.doc.sel==t.display.selForContextMenu){var o=i.charCodeAt(0);if(8203!=o||n||(n="​"),8666==o)return this.reset(),this.cm.execCommand("undo")}for(var a=0,u=Math.min(n.length,i.length);a1e3||i.indexOf("\n")>-1?r.value=e.prevInput="":e.prevInput=i,e.composing&&(e.composing.range.clear(),e.composing.range=t.markText(e.composing.start,t.getCursor("to"),{className:"CodeMirror-composing"}))}),!0},Gl.prototype.ensurePolled=function(){this.pollingFast&&this.poll()&&(this.pollingFast=!1)},Gl.prototype.onKeyPress=function(){l&&s>=9&&(this.hasSelection=null),this.fastPoll()},Gl.prototype.onContextMenu=function(e){var t=this,r=t.cm,n=r.display,i=t.textarea;t.contextMenuPending&&t.contextMenuPending();var o=sn(r,e),u=n.scroller.scrollTop;if(o&&!h){r.options.resetSelectionOnContextMenu&&-1==r.doc.sel.contains(o)&&Zn(r,$i)(r.doc,xi(o),V);var c,f=i.style.cssText,d=t.wrapper.style.cssText,p=t.wrapper.offsetParent.getBoundingClientRect();if(t.wrapper.style.cssText="position: static",i.style.cssText="position: absolute; width: 30px; height: 30px;\n top: "+(e.clientY-p.top-5)+"px; left: "+(e.clientX-p.left-5)+"px;\n z-index: 1000; background: "+(l?"rgba(255, 255, 255, .05)":"transparent")+";\n outline: none; border-width: 0; outline: none; overflow: hidden; opacity: .05; filter: alpha(opacity=5);",a&&(c=window.scrollY),n.input.focus(),a&&window.scrollTo(null,c),n.input.reset(),r.somethingSelected()||(i.value=t.prevInput=" "),t.contextMenuPending=m,n.selForContextMenu=r.doc.sel,clearTimeout(n.detectingSelectAll),l&&s>=9&&v(),S){Se(e);var g=function(){pe(window,"mouseup",g),setTimeout(m,20)};fe(window,"mouseup",g)}else setTimeout(m,50)}function v(){if(null!=i.selectionStart){var e=r.somethingSelected(),o="​"+(e?i.value:"");i.value="⇚",i.value=o,t.prevInput=e?"":"​",i.selectionStart=1,i.selectionEnd=o.length,n.selForContextMenu=r.doc.sel}}function m(){if(t.contextMenuPending==m&&(t.contextMenuPending=!1,t.wrapper.style.cssText=d,i.style.cssText=f,l&&s<9&&n.scrollbars.setScrollTop(n.scroller.scrollTop=u),null!=i.selectionStart)){(!l||l&&s<9)&&v();var e=0,o=function(){n.selForContextMenu==r.doc.sel&&0==i.selectionStart&&i.selectionEnd>0&&"​"==t.prevInput?Zn(r,no)(r):e++<10?n.detectingSelectAll=setTimeout(o,500):(n.selForContextMenu=null,n.input.reset())};n.detectingSelectAll=setTimeout(o,200)}}},Gl.prototype.readOnlyChanged=function(e){e||this.reset(),this.textarea.disabled="nocursor"==e},Gl.prototype.setUneditable=function(){},Gl.prototype.needsContentAttribute=!1,function(e){var t=e.optionHandlers;function r(r,n,i,o){e.defaults[r]=n,i&&(t[r]=o?function(e,t,r){r!=yl&&i(e,t,r)}:i)}e.defineOption=r,e.Init=yl,r("value","",function(e,t){return e.setValue(t)},!0),r("mode",null,function(e,t){e.doc.modeOption=t,Ti(e)},!0),r("indentUnit",2,Ti,!0),r("indentWithTabs",!1),r("smartIndent",!0),r("tabSize",4,function(e){Mi(e),Rr(e),un(e)},!0),r("lineSeparator",null,function(e,t){if(e.doc.lineSep=t,t){var r=[],n=e.doc.first;e.doc.iter(function(e){for(var i=0;;){var o=e.text.indexOf(t,i);if(-1==o)break;i=o+t.length,r.push(et(n,o))}n++});for(var i=r.length-1;i>=0;i--)co(e.doc,t,r[i],et(r[i].line,r[i].ch+t.length))}}),r("specialChars",/[\u0000-\u001f\u007f-\u009f\u00ad\u061c\u200b-\u200f\u2028\u2029\ufeff\ufff9-\ufffc]/g,function(e,t,r){e.state.specialChars=new RegExp(t.source+(t.test("\t")?"":"|\t"),"g"),r!=yl&&e.refresh()}),r("specialCharPlaceholder",Qt,function(e){return e.refresh()},!0),r("electricChars",!0),r("inputStyle",m?"contenteditable":"textarea",function(){throw new Error("inputStyle can not (yet) be changed in a running editor")},!0),r("spellcheck",!1,function(e,t){return e.getInputField().spellcheck=t},!0),r("autocorrect",!1,function(e,t){return e.getInputField().autocorrect=t},!0),r("autocapitalize",!1,function(e,t){return e.getInputField().autocapitalize=t},!0),r("rtlMoveVisually",!w),r("wholeLineUpdateBefore",!0),r("theme","default",function(e){ml(e),fi(e)},!0),r("keyMap","default",function(e,t,r){var n=Xo(t),i=r!=yl&&Xo(r);i&&i.detach&&i.detach(e,n),n.attach&&n.attach(e,i||null)}),r("extraKeys",null),r("configureMouse",null),r("lineWrapping",!1,Cl,!0),r("gutters",[],function(e,t){e.display.gutterSpecs=ci(t,e.options.lineNumbers),fi(e)},!0),r("fixedGutter",!0,function(e,t){e.display.gutters.style.left=t?nn(e.display)+"px":"0",e.refresh()},!0),r("coverGutterNextToScrollbar",!1,function(e){return Rn(e)},!0),r("scrollbarStyle","native",function(e){Un(e),Rn(e),e.display.scrollbars.setScrollTop(e.doc.scrollTop),e.display.scrollbars.setScrollLeft(e.doc.scrollLeft)},!0),r("lineNumbers",!1,function(e,t){e.display.gutterSpecs=ci(e.options.gutters,t),fi(e)},!0),r("firstLineNumber",1,fi,!0),r("lineNumberFormatter",function(e){return e},fi,!0),r("showCursorWhenSelecting",!1,pn,!0),r("resetSelectionOnContextMenu",!0),r("lineWiseCopyCut",!0),r("pasteLinesPerSelection",!0),r("selectionsMayTouch",!1),r("readOnly",!1,function(e,t){"nocursor"==t&&(Sn(e),e.display.input.blur()),e.display.input.readOnlyChanged(t)}),r("disableInput",!1,function(e,t){t||e.display.input.reset()},!0),r("dragDrop",!0,xl),r("allowDropFileTypes",null),r("cursorBlinkRate",530),r("cursorScrollMargin",0),r("cursorHeight",1,pn,!0),r("singleCursorHeightPerLine",!0,pn,!0),r("workTime",100),r("workDelay",100),r("flattenSpans",!0,Mi,!0),r("addModeClass",!1,Mi,!0),r("pollInterval",100),r("undoDepth",200,function(e,t){return e.doc.history.undoDepth=t}),r("historyEventDelay",1250),r("viewportMargin",10,function(e){return e.refresh()},!0),r("maxHighlightLength",1e4,Mi,!0),r("moveInputWithCursor",!0,function(e,t){t||e.display.input.resetPosition()}),r("tabindex",null,function(e,t){return e.display.input.getField().tabIndex=t||""}),r("autofocus",null),r("direction","ltr",function(e,t){return e.doc.setDirection(t)},!0),r("phrases",null)}(Sl),function(e){var t=e.optionHandlers,r=e.helpers={};e.prototype={constructor:e,focus:function(){window.focus(),this.display.input.focus()},setOption:function(e,r){var n=this.options,i=n[e];n[e]==r&&"mode"!=e||(n[e]=r,t.hasOwnProperty(e)&&Zn(this,t[e])(this,r,i),ge(this,"optionChange",this,e))},getOption:function(e){return this.options[e]},getDoc:function(){return this.doc},addKeyMap:function(e,t){this.state.keyMaps[t?"push":"unshift"](Xo(e))},removeKeyMap:function(e){for(var t=this.state.keyMaps,r=0;rr&&(kl(this,i.head.line,e,!0),r=i.head.line,n==this.doc.sel.primIndex&&On(this));else{var o=i.from(),l=i.to(),s=Math.max(r,o.line);r=Math.min(this.lastLine(),l.line-(l.ch?0:1))+1;for(var a=s;a0&&Xi(this.doc,n,new bi(o,u[n].to()),V)}}}),getTokenAt:function(e,t){return yt(this,e,t)},getLineTokens:function(e,t){return yt(this,et(e),t,!0)},getTokenTypeAt:function(e){e=st(this.doc,e);var t,r=ft(this,Xe(this.doc,e.line)),n=0,i=(r.length-1)/2,o=e.ch;if(0==o)t=r[2];else for(;;){var l=n+i>>1;if((l?r[2*l-1]:0)>=o)i=l;else{if(!(r[2*l+1]o&&(e=o,i=!0),n=Xe(this.doc,e)}else n=e;return Vr(this,n,{top:0,left:0},t||"page",r||i).top+(i?this.doc.height-Vt(n):0)},defaultTextHeight:function(){return en(this.display)},defaultCharWidth:function(){return tn(this.display)},getViewport:function(){return{from:this.display.viewFrom,to:this.display.viewTo}},addWidget:function(e,t,r,n,i){var o,l,s,a=this.display,u=(e=Xr(this,st(this.doc,e))).bottom,c=e.left;if(t.style.position="absolute",t.setAttribute("cm-ignore-events","true"),this.display.input.setUneditable(t),a.sizer.appendChild(t),"over"==n)u=e.top;else if("above"==n||"near"==n){var h=Math.max(a.wrapper.clientHeight,this.doc.height),f=Math.max(a.sizer.clientWidth,a.lineSpace.clientWidth);("above"==n||e.bottom+t.offsetHeight>h)&&e.top>t.offsetHeight?u=e.top-t.offsetHeight:e.bottom+t.offsetHeight<=h&&(u=e.bottom),c+t.offsetWidth>f&&(c=f-t.offsetWidth)}t.style.top=u+"px",t.style.left=t.style.right="","right"==i?(c=a.sizer.clientWidth-t.offsetWidth,t.style.right="0px"):("left"==i?c=0:"middle"==i&&(c=(a.sizer.clientWidth-t.offsetWidth)/2),t.style.left=c+"px"),r&&(o=this,l={left:c,top:u,right:c+t.offsetWidth,bottom:u+t.offsetHeight},null!=(s=Mn(o,l)).scrollTop&&Hn(o,s.scrollTop),null!=s.scrollLeft&&Pn(o,s.scrollLeft))},triggerOnKeyDown:Qn(ll),triggerOnKeyPress:Qn(al),triggerOnKeyUp:sl,triggerOnMouseDown:Qn(fl),execCommand:function(e){if(Zo.hasOwnProperty(e))return Zo[e].call(null,this)},triggerElectric:Qn(function(e){Al(this,e)}),findPosH:function(e,t,r,n){var i=1;t<0&&(i=-1,t=-t);for(var o=st(this.doc,e),l=0;l0&&l(t.charAt(r-1));)--r;for(;n.5)&&ln(this),ge(this,"refresh",this)}),swapDoc:Qn(function(e){var t=this.doc;return t.cm=null,this.state.selectingText&&this.state.selectingText(),Di(this,e),Rr(this),this.display.input.reset(),An(this,e.scrollLeft,e.scrollTop),this.curOp.forceScroll=!0,sr(this,"swapDoc",this,t),t}),phrase:function(e){var t=this.options.phrases;return t&&Object.prototype.hasOwnProperty.call(t,e)?t[e]:e},getInputField:function(){return this.display.input.getField()},getWrapperElement:function(){return this.display.wrapper},getScrollerElement:function(){return this.display.scroller},getGutterElement:function(){return this.display.gutters}},be(e),e.registerHelper=function(t,n,i){r.hasOwnProperty(t)||(r[t]=e[t]={_global:[]}),r[t][n]=i},e.registerGlobalHelper=function(t,n,i,o){e.registerHelper(t,n,o),r[t]._global.push({pred:i,val:o})}}(Sl);var Ul="iter insert remove copy getEditor constructor".split(" ");for(var Vl in Mo.prototype)Mo.prototype.hasOwnProperty(Vl)&&B(Ul,Vl)<0&&(Sl.prototype[Vl]=function(e){return function(){return e.apply(this.doc,arguments)}}(Mo.prototype[Vl]));return be(Mo),Sl.inputStyles={textarea:Gl,contenteditable:El},Sl.defineMode=function(e){Sl.defaults.mode||"null"==e||(Sl.defaults.mode=e),function(e,t){arguments.length>2&&(t.dependencies=Array.prototype.slice.call(arguments,2)),Ee[e]=t}.apply(this,arguments)},Sl.defineMIME=function(e,t){Ie[e]=t},Sl.defineMode("null",function(){return{token:function(e){return e.skipToEnd()}}}),Sl.defineMIME("text/plain","null"),Sl.defineExtension=function(e,t){Sl.prototype[e]=t},Sl.defineDocExtension=function(e,t){Mo.prototype[e]=t},Sl.fromTextArea=function(e,t){if((t=t?I(t):{}).value=e.value,!t.tabindex&&e.tabIndex&&(t.tabindex=e.tabIndex),!t.placeholder&&e.placeholder&&(t.placeholder=e.placeholder),null==t.autofocus){var r=W();t.autofocus=r==e||null!=e.getAttribute("autofocus")&&r==document.body}function n(){e.value=s.getValue()}var i;if(e.form&&(fe(e.form,"submit",n),!t.leaveSubmitMethodAlone)){var o=e.form;i=o.submit;try{var l=o.submit=function(){n(),o.submit=i,o.submit(),o.submit=l}}catch(e){}}t.finishInit=function(r){r.save=n,r.getTextArea=function(){return e},r.toTextArea=function(){r.toTextArea=isNaN,n(),e.parentNode.removeChild(r.getWrapperElement()),e.style.display="",e.form&&(pe(e.form,"submit",n),t.leaveSubmitMethodAlone||"function"!=typeof e.form.submit||(e.form.submit=i))}},e.style.display="none";var s=Sl(function(t){return e.parentNode.insertBefore(t,e.nextSibling)},t);return s},function(e){e.off=pe,e.on=fe,e.wheelEventPixels=vi,e.Doc=Mo,e.splitLines=We,e.countColumn=z,e.findColumn=X,e.isWordChar=ee,e.Pass=U,e.signal=ge,e.Line=Xt,e.changeEnd=Ci,e.scrollbarModel=Gn,e.Pos=et,e.cmpPos=tt,e.modes=Ee,e.mimeModes=Ie,e.resolveMode=ze,e.getMode=Re,e.modeExtensions=Be,e.extendMode=Ge,e.copyState=Ue,e.startState=Ke,e.innerMode=Ve,e.commands=Zo,e.keyMap=Ro,e.keyName=jo,e.isModifierKey=Vo,e.lookupKey=Uo,e.normalizeKeyMap=Go,e.StringStream=je,e.SharedTextMarker=So,e.TextMarker=xo,e.LineWidget=yo,e.e_preventDefault=we,e.e_stopPropagation=xe,e.e_stop=Se,e.addClass=H,e.contains=D,e.rmClass=T,e.keyNames=Po}(Sl),Sl.version="5.49.2",Sl}); \ No newline at end of file diff --git a/package/ctcgfw/luci-app-adguardhome/root/www/luci-static/resources/codemirror/mode/yaml/yaml.js b/package/ctcgfw/luci-app-adguardhome/root/www/luci-static/resources/codemirror/mode/yaml/yaml.js new file mode 100644 index 0000000000..4a5e499bf6 --- /dev/null +++ b/package/ctcgfw/luci-app-adguardhome/root/www/luci-static/resources/codemirror/mode/yaml/yaml.js @@ -0,0 +1 @@ +!function(e){"object"==typeof exports&&"object"==typeof module?e(require("../../lib/codemirror")):"function"==typeof define&&define.amd?define(["../../lib/codemirror"],e):e(CodeMirror)}(function(e){"use strict";e.defineMode("yaml",function(){var e=new RegExp("\\b(("+["true","false","on","off","yes","no"].join(")|(")+"))$","i");return{token:function(i,t){var r=i.peek(),n=t.escaped;if(t.escaped=!1,"#"==r&&(0==i.pos||/\s/.test(i.string.charAt(i.pos-1))))return i.skipToEnd(),"comment";if(i.match(/^('([^']|\\.)*'?|"([^"]|\\.)*"?)/))return"string";if(t.literal&&i.indentation()>t.keyCol)return i.skipToEnd(),"string";if(t.literal&&(t.literal=!1),i.sol()){if(t.keyCol=0,t.pair=!1,t.pairStart=!1,i.match(/---/))return"def";if(i.match(/\.\.\./))return"def";if(i.match(/\s*-\s+/))return"meta"}if(i.match(/^(\{|\}|\[|\])/))return"{"==r?t.inlinePairs++:"}"==r?t.inlinePairs--:"["==r?t.inlineList++:t.inlineList--,"meta";if(t.inlineList>0&&!n&&","==r)return i.next(),"meta";if(t.inlinePairs>0&&!n&&","==r)return t.keyCol=0,t.pair=!1,t.pairStart=!1,i.next(),"meta";if(t.pairStart){if(i.match(/^\s*(\||\>)\s*/))return t.literal=!0,"meta";if(i.match(/^\s*(\&|\*)[a-z0-9\._-]+\b/i))return"variable-2";if(0==t.inlinePairs&&i.match(/^\s*-?[0-9\.\,]+\s?$/))return"number";if(t.inlinePairs>0&&i.match(/^\s*-?[0-9\.\,]+\s?(?=(,|}))/))return"number";if(i.match(e))return"keyword"}return!t.pair&&i.match(/^\s*(?:[,\[\]{}&*!|>'"%@`][^\s'":]|[^,\[\]{}#&*!|>'"%@`])[^#]*?(?=\s*:($|\s))/)?(t.pair=!0,t.keyCol=i.indentation(),"atom"):t.pair&&i.match(/^:\s*/)?(t.pairStart=!0,"meta"):(t.pairStart=!1,t.escaped="\\"==r,i.next(),null)},startState:function(){return{pair:!1,pairStart:!1,keyCol:0,inlinePairs:0,inlineList:0,literal:!1,escaped:!1}},lineComment:"#",fold:"indent"}}),e.defineMIME("text/x-yaml","yaml"),e.defineMIME("text/yaml","yaml")}); \ No newline at end of file diff --git a/package/ctcgfw/luci-app-adguardhome/root/www/luci-static/resources/codemirror/theme/dracula.css b/package/ctcgfw/luci-app-adguardhome/root/www/luci-static/resources/codemirror/theme/dracula.css new file mode 100644 index 0000000000..6c708c010c --- /dev/null +++ b/package/ctcgfw/luci-app-adguardhome/root/www/luci-static/resources/codemirror/theme/dracula.css @@ -0,0 +1 @@ +.cm-s-dracula.CodeMirror,.cm-s-dracula .CodeMirror-gutters{background-color:#282a36 !important;color:#f8f8f2 !important;border:0}.cm-s-dracula .CodeMirror-gutters{color:#282a36}.cm-s-dracula .CodeMirror-cursor{border-left:solid thin #f8f8f0}.cm-s-dracula .CodeMirror-linenumber{color:#6d8a88}.cm-s-dracula .CodeMirror-selected{background:rgba(255,255,255,0.10)}.cm-s-dracula .CodeMirror-line::selection,.cm-s-dracula .CodeMirror-line>span::selection,.cm-s-dracula .CodeMirror-line>span>span::selection{background:rgba(255,255,255,0.10)}.cm-s-dracula .CodeMirror-line::-moz-selection,.cm-s-dracula .CodeMirror-line>span::-moz-selection,.cm-s-dracula .CodeMirror-line>span>span::-moz-selection{background:rgba(255,255,255,0.10)}.cm-s-dracula span.cm-comment{color:#6272a4}.cm-s-dracula span.cm-string,.cm-s-dracula span.cm-string-2{color:#f1fa8c}.cm-s-dracula span.cm-number{color:#bd93f9}.cm-s-dracula span.cm-variable{color:#50fa7b}.cm-s-dracula span.cm-variable-2{color:white}.cm-s-dracula span.cm-def{color:#50fa7b}.cm-s-dracula span.cm-operator{color:#ff79c6}.cm-s-dracula span.cm-keyword{color:#ff79c6}.cm-s-dracula span.cm-atom{color:#bd93f9}.cm-s-dracula span.cm-meta{color:#f8f8f2}.cm-s-dracula span.cm-tag{color:#ff79c6}.cm-s-dracula span.cm-attribute{color:#50fa7b}.cm-s-dracula span.cm-qualifier{color:#50fa7b}.cm-s-dracula span.cm-property{color:#66d9ef}.cm-s-dracula span.cm-builtin{color:#50fa7b}.cm-s-dracula span.cm-variable-3,.cm-s-dracula span.cm-type{color:#ffb86c}.cm-s-dracula .CodeMirror-activeline-background{background:rgba(255,255,255,0.1)}.cm-s-dracula .CodeMirror-matchingbracket{text-decoration:underline;color:white !important} diff --git a/package/ctcgfw/luci-app-adguardhome/root/www/luci-static/resources/twin-bcrypt.min.js b/package/ctcgfw/luci-app-adguardhome/root/www/luci-static/resources/twin-bcrypt.min.js new file mode 100644 index 0000000000..6284357c60 --- /dev/null +++ b/package/ctcgfw/luci-app-adguardhome/root/www/luci-static/resources/twin-bcrypt.min.js @@ -0,0 +1,7 @@ +/* @license + * Twin-Bcrypt 2.2.0 + * https://github.com/fpirsch/twin-bcrypt + * Licence: BSD-3-Clause + */ +!function(r,n){"use strict";function e(r){return y[g]=t.apply(n,r),g++}function t(r){var e=[].slice.call(arguments,1);return function(){"function"==typeof r?r.apply(n,e):new Function(""+r)()}}function o(r){if(m)setTimeout(t(o,r),0);else{var n=y[r];if(n){m=!0;try{n()}finally{a(r),m=!1}}}}function a(r){delete y[r]}function i(){p=function(){var r=e(arguments);return process.nextTick(t(o,r)),r}}function u(){if(r.postMessage&&!r.importScripts){var n=!0,e=r.onmessage;return r.onmessage=function(){n=!1},r.postMessage("","*"),r.onmessage=e,n}}function f(){var n="setImmediate$"+Math.random()+"$",t=function(e){e.source===r&&"string"==typeof e.data&&0===e.data.indexOf(n)&&o(+e.data.slice(n.length))};r.addEventListener?r.addEventListener("message",t,!1):r.attachEvent("onmessage",t),p=function(){var t=e(arguments);return r.postMessage(n+t,"*"),t}}function c(){var r=new MessageChannel;r.port1.onmessage=function(r){var n=r.data;o(n)},p=function(){var n=e(arguments);return r.port2.postMessage(n),n}}function s(){var r=v.documentElement;p=function(){var n=e(arguments),t=v.createElement("script");return t.onreadystatechange=function(){o(n),t.onreadystatechange=null,r.removeChild(t),t=null},r.appendChild(t),n}}function l(){p=function(){var r=e(arguments);return setTimeout(t(o,r),0),r}}if(!r.setImmediate){var p,g=1,y={},m=!1,v=r.document,d=Object.getPrototypeOf&&Object.getPrototypeOf(r);d=d&&d.setTimeout?d:r,"[object process]"==={}.toString.call(r.process)?i():u()?f():r.MessageChannel?c():v&&"onreadystatechange"in v.createElement("script")?s():l(),d.setImmediate=p,d.clearImmediate=a}}(new Function("return this")()),function(r){"object"==typeof exports?r(exports,require("crypto")):r(self.TwinBcrypt={},self.crypto||self.msCrypto)}(function(r,n){"use strict";function e(r){for(var n=unescape(encodeURIComponent(r)),e=n.length,t=new Array(e),o=0;e>o;o++)t[o]=n.charCodeAt(o);return t}function t(r){for(var n=r.length,e=new Array(n),t=0;n>t;t++)e[t]=r.charCodeAt(t);return e}function o(r,n){for(var e,t,o=0,a="";n>o;){if(e=255&r[o++],a+=B[e>>2],e=(3&e)<<4,o>=n){a+=B[e];break}if(t=255&r[o++],e|=t>>4,a+=B[e],e=(15&t)<<2,o>=n){a+=B[e];break}t=255&r[o++],e|=t>>6,a+=B[e],a+=B[63&t]}return a}function a(r){for(var n,e,t=new Array(16),o=0,a=0;;){if(n=D[r.charCodeAt(o++)-46],e=D[r.charCodeAt(o++)-46],t[a++]=255&(n<<2|e>>4),22===o)break;n=e<<4,e=D[r.charCodeAt(o++)-46],t[a++]=255&(n|e>>2),n=e<<6,e=D[r.charCodeAt(o++)-46],t[a++]=255&(n|e)}return t}function i(r){for(var n=r.length,e=new Array(72),t=0,o=0;72>o;)e[o++]=r[t++],t===n&&(t=0);return e}function u(r,n,e){for(var t=0,o=e>>2;tt;)r[n++]=e[t++]<<24|e[t++]<<16|e[t++]<<8|e[t++]}function c(r){function n(n){for(var e=r,t=G>>2,o=t|O,f=n>>2,c=e[f]^e[t],s=e[1|f];o>t;)s^=(e[c>>>24]+e[a|c>>>16&255]^e[i|c>>>8&255])+e[u|255&c]^e[++t],c^=(e[s>>>24]+e[a|s>>>16&255]^e[i|s>>>8&255])+e[u|255&s]^e[++t];e[f]=s^e[S>>2],e[1|f]=c}function e(n){var e;for(r[L>>2]=0,r[L+4>>2]=0,e=0;M>e;e++)r[G>>2|e]^=r[(n>>2)+e];var t,o,f,c,s,l=r;for(e=0;M>e;e+=2){for(t=G>>2,o=t|O,f=L>>2,c=l[f]^l[t],s=l[1|f];o>t;)s^=(l[c>>>24]+l[a|c>>>16&255]^l[i|c>>>8&255])+l[u|255&c]^l[++t],c^=(l[s>>>24]+l[a|s>>>16&255]^l[i|s>>>8&255])+l[u|255&s]^l[++t];l[f]=s^l[S>>2],l[1|f]=c,r[G>>2|e]=l[f],r[G>>2|e+1]=c}for(e=0;T>e;e+=2){for(t=G>>2,o=t|O,f=L>>2,c=l[f]^l[t],s=l[1|f];o>t;)s^=(l[c>>>24]+l[a|c>>>16&255]^l[i|c>>>8&255])+l[u|255&c]^l[++t],c^=(l[s>>>24]+l[a|s>>>16&255]^l[i|s>>>8&255])+l[u|255&s]^l[++t];l[f]=s^l[S>>2],l[1|f]=c,r[e]=l[f],r[1|e]=c}}function t(r,n,t){for(var o=0;t>=o&&!(r>n);o++)e(R),e(j),r++;return r}var o=k>>2,a=o+256|0,i=a+256|0,u=i+256|0;return{encrypt:n,expandLoop:t}}function s(stdlib, foreign, heap) {"use asm";var HEAP32=new stdlib.Uint32Array(heap);var BLOWFISH_NUM_ROUNDS=16;var S_offset=0x0000;var S1_offset=0x0400;var S2_offset=0x0800;var S3_offset=0x0C00;var P_offset=0x1000;var P_last_offset=0x1044;var crypt_ciphertext_offset=0x1048;var LR_offset=0x01060;var password_offset=0x1068;var salt_offset=0x10b0;var P_LEN=18;var S_LEN=1024;function encrypt(offset) {offset=offset|0;var i=0;var n=0;var L=0;var R=0;var imax=0;imax=P_offset|BLOWFISH_NUM_ROUNDS<<2;L=HEAP32[offset>>2]|0;R=HEAP32[offset+4>>2]|0;L=L^HEAP32[P_offset>>2];for (i=P_offset; (i|0)<(imax|0);) {i=(i+4)>>>0;R=R^(((HEAP32[(L>>>22)>>2]>>>0) +(HEAP32[(S1_offset|(L>>>14&0x3ff))>>2]>>>0) ^(HEAP32[(S2_offset|(L>>>6&0x3ff))>>2])) +(HEAP32[(S3_offset|(L<<2&0x3ff))>>2]>>>0))^HEAP32[i>>2];i=(i+4)>>>0;L=L^(((HEAP32[(R>>>22)>>2]>>>0) +(HEAP32[(S1_offset|(R>>>14&0x3ff))>>2]>>>0) ^(HEAP32[(S2_offset|(R>>>6&0x3ff))>>2])) +(HEAP32[(S3_offset|(R<<2&0x3ff))>>2]>>>0))^HEAP32[i>>2];}HEAP32[offset>>2]=R^HEAP32[P_last_offset>>2];HEAP32[(offset+4)>>2]=L;}function expandKey(offset) {offset=offset|0;var i=0;var off=0;off=P_offset|0;for (i=0; (i|0)<(P_LEN|0); i=(i+1)|0) {HEAP32[off>>2]=HEAP32[off>>2]^HEAP32[offset>>2];offset=(offset+4)|0;off=(off+4)|0;}HEAP32[LR_offset>>2]=0;HEAP32[LR_offset+4>>2]=0;off=P_offset;for (i=0; (i|0)<(P_LEN|0); i=(i+2)|0) {encrypt(LR_offset);HEAP32[off>>2]=HEAP32[LR_offset>>2];HEAP32[off+4>>2]=HEAP32[LR_offset+4>>2];off=(off+8)|0;}off=S_offset;for (i=0; (i|0)<(S_LEN|0); i=(i+2)|0) {encrypt(LR_offset);HEAP32[off>>2]=HEAP32[LR_offset>>2];HEAP32[off+4>>2]=HEAP32[LR_offset+4>>2];off=(off+8)|0;}}function expandLoop(i, counterEnd, maxIterations) {i=i|0;counterEnd=counterEnd|0;maxIterations=maxIterations|0;var j=0;for (j=0; (j|0) <= (maxIterations|0); j=(j+1)|0) {if ((i>>>0)>(counterEnd>>>0)) break;expandKey(password_offset);expandKey(salt_offset);i=(i+1)>>>0;}return i|0;}return {encrypt: encrypt,expandLoop: expandLoop};} +function l(r,n,e,t){var o,a,i,u=L>>2,f=u+1;for(t[u]=0,t[f]=0,a=0,o=0;M>o;o++)i=n[a++]<<24|n[a++]<<16|n[a++]<<8|n[a++],t[G>>2|o]^=i;for(a=0,o=0;M>o;o+=2)i=r[a++]<<24|r[a++]<<16|r[a++]<<8|r[a++],a&=65295,t[u]^=i,i=r[a++]<<24|r[a++]<<16|r[a++]<<8|r[a++],a&=65295,t[f]^=i,e.encrypt(L),t[G>>2|o]=t[u],t[G>>2|o+1]=t[f];var c=k>>2;for(o=0;T>o;o+=2)i=r[a++]<<24|r[a++]<<16|r[a++]<<8|r[a++],a&=65295,t[u]^=i,i=r[a++]<<24|r[a++]<<16|r[a++]<<8|r[a++],a&=65295,t[f]^=i,e.encrypt(L),t[c|o]=t[u],t[c|o+1]=t[f]}function p(r,n,e,t,o,a,i){for(var u=e;t>=u;){if(u=r.expandLoop(u,t,o),a){var f=a(u/(t+1));if(f===!1)return}if(u>t){if(i)return void setImmediate(g.bind(null,r,n,i));return}if(i)return void setImmediate(p.bind(null,r,n,u,t,o,a,i))}}function g(r,n,e){u(n,x,F);var t;for(t=0;64>t;t++)r.encrypt(F+0),r.encrypt(F+8),r.encrypt(F+16);var o,a=0,i=x.length,f=new Array(4*i);for(t=0;i>t;t++)o=n[(F>>2)+t],f[a++]=o>>24,f[a++]=o>>16&255,f[a++]=o>>8&255,f[a++]=255&o;return e&&e(f),f}function y(r,n){return r+o(n,23)}function m(n,o,m,v){var d,h=o.substr(0,29),w=+o.substr(4,2),A=o.substr(7,22);if("string"==typeof n)d=r.encodingMode===r.ENCODING_UTF8?e(n):t(n);else if(Array.isArray(n))d=n.map(function(r){return 255&r});else{if(!(n instanceof Uint8Array))throw new Error("Incorrect arguments");d=Array.prototype.slice.call(n)}d.push(0);var b,E,N=a(A,C),O=31>w?1<>2,N),f(b,R>>2,d),l(N,d,E,b),v?void p(E,b,0,M,T,m,function(r){v(y(h,r))}):(p(E,b,0,M,T,m),y(h,g(E,b)))}function v(r){if(!b)throw new Error("No cryptographically secure pseudorandom number generator available.");if(null==r&&(r=N),r=0|+r,isNaN(r)||4>r||r>31)throw new Error("Invalid cost parameter.");var n="$2y$";return 10>r&&(n+="0"),n+=r+"$",n+=o(b(C),C)}function d(r,n,e){if(n&&"number"!=typeof n){if("string"!=typeof n||!z.test(n))throw new Error("Invalid salt")}else n=v(n);return m(r,n,e)}function h(r,n,e,t){if(arguments.length<2)throw new Error("Incorrect arguments");if(2===arguments.length?(t=n,n=e=null):3===arguments.length&&(t=e,e=null,"function"==typeof n&&(e=n,n=null)),n&&"number"!=typeof n){if("string"!=typeof n||!z.test(n))throw new Error("Invalid salt")}else n=v(n);if(!t||"function"!=typeof t)throw new Error("No callback function was given.");m(r,n,e,t)}function w(r,n){if("string"!=typeof n||!Z.test(n))throw new Error("Incorrect arguments");var e=n.substr(0,n.length-31),t=d(r,e);return t===n}function A(r,n,e,t){if("string"!=typeof n||!Z.test(n))throw new Error("Incorrect arguments");if(t||(t=e,e=null),!t||"function"!=typeof t)throw new Error("No callback function was given.");var o=n.substr(0,n.length-31);h(r,o,e,function(r){t(r===n)})}var b,E="undefined"!=typeof InstallTrigger,I=E;n&&(b=n.randomBytes,n.getRandomValues&&(b=function(r){var e=new Uint8Array(r);return n.getRandomValues(e)}));var C=16,N=10,O=16,$=[608135816,2242054355,320440878,57701188,2752067618,698298832,137296536,3964562569,1160258022,953160567,3193202383,887688300,3232508343,3380367581,1065670069,3041331479,2450970073,2306472731],U=[3509652390,2564797868,805139163,3491422135,3101798381,1780907670,3128725573,4046225305,614570311,3012652279,134345442,2240740374,1667834072,1901547113,2757295779,4103290238,227898511,1921955416,1904987480,2182433518,2069144605,3260701109,2620446009,720527379,3318853667,677414384,3393288472,3101374703,2390351024,1614419982,1822297739,2954791486,3608508353,3174124327,2024746970,1432378464,3864339955,2857741204,1464375394,1676153920,1439316330,715854006,3033291828,289532110,2706671279,2087905683,3018724369,1668267050,732546397,1947742710,3462151702,2609353502,2950085171,1814351708,2050118529,680887927,999245976,1800124847,3300911131,1713906067,1641548236,4213287313,1216130144,1575780402,4018429277,3917837745,3693486850,3949271944,596196993,3549867205,258830323,2213823033,772490370,2760122372,1774776394,2652871518,566650946,4142492826,1728879713,2882767088,1783734482,3629395816,2517608232,2874225571,1861159788,326777828,3124490320,2130389656,2716951837,967770486,1724537150,2185432712,2364442137,1164943284,2105845187,998989502,3765401048,2244026483,1075463327,1455516326,1322494562,910128902,469688178,1117454909,936433444,3490320968,3675253459,1240580251,122909385,2157517691,634681816,4142456567,3825094682,3061402683,2540495037,79693498,3249098678,1084186820,1583128258,426386531,1761308591,1047286709,322548459,995290223,1845252383,2603652396,3431023940,2942221577,3202600964,3727903485,1712269319,422464435,3234572375,1170764815,3523960633,3117677531,1434042557,442511882,3600875718,1076654713,1738483198,4213154764,2393238008,3677496056,1014306527,4251020053,793779912,2902807211,842905082,4246964064,1395751752,1040244610,2656851899,3396308128,445077038,3742853595,3577915638,679411651,2892444358,2354009459,1767581616,3150600392,3791627101,3102740896,284835224,4246832056,1258075500,768725851,2589189241,3069724005,3532540348,1274779536,3789419226,2764799539,1660621633,3471099624,4011903706,913787905,3497959166,737222580,2514213453,2928710040,3937242737,1804850592,3499020752,2949064160,2386320175,2390070455,2415321851,4061277028,2290661394,2416832540,1336762016,1754252060,3520065937,3014181293,791618072,3188594551,3933548030,2332172193,3852520463,3043980520,413987798,3465142937,3030929376,4245938359,2093235073,3534596313,375366246,2157278981,2479649556,555357303,3870105701,2008414854,3344188149,4221384143,3956125452,2067696032,3594591187,2921233993,2428461,544322398,577241275,1471733935,610547355,4027169054,1432588573,1507829418,2025931657,3646575487,545086370,48609733,2200306550,1653985193,298326376,1316178497,3007786442,2064951626,458293330,2589141269,3591329599,3164325604,727753846,2179363840,146436021,1461446943,4069977195,705550613,3059967265,3887724982,4281599278,3313849956,1404054877,2845806497,146425753,1854211946,1266315497,3048417604,3681880366,3289982499,290971e4,1235738493,2632868024,2414719590,3970600049,1771706367,1449415276,3266420449,422970021,1963543593,2690192192,3826793022,1062508698,1531092325,1804592342,2583117782,2714934279,4024971509,1294809318,4028980673,1289560198,2221992742,1669523910,35572830,157838143,1052438473,1016535060,1802137761,1753167236,1386275462,3080475397,2857371447,1040679964,2145300060,2390574316,1461121720,2956646967,4031777805,4028374788,33600511,2920084762,1018524850,629373528,3691585981,3515945977,2091462646,2486323059,586499841,988145025,935516892,3367335476,2599673255,2839830854,265290510,3972581182,2759138881,3795373465,1005194799,847297441,406762289,1314163512,1332590856,1866599683,4127851711,750260880,613907577,1450815602,3165620655,3734664991,3650291728,3012275730,3704569646,1427272223,778793252,1343938022,2676280711,2052605720,1946737175,3164576444,3914038668,3967478842,3682934266,1661551462,3294938066,4011595847,840292616,3712170807,616741398,312560963,711312465,1351876610,322626781,1910503582,271666773,2175563734,1594956187,70604529,3617834859,1007753275,1495573769,4069517037,2549218298,2663038764,504708206,2263041392,3941167025,2249088522,1514023603,1998579484,1312622330,694541497,2582060303,2151582166,1382467621,776784248,2618340202,3323268794,2497899128,2784771155,503983604,4076293799,907881277,423175695,432175456,1378068232,4145222326,3954048622,3938656102,3820766613,2793130115,2977904593,26017576,3274890735,3194772133,1700274565,1756076034,4006520079,3677328699,720338349,1533947780,354530856,688349552,3973924725,1637815568,332179504,3949051286,53804574,2852348879,3044236432,1282449977,3583942155,3416972820,4006381244,1617046695,2628476075,3002303598,1686838959,431878346,2686675385,1700445008,1080580658,1009431731,832498133,3223435511,2605976345,2271191193,2516031870,1648197032,4164389018,2548247927,300782431,375919233,238389289,3353747414,2531188641,2019080857,1475708069,455242339,2609103871,448939670,3451063019,1395535956,2413381860,1841049896,1491858159,885456874,4264095073,4001119347,1565136089,3898914787,1108368660,540939232,1173283510,2745871338,3681308437,4207628240,3343053890,4016749493,1699691293,1103962373,3625875870,2256883143,3830138730,1031889488,3479347698,1535977030,4236805024,3251091107,2132092099,1774941330,1199868427,1452454533,157007616,2904115357,342012276,595725824,1480756522,206960106,497939518,591360097,863170706,2375253569,3596610801,1814182875,2094937945,3421402208,1082520231,3463918190,2785509508,435703966,3908032597,1641649973,2842273706,3305899714,1510255612,2148256476,2655287854,3276092548,4258621189,236887753,3681803219,274041037,1734335097,3815195456,3317970021,1899903192,1026095262,4050517792,356393447,2410691914,3873677099,3682840055,3913112168,2491498743,4132185628,2489919796,1091903735,1979897079,3170134830,3567386728,3557303409,857797738,1136121015,1342202287,507115054,2535736646,337727348,3213592640,1301675037,2528481711,1895095763,1721773893,3216771564,62756741,2142006736,835421444,2531993523,1442658625,3659876326,2882144922,676362277,1392781812,170690266,3921047035,1759253602,3611846912,1745797284,664899054,1329594018,3901205900,3045908486,2062866102,2865634940,3543621612,3464012697,1080764994,553557557,3656615353,3996768171,991055499,499776247,1265440854,648242737,3940784050,980351604,3713745714,1749149687,3396870395,4211799374,3640570775,1161844396,3125318951,1431517754,545492359,4268468663,3499529547,1437099964,2702547544,3433638243,2581715763,2787789398,1060185593,1593081372,2418618748,4260947970,69676912,2159744348,86519011,2512459080,3838209314,1220612927,3339683548,133810670,1090789135,1078426020,1569222167,845107691,3583754449,4072456591,1091646820,628848692,1613405280,3757631651,526609435,236106946,48312990,2942717905,3402727701,1797494240,859738849,992217954,4005476642,2243076622,3870952857,3732016268,765654824,3490871365,2511836413,1685915746,3888969200,1414112111,2273134842,3281911079,4080962846,172450625,2569994100,980381355,4109958455,2819808352,2716589560,2568741196,3681446669,3329971472,1835478071,660984891,3704678404,4045999559,3422617507,3040415634,1762651403,1719377915,3470491036,2693910283,3642056355,3138596744,1364962596,2073328063,1983633131,926494387,3423689081,2150032023,4096667949,1749200295,3328846651,309677260,2016342300,1779581495,3079819751,111262694,1274766160,443224088,298511866,1025883608,3806446537,1145181785,168956806,3641502830,3584813610,1689216846,3666258015,3200248200,1692713982,2646376535,4042768518,1618508792,1610833997,3523052358,4130873264,2001055236,3610705100,2202168115,4028541809,2961195399,1006657119,2006996926,3186142756,1430667929,3210227297,1314452623,4074634658,4101304120,2273951170,1399257539,3367210612,3027628629,1190975929,2062231137,2333990788,2221543033,2438960610,1181637006,548689776,2362791313,3372408396,3104550113,3145860560,296247880,1970579870,3078560182,3769228297,1714227617,3291629107,3898220290,166772364,1251581989,493813264,448347421,195405023,2709975567,677966185,3703036547,1463355134,2715995803,1338867538,1343315457,2802222074,2684532164,233230375,2599980071,2000651841,3277868038,1638401717,4028070440,3237316320,6314154,819756386,300326615,590932579,1405279636,3267499572,3150704214,2428286686,3959192993,3461946742,1862657033,1266418056,963775037,2089974820,2263052895,1917689273,448879540,3550394620,3981727096,150775221,3627908307,1303187396,508620638,2975983352,2726630617,1817252668,1876281319,1457606340,908771278,3720792119,3617206836,2455994898,1729034894,1080033504,976866871,3556439503,2881648439,1522871579,1555064734,1336096578,3548522304,2579274686,3574697629,3205460757,3593280638,3338716283,3079412587,564236357,2993598910,1781952180,1464380207,3163844217,3332601554,1699332808,1393555694,1183702653,3581086237,1288719814,691649499,2847557200,2895455976,3193889540,2717570544,1781354906,1676643554,2592534050,3230253752,1126444790,2770207658,2633158820,2210423226,2615765581,2414155088,3127139286,673620729,2805611233,1269405062,4015350505,3341807571,4149409754,1057255273,2012875353,2162469141,2276492801,2601117357,993977747,3918593370,2654263191,753973209,36408145,2530585658,25011837,3520020182,2088578344,530523599,2918365339,1524020338,1518925132,3760827505,3759777254,1202760957,3985898139,3906192525,674977740,4174734889,2031300136,2019492241,3983892565,4153806404,3822280332,352677332,2297720250,60907813,90501309,3286998549,1016092578,2535922412,2839152426,457141659,509813237,4120667899,652014361,1966332200,2975202805,55981186,2327461051,676427537,3255491064,2882294119,3433927263,1307055953,942726286,933058658,2468411793,3933900994,4215176142,1361170020,2001714738,2830558078,3274259782,1222529897,1679025792,2729314320,3714953764,1770335741,151462246,3013232138,1682292957,1483529935,471910574,1539241949,458788160,3436315007,1807016891,3718408830,978976581,1043663428,3165965781,1927990952,4200891579,2372276910,3208408903,3533431907,1412390302,2931980059,4132332400,1947078029,3881505623,4168226417,2941484381,1077988104,1320477388,886195818,18198404,3786409e3,2509781533,112762804,3463356488,1866414978,891333506,18488651,661792760,1628790961,3885187036,3141171499,876946877,2693282273,1372485963,791857591,2686433993,3759982718,3167212022,3472953795,2716379847,445679433,3561995674,3504004811,3574258232,54117162,3331405415,2381918588,3769707343,4154350007,1140177722,4074052095,668550556,3214352940,367459370,261225585,2610173221,4209349473,3468074219,3265815641,314222801,3066103646,3808782860,282218597,3406013506,3773591054,379116347,1285071038,846784868,2669647154,3771962079,3550491691,2305946142,453669953,1268987020,3317592352,3279303384,3744833421,2610507566,3859509063,266596637,3847019092,517658769,3462560207,3443424879,370717030,4247526661,2224018117,4143653529,4112773975,2788324899,2477274417,1456262402,2901442914,1517677493,1846949527,2295493580,3734397586,2176403920,1280348187,1908823572,3871786941,846861322,1172426758,3287448474,3383383037,1655181056,3139813346,901632758,1897031941,2986607138,3066810236,3447102507,1393639104,373351379,950779232,625454576,3124240540,4148612726,2007998917,544563296,2244738638,2330496472,2058025392,1291430526,424198748,50039436,29584100,3605783033,2429876329,2791104160,1057563949,3255363231,3075367218,3463963227,1469046755,985887462],M=$.length,T=U.length,x=[1332899944,1700884034,1701343084,1684370003,1668446532,1869963892],k=0,G=4096,S=4164,F=4168,L=4192,R=4200,j=4272,B="./ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789",D=[0,1,54,55,56,57,58,59,60,61,62,63,-1,-1,-1,-1,-1,-1,-1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,-1,-1,-1,-1,-1,-1,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,-1,-1,-1,-1,-1],z=/^\$2[ay]\$(0[4-9]|[12][0-9]|3[01])\$[.\/A-Za-z0-9]{21}[.Oeu]/,Z=/^\$2[ay]\$(0[4-9]|[12][0-9]|3[01])\$[.\/A-Za-z0-9]{21}[.Oeu][.\/A-Za-z0-9]{30}[.CGKOSWaeimquy26]$/;r.genSalt=v,r.hashSync=d,r.hash=h,r.compareSync=w,r.compare=A,r.ENCODING_UTF8=0,r.ENCODING_RAW=1,r.encodingMode=r.ENCODING_UTF8,r.cryptoRNG=!!b,r.randomBytes=b,r.defaultCost=N,r.version="2.2.0"}); \ No newline at end of file diff --git a/package/ctcgfw/luci-app-airwhu/Makefile b/package/ctcgfw/luci-app-airwhu/Makefile new file mode 100644 index 0000000000..1b98b587d5 --- /dev/null +++ b/package/ctcgfw/luci-app-airwhu/Makefile @@ -0,0 +1,51 @@ +include $(TOPDIR)/rules.mk + +PKG_NAME:=luci-app-airwhu +PKG_VERSION=1.0 +PKG_RELEASE:=1 + +PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME) + +include $(INCLUDE_DIR)/package.mk + +define Package/luci-app-airwhu + SECTION:=luci + CATEGORY:=LuCI + SUBMENU:=3. Applications + DEPENDS:=+mentohust +kmod-ipt-nat6 + TITLE:=luci-app-airwhu + PKGARCH:=all +endef + +define Package/luci-app-airwhu/description + LuCI web-interface for Ruijie 802.1X Client with IPv6 NAT. +endef + +define Build/Prepare + mkdir -p $(PKG_BUILD_DIR) + $(CP) ./* $(PKG_BUILD_DIR)/ + po2lmo $(PKG_BUILD_DIR)/po/airwhu.zh-cn.po $(PKG_BUILD_DIR)/po/airwhu.zh-cn.lmo +endef + +define Build/Compile +endef + +define Package/luci-app-airwhu/install + $(INSTALL_DIR) $(1)/etc/config + $(INSTALL_DIR) $(1)/etc/init.d + $(INSTALL_DIR) $(1)/etc/hotplug.d/iface + $(INSTALL_DIR) $(1)/bin + $(INSTALL_DIR) $(1)/usr/lib/lua/luci/model/cbi + $(INSTALL_DIR) $(1)/usr/lib/lua/luci/controller + $(INSTALL_DIR) $(1)/usr/lib/lua/luci/i18n + + $(INSTALL_CONF) ./files/root/etc/config/airwhu $(1)/etc/config/airwhu + $(INSTALL_BIN) ./files/root/etc/init.d/mentohust $(1)/etc/init.d/mentohust + $(INSTALL_BIN) ./files/root/etc/hotplug.d/iface/99-ipv6nat $(1)/etc/hotplug.d/iface/99-ipv6nat + $(INSTALL_BIN) ./files/root/bin/ipv6masq.sh $(1)/bin/ipv6masq.sh + $(INSTALL_DATA) ./files/root/usr/lib/lua/luci/model/cbi/airwhu.lua $(1)/usr/lib/lua/luci/model/cbi/airwhu.lua + $(INSTALL_DATA) ./files/root/usr/lib/lua/luci/controller/airwhu.lua $(1)/usr/lib/lua/luci/controller/airwhu.lua + $(INSTALL_DATA) $(PKG_BUILD_DIR)/po/airwhu.zh-cn.lmo $(1)/usr/lib/lua/luci/i18n/airwhu.zh-cn.lmo +endef + +$(eval $(call BuildPackage,luci-app-airwhu)) diff --git a/package/ctcgfw/luci-app-airwhu/files/root/bin/ipv6masq.sh b/package/ctcgfw/luci-app-airwhu/files/root/bin/ipv6masq.sh new file mode 100755 index 0000000000..c04bb7c716 --- /dev/null +++ b/package/ctcgfw/luci-app-airwhu/files/root/bin/ipv6masq.sh @@ -0,0 +1,41 @@ +#!/bin/sh /etc/rc.common +#Author:KyleRicardo +#Email:shaoyz714@126.com + +action=$1 + +if [ "$action"x = "install"x ]; then + uci delete network.globals.ula_prefix + + uci set network.wan6.peerdns='0' + uci set network.wan6.dns='2001:da8:202:10::36' + + uci delete network.lan.ip6assign + uci set network.lan.ip6addr='BABE:BABE:BABE:BABE::1/64' + uci set network.lan.ip6prefix='BABE:BABE:BABE:BABE::/64' + + uci set dhcp.lan.ra_management='1' + uci set dhcp.lan.ra_default='1' + + uci set $(uci show firewall|grep Allow-ICMPv6-Forward|sed -e 's/.name[^ ]*'//).enabled='0' + + uci commit + + +elif [ "$action"x = "uninstall"x ]; then + uci set network.globals.ula_prefix='fdad:91b7:54bb::/48' + + uci delete network.wan6.peerdns='0' + uci delete network.wan6.dns='2001:da8:202:10::36' + + uci set network.lan.ip6assign='60' + uci delete network.lan.ip6addr='BABE:BABE:BABE:BABE::1/64' + uci delete network.lan.ip6prefix='BABE:BABE:BABE:BABE::/64' + + uci delete dhcp.lan.ra_management='1' + uci delete dhcp.lan.ra_default='1' + + uci delete $(uci show firewall|grep Allow-ICMPv6-Forward|sed -e 's/.name[^ ]*'//).enabled + + uci commit +fi diff --git a/package/ctcgfw/luci-app-airwhu/files/root/etc/config/airwhu b/package/ctcgfw/luci-app-airwhu/files/root/etc/config/airwhu new file mode 100644 index 0000000000..734dc8539a --- /dev/null +++ b/package/ctcgfw/luci-app-airwhu/files/root/etc/config/airwhu @@ -0,0 +1,25 @@ + +config switch + option enableauth + option startwithboot + option enableipv6 +config auth + option Username + option Password + option ifname + option IP + option Mask + option Gateway + option DNS + option PingHost + option Timeout + option EchoInterval + option RestartWait + option MaxFail + option StartMode + option DHCPMode + option DaemonMode + option ShowNotify + option Version + option DataFile + option DHCPScript diff --git a/package/ctcgfw/luci-app-airwhu/files/root/etc/hotplug.d/iface/99-ipv6nat b/package/ctcgfw/luci-app-airwhu/files/root/etc/hotplug.d/iface/99-ipv6nat new file mode 100755 index 0000000000..2d7230b37b --- /dev/null +++ b/package/ctcgfw/luci-app-airwhu/files/root/etc/hotplug.d/iface/99-ipv6nat @@ -0,0 +1,56 @@ +#!/bin/sh /etc/rc.common +#Author:KyleRicardo +#Email:shaoyz714@126.com + + +[ "$ACTION" = ifup ] || exit 0 +iface=wan6 +[ -z "$iface" -o "$INTERFACE" = "$iface" ] || exit 0 +ip -6 route add `ip -6 route show default|sed -e 's/from [^ ]* //'` +logger -t IPv6 "Add IPv6 default route." + +MAX_TRIES=99 + +WAN6_NAME="wan6" + +WAN6_INTERFACE=$(uci get "network.$WAN6_NAME.ifname") +#eth0.2 by default + +LAN_IP6PREFIX=$(uci get network.lan.ip6prefix) +#e.g. aaaa:bbbb:cccc:dddd::/64 + +#LAN_ULA_PREFIX=$(uci get network.globals.ula_prefix) +#e.g. ddc2:d512:65f5::/48 + +PROBE=0 + +COUNT=1 + +while [ $PROBE -eq 0 ] +do +if [ $COUNT -gt $MAX_TRIES ] +then +logger -t NAT6 "No IPv6 route found (reached retry limit $MAX_TRIES times)" && exit 1 +fi +sleep 5 +logger -t NAT6 "Probing IPv6 route ($COUNT time)" +COUNT=$((COUNT+1)) +PROBE=$(route -A inet6 | grep -c '::/0') +done + +#ip6tables -t nat -I POSTROUTING -s "$LAN_ULA_PREFIX" -o "$WAN6_INTERFACE" -j MASQUERADE +ip6tables -t nat -I POSTROUTING -s "$LAN_IP6PREFIX" -o "$WAN6_INTERFACE" -j MASQUERADE + +#WAN6_GATEWAY=$(route -A inet6 -e | grep "$WAN6_INTERFACE" | awk '/::\/0/{print $2; exit}') +#get gateway from routing table. !!!Caution!!! May not work ! +WAN6_GATEWAY=$(ifconfig eth0.2 | grep 'Global' | awk '{print $3}'| awk -F':' '{print $1":"$2":"$3":"$4"::1"}') +#caculate gateway from wan ipv6 +#WAN6_GATEWAY=$(tracepath6 -n tv.byr.cn | grep ' 1: ' | awk 'NR==1 {print $2}') +#opkg install iputils-tracepath6 . change tv.byr.cn for faster site. e.g. ipv6.bjtu.edu.cn + +#route -A inet6 add 2000::/3 gw "$WAN6_GATEWAY" dev "$WAN6_INTERFACE" +route -A inet6 add default gw "$WAN6_GATEWAY" dev "$WAN6_INTERFACE" + +logger -t NAT6 "Done with IPv6 settings" + + diff --git a/package/ctcgfw/luci-app-airwhu/files/root/etc/init.d/mentohust b/package/ctcgfw/luci-app-airwhu/files/root/etc/init.d/mentohust new file mode 100755 index 0000000000..cf622808ee --- /dev/null +++ b/package/ctcgfw/luci-app-airwhu/files/root/etc/init.d/mentohust @@ -0,0 +1,49 @@ +#!/bin/sh /etc/rc.common +#Author:KyleRicardo +#Email:shaoyz714@126.com + +START=65 +STOP=10 + +start() +{ +if [ $(uci get airwhu.@switch[0].enableauth) ] ; +then + local Username=$(uci get airwhu.@auth[0].Username) + local Password=$(uci get airwhu.@auth[0].Password) + local ifname=$(uci get airwhu.@auth[0].ifname) + local IP=$(uci get airwhu.@auth[0].IP) + local Mask=$(uci get airwhu.@auth[0].Mask) + local Gateway=$(uci get airwhu.@auth[0].Gateway) + local DNS=$(uci get airwhu.@auth[0].DNS) + local PingHost=$(uci get airwhu.@auth[0].PingHost) + local Timeout=$(uci get airwhu.@auth[0].Timeout) + local EchoInterval=$(uci get airwhu.@auth[0].EchoInterval) + local RestartWait=$(uci get airwhu.@auth[0].RestartWait) + local MaxFail=$(uci get airwhu.@auth[0].MaxFail) + local StartMode=$(uci get airwhu.@auth[0].StartMode) + local DHCPMode=$(uci get airwhu.@auth[0].DHCPMode) + local DaemonMode=$(uci get airwhu.@auth[0].DaemonMode) + local ShowNotify=$(uci get airwhu.@auth[0].ShowNotify) + local Version=$(uci get airwhu.@auth[0].Version) + local DataFile=$(uci get airwhu.@auth[0].DataFile) + local DHCPScript=$(uci get airwhu.@auth[0].DHCPScript) + mentohust -u$Username -p$Password -n$ifname -b$DaemonMode -a$StartMode -d$DaemonMode -c"$DHCPScript" -w>/dev/null 2>&1 + #Temporarily designed only for whu. To be continued... +else + stop +fi + +} + +stop() +{ + sync + mentohust -k >/dev/null 2>&1 +} + +restart() +{ + stop + start +} diff --git a/package/ctcgfw/luci-app-airwhu/files/root/usr/lib/lua/luci/controller/airwhu.lua b/package/ctcgfw/luci-app-airwhu/files/root/usr/lib/lua/luci/controller/airwhu.lua new file mode 100644 index 0000000000..15d9239680 --- /dev/null +++ b/package/ctcgfw/luci-app-airwhu/files/root/usr/lib/lua/luci/controller/airwhu.lua @@ -0,0 +1,5 @@ +module("luci.controller.airwhu", package.seeall) + +function index() + entry({"admin", "services", "AirWHU"}, cbi("airwhu"), _("AirWHU"), 100) + end diff --git a/package/ctcgfw/luci-app-airwhu/files/root/usr/lib/lua/luci/model/cbi/airwhu.lua b/package/ctcgfw/luci-app-airwhu/files/root/usr/lib/lua/luci/model/cbi/airwhu.lua new file mode 100644 index 0000000000..d3cdbde505 --- /dev/null +++ b/package/ctcgfw/luci-app-airwhu/files/root/usr/lib/lua/luci/model/cbi/airwhu.lua @@ -0,0 +1,115 @@ +--[[ + +LuCI - Lua Configuration Interface +LICENSE under GPLv3. +Copyright 2017 KyleRicardo[W.B.L.E. TeAm] + +]] +-- +require("luci.sys") +require("luci.tools.webadmin") + +local IsOnAir = (luci.sys.call("pidof mentohust > /dev/null") == 0) +if IsOnAir then + state_msg = "" .. translate("Running") .. "" +else + state_msg = "" .. translate("Not Running") .. "" +end + +m = Map("airwhu", translate("AirWHU"), translate("Configure Ruijie 802.1X client with IPv6 NAT based on Masquerade.") .. "

" .. translate("Status") .. " : " .. state_msg) + +s = m:section(TypedSection, "switch", translate("Global Switch"), translate("Configure global 802.1X Authentication and IPv6-NAT on-off.")) +s.addremove = false +s.anonymous = true + +s:option(Flag, "enableauth", translate("Enable 802.1X Auth"), translate("Enable or disable Ruijie 802.1X authentication.")) +tmp = s:option(Flag, "startwithboot", translate("Start with boot"), translate("Start Ruijie 802.1X Authentication based on MentoHUST when the router is booting.")) +tmp:depends("enableauth","1") +s:option(Flag, "enableipv6", translate("Enable IPv6 NAT"), translate("Enable IPv6 NAT pass-through based on ip6tables MASQUERADE.")) + +s = m:section(TypedSection, "auth", translate("Config Authentication"), translate("The options below are all of MentoHUST's arguments.")) +s.anonymous = true +s.addremove = false + +ur = s:option(Value, "Username", translate("Username")) +ur.rmempty = false + +pw = s:option(Value, "Password", translate("Password")) +pw.password = true +pw.rmempty = false + +wan_dev = luci.sys.exec("uci get network.wan.ifname") +wan_dev = string.sub(wan_dev,1,string.len(wan_dev)-1) +ifname = s:option(ListValue, "ifname", translate("Interfaces")) +ifname:value(wan_dev) + +s:option(Value, "IP", translate("IP"), translate("default to localhost's IP")).default = "0.0.0.0" + +s:option(Value, "Mask", translate("Netmask"), translate("default to localhost's netmask")).default = "255.255.255.0" + +s:option(Value, "Gateway", translate("Gateway"), translate("default to 0.0.0.0")).default = "0.0.0.0" + +s:option(Value, "DNS", translate("DNS"), translate("default to 0.0.0.0")).default = "0.0.0.0" + +s:option(Value, "PingHost", translate("Ping host"), translate("default to 0.0.0.0,i.e. disable this function")).default = "0.0.0.0" + +s:option(Value, "Timeout", translate("Authenticate timeout(s)"), translate("default to 8s")).default = "8" + +s:option(Value, "EchoInterval", translate("Heartbeat timeout(s)"), translate("default to 30s")).default = "30" + +s:option(Value, "RestartWait", translate("Timeout on failure(s)"), translate("default to 15s")).default = "15" + +s:option(Value, "MaxFail", translate("Max failure times"), translate("0 means no limit,default to 8")).default = "8" + +t = s:option(ListValue, "StartMode", translate("mulcast address"), translate("default to 1")) +t:value("0", translate("0(standard)")) +t:value("1", translate("1(ruijjie)")) +t:value("2", translate("2(saier)")) +t.default = "1" + +t = s:option(ListValue, "DHCPMode", translate("DHCP type"), translate("default to 1")) +t:value("0", translate("0(not in used)")) +t:value("1", translate("1(secondary authenticate)")) +t:value("2", translate("2(post authenticate)")) +t:value("3", translate("3(pre authenticate)")) +t.default = "1" + +t = s:option(ListValue, "DaemonMode", translate("run in daemon mode"), translate("default to 3")) +t:value("0", translate("0(no)")) +t:value("1", translate("1(yes,turn off output)")) +t:value("2", translate("2(yes,persevere output)")) +t:value("3", translate("3(yes,output to file)")) +t.default = "3" + +s:option(Value, "ShowNotify", translate("display notification"), translate("0(no),1-20(yes),default to 0")).default = "0" + +s:option(Value, "Version", translate("client version"), translate("default to 0.00,compatible with xrgsu")).default = "0.00" + +tmp = s:option(Value, "DataFile", translate("customized data file"), translate("not in used by default")) +tmp.rmempty = true + +script = s:option(Value, "DHCPScript", translate("DHCP script"), translate("use dhclient by default")) +script.default = "udhcpc -i "..wan_dev + +local apply = luci.http.formvalue("cbi.apply") +if apply then + if luci.sys.exec("uci get airwhu.@switch[0].enableauth") then + luci.sys.exec("/etc/init.d/mentohust restart") + else + luci.sys.exec("/etc/init.d/mentohust stop") + end + + if luci.sys.exec("uci get airwhu.@switch[0].startwithboot") then + luci.sys.exec("/etc/init.d/mentohust enable") + else + luci.sys.exec("/etc/init.d/mentohust disable") + end + + if luci.sys.exec("uci get airwhu.@switch[0].enableipv6") then + luci.sys.exec("sh /bin/ipv6masq.sh install") + else + luci.sys.exec("sh /bin/ipv6masq.sh uninstall") + end +end + +return m diff --git a/package/ctcgfw/luci-app-airwhu/po/airwhu.zh-cn.po b/package/ctcgfw/luci-app-airwhu/po/airwhu.zh-cn.po new file mode 100644 index 0000000000..8cc68762cc --- /dev/null +++ b/package/ctcgfw/luci-app-airwhu/po/airwhu.zh-cn.po @@ -0,0 +1,258 @@ +msgid "" +msgstr "" +"Project-Id-Version: airwhu\n" +"POT-Creation-Date: 2017-05-11 19:39+0800\n" +"PO-Revision-Date: 2017-05-11 19:40+0800\n" +"Last-Translator: KyleRicardo \n" +"Language-Team: [W.B.L.E. TeAm] \n" +"Language: en_US\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Poedit 1.8.8\n" +"X-Poedit-Basepath: ../files\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"X-Poedit-SourceCharset: UTF-8\n" +"X-Poedit-KeywordsList: translate\n" +"X-Poedit-SearchPath-0: .\n" + +#: root/usr/lib/lua/luci/controller/airwhu.lua:4 +#: root/usr/lib/lua/luci/model/cbi/airwhu.lua:19 +msgid "AirWHU" +msgstr "AirWHU" + +#: root/usr/lib/lua/luci/model/cbi/airwhu.lua:14 +msgid "Running" +msgstr "运行中" + +#: root/usr/lib/lua/luci/model/cbi/airwhu.lua:16 +msgid "Not Running" +msgstr "未运行" + +#: root/usr/lib/lua/luci/model/cbi/airwhu.lua:19 +msgid "Configure Ruijie 802.1X client with IPv6 NAT based on Masquerade." +msgstr "配置基于IPv6 Masquerade技术的锐捷802.1X认证网络。" + +#: root/usr/lib/lua/luci/model/cbi/airwhu.lua:19 +msgid "Status" +msgstr "状态" + +#: root/usr/lib/lua/luci/model/cbi/airwhu.lua:21 +msgid "Global Switch" +msgstr "全局开关" + +#: root/usr/lib/lua/luci/model/cbi/airwhu.lua:21 +msgid "Configure global 802.1X Authentication and IPv6-NAT on-off." +msgstr "配置全局802.1X认证与IPv6 NAT开关。" + +#: root/usr/lib/lua/luci/model/cbi/airwhu.lua:25 +msgid "Enable 802.1X Auth" +msgstr "开启锐捷认证" + +#: root/usr/lib/lua/luci/model/cbi/airwhu.lua:25 +msgid "Enable or disable Ruijie 802.1X authentication." +msgstr "打开或关闭锐捷802.1X认证。" + +#: root/usr/lib/lua/luci/model/cbi/airwhu.lua:26 +msgid "Start with boot" +msgstr "开机启动" + +#: root/usr/lib/lua/luci/model/cbi/airwhu.lua:26 +msgid "" +"Start Ruijie 802.1X Authentication based on MentoHUST when the router is " +"booting." +msgstr "开机自动启动基于MentoHUST的锐捷802.1X认证客户端。" + +#: root/usr/lib/lua/luci/model/cbi/airwhu.lua:28 +msgid "Enable IPv6 NAT" +msgstr "开启IPv6 NAT" + +#: root/usr/lib/lua/luci/model/cbi/airwhu.lua:28 +msgid "Enable IPv6 NAT pass-through based on ip6tables MASQUERADE." +msgstr "开启基于ip6tables Masquerade技术的IPv6 NAT穿透。" + +#: root/usr/lib/lua/luci/model/cbi/airwhu.lua:30 +msgid "Config Authentication" +msgstr "配置认证参数" + +#: root/usr/lib/lua/luci/model/cbi/airwhu.lua:30 +msgid "The options below are all of MentoHUST's arguments." +msgstr "以下是全部的MentoHUST认证参数。" + +#: root/usr/lib/lua/luci/model/cbi/airwhu.lua:34 +msgid "Username" +msgstr "用户名" + +#: root/usr/lib/lua/luci/model/cbi/airwhu.lua:36 +msgid "Password" +msgstr "密码" + +#: root/usr/lib/lua/luci/model/cbi/airwhu.lua:41 +msgid "Interfaces" +msgstr "网卡" + +#: root/usr/lib/lua/luci/model/cbi/airwhu.lua:51 +msgid "IP" +msgstr "IP地址" + +#: root/usr/lib/lua/luci/model/cbi/airwhu.lua:51 +msgid "default to localhost's IP" +msgstr "默认为localhost的IP地址" + +#: root/usr/lib/lua/luci/model/cbi/airwhu.lua:53 +msgid "Netmask" +msgstr "掩码" + +#: root/usr/lib/lua/luci/model/cbi/airwhu.lua:53 +msgid "default to localhost's netmask" +msgstr "默认为localhost的掩码" + +#: root/usr/lib/lua/luci/model/cbi/airwhu.lua:55 +msgid "Gateway" +msgstr "网关" + +#: root/usr/lib/lua/luci/model/cbi/airwhu.lua:55 +#: root/usr/lib/lua/luci/model/cbi/airwhu.lua:57 +msgid "default to 0.0.0.0" +msgstr "默认为0.0.0.0" + +#: root/usr/lib/lua/luci/model/cbi/airwhu.lua:57 +msgid "DNS" +msgstr "DNS服务器" + +#: root/usr/lib/lua/luci/model/cbi/airwhu.lua:59 +msgid "Ping host" +msgstr "Ping主机" + +#: root/usr/lib/lua/luci/model/cbi/airwhu.lua:59 +msgid "default to 0.0.0.0,i.e. disable this function" +msgstr "默认为0.0.0.0,即关闭该功能" + +#: root/usr/lib/lua/luci/model/cbi/airwhu.lua:61 +msgid "Authenticate timeout(s)" +msgstr "认证超时(秒)" + +#: root/usr/lib/lua/luci/model/cbi/airwhu.lua:61 +msgid "default to 8s" +msgstr "默认为8秒" + +#: root/usr/lib/lua/luci/model/cbi/airwhu.lua:63 +msgid "Heartbeat timeout(s)" +msgstr "心跳包超时(秒)" + +#: root/usr/lib/lua/luci/model/cbi/airwhu.lua:63 +msgid "default to 30s" +msgstr "默认为30秒" + +#: root/usr/lib/lua/luci/model/cbi/airwhu.lua:65 +msgid "Timeout on failure(s)" +msgstr "失败等待(秒)" + +#: root/usr/lib/lua/luci/model/cbi/airwhu.lua:65 +msgid "default to 15s" +msgstr "默认为15秒" + +#: root/usr/lib/lua/luci/model/cbi/airwhu.lua:67 +msgid "Max failure times" +msgstr "允许失败次数" + +#: root/usr/lib/lua/luci/model/cbi/airwhu.lua:67 +msgid "0 means no limit,default to 8" +msgstr "0表示无限制,默认为8" + +#: root/usr/lib/lua/luci/model/cbi/airwhu.lua:69 +msgid "mulcast address" +msgstr "多播地址" + +#: root/usr/lib/lua/luci/model/cbi/airwhu.lua:69 +#: root/usr/lib/lua/luci/model/cbi/airwhu.lua:75 +msgid "default to 1" +msgstr "默认为1" + +#: root/usr/lib/lua/luci/model/cbi/airwhu.lua:70 +msgid "0(standard)" +msgstr "0(标准)" + +#: root/usr/lib/lua/luci/model/cbi/airwhu.lua:71 +msgid "1(ruijjie)" +msgstr "1(锐捷)" + +#: root/usr/lib/lua/luci/model/cbi/airwhu.lua:72 +msgid "2(saier)" +msgstr "2(赛尔)" + +#: root/usr/lib/lua/luci/model/cbi/airwhu.lua:75 +msgid "DHCP type" +msgstr "DHCP方式" + +#: root/usr/lib/lua/luci/model/cbi/airwhu.lua:76 +msgid "0(not in used)" +msgstr "0(不使用)" + +#: root/usr/lib/lua/luci/model/cbi/airwhu.lua:77 +msgid "1(secondary authenticate)" +msgstr "1(二次认证)" + +#: root/usr/lib/lua/luci/model/cbi/airwhu.lua:78 +msgid "2(post authenticate)" +msgstr "3(认证后)" + +#: root/usr/lib/lua/luci/model/cbi/airwhu.lua:79 +msgid "3(pre authenticate)" +msgstr "3(认证前)" + +#: root/usr/lib/lua/luci/model/cbi/airwhu.lua:82 +msgid "run in daemon mode" +msgstr "后台运行模式" + +#: root/usr/lib/lua/luci/model/cbi/airwhu.lua:82 +msgid "default to 3" +msgstr "默认为3" + +#: root/usr/lib/lua/luci/model/cbi/airwhu.lua:83 +msgid "0(no)" +msgstr "0(不使用后台模式)" + +#: root/usr/lib/lua/luci/model/cbi/airwhu.lua:84 +msgid "1(yes,turn off output)" +msgstr "1(后台模式,关闭输出)" + +#: root/usr/lib/lua/luci/model/cbi/airwhu.lua:85 +msgid "2(yes,persevere output)" +msgstr "2(后台模式,保留输出)" + +#: root/usr/lib/lua/luci/model/cbi/airwhu.lua:86 +msgid "3(yes,output to file)" +msgstr "3(后台模式,输出到日志文件)" + +#: root/usr/lib/lua/luci/model/cbi/airwhu.lua:89 +msgid "display notification" +msgstr "显示通知" + +#: root/usr/lib/lua/luci/model/cbi/airwhu.lua:89 +msgid "0(no),1-20(yes),default to 0" +msgstr "0(不使用),1-20(使用),默认为0" + +#: root/usr/lib/lua/luci/model/cbi/airwhu.lua:91 +msgid "client version" +msgstr "客户端版本号" + +#: root/usr/lib/lua/luci/model/cbi/airwhu.lua:91 +msgid "default to 0.00,compatible with xrgsu" +msgstr "默认为0.00,表示兼容xrgsu" + +#: root/usr/lib/lua/luci/model/cbi/airwhu.lua:93 +msgid "customized data file" +msgstr "自定义数据文件" + +#: root/usr/lib/lua/luci/model/cbi/airwhu.lua:93 +msgid "not in used by default" +msgstr "默认不使用" + +#: root/usr/lib/lua/luci/model/cbi/airwhu.lua:96 +msgid "DHCP script" +msgstr "DHCP脚本" + +#: root/usr/lib/lua/luci/model/cbi/airwhu.lua:96 +msgid "use dhclient by default" +msgstr "默认使用dhclient" diff --git a/package/ctcgfw/luci-app-airwhu/tools/po2lmo/Makefile b/package/ctcgfw/luci-app-airwhu/tools/po2lmo/Makefile new file mode 100644 index 0000000000..ad2c133207 --- /dev/null +++ b/package/ctcgfw/luci-app-airwhu/tools/po2lmo/Makefile @@ -0,0 +1,12 @@ + +INSTALL = install +PREFIX = /usr/bin + +po2lmo: src/po2lmo.o src/template_lmo.o + $(CC) $(LDFLAGS) -o src/po2lmo src/po2lmo.o src/template_lmo.o + +install: + $(INSTALL) -m 755 src/po2lmo $(PREFIX) + +clean: + $(RM) src/po2lmo src/*.o diff --git a/package/ctcgfw/luci-app-airwhu/tools/po2lmo/src/po2lmo b/package/ctcgfw/luci-app-airwhu/tools/po2lmo/src/po2lmo new file mode 100755 index 0000000000000000000000000000000000000000..74c9146dc7974be8cd8ddde99f2cf603153c8274 GIT binary patch literal 18832 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 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "template_lmo.h" + +static void die(const char *msg) +{ + fprintf(stderr, "Error: %s\n", msg); + exit(1); +} + +static void usage(const char *name) +{ + fprintf(stderr, "Usage: %s input.po output.lmo\n", name); + exit(1); +} + +static void print(const void *ptr, size_t size, size_t nmemb, FILE *stream) +{ + if( fwrite(ptr, size, nmemb, stream) == 0 ) + die("Failed to write stdout"); +} + +static int extract_string(const char *src, char *dest, int len) +{ + int pos = 0; + int esc = 0; + int off = -1; + + for( pos = 0; (pos < strlen(src)) && (pos < len); pos++ ) + { + if( (off == -1) && (src[pos] == '"') ) + { + off = pos + 1; + } + else if( off >= 0 ) + { + if( esc == 1 ) + { + switch (src[pos]) + { + case '"': + case '\\': + off++; + break; + } + dest[pos-off] = src[pos]; + esc = 0; + } + else if( src[pos] == '\\' ) + { + dest[pos-off] = src[pos]; + esc = 1; + } + else if( src[pos] != '"' ) + { + dest[pos-off] = src[pos]; + } + else + { + dest[pos-off] = '\0'; + break; + } + } + } + + return (off > -1) ? strlen(dest) : -1; +} + +static int cmp_index(const void *a, const void *b) +{ + uint32_t x = ((const lmo_entry_t *)a)->key_id; + uint32_t y = ((const lmo_entry_t *)b)->key_id; + + if (x < y) + return -1; + else if (x > y) + return 1; + + return 0; +} + +static void print_uint32(uint32_t x, FILE *out) +{ + uint32_t y = htonl(x); + print(&y, sizeof(uint32_t), 1, out); +} + +static void print_index(void *array, int n, FILE *out) +{ + lmo_entry_t *e; + + qsort(array, n, sizeof(*e), cmp_index); + + for (e = array; n > 0; n--, e++) + { + print_uint32(e->key_id, out); + print_uint32(e->val_id, out); + print_uint32(e->offset, out); + print_uint32(e->length, out); + } +} + +int main(int argc, char *argv[]) +{ + char line[4096]; + char key[4096]; + char val[4096]; + char tmp[4096]; + int state = 0; + int offset = 0; + int length = 0; + int n_entries = 0; + void *array = NULL; + lmo_entry_t *entry = NULL; + uint32_t key_id, val_id; + + FILE *in; + FILE *out; + + if( (argc != 3) || ((in = fopen(argv[1], "r")) == NULL) || ((out = fopen(argv[2], "w")) == NULL) ) + usage(argv[0]); + + memset(line, 0, sizeof(key)); + memset(key, 0, sizeof(val)); + memset(val, 0, sizeof(val)); + + while( (NULL != fgets(line, sizeof(line), in)) || (state >= 2 && feof(in)) ) + { + if( state == 0 && strstr(line, "msgid \"") == line ) + { + switch(extract_string(line, key, sizeof(key))) + { + case -1: + die("Syntax error in msgid"); + case 0: + state = 1; + break; + default: + state = 2; + } + } + else if( state == 1 || state == 2 ) + { + if( strstr(line, "msgstr \"") == line || state == 2 ) + { + switch(extract_string(line, val, sizeof(val))) + { + case -1: + state = 4; + break; + default: + state = 3; + } + } + else + { + switch(extract_string(line, tmp, sizeof(tmp))) + { + case -1: + state = 2; + break; + default: + strcat(key, tmp); + } + } + } + else if( state == 3 ) + { + switch(extract_string(line, tmp, sizeof(tmp))) + { + case -1: + state = 4; + break; + default: + strcat(val, tmp); + } + } + + if( state == 4 ) + { + if( strlen(key) > 0 && strlen(val) > 0 ) + { + key_id = sfh_hash(key, strlen(key)); + val_id = sfh_hash(val, strlen(val)); + + if( key_id != val_id ) + { + n_entries++; + array = realloc(array, n_entries * sizeof(lmo_entry_t)); + entry = (lmo_entry_t *)array + n_entries - 1; + + if (!array) + die("Out of memory"); + + entry->key_id = key_id; + entry->val_id = val_id; + entry->offset = offset; + entry->length = strlen(val); + + length = strlen(val) + ((4 - (strlen(val) % 4)) % 4); + + print(val, length, 1, out); + offset += length; + } + } + + state = 0; + memset(key, 0, sizeof(key)); + memset(val, 0, sizeof(val)); + } + + memset(line, 0, sizeof(line)); + } + + print_index(array, n_entries, out); + + if( offset > 0 ) + { + print_uint32(offset, out); + fsync(fileno(out)); + fclose(out); + } + else + { + fclose(out); + unlink(argv[2]); + } + + fclose(in); + return(0); +} diff --git a/package/ctcgfw/luci-app-airwhu/tools/po2lmo/src/template_lmo.c b/package/ctcgfw/luci-app-airwhu/tools/po2lmo/src/template_lmo.c new file mode 100644 index 0000000000..27205a7228 --- /dev/null +++ b/package/ctcgfw/luci-app-airwhu/tools/po2lmo/src/template_lmo.c @@ -0,0 +1,328 @@ +/* + * lmo - Lua Machine Objects - Base functions + * + * Copyright (C) 2009-2010 Jo-Philipp Wich + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "template_lmo.h" + +/* + * Hash function from http://www.azillionmonkeys.com/qed/hash.html + * Copyright (C) 2004-2008 by Paul Hsieh + */ + +uint32_t sfh_hash(const char *data, int len) +{ + uint32_t hash = len, tmp; + int rem; + + if (len <= 0 || data == NULL) return 0; + + rem = len & 3; + len >>= 2; + + /* Main loop */ + for (;len > 0; len--) { + hash += sfh_get16(data); + tmp = (sfh_get16(data+2) << 11) ^ hash; + hash = (hash << 16) ^ tmp; + data += 2*sizeof(uint16_t); + hash += hash >> 11; + } + + /* Handle end cases */ + switch (rem) { + case 3: hash += sfh_get16(data); + hash ^= hash << 16; + hash ^= data[sizeof(uint16_t)] << 18; + hash += hash >> 11; + break; + case 2: hash += sfh_get16(data); + hash ^= hash << 11; + hash += hash >> 17; + break; + case 1: hash += *data; + hash ^= hash << 10; + hash += hash >> 1; + } + + /* Force "avalanching" of final 127 bits */ + hash ^= hash << 3; + hash += hash >> 5; + hash ^= hash << 4; + hash += hash >> 17; + hash ^= hash << 25; + hash += hash >> 6; + + return hash; +} + +uint32_t lmo_canon_hash(const char *str, int len) +{ + char res[4096]; + char *ptr, prev; + int off; + + if (!str || len >= sizeof(res)) + return 0; + + for (prev = ' ', ptr = res, off = 0; off < len; prev = *str, off++, str++) + { + if (isspace(*str)) + { + if (!isspace(prev)) + *ptr++ = ' '; + } + else + { + *ptr++ = *str; + } + } + + if ((ptr > res) && isspace(*(ptr-1))) + ptr--; + + return sfh_hash(res, ptr - res); +} + +lmo_archive_t * lmo_open(const char *file) +{ + int in = -1; + uint32_t idx_offset = 0; + struct stat s; + + lmo_archive_t *ar = NULL; + + if (stat(file, &s) == -1) + goto err; + + if ((in = open(file, O_RDONLY)) == -1) + goto err; + + if ((ar = (lmo_archive_t *)malloc(sizeof(*ar))) != NULL) + { + memset(ar, 0, sizeof(*ar)); + + ar->fd = in; + ar->size = s.st_size; + + fcntl(ar->fd, F_SETFD, fcntl(ar->fd, F_GETFD) | FD_CLOEXEC); + + if ((ar->mmap = mmap(NULL, ar->size, PROT_READ, MAP_SHARED, ar->fd, 0)) == MAP_FAILED) + goto err; + + idx_offset = ntohl(*((const uint32_t *) + (ar->mmap + ar->size - sizeof(uint32_t)))); + + if (idx_offset >= ar->size) + goto err; + + ar->index = (lmo_entry_t *)(ar->mmap + idx_offset); + ar->length = (ar->size - idx_offset - sizeof(uint32_t)) / sizeof(lmo_entry_t); + ar->end = ar->mmap + ar->size; + + return ar; + } + +err: + if (in > -1) + close(in); + + if (ar != NULL) + { + if ((ar->mmap != NULL) && (ar->mmap != MAP_FAILED)) + munmap(ar->mmap, ar->size); + + free(ar); + } + + return NULL; +} + +void lmo_close(lmo_archive_t *ar) +{ + if (ar != NULL) + { + if ((ar->mmap != NULL) && (ar->mmap != MAP_FAILED)) + munmap(ar->mmap, ar->size); + + close(ar->fd); + free(ar); + + ar = NULL; + } +} + + +lmo_catalog_t *_lmo_catalogs = NULL; +lmo_catalog_t *_lmo_active_catalog = NULL; + +int lmo_load_catalog(const char *lang, const char *dir) +{ + DIR *dh = NULL; + char pattern[16]; + char path[PATH_MAX]; + struct dirent *de = NULL; + + lmo_archive_t *ar = NULL; + lmo_catalog_t *cat = NULL; + + if (!lmo_change_catalog(lang)) + return 0; + + if (!dir || !(dh = opendir(dir))) + goto err; + + if (!(cat = malloc(sizeof(*cat)))) + goto err; + + memset(cat, 0, sizeof(*cat)); + + snprintf(cat->lang, sizeof(cat->lang), "%s", lang); + snprintf(pattern, sizeof(pattern), "*.%s.lmo", lang); + + while ((de = readdir(dh)) != NULL) + { + if (!fnmatch(pattern, de->d_name, 0)) + { + snprintf(path, sizeof(path), "%s/%s", dir, de->d_name); + ar = lmo_open(path); + + if (ar) + { + ar->next = cat->archives; + cat->archives = ar; + } + } + } + + closedir(dh); + + cat->next = _lmo_catalogs; + _lmo_catalogs = cat; + + if (!_lmo_active_catalog) + _lmo_active_catalog = cat; + + return 0; + +err: + if (dh) closedir(dh); + if (cat) free(cat); + + return -1; +} + +int lmo_change_catalog(const char *lang) +{ + lmo_catalog_t *cat; + + for (cat = _lmo_catalogs; cat; cat = cat->next) + { + if (!strncmp(cat->lang, lang, sizeof(cat->lang))) + { + _lmo_active_catalog = cat; + return 0; + } + } + + return -1; +} + +static lmo_entry_t * lmo_find_entry(lmo_archive_t *ar, uint32_t hash) +{ + unsigned int m, l, r; + uint32_t k; + + l = 0; + r = ar->length - 1; + + while (1) + { + m = l + ((r - l) / 2); + + if (r < l) + break; + + k = ntohl(ar->index[m].key_id); + + if (k == hash) + return &ar->index[m]; + + if (k > hash) + { + if (!m) + break; + + r = m - 1; + } + else + { + l = m + 1; + } + } + + return NULL; +} + +int lmo_translate(const char *key, int keylen, char **out, int *outlen) +{ + uint32_t hash; + lmo_entry_t *e; + lmo_archive_t *ar; + + if (!key || !_lmo_active_catalog) + return -2; + + hash = lmo_canon_hash(key, keylen); + + for (ar = _lmo_active_catalog->archives; ar; ar = ar->next) + { + if ((e = lmo_find_entry(ar, hash)) != NULL) + { + *out = ar->mmap + ntohl(e->offset); + *outlen = ntohl(e->length); + return 0; + } + } + + return -1; +} + +void lmo_close_catalog(const char *lang) +{ + lmo_archive_t *ar, *next; + lmo_catalog_t *cat, *prev; + + for (prev = NULL, cat = _lmo_catalogs; cat; prev = cat, cat = cat->next) + { + if (!strncmp(cat->lang, lang, sizeof(cat->lang))) + { + if (prev) + prev->next = cat->next; + else + _lmo_catalogs = cat->next; + + for (ar = cat->archives; ar; ar = next) + { + next = ar->next; + lmo_close(ar); + } + + free(cat); + break; + } + } +} diff --git a/package/ctcgfw/luci-app-airwhu/tools/po2lmo/src/template_lmo.h b/package/ctcgfw/luci-app-airwhu/tools/po2lmo/src/template_lmo.h new file mode 100644 index 0000000000..57f59aa56b --- /dev/null +++ b/package/ctcgfw/luci-app-airwhu/tools/po2lmo/src/template_lmo.h @@ -0,0 +1,92 @@ +/* + * lmo - Lua Machine Objects - General header + * + * Copyright (C) 2009-2012 Jo-Philipp Wich + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef _TEMPLATE_LMO_H_ +#define _TEMPLATE_LMO_H_ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#if (defined(__GNUC__) && defined(__i386__)) +#define sfh_get16(d) (*((const uint16_t *) (d))) +#else +#define sfh_get16(d) ((((uint32_t)(((const uint8_t *)(d))[1])) << 8)\ + +(uint32_t)(((const uint8_t *)(d))[0]) ) +#endif + + +struct lmo_entry { + uint32_t key_id; + uint32_t val_id; + uint32_t offset; + uint32_t length; +} __attribute__((packed)); + +typedef struct lmo_entry lmo_entry_t; + + +struct lmo_archive { + int fd; + int length; + uint32_t size; + lmo_entry_t *index; + char *mmap; + char *end; + struct lmo_archive *next; +}; + +typedef struct lmo_archive lmo_archive_t; + + +struct lmo_catalog { + char lang[6]; + struct lmo_archive *archives; + struct lmo_catalog *next; +}; + +typedef struct lmo_catalog lmo_catalog_t; + + +uint32_t sfh_hash(const char *data, int len); +uint32_t lmo_canon_hash(const char *data, int len); + +lmo_archive_t * lmo_open(const char *file); +void lmo_close(lmo_archive_t *ar); + + +extern lmo_catalog_t *_lmo_catalogs; +extern lmo_catalog_t *_lmo_active_catalog; + +int lmo_load_catalog(const char *lang, const char *dir); +int lmo_change_catalog(const char *lang); +int lmo_translate(const char *key, int keylen, char **out, int *outlen); +void lmo_close_catalog(const char *lang); + +#endif diff --git a/package/ctcgfw/luci-app-appfilter/Makefile b/package/ctcgfw/luci-app-appfilter/Makefile new file mode 100644 index 0000000000..f92bca510d --- /dev/null +++ b/package/ctcgfw/luci-app-appfilter/Makefile @@ -0,0 +1,15 @@ + +# +# This is free software, licensed under the Apache License, Version 2.0 . +# + +include $(TOPDIR)/rules.mk + +LUCI_TITLE:=Open App Filter Module +LUCI_PKGARCH:=all +LUCI_DEPENDS:=+kmod-oaf +appfilter +PKG_NAME:=luci-app-appfilter +PKG_VERSION:=3.0 +PKG_RELEASE:=1 +include $(TOPDIR)/feeds/luci/luci.mk +# call BuildPackage - OpenWrt buildroot signature diff --git a/package/ctcgfw/luci-app-appfilter/luasrc/controller/appfilter.lua b/package/ctcgfw/luci-app-appfilter/luasrc/controller/appfilter.lua new file mode 100644 index 0000000000..6bb4a0978f --- /dev/null +++ b/package/ctcgfw/luci-app-appfilter/luasrc/controller/appfilter.lua @@ -0,0 +1,96 @@ +module("luci.controller.appfilter", package.seeall) + +function index() + if not nixio.fs.access("/etc/config/appfilter") then + return + end + + local page + + page = entry({"admin", "network", "appfilter"}, cbi("appfilter/appfilter"), _("appfilter")) + page.dependent = true + + page = entry({"admin", "network", "user_status"}, call("user_status"), nil) + page.leaf = true +end + +function get_hostname_by_mac(dst_mac) + leasefile="/tmp/dhcp.leases" + local fd = io.open(leasefile, "r") + if not fd then return end + while true do + local ln = fd:read("*l") + if not ln then + break + end + local ts, mac, ip, name, duid = ln:match("^(%d+) (%S+) (%S+) (%S+) (%S+)") + print(ln) + if dst_mac == mac then + print("match mac", mac, "hostname=", name); + fd:close() + return name + end + end + fd:close() + return "" +end + +function get_app_name_by_id(appid) + local class_fd = io.popen("find /etc/appfilter/ -type f -name *.class |xargs cat |grep "..appid.."|awk '{print $2}'") + if class_fd then + local name = class_fd:read("*l") + class_fd:close() + return name + end + return "" +end + +function cmp_func(a,b) + return a.latest_time > b.latest_time +end + + + + +function user_status() + local s = require "luci.tools.status" + local json = require "luci.jsonc" + luci.http.prepare_content("application/json") + tb={} + obj={}; + obj.hostname="derry" + obj.ip="192.168.10.199" + obj.mac="192.168.10.199" + tb[#tb+1]=obj + --local fs=require "nixio.fs" + --local ok, status_data = pcall(json.parse, fs.readfile("/proc/net/af_client")) + --luci.http.write_json(tb); + local fd = io.open("/proc/net/af_client","r") + + status_buf=fd:read('*a') + fd:close() + user_array=json.parse(status_buf) + + local history={} + for i, v in pairs(user_array) do + visit_array=user_array[i].visit_info + for j,s in pairs(visit_array) do + print(user_array[i].mac, user_array[i].ip,visit_array[j].appid, visit_array[j].latest_time) + history[#history+1]={ + mac=user_array[i].mac, + ip=user_array[i].ip, + hostname=get_hostname_by_mac(user_array[i].mac), + appid=visit_array[j].appid, + appname=get_app_name_by_id(visit_array[j].appid), + total_num=visit_array[j].total_num, + drop_num=visit_array[j].drop_num, + latest_action=visit_array[j].latest_action, + latest_time=os.date("%Y/%m/%d %H:%M:%S", visit_array[j].latest_time) + } + end + end + table.sort(history, cmp_func) + --luci.http.write(history); + luci.http.write_json(history); +end + diff --git a/package/ctcgfw/luci-app-appfilter/luasrc/model/cbi/appfilter/appfilter.lua b/package/ctcgfw/luci-app-appfilter/luasrc/model/cbi/appfilter/appfilter.lua new file mode 100644 index 0000000000..ea50ac7218 --- /dev/null +++ b/package/ctcgfw/luci-app-appfilter/luasrc/model/cbi/appfilter/appfilter.lua @@ -0,0 +1,87 @@ +--[[ +LuCI - Lua Configuration Interface + +Copyright 2008 Steven Barth + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +$Id$ +]]-- + +local ds = require "luci.dispatcher" + +local m, s + +m = Map("appfilter", + translate("appfilter"), + translate("")) + +s = m:section(TypedSection, "global", translate("Basic Settings")) +s:option(Flag, "enable", translate("Enable App Filter"),translate("")) +s.anonymous = true + + +s = m:section(TypedSection, "appfilter", translate("App Filter Rules")) +s.anonymous = true +s.addremove = false + + +local class_fd = io.popen("find /etc/appfilter/ -type f -name '*.class'") +if class_fd then + while true do + local apps + local class + local path = class_fd:read("*l") + if not path then + break + end + + class = path:match("([^/]+)%.class$") + -- add a tab + s:tab(class, translate(class)) + -- multi value option + apps = s:taboption(class, MultiValue, class.."apps", translate("")) + apps.rmempty=true + --apps.delimiter=";" + -- select + apps.widget="checkbox" + apps.size=12 + + local fd = io.open(path) + if fd then + local line + while true do + local cmd + local cmd_fd + line = fd:read("*l") + if not line then break end + if string.len(line) < 5 then break end + if not string.find(line,"#") then + cmd = "echo "..line.."|awk '{print $1}'" + cmd_fd = io.popen(cmd) + id = cmd_fd:read("*l"); + cmd_fd:close() + + cmd = "echo "..line.."|awk '{print $2}'" + cmd_fd = io.popen(cmd) + name = cmd_fd:read("*l") + + cmd_fd:close() + if not id then break end + if not name then break end + apps:value(id, name) + end + end + fd:close() + end + end + class_fd:close() +end +m:section(SimpleSection).template = "admin_network/user_status" + + +return m diff --git a/package/ctcgfw/luci-app-appfilter/luasrc/view/admin_network/user_status.htm b/package/ctcgfw/luci-app-appfilter/luasrc/view/admin_network/user_status.htm new file mode 100644 index 0000000000..472f6d0690 --- /dev/null +++ b/package/ctcgfw/luci-app-appfilter/luasrc/view/admin_network/user_status.htm @@ -0,0 +1,85 @@ + + + + +
+ <%:访问记录%> + + + + + + + + + + + + + + +
<%:主机名%><%:mac地址%><%:ip地址%><%:App名称%><%:丢包次数%><%:访问次数%><%:最后访问时间%><%:过滤状态%>

<%:Collecting data...%>
+
diff --git a/package/ctcgfw/luci-app-appfilter/po/zh-cn/oaf.po b/package/ctcgfw/luci-app-appfilter/po/zh-cn/oaf.po new file mode 100644 index 0000000000..b133f7402b --- /dev/null +++ b/package/ctcgfw/luci-app-appfilter/po/zh-cn/oaf.po @@ -0,0 +1,48 @@ + +msgid "website" +msgstr "常用网站" + +msgid "appfilter" +msgstr "应用过滤" + +msgid "game" +msgstr "游戏" + +msgid "web" +msgstr "网页" + +msgid "video" +msgstr "视频" + +msgid "chat" +msgstr "聊天" + +msgid "download" +msgstr "下载" + +msgid "p2p" +msgstr "p2p" + +msgid "music" +msgstr "音乐" + +msgid "shopping" +msgstr "购物" + +msgid "working" +msgstr "办公" + +msgid "employee" +msgstr "招聘" + +msgid "Basic Settings" +msgstr "基本设置" + +msgid "App Filter Rules" +msgstr "应用过滤规则" + +msgid "Enable App Filter" +msgstr "开启应用过滤" + + + diff --git a/package/ctcgfw/luci-app-appfilter/root/etc/uci-defaults/91_luci-oaf b/package/ctcgfw/luci-app-appfilter/root/etc/uci-defaults/91_luci-oaf new file mode 100755 index 0000000000..2041cc3dfa --- /dev/null +++ b/package/ctcgfw/luci-app-appfilter/root/etc/uci-defaults/91_luci-oaf @@ -0,0 +1,14 @@ +#!/bin/sh + +# replace existing mwan ucitrack entry +uci -q batch <<-EOF >/dev/null + del ucitrack.@appfilter[-1] + add ucitrack appfilter + set ucitrack.@appfilter[-1].exec="/etc/init.d/appfilter reload" + commit ucitrack +EOF + +# remove LuCI cache +rm -rf /tmp/luci-indexcache /tmp/luci-modulecache + +exit 0 diff --git a/package/ctcgfw/luci-app-autoipsetadder/Makefile b/package/ctcgfw/luci-app-autoipsetadder/Makefile new file mode 100644 index 0000000000..160bc31aa8 --- /dev/null +++ b/package/ctcgfw/luci-app-autoipsetadder/Makefile @@ -0,0 +1,64 @@ +# Copyright (C) 2018-2019 Lienol +# +# This is free software, licensed under the Apache License, Version 2.0 . +# + +include $(TOPDIR)/rules.mk + +PKG_NAME:=luci-app-autoipsetadder +PKG_VERSION:=1.0 +PKG_RELEASE:=7 + +PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME) + +include $(INCLUDE_DIR)/package.mk + +define Package/luci-app-autoipsetadder + SECTION:=luci + CATEGORY:=LuCI + SUBMENU:=3. Applications + TITLE:=LuCI Support for autoipsetadder + PKGARCH:=all + DEPENDS:= +httping +curl +endef + +define Package/luci-app-autoipsetadder/description + LuCI support for autoipsetadder +endef + +define Build/Prepare +endef + +define Build/Compile +endef + +define Package/luci-app-autoipsetadder/conffiles +/etc/config/autoipsetadder +endef + +define Package/luci-app-autoipsetadder/install + $(INSTALL_DIR) $(1)/usr/lib/lua/luci + cp -pR ./luasrc/* $(1)/usr/lib/lua/luci + $(INSTALL_DIR) $(1)/ + cp -pR ./root/* $(1)/ +endef + +define Package/luci-app-autoipsetadder/postinst +#!/bin/sh + /etc/init.d/autoipsetadder enable >/dev/null 2>&1 + /etc/init.d/autoipsetadder start + rm -f /tmp/luci-indexcache + rm -f /tmp/luci-modulecache/* +exit 0 +endef + +define Package/luci-app-autoipsetadder/prerm +#!/bin/sh +if [ -z "$${IPKG_INSTROOT}" ]; then + /etc/init.d/autoipsetadder disable + /etc/init.d/autoipsetadder stop +fi +exit 0 +endef + +$(eval $(call BuildPackage,luci-app-autoipsetadder)) diff --git a/package/ctcgfw/luci-app-autoipsetadder/luasrc/controller/autoipsetadder.lua b/package/ctcgfw/luci-app-autoipsetadder/luasrc/controller/autoipsetadder.lua new file mode 100644 index 0000000000..6e88056d50 --- /dev/null +++ b/package/ctcgfw/luci-app-autoipsetadder/luasrc/controller/autoipsetadder.lua @@ -0,0 +1,56 @@ +module("luci.controller.autoipsetadder",package.seeall) +local io = require "io" +local fs=require"nixio.fs" +local sys=require"luci.sys" +local uci=require"luci.model.uci".cursor() +function index() + entry({"admin","services","autoipsetadder"},firstchild(),_("autoipsetadder"),30).dependent=true + entry({"admin","services","autoipsetadder","autoipsetadder"},cbi("autoipsetadder"),_("Base Setting"),1) + entry({"admin","services","autoipsetadder","status"},call("act_status")).leaf=true + entry({"admin", "services", "autoipsetadder", "getlog"}, call("get_log")) + entry({"admin", "services", "autoipsetadder", "dodellog"}, call("do_del_log")) + entry({"admin", "services", "autoipsetadder", "debugip"}, call("do_debug_ip")) +end + +function act_status() + local e={} + e.running=luci.sys.call("pgrep -f /usr/bin/autoipsetadder/autoaddlist.sh >/dev/null")==0 + luci.http.prepare_content("application/json") + luci.http.write_json(e) +end +function do_del_log() +local logfile=uci:get("autoipsetadder","autoipsetadder","logfile") or "/tmp/addlist.log" +nixio.fs.writefile(logfile,"") +luci.http.prepare_content("application/json") +luci.http.write('') +end +function do_debug_ip() +luci.http.prepare_content("text/plain; charset=utf-8") +local a=sys.exec("/usr/bin/autoipsetadder/debugip.sh") +if (a=="") then +a="noproblem" +end +luci.http.write(a) +end +function get_log() + local logfile,fdp + logfile=uci:get("autoipsetadder","autoipsetadder","logfile") or "/tmp/addlist.log" + luci.http.prepare_content("text/plain; charset=utf-8") + if not fs.access(logfile) then + luci.http.write("") + return + end + if fs.access("/var/run/lucilogreload") then + fdp=0 + fs.remove("/var/run/lucilogreload") + else + fdp=tonumber(fs.readfile("/var/run/lucilogpos")) or 0 + end + local f=io.open(logfile, "r+") + f:seek("set",fdp) + local a=f:read(2048000) or "" + fdp=f:seek() + fs.writefile("/var/run/lucilogpos",tostring(fdp)) + f:close() + luci.http.write(a) +end \ No newline at end of file diff --git a/package/ctcgfw/luci-app-autoipsetadder/luasrc/model/cbi/autoipsetadder.lua b/package/ctcgfw/luci-app-autoipsetadder/luasrc/model/cbi/autoipsetadder.lua new file mode 100644 index 0000000000..8e55be0a2a --- /dev/null +++ b/package/ctcgfw/luci-app-autoipsetadder/luasrc/model/cbi/autoipsetadder.lua @@ -0,0 +1,97 @@ +require("luci.sys") +require("luci.util") +local fs=require"nixio.fs" +local uci=require"luci.model.uci".cursor() +local m,s,o +m = Map("autoipsetadder", translate("ipsetautoadder")) +m.description = translate("自动将联不通的域名加入ipset") +m:section(SimpleSection).template = "autoipsetadder/status" + +s = m:section(TypedSection, "autoipsetadder") +s.anonymous=true +s.addremove=false +---- enable +o = s:option(Flag, "enabled", translate("启用")) +o.default = 0 +o.rmempty = false +---- logview +o=s:option(TextValue, "show", "日志") +o.template = "autoipsetadder/check" +---- logpath +o = s:option(Value, "logfile", translate("Runtime log file")) +o.datatype = "string" +o.default="/tmp/addlist.log" +o.optional = false +o.validate=function(self, value) +if fs.stat(value,"type")=="dir" then + fs.rmdir(value) +end +if fs.stat(value,"type")=="dir" then + if m.message then + m.message =m.message.."\nerror!log file is a dir" + else + m.message ="error!log file is a dir" + end + return nil +end +return value +end +---- dnsmasq log +o = s:option(Value, "dnslogfile", translate("dnsmasq log file")) +o.datatype = "string" +o.optional = false +o.default="/tmp/dnsmasq.log" +o.validate=function(self, value) +if fs.stat(value,"type")=="dir" then + fs.rmdir(value) +end +if fs.stat(value,"type")=="dir" then + if m.message then + m.message =m.message.."\nerror!log file is a dir" + else + m.message ="error!log file is a dir" + end + return nil +end +return value +end +---- crontab +o = s:option(MultiValue, "crontab", translate("Crontab task"),translate("Please change time and args in crontab")) +o:value("autodeldnslog",translate("Auto del dnsmasq log")) +o:value("autotaillog",translate("Auto tail runtime log")) +o.widget = "checkbox" +o.default = "autodeldnslog autotaillog" +o.rmempty= true + +o = s:option(MultiValue, "config", translate("the way add to gfwlist")) +o:value("nochina",translate("no china ip")) +o:value("pingadd",translate("5ping loss1-4")) +o:value("packetpass",translate("packet >12 pass")) +o.widget = "checkbox" +o.default = "nochina pingadd packetpass" +o.rmempty=true +---- apply +nixio.fs.writefile("/var/run/lucilogreload","") +function m.on_commit(map) + local ucitracktest=uci:get("autoipsetadder","autoipsetadder","ucitracktest") + if ucitracktest=="1" then + return + elseif ucitracktest=="0" then + io.popen("/etc/init.d/autoipsetadder reload &") + else + if (fs.access("/var/run/AdGucitest")) then + uci:set("autoipsetadder","autoipsetadder","ucitracktest","0") + io.popen("/etc/init.d/autoipsetadder reload &") + else + fs.writefile("/var/run/AdGucitest","") + if (ucitracktest=="2") then + uci:set("autoipsetadder","autoipsetadder","ucitracktest","1") + else + uci:set("autoipsetadder","autoipsetadder","ucitracktest","2") + end + end + uci:save("autoipsetadder") + uci:commit("autoipsetadder") + end +end +return m diff --git a/package/ctcgfw/luci-app-autoipsetadder/luasrc/view/autoipsetadder/check.htm b/package/ctcgfw/luci-app-autoipsetadder/luasrc/view/autoipsetadder/check.htm new file mode 100644 index 0000000000..651d93d46f --- /dev/null +++ b/package/ctcgfw/luci-app-autoipsetadder/luasrc/view/autoipsetadder/check.htm @@ -0,0 +1,62 @@ +<%+cbi/valueheader%> +<%uci=require"luci.model.uci".cursor()%> +<%nixio=require"nixio"%> + +<%if uci:get("autoipsetadder","autoipsetadder","enabled")=="1" then%> + +<%:reverse%> + + + + + + + +<%end%> +<%+cbi/valuefooter%> \ No newline at end of file diff --git a/package/ctcgfw/luci-app-autoipsetadder/luasrc/view/autoipsetadder/status.htm b/package/ctcgfw/luci-app-autoipsetadder/luasrc/view/autoipsetadder/status.htm new file mode 100644 index 0000000000..b9f123d6f1 --- /dev/null +++ b/package/ctcgfw/luci-app-autoipsetadder/luasrc/view/autoipsetadder/status.htm @@ -0,0 +1,22 @@ + + +
+

+ <%:Collecting data...%> +

+
\ No newline at end of file diff --git a/package/ctcgfw/luci-app-autoipsetadder/root/etc/config/autoipsetadder b/package/ctcgfw/luci-app-autoipsetadder/root/etc/config/autoipsetadder new file mode 100644 index 0000000000..5110d5260b --- /dev/null +++ b/package/ctcgfw/luci-app-autoipsetadder/root/etc/config/autoipsetadder @@ -0,0 +1,2 @@ +config autoipsetadder 'autoipsetadder' + option enabled '0' diff --git a/package/ctcgfw/luci-app-autoipsetadder/root/etc/init.d/autoipsetadder b/package/ctcgfw/luci-app-autoipsetadder/root/etc/init.d/autoipsetadder new file mode 100755 index 0000000000..c6b181078c --- /dev/null +++ b/package/ctcgfw/luci-app-autoipsetadder/root/etc/init.d/autoipsetadder @@ -0,0 +1,126 @@ +#!/bin/sh /etc/rc.common + +USE_PROCD=1 + +START=99 +STOP=01 +CRON_FILE=/etc/crontabs/root +CONFIGURATION=autoipsetadder +EXTRA_COMMANDS="test_crontab" +EXTRA_HELP=" + test_crontab" +set_dnsmasq_log() +{ + sed -i '/log-facility/d' /etc/dnsmasq.conf + sed -i '/log-queries/d' /etc/dnsmasq.conf + uci set dhcp.@dnsmasq[0].logfacility='/tmp/dnsmasq.log' + uci delete dhcp.@dnsmasq[0].logqueries + echo log-queries >> /etc/dnsmasq.conf + uci commit dhcp + /etc/init.d/dnsmasq reload +} + +stop_dnsmasq_log() +{ + sed -i '/log-queries/d' /etc/dnsmasq.conf + uci delete dhcp.@dnsmasq[0].logfacility + uci commit dhcp + /etc/init.d/dnsmasq reload +} + +reload_service() +{ + rm -f /var/run/AdGucitest 2>/dev/null + kill $(cat /var/run/autoipsetadder.pid) + start +} +service_triggers() { + procd_add_reload_trigger "$CONFIGURATION" +} +start_service() { + # Reading config + config_load "${CONFIGURATION}" + mkdir -p /tmp/run/autoipsetadder + local enabled + config_get_bool enabled $CONFIGURATION enabled 0 + do_crontab + if [ "$enabled" == "1" ]; then + set_dnsmasq_log + procd_open_instance + procd_set_param respawn + # pass config to script on start + procd_set_param command sh /usr/bin/autoipsetadder/autoaddlist.sh + procd_close_instance + echo "autoipsetadder turn on" + echo "enabled=$enabled" + else + stop_dnsmasq_log + echo "autoipsetadder turn off" + echo "enabled=$enabled" + fi +} + +stop_service() +{ + config_load "${CONFIGURATION}" + stop_dnsmasq_log + do_crontab + kill $(cat /var/run/autoipsetadder.pid) + echo "autoipsetadder turn off" + echo "enabled="$enabled"" +} +do_crontab(){ + config_get_bool enabled $CONFIGURATION enabled 0 + #config_get logfile $CONFIGURATION logfile "/tmp/addlist.log" + #config_get dnslogfile $CONFIGURATION dnslogfile "/tmp/dnsmasq.log" + config_get crontab $CONFIGURATION crontab "" + cronreload=0 + findstr="echo qingkong > \$(uci get autoipsetadder.autoipsetadder.dnslogfile)" + default="0 * * * * echo qingkong > \$(uci get autoipsetadder.autoipsetadder.dnslogfile)" + #[ -n "$lastdnslogfile" ] && findstr="echo qingkong > $lastdnslogfile" && [ "$lastdnslogfile" != "$dnslogfile" ] && replace="${lastdnslogfile//\//\\/}/${dnslogfile//\//\\/}" + [ "$enabled" == "0" ] || [ "${crontab//autodeldnslog/}" == "$crontab" ] && cronenable=0 || cronenable=1 + crontab_editor + #[ "$lastdnslogfile" != "$dnslogfile" ] && uci set autoipsetadder.autoipsetadder.lastdnslogfile="$dnslogfile" && commit=1 + + findstr="/usr/bin/autoipsetadder/tailto.sh [0-9]* \$(uci get autoipsetadder.autoipsetadder.logfile)" + default="0 0 * * * /usr/bin/autoipsetadder/tailto.sh 2000 \$(uci get autoipsetadder.autoipsetadder.logfile)" + #[ -n "$lastlogfile" ] && findstr="/usr/bin/autoipsetadder/tailto.sh [0-9]* $lastlogfile" && [ "$lastlogfile" != "$logfile" ] && replace="${lastlogfile//\//\\/}/${logfile//\//\\/}" + [ "$enabled" == "0" ] || [ "${crontab//autotaillog/}" == "$crontab" ] && cronenable=0 || cronenable=1 + crontab_editor + #[ -n "$logfile" ] && [ "$lastlogfile" != "$logfile" ] && uci set autoipsetadder.autoipsetadder.lastlogfile="$logfile" && commit=1 + + [ "$cronreload" -gt 0 ] && /etc/init.d/cron restart + #[ "$commit" -gt 0 ] && uci commit autoipsetadder +} +crontab_editor(){ + local testline reload + local line="$(grep "$findstr" $CRON_FILE)" + [ -n "$replace" ] && [ -n "$line" ] && eval testline="\${line//$replace}" && [ "$testline" != "$line" ] && line="$testline" && reload="1" && replace="" + if [ "${line:0:1}" != "#" ]; then + if [ $cronenable -eq 1 ]; then + [ -z "$line" ] && line="$default" && reload="1" + if [ -n "$reload" ]; then + sed -i "\,$findstr,d" $CRON_FILE + echo "$line" >> $CRON_FILE + cronreload=$((cronreload+1)) + fi + elif [ -n "$line" ]; then + sed -i "\,$findstr,d" $CRON_FILE + echo "#$line" >> $CRON_FILE + cronreload=$((cronreload+1)) + fi + else + if [ $cronenable -eq 1 ]; then + sed -i "\,$findstr,d" $CRON_FILE + echo "${line:1}" >> $CRON_FILE + cronreload=$((cronreload+1)) + elif [ -z "$reload" ]; then + sed -i "\,$findstr,d" $CRON_FILE + echo "$line" >> $CRON_FILE + fi + fi +} +test_crontab(){ +config_load "${CONFIGURATION}" +do_crontab +} diff --git a/package/ctcgfw/luci-app-autoipsetadder/root/etc/uci-defaults/40_luci-autoipsetadder b/package/ctcgfw/luci-app-autoipsetadder/root/etc/uci-defaults/40_luci-autoipsetadder new file mode 100755 index 0000000000..d1a8ee4577 --- /dev/null +++ b/package/ctcgfw/luci-app-autoipsetadder/root/etc/uci-defaults/40_luci-autoipsetadder @@ -0,0 +1,11 @@ +#!/bin/sh + +uci -q batch <<-EOF >/dev/null + delete ucitrack.@autoipsetadder[-1] + add ucitrack autoipsetadder + set ucitrack.@autoipsetadder[-1].init=autoipsetadder + commit ucitrack +EOF + +rm -f /tmp/luci-indexcache +exit 0 diff --git a/package/ctcgfw/luci-app-autoipsetadder/root/usr/bin/autoipsetadder/autoaddlist.sh b/package/ctcgfw/luci-app-autoipsetadder/root/usr/bin/autoipsetadder/autoaddlist.sh new file mode 100755 index 0000000000..b6d8113b17 --- /dev/null +++ b/package/ctcgfw/luci-app-autoipsetadder/root/usr/bin/autoipsetadder/autoaddlist.sh @@ -0,0 +1,164 @@ +#!/bin/sh +PATH="/usr/sbin:/usr/bin:/sbin:/bin" +logfile=$(uci get autoipsetadder.autoipsetadder.logfile) +[ -z "$logfile" ] && logfile="/tmp/addlist.log" +dnslogfile=$(uci get autoipsetadder.autoipsetadder.dnslogfile) +[ -z "$logfile" ] && dnslogfile="/tmp/dnsmasq.log" +config=$(uci get autoipsetadder.autoipsetadder.config 2>/dev/null) +[ "${config//nochina/}" == "$config" ] && nochina="0" || nochina="1" +[ "${config//packetpass/}" == "$config" ] && packetpass="0" || packetpass="1" +(tail -F $dnslogfile & echo $! >/var/run/autoipsetadder.pid ) | awk -v nochina="$nochina" -v packetpass="$packetpass" -F "[, ]+" '/reply/{ +ip=$8; +if (ip=="" || ip=="127.0.0.1"|| ip=="0.0.0.0") +{ +next; +} +if (index(ip,"")!=0) +{ +if (cname==1) +{ + next; +} +cname=1; +domain=$6; +#第一次cname时锁定域名,防止解析cname对其改动 +next; +} +#以上获得上行是否为cname,本行不是cname执行以下内容 +#lastdomain记录上次非cname的域名,与本次域名对比 +if(lastdomain!=$6){ + for (ipindex in ipcache) + { + delete ipcache[ipindex]; + } + ipcount=0; + createpid=1; +#上行非cname,并且不是同cname解析域名的多个ip,更新域名,清理同域名免试flag +if (cname!=1) +{ + domain=$6; + testall=0; +}} +ipcount++; +cname=0; +lastdomain=$6 +#去除非ipv4 +if (index(ip,".")==0) +{ + next; +} +#不重复探测ip +if (!(ip in a)) +{ +#包数>12的同域名放过 +if (passdomain==domain) +{ + print(ip" "domain" pass by same domain ok"); + a[ip]=domain; + next; +} +if (nochina==1){ +"ipset test china "ip" 2>&1"| getline ipset; +close("ipset test china "ip" 2>&1"); +if (index(ipset,"Warning")!=0){ + print("china "ip" pass"); + a[ip]=domain; + next; +}} +"ipset test gfwlist "ip" 2>&1"| getline ipset; +close("ipset test gfwlist "ip" 2>&1"); +if (index(ipset,"Warning")!=0){ + print("gfwlist "ip" pass"); + a[ip]=domain; + next; + } + +#ip压入缓存,用于未检测到443/80的缓存 +ipcache[ipcount]=ip; +if (testall==0){ + tryhttps=0; + tryhttp=0; + #探测 nf_conntrack 的443/80 + while ("grep "ip" /proc/net/nf_conntrack"| getline ret > 0) + { + split(ret, b," +"); + split(b[11], pagnum,"="); + #包数>12的放过 + if (packetpass==1 && pagnum[2]>12) + { + print("pass by packets="pagnum[2]" "ip" "domain); + for (ipindex in ipcache) + { + a[ipcache[ipindex]]=domain; + delete ipcache[ipindex]; + } + passdomain=domain; + close("grep "ip" /proc/net/nf_conntrack"); + ipcount--; + next; + } + if (b[8]=="dst="ip) + { + if (b[10]=="dport=443"){ + tryhttps=1; + break; + } + else if (b[10]=="dport=80"){ + tryhttp=1; + } + } + } + close("grep "ip" /proc/net/nf_conntrack"); +}else{ + if (testall==443) + { + tryhttps=1 + }else{ + tryhttp=1 + } +} +if (tryhttps==1) +{ if (createpid==1) + { + print "">"/tmp/run/autoipsetadder/"domain + close("/tmp/run/autoipsetadder/"domain); + print("create"domain); + print(ip" "domain" 443"ipcount-1); + a[ip]=domain; + #正在使用的ip用最大延迟,最后探测,减少打断tcp的可能 + system("/usr/bin/autoipsetadder/testip.sh "ip" "domain" 443 "ipcount-1" &"); + delete ipcache[ipcount]; + createpid=0; + } + #未检测到443/80同域名缓存的ip进行测试,ipindex-1为测试延迟时间 + for (ipindex in ipcache){ + print(ipcache[ipindex]" "domain" 443 "ipindex-1); + a[ipcache[ipindex]]=domain; + system("/usr/bin/autoipsetadder/testip.sh "ipcache[ipindex]" "domain" 443 "ipindex-1" &"); + delete ipcache[ipindex]; + } + #后续同域名ip免nf_conntrack测试 + testall=443; +} +else if (tryhttp==1) +{ + if (createpid==1) + { + print "">"/tmp/run/autoipsetadder/"domain + close("/tmp/run/autoipsetadder/"domain); + print("create"domain); + print(ip" "domain" 80 "ipcount-1); + a[ip]=domain; + system("/usr/bin/autoipsetadder/testip.sh "ip" "domain" 80 "ipcount-1" &"); + delete ipcache[ipcount]; + createpid=0; + } + for (ipindex in ipcache){ + print(ipcache[ipindex]" "domain" 80 "ipindex-1); + a[ipcache[ipindex]]=domain; + system("/usr/bin/autoipsetadder/testip.sh "ipcache[ipindex]" "domain" 80 "ipindex-1" &"); + delete ipcache[ipindex]; + } + testall=80; +}} +}' >> $logfile \ No newline at end of file diff --git a/package/ctcgfw/luci-app-autoipsetadder/root/usr/bin/autoipsetadder/debugip.sh b/package/ctcgfw/luci-app-autoipsetadder/root/usr/bin/autoipsetadder/debugip.sh new file mode 100755 index 0000000000..177ef65740 --- /dev/null +++ b/package/ctcgfw/luci-app-autoipsetadder/root/usr/bin/autoipsetadder/debugip.sh @@ -0,0 +1,56 @@ +#!/bin/sh +PATH="/usr/sbin:/usr/bin:/sbin:/bin" +dlchina=$1; +logfile=$(uci get autoipsetadder.autoipsetadder.logfile) +[ -z "$logfile" ] && logfile="/tmp/addlist.log" + +dnslogfile=$(uci get autoipsetadder.autoipsetadder.dnslogfile) +[ -z "$logfile" ] && dnslogfile="/tmp/dnsmasq.log" + + +ipset list gfwlist | awk -v dlchina="$dlchina" -v dnslogfile="$dnslogfile" -v logfile="$logfile" '{ +if (index($0,".")==0) +{ + next; +} +if ($0=="127.0.0.1") {system("ipset d gfwlist 127.0.0.1");next;} +"ipset test whitelist "$0" 2>&1"| getline ipset; +close("ipset test whitelist "$0" 2>&1"); + if (index(ipset,"Warning")==0){ + white=0; + }else{ + white=1; + } + "ipset test china "$0" 2>&1"| getline ipset; + close("ipset test china "$0" 2>&1"); + if (index(ipset,"Warning")!=0){ + china=1; + } + else{ + china=0; + } + if (white==1) + { + if (china==0) + { + print("warning white ip not china"$0); + ret=system("grep "$0" "logfile); + if (ret!=0) + { + ret=system("grep "$0" "dnslogfile); + } + } + }else if (china==1) + { + print("warning china ip not white"$0); + ret=system("grep "$0" "logfile) + if (ret!=0) + { + ret=system("grep "$0" "dnslogfile); + } + if (dlchina) + { + system("ipset del gfwlist "$0); + } + } +}' \ No newline at end of file diff --git a/package/ctcgfw/luci-app-autoipsetadder/root/usr/bin/autoipsetadder/tailto.sh b/package/ctcgfw/luci-app-autoipsetadder/root/usr/bin/autoipsetadder/tailto.sh new file mode 100755 index 0000000000..ab70e3a6ef --- /dev/null +++ b/package/ctcgfw/luci-app-autoipsetadder/root/usr/bin/autoipsetadder/tailto.sh @@ -0,0 +1,4 @@ +#!/bin/sh +tail -n $1 "$2" > /var/run/tailtmp +cat /var/run/tailtmp > "$2" +rm /var/run/tailtmp \ No newline at end of file diff --git a/package/ctcgfw/luci-app-autoipsetadder/root/usr/bin/autoipsetadder/testip.sh b/package/ctcgfw/luci-app-autoipsetadder/root/usr/bin/autoipsetadder/testip.sh new file mode 100755 index 0000000000..dcdda2ddd1 --- /dev/null +++ b/package/ctcgfw/luci-app-autoipsetadder/root/usr/bin/autoipsetadder/testip.sh @@ -0,0 +1,182 @@ +#!/bin/sh +config=$(uci get autoipsetadder.autoipsetadder.config 2>/dev/null) +[ "${config//pingadd/}" == "$config" ] && pingadd="0" || pingadd="1" +echo $* | awk -v pingadd="$pingadd" '{ +if ($4=="") +{ +wait=0; +}else +{wait=$4;} +system("sleep "wait); +ERRNO=""; +pidfile="/tmp/run/autoipsetadder/"$2 +getline drop< pidfile; +close(pidfile); +if (ERRNO) { +addlist=0; +print("bypass"$1" "$2); +next;} +if ($3=="443") +{ +cmd=("httping -c 1 -t 4 -l "$2" --divert-connect "$1); +} +else if ($3=="80") +{ +cmd=("httping -c 1 -t 4 "$2" --divert-connect "$1); +} +addlist=0; +slow=0; +while ((cmd | getline ret) > 0) +{ + if (addlist!=0) + { + continue; + } + else if (index(ret,"short read")!=0) + { + if (system("httping -q -c 1 -t 4 -l "$2" --divert-connect "$1)==0) + { + addlist=-1; + break; + }else{ + print("doname rst autoaddip "$1" "$2); + addlist=1; + } + } + else if (index(ret,"timeout")!=0) + { + while ((cmd | getline ret) > 0) + { + if (index(ret,"timeout")!=0) + { + print("direct so slow autoaddip "$1" "$2); + addlist=1; + slow=1; + } + } + }else if (index(ret,"SSL handshake error: (null)")!=0) + { + if(system("curl -m 10 --resolve "$2":443:"$1" https://"$2" -o /dev/null 2>/dev/null")==0){ + addlist=-1; + break; + } + }else if (index(ret,"Connection refused")!=0){ + print("direct Connection refused autoaddip"$1" "$2); + addlist=1; + } +} +close(cmd); + +if (addlist!=1) +{ + if (addlist==0){ + split(ret, c,"[ /]+"); + print(c[6]); + if (c[6]=="failed,"){ + print("can not connect autoaddip "$1" "$2); + addlist=1; + } + else if (c[6]+0>10000) + { + print("direct ssl so slow autoaddip "$1" "$2); + addlist=1; + }else{ + addlist=-1;} + } + if (addlist==-1 && pingadd==1) + { + while (("ping -c 5 -q -A "$1 | getline ret) > 0) + { + if (index(ret,"packet loss")!=0) + { + split(ret, p,"[ ]+"); + if (p[4]>0 && p[4]<5) + { + print("ping packet loss autoaddip "$1" "$2); + pingloss=1; + addlist=1; + }else{pingloss=0;} + break; + } + } + close("ping -c 5 -q "$1); + } +} +ERRNO=""; +if (pingloss!=1){ + getline drop< pidfile; + close(pidfile); +} +if (ERRNO) {addlist=0;next;} +if (addlist==1){ +system("ipset add gfwlist "$1); +while ((cmd | getline ret) > 0) +{ + if (addlist==1) + { + if (index(ret,"short read")!=0) + { + system("ipset del gfwlist "$1); + print("doname proxy rst autodelip "$1" "$2); + addlist=-2; + } + else if (index(ret,"SSL handshake error: (null)")!=0) + { + if(system("curl -m 10 --resolve "$2":443:"$1" https://"$2" -o /dev/null 2>/dev/null")==0) + { + addlist=2; + } + } + } +} +close(cmd); +if (addlist==1){ + split(ret, c,"[ /]+"); + print(c[6]); + if (c[6]=="failed,") + { + system("ipset del gfwlist "$1); + print("proxy can not connect autodelip "$1" "$2); + addlist=-2; + }else{ + addlist=2; + } +} +} +}END{ +if (addlist==2) +{ if (pingloss==0){ + ERRNO=""; + getline drop< pidfile; + if (ERRNO) { + system("ipset del gfwlist "$1); + print("cancel add myself "$1" "$2" due to one ip success direct"); + }else{ + print $1"\n">>pidfile; + } + close(pidfile);} +}else if (addlist==-1) +{ + print($1" "$2" direct success"); + while ((getline ret< pidfile) > 0) + { + if (ret!=""){ + system("ipset del gfwlist "ret); + print("cancel add someone "ret" "$2" due to me"$1" success direct"); + } + } + close(pidfile); + system("rm "pidfile" 2>/dev/null"); + print($1" del "$2); +}else if (addlist==-2) +{ + system("sleep 10"); + while ((getline ret< pidfile) > 0) + { + if (ret!=""){ + system("ipset add gfwlist "$1); + print("add "ret" "$2" due to one ip success proxy"); + break;} + } + close(pidfile); +}}' \ No newline at end of file diff --git a/package/ctcgfw/luci-app-baidupcs-web/Makefile b/package/ctcgfw/luci-app-baidupcs-web/Makefile new file mode 100644 index 0000000000..54a29901ca --- /dev/null +++ b/package/ctcgfw/luci-app-baidupcs-web/Makefile @@ -0,0 +1,22 @@ +# +# +# +# Copyright (C) 2020 KFERMercer +# Copyright (C) 2020 [CTCGFW] Project OpenWRT +# +# THIS IS FREE SOFTWARE, LICENSED UNDER GPLv3. +# + +include $(TOPDIR)/rules.mk + +PKG_NAME:=luci-app-baidupcs-web +LUCI_TITLE:=LuCI support for BaiduPCS-Go +LUCI_DEPENDS:=+baidupcs-web +wget +openssl-util +LUCI_PKGARCH:=all +PKG_VERSION:=1.0 +PKG_RELEASE:=5 +PKG_MAINTAINER:= + +include $(TOPDIR)/feeds/luci/luci.mk + +# call BuildPackage - OpenWrt buildroot signature diff --git a/package/ctcgfw/luci-app-baidupcs-web/luasrc/controller/baidupcs-web.lua b/package/ctcgfw/luci-app-baidupcs-web/luasrc/controller/baidupcs-web.lua new file mode 100644 index 0000000000..805269dd16 --- /dev/null +++ b/package/ctcgfw/luci-app-baidupcs-web/luasrc/controller/baidupcs-web.lua @@ -0,0 +1,17 @@ +module("luci.controller.baidupcs-web", package.seeall) + +function index() + if not nixio.fs.access("/etc/config/baidupcs-web") then + return + end + entry({"admin", "nas", "baidupcs-web"}, cbi("baidupcs-web"), _("BaiduPCS Web"), 300).dependent = true + entry({"admin","nas","baidupcs-web","status"},call("act_status")).leaf=true +end + +function act_status() + local e={} + e.running=luci.sys.call("pgrep baidupcs-web >/dev/null")==0 + -- e.port=luci.sys.exec("uci get baidupcs-web.config.port") + luci.http.prepare_content("application/json") + luci.http.write_json(e) +end diff --git a/package/ctcgfw/luci-app-baidupcs-web/luasrc/model/cbi/baidupcs-web.lua b/package/ctcgfw/luci-app-baidupcs-web/luasrc/model/cbi/baidupcs-web.lua new file mode 100644 index 0000000000..c693aad02d --- /dev/null +++ b/package/ctcgfw/luci-app-baidupcs-web/luasrc/model/cbi/baidupcs-web.lua @@ -0,0 +1,48 @@ +--[[ + +Copyright (C) 2020 KFERMercer +Copyright (C) 2020 [CTCGFW] Project OpenWRT + +THIS IS FREE SOFTWARE, LICENSED UNDER GPLv3 + +]]-- + +m = Map("baidupcs-web") +m.title = translate("BaiduPCS-Web") +m.description = translate("基于BaiduPCS-Go, 可以让你高效的使用百度云") + +m:section(SimpleSection).template = "baidupcs-web/baidupcs-web_status" + +s = m:section(TypedSection, "baidupcs-web") +s.addremove = false +s.anonymous = true + +enable = s:option(Flag, "enabled", translate("启用")) +enable.rmempty = false + +o = s:option(Value, "port", translate("网页端口")) +o.datatype = "port" +o.placeholder = "5299" +o.default = "5299" +o.rmempty = false + +o = s:option(Value, "download_dir", translate("下载目录")) +o.placeholder = "/opt/baidupcsweb-download" +o.default = "/opt/baidupcsweb-download" +o.rmempty = false + +o = s:option(Value, "max_download_rate", translate("最大下载速度")) +o.placeholder = "0" + +o = s:option(Value, "max_upload_rate", translate("最大上传速度")) +o.placeholder = "0" +o.description = translate("0代表不限制, 单位为每秒的传输速率, 后缀'/s' 可省略, 如 2MB/s, 2MB, 2m, 2mb 均为一个意思") + +o = s:option(Value, "max_download_load", translate("同时进行下载文件的最大数量")) +o.placeholder = "1" +o.description = translate("不要太贪心, 当心被封号") + +o = s:option(Value, "max_parallel", translate("最大并发连接数")) +o.placeholder = "8" + +return m diff --git a/package/ctcgfw/luci-app-baidupcs-web/luasrc/view/baidupcs-web/baidupcs-web_status.htm b/package/ctcgfw/luci-app-baidupcs-web/luasrc/view/baidupcs-web/baidupcs-web_status.htm new file mode 100644 index 0000000000..168e66011d --- /dev/null +++ b/package/ctcgfw/luci-app-baidupcs-web/luasrc/view/baidupcs-web/baidupcs-web_status.htm @@ -0,0 +1,38 @@ + + + + +
+

+ <%:Collecting data...%> +

+
diff --git a/package/ctcgfw/luci-app-baidupcs-web/root/etc/config/baidupcs-web b/package/ctcgfw/luci-app-baidupcs-web/root/etc/config/baidupcs-web new file mode 100644 index 0000000000..fd78131ef4 --- /dev/null +++ b/package/ctcgfw/luci-app-baidupcs-web/root/etc/config/baidupcs-web @@ -0,0 +1,2 @@ + +config baidupcs-web 'config' diff --git a/package/ctcgfw/luci-app-baidupcs-web/root/etc/init.d/baidupcs-web b/package/ctcgfw/luci-app-baidupcs-web/root/etc/init.d/baidupcs-web new file mode 100755 index 0000000000..ad70df944d --- /dev/null +++ b/package/ctcgfw/luci-app-baidupcs-web/root/etc/init.d/baidupcs-web @@ -0,0 +1,32 @@ +#!/bin/sh /etc/rc.common + +START=90 +STOP=10 + +enabled="$(uci get baidupcs-web.config.enabled)" +port="$(uci get baidupcs-web.config.port)" +download_dir="$(uci get baidupcs-web.config.download_dir)" +max_download_rate="$(uci get baidupcs-web.config.max_download_rate || echo '0')" +max_upload_rate="$(uci get baidupcs-web.config.max_upload_rate || echo '0')" +max_download_load="$(uci get baidupcs-web.config.max_download_load || echo '1')" +max_parallel="$(uci get baidupcs-web.config.max_parallel || echo '8')" + +start() { + stop + [ "$enabled" == "1" ] || exit 0 + mkdir -p "${download_dir}" + baidupcs-web config set \ + --savedir "${download_dir}" \ + --max_download_rate "${max_download_rate}" \ + --max_upload_rate "${max_upload_rate}" \ + --max_download_load "${max_download_load}" \ + --max_parallel "${max_parallel}" \ + --max_upload_parallel "${max_parallel}" \ + >/dev/null 2>&1 + + baidupcs-web web --port "${port}" --access >/dev/null 2>&1 & +} + +stop() { + killall baidupcs-web >/dev/null 2>&1 +} diff --git a/package/ctcgfw/luci-app-baidupcs-web/root/etc/uci-defaults/luci-baidupcs-web b/package/ctcgfw/luci-app-baidupcs-web/root/etc/uci-defaults/luci-baidupcs-web new file mode 100755 index 0000000000..e72523b798 --- /dev/null +++ b/package/ctcgfw/luci-app-baidupcs-web/root/etc/uci-defaults/luci-baidupcs-web @@ -0,0 +1,11 @@ +#!/bin/sh + +uci -q batch <<-EOF >/dev/null + delete ucitrack.@baidupcs-web[-1] + add ucitrack baidupcs-web + set ucitrack.@baidupcs-web[-1].init=baidupcs-web + commit ucitrack +EOF + +rm -f /tmp/luci-indexcache +exit 0 diff --git a/package/ctcgfw/luci-app-chinadns/Makefile b/package/ctcgfw/luci-app-chinadns/Makefile new file mode 100644 index 0000000000..639b41e7c2 --- /dev/null +++ b/package/ctcgfw/luci-app-chinadns/Makefile @@ -0,0 +1,85 @@ +# +# Copyright (C) 2017 Ian Li +# +# This is free software, licensed under the GNU General Public License v3. +# See /LICENSE for more information. +# + +include $(TOPDIR)/rules.mk + +PKG_NAME:=luci-app-chinadns +PKG_VERSION:=2.0.1 +PKG_RELEASE:=1 + +PKG_LICENSE:=GPLv3 +PKG_LICENSE_FILES:=LICENSE +PKG_MAINTAINER:=Ian Li + +PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME) + +include $(INCLUDE_DIR)/package.mk + +define Package/luci-app-chinadns + SECTION:=luci + CATEGORY:=LuCI + SUBMENU:=3. Applications + TITLE:=LuCI Support for ChinaDNS + PKGARCH:=all + DEPENDS:=+ChinaDNS +curl +endef + +define Package/luci-app-chinadns/description + LuCI Support for ChinaDNS. +endef + +define Build/Prepare + $(foreach po,$(wildcard ${CURDIR}/files/luci/i18n/*.po), \ + po2lmo $(po) $(PKG_BUILD_DIR)/$(patsubst %.po,%.lmo,$(notdir $(po)));) +endef + +define Build/Configure +endef + +define Build/Compile +endef + +define Package/luci-app-chinadns/postinst +#!/bin/sh +if [ -z "$${IPKG_INSTROOT}" ]; then + if [ -f /etc/uci-defaults/luci-chinadns ]; then + ( . /etc/uci-defaults/luci-chinadns ) && \ + rm -f /etc/uci-defaults/luci-chinadns + fi + rm -rf /tmp/luci-indexcache +fi +exit 0 +endef + +define Package/luci-app-chinadns/postrm +#!/bin/sh +rm -f /tmp/luci-indexcache +exit 0 +endef + +define Package/luci-app-chinadns/conffiles +/etc/config/chinadns +endef + +define Package/luci-app-chinadns/install + $(INSTALL_DIR) $(1)/usr/lib/lua/luci/view/chinadns + $(INSTALL_DATA) ./files/luci/view/chinadns/chinadns_status.htm $(1)/usr/lib/lua/luci/view/chinadns/chinadns_status.htm + $(INSTALL_DIR) $(1)/usr/lib/lua/luci/i18n + $(INSTALL_DATA) $(PKG_BUILD_DIR)/chinadns.*.lmo $(1)/usr/lib/lua/luci/i18n/ + $(INSTALL_DIR) $(1)/usr/lib/lua/luci/controller + $(INSTALL_DATA) ./files/luci/controller/chinadns.lua $(1)/usr/lib/lua/luci/controller/chinadns.lua + $(INSTALL_DIR) $(1)/usr/lib/lua/luci/model/cbi/chinadns + $(INSTALL_DATA) ./files/luci/model/cbi/chinadns.lua $(1)/usr/lib/lua/luci/model/cbi/chinadns.lua + $(INSTALL_DIR) $(1)/etc/config + $(INSTALL_DATA) ./files/root/etc/config/chinadns $(1)/etc/config/chinadns + $(INSTALL_DIR) $(1)/etc/init.d + $(INSTALL_BIN) ./files/root/etc/init.d/chinadns $(1)/etc/init.d/chinadns + $(INSTALL_DIR) $(1)/etc/uci-defaults + $(INSTALL_BIN) ./files/root/etc/uci-defaults/luci-chinadns $(1)/etc/uci-defaults/luci-chinadns +endef + +$(eval $(call BuildPackage,luci-app-chinadns)) diff --git a/package/ctcgfw/luci-app-chinadns/files/luci/controller/chinadns.lua b/package/ctcgfw/luci-app-chinadns/files/luci/controller/chinadns.lua new file mode 100644 index 0000000000..cd8056a4c0 --- /dev/null +++ b/package/ctcgfw/luci-app-chinadns/files/luci/controller/chinadns.lua @@ -0,0 +1,21 @@ +-- Copyright (C) 2016 OpenWrt-dist +-- Copyright (C) 2016 Jian Chang +-- Licensed to the public under the GNU General Public License v3. + +module("luci.controller.chinadns", package.seeall) + +function index() + if not nixio.fs.access("/etc/config/chinadns") then + return + end + + entry({"admin", "services", "chinadns"}, cbi("chinadns"), _("ChinaDNS"), 70).dependent = true + entry({"admin", "services", "chinadns", "status"},call("act_status")).leaf=true +end + +function act_status() + local e={} + e.running=luci.sys.call("ps | grep /usr/sbin/chinadns | grep -v grep >/dev/null")==0 + luci.http.prepare_content("application/json") + luci.http.write_json(e) +end diff --git a/package/ctcgfw/luci-app-chinadns/files/luci/i18n/chinadns.zh-cn.po b/package/ctcgfw/luci-app-chinadns/files/luci/i18n/chinadns.zh-cn.po new file mode 100644 index 0000000000..7682c8ee76 --- /dev/null +++ b/package/ctcgfw/luci-app-chinadns/files/luci/i18n/chinadns.zh-cn.po @@ -0,0 +1,41 @@ +msgid "" +msgstr "Content-Type: text/plain; charset=UTF-8\n" + +msgid "ChinaDNS" +msgstr "ChinaDNS" + +msgid "CHNRoute File" +msgstr "国内路由表" + +msgid "Enable" +msgstr "启用" + +msgid "Used a proxy or not" +msgstr "是否使用了代理服务器" + +msgid "If you used a proxy like shadowsocks, please tick this option." +msgstr "如果您使用了类似SS的代理程序,请勾选此选项" + +msgid "Foreign Subnet" +msgstr "外网子网" + +msgid "Just foreign subnet. The local subnet will be automatically obtained." +msgstr "仅填写外网子网地址即可,本地子网地址会自动获取。" + +msgid "General Setting" +msgstr "基本设置" + +msgid "Local Port" +msgstr "本地端口" + +msgid "NOT RUNNING" +msgstr "未运行" + +msgid "RUNNING" +msgstr "运行中" + +msgid "Upstream Server" +msgstr "上游服务器" + +msgid "A DNS server with edns-client-subnet support required, fill one only!" +msgstr "需要具有edns-client-subnet支持的DNS服务器,仅限填写一个!" diff --git a/package/ctcgfw/luci-app-chinadns/files/luci/model/cbi/chinadns.lua b/package/ctcgfw/luci-app-chinadns/files/luci/model/cbi/chinadns.lua new file mode 100644 index 0000000000..66e1561d23 --- /dev/null +++ b/package/ctcgfw/luci-app-chinadns/files/luci/model/cbi/chinadns.lua @@ -0,0 +1,48 @@ +-- Copyright (C) 2016 OpenWrt-dist +-- Copyright (C) 2016 Jian Chang +-- Copyright (C) 2017 Ian Li +-- Licensed to the public under the GNU General Public License v3. + +m = Map("chinadns", translate("ChinaDNS")) +m:section(SimpleSection).template = "chinadns/chinadns_status" + +s = m:section(TypedSection, "chinadns", translate("General Setting")) +s.anonymous = true + +o = s:option(Flag, "enable", translate("Enable")) +o.rmempty = false + +o = s:option(Flag, "yn_use_proxy", + translate("Used a proxy or not"), + translate("If you used a proxy like shadowsocks, please tick this option.")) +o.rmenpty = false + +o = s:option(Value, "port", translate("Local Port")) +o.placeholder = 5353 +o.default = 5353 +o.datatype = "port" +o.rmempty = false + +o = s:option(Value, "chnroute", translate("CHNRoute File")) +o.placeholder = "/etc/chinadns_chnroute.txt" +o.default = "/etc/chinadns_chnroute.txt" +o.datatype = "file" +o.rmempty = false + +o = s:option(Value, "foreign_subnet", + translate("Foreign Subnet"), + translate("Just foreign subnet. The local subnet will be automatically obtained.")) +o.placeholder = "45.76.96.0" +o.default = "45.76.96.0" +o.datatype = "ipaddr" +o:depends("yn_use_proxy", 0) + +o = s:option(Value, "server", + translate("Upstream Server"), + translate("A DNS server with edns-client-subnet support required, fill one only!")) +o.placeholder = "8.8.8.8" +o.default = "8.8.8.8" +o.datatype = "ipaddr" +o.rmempty = false + +return m diff --git a/package/ctcgfw/luci-app-chinadns/files/luci/view/chinadns/chinadns_status.htm b/package/ctcgfw/luci-app-chinadns/files/luci/view/chinadns/chinadns_status.htm new file mode 100644 index 0000000000..6e63ee3b8b --- /dev/null +++ b/package/ctcgfw/luci-app-chinadns/files/luci/view/chinadns/chinadns_status.htm @@ -0,0 +1,22 @@ + + +
+

+ <%:Collecting data...%> +

+
diff --git a/package/ctcgfw/luci-app-chinadns/files/root/etc/config/chinadns b/package/ctcgfw/luci-app-chinadns/files/root/etc/config/chinadns new file mode 100644 index 0000000000..b7adc367aa --- /dev/null +++ b/package/ctcgfw/luci-app-chinadns/files/root/etc/config/chinadns @@ -0,0 +1,7 @@ +config chinadns + option chnroute '/etc/chinadns_chnroute.txt' + option enable '0' + option yn_use_proxy '0' + option port '5300' + option server '8.8.8.8' + option foreign_subnet '45.76.96.0' diff --git a/package/ctcgfw/luci-app-chinadns/files/root/etc/init.d/chinadns b/package/ctcgfw/luci-app-chinadns/files/root/etc/init.d/chinadns new file mode 100755 index 0000000000..589ce1680b --- /dev/null +++ b/package/ctcgfw/luci-app-chinadns/files/root/etc/init.d/chinadns @@ -0,0 +1,25 @@ +#!/bin/sh /etc/rc.common + +START=99 +STOP=10 + +chnroute="$(uci get chinadns.@chinadns[0].chnroute)" +enable="$(uci get chinadns.@chinadns[0].enable)" +port="$(uci get chinadns.@chinadns[0].port)" +server="$(uci get chinadns.@chinadns[0].server)" +yn_use_proxy="$(uci get chinadns.@chinadns[0].yn_use_proxy)" + +local_subnet="$(curl -4 -s members.3322.org/dyndns/getip | grep -oE '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.')0" +[ "${yn_use_proxy}" -eq "1" ] && foreign_subnet="$(curl -4 -s ip.sb | grep -oE '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.')0)" || foreign_subnet="$(uci get chinadns.@chinadns[0].foreign_subnet)" + +start() +{ + stop + [ "${enable}" -eq "0" ] && exit 0 + /usr/sbin/chinadns -p "${port}" -s "${server}" -c "${chnroute}" -e "${local_subnet},${foreign_subnet}" >/dev/null 2>&1 & +} + +stop() +{ + kill -9 "$(ps | grep "/usr/sbin/chinadns" | grep -v grep | awk '{print $1}')" >/dev/null 2>&1 +} diff --git a/package/ctcgfw/luci-app-chinadns/files/root/etc/uci-defaults/luci-chinadns b/package/ctcgfw/luci-app-chinadns/files/root/etc/uci-defaults/luci-chinadns new file mode 100755 index 0000000000..2309ac9612 --- /dev/null +++ b/package/ctcgfw/luci-app-chinadns/files/root/etc/uci-defaults/luci-chinadns @@ -0,0 +1,8 @@ +#!/bin/sh +uci -q batch <<-EOF >/dev/null + delete ucitrack.@chinands[-1] + add ucitrack chinadns + set ucitrack.@chinadns[-1].init=chinadns + commit ucitrack +EOF +exit 0 diff --git a/package/ctcgfw/luci-app-chinadns/tools/po2lmo/Makefile b/package/ctcgfw/luci-app-chinadns/tools/po2lmo/Makefile new file mode 100644 index 0000000000..ad2c133207 --- /dev/null +++ b/package/ctcgfw/luci-app-chinadns/tools/po2lmo/Makefile @@ -0,0 +1,12 @@ + +INSTALL = install +PREFIX = /usr/bin + +po2lmo: src/po2lmo.o src/template_lmo.o + $(CC) $(LDFLAGS) -o src/po2lmo src/po2lmo.o src/template_lmo.o + +install: + $(INSTALL) -m 755 src/po2lmo $(PREFIX) + +clean: + $(RM) src/po2lmo src/*.o diff --git a/package/ctcgfw/luci-app-chinadns/tools/po2lmo/src/po2lmo.c b/package/ctcgfw/luci-app-chinadns/tools/po2lmo/src/po2lmo.c new file mode 100644 index 0000000000..0da792b680 --- /dev/null +++ b/package/ctcgfw/luci-app-chinadns/tools/po2lmo/src/po2lmo.c @@ -0,0 +1,247 @@ +/* + * lmo - Lua Machine Objects - PO to LMO conversion tool + * + * Copyright (C) 2009-2012 Jo-Philipp Wich + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "template_lmo.h" + +static void die(const char *msg) +{ + fprintf(stderr, "Error: %s\n", msg); + exit(1); +} + +static void usage(const char *name) +{ + fprintf(stderr, "Usage: %s input.po output.lmo\n", name); + exit(1); +} + +static void print(const void *ptr, size_t size, size_t nmemb, FILE *stream) +{ + if( fwrite(ptr, size, nmemb, stream) == 0 ) + die("Failed to write stdout"); +} + +static int extract_string(const char *src, char *dest, int len) +{ + int pos = 0; + int esc = 0; + int off = -1; + + for( pos = 0; (pos < strlen(src)) && (pos < len); pos++ ) + { + if( (off == -1) && (src[pos] == '"') ) + { + off = pos + 1; + } + else if( off >= 0 ) + { + if( esc == 1 ) + { + switch (src[pos]) + { + case '"': + case '\\': + off++; + break; + } + dest[pos-off] = src[pos]; + esc = 0; + } + else if( src[pos] == '\\' ) + { + dest[pos-off] = src[pos]; + esc = 1; + } + else if( src[pos] != '"' ) + { + dest[pos-off] = src[pos]; + } + else + { + dest[pos-off] = '\0'; + break; + } + } + } + + return (off > -1) ? strlen(dest) : -1; +} + +static int cmp_index(const void *a, const void *b) +{ + uint32_t x = ((const lmo_entry_t *)a)->key_id; + uint32_t y = ((const lmo_entry_t *)b)->key_id; + + if (x < y) + return -1; + else if (x > y) + return 1; + + return 0; +} + +static void print_uint32(uint32_t x, FILE *out) +{ + uint32_t y = htonl(x); + print(&y, sizeof(uint32_t), 1, out); +} + +static void print_index(void *array, int n, FILE *out) +{ + lmo_entry_t *e; + + qsort(array, n, sizeof(*e), cmp_index); + + for (e = array; n > 0; n--, e++) + { + print_uint32(e->key_id, out); + print_uint32(e->val_id, out); + print_uint32(e->offset, out); + print_uint32(e->length, out); + } +} + +int main(int argc, char *argv[]) +{ + char line[4096]; + char key[4096]; + char val[4096]; + char tmp[4096]; + int state = 0; + int offset = 0; + int length = 0; + int n_entries = 0; + void *array = NULL; + lmo_entry_t *entry = NULL; + uint32_t key_id, val_id; + + FILE *in; + FILE *out; + + if( (argc != 3) || ((in = fopen(argv[1], "r")) == NULL) || ((out = fopen(argv[2], "w")) == NULL) ) + usage(argv[0]); + + memset(line, 0, sizeof(key)); + memset(key, 0, sizeof(val)); + memset(val, 0, sizeof(val)); + + while( (NULL != fgets(line, sizeof(line), in)) || (state >= 2 && feof(in)) ) + { + if( state == 0 && strstr(line, "msgid \"") == line ) + { + switch(extract_string(line, key, sizeof(key))) + { + case -1: + die("Syntax error in msgid"); + case 0: + state = 1; + break; + default: + state = 2; + } + } + else if( state == 1 || state == 2 ) + { + if( strstr(line, "msgstr \"") == line || state == 2 ) + { + switch(extract_string(line, val, sizeof(val))) + { + case -1: + state = 4; + break; + default: + state = 3; + } + } + else + { + switch(extract_string(line, tmp, sizeof(tmp))) + { + case -1: + state = 2; + break; + default: + strcat(key, tmp); + } + } + } + else if( state == 3 ) + { + switch(extract_string(line, tmp, sizeof(tmp))) + { + case -1: + state = 4; + break; + default: + strcat(val, tmp); + } + } + + if( state == 4 ) + { + if( strlen(key) > 0 && strlen(val) > 0 ) + { + key_id = sfh_hash(key, strlen(key)); + val_id = sfh_hash(val, strlen(val)); + + if( key_id != val_id ) + { + n_entries++; + array = realloc(array, n_entries * sizeof(lmo_entry_t)); + entry = (lmo_entry_t *)array + n_entries - 1; + + if (!array) + die("Out of memory"); + + entry->key_id = key_id; + entry->val_id = val_id; + entry->offset = offset; + entry->length = strlen(val); + + length = strlen(val) + ((4 - (strlen(val) % 4)) % 4); + + print(val, length, 1, out); + offset += length; + } + } + + state = 0; + memset(key, 0, sizeof(key)); + memset(val, 0, sizeof(val)); + } + + memset(line, 0, sizeof(line)); + } + + print_index(array, n_entries, out); + + if( offset > 0 ) + { + print_uint32(offset, out); + fsync(fileno(out)); + fclose(out); + } + else + { + fclose(out); + unlink(argv[2]); + } + + fclose(in); + return(0); +} diff --git a/package/ctcgfw/luci-app-chinadns/tools/po2lmo/src/template_lmo.c b/package/ctcgfw/luci-app-chinadns/tools/po2lmo/src/template_lmo.c new file mode 100644 index 0000000000..27205a7228 --- /dev/null +++ b/package/ctcgfw/luci-app-chinadns/tools/po2lmo/src/template_lmo.c @@ -0,0 +1,328 @@ +/* + * lmo - Lua Machine Objects - Base functions + * + * Copyright (C) 2009-2010 Jo-Philipp Wich + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "template_lmo.h" + +/* + * Hash function from http://www.azillionmonkeys.com/qed/hash.html + * Copyright (C) 2004-2008 by Paul Hsieh + */ + +uint32_t sfh_hash(const char *data, int len) +{ + uint32_t hash = len, tmp; + int rem; + + if (len <= 0 || data == NULL) return 0; + + rem = len & 3; + len >>= 2; + + /* Main loop */ + for (;len > 0; len--) { + hash += sfh_get16(data); + tmp = (sfh_get16(data+2) << 11) ^ hash; + hash = (hash << 16) ^ tmp; + data += 2*sizeof(uint16_t); + hash += hash >> 11; + } + + /* Handle end cases */ + switch (rem) { + case 3: hash += sfh_get16(data); + hash ^= hash << 16; + hash ^= data[sizeof(uint16_t)] << 18; + hash += hash >> 11; + break; + case 2: hash += sfh_get16(data); + hash ^= hash << 11; + hash += hash >> 17; + break; + case 1: hash += *data; + hash ^= hash << 10; + hash += hash >> 1; + } + + /* Force "avalanching" of final 127 bits */ + hash ^= hash << 3; + hash += hash >> 5; + hash ^= hash << 4; + hash += hash >> 17; + hash ^= hash << 25; + hash += hash >> 6; + + return hash; +} + +uint32_t lmo_canon_hash(const char *str, int len) +{ + char res[4096]; + char *ptr, prev; + int off; + + if (!str || len >= sizeof(res)) + return 0; + + for (prev = ' ', ptr = res, off = 0; off < len; prev = *str, off++, str++) + { + if (isspace(*str)) + { + if (!isspace(prev)) + *ptr++ = ' '; + } + else + { + *ptr++ = *str; + } + } + + if ((ptr > res) && isspace(*(ptr-1))) + ptr--; + + return sfh_hash(res, ptr - res); +} + +lmo_archive_t * lmo_open(const char *file) +{ + int in = -1; + uint32_t idx_offset = 0; + struct stat s; + + lmo_archive_t *ar = NULL; + + if (stat(file, &s) == -1) + goto err; + + if ((in = open(file, O_RDONLY)) == -1) + goto err; + + if ((ar = (lmo_archive_t *)malloc(sizeof(*ar))) != NULL) + { + memset(ar, 0, sizeof(*ar)); + + ar->fd = in; + ar->size = s.st_size; + + fcntl(ar->fd, F_SETFD, fcntl(ar->fd, F_GETFD) | FD_CLOEXEC); + + if ((ar->mmap = mmap(NULL, ar->size, PROT_READ, MAP_SHARED, ar->fd, 0)) == MAP_FAILED) + goto err; + + idx_offset = ntohl(*((const uint32_t *) + (ar->mmap + ar->size - sizeof(uint32_t)))); + + if (idx_offset >= ar->size) + goto err; + + ar->index = (lmo_entry_t *)(ar->mmap + idx_offset); + ar->length = (ar->size - idx_offset - sizeof(uint32_t)) / sizeof(lmo_entry_t); + ar->end = ar->mmap + ar->size; + + return ar; + } + +err: + if (in > -1) + close(in); + + if (ar != NULL) + { + if ((ar->mmap != NULL) && (ar->mmap != MAP_FAILED)) + munmap(ar->mmap, ar->size); + + free(ar); + } + + return NULL; +} + +void lmo_close(lmo_archive_t *ar) +{ + if (ar != NULL) + { + if ((ar->mmap != NULL) && (ar->mmap != MAP_FAILED)) + munmap(ar->mmap, ar->size); + + close(ar->fd); + free(ar); + + ar = NULL; + } +} + + +lmo_catalog_t *_lmo_catalogs = NULL; +lmo_catalog_t *_lmo_active_catalog = NULL; + +int lmo_load_catalog(const char *lang, const char *dir) +{ + DIR *dh = NULL; + char pattern[16]; + char path[PATH_MAX]; + struct dirent *de = NULL; + + lmo_archive_t *ar = NULL; + lmo_catalog_t *cat = NULL; + + if (!lmo_change_catalog(lang)) + return 0; + + if (!dir || !(dh = opendir(dir))) + goto err; + + if (!(cat = malloc(sizeof(*cat)))) + goto err; + + memset(cat, 0, sizeof(*cat)); + + snprintf(cat->lang, sizeof(cat->lang), "%s", lang); + snprintf(pattern, sizeof(pattern), "*.%s.lmo", lang); + + while ((de = readdir(dh)) != NULL) + { + if (!fnmatch(pattern, de->d_name, 0)) + { + snprintf(path, sizeof(path), "%s/%s", dir, de->d_name); + ar = lmo_open(path); + + if (ar) + { + ar->next = cat->archives; + cat->archives = ar; + } + } + } + + closedir(dh); + + cat->next = _lmo_catalogs; + _lmo_catalogs = cat; + + if (!_lmo_active_catalog) + _lmo_active_catalog = cat; + + return 0; + +err: + if (dh) closedir(dh); + if (cat) free(cat); + + return -1; +} + +int lmo_change_catalog(const char *lang) +{ + lmo_catalog_t *cat; + + for (cat = _lmo_catalogs; cat; cat = cat->next) + { + if (!strncmp(cat->lang, lang, sizeof(cat->lang))) + { + _lmo_active_catalog = cat; + return 0; + } + } + + return -1; +} + +static lmo_entry_t * lmo_find_entry(lmo_archive_t *ar, uint32_t hash) +{ + unsigned int m, l, r; + uint32_t k; + + l = 0; + r = ar->length - 1; + + while (1) + { + m = l + ((r - l) / 2); + + if (r < l) + break; + + k = ntohl(ar->index[m].key_id); + + if (k == hash) + return &ar->index[m]; + + if (k > hash) + { + if (!m) + break; + + r = m - 1; + } + else + { + l = m + 1; + } + } + + return NULL; +} + +int lmo_translate(const char *key, int keylen, char **out, int *outlen) +{ + uint32_t hash; + lmo_entry_t *e; + lmo_archive_t *ar; + + if (!key || !_lmo_active_catalog) + return -2; + + hash = lmo_canon_hash(key, keylen); + + for (ar = _lmo_active_catalog->archives; ar; ar = ar->next) + { + if ((e = lmo_find_entry(ar, hash)) != NULL) + { + *out = ar->mmap + ntohl(e->offset); + *outlen = ntohl(e->length); + return 0; + } + } + + return -1; +} + +void lmo_close_catalog(const char *lang) +{ + lmo_archive_t *ar, *next; + lmo_catalog_t *cat, *prev; + + for (prev = NULL, cat = _lmo_catalogs; cat; prev = cat, cat = cat->next) + { + if (!strncmp(cat->lang, lang, sizeof(cat->lang))) + { + if (prev) + prev->next = cat->next; + else + _lmo_catalogs = cat->next; + + for (ar = cat->archives; ar; ar = next) + { + next = ar->next; + lmo_close(ar); + } + + free(cat); + break; + } + } +} diff --git a/package/ctcgfw/luci-app-chinadns/tools/po2lmo/src/template_lmo.h b/package/ctcgfw/luci-app-chinadns/tools/po2lmo/src/template_lmo.h new file mode 100644 index 0000000000..57f59aa56b --- /dev/null +++ b/package/ctcgfw/luci-app-chinadns/tools/po2lmo/src/template_lmo.h @@ -0,0 +1,92 @@ +/* + * lmo - Lua Machine Objects - General header + * + * Copyright (C) 2009-2012 Jo-Philipp Wich + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef _TEMPLATE_LMO_H_ +#define _TEMPLATE_LMO_H_ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#if (defined(__GNUC__) && defined(__i386__)) +#define sfh_get16(d) (*((const uint16_t *) (d))) +#else +#define sfh_get16(d) ((((uint32_t)(((const uint8_t *)(d))[1])) << 8)\ + +(uint32_t)(((const uint8_t *)(d))[0]) ) +#endif + + +struct lmo_entry { + uint32_t key_id; + uint32_t val_id; + uint32_t offset; + uint32_t length; +} __attribute__((packed)); + +typedef struct lmo_entry lmo_entry_t; + + +struct lmo_archive { + int fd; + int length; + uint32_t size; + lmo_entry_t *index; + char *mmap; + char *end; + struct lmo_archive *next; +}; + +typedef struct lmo_archive lmo_archive_t; + + +struct lmo_catalog { + char lang[6]; + struct lmo_archive *archives; + struct lmo_catalog *next; +}; + +typedef struct lmo_catalog lmo_catalog_t; + + +uint32_t sfh_hash(const char *data, int len); +uint32_t lmo_canon_hash(const char *data, int len); + +lmo_archive_t * lmo_open(const char *file); +void lmo_close(lmo_archive_t *ar); + + +extern lmo_catalog_t *_lmo_catalogs; +extern lmo_catalog_t *_lmo_active_catalog; + +int lmo_load_catalog(const char *lang, const char *dir); +int lmo_change_catalog(const char *lang); +int lmo_translate(const char *key, int keylen, char **out, int *outlen); +void lmo_close_catalog(const char *lang); + +#endif diff --git a/package/ctcgfw/luci-app-diskman/Makefile b/package/ctcgfw/luci-app-diskman/Makefile new file mode 100644 index 0000000000..b40ddbcffe --- /dev/null +++ b/package/ctcgfw/luci-app-diskman/Makefile @@ -0,0 +1,46 @@ +include $(TOPDIR)/rules.mk + +PKG_NAME:=luci-app-diskman +PKG_VERSION:=v0.1.8 +PKG_RELEASE:=beta +PKG_MAINTAINER:=lisaac +PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME) +PKG_LICENSE:=Apache-2.0 + +include $(INCLUDE_DIR)/package.mk + +define Package/$(PKG_NAME) + SECTION:=luci + CATEGORY:=LuCI + SUBMENU:=3. Applications + TITLE:=Disk Manager interface for LuCI + PKGARCH:=all + DEPENDS:=+e2fsprogs +parted +smartmontools +blkid +endef + +define Package/$(PKG_NAME)/description + Disk Manager interface for LuCI +endef + +define Build/Prepare +endef + +define Build/Compile +endef + +define Package/$(PKG_NAME)/postinst +#!/bin/sh +rm -fr /tmp/luci-indexcache /tmp/luci-modulecache +endef + +define Package/$(PKG_NAME)/install + $(INSTALL_DIR) $(1)/usr/lib/lua/luci + cp -pR ./luasrc/* $(1)/usr/lib/lua/luci + # $(INSTALL_DIR) $(1)/ + # cp -pR ./root/* $(1)/ + $(INSTALL_DIR) $(1)/usr/lib/lua/luci/i18n + po2lmo ./po/zh-cn/diskman.po $(1)/usr/lib/lua/luci/i18n/diskman.zh-cn.lmo + po2lmo ./po/pl/diskman.po $(1)/usr/lib/lua/luci/i18n/diskman.pl.lmo +endef + +$(eval $(call BuildPackage,$(PKG_NAME))) diff --git a/package/ctcgfw/luci-app-diskman/depends.lst b/package/ctcgfw/luci-app-diskman/depends.lst new file mode 100644 index 0000000000..42b5f0cf0e --- /dev/null +++ b/package/ctcgfw/luci-app-diskman/depends.lst @@ -0,0 +1 @@ +e2fsprogs parted smartmontools blkid \ No newline at end of file diff --git a/package/ctcgfw/luci-app-diskman/luasrc/controller/diskman.lua b/package/ctcgfw/luci-app-diskman/luasrc/controller/diskman.lua new file mode 100644 index 0000000000..a1e876240e --- /dev/null +++ b/package/ctcgfw/luci-app-diskman/luasrc/controller/diskman.lua @@ -0,0 +1,136 @@ +--[[ +LuCI - Lua Configuration Interface +Copyright 2019 lisaac +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 +$Id$ +]]-- + +require "luci.util" +module("luci.controller.diskman",package.seeall) + +function index() + -- check all used executables in disk management are existed + local CMD = {"parted", "blkid", "smartctl"} + local executables_all_existed = true + for _, cmd in ipairs(CMD) do + local command = luci.sys.exec("/usr/bin/which " .. cmd) + if not command:match(cmd) then + executables_all_existed = false + break + end + end + + if not executables_all_existed then return end + -- entry(path, target, title, order) + -- set leaf attr to true to pass argument throughe url (e.g. admin/system/disk/partition/sda) + entry({"admin", "system", "diskman"}, alias("admin", "system", "diskman", "disks"), _("Disk Man"), 55) + entry({"admin", "system", "diskman", "disks"}, form("diskman/disks"), nil).leaf = true + entry({"admin", "system", "diskman", "partition"}, form("diskman/partition"), nil).leaf = true + entry({"admin", "system", "diskman", "get_disk_info"}, call("get_disk_info"), nil).leaf = true + entry({"admin", "system", "diskman", "mk_p_table"}, call("mk_p_table"), nil).leaf = true + entry({"admin", "system", "diskman", "smartdetail"}, call("smart_detail"), nil).leaf = true + entry({"admin", "system", "diskman", "smartattr"}, call("smart_attr"), nil).leaf = true +end + +function get_disk_info(dev) + if not dev then + luci.http.status(500, "no device") + luci.http.write_json("no device") + return + elseif not nixio.fs.access("/dev/"..dev) then + luci.http.status(500, "no device") + luci.http.write_json("no device") + return + end + local dm = require "luci.model.diskman" + local device_info = dm.get_disk_info(dev) + luci.http.status(200, "ok") + luci.http.prepare_content("application/json") + luci.http.write_json(device_info) +end + +function mk_p_table() + local p_table = luci.http.formvalue("p_table") + local dev = luci.http.formvalue("dev") + if not dev then + luci.http.status(500, "no device") + luci.http.write_json("no device") + return + elseif not nixio.fs.access("/dev/"..dev) then + luci.http.status(500, "no device") + luci.http.write_json("no device") + return + end + local dm = require "luci.model.diskman" + if p_table == "GPT" or p_table == "MBR" then + p_table = p_table == "MBR" and "msdos" or "gpt" + local res = luci.sys.call(dm.command.parted .. " -s /dev/" .. dev .. " mktable ".. p_table) + if res == 0 then + luci.http.status(200, "ok") + else + luci.http.status(500, "command exec error") + end + luci.http.prepare_content("application/json") + luci.http.write_json({code=res}) + else + luci.http.status(404, "not support") + luci.http.prepare_content("application/json") + luci.http.write_json({code="1"}) + end +end + +function smart_detail(dev) + luci.template.render("diskman/smart_detail", {dev=dev}) +end + +function smart_attr(dev) + local dm = require "luci.model.diskman" + local cmd = io.popen(dm.command.smartctl .. " --attributes /dev/%s" % dev) + if cmd then + local attr = { } + if dev:match("nvme")then + while true do + local ln = cmd:read("*l") + if not ln then + break + elseif ln:match("^(.-):%s+(.+)") then + local key, value = ln:match("^(.-):%s+(.+)") + attr[#attr+1]= { + key = key, + value = value + } + end + end + else + while true do + local ln = cmd:read("*l") + if not ln then + break + elseif ln:match("^.*%d+%s+.+%s+.+%s+.+%s+.+%s+.+%s+.+%s+.+%s+.+%s+.+") then + local id,attrbute,flag,value,worst,thresh,type,updated,raw = ln:match("^%s*(%d+)%s+([%a%p]+)%s+(%w+)%s+(%d+)%s+(%d+)%s+(%d+)%s+([%a%p]+)%s+(%a+)%s+[%w%p]+%s+(.+)") + id= "%x" % id + if not id:match("^%w%w") then + id = "0%s" % id + end + attr[#attr+1]= { + id = id:upper(), + attrbute = attrbute, + flag = flag, + value = value, + worst = worst, + thresh = thresh, + type = type, + updated = updated, + raw = raw + } + end + end + end + cmd:close() + luci.http.prepare_content("application/json") + luci.http.write_json(attr) + end +end \ No newline at end of file diff --git a/package/ctcgfw/luci-app-diskman/luasrc/model/cbi/diskman/disks.lua b/package/ctcgfw/luci-app-diskman/luasrc/model/cbi/diskman/disks.lua new file mode 100644 index 0000000000..5ed0df6773 --- /dev/null +++ b/package/ctcgfw/luci-app-diskman/luasrc/model/cbi/diskman/disks.lua @@ -0,0 +1,265 @@ +--[[ +LuCI - Lua Configuration Interface +Copyright 2019 lisaac +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 +$Id$ +]]-- + +require "luci.util" +require("luci.tools.webadmin") +local dm = require "luci.model.diskman" + +-- Use (non-UCI) SimpleForm since we have no related config file +m = SimpleForm("diskman", translate("DiskMan"), translate("Manage Disks over LuCI.")) +m.template = "diskman/cbi/xsimpleform" +-- m:append(Template("diskman/disk_info")) +-- disable submit and reset button +m.submit = false +m.reset = false +-- rescan disks +rescan = m:section(SimpleSection) +rescan_button = rescan:option(Button, "_rescan") +rescan_button.inputtitle= translate("Rescan Disks") +rescan_button.template = "diskman/cbi/inlinebutton" +rescan_button.inputstyle = "add" +rescan_button.forcewrite = true +rescan_button.write = function(self, section, value) + luci.util.exec("echo '- - -' | tee /sys/class/scsi_host/host*/scan > /dev/null") + if dm.command.mdadm then + luci.util.exec(dm.command.mdadm .. " --assemble --scan") + end + luci.http.redirect(luci.dispatcher.build_url("admin/system/diskman")) +end + +-- disks +local disks = dm.list_devices() +d = m:section(Table, disks, translate("Disks")) +d.config = "disk" +-- option(type, id(key of table), text) +d:option(DummyValue, "path", translate("Path")) +d:option(DummyValue, "model", translate("Model")) +d:option(DummyValue, "sn", translate("Serial Number")) +d:option(DummyValue, "size_formated", translate("Size")) +d:option(DummyValue, "temp", translate("Temp")) +-- d:option(DummyValue, "sec_size", translate("Sector Size ")) +d:option(DummyValue, "p_table", translate("Partition Table")) +d:option(DummyValue, "sata_ver", translate("SATA Version")) +-- d:option(DummyValue, "rota_rate", translate("Rotation Rate")) +d:option(DummyValue, "health", translate("Health")) +d:option(DummyValue, "status", translate("Status")) + +d.extedit = luci.dispatcher.build_url("admin/system/diskman/partition/%s") + +-- raid devices +if dm.command.mdadm then + local raid_devices = dm.list_raid_devices() + -- raid_devices = diskmanager.getRAIDdevices() + if next(raid_devices) ~= nil then + local r = m:section(Table, raid_devices, translate("RAID Devices")) + r.config = "_raid" + r:option(DummyValue, "path", translate("Path")) + r:option(DummyValue, "level", translate("RAID mode")) + r:option(DummyValue, "size_formated", translate("Size")) + r:option(DummyValue, "p_table", translate("Partition Table")) + r:option(DummyValue, "status", translate("Status")) + r:option(DummyValue, "members_str", translate("Members")) + r:option(DummyValue, "active", translate("Active")) + -- local redit = r:option(Button, "rpartition") + -- redit.inputstyle = "edit" + -- redit.inputtitle = "Edit" + -- redit.write = function(self, section) + -- local url = luci.dispatcher.build_url("admin/system/diskman/partition") + -- url = url .. "/" .. raid_devices[section].path:match("/dev/(.+)") + -- luci.http.redirect(url) + -- end + r.extedit = luci.dispatcher.build_url("admin/system/diskman/partition/%s") + end + +end + +--tabs +tab_section = m:section(SimpleSection) +tab_section.tabs = { + mount_point = translate("Mount Point") +} +tab_section.default_tab = "mount_point" +tab_section.template="diskman/disk_info_tab" + +-- raid functions +if dm.command.mdadm then + local rname, rmembers, rlevel + tab_section.tabs.raid = translate("Raid") + local r = m:section(SimpleSection, translate("RAID Creation")) + r.template="diskman/cbi/xnullsection" + r.config = "raid" + local r_name = r:option(Value, "_name", translate("Raid Name")) + r_name.placeholder = "/dev/md0" + r_name.write = function(self, section, value) + rname = value + end + local r_level = r:option(ListValue, "_level", translate("Raid Level")) + local valid_raid = luci.util.exec("lsmod | grep md_mod") + if valid_raid:match("linear") then + r_level:value("linear", "Linear") + end + if valid_raid:match("raid456") then + r_level:value("5", "Raid 5") + r_level:value("6", "Raid 6") + end + if valid_raid:match("raid1") then + r_level:value("1", "Raid 1") + end + if valid_raid:match("raid0") then + r_level:value("0", "Raid 0") + end + if valid_raid:match("raid10") then + r_level:value("10", "Raid 10") + end + r_level.write = function(self, section, value) + rlevel = value + end + local r_member = r:option(DynamicList, "_member", translate("Raid Member")) + for dev, info in pairs(disks) do + if not info.inuse and #info.partitions == 0 then + r_member:value(info.path, info.path.. " ".. info.size_formated) + end + for i, v in ipairs(info.partitions) do + if not v.inuse then + r_member:value("/dev/".. v.name, "/dev/".. v.name .. " ".. v.size_formated) + end + end + end + r_member.write = function(self, section, value) + rmembers = value + end + local r_create = r:option(Button, "_create") + r_create.render = function(self, section, scope) + self.title = " " + self.inputtitle = translate("Create Raid") + self.inputstyle = "add" + Button.render(self, section, scope) + end + r_create.write = function(self, section, value) + -- mdadm --create --verbose /dev/md0 --level=stripe --raid-devices=2 /dev/sdb6 /dev/sdc5 + local res = dm.create_raid(rname, rlevel, rmembers) + if res:match("^ERR") then + m.errmessage = translate(res) + return + end + dm.gen_mdadm_config() + luci.http.redirect(luci.dispatcher.build_url("admin/system/diskman")) + end +end + +-- mount point +local mount_point = dm.get_mount_points() +local _mount_point = {} +table.insert( mount_point, { device = 0 } ) +local table_mp = m:section(Table, mount_point, translate("Mount Point")) +table_mp.config = "mount_point" +local v_device = table_mp:option(Value, "device", translate("Device")) +v_device.render = function(self, section, scope) + if mount_point[section].device == 0 then + self.template = "cbi/value" + self.forcewrite = true + Value.render(self, section, scope) + else + self.template = "cbi/dvalue" + DummyValue.render(self, section, scope) + end +end +v_device.write = function(self, section, value) + _mount_point.device = value and value:gsub("%s+", "") or "" +end +local v_fs = table_mp:option(Value, "fs", translate("File System")) +v_fs.render = function(self, section, scope) + if mount_point[section].device == 0 then + self.template = "cbi/value" + self:value("auto", "auto") + self.default = "auto" + self.forcewrite = true + Value.render(self, section, scope) + else + self.template = "cbi/dvalue" + DummyValue.render(self, section, scope) + end +end +v_fs.write = function(self, section, value) + _mount_point.fs = value and value:gsub("%s+", "") or "" +end +local v_mount_option = table_mp:option(Value, "mount_options", translate("Mount Options")) +v_mount_option.render = function(self, section, scope) + if mount_point[section].device == 0 then + self.template = "cbi/value" + self.placeholder = "rw,noauto" + self.forcewrite = true + Value.render(self, section, scope) + else + self.template = "cbi/dvalue" + local mp = mount_point[section].mount_options + mount_point[section].mount_options = nil + for k in mp:gmatch("([^,]+)") do + mount_point[section].mount_options = mount_point[section].mount_options and mount_point[section].mount_options .. "," or "" + if #mount_point[section].mount_options > 50 then mount_point[section].mount_options = mount_point[section].mount_options.. " " end + mount_point[section].mount_options= mount_point[section].mount_options.. k + end + -- mount_point[section].mount_options = #mount_point[section].mount_options > 50 and mount_point[section].mount_options:sub(1,50) .. "..." or mount_point[section].mount_options + DummyValue.render(self, section, scope) + end +end +v_mount_option.write = function(self, section, value) + _mount_point.mount_options = value and value:gsub("%s+", "") or "" +end +local v_mount_point = table_mp:option(Value, "mount_point", translate("Mount Point")) +v_mount_point.render = function(self, section, scope) + if mount_point[section].device == 0 then + self.template = "cbi/value" + self.placeholder = "/media/diskX" + self.forcewrite = true + Value.render(self, section, scope) + else + self.template = "cbi/dvalue" + DummyValue.render(self, section, scope) + end +end +v_mount_point.write = function(self, section, value) + _mount_point.mount_point = value +end +local btn_umount = table_mp:option(Button, "_mount", translate("Mount")) +btn_umount.forcewrite = true +btn_umount.render = function(self, section, scope) + if mount_point[section].device == 0 then + self.inputtitle = translate("Mount") + btn_umount.inputstyle = "add" + else + self.inputtitle = translate("Umount") + btn_umount.inputstyle = "remove" + end + Button.render(self, section, scope) +end +btn_umount.write = function(self, section, value) + local res + if value == translate("Mount") then + luci.util.exec("mkdir -p ".. _mount_point.mount_point) + res = luci.util.exec("mount ".. _mount_point.device .. (_mount_point.fs and (" -t ".. _mount_point.fs )or "") .. (_mount_point.mount_options and (" -o " .. _mount_point.mount_options.. " ") or " ").._mount_point.mount_point .. " 2>&1") + elseif value == translate("Umount") then + res = luci.util.exec("umount "..mount_point[section].mount_point .. " 2>&1") + end + if res:match("^mount:") then + m.errmessage = luci.util.pcdata(res) + else + luci.http.redirect(luci.dispatcher.build_url("admin/system/diskman")) + end +end + +-- -- btrfs +if dm.command.btrfs then + tab_section.tabs.btrfs = translate("Btrfs") + local btrfs_devices = {} + local table_btrfs = m:section(Table, btrfs_devices, translate("Btrfs")) + table_btrfs.config = "btrfs" +end +return m diff --git a/package/ctcgfw/luci-app-diskman/luasrc/model/cbi/diskman/partition.lua b/package/ctcgfw/luci-app-diskman/luasrc/model/cbi/diskman/partition.lua new file mode 100644 index 0000000000..9de1a98dc3 --- /dev/null +++ b/package/ctcgfw/luci-app-diskman/luasrc/model/cbi/diskman/partition.lua @@ -0,0 +1,332 @@ +--[[ +LuCI - Lua Configuration Interface +Copyright 2019 lisaac +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 +$Id$ +]]-- + +require "luci.util" +require("luci.tools.webadmin") +local dm = require "luci.model.diskman" +local dev = arg[1] + +if not dev then + luci.http.redirect(luci.dispatcher.build_url("admin/system/diskman")) +elseif not nixio.fs.access("/dev/"..dev) then + luci.http.redirect(luci.dispatcher.build_url("admin/system/diskman")) +end + +m = SimpleForm("partition", translate("Partition Management"), translate("Partition Disk over LuCI.")) +m.template = "diskman/cbi/xsimpleform" +m.redirect = luci.dispatcher.build_url("admin/system/diskman") +m:append(Template("diskman/partition_info")) +-- disable submit and reset button +m.submit = false +m.reset = false + +local disk_info = dm.get_disk_info(dev, true) +local format_cmd = dm.get_format_cmd() + +s = m:section(Table, {disk_info}, translate("Device Info")) +-- s:option(DummyValue, "key") +-- s:option(DummyValue, "value") +s:option(DummyValue, "path", translate("Path")) +s:option(DummyValue, "model", translate("Model")) +s:option(DummyValue, "sn", translate("Serial Number")) +s:option(DummyValue, "size_formated", translate("Size")) +s:option(DummyValue, "sec_size", translate("Sector Size ")) +local dv_p_table = s:option(ListValue, "p_table", translate("Partition Table")) +dv_p_table.render = function(self, section, scope) + if not disk_info.p_table:match("Raid") and (#disk_info.partitions == 0 or (#disk_info.partitions == 1 and disk_info.partitions[1].number == -1)) then + self:value(disk_info.p_table, disk_info.p_table) + self:value("GPT", "GPT") + self:value("MBR", "MBR") + self.default = disk_info.p_table + ListValue.render(self, section, scope) + else + self.template = "cbi/dvalue" + DummyValue.render(self, section, scope) + end +end +if disk_info.type:match("md") then + s:option(DummyValue, "level", translate("Level")) + s:option(DummyValue, "members_str", translate("Members")) +else + s:option(DummyValue, "temp", translate("Temp")) + s:option(DummyValue, "sata_ver", translate("SATA Version")) + s:option(DummyValue, "rota_rate", translate("Rotation Rate")) +end +s:option(DummyValue, "status", translate("Status")) +local btn_health = s:option(Button, "health", translate("Health")) +btn_health.render = function(self, section, scope) + if disk_info.health then + self.inputtitle = disk_info.health + if disk_info.health == "PASSED" then + self.inputstyle = "add" + else + self.inputstyle = "remove" + end + Button.render(self, section, scope) + else + self.template = "cbi/dvalue" + DummyValue.render(self, section, scope) + end +end + +local btn_eject = s:option(Button, "_eject") +btn_eject.template = "diskman/cbi/disabled_button" +btn_eject.inputstyle = "remove" +btn_eject.render = function(self, section, scope) + for i, p in ipairs(disk_info.partitions) do + if p.mount_point ~= "-" then + self.view_disabled = true + break + end + end + if disk_info.p_table:match("Raid") then + self.view_disabled = true + end + if disk_info.type:match("md") then + btn_eject.inputtitle = translate("Remove") + else + btn_eject.inputtitle = translate("Eject") + end + Button.render(self, section, scope) +end +btn_eject.forcewrite = true +btn_eject.write = function(self, section, value) + for i, p in ipairs(disk_info.partitions) do + if p.mount_point ~= "-" then + m.errmessage = p.name .. "is in use! please unmount it first!" + return + end + end + if disk_info.type:match("md") then + luci.util.exec(dm.command.mdadm .. " --stop /dev/" .. dev) + luci.util.exec(dm.command.mdadm .. " --remove /dev/" .. dev) + for _, disk in ipairs(disk_info.members) do + luci.util.exec(dm.command.mdadm .. " --zero-superblock " .. disk) + end + dm.gen_mdadm_config() + else + luci.util.exec("echo 1 > /sys/block/" .. dev .. "/device/delete") + end + luci.http.redirect(luci.dispatcher.build_url("admin/system/diskman")) +end +-- eject: echo 1 > /sys/block/(device)/device/delete +-- rescan: echo '- - -' | tee /sys/class/scsi_host/host*/scan > /dev/null + + +-- partitions info +if not disk_info.p_table:match("Raid") then + s_partition_table = m:section(Table, disk_info.partitions, translate("Partitions Info"), translate("Default 2048 sector alignment, support +size{b,k,m,g,t} in End Sector")) + + -- s_partition_table:option(DummyValue, "number", translate("Number")) + s_partition_table:option(DummyValue, "name", translate("Name")) + local val_sec_start = s_partition_table:option(Value, "sec_start", translate("Start Sector")) + val_sec_start.render = function(self, section, scope) + -- could create new partition + if disk_info.partitions[section].number == -1 and disk_info.partitions[section].size > 1 * 1024 * 1024 then + self.template = "cbi/value" + Value.render(self, section, scope) + else + self.template = "cbi/dvalue" + DummyValue.render(self, section, scope) + end + end + local val_sec_end = s_partition_table:option(Value, "sec_end", translate("End Sector")) + val_sec_end.render = function(self, section, scope) + -- could create new partition + if disk_info.partitions[section].number == -1 and disk_info.partitions[section].size > 1 * 1024 * 1024 then + self.template = "cbi/value" + Value.render(self, section, scope) + else + self.template = "cbi/dvalue" + DummyValue.render(self, section, scope) + end + end + val_sec_start.forcewrite = true + val_sec_start.write = function(self, section, value) + disk_info.partitions[section]._sec_start = value + end + val_sec_end.forcewrite = true + val_sec_end.write = function(self, section, value) + disk_info.partitions[section]._sec_end = value + end + s_partition_table:option(DummyValue, "size_formated", translate("Size")) + if disk_info.p_table == "MBR" then + s_partition_table:option(DummyValue, "type", translate("Type")) + end + s_partition_table:option(DummyValue, "useage", translate("Useage")) + s_partition_table:option(DummyValue, "mount_point", translate("Mount Point")) + local val_fs = s_partition_table:option(Value, "fs", translate("File System")) + val_fs.forcewrite = true + val_fs.write = function(self, section, value) + disk_info.partitions[section]._fs = value + end + val_fs.render = function(self, section, scope) + -- use listvalue when partition not mounted + if disk_info.partitions[section].mount_point == "-" and disk_info.partitions[section].number ~= -1 and disk_info.partitions[section].type ~= "extended" then + self.template = "cbi/value" + self:reset_values() + self.keylist = {} + self.vallist = {} + for k, v in pairs(format_cmd) do + self:value(k,k) + end + -- self.default = disk_info.partitions[section].fs + else + self:reset_values() + self.keylist = {} + self.vallist = {} + self.template = "cbi/dvalue" + end + DummyValue.render(self, section, scope) + end + btn_format = s_partition_table:option(Button, "_format") + btn_format.render = function(self, section, scope) + if disk_info.partitions[section].mount_point == "-" and disk_info.partitions[section].number ~= -1 and disk_info.partitions[section].type ~= "extended" then + self.inputtitle = translate("Format") + self.template = "diskman/cbi/disabled_button" + self.view_disabled = false + self.inputstyle = "reset" + for k, v in pairs(format_cmd) do + self:depends("val_fs", "k") + end + -- elseif disk_info.partitions[section].mount_point ~= "-" and disk_info.partitions[section].number ~= -1 then + -- self.inputtitle = "Format" + -- self.template = "diskman/cbi/disabled_button" + -- self.view_disabled = true + -- self.inputstyle = "reset" + else + self.inputtitle = "" + self.template = "cbi/dvalue" + end + Button.render(self, section, scope) + end + btn_format.forcewrite = true + btn_format.write = function(self, section, value) + local partition_name = "/dev/".. disk_info.partitions[section].name + if not nixio.fs.access(partition_name) then + m.errmessage = "Partition NOT found!" + return + end + local fs = disk_info.partitions[section]._fs + if not format_cmd[fs] then + m.errmessage = "Filesystem NOT support!" + return + end + local cmd = format_cmd[fs].cmd .. " " .. format_cmd[fs].option .. " " .. partition_name + -- luci.util.perror(cmd) + local res = luci.sys.exec(cmd) + luci.http.redirect(luci.dispatcher.build_url("admin/system/diskman/partition/" .. dev)) + end + + local btn_action = s_partition_table:option(Button, "_action") + btn_action.forcewrite = true + btn_action.template = "diskman/cbi/disabled_button" + btn_action.render = function(self, section, scope) + -- if partition is mounted or the size < 1mb, then disable the add action + if disk_info.partitions[section].mount_point ~= "-" or (disk_info.partitions[section].type ~= "extended" and disk_info.partitions[section].number == -1 and disk_info.partitions[section].size <= 1 * 1024 * 1024) then + self.view_disabled = true + -- self.inputtitle = "" + -- self.template = "cbi/dvalue" + elseif disk_info.partitions[section].type == "extended" and next(disk_info.partitions[section]["logicals"]) ~= nil then + self.view_disabled = true + else + -- self.template = "diskman/cbi/disabled_button" + self.view_disabled = false + end + if disk_info.partitions[section].number ~= -1 then + self.inputtitle = translate("Remove") + self.inputstyle = "remove" + else + self.inputtitle = translate("New") + self.inputstyle = "add" + end + Button.render(self, section, scope) + end + btn_action.write = function(self, section, value) + -- luci.util.perror(value) + if value == translate("New") then + local start_sec = disk_info.partitions[section]._sec_start and tonumber(disk_info.partitions[section]._sec_start) or tonumber(disk_info.partitions[section].sec_start) + local end_sec = disk_info.partitions[section]._sec_end + + if start_sec then + -- for sector alignment + local align = tonumber(disk_info.phy_sec) / tonumber(disk_info.logic_sec) + align = (align < 2048) and 2048 + if start_sec < 2048 then + start_sec = "2048" .. "s" + elseif math.fmod( start_sec, align ) ~= 0 then + start_sec = tostring(start_sec + align - math.fmod( start_sec, align )) .. "s" + else + start_sec = start_sec .. "s" + end + else + m.errmessage = "Invalid Start Sector!" + return + end + -- support +size format for End sector + local end_size, end_unit = end_sec:match("^+(%d-)([bkmgtsBKMGTS])$") + if tonumber(end_size) and end_unit then + local unit ={ + B=1, + S=512, + K=1024, + M=1048576, + G=1073741824, + T=1099511627776 + } + end_unit = end_unit:upper() + end_sec = tostring(tonumber(end_size) * unit[end_unit] / unit["S"] + tonumber(start_sec:sub(1,-2)) - 1 ) .. "s" + elseif tonumber(end_sec) then + end_sec = end_sec .. "s" + else + m.errmessage = "Invalid End Sector!" + return + end + local part_type = "primary" + -- create partition table if no partition table + if disk_info.p_table == "UNKNOWN" then + local cmd = dm.command.parted .. " -s /dev/" .. dev .. " mktable gpt" + elseif disk_info.p_table == "MBR" and disk_info["extended_partition_index"] then + if tonumber(disk_info.partitions[disk_info["extended_partition_index"]].sec_start) <= tonumber(start_sec:sub(1,-2)) and tonumber(disk_info.partitions[disk_info["extended_partition_index"]].sec_end) >= tonumber(end_sec:sub(1,-2)) then + part_type = "logical" + if tonumber(start_sec:sub(1,-2)) - tonumber(disk_info.partitions[section].sec_start) < 2048 then + start_sec = tonumber(start_sec:sub(1,-2)) + 2048 + start_sec = start_sec .."s" + end + end + end + + -- partiton + local cmd = dm.command.parted .. " -s -a optimal /dev/" .. dev .. " mkpart " .. part_type .." " .. start_sec .. " " .. end_sec + local res = luci.util.exec(cmd) + if res:match("Error.+") then + m.errmessage = res + else + luci.http.redirect(luci.dispatcher.build_url("admin/system/diskman/partition/" .. dev)) + end + elseif value == translate("Remove") then + -- remove partition + local number = tostring(disk_info.partitions[section].number) + if (not number) or (number == "") then + m.errmessage = "Partition not exists!" + return + end + local cmd = dm.command.parted .. " -s /dev/" .. dev .. " rm " .. number + local res = luci.util.exec(cmd) + if res:match("Error.+") then + m.errmessage = res + else + luci.http.redirect(luci.dispatcher.build_url("admin/system/diskman/partition/" .. dev)) + end + end + end +end + +return m \ No newline at end of file diff --git a/package/ctcgfw/luci-app-diskman/luasrc/model/diskman.lua b/package/ctcgfw/luci-app-diskman/luasrc/model/diskman.lua new file mode 100644 index 0000000000..ac979849d3 --- /dev/null +++ b/package/ctcgfw/luci-app-diskman/luasrc/model/diskman.lua @@ -0,0 +1,540 @@ +--[[ +LuCI - Lua Configuration Interface +Copyright 2019 lisaac +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 +$Id$ +]]-- + +require "luci.util" +local ver = require "luci.version" + +local CMD = {"parted", "mdadm", "blkid", "smartctl", "df", "sgdisk", "btrfs"} + +local d = {command ={}} +for _, cmd in ipairs(CMD) do + local command = luci.sys.exec("/usr/bin/which " .. cmd) + d.command[cmd] = command:match("^.+"..cmd) or nil +end + +local mounts = nixio.fs.readfile("/proc/mounts") or "" +local swaps = nixio.fs.readfile("/proc/swaps") or "" +local df = luci.sys.exec(d.command.df) or "" + +function byte_format(byte) + local suff = {"B", "KB", "MB", "GB", "TB"} + for i=1, 5 do + if byte > 1024 and i < 5 then + byte = byte / 1024 + else + return string.format("%.2f %s", byte, suff[i]) + end + end +end + +local get_smart_info = function(device) + local section + local smart_info = {} + for _, line in ipairs(luci.util.execl(d.command.smartctl .. " -H -A -i -n standby -f brief /dev/" .. device)) do + local attrib, val + if section == 1 then + attrib, val = line:match "^(.-):%s+(.+)" + elseif section == 2 and device:match("nvme") then + attrib, val = line:match("^(.-):%s+(.+)") + if not smart_info.health then smart_info.health = line:match(".-overall%-health.-: (.+)") end + elseif section == 2 then + attrib, val = line:match("^([0-9 ]+)%s+[^ ]+%s+[POSRCK-]+%s+[0-9-]+%s+[0-9-]+%s+[0-9-]+%s+[0-9-]+%s+([0-9-]+)") + if not smart_info.health then smart_info.health = line:match(".-overall%-health.-: (.+)") end + else + attrib = line:match "^=== START OF (.*) SECTION ===" + if attrib and attrib:match("INFORMATION") then + section = 1 + elseif attrib and attrib:match("SMART DATA") then + section = 2 + elseif not smart_info.status then + val = line:match "^Device is in (.*) mode" + if val then smart_info.status = val end + end + end + + if not attrib then + if section ~= 2 then section = 0 end + elseif (attrib == "Power mode is") or + (attrib == "Power mode was") then + smart_info.status = val:match("(%S+)") + -- elseif attrib == "Sector Sizes" then + -- -- 512 bytes logical, 4096 bytes physical + -- smart_info.phy_sec = val:match "([0-9]*) bytes physical" + -- smart_info.logic_sec = val:match "([0-9]*) bytes logical" + -- elseif attrib == "Sector Size" then + -- -- 512 bytes logical/physical + -- smart_info.phy_sec = val:match "([0-9]*)" + -- smart_info.logic_sec = smart_info.phy_sec + elseif attrib == "Serial Number" then + smart_info.sn = val + elseif attrib == "194" or attrib == "Temperature" then + smart_info.temp = val:match("(%d+)") .. "°C" + elseif attrib == "Rotation Rate" then + smart_info.rota_rate = val + elseif attrib == "SATA Version is" then + smart_info.sata_ver = val + end + end + return smart_info +end + +local parse_parted_info = function(keys, line) + -- parse the output of parted command (machine parseable format) + -- /dev/sda:5860533168s:scsi:512:4096:gpt:ATA ST3000DM001-1ER1:; + -- 1:34s:2047s:2014s:free; + -- 1:2048s:1073743872s:1073741825s:ext4:primary:; + local result = {} + local values = {} + + for value in line:gmatch("(.-)[:;]") do table.insert(values, value) end + for i = 1,#keys do + result[keys[i]] = values[i] or "" + end + return result +end + +local is_raid_member = function(partition) + -- check if inuse as raid member + if nixio.fs.access("/proc/mdstat") then + for _, result in ipairs(luci.util.execl("grep md /proc/mdstat | sed 's/[][]//g'")) do + local md, buf + md, buf = result:match("(md.-):(.+)") + if buf:match(partition) then + return "Raid Member: ".. md + end + end + end + return nil +end + +local get_mount_point = function(partition) + local mount_point, dk_root_dir + -- if use luci-in-dokcer, exclude the docker overlay mounts + -- if ver.distname == "LuCI in Docker" then + local _o, dk = pcall(require,"luci.docker") + if _o and dk then + dk_root_dir = dk.new():info().body.DockerRootDir + end + -- end + + for m in mounts:gmatch("/dev/"..partition.." ([^ ]*)") do + if dk_root_dir and m:match(dk_root_dir) then + else + mount_point = (mount_point and (mount_point .. " ") or "") .. m + end + end + if mount_point then return mount_point end + -- result = luci.sys.exec('cat /proc/mounts | awk \'{if($1=="/dev/'.. partition ..'") print $2}\'') + -- if result ~= "" then return result end + + if swaps:match("\n/dev/" .. partition .."%s") then return "swap" end + -- result = luci.sys.exec("cat /proc/swaps | grep /dev/" .. partition) + -- if result ~= "" then return "swap" end + + return is_raid_member(partition) + +end + +local get_partition_useage = function(partition) + if not nixio.fs.access("/dev/"..partition) then return false end + local useage = df:match("\n/dev/" .. partition .. "%s+%d+%s+%d+%s+%d+%s+([0-9]+)%%%s") + useage = useage and (useage .. "%") or false + return useage +end + +local get_parted_info = function(device) + if not device then return end + local result = {partitions={}} + local DEVICE_INFO_KEYS = { "path", "size", "type", "logic_sec", "phy_sec", "p_table", "model", "flags" } + local PARTITION_INFO_KEYS = { "number", "sec_start", "sec_end", "size", "fs", "tag_name", "flags" } + local partition_temp + local partitions_temp = {} + local disk_temp + + for line in luci.util.execi(d.command.parted .. " -s -m /dev/" .. device .. " unit s print free", "r") do + if line:find("^/dev/"..device..":.+") then + disk_temp = parse_parted_info(DEVICE_INFO_KEYS, line) + disk_temp.partitions = {} + if disk_temp["size"] then + local length = disk_temp["size"]:gsub("^(%d+)s$", "%1") + local newsize = tostring(tonumber(length)*tonumber(disk_temp["logic_sec"])) + disk_temp["size"] = newsize + end + if disk_temp["p_table"] == "msdos" then + disk_temp["p_table"] = "MBR" + else + disk_temp["p_table"] = disk_temp["p_table"]:upper() + end + elseif line:find("^%d-:.+") then + partition_temp = parse_parted_info(PARTITION_INFO_KEYS, line) + -- use human-readable form instead of sector number + if partition_temp["size"] then + local length = partition_temp["size"]:gsub("^(%d+)s$", "%1") + local newsize = (tonumber(length) * tonumber(disk_temp["logic_sec"])) + partition_temp["size"] = newsize + partition_temp["size_formated"] = byte_format(newsize) + end + partition_temp["number"] = tonumber(partition_temp["number"]) or -1 + if partition_temp["fs"] == "free" then + partition_temp["number"] = -1 + partition_temp["fs"] = "Free Space" + partition_temp["name"] = "-" + elseif device:match("sd") or device:match("sata") then + partition_temp["name"] = device..partition_temp["number"] + elseif device:match("mmcblk") or device:match("md") or device:match("nvme") then + partition_temp["name"] = device.."p"..partition_temp["number"] + end + partition_temp["fs"] = partition_temp["fs"] == "" and "raw" or partition_temp["fs"] + partition_temp["sec_start"] = partition_temp["sec_start"] and partition_temp["sec_start"]:sub(1,-2) + partition_temp["sec_end"] = partition_temp["sec_end"] and partition_temp["sec_end"]:sub(1,-2) + partition_temp["mount_point"] = partition_temp["name"]~="-" and get_mount_point(partition_temp["name"]) or "-" + partition_temp["useage"] = partition_temp["mount_point"]~="-" and get_partition_useage(partition_temp["name"]) or "-" + -- if disk_temp["p_table"] == "MBR" and (partition_temp["number"] < 4) and (partition_temp["number"] > 0) then + -- local real_size_sec = tonumber(nixio.fs.readfile("/sys/block/"..device.."/"..partition_temp["name"].."/size")) * tonumber(disk_temp.phy_sec) + -- if real_size_sec ~= partition_temp["size"] then + -- disk_temp["extended_partition_index"] = partition_temp["number"] + -- partition_temp["type"] = "extended" + -- partition_temp["size"] = real_size_sec + -- partition_temp["fs"] = "-" + -- partition_temp["logicals"] = {} + -- else + -- partition_temp["type"] = "primary" + -- end + -- end + + table.insert(partitions_temp, partition_temp) + end + end + if disk_temp["p_table"] == "MBR" then + for i, p in ipairs(partitions_temp) do + if disk_temp["extended_partition_index"] and p["number"] > 4 then + if tonumber(p["sec_end"]) <= tonumber(partitions_temp[disk_temp["extended_partition_index"]]["sec_end"]) and tonumber(p["sec_start"]) >= tonumber(partitions_temp[disk_temp["extended_partition_index"]]["sec_start"]) then + p["type"] = "logical" + table.insert(partitions_temp[disk_temp["extended_partition_index"]]["logicals"], i) + end + elseif (p["number"] < 4) and (p["number"] > 0) then + local real_size_sec = tonumber(nixio.fs.readfile("/sys/block/"..device.."/"..p["name"].."/size")) * tonumber(disk_temp.phy_sec) + if real_size_sec ~= p["size"] then + disk_temp["extended_partition_index"] = i + p["type"] = "extended" + p["size"] = real_size_sec + p["fs"] = "-" + p["logicals"] = {} + else + p["type"] = "primary" + end + end + end + end + result = disk_temp + result.partitions = partitions_temp + + return result +end + +local mddetail = function(mdpath) + local detail = {} + local path = mdpath:match("^/dev/md%d+$") + if path then + local mdadm = io.popen(d.command.mdadm .. " --detail "..path, "r") + for line in mdadm:lines() do + local key, value = line:match("^%s*(.+) : (.+)") + if key then + detail[key] = value + end + end + mdadm:close() + end + return detail +end + +-- return {{device="", mount_points="", fs="", mount_options="", dump="", pass=""}..} +d.get_mount_points = function() + local mount, dk_root_dir + local res = {} + local h ={"device", "mount_point", "fs", "mount_options", "dump", "pass"} + local _o, dk = pcall(require,"luci.docker") + if _o and dk then + dk_root_dir = dk.new():info().body.DockerRootDir + end + for mount in mounts:gmatch("[^\n]+") do + local device = mount:match("^([^%s]+)%s+.+") + -- only show /dev/xxx device + if device and device:match("/dev/") then + -- not show docker root dir mounts + if dk_root_dir and mount and mount:match(dk_root_dir) then + else + res[#res+1] = {} + local i = 0 + for v in mount:gmatch("[^%s]+") do + i = i + 1 + res[#res][h[i]] = v + end + end + end + end + return res +end + +d.get_disk_info = function(device, wakeup) + --[[ return: + { + path, model, sn, size, size_mounted, flags, type, temp, p_table, logic_sec, phy_sec, sec_size, sata_ver, rota_rate, status, health, + partitions = { + 1 = { number, name, sec_start, sec_end, size, size_mounted, fs, tag_name, type, flags, mount_point, useage }, + 2 = { number, name, sec_start, sec_end, size, size_mounted, fs, tag_name, type, flags, mount_point, useage }, + ... + } + --raid devices only + level, members, members_str + } + --]] + if not device then return end + local disk_info + local smart_info = get_smart_info(device) + + -- check if divice is the member of raid + smart_info["p_table"] = is_raid_member(device..'0') + -- if status is not active(standby), only check smart_info. + -- if only weakup == true, weakup the disk and check parted_info. + if smart_info.status ~= "STANDBY" or wakeup or (smart_info["p_table"] and not smart_info["p_table"]:match("Raid")) or device:match("^md") then + disk_info = get_parted_info(device) + disk_info["sec_size"] = disk_info["logic_sec"] .. "/" .. disk_info["phy_sec"] + disk_info["size_formated"] = byte_format(tonumber(disk_info["size"])) + -- if status is standby, then get smart_info again + if smart_info.status ~= "ACTIVE" then smart_info = get_smart_info(device) end + else + disk_info = {} + end + + for k, v in pairs(smart_info) do + disk_info[k] = v + end + + if disk_info.type and disk_info.type:match("md") then + local raid_info = d.list_raid_devices()[disk_info["path"]:match("/dev/(.+)")] + for k, v in pairs(raid_info) do + disk_info[k] = v + end + end + return disk_info +end + +d.list_raid_devices = function() + local fs = require "nixio.fs" + + local raid_devices = {} + if not fs.access("/proc/mdstat") then return raid_devices end + local mdstat = io.open("/proc/mdstat", "r") + for line in mdstat:lines() do + + -- md1 : active raid1 sdb2[1] sda2[0] + -- md127 : active raid5 sdh1[6] sdg1[4] sdf1[3] sde1[2] sdd1[1] sdc1[0] + local device_info = {} + local mdpath, list = line:match("^(md%d+) : (.+)") + if mdpath then + local members = {} + for member in string.gmatch(list, "%S+") do + member_path = member:match("^(%S+)%[%d+%]") + if member_path then + member = '/dev/'..member_path + end + table.insert(members, member) + end + local active = table.remove(members, 1) + local level = "-" + if active == "active" then + level = table.remove(members, 1) + end + + local size = tonumber(fs.readfile(string.format("/sys/class/block/%s/size", mdpath))) + local ss = tonumber(fs.readfile(string.format("/sys/class/block/%s/queue/logical_block_size", mdpath))) + + device_info["path"] = "/dev/"..mdpath + device_info["size"] = size*ss + device_info["size_formated"] = byte_format(size*ss) + device_info["active"] = active:upper() + device_info["level"] = level + device_info["members"] = members + device_info["members_str"] = table.concat(members, ", ") + + -- Get more info from output of mdadm --detail + local detail = mddetail(device_info["path"]) + device_info["status"] = detail["State"]:upper() + + raid_devices[mdpath] = device_info + end + end + mdstat:close() + + return raid_devices +end + +-- Collect Devices information + --[[ return: + { + sda={ + path, model, inuse, size_formated, + partitions={ + { name, inuse, size_formated } + ... + } + } + .. + } + --]] +d.list_devices = function() + local fs = require "nixio.fs" + + -- get all device names (sdX and mmcblkX) + local target_devnames = {} + for dev in fs.dir("/dev") do + if dev:match("^sd[a-z]$") + or dev:match("^mmcblk%d+$") + or dev:match("^sata[a-z]$") + or dev:match("^nvme%d+n%d+$") + then + table.insert(target_devnames, dev) + end + end + + local devices = {} + for i, bname in pairs(target_devnames) do + local device_info = {} + local device = "/dev/" .. bname + local size = tonumber(fs.readfile(string.format("/sys/class/block/%s/size", bname))) + local ss = tonumber(fs.readfile(string.format("/sys/class/block/%s/queue/logical_block_size", bname))) + local model = fs.readfile(string.format("/sys/class/block/%s/device/model", bname)) + local partitions = {} + for part in nixio.fs.glob("/sys/block/" .. bname .."/" .. bname .. "*") do + local pname = nixio.fs.basename(part) + local psize = byte_format(tonumber(nixio.fs.readfile(part .. "/size"))*ss) + local mount_point = get_mount_point(pname) + if mount_point then device_info["inuse"] = true end + table.insert(partitions, {name = pname, size_formated = psize, inuse = mount_point}) + end + + device_info["path"] = device + device_info["size_formated"] = byte_format(size*ss) + device_info["model"] = model + device_info["partitions"] = partitions + -- true or false + device_info["inuse"] = device_info["inuse"] or get_mount_point(bname) + + local udevinfo = {} + if luci.sys.exec("which udevadm") ~= "" then + local udevadm = io.popen("udevadm info --query=property --name="..device) + for attr in udevadm:lines() do + local k, v = attr:match("(%S+)=(%S+)") + udevinfo[k] = v + end + udevadm:close() + + device_info["info"] = udevinfo + if udevinfo["ID_MODEL"] then device_info["model"] = udevinfo["ID_MODEL"] end + end + devices[bname] = device_info + end + -- luci.util.perror(luci.util.serialize_json(devices)) + return devices +end + +-- get formart cmd +d.get_format_cmd = function() + local AVAILABLE_FMTS = { + ext2 = { cmd = "mkfs.ext2", option = "-F -E lazy_itable_init=1" }, + ext3 = { cmd = "mkfs.ext3", option = "-F -E lazy_itable_init=1" }, + ext4 = { cmd = "mkfs.ext4", option = "-F -E lazy_itable_init=1" }, + fat32 = { cmd = "mkfs.fat", option = "-F 32 -I" }, + exfat = { cmd = "mkexfat", option = "-f" }, + hfsplus = { cmd = "mkhfs", option = "-f" }, + ntfs = { cmd = "mkntfs", option = "-f" }, + swap = { cmd = "mkswap", option = "-f" }, + btrfs = { cmd = "mkfs.btrfs", option = "-f" } + } + result = {} + for fmt, obj in pairs(AVAILABLE_FMTS) do + local cmd = luci.sys.exec("/usr/bin/which " .. obj["cmd"]) + if cmd:match(obj["cmd"]) then + result[fmt] = { cmd = cmd:match("^.+"..obj["cmd"]) ,option = obj["option"] } + end + end + return result +end + +d.create_raid = function(rname, rlevel, rmembers) + local mb = {} + for _, v in ipairs(rmembers) do + mb[v]=v + end + rmembers = {} + for _, v in pairs(mb) do + table.insert(rmembers, v) + end + if type(rname) == "string" then + if rname:match("^md%d-%s+") then + rname = "/dev/"..rname:match("^(md%d-)%s+") + elseif rname:match("^/dev/md%d-%s+") then + rname = "/dev/"..rname:match("^(/dev/md%d-)%s+") + elseif not rname:match("/") then + rname = "/dev/md/".. rname + else + return "ERR: Invalid raid name" + end + else + local mdnum = 0 + for num=1,127 do + local md = io.open("/dev/md"..tostring(num), "r") + if md == nil then + mdnum = num + break + else + io.close(md) + end + end + if mdnum == 0 then return "ERR: Cannot find proper md number" end + rname = "/dev/md"..mdnum + end + + if rlevel == "5" or rlevel == "6" then + if #rmembers < 3 then return "ERR: Not enough members" end + end + if rlevel == "10" then + if #rmembers < 4 then return "ERR: Not enough members" end + end + if #rmembers < 2 then return "ERR: Not enough members" end + local cmd = d.command.mdadm .. " --create "..rname.." --run --assume-clean --homehost=any --level=" .. rlevel .. " --raid-devices=" .. #rmembers .. " " .. table.concat(rmembers, " ") + local res = luci.util.exec(cmd) + return res +end + +d.gen_mdadm_config = function() + if not nixio.fs.access("/etc/config/mdadm") then return end + local uci = require "luci.model.uci" + local x = uci.cursor() + -- delete all array sections + x:foreach("mdadm", "array", function(s) x:delete("mdadm",s[".name"]) end) + local cmd = d.command.mdadm .. " -D -s" + --ARRAY /dev/md1 metadata=1.2 name=any:1 UUID=f998ae14:37621b27:5c49e850:051f6813 + --ARRAY /dev/md3 metadata=1.2 name=any:3 UUID=c068c141:4b4232ca:f48cbf96:67d42feb + for _, v in ipairs(luci.util.execl(cmd)) do + local device, uuid = v:match("^ARRAY%s-([^%s]+)%s-[^%s]-%s-[^%s]-%s-UUID=([^%s]+)%s-") + if device and uuid then + local section_name = x:add("mdadm", "array") + x:set("mdadm", section_name, "device", device) + x:set("mdadm", section_name, "uuid", uuid) + end + end + x:commit("mdadm") + -- enable mdadm + luci.util.exec("/etc/init.d/mdadm enable") +end + +return d diff --git a/package/ctcgfw/luci-app-diskman/luasrc/view/diskman/cbi/disabled_button.htm b/package/ctcgfw/luci-app-diskman/luasrc/view/diskman/cbi/disabled_button.htm new file mode 100644 index 0000000000..1ad4eca3be --- /dev/null +++ b/package/ctcgfw/luci-app-diskman/luasrc/view/diskman/cbi/disabled_button.htm @@ -0,0 +1,7 @@ +<%+cbi/valueheader%> + <% if self:cfgvalue(section) ~= false then %> + " type="submit"<%= attr("name", cbid) .. attr("id", cbid) .. attr("value", self.inputtitle or self.title)%> <% if self.view_disabled then %> disabled <% end %>/> + <% else %> + - + <% end %> +<%+cbi/valuefooter%> \ No newline at end of file diff --git a/package/ctcgfw/luci-app-diskman/luasrc/view/diskman/cbi/inlinebutton.htm b/package/ctcgfw/luci-app-diskman/luasrc/view/diskman/cbi/inlinebutton.htm new file mode 100644 index 0000000000..b1b1932571 --- /dev/null +++ b/package/ctcgfw/luci-app-diskman/luasrc/view/diskman/cbi/inlinebutton.htm @@ -0,0 +1,7 @@ +
+ <% if self:cfgvalue(section) ~= false then %> + " type="submit"" <% if self.disable then %>disabled <% end %><%= attr("name", cbid) .. attr("id", cbid) .. attr("value", self.inputtitle or self.title)%> /> + <% else %> + - + <% end %> +
diff --git a/package/ctcgfw/luci-app-diskman/luasrc/view/diskman/cbi/xnullsection.htm b/package/ctcgfw/luci-app-diskman/luasrc/view/diskman/cbi/xnullsection.htm new file mode 100644 index 0000000000..69aa65e003 --- /dev/null +++ b/package/ctcgfw/luci-app-diskman/luasrc/view/diskman/cbi/xnullsection.htm @@ -0,0 +1,37 @@ +
+ <% if self.title and #self.title > 0 then -%> + <%=self.title%> + <%- end %> + <% if self.description and #self.description > 0 then -%> +
<%=self.description%>
+ <%- end %> +
+
+ <% self:render_children(1, scope or {}) %> +
+ <% if self.error and self.error[1] then -%> +
+
    <% for _, e in ipairs(self.error[1]) do -%> +
  • + <%- if e == "invalid" then -%> + <%:One or more fields contain invalid values!%> + <%- elseif e == "missing" then -%> + <%:One or more required fields have no value!%> + <%- else -%> + <%=pcdata(e)%> + <%- end -%> +
  • + <%- end %>
+
+ <%- end %> +
+
+<%- + if type(self.hidden) == "table" then + for k, v in pairs(self.hidden) do +-%> + +<%- + end + end +%> \ No newline at end of file diff --git a/package/ctcgfw/luci-app-diskman/luasrc/view/diskman/cbi/xsimpleform.htm b/package/ctcgfw/luci-app-diskman/luasrc/view/diskman/cbi/xsimpleform.htm new file mode 100644 index 0000000000..a831bfc779 --- /dev/null +++ b/package/ctcgfw/luci-app-diskman/luasrc/view/diskman/cbi/xsimpleform.htm @@ -0,0 +1,88 @@ +<% if not self.embedded then %> +
> + + + <% + end + + %>
<% + + if self.title and #self.title > 0 then + %>

<%=self.title%>

<% + end + + if self.description and #self.description > 0 then + %>
<%=self.description%>
<% + end + + self:render_children() + + %>
<% + + if self.message then + %>
<%=self.message%>
<% + end + + if self.errmessage then + %>
<%=self.errmessage%>
<% + end + + if not self.embedded then + if type(self.hidden) == "table" then + local k, v + for k, v in pairs(self.hidden) do + %><% + end + end + + local display_back = (self.redirect) + local display_cancel = (self.cancel ~= false and self.on_cancel) + local display_skip = (self.flow and self.flow.skip) + local display_submit = (self.submit ~= false) + local display_reset = (self.reset ~= false) + + if display_back or display_cancel or display_skip or display_submit or display_reset then + %>
<% + + if display_back then + %> <% + end + + if display_cancel then + local label = pcdata(self.cancel or translate("Cancel")) + %> <% + end + + if display_skip then + %> <% + end + + if display_submit then + local label = pcdata(self.submit or translate("Submit")) + %> <% + end + + if display_reset then + local label = pcdata(self.reset or translate("Reset")) + %> <% + end + + %>
<% + end + + %>
<% + end +%> + + diff --git a/package/ctcgfw/luci-app-diskman/luasrc/view/diskman/disk_info_tab.htm b/package/ctcgfw/luci-app-diskman/luasrc/view/diskman/disk_info_tab.htm new file mode 100644 index 0000000000..be18e75a69 --- /dev/null +++ b/package/ctcgfw/luci-app-diskman/luasrc/view/diskman/disk_info_tab.htm @@ -0,0 +1,143 @@ +
+
    + <% for k, v in pairs(self.tabs) do + local class = k == self.default_tab and "cbi-tab" or "cbi-tab-disabled" + local id = "tab.raid-tab." .. k + %> +
  • class=<%=class%> > + <%=v%> +
  • + <% end %> + +
+ + \ No newline at end of file diff --git a/package/ctcgfw/luci-app-diskman/luasrc/view/diskman/partition_info.htm b/package/ctcgfw/luci-app-diskman/luasrc/view/diskman/partition_info.htm new file mode 100644 index 0000000000..482fab8a35 --- /dev/null +++ b/package/ctcgfw/luci-app-diskman/luasrc/view/diskman/partition_info.htm @@ -0,0 +1,34 @@ + \ No newline at end of file diff --git a/package/ctcgfw/luci-app-diskman/luasrc/view/diskman/smart_detail.htm b/package/ctcgfw/luci-app-diskman/luasrc/view/diskman/smart_detail.htm new file mode 100644 index 0000000000..1aa15b80fe --- /dev/null +++ b/package/ctcgfw/luci-app-diskman/luasrc/view/diskman/smart_detail.htm @@ -0,0 +1,77 @@ + + + S.M.A.R.T detail of <%=dev%> + + + + + +
+
+ <%:S.M.A.R.T Attrbutes%>: /dev/<%=dev%> + + + <% if dev:match("nvme") then %> + + <% else %> + + + + + + + + + + <% end %> + + + + +
<%:ID%><%:Attrbute%><%:Flag%><%:Value%><%:Worst%><%:Thresh%><%:Type%><%:Updated%><%:Raw%>

<%:Collecting data...%>
+
+
+ + \ No newline at end of file diff --git a/package/ctcgfw/luci-app-diskman/po/pl/diskman.po b/package/ctcgfw/luci-app-diskman/po/pl/diskman.po new file mode 100644 index 0000000000..53c33e8d66 --- /dev/null +++ b/package/ctcgfw/luci-app-diskman/po/pl/diskman.po @@ -0,0 +1,128 @@ +msgid "" +msgstr "Content-Type: text/plain; charset=UTF-8\n" + +msgid "DiskMan" +msgstr "Menadżer dysków" + +msgid "Manage Disks over LuCI." +msgstr "Zarządzaj dyskami przez LuCI." + +msgid "Rescan Disks" +msgstr "Skanuj dyski" + +msgid "Disks" +msgstr "Dyski" + +msgid "Path" +msgstr "Ścieżka" + +msgid "Serial Number" +msgstr "Numer seryjny" + +msgid "Temp" +msgstr "Temperatura" + +msgid "Partition Table" +msgstr "Tablica partycji" + +msgid "SATA Version" +msgstr "Wersja SATA" + +msgid "Health" +msgstr "Kondycja" + +msgid "File System" +msgstr "System plików" + +msgid "Mount Options" +msgstr "Opcje montowania" + +msgid "Mount" +msgstr "Montuj" + +msgid "Umount" +msgstr "Odmontuj" + +msgid "Eject" +msgstr "Wysuń" + +msgid "New" +msgstr "Nowa" + +msgid "Remove" +msgstr "Wysuń" + +msgid "Format" +msgstr "Formatuj" + +msgid "Start Sector" +msgstr "Sektor początkowy" + +msgid "End Sector" +msgstr "Sektor końcowy" + +msgid "Useage" +msgstr "Użycie" + +msgid "Model" +msgstr "Model urządzenia" + +msgid "Size" +msgstr "Rozmiar" + +msgid "Status" +msgstr "Status" + +msgid "Mount Point" +msgstr "Punkt montowania" + +msgid "Sector Size" +msgstr "Rozmiar sektora" + +msgid "Rotation Rate" +msgstr "Obroty" + +msgid "RAID Devices" +msgstr "Urządzenia RAID" + +msgid "RAID mode" +msgstr "Tryb RAID" + +msgid "Members" +msgstr "Członkowie" + +msgid "Active" +msgstr "Aktywny" + +msgid "RAID Creation" +msgstr "Kreator RAID" + +msgid "Raid Name" +msgstr "Nazwa RAID" + +msgid "Raid Level" +msgstr "Poziom RAID" + +msgid "Raid Member" +msgstr "Członek RAID" + +msgid "Create Raid" +msgstr "Utwórz RAID" + +msgid "Partition Management" +msgstr "Menadżer partycji" + +msgid "Partition Disk over LuCI." +msgstr "Zarządzaj partycjami przez LuCI." + +msgid "Device Info" +msgstr "Informacja o urządzeniu" + +msgid "Disk Man" +msgstr "Menadżer dysków" + +msgid "Partitions Info" +msgstr "Informacja o partycjach" + +msgid "Default 2048 sector alignment, support +size{b,k,m,g,t} in End Sector" +msgstr "Sektory wyrównywane są do wielokrotności 2048, sektor końcowy można podać jako rozmiar w postaci +size{b,k,m,g,t}" diff --git a/package/ctcgfw/luci-app-diskman/po/zh-cn/diskman.po b/package/ctcgfw/luci-app-diskman/po/zh-cn/diskman.po new file mode 100644 index 0000000000..6084864ced --- /dev/null +++ b/package/ctcgfw/luci-app-diskman/po/zh-cn/diskman.po @@ -0,0 +1,128 @@ +msgid "" +msgstr "Content-Type: text/plain; charset=UTF-8\n" + +msgid "DiskMan" +msgstr "DiskMan磁盘管理" + +msgid "Manage Disks over LuCI." +msgstr "通过LuCI管理磁盘" + +msgid "Rescan Disks" +msgstr "重新扫描磁盘" + +msgid "Disks" +msgstr "磁盘" + +msgid "Path" +msgstr "路径" + +msgid "Serial Number" +msgstr "序列号" + +msgid "Temp" +msgstr "温度" + +msgid "Partition Table" +msgstr "分区表" + +msgid "SATA Version" +msgstr "SATA版本" + +msgid "Health" +msgstr "健康" + +msgid "File System" +msgstr "文件系统" + +msgid "Mount Options" +msgstr "挂载选项" + +msgid "Mount" +msgstr "挂载" + +msgid "Umount" +msgstr "卸载" + +msgid "Eject" +msgstr "弹出" + +msgid "New" +msgstr "创建" + +msgid "Remove" +msgstr "移除" + +msgid "Format" +msgstr "格式化" + +msgid "Start Sector" +msgstr "起始扇区" + +msgid "End Sector" +msgstr "中止扇区" + +msgid "Useage" +msgstr "使用情况" + +msgid "Model" +msgstr "主机型号" + +msgid "Size" +msgstr "容量" + +msgid "Status" +msgstr "状态" + +msgid "Mount Point" +msgstr "挂载点" + +msgid "Sector Size" +msgstr "扇区/物理扇区大小" + +msgid "Rotation Rate" +msgstr "转速" + +msgid "RAID Devices" +msgstr "RAID 设备" + +msgid "RAID mode" +msgstr "RAID 模式" + +msgid "Members" +msgstr "成员" + +msgid "Active" +msgstr "活动" + +msgid "RAID Creation" +msgstr "RAID 创建" + +msgid "Raid Name" +msgstr "RAID 名称" + +msgid "Raid Level" +msgstr "RAID 级别" + +msgid "Raid Member" +msgstr "磁盘阵列成员" + +msgid "Create Raid" +msgstr "创建 RAID" + +msgid "Partition Management" +msgstr "分区管理" + +msgid "Partition Disk over LuCI." +msgstr "通过LuCI分区磁盘。" + +msgid "Device Info" +msgstr "设备信息" + +msgid "Disk Man" +msgstr "DiskMan磁盘管理" + +msgid "Partitions Info" +msgstr "分区信息" + +msgid "Default 2048 sector alignment, support +size{b,k,m,g,t} in End Sector" +msgstr "默认2048扇区对齐,【中止扇区】支持 +容量{b,k,m,g,t} 格式,例:+500m +10g +1t" diff --git a/package/ctcgfw/luci-app-dockerman/Makefile b/package/ctcgfw/luci-app-dockerman/Makefile new file mode 100644 index 0000000000..d66f23f6de --- /dev/null +++ b/package/ctcgfw/luci-app-dockerman/Makefile @@ -0,0 +1,45 @@ +include $(TOPDIR)/rules.mk + +PKG_NAME:=luci-app-dockerman +PKG_VERSION:=v0.1.9 +PKG_RELEASE:=beta +PKG_MAINTAINER:=lisaac +PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME) +PKG_LICENSE:=Apache-2.0 + +include $(INCLUDE_DIR)/package.mk + +define Package/$(PKG_NAME) + SECTION:=luci + CATEGORY:=LuCI + SUBMENU:=3. Applications + TITLE:=Docker Manager interface for LuCI + PKGARCH:=all + DEPENDS:=+luci-lib-docker +luci-app-docker +endef + +define Package/$(PKG_NAME)/description + Docker Manager interface for LuCI +endef + +define Build/Prepare +endef + +define Build/Compile +endef + +define Package/$(PKG_NAME)/postinst +#!/bin/sh +rm -fr /tmp/luci-indexcache /tmp/luci-modulecache +endef + +define Package/$(PKG_NAME)/install + $(INSTALL_DIR) $(1)/usr/lib/lua/luci + cp -pR ./luasrc/* $(1)/usr/lib/lua/luci + $(INSTALL_DIR) $(1)/ + cp -pR ./root/* $(1)/ + $(INSTALL_DIR) $(1)/usr/lib/lua/luci/i18n + po2lmo ./po/zh-cn/dockerman.po $(1)/usr/lib/lua/luci/i18n/dockerman.zh-cn.lmo +endef + +$(eval $(call BuildPackage,$(PKG_NAME))) diff --git a/package/ctcgfw/luci-app-dockerman/luasrc/controller/dockerman.lua b/package/ctcgfw/luci-app-dockerman/luasrc/controller/dockerman.lua new file mode 100644 index 0000000000..0886cf92df --- /dev/null +++ b/package/ctcgfw/luci-app-dockerman/luasrc/controller/dockerman.lua @@ -0,0 +1,158 @@ +--[[ +LuCI - Lua Configuration Interface +Copyright 2019 lisaac +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 +$Id$ +]]-- +require "luci.util" +local docker = require "luci.model.docker" +local uci = require "luci.model.uci" + +module("luci.controller.dockerman",package.seeall) + +function index() + + entry({"admin", "docker"}, firstchild(), "Docker", 40).dependent = false + entry({"admin","docker","overview"},cbi("docker/overview"),_("Overview"),0).leaf=true + + local socket = luci.model.uci.cursor():get("docker", "local", "socket_path") + if not nixio.fs.access(socket) then return end + if (require "luci.model.docker").new():_ping().code ~= 200 then return end + entry({"admin","docker","containers"},form("docker/containers"),_("Containers"),1).leaf=true + entry({"admin","docker","images"},form("docker/images"),_("Images"),2).leaf=true + entry({"admin","docker","networks"},form("docker/networks"),_("Networks"),3).leaf=true + entry({"admin","docker","volumes"},form("docker/volumes"),_("Volumes"),4).leaf=true + entry({"admin","docker","events"},call("action_events"),_("Events"),5) + entry({"admin","docker","newcontainer"},form("docker/newcontainer")).leaf=true + entry({"admin","docker","newnetwork"},form("docker/newnetwork")).leaf=true + entry({"admin","docker","container"},form("docker/container")).leaf=true + entry({"admin","docker","container_stats"},call("action_get_container_stats")).leaf=true + entry({"admin","docker","confirm"},call("action_confirm")).leaf=true + +end + + +function action_events() + local logs = "" + local dk = docker.new() + local query ={} + query["until"] = os.time() + local events = dk:events(nil, query) + for _, v in ipairs(events.body) do + if v.Type == "container" then + logs = (logs ~= "" and (logs .. "\n") or logs) .. "[" .. os.date("%Y-%m-%d %H:%M:%S", v.time) .."] "..v.Type.. " " .. (v.Action or "null") .. " Container ID:".. (v.Actor.ID or "null") .. " Container Name:" .. (v.Actor.Attributes.name or "null") + elseif v.Type == "network" then + logs = (logs ~= "" and (logs .. "\n") or logs) .. "[" .. os.date("%Y-%m-%d %H:%M:%S", v.time) .."] "..v.Type.. " " .. v.Action .. " Container ID:"..( v.Actor.Attributes.container or "null" ) .. " Network Name:" .. (v.Actor.Attributes.name or "null") .. " Network type:".. v.Actor.Attributes.type or "" + elseif v.Type == "image" then + logs = (logs ~= "" and (logs .. "\n") or logs) .. "[" .. os.date("%Y-%m-%d %H:%M:%S", v.time) .."] "..v.Type.. " " .. v.Action .. " Image:".. (v.Actor.ID or "null").. " Image Name:" .. (v.Actor.Attributes.name or "null") + end + end + luci.template.render("docker/logs", {self={syslog = logs, title="Docker Events"}}) +end + +local calculate_cpu_percent = function(d) + if type(d) ~= "table" then return end + cpu_count = tonumber(d["cpu_stats"]["online_cpus"]) + cpu_percent = 0.0 + cpu_delta = tonumber(d["cpu_stats"]["cpu_usage"]["total_usage"]) - tonumber(d["precpu_stats"]["cpu_usage"]["total_usage"]) + system_delta = tonumber(d["cpu_stats"]["system_cpu_usage"]) - tonumber(d["precpu_stats"]["system_cpu_usage"]) + if system_delta > 0.0 then + cpu_percent = string.format("%.2f", cpu_delta / system_delta * 100.0 * cpu_count) + end + -- return cpu_percent .. "%" + return cpu_percent +end + +local get_memory = function(d) + if type(d) ~= "table" then return end + -- local limit = string.format("%.2f", tonumber(d["memory_stats"]["limit"]) / 1024 / 1024) + -- local usage = string.format("%.2f", (tonumber(d["memory_stats"]["usage"]) - tonumber(d["memory_stats"]["stats"]["total_cache"])) / 1024 / 1024) + -- return usage .. "MB / " .. limit.. "MB" + local limit =tonumber(d["memory_stats"]["limit"]) + local usage = tonumber(d["memory_stats"]["usage"]) - tonumber(d["memory_stats"]["stats"]["total_cache"]) + return usage, limit +end + +local get_rx_tx = function(d) + if type(d) ~="table" then return end + -- local data + -- if type(d["networks"]) == "table" then + -- for e, v in pairs(d["networks"]) do + -- data = (data and (data .. "
") or "") .. e .. " Total Tx:" .. string.format("%.2f",(tonumber(v.tx_bytes)/1024/1024)) .. "MB Total Rx: ".. string.format("%.2f",(tonumber(v.rx_bytes)/1024/1024)) .. "MB" + -- end + -- end + local data = {} + if type(d["networks"]) == "table" then + for e, v in pairs(d["networks"]) do + data[e] = { + bw_tx = tonumber(v.tx_bytes), + bw_rx = tonumber(v.rx_bytes) + } + end + end + return data +end + +function action_get_container_stats(container_id) + if container_id then + local dk = docker.new() + local response = dk.containers:inspect(container_id) + if response.code == 200 and response.body.State.Running then + response = dk.containers:stats(container_id, {stream=false}) + if response.code == 200 then + local container_stats = response.body + local cpu_percent = calculate_cpu_percent(container_stats) + local mem_useage, mem_limit = get_memory(container_stats) + local bw_rxtx = get_rx_tx(container_stats) + luci.http.status(response.code, response.body.message) + luci.http.prepare_content("application/json") + luci.http.write_json({ + cpu_percent = cpu_percent, + memory = { + mem_useage = mem_useage, + mem_limit = mem_limit + }, + bw_rxtx = bw_rxtx + }) + else + luci.http.status(response.code, response.body.message) + luci.http.prepare_content("text/plain") + luci.http.write(response.body.message) + end + else + if response.code == 200 then + luci.http.status(500, "container "..container_id.." not running") + luci.http.prepare_content("text/plain") + luci.http.write("Container "..container_id.." not running") + else + luci.http.status(response.code, response.body.message) + luci.http.prepare_content("text/plain") + luci.http.write(response.body.message) + end + end + else + luci.http.status(404, "No container name or id") + luci.http.prepare_content("text/plain") + luci.http.write("No container name or id") + end +end + +function action_confirm() + local status_path=luci.model.uci.cursor():get("docker", "local", "status_path") + local data = nixio.fs.readfile(status_path) + if data then + code = 202 + msg = data + else + code = 200 + msg = "finish" + data = "finish" + end + -- luci.util.perror(data) + luci.http.status(code, msg) + luci.http.prepare_content("application/json") + luci.http.write_json({info = data}) +end diff --git a/package/ctcgfw/luci-app-dockerman/luasrc/model/cbi/docker/container.lua b/package/ctcgfw/luci-app-dockerman/luasrc/model/cbi/docker/container.lua new file mode 100644 index 0000000000..6e1f906fa4 --- /dev/null +++ b/package/ctcgfw/luci-app-dockerman/luasrc/model/cbi/docker/container.lua @@ -0,0 +1,487 @@ +--[[ +LuCI - Lua Configuration Interface +Copyright 2019 lisaac +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 +$Id$ +]]-- + +require "luci.util" +local uci = luci.model.uci.cursor() +local docker = require "luci.model.docker" +local dk = docker.new() +container_id = arg[1] +local action = arg[2] or "info" + +local images, networks, containers_info +if not container_id then return end +local res = dk.containers:inspect(container_id) +if res.code < 300 then container_info = res.body else return end +res = dk.networks:list() +if res.code < 300 then networks = res.body else return end + +local get_ports = function(d) + local data + if d.HostConfig and d.HostConfig.PortBindings then + for inter, out in pairs(d.HostConfig.PortBindings) do + data = (data and (data .. "
") or "") .. out[1]["HostPort"] .. ":" .. inter + end + end + return data +end + +local get_env = function(d) + local data + if d.Config and d.Config.Env then + for _,v in ipairs(d.Config.Env) do + data = (data and (data .. "
") or "") .. v + end + end + return data +end + +local get_command = function(d) + local data + if d.Config and d.Config.Cmd then + for _,v in ipairs(d.Config.Cmd) do + data = (data and (data .. " ") or "") .. v + end + end + return data +end + +local get_mounts = function(d) + local data + if d.Mounts then + for _,v in ipairs(d.Mounts) do + local v_sorce_d, v_dest_d + local v_sorce = "" + local v_dest = "" + for v_sorce_d in v["Source"]:gmatch('[^/]+') do + if v_sorce_d and #v_sorce_d > 12 then + v_sorce = v_sorce .. "/" .. v_sorce_d:sub(1,12) .. "..." + else + v_sorce = v_sorce .."/".. v_sorce_d + end + end + for v_dest_d in v["Destination"]:gmatch('[^/]+') do + if v_dest_d and #v_dest_d > 12 then + v_dest = v_dest .. "/" .. v_dest_d:sub(1,12) .. "..." + else + v_dest = v_dest .."/".. v_dest_d + end + end + data = (data and (data .. "
") or "") .. v_sorce .. ":" .. v["Destination"] .. (v["Mode"] ~= "" and (":" .. v["Mode"]) or "") + end + end + return data +end + +local get_device = function(d) + local data + if d.HostConfig and d.HostConfig.Devices then + for _,v in ipairs(d.HostConfig.Devices) do + data = (data and (data .. "
") or "") .. v["PathOnHost"] .. ":" .. v["PathInContainer"] .. (v["CgroupPermissions"] ~= "" and (":" .. v["CgroupPermissions"]) or "") + end + end + return data +end + +local get_links = function(d) + local data + if d.HostConfig and d.HostConfig.Links then + for _,v in ipairs(d.HostConfig.Links) do + data = (data and (data .. "
") or "") .. v + end + end + return data +end + +local get_networks = function(d) + local data={} + if d.NetworkSettings and d.NetworkSettings.Networks and type(d.NetworkSettings.Networks) == "table" then + for k,v in pairs(d.NetworkSettings.Networks) do + data[k] = v.IPAddress or "" + end + end + return data +end + + +local start_stop_remove = function(m, cmd) + docker:clear_status() + docker:append_status("Containers: " .. cmd .. " " .. container_id .. "...") + local res + if cmd ~= "upgrade" then + res = dk.containers[cmd](dk, container_id) + else + res = dk.containers_upgrade(dk, container_id) + end + if res and res.code >= 300 then + docker:append_status("fail code:" .. res.code.." ".. (res.body.message and res.body.message or res.message)) + luci.http.redirect(luci.dispatcher.build_url("admin/docker/container/"..container_id)) + else + docker:clear_status() + if cmd ~= "remove" and cmd ~= "upgrade" then + luci.http.redirect(luci.dispatcher.build_url("admin/docker/container/"..container_id)) + else + luci.http.redirect(luci.dispatcher.build_url("admin/docker/containers")) + end + end +end + +m=SimpleForm("docker", container_info.Name:sub(2), translate("Docker Container") ) +m.template = "docker/cbi/xsimpleform" +m.redirect = luci.dispatcher.build_url("admin/docker/containers") +-- m:append(Template("docker/container")) +docker_status = m:section(SimpleSection) +docker_status.template="docker/apply_widget" +docker_status.err=nixio.fs.readfile(dk.options.status_path) +-- luci.util.perror(docker_status.err) +if docker_status.err then docker:clear_status() end + + +action_section = m:section(Table,{{}}) +action_section.notitle=true +action_section.rowcolors=false +action_section.template="cbi/nullsection" + +btnstart=action_section:option(Button, "_start") +btnstart.template="docker/cbi/inlinebutton" +btnstart.inputtitle=translate("Start") +btnstart.inputstyle = "apply" +btnstart.forcewrite = true +btnrestart=action_section:option(Button, "_restart") +btnrestart.template="docker/cbi/inlinebutton" +btnrestart.inputtitle=translate("Restart") +btnrestart.inputstyle = "reload" +btnrestart.forcewrite = true +btnstop=action_section:option(Button, "_stop") +btnstop.template="docker/cbi/inlinebutton" +btnstop.inputtitle=translate("Stop") +btnstop.inputstyle = "reset" +btnstop.forcewrite = true +btnupgrade=action_section:option(Button, "_upgrade") +btnupgrade.template="docker/cbi/inlinebutton" +btnupgrade.inputtitle=translate("Upgrade") +btnupgrade.inputstyle = "reload" +btnstop.forcewrite = true +btnduplicate=action_section:option(Button, "_duplicate") +btnduplicate.template="docker/cbi/inlinebutton" +btnduplicate.inputtitle=translate("Duplicate") +btnduplicate.inputstyle = "add" +btnstop.forcewrite = true +btnremove=action_section:option(Button, "_remove") +btnremove.template="docker/cbi/inlinebutton" +btnremove.inputtitle=translate("Remove") +btnremove.inputstyle = "remove" +btnremove.forcewrite = true + +btnstart.write = function(self, section) + start_stop_remove(m,"start") +end +btnrestart.write = function(self, section) + start_stop_remove(m,"restart") +end +btnupgrade.write = function(self, section) + start_stop_remove(m,"upgrade") +end +btnremove.write = function(self, section) + start_stop_remove(m,"remove") +end +btnstop.write = function(self, section) + start_stop_remove(m,"stop") +end +btnduplicate.write = function(self, section) + luci.http.redirect(luci.dispatcher.build_url("admin/docker/newcontainer/duplicate/"..container_id)) +end + +tab_section = m:section(SimpleSection) +tab_section.template="docker/container" + +if action == "info" then + m.submit = false + m.reset = false + table_info = { + ["01name"] = {_key = translate("Name"), _value = container_info.Name:sub(2) or "-", _button=translate("Update")}, + ["02id"] = {_key = translate("ID"), _value = container_info.Id or "-"}, + ["03image"] = {_key = translate("Image"), _value = container_info.Config.Image .. "
" .. container_info.Image}, + ["04status"] = {_key = translate("Status"), _value = container_info.State and container_info.State.Status or "-"}, + ["05created"] = {_key = translate("Created"), _value = container_info.Created or "-"}, + } + table_info["06start"] = container_info.State.Status == "running" and {_key = translate("Start Time"), _value = container_info.State and container_info.State.StartedAt or "-"} or {_key = translate("Finish Time"), _value = container_info.State and container_info.State.FinishedAt or "-"} + table_info["07healthy"] = {_key = translate("Healthy"), _value = container_info.State and container_info.State.Health and container_info.State.Health.Status or "-"} + table_info["08restart"] = {_key = translate("Restart Policy"), _value = container_info.HostConfig and container_info.HostConfig.RestartPolicy and container_info.HostConfig.RestartPolicy.Name or "-", _button=translate("Update")} + table_info["09device"] = {_key = translate("Device"), _value = get_device(container_info) or "-"} + table_info["09mount"] = {_key = translate("Mount/Volume"), _value = get_mounts(container_info) or "-"} + + table_info["10cmd"] = {_key = translate("Command"), _value = get_command(container_info) or "-"} + table_info["11env"] = {_key = translate("Env"), _value = get_env(container_info) or "-"} + table_info["12ports"] = {_key = translate("Ports"), _value = get_ports(container_info) or "-"} + table_info["13links"] = {_key = translate("Links"), _value = get_links(container_info) or "-"} + info_networks = get_networks(container_info) + list_networks = {} + for _, v in ipairs (networks) do + if v.Name then + local parent = v.Options and v.Options.parent or nil + local ip = v.IPAM and v.IPAM.Config and v.IPAM.Config[1] and v.IPAM.Config[1].Subnet or nil + ipv6 = v.IPAM and v.IPAM.Config and v.IPAM.Config[2] and v.IPAM.Config[2].Subnet or nil + local network_name = v.Name .. " | " .. v.Driver .. (parent and (" | " .. parent) or "") .. (ip and (" | " .. ip) or "").. (ipv6 and (" | " .. ipv6) or "") + list_networks[v.Name] = network_name + end + end + + if type(info_networks)== "table" then + for k,v in pairs(info_networks) do + table_info["14network"..k] = { + _key = translate("Network"), _value = k.. (v~="" and (" | ".. v) or ""), _button=translate("Disconnect") + } + list_networks[k]=nil + end + end + + table_info["15connect"] = {_key = translate("Connect Network"), _value = list_networks ,_opts = "", _button=translate("Connect")} + + + d_info = m:section(Table,table_info) + d_info.nodescr=true + d_info.formvalue=function(self, section) + return table_info + end + dv_key = d_info:option(DummyValue, "_key", translate("Info")) + dv_key.width = "20%" + dv_value = d_info:option(ListValue, "_value") + dv_value.render = function(self, section, scope) + if table_info[section]._key == translate("Name") then + self:reset_values() + self.template = "cbi/value" + self.size = 30 + self.keylist = {} + self.vallist = {} + self.default=table_info[section]._value + Value.render(self, section, scope) + elseif table_info[section]._key == translate("Restart Policy") then + self.template = "cbi/lvalue" + self:reset_values() + self.size = nil + self:value("no", "No") + self:value("unless-stopped", "Unless stopped") + self:value("always", "Always") + self:value("on-failure", "On failure") + self.default=table_info[section]._value + ListValue.render(self, section, scope) + elseif table_info[section]._key == translate("Connect Network") then + self.template = "cbi/lvalue" + self:reset_values() + self.size = nil + for k,v in pairs(list_networks) do + self:value(k,v) + end + self.default=table_info[section]._value + ListValue.render(self, section, scope) + else + self:reset_values() + self.rawhtml=true + self.template = "cbi/dvalue" + self.default=table_info[section]._value + DummyValue.render(self, section, scope) + end + end + dv_value.forcewrite = true -- for write function using simpleform + dv_value.write = function(self, section, value) + table_info[section]._value=value + end + dv_value.validate = function(self, value) + return value + end + dv_opts = d_info:option(Value, "_opts") + dv_opts.forcewrite = true -- for write function using simpleform + dv_opts.write = function(self, section, value) + + table_info[section]._opts=value + end + dv_opts.validate = function(self, value) + return value + end + dv_opts.render = function(self, section, scope) + if table_info[section]._key==translate("Connect Network") then + self.template="cbi/value" + self.keylist = {} + self.vallist = {} + self.placeholder = "10.1.1.254" + self.datatype = "ip4addr" + self.default=table_info[section]._opts + Value.render(self, section, scope) + else + self.rawhtml=true + self.template = "cbi/dvalue" + self.default=table_info[section]._opts + DummyValue.render(self, section, scope) + end + end + btn_update = d_info:option(Button, "_button") + btn_update.forcewrite = true + btn_update.render = function(self, section, scope) + if table_info[section]._button and table_info[section]._value ~= nil then + btn_update.inputtitle=table_info[section]._button + self.template = "cbi/button" + Button.render(self, section, scope) + else + self.template = "docker/cbi/dummyvalue" + self.default="" + DummyValue.render(self, section, scope) + end + end + btn_update.write = function(self, section, value) + -- luci.util.perror(section) + local res + docker:clear_status() + if section == "01name" then + docker:append_status("Containers: rename " .. container_id .. "...") + local new_name = table_info[section]._value + res = dk.containers:rename(container_id,{name=new_name}) + elseif section == "08restart" then + docker:append_status("Containers: update " .. container_id .. "...") + local new_restart = table_info[section]._value + res = dk.containers:update(container_id, nil, {RestartPolicy = {Name = new_restart}}) + elseif table_info[section]._key == translate("Network") then + local _,_,leave_network = table_info[section]._value:find("(.-) | .+") + leave_network = leave_network or table_info[section]._value + docker:append_status("Network: disconnect " .. leave_network .. container_id .. "...") + res = dk.networks:disconnect(leave_network, nil, {Container = container_id}) + elseif section == "15connect" then + local connect_network = table_info[section]._value + local network_opiton + if connect_network ~= "none" and connect_network ~= "bridge" and connect_network ~= "host" then + -- luci.util.perror(table_info[section]._opts) + network_opiton = table_info[section]._opts ~= "" and { + IPAMConfig={ + IPv4Address=table_info[section]._opts + } + } or nil + end + docker:append_status("Network: connect " .. connect_network .. container_id .. "...") + res = dk.networks:connect(connect_network, nil, {Container = container_id, EndpointConfig= network_opiton}) + end + if res and res.code > 300 then + docker:append_status("fail code:" .. res.code.." ".. (res.body.message and res.body.message or res.message)) + else + docker:clear_status() + end + luci.http.redirect(luci.dispatcher.build_url("admin/docker/container/"..container_id.."/info")) + end + +-- info end +elseif action == "edit" then + editsection= m:section(SimpleSection) + d = editsection:option( Value, "cpus", translate("CPUs"), translate("Number of CPUs. Number is a fractional number. 0.000 means no limit.")) + d.placeholder = "1.5" + d.rmempty = true + d.datatype="ufloat" + d.default = container_info.HostConfig.NanoCpus / (10^9) + + d = editsection:option(Value, "cpushares", translate("CPU Shares Weight"), translate("CPU shares relative weight, if 0 is set, the system will ignore the value and use the default of 1024.")) + d.placeholder = "1024" + d.rmempty = true + d.datatype="uinteger" + d.default = container_info.HostConfig.CpuShares + + d = editsection:option(Value, "memory", translate("Memory"), translate("Memory limit (format: []). Number is a positive integer. Unit can be one of b, k, m, or g. Minimum is 4M.")) + d.placeholder = "128m" + d.rmempty = true + d.default = container_info.HostConfig.Memory ~=0 and ((container_info.HostConfig.Memory / 1024 /1024) .. "M") or 0 + + d = editsection:option(Value, "blkioweight", translate("Block IO Weight"), translate("Block IO weight (relative weight) accepts a weight value between 10 and 1000.")) + d.placeholder = "500" + d.rmempty = true + d.datatype="uinteger" + d.default = container_info.HostConfig.BlkioWeight + + m.handle = function(self, state, data) + if state == FORM_VALID then + local memory = data.memory + if memory and memory ~= 0 then + _,_,n,unit = memory:find("([%d%.]+)([%l%u]+)") + if n then + unit = unit and unit:sub(1,1):upper() or "B" + if unit == "M" then + memory = tonumber(n) * 1024 * 1024 + elseif unit == "G" then + memory = tonumber(n) * 1024 * 1024 * 1024 + elseif unit == "K" then + memory = tonumber(n) * 1024 + else + memory = tonumber(n) + end + end + end + request_body = { + BlkioWeight = tonumber(data.blkioweight), + NanoCPUs = tonumber(data.cpus)*10^9, + Memory = tonumber(memory), + CpuShares = tonumber(data.cpushares) + } + docker:clear_status() + docker:append_status("Containers: update " .. container_id .. "...") + local res = dk.containers:update(container_id, nil, request_body) + if res and res.code >= 300 then + docker:append_status("fail code:" .. res.code.." ".. (res.body.message and res.body.message or res.message)) + else + docker:clear_status() + end + luci.http.redirect(luci.dispatcher.build_url("admin/docker/container/"..container_id.."/edit")) + end + end +elseif action == "logs" then + logsection= m:section(SimpleSection) + local logs = "" + local query ={ + stdout = 1, + stderr = 1, + tail = 1000 + } + local logs = dk.containers:logs(container_id, query) + if logs.code == 200 then + logsection.syslog=logs.body + else + logsection.syslog="Get Logs ERROR\n"..logs.code..": "..logs.body + end + logsection.title=translate("Container Logs") + logsection.template="docker/logs" + m.submit = false + m.reset = false +elseif action == "stats" then + local response = dk.containers:top(container_id, {ps_args="-aux"}) + local container_top + if response.code == 200 then + container_top=response.body + else + response = dk.containers:top(container_id) + if response.code == 200 then + container_top=response.body + end + end + + if type(container_top) == "table" then + container_top=response.body + stat_section = m:section(SimpleSection) + stat_section.container_id = container_id + stat_section.template="docker/stats" + table_stats = {cpu={key=translate("CPU Useage"),value='-'},memory={key=translate("Memory Useage"),value='-'}} + stat_section = m:section(Table, table_stats, translate("Stats")) + stat_section:option(DummyValue, "key", translate("Stats")).width="33%" + + stat_section:option(DummyValue, "value") + top_section= m:section(Table, container_top.Processes, translate("TOP")) + for i, v in ipairs(container_top.Titles) do + top_section:option(DummyValue, i, translate(v)) + end +end +m.submit = false +m.reset = false +end + + +return m \ No newline at end of file diff --git a/package/ctcgfw/luci-app-dockerman/luasrc/model/cbi/docker/containers.lua b/package/ctcgfw/luci-app-dockerman/luasrc/model/cbi/docker/containers.lua new file mode 100644 index 0000000000..6939f05d36 --- /dev/null +++ b/package/ctcgfw/luci-app-dockerman/luasrc/model/cbi/docker/containers.lua @@ -0,0 +1,203 @@ +--[[ +LuCI - Lua Configuration Interface +Copyright 2019 lisaac +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 +$Id$ +]]-- + +require "luci.util" +local http = require "luci.http" +local uci = luci.model.uci.cursor() +local docker = require "luci.model.docker" +local dk = docker.new() + +local images, networks, containers +local res = dk.images:list() +if res.code <300 then images = res.body else return end +res = dk.networks:list() +if res.code <300 then networks = res.body else return end +res = dk.containers:list(nil, {all=true}) +if res.code <300 then containers = res.body else return end + +local urlencode = luci.http.protocol and luci.http.protocol.urlencode or luci.util.urlencode + +function get_containers() + local data = {} + if type(containers) ~= "table" then return nil end + for i, v in ipairs(containers) do + local index = v.Created .. v.Id + data[index]={} + data[index]["_selected"] = 0 + data[index]["_id"] = v.Id:sub(1,12) + data[index]["_name"] = v.Names[1]:sub(2) + data[index]["_status"] = v.Status + if v.Status:find("^Up") then + data[index]["_status"] = ''.. data[index]["_status"] .. "" + else + data[index]["_status"] = ''.. data[index]["_status"] .. "" + end + if (type(v.NetworkSettings) == "table" and type(v.NetworkSettings.Networks) == "table") then + for networkname, netconfig in pairs(v.NetworkSettings.Networks) do + data[index]["_network"] = (data[index]["_network"] ~= nil and (data[index]["_network"] .." | ") or "").. networkname .. (netconfig.IPAddress ~= "" and (": " .. netconfig.IPAddress) or "") + end + end + -- networkmode = v.HostConfig.NetworkMode ~= "default" and v.HostConfig.NetworkMode or "bridge" + -- data[index]["_network"] = v.NetworkSettings.Networks[networkmode].IPAddress or nil + -- local _, _, image = v.Image:find("^sha256:(.+)") + -- if image ~= nil then + -- image=image:sub(1,12) + -- end + + if v.Ports then + data[index]["_ports"] = nil + for _,v2 in ipairs(v.Ports) do + data[index]["_ports"] = (data[index]["_ports"] and (data[index]["_ports"] .. ", ") or "") .. (v2.PublicPort and (v2.PublicPort .. ":") or "") .. (v2.PrivatePort and (v2.PrivatePort .."/") or "") .. (v2.Type and v2.Type or "") + end + end + for ii,iv in ipairs(images) do + if iv.Id == v.ImageID then + data[index]["_image"] = iv.RepoTags and iv.RepoTags[1] or (iv.RepoDigests[1]:gsub("(.-)@.+", "%1") .. ":none") + end + end + + data[index]["_image_id"] = v.ImageID:sub(8,20) + data[index]["_command"] = v.Command + end + return data +end + +local c_lists = get_containers() +-- list Containers +-- m = Map("docker", translate("Docker")) +m = SimpleForm("docker", translate("Docker")) +m.template = "docker/cbi/xsimpleform" +m.submit=false +m.reset=false + +docker_status = m:section(SimpleSection) +docker_status.template="docker/apply_widget" +docker_status.err=nixio.fs.readfile(dk.options.status_path) +-- luci.util.perror(docker_status.err) +if docker_status.err then docker:clear_status() end + +c_table = m:section(Table, c_lists, translate("Containers")) +c_table.nodescr=true +-- v.template = "cbi/tblsection" +-- v.sortable = true +container_selecter = c_table:option(Flag, "_selected","") +container_selecter.disabled = 0 +container_selecter.enabled = 1 +container_selecter.default = 0 + +container_id = c_table:option(DummyValue, "_id", translate("ID")) +container_id.width="10%" +container_name = c_table:option(DummyValue, "_name", translate("Name")) +container_name.width="20%" +container_name.template="docker/cbi/dummyvalue" +container_name.href = function (self, section) + return luci.dispatcher.build_url("admin/docker/container/" .. urlencode(container_id:cfgvalue(section))) +end +container_status = c_table:option(DummyValue, "_status", translate("Status")) +container_status.width="15%" +container_status.rawhtml=true +container_ip = c_table:option(DummyValue, "_network", translate("Network")) +container_ip.width="15%" +container_ports = c_table:option(DummyValue, "_ports", translate("Ports")) +container_ports.width="10%" +container_image = c_table:option(DummyValue, "_image", translate("Image")) +container_image.template="docker/cbi/dummyvalue" +container_image.width="10%" +-- container_image.href = function (self, section) +-- return luci.dispatcher.build_url("admin/docker/image/" .. urlencode(c_lists[section]._image_id)) +-- end +container_command = c_table:option(DummyValue, "_command", translate("Command")) +container_command.width="20%" + +container_selecter.write=function(self, section, value) + c_lists[section]._selected = value +end + +local start_stop_remove = function(m,cmd) + -- luci.template.render("admin_uci/apply", { + -- changes = next(changes) and changes, + -- configs = reload + -- }) + + local c_selected = {} + -- 遍历table中sectionid + local c_table_sids = c_table:cfgsections() + for _, c_table_sid in ipairs(c_table_sids) do + -- 得到选中项的名字 + if c_lists[c_table_sid]._selected == 1 then + c_selected[#c_selected+1] = container_name:cfgvalue(c_table_sid) + end + end + if #c_selected >0 then + -- luci.util.perror(dk.options.status_path) + docker:clear_status() + local success = true + for _,cont in ipairs(c_selected) do + docker:append_status("Containers: " .. cmd .. " " .. cont .. "...") + local res = dk.containers[cmd](dk, cont) + if res and res.code >= 300 then + success = false + docker:append_status("fail code:" .. res.code.." ".. (res.body.message and res.body.message or res.message).. "
") + else + docker:append_status("done
") + end + end + if success then docker:clear_status() end + luci.http.redirect(luci.dispatcher.build_url("admin/docker/containers")) + end +end + +action_section = m:section(Table,{{}}) +action_section.notitle=true +action_section.rowcolors=false +action_section.template="cbi/nullsection" + +btnnew=action_section:option(Button, "_new") +btnnew.inputtitle= translate("New") +btnnew.template="docker/cbi/inlinebutton" +btnnew.inputstyle = "add" +btnnew.forcewrite = true +btnstart=action_section:option(Button, "_start") +btnstart.template="docker/cbi/inlinebutton" +btnstart.inputtitle=translate("Start") +btnstart.inputstyle = "apply" +btnstart.forcewrite = true +btnrestart=action_section:option(Button, "_restart") +btnrestart.template="docker/cbi/inlinebutton" +btnrestart.inputtitle=translate("Restart") +btnrestart.inputstyle = "reload" +btnrestart.forcewrite = true +btnstop=action_section:option(Button, "_stop") +btnstop.template="docker/cbi/inlinebutton" +btnstop.inputtitle=translate("Stop") +btnstop.inputstyle = "reset" +btnstop.forcewrite = true +btnremove=action_section:option(Button, "_remove") +btnremove.template="docker/cbi/inlinebutton" +btnremove.inputtitle=translate("Remove") +btnremove.inputstyle = "remove" +btnremove.forcewrite = true +btnnew.write = function(self, section) + luci.http.redirect(luci.dispatcher.build_url("admin/docker/newcontainer")) +end +btnstart.write = function(self, section) + start_stop_remove(m,"start") +end +btnrestart.write = function(self, section) + start_stop_remove(m,"restart") +end +btnremove.write = function(self, section) + start_stop_remove(m,"remove") +end +btnstop.write = function(self, section) + start_stop_remove(m,"stop") +end + +return m \ No newline at end of file diff --git a/package/ctcgfw/luci-app-dockerman/luasrc/model/cbi/docker/images.lua b/package/ctcgfw/luci-app-dockerman/luasrc/model/cbi/docker/images.lua new file mode 100644 index 0000000000..6cbb208589 --- /dev/null +++ b/package/ctcgfw/luci-app-dockerman/luasrc/model/cbi/docker/images.lua @@ -0,0 +1,178 @@ +--[[ +LuCI - Lua Configuration Interface +Copyright 2019 lisaac +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 +$Id$ +]]-- + +require "luci.util" +local uci = luci.model.uci.cursor() +local docker = require "luci.model.docker" +local dk = docker.new() + +local containers, images +local res = dk.images:list() +if res.code <300 then images = res.body else return end +res = dk.containers:list(nil, {all=true}) +if res.code <300 then containers = res.body else return end + +function get_images() + local data = {} + for i, v in ipairs(images) do + local index = v.Created .. v.Id + data[index]={} + data[index]["_selected"] = 0 + data[index]["_id"] = v.Id:sub(8,20) + if v.RepoTags then + for i, v1 in ipairs(v.RepoTags) do + data[index]["_tags"] =(data[index]["_tags"] and ( data[index]["_tags"] .. "" )or "") .. v1 + end + else + _,_, data[index]["_tags"] = v.RepoDigests[1]:find("^(.-)@.+") + data[index]["_tags"]=data[index]["_tags"]..":none" + end + for ci,cv in ipairs(containers) do + if v.Id == cv.ImageID then + data[index]["_containers"] = (data[index]["_containers"] and (data[index]["_containers"] .. " | ") or "").. + "".. cv.Names[1]:sub(2).."" + end + end + data[index]["_size"] = string.format("%.2f", tostring(v.Size/1024/1024)).."MB" + data[index]["_created"] = os.date("%Y/%m/%d %H:%M:%S",v.Created) + end + return data +end + +local image_list = get_images() + +-- m = Map("docker", translate("Docker")) +m = SimpleForm("docker", translate("Docker")) +m.template = "docker/cbi/xsimpleform" +m.submit=false +m.reset=false + +local pull_value={{_image_tag_name="", _registry="index.docker.io"}} +local pull_section = m:section(Table,pull_value, translate("Pull Image")) +pull_section.template="cbi/nullsection" +local tag_name = pull_section:option(Value, "_image_tag_name") +tag_name.template="docker/cbi/inlinevalue" +tag_name.placeholder="lisaac/luci:latest" +local registry = pull_section:option(Value, "_registry") +registry.template="docker/cbi/inlinevalue" +registry:value("index.docker.io", "DockerHub") +local action_pull = pull_section:option(Button, "_pull") +action_pull.inputtitle= translate("Pull") +action_pull.template="docker/cbi/inlinebutton" +action_pull.inputstyle = "add" +tag_name.write = function(self, section,value) + local hastag = value:find(":") + if not hastag then + value = value .. ":latest" + end + pull_value[section]["_image_tag_name"] = value +end +registry.write = function(self, section,value) + pull_value[section]["_registry"] = value +end +action_pull.write = function(self, section) + local tag = pull_value[section]["_image_tag_name"] + local server = pull_value[section]["_registry"] + --去掉协议前缀和后缀 + local _,_,tmp = server:find(".-://([%.%w%-%_]+)") + if not tmp then + _,_,server = server:find("([%.%w%-%_]+)") + end + local json_stringify = luci.json and luci.json.encode or luci.jsonc.stringify + if tag then + docker:clear_status() + docker:append_status("Images: " .. "pulling" .. " " .. tag .. "...") + local x_auth = nixio.bin.b64encode(json_stringify({serveraddress= server})) + local res = dk.images:create(nil, {fromImage=tag,_header={["X-Registry-Auth"]=x_auth}}) + if res and res.code >=300 then + docker:append_status("fail code:" .. res.code.." ".. (res.body.message and res.body.message or res.message).. "
") + else + docker:append_status("done
") + end + luci.http.redirect(luci.dispatcher.build_url("admin/docker/images")) + end +end + +image_table = m:section(Table, image_list, translate("Images")) + +image_selecter = image_table:option(Flag, "_selected","") +image_selecter.disabled = 0 +image_selecter.enabled = 1 +image_selecter.default = 0 + +image_id = image_table:option(DummyValue, "_id", translate("ID")) +image_table:option(DummyValue, "_tags", translate("RepoTags")).rawhtml = true +image_table:option(DummyValue, "_containers", translate("Containers")).rawhtml = true +image_table:option(DummyValue, "_size", translate("Size")) +image_table:option(DummyValue, "_created", translate("Created")) +image_selecter.write = function(self, section, value) + image_list[section]._selected = value +end + +local remove_action = function(force) + local image_selected = {} + -- 遍历table中sectionid + local image_table_sids = image_table:cfgsections() + for _, image_table_sid in ipairs(image_table_sids) do + -- 得到选中项的名字 + if image_list[image_table_sid]._selected == 1 then + image_selected[#image_selected+1] = image_id:cfgvalue(image_table_sid) + end + end + if next(image_selected) ~= nil then + local success = true + docker:clear_status() + for _,img in ipairs(image_selected) do + docker:append_status("Images: " .. "remove" .. " " .. img .. "...") + local query_body ={} + if force then + query_body.force = true + end + local msg = dk.images["remove"](dk, img, query_body) + if msg.code ~= 200 then + docker:append_status("fail code:" .. msg.code.." ".. (msg.body.message and msg.body.message or msg.message).. "
") + success = false + else + docker:append_status("done
") + end + end + if success then docker:clear_status() end + luci.http.redirect(luci.dispatcher.build_url("admin/docker/images")) + end +end + +docker_status = m:section(SimpleSection) +docker_status.template="docker/apply_widget" +docker_status.err=nixio.fs.readfile(dk.options.status_path) +if docker_status.err then docker:clear_status() end + +action = m:section(Table,{{}}) +action.notitle=true +action.rowcolors=false +action.template="cbi/nullsection" + +btnremove = action:option(Button, "remove") +btnremove.inputtitle= translate("Remove") +btnremove.template="docker/cbi/inlinebutton" +btnremove.inputstyle = "remove" +btnremove.forcewrite = true +btnremove.write = function(self, section) + remove_action() +end + +btnforceremove = action:option(Button, "forceremove") +btnforceremove.inputtitle= translate("Force Remove") +btnforceremove.template="docker/cbi/inlinebutton" +btnforceremove.inputstyle = "remove" +btnforceremove.forcewrite = true +btnforceremove.write = function(self, section) + remove_action(true) +end +return m \ No newline at end of file diff --git a/package/ctcgfw/luci-app-dockerman/luasrc/model/cbi/docker/networks.lua b/package/ctcgfw/luci-app-dockerman/luasrc/model/cbi/docker/networks.lua new file mode 100644 index 0000000000..b1e924228e --- /dev/null +++ b/package/ctcgfw/luci-app-dockerman/luasrc/model/cbi/docker/networks.lua @@ -0,0 +1,128 @@ +--[[ +LuCI - Lua Configuration Interface +Copyright 2019 lisaac +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 +$Id$ +]]-- + +require "luci.util" +local uci = luci.model.uci.cursor() +local docker = require "luci.model.docker" +local dk = docker.new() +local networks +local res = dk.networks:list() +if res.code < 300 then networks = res.body else return end + +local get_networks = function () + local data = {} + + if type(networks) ~= "table" then return nil end + for i, v in ipairs(networks) do + local index = v.Created .. v.Id + data[index]={} + data[index]["_selected"] = 0 + data[index]["_id"] = v.Id:sub(1,12) + data[index]["_name"] = v.Name + data[index]["_driver"] = v.Driver + if v.Driver == "bridge" then + data[index]["_interface"] = v.Options["com.docker.network.bridge.name"] + elseif v.Driver == "macvlan" then + data[index]["_interface"] = v.Options.parent + end + data[index]["_subnet"] = v.IPAM and v.IPAM.Config[1] and v.IPAM.Config[1].Subnet or nil + data[index]["_gateway"] = v.IPAM and v.IPAM.Config[1] and v.IPAM.Config[1].Gateway or nil + end + return data +end + +local network_list = get_networks() +-- m = Map("docker", translate("Docker")) +m = SimpleForm("docker", translate("Docker")) +m.template = "docker/cbi/xsimpleform" +m.submit=false +m.reset=false + +network_table = m:section(Table, network_list, translate("Networks")) +network_table.nodescr=true + +network_selecter = network_table:option(Flag, "_selected","") +network_selecter.template = "docker/cbi/xfvalue" +network_id = network_table:option(DummyValue, "_id", translate("ID")) +network_selecter.disabled = 0 +network_selecter.enabled = 1 +network_selecter.default = 0 +network_selecter.render = function(self, section, scope) + self.disable = 0 + if network_list[section]["_name"] == "bridge" or network_list[section]["_name"] == "none" or network_list[section]["_name"] == "host" then + self.disable = 1 + end + Flag.render(self, section, scope) +end + +network_name = network_table:option(DummyValue, "_name", translate("Name")) +network_driver = network_table:option(DummyValue, "_driver", translate("Driver")) +network_interface = network_table:option(DummyValue, "_interface", translate("Parent Interface")) +network_subnet = network_table:option(DummyValue, "_subnet", translate("Subnet")) +network_gateway = network_table:option(DummyValue, "_gateway", translate("Gateway")) + +network_selecter.write = function(self, section, value) + network_list[section]._selected = value +end + +docker_status = m:section(SimpleSection) +docker_status.template="docker/apply_widget" +docker_status.err=nixio.fs.readfile(dk.options.status_path) +if docker_status.err then docker:clear_status() end + +action = m:section(Table,{{}}) +action.notitle=true +action.rowcolors=false +action.template="cbi/nullsection" +btnnew=action:option(Button, "_new") +btnnew.inputtitle= translate("New") +btnnew.template="docker/cbi/inlinebutton" +btnnew.notitle=true +btnnew.inputstyle = "add" +btnnew.forcewrite = true +btnnew.write = function(self, section) + luci.http.redirect(luci.dispatcher.build_url("admin/docker/newnetwork")) +end +btnremove = action:option(Button, "_remove") +btnremove.inputtitle= translate("Remove") +btnremove.template="docker/cbi/inlinebutton" +btnremove.inputstyle = "remove" +btnremove.forcewrite = true +btnremove.write = function(self, section) + local network_selected = {} + -- 遍历table中sectionid + local network_table_sids = network_table:cfgsections() + for _, network_table_sid in ipairs(network_table_sids) do + -- 得到选中项的名字 + if network_list[network_table_sid]._selected == 1 then + network_selected[#network_selected+1] = network_name:cfgvalue(network_table_sid) + end + end + if next(network_selected) ~= nil then + local success = true + docker:clear_status() + for _,net in ipairs(network_selected) do + docker:append_status("Networks: " .. "remove" .. " " .. net .. "...") + local res = dk.networks["remove"](dk, net) + if res and res.code >= 300 then + docker:append_status("fail code:" .. res.code.." ".. (res.body.message and res.body.message or res.message).. "
") + success = false + else + docker:append_status("done
") + end + end + if success then + docker:clear_status() + end + luci.http.redirect(luci.dispatcher.build_url("admin/docker/networks")) + end +end + +return m \ No newline at end of file diff --git a/package/ctcgfw/luci-app-dockerman/luasrc/model/cbi/docker/newcontainer.lua b/package/ctcgfw/luci-app-dockerman/luasrc/model/cbi/docker/newcontainer.lua new file mode 100644 index 0000000000..dbe5c6392b --- /dev/null +++ b/package/ctcgfw/luci-app-dockerman/luasrc/model/cbi/docker/newcontainer.lua @@ -0,0 +1,504 @@ +--[[ +LuCI - Lua Configuration Interface +Copyright 2019 lisaac +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 +$Id$ +]]-- + +require "luci.util" +local uci = luci.model.uci.cursor() +local docker = require "luci.model.docker" +local dk = docker.new() +local cmd_line = table.concat(arg, '/') +local create_body = {} + +local images = dk.images:list().body +local networks = dk.networks:list().body +local containers = dk.containers:list(nil, {all=true}).body + +-- reslvo default config +local default_config = { } +if cmd_line and cmd_line:match("^docker.+") then + local key = nil + --cursor = 0: docker run + --cursor = 1: resloving para + --cursor = 2: resloving image + --cursor > 2: resloving command + local cursor = 0 + for w in cmd_line:gmatch("[^%s]+") do + -- skip '\' + if w == '\\' then + -- start with '-' + elseif w:match("^%-+.+") and cursor <= 1 then + --key=value + local val + key, val = w:match("^%-%-(.-)=(.+)") + -- -dit + if not key then key = w:match("^%-%-(.+)") end + + if not key then + key = w:match("^%-(.+)") + if key:match("i") or key:match("t") or key:match("d") then + if key:match("i") then default_config["interactive"] = true end + if key:match("t") then default_config["tty"] = true end + -- clear key + key = nil + end + end + + if key == "v" or key == "volume" then + key = "mount" + elseif key == "p" then + key = "port" + elseif key == "e" then + key = "env" + elseif key == "net" then + key = "network" + elseif key == "cpu-shares" then + key = "cpushares" + elseif key == "m" then + key = "memory" + elseif key == "blkio-weight" then + key = "blkioweight" + elseif key == "privileged" then + default_config["privileged"] = true + key = nil + end + --key=value + if val then + if key == "mount" or key == "link" or key == "env" or key == "port" or key == "device" or key == "tmpfs" then + if not default_config[key] then default_config[key] = {} end + table.insert( default_config[key], val ) + else + default_config[key] = val + end + -- clear key + key = nil + end + cursor = 1 + -- value + elseif key and type(key) == "string" and cursor == 1 then + if key == "mount" or key == "link" or key == "env" or key == "port" or key == "device" or key == "tmpfs" then + if not default_config[key] then default_config[key] = {} end + table.insert( default_config[key], w ) + else + default_config[key] = w + end + if key == "cpus" or key == "cpushare" or key == "memory" or key == "blkioweight" or key == "device" or key == "tmpfs" then + default_config["advance"] = 1 + end + key = nil + cursor = 1 + --image and command + elseif cursor >= 1 and key == nil then + if cursor == 1 then + default_config["image"] = w + elseif cursor > 1 then + default_config["command"] = (default_config["command"] and (default_config["command"] .. " " )or "") .. w + end + cursor = cursor + 1 + end + end +elseif cmd_line and cmd_line:match("^duplicate/[^/]+$") then + local container_id = cmd_line:match("^duplicate/(.+)") + create_body = dk:containers_duplicate_config(container_id) + if not create_body.HostConfig then create_body.HostConfig = {} end + if next(create_body) ~= nil then + default_config.name = nil + default_config.image = create_body.Image + default_config.tty = create_body.Tty and true or false + default_config.interactive = create_body.OpenStdin and true or false + default_config.privileged = create_body.HostConfig.Privileged and true or false + default_config.restart = create_body.HostConfig.RestartPolicy and create_body.HostConfig.RestartPolicy.name or nil + -- default_config.network = create_body.HostConfig.NetworkMode == "default" and "bridge" or create_body.HostConfig.NetworkMode + -- if container has leave original network, and add new network, .HostConfig.NetworkMode is INcorrect, so using first child of .NetworkingConfig.EndpointsConfig + default_config.network = next(create_body.NetworkingConfig.EndpointsConfig) + default_config.ip = default_config.network and default_config.network ~= "bridge" and default_config.network ~= "host" and default_config.network ~= "null" and create_body.NetworkingConfig.EndpointsConfig[default_config.network].IPAMConfig and create_body.NetworkingConfig.EndpointsConfig[default_config.network].IPAMConfig.IPv4Address or nil + default_config.link = create_body.HostConfig.Links + default_config.env = create_body.Env + default_config.mount = create_body.HostConfig.Binds + + if create_body.HostConfig.PortBindings and type(create_body.HostConfig.PortBindings) == "table" then + default_config.port = {} + for k, v in pairs(create_body.HostConfig.PortBindings) do + table.insert( default_config.port, v[1].HostPort..":"..k:match("^(%d+)/.+").."/"..k:match("^%d+/(.+)") ) + end + end + + default_config.user = create_body.User or nil + default_config.command = create_body.Cmd and type(create_body.Cmd) == "table" and table.concat(create_body.Cmd, " ") or nil + default_config.advance = 1 + default_config.cpus = create_body.HostConfig.NanoCPUs + default_config.cpushares = create_body.HostConfig.CpuShares + default_config.memory = create_body.HostConfig.Memory + default_config.blkioweight = create_body.HostConfig.BlkioWeight + + if create_body.HostConfig.Devices and type(create_body.HostConfig.Devices) == "table" then + default_config.device = {} + for _, v in ipairs(create_body.HostConfig.Devices) do + table.insert( default_config.device, v.PathOnHost..":"..v.PathInContainer..(v.CgroupPermissions ~= "" and (":" .. v.CgroupPermissions) or "") ) + end + end + + default_config.tmpfs = create_body.HostConfig.Tmpfs + end +end + +local m = SimpleForm("docker", translate("Docker")) +m.template = "docker/cbi/xsimpleform" +m.redirect = luci.dispatcher.build_url("admin", "docker", "containers") +-- m.reset = false +-- m.submit = false +-- new Container + +docker_status = m:section(SimpleSection) +docker_status.template="docker/apply_widget" +docker_status.err=nixio.fs.readfile(dk.options.status_path) +if docker_status.err then docker:clear_status() end + +local s = m:section(SimpleSection, translate("New Container")) +s.addremove = true +s.anonymous = true + +local d = s:option(DummyValue,"cmd_line", translate("Resolv CLI")) +d.rawhtml = true +d.template = "docker/resolv_container" + +d = s:option(Value, "name", translate("Container Name")) +d.rmempty = true +d.default = default_config.name or nil + +d = s:option(Flag, "interactive", translate("Interactive (-i)")) +d.rmempty = true +d.disabled = 0 +d.enabled = 1 +d.default = default_config.interactive and 1 or 0 + +d = s:option(Flag, "tty", translate("TTY (-t)")) +d.rmempty = true +d.disabled = 0 +d.enabled = 1 +d.default = default_config.tty and 1 or 0 + +d = s:option(Flag, "_force_pull", translate("Always pull image first")) +d.rmempty = true +d.disabled = 0 +d.enabled = 1 +d.default = 0 + +d = s:option(Value, "image", translate("Docker Image")) +d.rmempty = true +d.default = default_config.image or nil +for _, v in ipairs (images) do + if v.RepoTags then + d:value(v.RepoTags[1], v.RepoTags[1]) + end +end + +d = s:option(Flag, "privileged", translate("Privileged")) +d.rmempty = true +d.disabled = 0 +d.enabled = 1 +d.default = default_config.privileged and 1 or 0 + +d = s:option(ListValue, "restart", translate("Restart Policy")) +d.rmempty = true + +d:value("no", "No") +d:value("unless-stopped", "Unless stopped") +d:value("always", "Always") +d:value("on-failure", "On failure") +d.default = default_config.restart or "unless-stopped" + +local d_network = s:option(ListValue, "network", translate("Networks")) +d_network.rmempty = true +d_network.default = default_config.network or "bridge" + +local d_ip = s:option(Value, "ip", translate("IPv4 Address")) +d_ip.datatype="ip4addr" +d_ip:depends("network", "nil") +d_ip.default = default_config.ip or nil + +d = s:option(Value, "user", translate("User")) +d.placeholder = "1000:1000" +d.rmempty = true +d.default = default_config.user or nil + +d = s:option(DynamicList, "link", translate("Links with other containers")) +d.template = "docker/cbi/xdynlist" +d.placeholder = "container_name:alias" +d.rmempty = true +d:depends("network", "bridge") +d.default = default_config.link or nil + +d = s:option(DynamicList, "env", translate("Environmental Variable")) +d.template = "docker/cbi/xdynlist" +d.placeholder = "TZ=Asia/Shanghai" +d.rmempty = true +d.default = default_config.env or nil + +d = s:option(DynamicList, "mount", translate("Bind Mount")) +d.template = "docker/cbi/xdynlist" +d.placeholder = "/media:/media:slave" +d.rmempty = true +d.default = default_config.mount or nil + +local d_ports = s:option(DynamicList, "port", translate("Exposed Ports")) +d_ports.template = "docker/cbi/xdynlist" +d_ports.placeholder = "2200:22/tcp" +d_ports.rmempty = true +d_ports.default = default_config.port or nil + +d = s:option(Value, "command", translate("Run command")) +d.placeholder = "/bin/sh init.sh" +d.rmempty = true +d.default = default_config.command or nil + +d = s:option(Flag, "advance", translate("Advance")) +d.rmempty = true +d.disabled = 0 +d.enabled = 1 +d.default = default_config.advance or 0 + +d = s:option(Value, "cpus", translate("CPUs"), translate("Number of CPUs. Number is a fractional number. 0.000 means no limit.")) +d.placeholder = "1.5" +d.rmempty = true +d:depends("advance", 1) +d.datatype="ufloat" +d.default = default_config.cpus or nil + +d = s:option(Value, "cpushares", translate("CPU Shares Weight"), translate("CPU shares (relative weight, if 0 is set, the system will ignore the value and use the default of 1024.")) +d.placeholder = "1024" +d.rmempty = true +d:depends("advance", 1) +d.datatype="uinteger" +d.default = default_config.cpushares or nil + +d = s:option(Value, "memory", translate("Memory"), translate("Memory limit (format: []). Number is a positive integer. Unit can be one of b, k, m, or g. Minimum is 4M.")) +d.placeholder = "128m" +d.rmempty = true +d:depends("advance", 1) +d.default = default_config.memory or nil + +d = s:option(Value, "blkioweight", translate("Block IO Weight"), translate("Block IO weight (relative weight) accepts a weight value between 10 and 1000.")) +d.placeholder = "500" +d.rmempty = true +d:depends("advance", 1) +d.datatype="uinteger" +d.default = default_config.blkioweight or nil + +d = s:option(DynamicList, "device", translate("Device")) +d.template = "docker/cbi/xdynlist" +d.placeholder = "/dev/sda:/dev/xvdc:rwm" +d.rmempty = true +d:depends("advance", 1) +d.default = default_config.device or nil + +d = s:option(DynamicList, "tmpfs", translate("Tmpfs"), translate("Mount tmpfs filesystems")) +d.template = "docker/cbi/xdynlist" +d.placeholder = "/run:rw,noexec,nosuid,size=65536k" +d.rmempty = true +d:depends("advance", 1) +d.default = default_config.tmpfs or nil + +for _, v in ipairs (networks) do + if v.Name then + local parent = v.Options and v.Options.parent or nil + local ip = v.IPAM and v.IPAM.Config and v.IPAM.Config[1] and v.IPAM.Config[1].Subnet or nil + ipv6 = v.IPAM and v.IPAM.Config and v.IPAM.Config[2] and v.IPAM.Config[2].Subnet or nil + local network_name = v.Name .. " | " .. v.Driver .. (parent and (" | " .. parent) or "") .. (ip and (" | " .. ip) or "").. (ipv6 and (" | " .. ipv6) or "") + d_network:value(v.Name, network_name) + + if v.Name ~= "none" and v.Name ~= "bridge" and v.Name ~= "host" then + d_ip:depends("network", v.Name) + end + + if v.Driver == "bridge" then + d_ports:depends("network", v.Name) + end + end +end + +m.handle = function(self, state, data) + if state ~= FORM_VALID then return end + local tmp + local name = data.name + local tty = type(data.tty) == "number" and (data.tty == 1 and true or false) or default_config.tty or false + local interactive = type(data.interactive) == "number" and (data.interactive == 1 and true or false) or default_config.interactive or false + local image = data.image + local user = data.user + if image and not image:match(".-:.+") then + image = image .. ":latest" + end + local privileged = type(data.privileged) == "number" and (data.privileged == 1 and true or false) or default_config.privileged or false + local restart = data.restart + local env = data.env + local network = data.network + local ip = (network ~= "bridge" and network ~= "host" and network ~= "none") and data.ip or nil + local mount = data.mount + local memory = data.memory or 0 + local cpushares = data.cpushares or 0 + local cpus = data.cpus or 0 + local blkioweight = data.blkioweight or 500 + + local portbindings = {} + local exposedports = {} + local tmpfs = {} + tmp = data.tmpfs + if type(tmp) == "table" then + for i, v in ipairs(tmp)do + local _,_, k,v1 = v:find("(.-):(.+)") + if k and v1 then + tmpfs[k]=v1 + end + end + end + + local device = {} + tmp = data.device + if type(tmp) == "table" then + for i, v in ipairs(tmp) do + local t = {} + local _,_, h, c, p = v:find("(.-):(.-):(.+)") + if h and c then + t['PathOnHost'] = h + t['PathInContainer'] = c + t['CgroupPermissions'] = p or nil + else + local _,_, h, c = v:find("(.-):(.+)") + if h and c then + t['PathOnHost'] = h + t['PathInContainer'] = c + end + end + if next(t) ~= nil then + table.insert( device, t ) + end + end + end + + tmp = data.port or {} + for i, v in ipairs(tmp) do + for v1 ,v2 in string.gmatch(v, "(%d+):([^%s]+)") do + local _,_,p= v2:find("^%d+/(%w+)") + if p == nil then + v2=v2..'/tcp' + end + portbindings[v2] = {{HostPort=v1}} + exposedports[v2] = {HostPort=v1} + end + end + + local link = data.link + tmp = data.command + local command = {} + if tmp ~= nil then + for v in string.gmatch(tmp, "[^%s]+") do + command[#command+1] = v + end + end + if memory ~= 0 then + _,_,n,unit = memory:find("([%d%.]+)([%l%u]+)") + if n then + unit = unit and unit:sub(1,1):upper() or "B" + if unit == "M" then + memory = tonumber(n) * 1024 * 1024 + elseif unit == "G" then + memory = tonumber(n) * 1024 * 1024 * 1024 + elseif unit == "K" then + memory = tonumber(n) * 1024 + else + memory = tonumber(n) + end + end + end + + create_body.Hostname = network ~= "host" and name or nil + create_body.Tty = tty and true or false + create_body.OpenStdin = interactive and true or false + create_body.User = user + create_body.Cmd = (#command ~= 0) and command or nil + create_body.Env = env + create_body.Image = image + create_body.ExposedPorts = (next(exposedports) ~= nil) and exposedports or nil + create_body.HostConfig = create_body.HostConfig or {} + create_body.HostConfig.Binds = (#mount ~= 0) and mount or nil + create_body.HostConfig.NetworkMode = network + create_body.HostConfig.RestartPolicy = { Name = restart, MaximumRetryCount = 0 } + create_body.HostConfig.Privileged = privileged and true or false + create_body.HostConfig.PortBindings = (next(portbindings) ~= nil) and portbindings or nil + create_body.HostConfig.Memory = tonumber(memory) + create_body.HostConfig.CpuShares = tonumber(cpushares) + create_body.HostConfig.NanoCPUs = tonumber(cpus) * 10 ^ 9 + create_body.HostConfig.BlkioWeight = tonumber(blkioweight) + if ip then + if create_body.NetworkingConfig and create_body.NetworkingConfig.EndpointsConfig and type(create_body.NetworkingConfig.EndpointsConfig) == "table" then + for k, v in pairs (create_body.NetworkingConfig.EndpointsConfig) do + if k == network and v.IPAMConfig and v.IPAMConfig.IPv4Address then + v.IPAMConfig.IPv4Address = ip + else + create_body.NetworkingConfig.EndpointsConfig = { [network] = { IPAMConfig = { IPv4Address = ip } } } + end + break + end + else + create_body.NetworkingConfig = { EndpointsConfig = { [network] = { IPAMConfig = { IPv4Address = ip } } } } + end + elseif not create_body.NetworkingConfig then + create_body.NetworkingConfig = nil + end + + if next(tmpfs) ~= nil then + create_body["HostConfig"]["Tmpfs"] = tmpfs + end + if next(device) ~= nil then + create_body["HostConfig"]["Devices"] = device + end + + if network == "bridge" and next(link) ~= nil then + create_body["HostConfig"]["Links"] = link + end + local pull_image = function(image) + local server = "index.docker.io" + local json_stringify = luci.json and luci.json.encode or luci.jsonc.stringify + docker:append_status("Images: " .. "pulling" .. " " .. image .. "...") + local x_auth = nixio.bin.b64encode(json_stringify({serveraddress= server})) + local res = dk.images:create(nil, {fromImage=image,_header={["X-Registry-Auth"]=x_auth}}) + if res and res.code < 300 then + docker:append_status("done
") + else + docker:append_status("fail code:" .. res.code.." ".. (res.body.message and res.body.message or res.message).. "
") + luci.http.redirect(luci.dispatcher.build_url("admin/docker/newcontainer")) + end + end + docker:clear_status() + local exist_image = false + if image then + for _, v in ipairs (images) do + if v.RepoTags and v.RepoTags[1] == image then + exist_image = true + break + end + end + if not exist_image then + pull_image(image) + elseif data._force_pull == 1 then + pull_image(image) + end + end + + docker:append_status("Container: " .. "create" .. " " .. name .. "...") + local res = dk.containers:create(name, nil, create_body) + if res and res.code == 201 then + docker:clear_status() + luci.http.redirect(luci.dispatcher.build_url("admin/docker/containers")) + else + docker:append_status("fail code:" .. res.code.." ".. (res.body.message and res.body.message or res.message)) + luci.http.redirect(luci.dispatcher.build_url("admin/docker/newcontainer")) + end +end + +return m \ No newline at end of file diff --git a/package/ctcgfw/luci-app-dockerman/luasrc/model/cbi/docker/newnetwork.lua b/package/ctcgfw/luci-app-dockerman/luasrc/model/cbi/docker/newnetwork.lua new file mode 100644 index 0000000000..7cd15dbc42 --- /dev/null +++ b/package/ctcgfw/luci-app-dockerman/luasrc/model/cbi/docker/newnetwork.lua @@ -0,0 +1,210 @@ +--[[ +LuCI - Lua Configuration Interface +Copyright 2019 lisaac +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 +$Id$ +]]-- + +require "luci.util" +local uci = luci.model.uci.cursor() +local docker = require "luci.model.docker" +local dk = docker.new() + +m = SimpleForm("docker", translate("Docker")) +m.template = "docker/cbi/xsimpleform" +m.redirect = luci.dispatcher.build_url("admin", "docker", "networks") + +docker_status = m:section(SimpleSection) +docker_status.template="docker/apply_widget" +docker_status.err=nixio.fs.readfile(dk.options.status_path) +if docker_status.err then docker:clear_status() end + +s = m:section(SimpleSection, translate("New Network")) +s.addremove = true +s.anonymous = true + +d = s:option(Value, "name", translate("Network Name")) +d.rmempty = true + +d = s:option(ListValue, "dirver", translate("Driver")) +d.rmempty = true +d:value("bridge", "bridge") +d:value("macvlan", "macvlan") +d:value("ipvlan", "ipvlan") +d:value("overlay", "overlay") + +d = s:option(Value, "parent", translate("Parent Interface")) +d.rmempty = true +d:depends("dirver", "macvlan") +d.placeholder="eth0" + +d = s:option(Value, "macvlan_mode", translate("Macvlan Mode")) +d.rmempty = true +d:depends("dirver", "macvlan") +d.default="bridge" +d:value("bridge", "bridge") +d:value("private", "private") +d:value("vepa", "vepa") +d:value("passthru", "passthru") + +d = s:option(Value, "ipvlan_mode", translate("Ipvlan Mode")) +d.rmempty = true +d:depends("dirver", "ipvlan") +d.default="l3" +d:value("l2", "l2") +d:value("l3", "l3") + +d = s:option(Flag, "ingress", translate("Ingress"), translate("Ingress network is the network which provides the routing-mesh in swarm mode.")) +d.rmempty = true +d.disabled = 0 +d.enabled = 1 +d.default = 0 +d:depends("dirver", "overlay") + +d = s:option(DynamicList, "options", translate("Options")) +d.template = "docker/cbi/xdynlist" +d.rmempty = true +d.placeholder="com.docker.network.driver.mtu=1500" + +d = s:option(Flag, "internal", translate("Internal"), translate("Restrict external access to the network")) +d.rmempty = true +d.disabled = 0 +d.enabled = 1 +d.default = 0 + +d = s:option(Value, "subnet", translate("Subnet")) +d.rmempty = true +d.placeholder="10.1.0.0/16" +d.datatype="ip4addr" + +d = s:option(Value, "gateway", translate("Gateway")) +d.rmempty = true +d.placeholder="10.1.1.1" +d.datatype="ip4addr" + +d = s:option(Value, "ip_range", translate("IP range")) +d.rmempty = true +d.placeholder="10.1.1.0/24" +d.datatype="ip4addr" + +d = s:option(DynamicList, "aux_address", translate("Exclude IPs")) +d.template = "docker/cbi/xdynlist" +d.rmempty = true +d.placeholder="my-route=10.1.1.1" + +d = s:option(Flag, "ipv6", translate("Enable IPv6")) +d.rmempty = true +d.disabled = 0 +d.enabled = 1 +d.default = 0 + +d = s:option(Value, "subnet6", translate("IPv6 Subnet")) +d.rmempty = true +d.placeholder="fe80::/10" +d.datatype="ip6addr" +d:depends("ipv6", 1) + +d = s:option(Value, "gateway6", translate("IPv6 Gateway")) +d.rmempty = true +d.placeholder="fe80::1" +d.datatype="ip6addr" +d:depends("ipv6", 1) + +m.handle = function(self, state, data) + if state == FORM_VALID then + local name = data.name + local driver = data.dirver + + local internal = data.internal == 1 and true or false + + local subnet = data.subnet + local gateway = data.gateway + local ip_range = data.ip_range + + local aux_address = {} + local tmp = data.aux_address or {} + for i,v in ipairs(tmp) do + _,_,k1,v1 = v:find("(.-)=(.+)") + aux_address[k1] = v1 + end + + local options = {} + tmp = data.options or {} + for i,v in ipairs(tmp) do + _,_,k1,v1 = v:find("(.-)=(.+)") + options[k1] = v1 + end + + local ipv6 = data.ipv6 == 1 and true or false + + local create_body={ + Name = name, + Driver = driver, + EnableIPv6 = ipv6, + IPAM = { + Driver= "default" + }, + Internal = internal + } + + if subnet or gateway or ip_range then + create_body["IPAM"]["Config"] = { + { + Subnet = subnet, + Gateway = gateway, + IPRange = ip_range, + -- AuxAddress = aux_address + -- AuxiliaryAddresses = aux_address + } + } + end + if next(aux_address)~=nil then + create_body["IPAM"]["Config"]["AuxiliaryAddresses"] = aux_address + end + if driver == "macvlan" then + create_body["Options"] = { + macvlan_mode = data.macvlan_mode, + parent = data.parent + } + elseif driver == "ipvlan" then + create_body["Options"] = { + ipvlan_mode = data.ipvlan_mode + } + elseif driver == "overlay" then + create_body["Ingress"] = data.ingerss == 1 and true or false + end + + if ipv6 and data.subnet6 and data.subnet6 then + if type(create_body["IPAM"]["Config"]) ~= "table" then + create_body["IPAM"]["Config"] = {} + end + local index = #create_body["IPAM"]["Config"] + create_body["IPAM"]["Config"][index+1] = { + Subnet = data.subnet6, + Gateway = data.gateway6 + } + end + + if next(options) ~= nil then + create_body["Options"] = create_body["Options"] or {} + for k, v in pairs(options) do + create_body["Options"][k] = v + end + end + + docker:append_status("Network: " .. "create" .. " " .. create_body.Name .. "...") + local res = dk.networks:create(nil, nil, create_body) + if res and res.code == 201 then + docker:clear_status() + luci.http.redirect(luci.dispatcher.build_url("admin/docker/networks")) + else + docker:append_status("fail code:" .. res.code.." ".. (res.body.message and res.body.message or res.message).. "
") + luci.http.redirect(luci.dispatcher.build_url("admin/docker/newnetwork")) + end + end +end + +return m \ No newline at end of file diff --git a/package/ctcgfw/luci-app-dockerman/luasrc/model/cbi/docker/overview.lua b/package/ctcgfw/luci-app-dockerman/luasrc/model/cbi/docker/overview.lua new file mode 100644 index 0000000000..b56fe7dfdf --- /dev/null +++ b/package/ctcgfw/luci-app-dockerman/luasrc/model/cbi/docker/overview.lua @@ -0,0 +1,95 @@ +--[[ +LuCI - Lua Configuration Interface +Copyright 2019 lisaac +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 +$Id$ +]]-- + +require "luci.util" +local docker = require "luci.model.docker" +local uci = require "luci.model.uci" + +function byte_format(byte) + local suff = {"B", "KB", "MB", "GB", "TB"} + for i=1, 5 do + if byte > 1024 and i < 5 then + byte = byte / 1024 + else + return string.format("%.2f %s", byte, suff[i]) + end + end +end + +local m = Map("docker", translate("Docker")) +local docker_info_table = {} +-- docker_info_table['0OperatingSystem'] = {_key=translate("Operating System"),_value='-'} +-- docker_info_table['1Architecture'] = {_key=translate("Architecture"),_value='-'} +-- docker_info_table['2KernelVersion'] = {_key=translate("Kernel Version"),_value='-'} +docker_info_table['3ServerVersion'] = {_key=translate("Docker Version"),_value='-'} +docker_info_table['4ApiVersion'] = {_key=translate("Api Version"),_value='-'} +docker_info_table['5NCPU'] = {_key=translate("CPUs"),_value='-'} +docker_info_table['6MemTotal'] = {_key=translate("Total Memory"),_value='-'} +docker_info_table['7DockerRootDir'] = {_key=translate("Docker Root Dir"),_value='-'} +docker_info_table['8IndexServerAddress'] = {_key=translate("Index Server Address"),_value='-'} + +s = m:section(Table, docker_info_table) +s:option(DummyValue, "_key", translate("Info")) +s:option(DummyValue, "_value") + +s = m:section(SimpleSection) +s.containers_running = '-' +s.images_used = '-' +s.containers_total = '-' +s.images_total = '-' +s.networks_total = '-' +s.volumes_total = '-' +local socket = luci.model.uci.cursor():get("docker", "local", "socket_path") +if nixio.fs.access(socket) and (require "luci.model.docker").new():_ping().code == 200 then + local dk = docker.new() + -- local containers_list = dk.containers:list(nil, {all=true}).body + -- local images_list = dk.images:list().body + local volumes_list = dk.volumes:list().body.Volumes + local networks_list = dk.networks:list().body + local docker_info = dk:info() + -- docker_info_table['0OperatingSystem']._value = docker_info.body.OperatingSystem + -- docker_info_table['1Architecture']._value = docker_info.body.Architecture + -- docker_info_table['2KernelVersion']._value = docker_info.body.KernelVersion + docker_info_table['3ServerVersion']._value = docker_info.body.ServerVersion + docker_info_table['4ApiVersion']._value = docker_info.headers["Api-Version"] + docker_info_table['5NCPU']._value = tostring(docker_info.body.NCPU) + docker_info_table['6MemTotal']._value = tostring(byte_format(docker_info.body.MemTotal)) + docker_info_table['7DockerRootDir']._value = docker_info.body.DockerRootDir + docker_info_table['8IndexServerAddress']._value = docker_info.body.IndexServerAddress + + -- s.images_used = 0 + -- for i, v in ipairs(images_list) do + -- for ci,cv in ipairs(containers_list) do + -- if v.Id == cv.ImageID then + -- s.images_used = s.images_used + 1 + -- break + -- end + -- end + -- end + s.containers_running = tostring(docker_info.body.ContainersRunning) + -- s.images_used = tostring(s.images_used) + s.containers_total = tostring(docker_info.body.Containers) + s.images_total = tostring(docker_info.body.Images) + s.networks_total = tostring(#networks_list) + s.volumes_total = tostring(#volumes_list) +end +s.template = "docker/overview" + + +s = m:section(NamedSection, "local", "section", translate("Setting")) + +socket_path = s:option(Value, "socket_path", translate("Socket Path")) +status_path = s:option(Value, "status_path", translate("Action Status Tempfile Path"), translate("Where you want to save the docker status file")) +debug = s:option(Flag, "debug", translate("Enable Debug"), translate("For debug, It shows all docker API actions of luci-app-docker in Debug Tempfile Path")) +debug.enabled="true" +debug.disabled="false" +debug_path = s:option(Value, "debug_path", translate("Debug Tempfile Path"), translate("Where you want to save the debug tempfile")) + +return m diff --git a/package/ctcgfw/luci-app-dockerman/luasrc/model/cbi/docker/volumes.lua b/package/ctcgfw/luci-app-dockerman/luasrc/model/cbi/docker/volumes.lua new file mode 100644 index 0000000000..f5e3281ade --- /dev/null +++ b/package/ctcgfw/luci-app-dockerman/luasrc/model/cbi/docker/volumes.lua @@ -0,0 +1,121 @@ +--[[ +LuCI - Lua Configuration Interface +Copyright 2019 lisaac +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 +$Id$ +]]-- + +require "luci.util" +local uci = luci.model.uci.cursor() +local docker = require "luci.model.docker" +local dk = docker.new() + +local containers, volumes +local res = dk.volumes:list() +if res.code <300 then volumes = res.body.Volumes else return end +res = dk.containers:list(nil, {all=true}) +if res.code <300 then containers = res.body else return end + +function get_volumes() + local data = {} + for i, v in ipairs(volumes) do + -- local index = v.CreatedAt .. v.Name + local index = v.Name + data[index]={} + data[index]["_selected"] = 0 + data[index]["_nameraw"] = v.Name + data[index]["_name"] = v.Name:sub(1,12) + for ci,cv in ipairs(containers) do + if cv.Mounts and type(cv.Mounts) ~= "table" then break end + for vi, vv in ipairs(cv.Mounts) do + if v.Name == vv.Name then + data[index]["_containers"] = (data[index]["_containers"] and (data[index]["_containers"] .. " | ") or "").. + "".. cv.Names[1]:sub(2).."" + end + end + end + data[index]["_driver"] = v.Driver + data[index]["_mountpoint"] = nil + for v1 in v.Mountpoint:gmatch('[^/]+') do + if v1 == index then + data[index]["_mountpoint"] = data[index]["_mountpoint"] .."/" .. v1:sub(1,12) .. "..." + else + data[index]["_mountpoint"] = (data[index]["_mountpoint"] and data[index]["_mountpoint"] or "").."/".. v1 + end + end + data[index]["_created"] = v.CreatedAt + end + return data +end + +local volume_list = get_volumes() + +-- m = Map("docker", translate("Docker")) +m = SimpleForm("docker", translate("Docker")) +m.template = "docker/cbi/xsimpleform" +m.submit=false +m.reset=false + + +volume_table = m:section(Table, volume_list, translate("Volumes")) + +volume_selecter = volume_table:option(Flag, "_selected","") +volume_selecter.disabled = 0 +volume_selecter.enabled = 1 +volume_selecter.default = 0 + +volume_id = volume_table:option(DummyValue, "_name", translate("Name")) +volume_table:option(DummyValue, "_driver", translate("Driver")) +volume_table:option(DummyValue, "_containers", translate("Containers")).rawhtml = true +volume_table:option(DummyValue, "_mountpoint", translate("Mount Point")) +volume_table:option(DummyValue, "_created", translate("Created")) +volume_selecter.write = function(self, section, value) + volume_list[section]._selected = value +end + +docker_status = m:section(SimpleSection) +docker_status.template="docker/apply_widget" +docker_status.err=nixio.fs.readfile(dk.options.status_path) +if docker_status.err then docker:clear_status() end + +action = m:section(Table,{{}}) +action.notitle=true +action.rowcolors=false +action.template="cbi/nullsection" +btnremove = action:option(Button, "remove") +btnremove.inputtitle= translate("Remove") +btnremove.template="docker/cbi/inlinebutton" +btnremove.inputstyle = "remove" +btnremove.forcewrite = true +btnremove.write = function(self, section) + local volume_selected = {} + -- 遍历table中sectionid + local volume_table_sids = volume_table:cfgsections() + for _, volume_table_sid in ipairs(volume_table_sids) do + -- 得到选中项的名字 + if volume_list[volume_table_sid]._selected == 1 then + -- volume_selected[#volume_selected+1] = volume_id:cfgvalue(volume_table_sid) + volume_selected[#volume_selected+1] = volume_table_sid + end + end + if next(volume_selected) ~= nil then + local success = true + docker:clear_status() + for _,vol in ipairs(volume_selected) do + docker:append_status("Volumes: " .. "remove" .. " " .. vol .. "...") + local msg = dk.volumes["remove"](dk, vol) + if msg.code ~= 204 then + docker:append_status("fail code:" .. msg.code.." ".. (msg.body.message and msg.body.message or msg.message).. "
") + success = false + else + docker:append_status("done
") + end + end + if success then docker:clear_status() end + luci.http.redirect(luci.dispatcher.build_url("admin/docker/volumes")) + end +end +return m \ No newline at end of file diff --git a/package/ctcgfw/luci-app-dockerman/luasrc/model/docker.lua b/package/ctcgfw/luci-app-dockerman/luasrc/model/docker.lua new file mode 100644 index 0000000000..e1e3a943db --- /dev/null +++ b/package/ctcgfw/luci-app-dockerman/luasrc/model/docker.lua @@ -0,0 +1,234 @@ +--[[ +LuCI - Lua Configuration Interface +Copyright 2019 lisaac +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 +$Id$ +]]-- + +require "luci.util" +local docker = require "luci.docker" +local uci = (require "luci.model.uci").cursor() + +local _docker = {} + +--pull image and return iamge id +local update_image = function(self, image_name) + local server = "index.docker.io" + + local json_stringify = luci.json and luci.json.encode or luci.jsonc.stringify + _docker:append_status("Images: " .. "pulling" .. " " .. image_name .. "...") + local x_auth = nixio.bin.b64encode(json_stringify({serveraddress= server})) + local res = self.images:create(nil, {fromImage=image_name, _header={["X-Registry-Auth"]=x_auth}}) + if res and res.code < 300 then + _docker:append_status("done
") + else + _docker:append_status("fail code:" .. res.code.." ".. (res.body.message and res.body.message or res.message).. "
") + end + new_image_id = self.images:inspect(image_name).body.Id + return new_image_id, res +end + +local table_equal = function(t1, t2) + if not t1 then return true end + if not t2 then return false end + if #t1 ~= #t2 then return false end + for i, v in ipairs(t1) do + if t1[i] ~= t2[i] then return false end + end + return true +end + +local table_subtract = function(t1, t2) + if not t1 or next(t1) == nil then return nil end + if not t2 or next(t2) == nil then return t1 end + local res = {} + for _, v1 in ipairs(t1) do + local found = false + for _, v2 in ipairs(t2) do + if v1 == v2 then + found= true + break + end + end + if not found then + table.insert(res, v1) + end + end + return next(res) == nil and nil or res +end + +local map_subtract = function(t1, t2) + if not t1 or next(t1) == nil then return nil end + if not t2 or next(t2) == nil then return t1 end + local res = {} + for k1, v1 in pairs(t1) do + local found = false + for k2, v2 in ipairs(t2) do + if k1 == k2 and luci.util.serialize_data(v1) == luci.util.serialize_data(v2) then + found= true + break + end + end + if not found then + if v1 and type(v1) == "table" then + if next(v1) == nil then + res[k1] = { k = 'v' } + else + res[k1] = v1 + end + end + end + end + + return next(res) ~= nil and res or nil +end + +-- return create_body, extra_network +local get_config = function(old_config, old_host_config, old_network_setting, image_config) + local config = old_config + if config.WorkingDir == image_config.WorkingDir then config.WorkingDir = "" end + if config.User == image_config.User then config.User = "" end + if table_equal(config.Cmd, image_config.Cmd) then config.Cmd = nil end + if table_equal(config.Entrypoint, image_config.Entrypoint) then config.Entrypoint = nil end + if table_equal(config.ExposedPorts, image_config.ExposedPorts) then config.ExposedPorts = nil end + config.Env = table_subtract(config.Env, image_config.Env) + config.Labels = table_subtract(config.Labels, image_config.Labels) + config.Volumes = map_subtract(config.Volumes, image_config.Volumes) + -- subtract ports exposed in image from container + if old_host_config.PortBindings and next(old_host_config.PortBindings) ~= nil then + config.ExposedPorts = {} + for p, v in pairs(old_host_config.PortBindings) do + config.ExposedPorts[p] = { HostPort=v[1] and v[1].HostPort } + end + end + + -- handle network config, we need only one network, extras need to network connect action + local network_setting = {} + local multi_network = false + local extra_network = {} + for k, v in pairs(old_network_setting) do + if multi_network then + extra_network[k] = v + else + network_setting[k] = v + end + multi_network = true + end + + -- handle hostconfig + local host_config = old_host_config + if host_config.PortBindings and next(host_config.PortBindings) == nil then host_config.PortBindings = nil end + host_config.LogConfig = nil + + -- merge configs + local create_body = config + create_body["HostConfig"] = host_config + create_body["NetworkingConfig"] = {EndpointsConfig = network_setting} + + return create_body, extra_network +end + +local upgrade = function(self, container_id) + _docker:clear_status() + -- get image name, image id, container name, configuration information + local container_info = self.containers:inspect(container_id) + if container_info.code > 300 and type(container_info.body) == "table" then + return container_info + end + local image_name = container_info.body.Config.Image + if not image_name:match(".-:.+") then image_name = image_name .. ":latest" end + local old_image_id = container_info.body.Image + local container_name = container_info.body.Name:sub(2) + local old_config = container_info.body.Config + local old_host_config = container_info.body.HostConfig + local old_network_setting = container_info.body.NetworkSettings.Networks or {} + + local image_id, res = update_image(self, image_name) + if res and res.code > 300 then return res end + if image_id == old_image_id then + return {code = 305, body = {message = "Already up to date"}} + end + + _docker:append_status("Container: " .. "Stop" .. " " .. container_name .. "...") + res = self.containers:stop(container_name) + if res and res.code < 305 then + _docker:append_status("done
") + else + return res + end + + _docker:append_status("Container: rename" .. " " .. container_name .. " to ".. container_name .. "_old ...") + res = self.containers:rename(container_name,{ name = container_name .. "_old" }) + if res and res.code < 300 then + _docker:append_status("done
") + else + return res + end + + -- handle config + local image_config = self.images:inspect(old_image_id).body.Config + local create_body, extra_network = get_config(old_config, old_host_config, old_network_setting, image_config) + + -- create new container + _docker:append_status("Container: Create" .. " " .. container_name .. "...") + res = self.containers:create(container_name, nil, create_body) + if res and res.code > 300 then return res end + _docker:append_status("done
") + + -- extra networks need to network connect action + for k, v in pairs(extra_network) do + if v.IPAMConfig and next(v.IPAMConfig) == nil then v.IPAMConfig =nil end + if v.DriverOpts and next(v.DriverOpts) == nil then v.DriverOpts =nil end + if v.Aliases and next(v.Aliases) == nil then v.Aliases =nil end + + _docker:append_status("Networks: Connect" .. " " .. container_name .. "...") + res = self.networks:connect(k, nil, {Container = container_name, EndpointConfig = v}) + if res.code > 300 then return res end + + _docker:append_status("done
") + end + _docker:clear_status() + return res +end + +local duplicate_config = function (self, container_id) + local container_info = self.containers:inspect(container_id) + if container_info.code > 300 and type(container_info.body) == "table" then return nil end + local old_image_id = container_info.body.Image + local old_config = container_info.body.Config + local old_host_config = container_info.body.HostConfig + local old_network_setting = container_info.body.NetworkSettings.Networks or {} + local image_config = self.images:inspect(old_image_id).body.Config + return get_config(old_config, old_host_config, old_network_setting, image_config) +end + +_docker.new = function(option) + local option = option or {} + options = { + socket_path = option.socket_path or uci:get("docker", "local", "socket_path"), + debug = option.debug or uci:get("docker", "local", "debug") == 'true' and true or false, + debug_path = option.debug_path or uci:get("docker", "local", "debug_path") + } + local _new = docker.new(options) + _new.options.status_path = uci:get("docker", "local", "status_path") + _new.containers_upgrade = upgrade + _new.containers_duplicate_config = duplicate_config + return _new +end +_docker.options={} +_docker.options.status_path = uci:get("docker", "local", "status_path") + +_docker.append_status=function(self,val) + local file_docker_action_status=io.open(self.options.status_path, "a+") + file_docker_action_status:write(val) + file_docker_action_status:close() +end + +_docker.clear_status=function(self) + nixio.fs.remove(self.options.status_path) +end + +return _docker diff --git a/package/ctcgfw/luci-app-dockerman/luasrc/view/docker/apply_widget.htm b/package/ctcgfw/luci-app-dockerman/luasrc/view/docker/apply_widget.htm new file mode 100644 index 0000000000..d43cbb2e3b --- /dev/null +++ b/package/ctcgfw/luci-app-dockerman/luasrc/view/docker/apply_widget.htm @@ -0,0 +1,144 @@ + + \ No newline at end of file diff --git a/package/ctcgfw/luci-app-dockerman/luasrc/view/docker/cbi/dummyvalue.htm b/package/ctcgfw/luci-app-dockerman/luasrc/view/docker/cbi/dummyvalue.htm new file mode 100644 index 0000000000..b82589e07d --- /dev/null +++ b/package/ctcgfw/luci-app-dockerman/luasrc/view/docker/cbi/dummyvalue.htm @@ -0,0 +1,13 @@ +<%+cbi/valueheader%> +<% if self.href then %><% end -%> + <% + local val = self:cfgvalue(section) or self.default or "" + if not self.rawhtml then + write(pcdata(val)) + else + write(val) + end + %> +<%- if self.href then %><%end%> +" /> +<%+cbi/valuefooter%> \ No newline at end of file diff --git a/package/ctcgfw/luci-app-dockerman/luasrc/view/docker/cbi/inlinebutton.htm b/package/ctcgfw/luci-app-dockerman/luasrc/view/docker/cbi/inlinebutton.htm new file mode 100644 index 0000000000..b1b1932571 --- /dev/null +++ b/package/ctcgfw/luci-app-dockerman/luasrc/view/docker/cbi/inlinebutton.htm @@ -0,0 +1,7 @@ +
+ <% if self:cfgvalue(section) ~= false then %> + " type="submit"" <% if self.disable then %>disabled <% end %><%= attr("name", cbid) .. attr("id", cbid) .. attr("value", self.inputtitle or self.title)%> /> + <% else %> + - + <% end %> +
diff --git a/package/ctcgfw/luci-app-dockerman/luasrc/view/docker/cbi/inlinevalue.htm b/package/ctcgfw/luci-app-dockerman/luasrc/view/docker/cbi/inlinevalue.htm new file mode 100644 index 0000000000..cfbf44a217 --- /dev/null +++ b/package/ctcgfw/luci-app-dockerman/luasrc/view/docker/cbi/inlinevalue.htm @@ -0,0 +1,33 @@ +
+ <%- if self.title then -%> + + <%- end -%> + <%- if self.password then -%> + /> + <%- end -%> + 0, "data-choices", { self.keylist, self.vallist }) + %> /> + <%- if self.password then -%> +
+ <% end %> +
diff --git a/package/ctcgfw/luci-app-dockerman/luasrc/view/docker/cbi/xdynlist.htm b/package/ctcgfw/luci-app-dockerman/luasrc/view/docker/cbi/xdynlist.htm new file mode 100644 index 0000000000..549c4ce319 --- /dev/null +++ b/package/ctcgfw/luci-app-dockerman/luasrc/view/docker/cbi/xdynlist.htm @@ -0,0 +1,27 @@ +<%+cbi/valueheader%> +> +<% + local vals = self:cfgvalue(section) or self.default or {} + for i=1, #vals + 1 do + local val = vals[i] + if (val and #val > 0) or (i == 1) then +%> + />
+<% end end %> + +<%+cbi/valuefooter%> diff --git a/package/ctcgfw/luci-app-dockerman/luasrc/view/docker/cbi/xfvalue.htm b/package/ctcgfw/luci-app-dockerman/luasrc/view/docker/cbi/xfvalue.htm new file mode 100644 index 0000000000..04f7bc2ee8 --- /dev/null +++ b/package/ctcgfw/luci-app-dockerman/luasrc/view/docker/cbi/xfvalue.htm @@ -0,0 +1,10 @@ +<%+cbi/valueheader%> + /> + disabled <% end %><%= + attr("id", cbid) .. attr("name", cbid) .. attr("value", self.enabled or 1) .. + ifattr((self:cfgvalue(section) or self.default) == self.enabled, "checked", "checked") + %> /> + > +<%+cbi/valuefooter%> diff --git a/package/ctcgfw/luci-app-dockerman/luasrc/view/docker/cbi/xsimpleform.htm b/package/ctcgfw/luci-app-dockerman/luasrc/view/docker/cbi/xsimpleform.htm new file mode 100644 index 0000000000..7cfe8bf218 --- /dev/null +++ b/package/ctcgfw/luci-app-dockerman/luasrc/view/docker/cbi/xsimpleform.htm @@ -0,0 +1,89 @@ +<% + if not self.embedded then + %>
> + + + <% + end + + %>
<% + + if self.title and #self.title > 0 then + %>

<%=self.title%>

<% + end + + if self.description and #self.description > 0 then + %>
<%=self.description%>
<% + end + + self:render_children() + + %>
<% + + if self.message then + %>
<%=self.message%>
<% + end + + if self.errmessage then + %>
<%=self.errmessage%>
<% + end + + if not self.embedded then + if type(self.hidden) == "table" then + local k, v + for k, v in pairs(self.hidden) do + %><% + end + end + + local display_back = (self.redirect) + local display_cancel = (self.cancel ~= false and self.on_cancel) + local display_skip = (self.flow and self.flow.skip) + local display_submit = (self.submit ~= false) + local display_reset = (self.reset ~= false) + + if display_back or display_cancel or display_skip or display_submit or display_reset then + %>
<% + + if display_back then + %> <% + end + + if display_cancel then + local label = pcdata(self.cancel or translate("Cancel")) + %> <% + end + + if display_skip then + %> <% + end + + if display_submit then + local label = pcdata(self.submit or translate("Submit")) + %> <% + end + + if display_reset then + local label = pcdata(self.reset or translate("Reset")) + %> <% + end + + %>
<% + end + + %>
<% + end +%> + + diff --git a/package/ctcgfw/luci-app-dockerman/luasrc/view/docker/container.htm b/package/ctcgfw/luci-app-dockerman/luasrc/view/docker/container.htm new file mode 100644 index 0000000000..51c7f0acf4 --- /dev/null +++ b/package/ctcgfw/luci-app-dockerman/luasrc/view/docker/container.htm @@ -0,0 +1,24 @@ +
+ + + \ No newline at end of file diff --git a/package/ctcgfw/luci-app-dockerman/luasrc/view/docker/logs.htm b/package/ctcgfw/luci-app-dockerman/luasrc/view/docker/logs.htm new file mode 100644 index 0000000000..6147e95290 --- /dev/null +++ b/package/ctcgfw/luci-app-dockerman/luasrc/view/docker/logs.htm @@ -0,0 +1,24 @@ +<%# +LuCI - Lua Configuration Interface +Copyright 2008 Steven Barth +Copyright 2008 Jo-Philipp Wich + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +$Id$ + +-%> +<% if self.title == translate("Docker Events") then %> +<%+header%> +<% end %> +

<%=self.title%>

+
+ +
+<% if self.title == translate("Docker Events") then %> +<%+footer%> +<% end %> \ No newline at end of file diff --git a/package/ctcgfw/luci-app-dockerman/luasrc/view/docker/overview.htm b/package/ctcgfw/luci-app-dockerman/luasrc/view/docker/overview.htm new file mode 100644 index 0000000000..8684ca4218 --- /dev/null +++ b/package/ctcgfw/luci-app-dockerman/luasrc/view/docker/overview.htm @@ -0,0 +1,287 @@ + + +
+
+
+
+
+ + Docker icon + + +
+
+
+

<%:Containers%>

+

+ <%- if self.containers_total ~= "-" then -%><%- end -%> + <%=self.containers_running%> + /<%=self.containers_total%> + <%- if self.containers_total ~= "-" then -%><%- end -%> +

+
+
+
+
+
+
+
+ + + + + +
+
+
+

<%:Images%>

+

+ <%- if self.images_total ~= "-" then -%><%- end -%> + <%=self.images_total%> + + <%- if self.images_total ~= "-" then -%><%- end -%> +

+
+
+
+
+
+
+
+ + + + + + + + + + + + + + + + +
+
+
+

<%:Networks%>

+

+ <%- if self.networks_total ~= "-" then -%><%- end -%> + <%=self.networks_total%> + + <%- if self.networks_total ~= "-" then -%><%- end -%> +

+
+
+
+
+
+
+
+ + + +
+
+
+

<%:Volumes%>

+

+ <%- if self.volumes_total ~= "-" then -%><%- end -%> + <%=self.volumes_total%> + + <%- if self.volumes_total ~= "-" then -%><%- end -%> +

+
+
+
+
\ No newline at end of file diff --git a/package/ctcgfw/luci-app-dockerman/luasrc/view/docker/resolv_container.htm b/package/ctcgfw/luci-app-dockerman/luasrc/view/docker/resolv_container.htm new file mode 100644 index 0000000000..c8db55874c --- /dev/null +++ b/package/ctcgfw/luci-app-dockerman/luasrc/view/docker/resolv_container.htm @@ -0,0 +1,23 @@ +<%+cbi/valueheader%> + + + +<%+cbi/valuefooter%> \ No newline at end of file diff --git a/package/ctcgfw/luci-app-dockerman/luasrc/view/docker/stats.htm b/package/ctcgfw/luci-app-dockerman/luasrc/view/docker/stats.htm new file mode 100644 index 0000000000..5320db9dbf --- /dev/null +++ b/package/ctcgfw/luci-app-dockerman/luasrc/view/docker/stats.htm @@ -0,0 +1,60 @@ + \ No newline at end of file diff --git a/package/ctcgfw/luci-app-dockerman/po/zh-cn/dockerman.po b/package/ctcgfw/luci-app-dockerman/po/zh-cn/dockerman.po new file mode 100644 index 0000000000..a2bcb293aa --- /dev/null +++ b/package/ctcgfw/luci-app-dockerman/po/zh-cn/dockerman.po @@ -0,0 +1,299 @@ +msgid "Containers" +msgstr "容器" + +msgid "Images" +msgstr "镜像" + +msgid "Networks" +msgstr "网络" + +msgid "Volumes" +msgstr "存储卷" + +msgid "Events" +msgstr "事件" + +msgid "Docker Contaienr" +msgstr "Docker 容器" + +msgid "Start" +msgstr "启动" + +msgid "Restart" +msgstr "重启" + +msgid "Stop" +msgstr "停止" + +msgid "Upgrade" +msgstr "升级容器" + +msgid "Duplicate" +msgstr "复制容器" + +msgid "Remove" +msgstr "移除" + +msgid "Name" +msgstr "名称" + +msgid "Image" +msgstr "镜像" + +msgid "Status" +msgstr "状态" + +msgid "Created" +msgstr "创建时间" + +msgid "Start Time" +msgstr "启动时间" + +msgid "Healthy" +msgstr "健康" + +msgid "Restart Policy" +msgstr "重启策略" + +msgid "Update" +msgstr "更新" + +msgid "Device" +msgstr "设备" + +msgid "Mount/Volume" +msgstr "挂载/存储卷" + +msgid "Command" +msgstr "启动命令" + +msgid "Setting" +msgstr "设置" + +msgid "Driver" +msgstr "驱动" + +msgid "Env" +msgstr "环境变量" + +msgid "Ports" +msgstr "端口" + +msgid "Links" +msgstr "链接" + +msgid "Disconnect" +msgstr "断开" + +msgid "Connect Network" +msgstr "连接网络" + +msgid "Connect" +msgstr "连接" + +msgid "Info" +msgstr "信息" + +msgid "CPUs" +msgstr "CPU数量" + +msgid "Number of CPUs. Number is a fractional number. 0.000 means no limit." +msgstr "CPU数量,数字是小数,0.000表示没有限制。" + +msgid "CPU Shares Weight" +msgstr "CPU份额权重" + +msgid "" +"CPU shares relative weight, if 0 is set, the system will ignore the value and use the default of 1024." +msgstr "" +"CPU份额相对权重,如果设置为0,则系统将忽略该值,并使用默认值1024。" + +msgid "Memory" +msgstr "内存" + +msgid "" +"Memory limit (format: []). Number is a positive integer. Unit can be one of b, k, m, or g. Minimum is 4M." +msgstr "" +"内存限制 (格式: <容量>[<单位>]). 数字是一个正整数。单位可以是b,k,m或g之一。最小为4M。" + +msgid "Block IO Weight" +msgstr "IO 权重" + +msgid "" +"Block IO weight (relative weight) accepts a weight value between 10 and 1000." +msgstr "" +"IO 权重(相对权重)接受10到1000之间的权重值。" + +msgid "Container Logs" +msgstr "容器日志" + +msgid "RepoTags" +msgstr "标签" + +msgid "Size" +msgstr "大小" + +msgid "Force Remove" +msgstr "强制移除" + +msgid "Subnet" +msgstr "子网络" + +msgid "Gateway" +msgstr "网关" + +msgid "New" +msgstr "新建" + +msgid "Resolv CLI" +msgstr "解析命令行" + +msgid "Docker Image" +msgstr "Docker 镜像" + +msgid "User" +msgstr "用户" + +msgid "New Container" +msgstr "新容器" + +msgid "Container Name" +msgstr "容器名称" + +msgid "Interactive (-i)" +msgstr "互动式 (-i)" + +msgid "Always pull image first" +msgstr "始终先拉取镜像" + +msgid "Privileged" +msgstr "特权模式(Privileged)" + +msgid "IPv4 Address" +msgstr "IPv4 地址" + +msgid "Links with other containers" +msgstr "与其他容器的链接(Links)" + +msgid "Environmental Variable" +msgstr "环境变量(Env)" + +msgid "Bind Mount" +msgstr "挂载(-v)" + +msgid "Exposed Ports" +msgstr "暴露端口" + +msgid "Run command" +msgstr "运行命令" + +msgid "Advance" +msgstr "高级" + +msgid "Mount tmpfs filesystems" +msgstr "挂载tmpfs文件系统" + +msgid "New Network" +msgstr "新网络" + +msgid "Network Name" +msgstr "网络名称" + +msgid "Parent Interface" +msgstr "父接口" + +msgid "Macvlan Mode" +msgstr "Macvlan模式" + +msgid "Ipvlan Mode" +msgstr "Ipvlan模式" + +msgid "Ingress network is the network which provides the routing-mesh in swarm mode." +msgstr "Ingress网络是在群集模式下提供路由网的网络。" + +msgid "Options" +msgstr "选项" + +msgid "Restrict external access to the network" +msgstr "限制外部访问网络" + +msgid "IP range" +msgstr "IP范围" + +msgid "Exclude IPs" +msgstr "排除IP" + +msgid "Enable IPv6" +msgstr "启用IPv6" + +msgid "IPv6 Subnet" +msgstr "IPv6子网" + +msgid "IPv6 Gateway" +msgstr "IPv6网关" + +msgid "Docker Version" +msgstr "Docker版本" + +msgid "Api Version" +msgstr "API版本" + +msgid "Total Memory" +msgstr "总内存" + +msgid "Docker Root Dir" +msgstr "Docker根目录" + +msgid "Index Server Address" +msgstr "默认服务器地址" + +msgid "Socket Path" +msgstr "Socket路径" + +msgid "Action Status Tempfile Path" +msgstr "docker 动作状态的临时文件路径" + +msgid "Where you want to save the docker status file" +msgstr "保存docker status文件的位置" + +msgid "Enable Debug" +msgstr "启用调试" + +msgid "For debug, It shows all docker API actions of luci-app-docker in Debug Tempfile Path" +msgstr "用于调试,它在调试临时文件路径中显示luci-app-docker的所有docker API操作" + +msgid "Debug Tempfile Path" +msgstr "调试临时文件路径" + +msgid "Where you want to save the debug tempfile" +msgstr "保存调试临时文件的位置" + +msgid "Edit" +msgstr "编辑" + +msgid "Stats" +msgstr "状态" + +msgid "Logs" +msgstr "日志" + +msgid "Network TX/RX" +msgstr "网络发送/接收" + +msgid "CPU Useage" +msgstr "CPU用量" + +msgid "Memory Useage" +msgstr "内存用量" + +msgid "Docker Container" +msgstr "Docker 容器" + +msgid "Overview" +msgstr "概况" + +msgid "Pull Image" +msgstr "拉取镜像" + +msgid "Pull" +msgstr "拉取" \ No newline at end of file diff --git a/package/ctcgfw/luci-app-dockerman/root/etc/config/docker b/package/ctcgfw/luci-app-dockerman/root/etc/config/docker new file mode 100644 index 0000000000..fe78698788 --- /dev/null +++ b/package/ctcgfw/luci-app-dockerman/root/etc/config/docker @@ -0,0 +1,5 @@ +config section 'local' + option socket_path '/var/run/docker.sock' + option status_path '/tmp/.docker_action_status' + option debug_path '/tmp/.docker_debug' + option debug 'false' \ No newline at end of file diff --git a/package/ctcgfw/luci-app-filebrowser/Makefile b/package/ctcgfw/luci-app-filebrowser/Makefile new file mode 100644 index 0000000000..a34075954a --- /dev/null +++ b/package/ctcgfw/luci-app-filebrowser/Makefile @@ -0,0 +1,21 @@ +# Copyright (C) 2016 Openwrt.org +# +# This is free software, licensed under the Apache License, Version 2.0 . +# + +include $(TOPDIR)/rules.mk + +LUCI_TITLE:=LuCI Support for FileBrowser +LUCI_DEPENDS:=+filebrowser +LUCI_PKGARCH:=all + +PKG_NAME:=luci-app-filebrowser +PKG_VERSION:=snapshot +PKG_RELEASE:=118071b + +PKG_LICENSE:=GPLv3 +PKG_MAINTAINER:=[CTCGFW] Project OpenWRT + +include $(TOPDIR)/feeds/luci/luci.mk + +# call BuildPackage - OpenWrt buildroot signature diff --git a/package/ctcgfw/luci-app-filebrowser/luasrc/controller/filebrowser.lua b/package/ctcgfw/luci-app-filebrowser/luasrc/controller/filebrowser.lua new file mode 100644 index 0000000000..12b2396fbd --- /dev/null +++ b/package/ctcgfw/luci-app-filebrowser/luasrc/controller/filebrowser.lua @@ -0,0 +1,10 @@ +module("luci.controller.filebrowser", package.seeall) + +function index() + if not nixio.fs.access("/etc/config/filebrowser") then + return + end + local page + page = entry({"admin", "services", "filebrowser"}, cbi("filebrowser"), _("文件管理器"), 100) + page.dependent = true +end diff --git a/package/ctcgfw/luci-app-filebrowser/luasrc/model/cbi/filebrowser.lua b/package/ctcgfw/luci-app-filebrowser/luasrc/model/cbi/filebrowser.lua new file mode 100644 index 0000000000..bcfa0405ea --- /dev/null +++ b/package/ctcgfw/luci-app-filebrowser/luasrc/model/cbi/filebrowser.lua @@ -0,0 +1,65 @@ +require("luci.sys") +require("luci.util") +require("luci.model.ipkg") +local fs = require "nixio.fs" + +local uci = require "luci.model.uci".cursor() + +local m, s + +local running=(luci.sys.call("pidof filebrowser > /dev/null") == 0) + +local button = "" +local state_msg = "" +local trport = uci:get("filebrowser", "config", "port") +if running then + button = "      " +end + +if running then + state_msg = "" .. translate("FileBrowser运行中") .. "" +else + state_msg = "" .. translate("FileBrowser未运行") .. "" +end + +m = Map("filebrowser", translate("文件管理器"), translate("FileBrowser是一个基于Go的在线文件管理器,助您方便的管理设备上的文件。") .. button + .. "

" .. translate("FileBrowser运行状态").. " : " .. state_msg .. "
") + +s = m:section(TypedSection, "filebrowser", "") +s.addremove = false +s.anonymous = true + +enable = s:option(Flag, "enabled", translate("启用")) +enable.rmempty = false + +o = s:option(ListValue, "addr_type", translate("监听地址")) +o:value("local", translate("监听本机地址")) +o:value("lan", translate("监听局域网地址")) +o:value("wan", translate("监听全部地址")) +o.default = "lan" +o.rmempty = false + +o = s:option(Value, "port", translate("监听端口")) +o.placeholder = 8989 +o.default = 8989 +o.datatype = "port" +o.rmempty = false + +o = s:option(Value, "root_dir", translate("开放目录")) +o.placeholder = "/" +o.default = "/" +o.rmempty = false + +o = s:option(Value, "db_dir", translate("数据库目录")) +o.placeholder = "/etc" +o.default = "/etc" +o.rmempty = false +o.description = translate("普通用户请勿随意更改") + +o = s:option(Value, "db_name", translate("数据库名")) +o.placeholder = "filebrowser.db" +o.default = "filebrowser.db" +o.rmempty = false +o.description = translate("普通用户请勿随意更改") + +return m diff --git a/package/ctcgfw/luci-app-filebrowser/root/etc/config/filebrowser b/package/ctcgfw/luci-app-filebrowser/root/etc/config/filebrowser new file mode 100644 index 0000000000..3db6585e48 --- /dev/null +++ b/package/ctcgfw/luci-app-filebrowser/root/etc/config/filebrowser @@ -0,0 +1,10 @@ + +config filebrowser 'config' + option addr_type 'lan' + option db_dir '/etc' + option db_name 'filebrowser.db' + option enabled '0' + option port '8989' + option root_dir '/' + option username 'admin' + option password 'admin' diff --git a/package/ctcgfw/luci-app-filebrowser/root/etc/init.d/filebrowser b/package/ctcgfw/luci-app-filebrowser/root/etc/init.d/filebrowser new file mode 100755 index 0000000000..158588be48 --- /dev/null +++ b/package/ctcgfw/luci-app-filebrowser/root/etc/init.d/filebrowser @@ -0,0 +1,33 @@ +#!/bin/sh /etc/rc.common +# Copyright (C) 2019 [CTCGFW] Project OpenWRT + +START=90 +STOP=10 + +addr_type="$(uci get filebrowser.config.addr_type)" +db_dir="$(uci get filebrowser.config.db_dir)" +[ "${db_dir}" == "/" ] || db_dir="${db_dir%*/}" +db_name="$(uci get filebrowser.config.db_name| sed 's#/##g')" +enabled="$(uci get filebrowser.config.enabled)" +port="$(uci get filebrowser.config.port)" +root_dir="$(uci get filebrowser.config.root_dir)" + +if [ "${addr_type}" == "local" ];then + addr="127.0.0.1" +elif [ "${addr_type}" == "lan" ];then + addr="$(uci get network.lan.ipaddr)" +elif [ "${addr_type}" == "wan" ];then + addr="0.0.0.0" +fi + +start() { + stop + [ "$enabled" == "1" ] || exit 0 + mkdir -p "${root_dir}" + mkdir -p "${db_dir}" + filebrowser -a "${addr}" -d "${db_dir}/${db_name}" -p "${port}" -r "${root_dir}" >/dev/null 2>&1 & +} + +stop() { + killall -9 filebrowser >/dev/null 2>&1 +} diff --git a/package/ctcgfw/luci-app-filebrowser/root/etc/uci-defaults/luci-filebrowser b/package/ctcgfw/luci-app-filebrowser/root/etc/uci-defaults/luci-filebrowser new file mode 100755 index 0000000000..8fece8810e --- /dev/null +++ b/package/ctcgfw/luci-app-filebrowser/root/etc/uci-defaults/luci-filebrowser @@ -0,0 +1,11 @@ +#!/bin/sh + +uci -q batch <<-EOF >/dev/null + delete ucitrack.@filebrowser[-1] + add ucitrack filebrowser + set ucitrack.@filebrowser[-1].init=filebrowser + commit ucitrack +EOF + +rm -f /tmp/luci-indexcache +exit 0 \ No newline at end of file diff --git a/package/ctcgfw/luci-app-iptvhelper/Makefile b/package/ctcgfw/luci-app-iptvhelper/Makefile new file mode 100644 index 0000000000..17ccaf2a55 --- /dev/null +++ b/package/ctcgfw/luci-app-iptvhelper/Makefile @@ -0,0 +1,19 @@ +# Copyright 2019 Shun Li +# Licensed to the public under the GNU General Public License v3. + +include $(TOPDIR)/rules.mk + +PKG_NAME:=luci-app-iptvhelper +PKG_VERSION:=0.1.1 +PKG_RELEASE:=1 + +PKG_MAINTAINER:=Shun Li +PKG_LICENSE:=GPL-3.0 + +LUCI_TITLE:=LuCI support for iptvhelper +LUCI_DEPENDS:=+luci-compat +iptvhelper +LUCI_PKGARCH:=all + +include $(TOPDIR)/feeds/luci/luci.mk + +# call BuildPackage - OpenWrt buildroot signature \ No newline at end of file diff --git a/package/ctcgfw/luci-app-iptvhelper/luasrc/controller/iptvhelper.lua b/package/ctcgfw/luci-app-iptvhelper/luasrc/controller/iptvhelper.lua new file mode 100644 index 0000000000..8290207e41 --- /dev/null +++ b/package/ctcgfw/luci-app-iptvhelper/luasrc/controller/iptvhelper.lua @@ -0,0 +1,14 @@ +-- Copyright 2019 Shun Li +-- Licensed to the public under the GNU General Public License v3. + +module("luci.controller.iptvhelper", package.seeall) + +function index() + if not nixio.fs.access("/etc/config/iptvhelper") then + return + end + + local page = entry({"admin", "services", "iptvhelper"}, cbi("iptvhelper"), _("IPTV Helper")) + page.dependent = true + +end \ No newline at end of file diff --git a/package/ctcgfw/luci-app-iptvhelper/luasrc/model/cbi/iptvhelper.lua b/package/ctcgfw/luci-app-iptvhelper/luasrc/model/cbi/iptvhelper.lua new file mode 100644 index 0000000000..e4a106b05a --- /dev/null +++ b/package/ctcgfw/luci-app-iptvhelper/luasrc/model/cbi/iptvhelper.lua @@ -0,0 +1,34 @@ +-- Copyright 2019 Shun Li +-- Licensed to the public under the GNU General Public License v3. + +local sys = require "luci.sys" + +m = Map("iptvhelper", translate("IPTV Helper"), translate("Help you configure IPTV easily. Github")) + +s = m:section(TypedSection, "tvbox", translate("IPTV topbox parameters")) +s.addremove = true +s.anonymous = false + +enable=s:option(Flag, "disabled", translate("Enabled")) +enable.enabled = "0" +enable.disabled = "1" +enable.default = "1" +enable.rmempty = false +respawn=s:option(Flag, "respawn", translate("Respawn")) +respawn.default = false +ipset=s:option(Flag, "ipset", translate("Create ipset"), + translate("You can use it in mwan3.")) +ipset.default = true +dns_redir=s:option(Flag, "dns_redir", translate("Redirect topbox's DNS"), + translate("You may need it to jailbreak your topbox.")) +dns_redir.default = false + +host = s:option(Value, "mac", translate("Topbox MAC Address"), + translate("It is usually on the bottom side of topbox.")) +host.rmempty = false +host.datatype = "macaddr" +sys.net.mac_hints(function(mac, name) + host:value(mac, "%s (%s)" %{ mac, name }) +end) + +return m \ No newline at end of file diff --git a/package/ctcgfw/luci-app-iptvhelper/po/templates/iptvhelper.pot b/package/ctcgfw/luci-app-iptvhelper/po/templates/iptvhelper.pot new file mode 100644 index 0000000000..808b51ba8b --- /dev/null +++ b/package/ctcgfw/luci-app-iptvhelper/po/templates/iptvhelper.pot @@ -0,0 +1,49 @@ +msgid "" +msgstr "Content-Type: text/plain; charset=UTF-8" + +#: luci-app-iptvhelper/luasrc/model/cbi/iptvhelper.lua:19 +msgid "Create ipset" +msgstr "" + +#: luci-app-iptvhelper/luasrc/model/cbi/iptvhelper.lua:12 +msgid "Enabled" +msgstr "" + +#: luci-app-iptvhelper/luasrc/model/cbi/iptvhelper.lua:6 +msgid "" +"Help you configure IPTV easily. Github" +msgstr "" + +#: luci-app-iptvhelper/luasrc/controller/iptvhelper.lua:11 +#: luci-app-iptvhelper/luasrc/model/cbi/iptvhelper.lua:6 +msgid "IPTV Helper" +msgstr "" + +#: luci-app-iptvhelper/luasrc/model/cbi/iptvhelper.lua:8 +msgid "IPTV topbox parameters" +msgstr "" + +#: luci-app-iptvhelper/luasrc/model/cbi/iptvhelper.lua:27 +msgid "It is usually on the bottom side of topbox." +msgstr "" + +#: luci-app-iptvhelper/luasrc/model/cbi/iptvhelper.lua:22 +msgid "Redirect topbox's DNS" +msgstr "" + +#: luci-app-iptvhelper/luasrc/model/cbi/iptvhelper.lua:17 +msgid "Respawn" +msgstr "" + +#: luci-app-iptvhelper/luasrc/model/cbi/iptvhelper.lua:26 +msgid "Topbox MAC Address" +msgstr "" + +#: luci-app-iptvhelper/luasrc/model/cbi/iptvhelper.lua:20 +msgid "You can use it in mwan3." +msgstr "" + +#: luci-app-iptvhelper/luasrc/model/cbi/iptvhelper.lua:23 +msgid "You may need it to jailbreak your topbox." +msgstr "" diff --git a/package/ctcgfw/luci-app-iptvhelper/po/zh-cn/iptvhelper.po b/package/ctcgfw/luci-app-iptvhelper/po/zh-cn/iptvhelper.po new file mode 100644 index 0000000000..04f74b8fe4 --- /dev/null +++ b/package/ctcgfw/luci-app-iptvhelper/po/zh-cn/iptvhelper.po @@ -0,0 +1,50 @@ +msgid "" +msgstr "Content-Type: text/plain; charset=UTF-8\n" + +#: luci-app-iptvhelper/luasrc/model/cbi/iptvhelper.lua:19 +msgid "Create ipset" +msgstr "创建 ipset" + +#: luci-app-iptvhelper/luasrc/model/cbi/iptvhelper.lua:12 +msgid "Enabled" +msgstr "启用" + +#: luci-app-iptvhelper/luasrc/model/cbi/iptvhelper.lua:6 +msgid "" +"Help you configure IPTV easily. Github" +msgstr "帮助你轻松配置IPTV。Github" + +#: luci-app-iptvhelper/luasrc/controller/iptvhelper.lua:11 +#: luci-app-iptvhelper/luasrc/model/cbi/iptvhelper.lua:6 +msgid "IPTV Helper" +msgstr "IPTV 帮手" + +#: luci-app-iptvhelper/luasrc/model/cbi/iptvhelper.lua:8 +msgid "IPTV topbox parameters" +msgstr "IPTV 机顶盒参数" + +#: luci-app-iptvhelper/luasrc/model/cbi/iptvhelper.lua:27 +msgid "It is usually on the bottom side of topbox." +msgstr "它通常贴在机顶盒的底部" + +#: luci-app-iptvhelper/luasrc/model/cbi/iptvhelper.lua:22 +msgid "Redirect topbox's DNS" +msgstr "重定向机顶盒的DNS" + +#: luci-app-iptvhelper/luasrc/model/cbi/iptvhelper.lua:17 +msgid "Respawn" +msgstr "进程守护" + +#: luci-app-iptvhelper/luasrc/model/cbi/iptvhelper.lua:26 +msgid "Topbox MAC Address" +msgstr "机顶盒MAC地址" + +#: luci-app-iptvhelper/luasrc/model/cbi/iptvhelper.lua:20 +msgid "You can use it in mwan3." +msgstr "你可以在mwan3中使用它" + +#: luci-app-iptvhelper/luasrc/model/cbi/iptvhelper.lua:23 +msgid "You may need it to jailbreak your topbox." +msgstr "想要破解机顶盒可能会用到它" diff --git a/package/ctcgfw/luci-app-iptvhelper/root/etc/uci-defaults/40_iptvhelper b/package/ctcgfw/luci-app-iptvhelper/root/etc/uci-defaults/40_iptvhelper new file mode 100755 index 0000000000..8ee6587be0 --- /dev/null +++ b/package/ctcgfw/luci-app-iptvhelper/root/etc/uci-defaults/40_iptvhelper @@ -0,0 +1,12 @@ +#!/bin/sh + +# needed for "Save and Apply" to restart iptvhelper +uci -q batch <<-EOF >/dev/null + delete ucitrack.@iptvhelper[-1] + add ucitrack iptvhelper + set ucitrack.@iptvhelper[-1].init="iptvhelper" + commit ucitrack +EOF + +rm -f /tmp/luci-indexcache +exit 0 \ No newline at end of file diff --git a/package/ctcgfw/luci-app-k3screenctrl/Makefile b/package/ctcgfw/luci-app-k3screenctrl/Makefile new file mode 100644 index 0000000000..7666b5b568 --- /dev/null +++ b/package/ctcgfw/luci-app-k3screenctrl/Makefile @@ -0,0 +1,49 @@ +# Copyright (C) 2018 XiaoShan mivm.cn + +include $(TOPDIR)/rules.mk + +PKG_NAME:=luci-app-k3screenctrl +PKG_VERSION:=1.1.0 +PKG_RELEASE:=1 + +PKG_LICENSE:=GPLv3 +PKG_LICENSE_FILES:=LICENSE +PKG_MAINTAINER:=Hill + +PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME) + +include $(INCLUDE_DIR)/package.mk + +define Build/Configure +endef + +define Build/Compile +endef + +define Package/$(PKG_NAME) + SECTION:=luci + CATEGORY:=LuCI + SUBMENU:=3. Applications + TITLE:=LuCI Support for k3screenctrl + DEPENDS:=@PACKAGE_phicomm-k3screenctrl +phicomm-k3screenctrl +@BUSYBOX_CONFIG_ARPING +endef + +define Package/$(PKG_NAME)/description + LuCI Support for k3screenctrl. +endef + +define Build/Prepare + $(foreach po,$(wildcard ${CURDIR}/files/luci/i18n/*.po), \ + po2lmo $(po) $(PKG_BUILD_DIR)/$(patsubst %.po,%.lmo,$(notdir $(po)));) +endef + +define Package/$(PKG_NAME)/install + $(INSTALL_DIR) $(1)/usr/lib/lua/luci/controller + $(INSTALL_DATA) ./files/luci/controller/k3screenctrl.lua $(1)/usr/lib/lua/luci/controller/ + $(INSTALL_DIR) $(1)/usr/lib/lua/luci/i18n + $(INSTALL_DATA) $(PKG_BUILD_DIR)/k3screenctrl.*.lmo $(1)/usr/lib/lua/luci/i18n/ + $(INSTALL_DIR) $(1)/usr/lib/lua/luci/model/cbi + $(INSTALL_DATA) ./files/luci/model/cbi/k3screenctrl.lua $(1)/usr/lib/lua/luci/model/cbi/ +endef + +$(eval $(call BuildPackage,$(PKG_NAME))) diff --git a/package/ctcgfw/luci-app-k3screenctrl/files/luci/controller/k3screenctrl.lua b/package/ctcgfw/luci-app-k3screenctrl/files/luci/controller/k3screenctrl.lua new file mode 100644 index 0000000000..e241c60cb7 --- /dev/null +++ b/package/ctcgfw/luci-app-k3screenctrl/files/luci/controller/k3screenctrl.lua @@ -0,0 +1,10 @@ +-- Copyright (C) 2018 XiaoShan mivm.cn + +module("luci.controller.k3screenctrl", package.seeall) + +function index() + if not nixio.fs.access("/etc/config/k3screenctrl") then + return + end + entry({"admin","system","k3screenctrl"}, cbi("k3screenctrl"), _("Screen"),60) +end diff --git a/package/ctcgfw/luci-app-k3screenctrl/files/luci/i18n/k3screenctrl.zh-cn.lmo b/package/ctcgfw/luci-app-k3screenctrl/files/luci/i18n/k3screenctrl.zh-cn.lmo new file mode 100644 index 0000000000000000000000000000000000000000..4ee5539d5e338798cf1969791ab4466b27c07ca0 GIT binary patch literal 1444 zcmZvadrVVT9LFz3>SA$#+mdd$StHRwgz=bcWSF4Sfu>Fbx0y_riIOdYC}4FDS>#b@ z%d?R}OKG5GD9TDHgF;){;@k+jm>Gf+*^H8`=ib|mjPV!~ac1Asvd155^2_;s&iD5` zy`;CEI2sv-S9B4J-s@0#-9}C?=Pe%6p&$W~v^iOW8CRU!;&obZ%W4OF+Wr}rp5cd^ zS&J>e>{lk%pkf7#dt0s_5td*pq&!_GFsicfy7@{0xo2*Fo=`}Pz5X3fG*;>ng zHJ@J1YthHZIfqG4C1)&U7*^-uI-HW%GvAW1_RGY15%oB;*=sNHnQZ?fvbJizhwkQS zAPT2<*u<9hu&PepR3phtI(4ilH}}LbSy8?uRwf~i0e)CRT3WfG2Da7kcTRu;kMYk7 z{rgt5xl@DYfrvl{@)C0yru%(`vmOo$ISNh@da%DGKKl$D5s?spPa zE)eHu#Q9G;N!2BW!Q!OKh(5J-oC$mSDhAnp58g@HPplf8wn6{NU1;T%ZJ4X}3%;ZT z_vJ>m+2YUh+MT$sb_8}V)v)D#sOwPkofw4k)L{kG?XF<8^~h^d^OhdkSHHwd&`Ea zS(kr6z6>nfdS39RxNCX`SWY?4P<8UfORLhsQQ)w+Wv5EV#bDZ?X{smvDJvMbzB?5@ z)kBllMGmoFdN)J=mg>p2eA)7uE7(AAh;oYbY+lIq$_VJ#h7qQ%nHk-oXuZ~2#hU$6OhDHlhW%=;qVPPi^WWSTGv=+cO!y-<*pOMrZ{NN$t z@urOM(=D2G=^;@D>Tjj2y1MHgCyS4PUQD@e|0mM9?Q8R((|Lsr(!s{rLd6LDG+1oQ zfO_$wsSC3SQmNkFr&~I8Vv2)Lf5MKD2TvUpxtCDyE@j)e%55)t_BP^o`T5aDT0!`b z9Qp!fd;4qZy{(Btu))s@;W1~`RvGvfWygc0bJ4SFd%-Ts9)UP%y?hj3VbDR!-;6ZQ zNq;_41mE9pM1D^xGA%xVeo<7v_E}X<@E_V)#M3tl`R?P#QA?9{`mG^`iM;tF7o2I; z&XO%QXVfJd3$135Qh9ml<(-jk1m*>*ayBr`EJgc?V|C8AHinI zQ*lR{<>J_{;p<@QNbv<9laN7Uy|7STnRr0>dB$V-^gjywCFTCardP`_zd%a$U+Yg7 bX1~ /tmp/k3screenctrl/test") + luci.http.redirect(luci.dispatcher.build_url("admin","system","k3screenctrl")) +end + +s = m:section(TypedSection, "device_custom", translate("Device customization") ,translate("Customize the fifth page of device information")) +s.template = "cbi/tblsection" +s.addremove = true +s.anonymous = true + +o = s:option(Value,"mac",translate("Device")) +o.datatype = "macaddr" +o.rmempty = false +luci.sys.net.mac_hints(function(t,a) + o:value(t,"%s (%s)"%{a,t}) +end) + +o = s:option(Value,"name",translate("Hostname")) + +o = s:option(ListValue,"icon",translate("Icon")) +o:value("0",translate("Auto")) +o:value("1",translate("OnePlus")) +o:value("2","360") +o:value("3",translate("Asus")) +o:value("4",translate("Coolpad")) +o:value("5",translate("Dell")) +o:value("6",translate("Haier")) +o:value("7",translate("Hasee")) +o:value("8",translate("Honor")) +o:value("9",translate("HP")) +o:value("10","HTC") +o:value("11",translate("Huawei")) +o:value("12",translate("Apple")) +o:value("13",translate("Lenovo")) +o:value("14",translate("LeEco")) +o:value("15","LG") +o:value("16",translate("Meitu")) +o:value("17",translate("Meizu")) +o:value("18","OPPO") +o:value("19",translate("Phicomm")) +o:value("20",translate("Samsung")) +o:value("21",translate("Smartisan")) +o:value("22",translate("Sony")) +o:value("23","TCL") +o:value("24","ThinkPad") +o:value("25",translate("TongfangPC")) +o:value("26","VIVO") +o:value("27",translate("Microsoft")) +o:value("28",translate("XiaoMi")) +o:value("29",translate("ZTE")) + +if nixio.fs.access("/tmp/k3screenctrl/test") then + s = m:section(TypedSection, "general", translate("Output results")) + s.anonymous = true + o = s:option(TextValue,"test_output_results") + o.readonly = true + o.rows = 30 + o.cfgvalue = function() + return luci.sys.exec("cat /tmp/k3screenctrl/test && rm -f /tmp/k3screenctrl/test") + end +end + +return m diff --git a/package/ctcgfw/luci-app-koolproxyR/Makefile b/package/ctcgfw/luci-app-koolproxyR/Makefile new file mode 100644 index 0000000000..cfc4e3e65e --- /dev/null +++ b/package/ctcgfw/luci-app-koolproxyR/Makefile @@ -0,0 +1,95 @@ +include $(TOPDIR)/rules.mk + +PKG_NAME:=luci-app-koolproxyR +PKG_VERSION:=3.8.4 +PKG_RELEASE:=5 + +PKG_MAINTAINER:=panda-mute +PKG_LICENSE:=GPLv3 +PKG_LICENSE_FILES:=LICENSE + +PKG_BUILD_PARALLEL:=1 + +RSTRIP:=true + +include $(INCLUDE_DIR)/package.mk + +define Package/luci-app-koolproxyR + SECTION:=luci + CATEGORY:=LuCI + SUBMENU:=3. Applications + TITLE:=LuCI support for koolproxyR + DEPENDS:=+openssl-util +ipset +dnsmasq-full +@BUSYBOX_CONFIG_DIFF +iptables-mod-nat-extra +wget + MAINTAINER:=panda-mute +endef + +define Package/luci-app-koolproxyR/description + This package contains LuCI configuration pages for koolproxy. +endef + +define Build/Compile +endef + +define Package/luci-app-koolproxyR/postinst +#!/bin/sh +if [ -z "$${IPKG_INSTROOT}" ]; then + ( . /etc/uci-defaults/luci-koolproxy ) && rm -f /etc/uci-defaults/luci-koolproxy + rm -f /tmp/luci-indexcache +fi +exit 0 +endef + +define Package/luci-app-koolproxyR/install + $(INSTALL_DIR) $(1)/etc/uci-defaults + $(INSTALL_DIR) $(1)/etc/config + $(INSTALL_DIR) $(1)/etc/adblocklist + $(INSTALL_DIR) $(1)/etc/init.d + $(INSTALL_DIR) $(1)/lib/upgrade/keep.d + $(INSTALL_DIR) $(1)/usr/lib/lua/luci/i18n/ + $(INSTALL_DIR) $(1)/usr/lib/lua/luci/controller + $(INSTALL_DIR) $(1)/usr/lib/lua/luci/model/cbi/koolproxy + $(INSTALL_DIR) $(1)/usr/lib/lua/luci/view + $(INSTALL_DIR) $(1)/usr/lib/lua/luci/view/koolproxy + $(INSTALL_DIR) $(1)/usr/sbin + $(INSTALL_DIR) $(1)/usr/share/koolproxy + $(INSTALL_DIR) $(1)/usr/share/koolproxy/data + $(INSTALL_DIR) $(1)/usr/share/koolproxy/data/rules/ + + $(INSTALL_BIN) ./files/etc/uci-defaults/luci-koolproxy $(1)/etc/uci-defaults/luci-koolproxy + $(INSTALL_BIN) ./files/etc/init.d/* $(1)/etc/init.d/ + $(INSTALL_DATA) ./files/etc/config/* $(1)/etc/config/ + $(INSTALL_DATA) ./files/etc/adblocklist/* $(1)/etc/adblocklist/ + $(INSTALL_DATA) ./files/lib/upgrade/keep.d/koolproxy $(1)/lib/upgrade/keep.d/ + $(INSTALL_DATA) ./files/usr/lib/lua/luci/model/cbi/koolproxy/global.lua $(1)/usr/lib/lua/luci/model/cbi/koolproxy/global.lua + $(INSTALL_DATA) ./files/usr/lib/lua/luci/model/cbi/koolproxy/rss_rule.lua $(1)/usr/lib/lua/luci/model/cbi/koolproxy/rss_rule.lua + $(INSTALL_DATA) ./files/usr/lib/lua/luci/controller/koolproxy.lua $(1)/usr/lib/lua/luci/controller/koolproxy.lua + $(INSTALL_DATA) ./files/usr/lib/lua/luci/view/koolproxy/* $(1)/usr/lib/lua/luci/view/koolproxy/ + $(INSTALL_DATA) ./files/usr/lib/lua/luci/i18n/koolproxy.zh-cn.lmo $(1)/usr/lib/lua/luci/i18n/koolproxy.zh-cn.lmo + $(INSTALL_BIN) ./files/usr/sbin/* $(1)/usr/sbin/ + $(INSTALL_BIN) ./files/usr/share/koolproxy/data/gen_ca.sh $(1)/usr/share/koolproxy/data/ + $(INSTALL_DATA) ./files/usr/share/koolproxy/data/openssl.cnf $(1)/usr/share/koolproxy/data/ + $(INSTALL_DATA) ./files/usr/share/koolproxy/data/user.txt $(1)/usr/share/koolproxy/data/ + $(INSTALL_DATA) ./files/usr/share/koolproxy/data/source.list $(1)/usr/share/koolproxy/data/ + $(INSTALL_DATA) ./files/usr/share/koolproxy/data/rules/* $(1)/usr/share/koolproxy/data/rules/ + $(INSTALL_BIN) ./files/usr/share/koolproxy/camanagement $(1)/usr/share/koolproxy/camanagement + $(INSTALL_BIN) ./files/usr/share/koolproxy/kpupdate $(1)/usr/share/koolproxy/kpupdate + $(INSTALL_DATA) ./files/usr/share/koolproxy/koolproxy_ipset.conf $(1)/usr/share/koolproxy/koolproxy_ipset.conf + $(INSTALL_DATA) ./files/usr/share/koolproxy/dnsmasq.adblock $(1)/usr/share/koolproxy/dnsmasq.adblock +ifeq ($(ARCH),mipsel) + $(INSTALL_BIN) ./files/bin/mipsel $(1)/usr/share/koolproxy/koolproxy +endif +ifeq ($(ARCH),mips) + $(INSTALL_BIN) ./files/bin/mips $(1)/usr/share/koolproxy/koolproxy +endif +ifeq ($(ARCH),i386) + $(INSTALL_BIN) ./files/bin/i386 $(1)/usr/share/koolproxy/koolproxy +endif +ifeq ($(ARCH),x86_64) + $(INSTALL_BIN) ./files/bin/x86_64 $(1)/usr/share/koolproxy/koolproxy +endif +ifeq ($(ARCH),arm) + $(INSTALL_BIN) ./files/bin/arm $(1)/usr/share/koolproxy/koolproxy +endif +endef + +$(eval $(call BuildPackage,luci-app-koolproxyR)) diff --git a/package/ctcgfw/luci-app-koolproxyR/files/bin/arm b/package/ctcgfw/luci-app-koolproxyR/files/bin/arm new file mode 100755 index 0000000000000000000000000000000000000000..f80c1cecaa755fe5b8c0bd3cad30b0520d0e9ab2 GIT binary patch literal 473736 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 z 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

#(}X& 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�^u)cWzbP9`nJs($@g-=1RrvAIRk%x6 z^nj<8&VDpuCY*It6r6RHGAFLTVDPOZ?eD*Xou?E1S;5w8JI4lg*X&b&(U-LJl}H8- zq^iHT;LrWS?j!X(AlD8yCRiia05fOq6@*?*lu!!76?=rsheeAx)}y(0cx+P8f5e-h z1_pX5?i?Yl88bK{*1xP(dYvBBKmiVn-`2Irj6dMuXd!?ZbxR*_K~z6xDd*#Nqbnv} z1u?a4xhsbX;N}1zB~@rc-73RVqd$nCN`EuZKi3cmKhTW)$+HgC@xa6h z#=7hLi_7ylO&HX|2kB{EWs1YfWm+Y>FN+OjIY-V?c;}i*;yQYdoN>C$migF!Q*4og zV>~LPB+Ue6e)m666W&ag$8j|L_T2*O5RtGgy*HGp|>LnA`D3Q7dot(wFu0TTUC-x-n< ziE98I>HSs?FChSrae=mo+%AY>e7P){d)Uj+sN4F2%P_WfFA#QaIc$|AK@lJ|)en28 zhYD>kk9X0y1ha^eIjEG$241DLD9$i)M~4dWbB{5l(GucY0+YCi6^!r1)RLB_^ZT-4 zDlUyw2x_8p79dU89CIDekPTDeed>+h1&qw+h7wQilRgq!op#^*}3jh26r6?9lyxP_r3^==m ztAQRc1A`!(KElt(znRPVKjyT^xY0K7`$;L$+x(%XzNGE4t+fp{Ra*B0H3UXL$d>F5tewj&)e=JZ%MoJ&Nok<5p zcRzn4rE?A)Mim`pKUyJl7p`S} zz;$Ju$t(u`d2TO2YC=;YRGgbopDn9r#p9_2sHO6LI@l9~=syJNf=u!brTlv`&3`wn zgO-LgDt?i!=)>xcB4~?GQkX8Svjl^S*VQUo&I%b6>y^EObE;)weqT8XZts`fY5J(3 z=pD#Io~K8g;;g_~=iBXLXdc#^U6m zfSI*%3=xWsh1qAzYu^cPE~}}MIx^);8GLT4vRx$mIUmZU_wZ5nP{tCyv-iME%@6Xu znJ>jH+J1>ssc3P#l5UU(Ot0F6hOKU&fmB+{OV4zWIGaN2j?^hibF{d;%dgZCU*V^)>l|P-p#infRM;ub4y2$Guekf@Iax5ulD02~!cFi|}-7EI-*U1tY zMGRYie}&m{=zRPN+d#64AlYtyWYDuvKw}RnZ9G&SUI|Z2dl}7cpI{(tOMvoT-3AOP zU}~mY*P*mrh%}@hUM?UVGbZE zMcCL2d^4z5L#q@Q;;WU9LB*v6mo%aWG2c+UwZ8Kji@0F;2&zQX zi{}1ep#FDT!Xi`(^Dtaz1KDQ-%E;*{ac-RN0P}z~B);(P%9@zU0dTHtT4QOyJ z0kvTa6s$Oa!T&8U|I8QUvk{p2RTw`~3@;4^Dv0v_T%n9Ye-$-wKj*Y=ZlV0h?NI1P ztADLhKEDtS^V9doW?|X`(kpp*>hL352>5Yli+N9Z{<)KIW|fQP3u^Wu=3-k zvX5Eg7Ws+L!=DD^RD2&V1;zNz4Y=#Rpv|hr;f`dj`*>cy6yHo7lVnUEF-g+1z|KwG zaaUQj)*E9`|J4xqAn(>6oA@7Or%s1V_GvjEFrYfU3%N!?F-KcMyJuZpv^+l7D$*C= zq#lwP-3}Y|H9%I<@X62s^?L^4zaIo`9;X-K;z7Hr62TYS9*Zh0n1G}yZC;_Br3Nl0 z^T>X?TfPfIG~c~L`+~&6qcrKw8K%;U`yna^p2W5`U>rO}zPL|TeDUuV&(04#%~ z_9Nv&7IM<1#LucU@8p$k@WiQXd=?wdOLU3ilbSGVTbApxEH+$~Xv1~fz_Xq2{_lP9 zGcPFK6m;~(uh-`P38YtHFP>N=Z`+5>3p;|){0k?|W0GHTD(4LJl(D~1>#wHMml(X@ z1qHI2C-}yN%ErpEMPoz-)MwK5`Ld=}GD#I?CV162Bdybfj}pP8_taa@^LzZ;x`|*6 zx6K>~DZ}j{Uu+}FS?y3VvZ(5D^Eh(ySWpWwLplz5gl|{h$}EIoA`#9aN#9_lzbnw4 zGdSlo!K@yLXbUdV2f8=R8OT(*|JZ^7-+g zL8I1$in5r#M@48t9#5Z)cuWQAh~qyuE!azmOOSGg$$`&39DjW^550aycvYZZ$KA>m zM80^F-&7AAg?3vQMjoi91$AlKuY_~^yQ?Tw@5oKg;w8Lm(W`KM+P#{E+>;M^;uZ*h zidUo#JAlJ-aMzj6d)LSRh=++_i#wSt3hF1R`~c5#C1@RV`>dgH2v81$X2CQ?<{q_V z-hei`gW@gQfG^Ks@In5QI{{F~Xb^of2M|qu+j0rR8^2)a?1I} zYz%))&WD;0o=;D~6Df9#j7R<1R1dhFL(>(x9OODKqzEjPBS)qc-yFTRizxj{i@*+- z$msIPwA44CDetefI>;b+(O{iGqoXZ(GIH=86B)0^4#AOBph(+P8t)I16|>x4Z!&+Fu1l@US^N&hdO$iX-J!H${3#wa=N z5E`_D9NIFzY=K^`63Da56s-|JjBb5P+jB0PPZfb%SyK4yE&K)V$4b}M4W$ZQrB89h z%bEboakdk3SC*dQfYoLWroG{t%y9ELqYTZ~ewqA~6K!IbP32)6l&dxp9#xl^8(%p_>*i?)X+EkICQ6p1c9R;I+XvnRU3Fx*eYGh%#2x)+Y<7wCOz=gwj-s-f7 zB{MI_zf1+{x4ENRhH{~vH5&?1RtW%xK)#d9J1{NG+3*0g6zB%65UiPN%8;zPjE*WF zoLv!?-R*K18%qS~;oZvJnWzNn$ql`64-I^+fV<^1-cw0OF9?es86C1X2?hoZi(Th4 zwM(v`!_|0@qyZcWZt%%rs{uM^{MjrB+1AiyEZr?I?rV;Cpu~Hw|A&mr)7#947Qh0E|9J}DP)YWJzAdH_ z@U?)}Ubnx0%swioW1;>lvk=x~cCLcm<@bcCbNWrZKXk?W^1b;pym7bHqq^T11*N}) zd>&S1SsC!w+j9FMT$mw97kuS*)1E+Z-yt5SU<7j)QZR+fq?q-+c|H9tVwSP*Y}Y!q zKQJaq>zZx1fFfU}PxY7K((Obs zG=3OYZxj_sDQox&U)jYnR|9N_rA`W!&Ah7=&Tw=#g zb+Z>Oslav8OMq|!%n^Z)ru!+Q?dWQZ>u@lmFGCD;+4g-WGpsR@J5e3&8wyX7+R!}3 zi?9ij$-$DRr1Ml)YM~LIBm_%Sz~B=wNZ-$CWI|qKz?(PDnUw%Mw@?`9r%H6{_q2|- ziv`7d@#`EMfaV;E_ACAsbcdRYJOi`Ufr+sB>fXi&HuJXYu~h=xKSd+at*@LUt!nt^ zgsMU}filfax%xTC@-|+3n)%YelK@!ajDiCC+UpFCf%;mUF&vhP!3pv575Er|!#5Q- zOib29RIB0sS0(}$KMghG`YkeE)qvn|f5D;*ligzMrAk4pqeuO4sVt{kE<}ik{upB_ z5W@(sCXuHYKl!Xrcl~Rz=d0I=705>#_!(7I1d#Y5wpklEJwLCymige3NSh$mY>v z^#DduqwhX~nqHX%^Lb_(zYaaarHWaZb(*8>WYQhbHf(C5QO49= z*46FWUP0=H`oZ8TZXZ58yU7gYUbuY%rEe-4P~q zh;MjOQd16LpAqaGaM`KgVb|f|X1XFY*Kj5vv(fAl>DDm-NAA6}i$*Lgw;2`aHAPj9 z=d*A|Y~sTz8@LG2fhuU^_hJbkN(QulMau-O_00dnujU@sZ%ke26EhkE`Vv~e@1B#m zfXL=MvwaRn+C3}HTAB=-$ELS_tnJtrlo8Sm%0eq2<}>jYhajaWaoH4$5}$-`G?YT2 zSd8{cku`&Xr0@#nZJ&ZY38vzq60U#5_%gdk20eif$=<>$z9uRuBHDf4Z?3jo3TKdF zdfrzwYx8{8QY!n9V-X7iQP#c+xh#nXZiBVK6Bvx!(JBG~vCihktl4UGrey@4+lGA~K z&IjT)I2z>s0~ji5$yFbXDuN}ib%ca#WasafI}shX7taMRs}If<-v`PtUx)XA+l8bj z%}2`GY-e^+Lq6RB`0A%c+fZ1WDX@%0DxhRGQTI3pCs{NFUgn!h73_e9x=a> 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�x>C4Tk4H@==ywr`0t>g=LnJ<*!vi=pQ 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

WihgrSlj_UR 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

?{nuHlmxWsraQON|RUPfPHI?BzW z$f!qxw5&5l-VoE$+wKJKqD89zBbV62HAn=y2!Dl&lm_`~86gqGnV!iW#_2cE1W zGxMbYC;a<90zQ+S%87ufkrw#`Nk*wGn8H`0vR3y*Z}4Y;7UQ}f8++N!Myyp$CXi>K zt0$2V(MYMAfOtWZef4P#X6G6c@$_4rfL$WlDzfyrQRw~-V0k9*wf_Fi#oCB+|l$dxb66HmLtxaFMv#%|TN=f0<_2+H=LH zNFjrpaWj;+S_m9uFUlY*4pfr422B`#Uda@!r?jvu{D#Pv&S;ZLi1wP&LbM}8_`E$C zp;%B%`ccNDasUfK`po$or#U=34O5@#hmNes=m+ zx5Rt)&xRk&8LrS>LNFU$b80=WfQ{Z=Iv$gwQFQAbyF2PmUXsjG2BE+Ep79gu;?38C zrJ&m#qs6$O#slhR`iU;B(Hy#&SQGo|AYahMH%YxvV6&#d@57bc*#34_&7=EQV!&B0 zlJWk{U(ly@t)gwO614s$2KbkH-MkzCW6kr?@QPsPx0o>N^UBlt@ydEN{a@J2je;Ky zFW8;(1x>u&h`{kkki?NPr<@5A+cJFja-FLoK$%cH+j=MRDMr$$D5C7EG@T0Y(o!B~ zkOywAg?|0$*q$mG#~4BrS+Tl$`ylyj*TL&Lv)~3P5vBfVxZ~bjnxEWdDaiAq14h1_Kc&Pj*?<5T6Oul&R!vUNCj`*^UL+8N3 zO31lWi6I2O6{jfbTMrZY=m6yD0 zWWn{P8?y}_qh#P)&({ofW6`a+3F)Dq$L^P7A&5e+r^#y@phmY6N{Q_wG%~jo_^+e$ z>;7jXenxb&N91f56>VfD?TNrUF3cG9SRaa%{ZC~TiE0Qw3W8>gYObKV=0HdYi>|>* zly=qeiX`Ec&1ufmhnxzA6xG$gGa}n(Wf}OAhO|Pp<@WP)m9k$5Q$SHne6v2u{zaI8 zVHm>iC|>F~0|E6(NJJU|Y!D5445oaO)!@M5V>x@gx(**zGdND>We2w$UlWIk-v6#GZXp*_>_JA8usYV zJq9Fp{K6QIHoMJksWsCRwz@IYc>a=(mif0m4PFDd)#?~I;o9bJAd@jJ#&KCAXN{yw z^ZT6QkZWsoC|JH2z;8zRR;JG7!>khb$e_hos57|buj(%^K;!wTt1T}jn4GgTv8WL> zf?xzeAMzGO3OYI`a3b}tG0K9@g# z|C)vDh>wwtjj)ymthHN)GK+8}lql-HvZ)=bzbhCj(ljhyAp)OpNC{J>HunM92I+xe zJ5nzmI*DW;3WOxxK(pdNfKwW$fmigd`SIYWdrdS&SdpzZL;8J(O_&WlvBc=3-`(r@ zy3-d@ztd-_EMRjCQ;J>T?kj-3dXcarZ8Q?43o|Jk0v^`Xazf7SCW2_TLfsFWGntiD z$G-+8%E@coZr0nVA@>His9pPMZWuUzl^$R_2U6QwALY7m{bwrIo1Fv~MGFf(M^oOd zW#s>|W^t1Nj=I?Gz*j?Zk#4=BWYb361@yv^ie;Q#EKg;FxEFX5E_XJYZb=3;cTChA z^w8=9Gn$&~*!|APRs{t?%Y^ zrfI2G7=koDz%>cvf^wZBX6m2_P4LeV)Z>cHa@nDhQOz6xRWVSn{8PM4=TP+JV3g)- z@H92u$}2+;yS@?SOg)*Nk5F>7F6nHNy66(C_1@XOr0ME+p#uOXR zBN+b{-Zoz@;md(hPHPY;licaUTFDvbEqNhg%3slY*xb`syO(K}G~L^G7y z66SKcx93sUr4_vCHDVRYwilR=PD69QT~MCYq+api=lp|Pba-TZv;5io3E9+Kc$iL124CTMwOXwQ_x5W;)vZ7#7;4JEY zT|{9Fl(2?vD8GW`PRE2bWd&kn%dj$~g}?Xq*y)avK%37QQ~JPbK1Xv)oHm``Z8vga z?zm%2HQH^*R<>WxWP{O%&A?m~wM@^WHeTvC3-j>__8tJso>tkL#9wDpj%Q;)z05-y z^&DLM3H8g5so5N|*oC^S@xnH{!(&@MhJYI$cG?+OeA z+FoPJtE1oRLLhM%(CrTP82l7^A>(4v?-P+dB{aJd$pc^f0JZlm^g^5kvh9qm4zG@) z%W5rh+{{^yZyYJj;s1r5l6jibEhmCbEEPBJA2XS;Rn`|8_dm{mxc7bj-l$b=Bgxez za)1iCwn#n|mPAYj%yP&OPvN8 zDXdH-_N}E`hB2N}A?4+sn^~=KK{67$7;9`nO~z#YrUeb~0PSKy@X8sO)hv(erj_C5 zC5dhm3;|ufVT7gn19+!`HRZx;zw^UAz#(8K;#OVvR$2R~Y9&_P;i}Rqd_b35ML@P{ zUC>nPP^m-##4MG+6imPXjJ$W}mh-f+_41L`%-Du=DP%z9a|P`<-nOQg*`wpe7xM+eTgSH=Bi?R+rtn#^0dgPK}%F3 zLyVotjtVX7OD)QNptY~^eQ)q3YSgaM1Vg!EWbP3l!Kff(v<>iJ(amUVd|vJ}!7(UG z-wv;9(W!j^zr^g=eqgah`Fiiag;TyaPeK5d}lFx zqh7}#X}EAA=8J?SDE7k*oyOI*OVZB|1Tyb@{^74ht#oM#{_rs9m)hE;%+w#^z%-59 z9Ljt)O{HA|;in0T-$KT<%}39-ulvaUufp%%f|u(}xz}!y)4ruNT2nBlqGYpefW<0HSoeR*_pgwt&kLHvwX}WZ#6s z$Q$X3=4IXRqu5K~KW4O(pbm04W8sZ4hP)lVmV#>E!i?fTYo zZ(Xl3Y>>L#PN{=c{NLk1I>vY7DMvs4+ZmQbJ-^KDNm`wG>B@s-)DD;#nl!w)b;gk= z(vW;`z;F$@6BQk<@3t1mU$;E}sM;j+-F8=WvP-P?fe&bY z(2jd96u{8b4ck8x{}ycOR}Ew9Exbr>mcfBv(P|C;>ANHJzHl=bAZMrS{IM5R@Py~a zo~0bFR*ObPhkj;UrN78gMlY9c#72YtFb#C?LlF^-6$&KtKt0bB;@4H&lp$m(b1HqA6e*v^J@=gWTxoh^* zL8uG(sMPNJRt`ikwNOeo2x&;p28K!frJo)MzF97SSuq^p~OkN@p3nF25l!PUE zlWY~9kF#JdchKnMq}HgA8pw^R688@Sg7&#*IUllQ{pO$o9RA8l0lK=-Set+m z56oJ5bjsLVTs11JHN^e#?2!nS>O)qQcQu;MYZO7-b_cP*ejmq^xoWLjIb-3Ia$tIr z^1HR4@F&QYKT#mBuDm=a6PG`EcVsq>V6S0*`L#DyD_>|UB=at?JMHg1RF3362|I)| z0?}DK3cdbd=r;l13tY~-r}vuUSI%mVjVsj*xwCmV9T@LbwqHN*%&9WLHJTSw7=+Vm zmmv%Q?r?bzgKg~P0rIi=e76+xBz(bW@I{F@Lg>O;_a_ErXh0X|*P&I{AmS$7=jTDH zG;@c@zw&BK6nf;y;-Tud2&m{7(af4Km7yN)s0-_Q7FX~UW7g2)L)&=3MAhl%bWIbA zq)7^EJC@5Vf~L>}y|Pthc*@He>Y*;7_v^pZ)>JavbO5$^ zm#RQDnUlU4xiC$JJvfjBkEYSZZV}mH83T)BrjkeY*{uRHo?*hE=E*k3>cJ{YWy=IEh;`3}@1Yi2exLH!reiVx?JlG{PC<}SsZfgi4Pl?AVO zrD_rn^X%FZEJOocg)kXLQdxr6MjgDVtCM)n7;%t~Si`jEaW0lCF9+(qaz&>Sj?!kt ziYNph&F>bj5l&~0O2t{`1;(-_Mz!NDmb5%+)YgMV8(}dT;uoJQ{6ffbrtCVVia$pj zpy(Dpp5aTGlYHOHuek6Y0i!=-&@9!@&@rR9yZJ3kuR0t3uTepkZ zEc75_SnMM7=zu&ZX#7X%O2IRx_qQ*)=<~PZLai`HZq)}S&@^!n)h@;DJ_On>vuhys zr8SyVxa3xwkey4+|LuZK!8@oaFzpADhKez?TvSc^%dQs&w-5)LTZg$* zu<2%n8RZPn;LII6eawv4K_&;MT! z8$1~b7&Yn2GHtfyMTI2Qe+gmel$|gg*Ej5Fjgu@F%&U5$&E7-0t%L7{gMgpHw2+rM z`MrN5rK@rY3)>e8jLVX-Swps$!J~AD&*gZEmg#Zk=LY z9y^?m*H+_-cTnviaZXY2?s5~eP$>=p_EhsrZH{IOD=^Te>Ps;|(7oSwh3x^}lwmK~ z%IQ1Z|7bFOa^G4k0p}<8i$h4h(B7T zW42zqB+!Gg_bAw^y|XwKy?W=evgQhVG4^4xc|m`zy}$Ccc|fkA^pb;QFIqh*S7q2& z>V!~oN;&uLvjaLA%2)13-p2KSMbp<*z1&0zDm|^ac)8$F&Fjx>SQi{lZY-Wqp38SM za=3({(l8$l4e(k{@pYSabZ1Fp2gBui1psOD&>Yk~h{6lI!fJ`RJ`D<%SkY;`Af`B+ zFX0JYoertr_4)dKlQ%8+?J3tV<_y}^iW0>;IKbt#FWY-x5LKp0E=cykR5v$rU>*l+ z1>;G+GCj03knx86Y`FhR#UW`ZLIJvg=Q{i+@fU_u*jPHN;utRsMnsphecIAZ{DZz= z5v|`pma$>7<)>rAcbKP^-n1l8u(VA#$?TU%D?m%-3#;E`DW$NN;C)=7I=xs)CdY{Z z5Fo&-2{N=baHw@j1xJUQ3~M`D3XM71X3g@W7khp&L0~Jt#i;yJ#!Z##;_-`cU?5Mx zAbg=P@zfaBzC=?@h+bwi0Jt5x*Nt|3>4?Fe4Fy6j6`5iPA{36hGcdT8(E>y+LSX-K z!Gb62rt_96^jB1t2L6f)uGj#TMz^Z!5W4lEs_ulwtj@!=RU|%@bN^Ivu#M&#k>EHr zt$=PHcL6xX8f;wM|>$4a;RSK(P8eVdAWNjN83>l1wnk- z>}Dq1T>xhSj(WI4R+aY*L@qa0Kvp?sDHaK(1fX@WZ=g`gA;@T}Jx>FWf$?Ey@Wre#3(j%|-Lin}yuxWQW=U_oq(wm&ak8zDv#cn~-8g zN?G5sN)x!b{%IF??QM7;f*#oQ=n>lh_W_wl6SA;V+U-IyIEK}q#u5J(f`meya|=tI ziV}lD!`*d9?2l_rB+>Wif=M8$mm1lH(BO^K%41M->~x!r2U@5^21ybbVTBVxSYmg? zI@UlFN_*_G-MBUTCR6`0AKG@gUQFOhpGC2~w4Fh1L7OqSN33YXO2askflZ1;&o4YL z!+@#w!ZbqACI7$%60gBkyUY%{uea5`;qjVNU|Ed*EVNt@%oc2JE|3Z|&uPbH`T)#e z)qMyjJ9n#oYoCSFjQG60$bN4%fH)AK(17M{$Ds_cT1)2Y39AB#hRDlW|L&_+Mbzlu zI|e*-`)HG604lMl9TS;Y>YW|>@ot7Y7W{OBmSJHgdYQBe`DsiJ z2Kx_q0wIiv5%w3fr_(J>vyd^6l77T4rbERC8nx-PopqbNH|a`vuHjghs_vQ_pU{|& zW1#|^Qp&UUdLc*ZLn#CLoBpo`iQx61>_}}q;&XWms;FzEzK{fFO8E$Jl2ued7}~iH z%SB2>j?v8N-R}SwJc}v79YoOF-qzIHYA-BpL>7bH(UdKY*n#zn$R99o=*ti)e{Y80 zKd9DjVqNBGZB&hgbRu>D{e_SFtT&nIa~#-bk%^tz@M1u<)~Mi-yDldzCqLl=fr8`2 z*s^XpIrQ~x=C^Bz=3aes`-Ne6G)nHtHH9}%B@>#M=N45J7JzAWFxBNhl}yAcP{Jo< zNaCL}VPWU+v{sGe8T-PqF`CtXv?+$JHh=<8j6EvT=KIbtD9z!Ug@|0beb{Mp`-%X8 zCI`oUI0{(#kyPz(=;Qyek{OyTKUCH&LeQx~QIiI+y^;|;sBU!RXqoSOC!?!jP2-(B zCfLI?NxwSdU3ovfsjrc#d&R^)l`~QAydlW|zc|H-3fpo^#E;CfY_Vfjs%~a9C|I}e zB(y$cs4Y6Cc#5y-#REzRTQ>0S$Ih2Asm~rm*U@cWr>y7ZmGHb{!JUGA6f^%2|!;&G4h?V`AhZ&49_Jy@)qgOqd+C1d$4XS1u{Pq_oN&O7i|n zjXiz?As?LCCWTn+9D($T@<{gybL|Im`o(cU;Zauo40p#Y^0sFeas~T#2I_hafcBUK+gz6EL~FRQE$iW#YbG zY)#!X7pZjJS9)WHwTk$`_B#gp4I#`L?~hWRiDhES(dZUYU5O35CujJ83tkeBWS0cM zri3y`XNbPjFK8Qm-0cEEMr=j4XQzZH4f=t~Bv7%D_4(RwrHQJa@)NtyN1wiTxNZA- zaQso{T;CG^-Q+n@dpm{f6z>&6F-4Y>U9Zq2=&n=z)38T5*VOb-9Vtja$|hum08f$B z>_(W2M<+p<>ppE|*35YX{1N-X6m_Ko9IMa4?(Eoojt`1Q3rl)jFiWs)b=*bIK;cd~ zKDPUS(q+$M0zc_5=NI76|e*nx>Or-E?gOMCpHlPWLaHEHfa zxeCG33dAZ|bS+1qQ^^ffkC=ld8^=v=&e5K>q4qH6O0HnM`viK}^e|3vio%x1x3az9 ztP!TJfS&wrK=ivu4jBMO3EBN@pxDxb9?|#ldqYd9bljM+WQ-{GIsz7v9m^K}7ged% z%0C7>qke&QI=EBl&$y?PJv#7?55!r)zzJ_B-N_blA{d_gGJtZ0~_j zG8^{lx`fREXYaJSy^TXhdo_cs1(hu;NlWcZ=cPhovzv@Pig-HG3sUgO70T!{{Q)($ zhCN@WN6H~n%7Lnuo{n4j%eWsSi1_+^@dMO%m$QcBH3N}i3^K9dPKpv?w|Zj&F(K(E zdH5rt5Dh%rJc5%NI(d&45}X}r3CVu*$Xm%tf{p|q( zwkcfIfS-JV@o>2q(Ly&e;7l*kya7V`Oy-BQka5Mq<^Uu?-0;KJc>00Gep-Tyhs$wB z`Xx&x!uo*&`g_?k`u&%oMd?`=Z3JXYTa+*q8*SuiUUZzdQduccvUe&Z@h9bAsR{+*o2>b(`6xx~KCr zngGEImLj7fLiGdmszR}y7rEX~(EQB&^B~k!pOCW_N8+KvPq^zDvl>%Y54~-n-lher=F2l$iD^Stly0N)sOYJ0X0I01dL z`8k^fNJ*UodBUEV^oV$JqDYgtjjIW-k|kLw+%+%*~r%? zEWujLsq$5O;17{pjPejKP&x&^I&W{(c*5`qwTo3Eu!5EP=v1nrhO}^hn8(BG8Zl4z z&aaOE+S3D}J&8m6{z76WJSX+i)LH^@yB}L^hlU#=IZ4EQoT&Yn#t>DK~cPp{nd-vL*d0VQgm zzKBXUg~j%F-04+PsFY{StT;doTnIOcBhE;-hu6d*XX69iKvIePm4#UnQbDGv)*COb zZY2@;efOyCa;1hp!A;`(e;!(sJe+c*=H)gqfZ9iSNXNGwu^VbbSkX4j8$zY$zk{RH zQ+5{fL5>j)wxxtM18ElwYe<*avRt9B+gln+xxLa{l?cF2ACwi?WN;Dn#x zNI$}ywAO3NWercO`wnSYbS&x_0LblQ}tCC*%t7xZFT)j%pOW!`Uz1kj-g7Iz%Y ziZand58^e+2d&bV+L(={%{q?>aTCx@T`}Gp3&(LPmZMG;d^+YWP~S?Y9Ng|NYnZ@Q zOTi_;(nkVu8xrZw!WP0=b0vJf3Ma{CWK{QP^3b{br9pw;(_Mi(P?SRv4I9A$X!~4o zr588=>ShYn-Z@<;{P7QIO}s4ty{|ryFLM?DXuU2U=FR4TV$r*~F71U&V{jAr>D*;F z3E$e?6$N7EVPFM2-j2eWo4r;duiqEASfeKjj?Mw@L*vnG-}}G;MWHue*EiZk=M=vG zIy}jJc==GgemC5-Iu%{ro(yaz*aP9q{B&=Q2g#}(0XpKutM4_UsM1feEIpPt*`Wxu zk+9`Ib^pJxVxvOno^kE}FVDy{|3DZ|0^SoA(;VThmH6gDJ*-0$1Rj8P0zg(#zsZW8 zSBN?=jG2&?r40Yu+*W>@t?#yE4Zkk}=f=23k|bfMX+~OcU%n_y8EV+>YFX{i`K=+M zVi$=2t;ZulQR5t=Ba2Th?N42ple#;~4FYGBoyQx>@a>8N*d$07I=!6~rsdzknX;Qk9aEqjyyO@|LO~FE2QC`>jlTbH1V5uZj)9jq}Ep&&AnTJiV)~G8d&8CtbqUI zMPsE92;Rq$YJSDfHn;YBHbNP^oLhDZ$aq4DmGo>oWvvxKaID|Cn``lnHn5K z9~ZO7xacOJt%tBx&;xGq>NdP&abipDd0XfeG-6k#63jN8JdW|+u2G%tn8J4s=Kzp| zfxbF7D1zrW;gni}@jtB4yrmeeDtsayT;sgEiSYJeqg z%TB`4k6aWX{c{;*o}|PDzhz}d;d)MuNiP_G>D(SL7>W)b$6F8*3Wl} z5XbA05_~OH~#MZa)hzQtedy0C-H4XsdKjJ0CHqr8ap-YWgX>FHh zIB?-jy=1!CHw;8-#H_l1HMEAc{RHY~N%sK%A=<9U*g+_I3mN@~#O@u*RenZ?@JD^+ zaTZ`Tshxtgc}On*lsI6HpZUM%JoS;M6b3ukmzb5;W6z=b)B_D-l7%!hiL@k#$rLba z0hXw)Bi;qmF%@&~M?!1nJq!GyNBTc2niNc-LaMWV^~zrVB_Yw| zGYZpWi33!tl(ba8F*xC64@16-ESXNaG4Od4D*3Nu;sl9SjDtU!RK(VByo!lzuid)jDl$p z{)ilzil`JmAaxB$JykV?$ZRJ10$){)vvxqNc_iK5au-cc0~E99F@N%m2QV&vxrQ|A zyISCwX#4a5>E?F@ZsEymhE3Lukp6jqJ$|>@=m3jMD}b==rI9Rx^d64f;FA`w?X-^T zac}1O#Rt_-0d2XeO@A#3mf)~e^;FT>`>%p?d&zvST{0OFW6|iDPi!$3QF)yDu9LT) z78xbZ)p`~UO$*>xnha<^NR!8IFKlh1gR z7i0iZ0TX+k*0}+_rZ`bgFqr8UilP3a!w6o(ZjWTqeEY|R?Ik<=+0+CAPC0zn@j_e- z&AXIL?o{;hM*u13O4sIMv=-U`UqOY32K!hAZ?2sa-~bt_4?HJ~@Fm|%j1`$`;L}Q* zYIM&q&FzO_m6Rko%NG#xV{bvU&p`R(F-l2cA^JKNmPZtgp>2@P3S|X(V`!T z?P0plL^);xECZO*Qj^`6#&Y5a)r$bl(GSa3g^89Wcv1ak zjA~RR89`yky(D%ET9<7vb7>M01`cf1$E{{P9-baGWN1LQsPisL08@nEUK7oQG(-r> zxM;3ixy;rduWz<(*VZ&K)!i8E7^Ckz_eDD=^vWQG2;9Y3(8!{THt|NGqf|k=rrbSd z^duQl+a^eVY>;>H?%FF*wGR+2KW?o=Gh32D!kF~2ZZUuNT@0p`o`N@l6M3E0{P82S zm4hcN8q!z7Jn@FysZmp>rCeZtE9RZqo65@g`aEhZrQ!g)tB`;~MiDQ|)bY)Ou@y7Y zmn_j}n$W&b%zHqLP5d?^jdYZcMJ`SY;KJVH?X>Voncjge=YK7Z;GCTCvxkO4`tqsZ z({uVH9~j{K>M@R4NRS(lWBF8cEQM!j1oyvBBCZDxavEyloL;xiy&029^6;%6ceZ(A zMktio&ef$R6I|Hp3Nl52=uxwQt5>Dr5IS*zS16N}t%3NHt8g7C>xP!A$k?IuMAcop z0D?(~1ZCH(LP;RTNYU;Fi*qJdt5(kJ(bZVYET_1o7??(A1b{8;{m8)S z?!V=XIq@aiz9|@Pg6wqnrEcxrLPV~@>?4TWARk@MZJ_j4V^f)us232^RM#k7PnvLE zo4ibwzdFg)X~xbHf{1GkFDp@A3P3Bn`0dWcOi7Vlx1DYlfEn!RC}nE6JL z6(^KZ^0X(q*pJ$CX>^c37sHih^G#MohAEM_0-gt0Q9v|d0DpnVi^^(Jy6&i`0CnS znIMI+5rco%F_>nAbnzr2|mU@?E#@i8Fv6ahKR%Q6GOfoMonou%>yG)aykuRJ@5%Bk^xo+It#+S0B?3tGx>4-1tf+Bm0;l~x@>uMIm zLzl(!e1Yxcexx?AETIDzjsN9DWfXVJ1zQic>vV}*WNq|kv2QwjeAxU-_mLWgVrZ~4 z5NZu3Rx2G8)0HUR-!{gOs!9!hf`UZ3EVZQQv2X5LGaIWP5%n>=YeuIsyVcit=OS9m zh1J5-Lnhr`NJy`*MOBJ4+xH9?hbmHd2Z_|U2sFSEh~f-VXRuV)oW1f&2Z7#2qIcb~ zzm4fd+G~tYi3rP_<4>#hCqH-_CW7bp2thnwZy{yxVR}hf7SR>9f&_%{qtAGj7!{|! z7J)x3t|ayCHcIykx5K^}NRs5f8p-LZ{>Vr4jK7Y>FA(1Uhrpn|A;v13fqOsEAvxrj zLOup_wmXQv-cccL6F{*OW49tA46=!D~(PVD#Jy8;SR)ygw>sN^^1fP z5m(*;k{sjs3lgY z+YrHO3dt{1v9kVWgHS5*)P=NlEs?5sw-CNOgQ)OZEe3zCtwY~*$`#d#FUEmp%>qSu z69I=MDRiv@nAyjo{}}LbXo`8$Z2W zL?B9t=yt)2Ncdg#RNVdFQgWDTpe@M@^+>@$xYZ36a&SOi2w?-w#lmt1`$p#A*h3oq3 zq9d}>deN6DNvzhe#;MgxwDr796cm;npW#(8_PLMe-3cpV3sLQ)AlY#^0;FKiDWQ)v zkK${JCW*4N8P_HCL?IC8mD3z-BEIrP7S2S;gs0f@%)uhc{}xxN(Ad7Gs7o;6AdvbU zCOXCbCZ}koEvshB+7Hrv4d@#=Or_QRw$W?4WMKfNa-jwg#X0X>(f9QHOY=*yop*hg z5i1at3bR8PHW5dtq3Kf;t6vP0_4)4*YpTSw_^S1M>X$&-j_PG#kpktfJ_ULSxJKgz z?K5!apQz5V5xUR6XD-)^q6UH|Lz1J8@3{~a-)UPq+GVjWTK@d9A2kupCML6d!UoP) zZWy$Q^0kZV-G&Q&m@^yEkt68sH$v>lrf1yl>9{A{*ZbTP4QV@RHeASl!}YnD~SQs@-chHR#q ztF(U*Vi`q@4`cX^3Y$B+%~64@i?Bs4;qI2*k^>XYNS)&hh$*ydO}8t)m~LA_SEazkpnW4N*uv|*_b=Mm3IIsJiQLn?C}hMa*)LdSRhuNOk3k>=UbN}g#?>QSth zt78>9NF_5_(EWpmGEZ)kC|L_g{d-#kbE$9(>V2qeoyoL;0|kW!b^}I3!#+-gxaqRw zX0s5<=*!0SkKgFk$ef11&e|^;*$sXUlrJr8GL9VBP4-t3@i%2DbRPC5KwUW)$^(hP z@IZB9n-7tliM}ud0TP4R0+9+AGIS6smrY9Ra4n-R`QK!>gY7ivaEpUzLtJB z&&^h528gk(PQs-mM9Pyr-x{odEMhf!!%8W&oGx<;W#1CP3t4%zd#sPk_dE)a9KfJ^z@6JJuczB+U z7Z}Uig?Kvn+%VaFbmml(R(uz!V^heizVjuw>3VOsw%HZ?$!Khbm3WJ1~6c{@n9eg+T(hUFjD zxhTVjyp0rKej?7y8HcYzDkG1q0TUf5=q~OeIpxbGORRk znVPF+qcj>HbH0b~l~5#lTh{vjD1?*KEzdR3-r#}*nt9rJW&@iSQWc{_(+&>qz0<*9 z1FQc+${qLt)T`CWLX26+8Ls%KZY3duyS96ifIs$p!6r@pLHIprIw=YR`=T_%2J02v z?O_a2LOd`xYymyRF=3+}5XpW#qS5=Qr?cl>v&+L09&d9sF8_LGCnU(DRCmVV{PNQz+a>nxw4c+S-(erSU7cX4!UhrA&t?JRQXYwh z3e_$KA4~pzA>!6$sIYwX+Mg0TBle(^b5Y4mfh4^|Qin~gogTSveL-#2*Qjnp3(`6j6o<& z9<0$yJyi7{w*aFHv)CPC*h@w7v572!oJN~3h7#A)IsSQH&LnmbeG5?87wRcJyqzcs zOv!olmz2=pjlN5bPqhW1&fxie&g0W~*kdCwYP2&Y9rvccXAoCCWrR#bRB=0E z&c6-v#eoDNOaN3qhV7Cd2yX0y?Nv7=3Eu;rF0NXE)HOKJ#c4&8uyuEHEMu`3IK{j| zW2u6IBKUk~A3R*G!noujWc|2wvo~#Htc(IHm#rqpNWn~FgZ%latFDi!_IyZqb6(@ZfZQqmHg#g<{YE$|XAX;kE0+zwU?sYEqvmkF!(jAz z!0S>$%5aMw8&45-bt%oB+fJ(21~F3>tBA)-J7nO$feocngYa+BZ`$f6 zHzd+J2-*-w)xd$+Cpn|gev_om!<{+L;~zMm9RW+1@y5x? zz3G+;H>akqFD%=-uM>_u123FWOt8=b0c_|v+%*D=q@Br!L7YVV+@|>GnWfB-T$Fe^ zZg|HiND;-<;=X+*92gSu<0KstA7RQ^-L{<5wFL{1mFKxUBN&`qSPYCPClwUSspd#7 zbss{+FH+(Z#*QRqXs#ND>fiOZg`!I&4NC8;OUv=1GPnG8P2;DUqLM-R7tov`K3AvH z{*J|9KQIpIF%H%6y@yq#9wM*yqUF_y5a50_;ZxGphjuHO1UzTx0LL{(BsXE|kH{hC zHGrGN@|s%*Exx8G^0y9u85w02SswchZ0M+wde5q*P2e7++&X1_Gcn6{A!mjWWb3SS z47YKK=jz3}Pa^&Oe7Sg^wm|Ju^D8)GYA6Vr1;t>%R6-3kA*bK_rNdOOF%`aVBamk? z8FILBym(?v+q&1PMqC=DU;cXBjReYp)@7iwN89y^YZA2kr(@@d;vLLvz#F3P5=v>y z<8!%JlFzt<{c$#Suu{V*?i2}Dfu-u&jRf>Dk6Y4v3^7Y6P5s4A?MzF6$)H_LZH;vh zW_{M%2Y`#fLGYh2o3n-wAsHGA6#TgIDo(L6;O(_Xm*(vjk1{vZ8FS$Es^AgHM%S}b zx%wY+Z7xbShJbjp$yMt)?{8V=_L>qZQPHFR8eSn~e3J1ebMsgYkYZ2lP9@myEAQNn z3wr(I0*8a4>uLG>9t__z+m4&$anqd_l{WU!>IXw1-AqJR5MS+8@yX)s9xQbqx20h% z0_z@#G{B6O)Np4xXma#9R{@fF#6LAW0!_i6I$>~$ZUjR2SHuy?E{94J;wwt>Z`48} zyM7H*lK?eT%DkjYWlgO$-))C+qo7Wq#N&XHPqC4Ou~ny0IPw^_8L*YgSDyawflb5%EdE`5E z>Ft-T4gfv_4sO|1&j}S%E@FGL_tp;A>5QB|T%u6+0VArZkgM|8; z``ZIR$g=G)J?oikZf11!C12f;En$-{HQgY-jRbPNQKD1k#wnkm9;%0i8@s*G4jF8X{KtHsk9hcHjndJ?d4|Je$b(sHRQ2GJ!>MK@kL1Mt=TvYm`ZR4!P-c zY%{Bp^`&8|P)Atyssowe#7EfSs4l(~Fl|X|g!(DFP6Bn0P_*}9Qi<`CH4fZdfNPaJ53JF7{G#0O)7CHAoc4e_K`MafCChF&&E3l_Tz>VGW3`g(KI zRFF8bHUKUvf8$V;Yi-6$Eaw@1r9s;l++MDi<9YZ)Le5-jlcI7h)Z@L5tS?ZPk%bv% z4PMB85z8V_I=??T;|gOrDYaafSS4iNtj$WJEf*0a6rno8xlC>EAZBdPyrK;hlmZFV z)2ns>P;&gxzT(Ybg$?a6z+Ni!IM6a_-MgBXVi!)~VJLBC!_l-qV6a~_4Uxr1x(LDW z%awKfmk6vAlZ62=3d90q=6MSmAO<%FrJq!1<=44D_%u2VJ}4IEIkxOxy3rd_wd*e< zjxJLZ|1vRk(JKU6I7;^oq`^8L_IV-C{zrTLBMP&Z{OKSVbu6BeBd>}5q4A6OOb?VM znIa9~h*HjafvKkL8r1-XSU>VR%Yzzrcp_?TJdDTM2Q2ZAOjh!PN9Hno&VN(|ZTs|; zw4AgTb5|!ET&kyF)|Tu@BQQ`3+f0&5Dz5fJbDh44Hxo-P(-*X`DF?DFPvvw2s?iWE z6;TTMo6FMDm2^RX{_0DSaOe*nc9p%tMec0T%@fAt7>M*~mv5oC4bV_FVJr`ZEDz#4 zuJjxYImIyaLyt6i==_664P#QqiOv=~0iR5O)C8df-51dCas4hIrFs$LxpF$!oyFIM%V)#C{CVG7t^rc0NB0Mf3`pX#cTpJ9zY11X>bk zr8T6n;Ku@o0U4g!Uqsrr@&;!P&rQSR_{me1f_UQ5*>Q#|6j7`?c1j0&x z*!ZQ>GWSPQmrJ8Je z`SJ6`m<93{;bGqk0`uNqaja=XhUuZNiF9j zo%^U1*?rAosr;C=SN+~-M8bsZxJ1c7@6FyW3dA(lA_xr+%xiw*4*D_ZIa7XT93?lf zm496_$2gk^uUvDt^Qthhdc`j;8{|Z~{C7+Ck&%SYXm+Ei;|uFeIG+-5Dn047GF3gz zh+<*vUw?oU`>QMZ`0kw1GY*6uTYJO8IED2%^J)`0)z|GD?wB*HMG#qE^KlMSDKXKK z5)S0hB7-r+21Adegq!rXMQsohV%R5`=GR9T&Y8%8f1eqGsValXmH;8!n~!RQJXqad zVT{SHgt4zYGb~HAOH8BE3k&Nk`!!}ayilhU?tEvq(`ug(g1cshkT=$H3m*92Ks;h^ zkp5GHgzX=O#Wn(akdG(?o4O2UTmn@GbNz=(;>e6Z2=T)rOW32K%SdF62?<>%V%Mmw z&b~$M4K=|evdZH#jcP7e_8bD_C`d`TuozJ_*3Vs1^fEwRhqr5ykFM!dn3H~^1p5Ujqgl|kz!;0de7qbLRWkmceV+Ebz z$+I{I#BY{nROS~y0tL{0a16pQ;a@buGNh}w6*_=YfWktp-B#MI8y0U4HUi8f{&+t zPd;$^S6UZzOipsXo^7(#K%c6ai}?h~vrly{p)vtimz@=4S-yml3%N)U*C-Ez+6+Y1 zT71I+$%nl0MYmIFT#2y;_PQ1#4dYl5zK*yrt0mB*3JY4=BOMm3qr0RwtC~!I+FVv# z2qi?wMz*KVNikA$Qgj1HuwT7?XGxh0TO2Q{Ch4AuBMIG{OIjW!vMbZv6W_80d7enP;2|M%u+zmhfd3O!b{|^q-s;gEa^Q zY6txVjl_-5h;=^i4aZBvJ0xC+j|dlSxz$GWP9dezY8z-qQopcui>#Dk?h(U2fsz=2 z3sqhy{(|7GBD_N=$__@s-Psz@CDaI1Kq*&^oGhLjpKgLK!%Io4PWzvWmx9+NIKkkR z-J{riVDgd5wn)Z!Mi^Q9E6UEAb$D2vuJIMKp@e>H{Qca!4<>^$Ob0`2x%kAAlieT@ z;COwzcnQn0e_%u_x;C7dS@!~E(~GkQ_PMzi@etI{>X`94ugIs7X!cO4t~LMw7_+Xz zh88Z&9Uo|%xwz4aiYnKsBAT+r*;#YlJ1501{w7^{R@P%_TMBM^z6~Xa(o+OMn>PC} zoAusV~W$rn-^Jdu`?I>Qi zNXe#BgbvVbH6+2Lr+wpaD*9+LW&_Bgb=|S`7Pb!bS$lR+?$%LQd;0lDJ&d`oc}EyF zX{&ho{R=qEV4PM~jwVMdn^kE*G0ZcS@FPyOcGNl<@Mp}vYmoff@A^7xElS*FlO4wK zAI24z1J_=axpoLyQ)}VhioB{kTc3iDo$< zcr52URf?7V4x+3nr|Ieb=qD8|B$3;8f{}Fh@!ya@?)5)ODkx&(F(ePPkY zC~4>Z?LX-P_WAv9bA)u8fgU&zVNjfMGvGMy!8X>(psZ=rj(?^@f!ZEL!sQooc#P^7 zlWCv>z*sO%H=wlACBK%{Jm?!*BoSQ^X)Jg{WNtPtADdMn;#G`zMS0lii(1aLA)pW* zCy(D;kUs-1;AoI3b{KSM(Xfyz8nwVktxE@Ye@A)3hj#R&3Vt;%RSdyQnl zFUlQaav2uM>Aq5OdSL4P4gBtnYdGumPcE^3*a=r;$RbS8Js89oW;(!(i61c>1iNEi z=qJ>%)&;ld+7ENP_x@!ePWNOkU}PZ@MaW=Sw}Wl;F7vjP*cqxjDxvRHdm6Sy9aavt z)D@SnwY9>`h+614XkPlp+eh27?~GIu1wJ-6W^Ql~WTx96u9BWNmSvpZ3#@-$1Ucjz zj#rKI@yOxL=${H70+{D=?Q9SilMsC4eAn1@zxuc?TjdZSH6q)1kdjdaU6Ytgp+I3?Oa9*<+SGPiUN5> zQ|a67w|XUhW6vd~axpL3p3v^rz9c~Ctzx2MDh|5BCt%OkOsupF9rX6SHC!``OCzZE zrT~V8evCi-12b2xpm)w^Gd`?Qo&iNUC!>=97mf>~6~mCUa!LN}L28=S9>2BdE5ac7 z4q-k{`2R_5cmK$>6>i1NcK*2|+qjg9JSwexQ^6~aw}u`gKA9KO28N?V&stn7>l78r z=Fqz0R&2n5SQCt%Yv-<|>6i}l?R_TulNFCcUu}C+_kixMOD~q%&WnQrgk!8?) zq&&-Gfx5?$cs}bKPLIvylS*2A2@O+21xgG%_~uAi}d&DUcFAA+(D-?cNV&N-FKEUC0l z01O4pWtxb9DNCB&#fnIzg)Inq{}s{ndiuj1p35*t+;2F*;?NWhD?dCv6HK+rcdr_=arUg60mdaO zP3(YZJ&7E28@B#P!Ftdi2qK%jNVHT%5vbLZP_XcweGpq0#F?lYDxQzN1~h9-zDxP@{u}4D}-e?F4aVl3qg1w z(o8+@fep4(B&i^p{YVXmNXR98U(sjVsmU3aRd7c>;*;(k_>9s)RRgjkPCz7q z0d;(3@nx0DV#S=WKU)b@ z%*fa+1%?QCT7E;P?CfAeBp0FW%vRq%QT!wifNalR;*xPW=|mDJzb3DAH_*?vrnUuN zv{=XW$NOPdoL!M{o;Kt0E#Dw9${$uLqKAlv)LFc^2NXGb3NW^LJOzp(Z4{y1SfQj; z{`{Ky7Yz>y>cJozy3UOX$FM6v?4v`$aq6r>#~&sQ69u+ky=2*-84Dqguc~F(4P}bW zqO`<`+gt80UqM9sbY_%u`c3(SPx%iL|cRL!Q&AGrFPI<-^0c4+fd z-yye&qlw<0har{tF1{p1QK}?O2C>(mgl*;l+bvmx5}E_I+aINQ{S6WT96#OCNIGD+ z#Q`YcYV)*=VmdV))y%92b|Drih|Ebg13>X7zhA}Lalo4tS*#-eh>W{<6jie>42Nj* zV`FYX5HXEb;oWteoGZRWcyk}a(IV455otm%15vs+MmRHg&*Wb4LZ|d)B4JV@TFUr1 z4twWD4zVR2dujLR&$$n4(&!TI(M@)bh|Iv&t1*>;Hab*iwbr%i4Ii3Zb1u*thnuT2 z7wkK?C#e`v=yZ*Ghdf=z%tRAq&!2_H-e$6uGp3}k;G-TiSE2}O3raG#fEZnN$9%zi zDtHxX-gX}4^R`Xr?u8Smx`#55JJh!!9-GqEq`Q~*#9bX=)drw$Isk(P{Vl0zfIQR= z%`-Lu^GB)s;BDm4x%Ad(E_0ONn#`4uz%}F2_iz)JlnKKk0j@rd+I>igB^kTJ zs2*im^j0?0uv14Y`IF@8 zbUjT8b+w6Dxvi8;0uGx77b^$RY-mzc6;3?Ediz6j0d&6f&f?n0 zpzkmhmt$Up}M0#^^ot=l5m94Iy}0b1U-#HcJvfrzu`M z=$S)2+V(DIC>->&d3y5W30LBK+{c&q&+54Kiia`R7WtdC*+j=dV}Ra~U)$b4abg$9 zD6sk(3ifAzFofxgL)FhmEw4 z%@q@-hF0kL)PMQrHK>_&EW1_X2dQ5g-E6-ZPT(v`WmXnF{J0az6o{7=ns2SW0=?2+ z(Nst&mzbFvlIO~K)ylJxQwM}5q zNAOAV6~~YDX1A*m8E#Af@9$ehiDnpsR3>52HdfsYa;Yp*dwxs6NGmk!iDyg-0NMtY zR_U8D1^}m`@T&3ZS#RS?HcK#DWc3VOe_IA4hxodCSJDTnsUU&oI0+iIrQ9K)GPD~? zrF0QXDrZHzy*$`gc9*B&VTj?lk9$KlK3}$e`AVXF4{Su~GnT4(7dozea|jG=hL*lb zwUh^thwUdbp|_Wvc{|U-bq9OaZCN~Rk9FV^4IiJk-EqOC<8%nv{VnM>q{Jyi!`9Az z{$-mw3FV-*sVy;Qb@%i|a(#pvVFia3<_|j+;DY$9*B9}V$yiqx>&_$*MBXkjP6t7kZoMd z_-p(3XKZJpWp$jsuXiAB2!d6)@7OLmG7ky86Za?*g!T!=Q079Su$}6d2|^I zvu@fXKmg=&I*?ROid>XKv$VZQqn?7Vy z6(eTibn3~eoTPak`A%ZYV2+Pd>Mim-m>*WNm>Ub?(8ME>E~^F{=f~H90#~i3FWeAS z3za)Doo68g+q@V~>LW|~E{mn7I>%XI(MT|^3HFQ^RyU^vB5T$;MPpQHsl1Rn5(oM` zqt}(T#1>VMw?e^HrUA8Y=|n^ShLwU((5GlsgBY84&tr`)c7Epxd$tzAg+^1R;WhF* za{}Y>aE+_s3ij;PGdv(sNozQq9)ci=EY0EFw%<<3i|rt^v=TeJT1fNQp?qnpcyY65 z%PB@?`CdS~@vVA$fWh|gTSH*mL;ZW3V(q&SOauB>NIS&fEfm-J&%~IilK!ngsuuvS znaRh)&ThK;>~#caHkxTdi&&B=5m5+#8?k7Pf)z#V;{wF*u#McFolxuxk>gn*y*xULg9#{=CgI zXBwA#J5UcpcAF8gffCR_7#re=XINAi#Y|80@#QD&od_Bx6zn$XItikO7Hxr9S{WI| z>P3ZS3h26n#nGvinyMftBUvj3Jn)TD>XP?k1H)ewqF8qwAUCTvEwQ$RCjs%G-V+hV z)|*#tL(l-JOX4$tJQZ;aRE(EAkkoK@GtWTOz~slpC2@!=i1=LgWY^%YU&2=2Bxy-l z(^31GI5I@etquvr>u`Xy^o9=!QH@?=2Lk62{Bb8w`5T^RA$X(-f=xg$+OuxjHMl<# zPuyZt99ipYbt!TguggKq#`%A)mT58U&%m743g9TvXE%QT=aqw~IVGwTgqXVCMZxAu z$UM6E$>myaUjejYuN2WqhCufCA8KKaW_xjIvV+Ju{gkrwtcwE>ywxYNGPs?-?K8dx z>m~86ptp62?EMVDgoDY{u$|V8`3rOn>lRADv+#4#h5q^a%kU&qW?3C^w%=PA(=8Hk7D-O zr$C?O!$_R+U^cm56D7(ZCzVoplnwT-*=_nlfp1EUSAhxCA%xD2S$_RH0p$a)TY!i- z3i&eco*z@hGD4I4cfJly9qTenUNYVTcyCEWYP!LaNwVg}lHVJ_JRm^y7OyIBuG7qa zyHE=<>PmQ}gi@lX1qV&QN7~ana=u%r{sP(f z(-S6y&d#@xQI_H-7$>>*1=5LpLYYs$6>{cH#XbcT8w<{Txoc(7eN|(g#&JCdRr5aY zm+6=+%Le|-eUw%}9C7)3GM`cN=h;X4T@b<$-Mlq5f%{2w1Qb z&3QrrbTx!v2KS?e9k|wy0Mim1qp9Cgo?$eJkKS9AF_RQ%&QFfBb;y_LO}8)r@GZ#X z0KREC!kqR;+7t-tSca&WLj0E*X!Y!FX8$HXj9zBh>FHnRrXZXa+NcdszE|uGNkS&D zB=i~VA)sk%+LO)x1wEtHZqwd|f$Dmdyw6!gEPmeUQpxf7f>o(>bT&fBg0YgaEw1nG zBYO;^e=i5i3&U)w#XyOs>UFwC8X)GO?Ots)_|<4{GGu-n%MCh4mOf*9P#)^-A?r&{XVL`=6#5qysXh01vjVcIBQ$_89!d|G%%T z)tQzMk8vQb0i$R>MhP{Y>qh{2XHQRrvY86`A&v-{7lQ$0Ia_zmo^ko_J4)mN8IwA%QoRH>c#+ct@2&PTGTf+` zZr{AtgiNJ_L?VJoSMu0KHG-akuxNff$JkD@zKluSsLmJSo!Z6;G+fw};^N`!urtt2 zbmn(a7XgSv{x&@QD6?nFknYOShI`=bgb^{3 zA(yBf^FlrYD?i)D8uuX{w!RbGpHSzfN+IVa}7H3 zY!rB&7e^TA&b}DDbWD2v%pGe`83!dkpxUtq0`^2!#-TPF3)uT>Pzndo@01F?sQ|UP z58eR{w&z3HTYH$uwzCeU%_ymz2jXXWQW5!GHddg#5+C$)P$d>Ks12#nMsRnAqZ=`j z996#cPLV{y$S_Hg!^@K&Cj47r_uS4Uag-uk-FTWCDnH}=X6O~a@ z&;x{Xj7U+d8nYd0SO~;EX@|VC+e|94qhFXXR#Zpeg#ISD*k;Jf0y*kE&LF=` z=Omc~<(Q~R{tU{wINh^EVV?%MINFiW2|JXq7cIwG*cDhl_&H+ixsNRWXCbMlv`T)U zpOXo_hjADebF;?UgpYbHUm&C(1#h|*gaeq2fjir=PcWvKeB$1oGVB)~0JYJL9;&xq zKk7vM{z|~=kHpFC(IaJx?4MNtS$0I}#;t4*gG*3+3E3q`V47Xanz3k+Fu!z@I&}qLIukuJSLgLr-*6kX z6Is`HRpyos>Wb}%kGsRZ8!~+nE3EGDyc(jE`FW@jAu~$qAa&Yho3G+1wfPd)th z3D3L2S5w`@pjfVQPbaAqxLo;P3pAwi+u0=>Q7eBV@K%#JE8>R(obrLSO>f}t`Ra01 zbDwYmlC8KR2j&$kJF@kSO|wKAcZ@tjkzP0cINq?GsfB_%PEdwiXI`mN0TB0Xv&^%+ z0Ay&YQ3$>_t)NFko6D&N!YC9R1a*|IK4AuV5*}QPrtE>lSM?tBRqLYIKMZl|+gtvx}|$JAeB<3;y}AZzIB;6VOxyS1s= zN5zj_a%LwW8VD~}@1Ll)bK*%7&P>URV>HFh9^z6w!nC5qo`6XFxZbprky2MLHq{Swi?nrp7 zr{-wHPiZrzZ=a!A236dtCV5EnCQ2+0raB6&s4yvBKnr|LNPx0SQ?rlTnJ+>aEG9A} zV}h7upS^a>DcRmr8Xuo~_R~2E`>+9Mz?#pcUF^?l<}Ks-1XgOBfz*CVA3QTno)r7i zCJuj=c5EvYU1=P}5%ycqbbnv84+MHx@-H>Gink&Gv9%(q?dlNc5GJ(Gb^5++OHr}I z;v|W#$ITmu{84fvH?$&(**OG?yZl^u`DmWV5r?dk&D3p>hBOBntX4V=s-?$FS27Jj z+o(?ke?mJ|Dnd1;J(-g1L5JjDFw^Zp(ZK{uvnPvG*y$VlFo(YhlRRhUu9nvGcTAen z>)SzR?T|Y-#Q$8uDx4%xDZTb_qO@VTGsW-5{z>m2mP6z0`z`3Eb)qxJ|Dc7Rf_V~Q z0r$^6rkO!%ohQmPsga2}yHgKG3{qqNS#sC3#eLUoA_WjOE`)`1sT}9_Q3O~z$&V!8 z|2Tr(96Cjth9AK`3`G`1L4Y7wcpyL_j7bhba&y^#*u$HnGk(Ap||`W!->1!I^0laG1c(R(9Ow{RUE<@>D3RRDcn_5NjI~&?|1B<`^05%?1-vwu4-d zWTe=QDKEmtDiCUp1)j3U@^a^WeIZM_O1Xdg@NpV6-+Q!3tX|4o$wC%_%Xwthcy7m* zqm*XwmYgv;k_|_jYe5*mSUz1*r@zA~Y&%u)OkP)20PEf4cbMirQ(MaALtIY8zHN;T zqxp!^87=Qd3Dm&Pkg^bKOpj^kX|*E_@)bQWKJOQO0pk$#Kd3c=YkU7M*8cM|V>mCC z+_95A+@3`nEA2XA;77R6GiUxfML#%HLgnIsXB-?QGhGO}F5O;RskVwy%f%~yDkEF0 zHDwmcDL{cXxV}oDF59Ff7`ATG{`lWJH~r|OvAs2c0-utzHjJqy;VNb5p;An)naOw2 z|4r>>K`g_k9J4qC^EzgC%T`Pn@+z_M3BG{FZgNqldR0 z8tu+wGep$7_>~5~tqz^0&O;6L7;Kt86}Z<>s68H(PFSDp-vL!P$r)dC5&4%nBeQZ{ z(<5>BY4tC$m&CXz@%0~W|Czn-0}5O__*L_+G^7wOAi)W~R1Lu{3+X|H!S;Z%UiM4Y zoHk(G&a6i3VW3$~v{UW=ohDdJB~){a0Jm0>j^AKhMwt4?qw|WMuXtyEAk}ybOV0@l zbP#IHF;~ARxj%68n={xF)Cp4Xhl^9Ik@!k^~k^9_a{*aWoz-SI3C$l{f z{t-9*Vqp0`5_nS7Zf*@W8qI&Kbb@A4^@}K?@9VYJ<|0cRI>+ov6?){o1ATbJ!bFf- zmOsKHBM6MlVCdmec za;OOOgODvsVqlm1BV9FT>G)2z1!4Pikd|y=>R1YOn1+#-xsn<$;A(+pXR}oJfQH^L zN|IeQj}AcI&1%y0)>v=`08q1O132L`%tgz8LIAlNOl=&z^jqjrJGgj}@v5>v^o#E&V8Pg2?cY!&H{rrb6S_2LAh3y|;h68e`DiR|Nh(vsIM{7&aV z6Y2M$lQ=_W_dM|JM`fAsnKkwj=r77o#FWmgJ3X{Rdd zZe6qwLq}0?JfER)UWwEBQgCW$htsmxiEwqd7n%ekyy#&s`|qxhS3 z2~g0UlSrG%;MS@Gt)4XyHnaZrAOMBz_Lh}DMZ_p*SDHZAvk<=+A5}EyR zJri$H`Qi?Ji5XoFou4H7Um5=aX~N7vSLc~^gdXjg2}OCYS5OP*GZYdb+-7@WFSX7` znI?##U(K~>tDYN9I9px*^@xhl%aosN{WV%w=8%hd7qctqIA~~tZ3;pKc=BcJcu75# zWt4#Pz$f|iQVIQu`OTZb$NTRY&vHTfJ$JxYXh8QtM=(4|FW+Yz^t=}%ztHd=A)qLIJf!6I0V zI~L0n!Yj?7ufLjV{;A;$gXd0-H#kuWJlta9y zV_e`i!2FqA67rRepVj+$MR9t`8S=UFq3-UuX)*;-s`2=zT0$^d<{K};=sdFv(p?cc^MOyJwHV=f2nE!G0E2oS+bIfDl`~-*PvACA>bjkG;8;x+rZ*S zu)rPlj+G0<%%Gx>_Ck*@7^p@Y%n`q1nO~{Tn0$4Q^fYLwxd^FPbq&8HLZCf(_7+I{ zG!_J*Jv8R6W{&60#XxV55RyV17-U*&m#B%^Tl#7T&&6QU;?9L*Dbv0iL2p9T zt-hmAq8zS7g}ZlFdZSg!%0^!OV8td-=>G{jv>XII1IaL*Y;3)PX4(n5=O?Ry6FF%! zhlM{waY8^@C+vl~Jtm%I@M4ZY&L~euJA8I0&GXysY^wnTJA}_;BI6T{66=$UW;%3I zSl7*FbOu%zBBQIr{?jUW7YiA4zx| zw}=8JC+YiP(MQYNDlQSW0*+6>^v6Ln3>ba7s1*=dsceXfmR56Gp(hKpRqz`%3m0hCQ7$AzodtG!9B?L$@qj``!Fcff&X( zpsc*owwOvXxq?-=N^kG#QmQ+ur@!Xpd7R24Pcu4d;O3TspqkRCB$SK45{bL0a8TY9 zewl6qqG1U$51XpS;lH8)ZYO3!su>T-?*)I;L+v`CFfhgK(^APgAayY1=J!ziWkuW< z2K|olOspV9DvKh>rzdMvighq(!QGzNcpn%_Asp93NM0Dg1VVj`R4x_|qt`R@?~jrW z9&Z^M39TJ$6ehzn6{dgd$7Q=T$CLSHen!Zp3H59@Dh?fLS?4U@ETvqt!3H-Xbbln+ z@~(PtpZJ3?9Bhs#Hh}?0Nrr7uv%X%_(srW=zRb!=)hiFFV8NBVMltnlcu(XZZ-c9B zRA?Qkn2YB=fF`+|`AcSU)>1d&Rz{jj@xWwpr|{1w3EPWc5sTs7Br!JM@^O;4^zHrv zViqg{_+yrct?ng$?e@~ed#$ATu;I1w2$kOb5(oo(S6I+opFS zLH}ZaJjN8lQ%A^jy91^OahpycU4sJ^hfr75MlqLTpng9}a2kf-J?2h`==+mV&3bH*3@?V`~K8JBvmZiGo3CC7fdikgi zSI?B)^LA-!?q5X7*cHg4xQyzR%|xB#e`B{)b|$=V42$8$-u266yu6#CFuib{$nlG1Uu)w`#4cxEzH0J6gcO#*+I{{K-O1phZ&8lOlP zvVXFN8@f`$p@*A(gY!;r>IX$cZT;|f7K2rlv8pt1b0NwAM?kp0>F3QrUi$O<8H7yS z9waI8@QR-AG!+M+UQR|7NdqZn2lZ{AHb35q>eSXBX`-^^ohAq?y$+Pn{u^}~gn#^5 z(8vkZe}eK5OvZi5r@TWf1?izRl8GIdkBsYej+`?m=txpdyJ^32$IfPiIe=_2X>YE& zG!ZrJUn8wTzf_i|n80DwLRD6cNGsu(bg)@4pv7tMY=*h2@CIqCj^^xNCCSQ$RL?$F zEcPoFR^5^rCLe)t4>HVzRXkem#$y-}9A0?28zGM}FpNvx1$f^48~k@YcN?p=4Dry; zZ<{X@tflTi#Y!-J?_JUFO7f?zs6?(&=?VHZHYS^G6mA#@X1hZswIv$r^aHN{h8tFV z@VaTy7_uJk?seM&1A_Y?%b%)iG*7NQd}?w9rN@|x4YQ~3wD>__e*LVp#D20{0xvaP z%l`|m%ER`}3IxK*bO;n_xTG8c9@&WDJsV!py;d#{lSs-yczG@>Z*8BEqIK-A4f*cg zqaj!K1-eD8STF$s#?0ys9|>H%Y2u^sJ$RSiYmLbnMk!TTs)svuW%SdPLDa323V&ao zQy%E$dh{a8Z&=Dc^6%S2W@aKJR$q<%8u1wosO1Nq5PQL;{TDOjgV2v_~z=A+GOxO z<3g{fXEvF*(fG)LehmukNkAL3Rac_2MQDmNHe$TCFr=Weg}%jA^sHegy%bWrsO4!O z@lvoaJ|d5S`#Q1cQAJx9ya;r|WDFUiH=*pT@`{o%=3mgi?7#}zAlnkQh_@9l_<*^wQUr(OI<0d zE?%H1Of^#mJaF?0!LMIc6B_9YfHV@qt~Mi0h!5tn9>Kg)NWNfYMJ?|i)!Gabel55H zGT+JM#7fL^2f8q}>H4_aR>j^UL9AM`r@$+bN4Jo`Z<+s=T$0l}zu!-im�NrlL@E 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⁡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�}qC7TNcOw{~N@#O_t6L;*EQGB8jgPN`zqMWmRB9zH(>FMBEuh)RbT zbM#{=t?Hkh>7Beh_Ul;v;lp&cm*WH*azi@s>WhLD`!|o-URqwQ7n?|j0)`}gL_BDz z;V2~;08dm3=s0LDGf1_IvLUOKVoxC$LaR|uA+%MJ2s4GL!WoZ9>O9h7q^e$AM*k!_Zah7e zurN-c0x#Tz!UTd-j#U)H5xu%)WsE@E-pgPMG(;MoLCD#Z4e^9wD4u{GN!cdF1oP{t zo2GL~D~#9o)2Wy?temUS{0#OvDi6Gj3N$px=xHXY;Jj~+WaVw}mPzX$s;>CP!VUTr zTh?|{*Gr!VMq7SQIwI92Y`VYGfreHZAO;$pdZ(LpoE zgu->=m^RAis751IkG(>^-92hTln$sjvpN*l=wAc4OAGq9if>34jodSDBYtwPlCEq* zuGJ>r(k5h?!JXVsu=hLy*e8(R`b_{$RNX zf8Lwr;NO~T0Rojt1#QZhg-@s zqB3z7u?lJny}#aBZfxoJE#j z4F;Alg)e~Y&_FBeuObA<2=oW^uRa#9Jp<6Gq&U-=lrFIE(yPjs3}&$AlAoAPEgec4 zTtTEo(REL6V>8Cm0MIOguiUvz8F7Vbo7j$Wg&5Tx?(awz@65g*kjO+)?}kH{TeLZ~ z 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 wj?E0*O=fi{i`9Qva~BT5DRDS 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

(J>8P4txbr`X61+}~$VNM}d%jbp)2huQ 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

}otk)Nu%&Ri%krFoJ7+_~5 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