diff --git a/package/ctcgfw/luci-app-diskman/Makefile b/package/ctcgfw/luci-app-diskman/Makefile index b40ddbcffe..5f24e5d036 100644 --- a/package/ctcgfw/luci-app-diskman/Makefile +++ b/package/ctcgfw/luci-app-diskman/Makefile @@ -43,4 +43,4 @@ define Package/$(PKG_NAME)/install po2lmo ./po/pl/diskman.po $(1)/usr/lib/lua/luci/i18n/diskman.pl.lmo endef -$(eval $(call BuildPackage,$(PKG_NAME))) +$(eval $(call BuildPackage,$(PKG_NAME))) \ No newline at end of file diff --git a/package/ctcgfw/luci-app-diskman/depends.lst b/package/ctcgfw/luci-app-diskman/depends.lst index 42b5f0cf0e..db7e960766 100644 --- a/package/ctcgfw/luci-app-diskman/depends.lst +++ b/package/ctcgfw/luci-app-diskman/depends.lst @@ -1 +1 @@ -e2fsprogs parted smartmontools blkid \ No newline at end of file +e2fsprogs parted smartmontools blkid mdadm btrfs-progs util-linux mergerfs snapraid \ 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 index a1e876240e..8ce5a93ab0 100644 --- a/package/ctcgfw/luci-app-diskman/luasrc/controller/diskman.lua +++ b/package/ctcgfw/luci-app-diskman/luasrc/controller/diskman.lua @@ -1,11 +1,6 @@ --[[ 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" @@ -29,6 +24,7 @@ function index() 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", "btrfs"}, form("diskman/btrfs"), 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 diff --git a/package/ctcgfw/luci-app-diskman/luasrc/model/cbi/diskman/btrfs.lua b/package/ctcgfw/luci-app-diskman/luasrc/model/cbi/diskman/btrfs.lua new file mode 100644 index 0000000000..0060078536 --- /dev/null +++ b/package/ctcgfw/luci-app-diskman/luasrc/model/cbi/diskman/btrfs.lua @@ -0,0 +1,210 @@ +--[[ +LuCI - Lua Configuration Interface +Copyright 2019 lisaac +]]-- + +require "luci.util" +require("luci.tools.webadmin") +local dm = require "luci.model.diskman" +local uuid = arg[1] + +if not uuid then luci.http.redirect(luci.dispatcher.build_url("admin/system/diskman")) end + +-- mount subv=/ to tempfs +mount_point = "/tmp/.btrfs_tmp" +nixio.fs.mkdirr(mount_point) +luci.util.exec(dm.command.umount .. " "..mount_point .. " >/dev/null 2>&1") +luci.util.exec(dm.command.mount .. " -t btrfs -o subvol=/ UUID="..uuid.." "..mount_point) + +m = SimpleForm("btrfs", translate("Btrfs"), translate("Manage Btrfs")) +m.template = "diskman/cbi/xsimpleform" +m.redirect = luci.dispatcher.build_url("admin/system/diskman") +m.submit = false +m.reset = false + +-- info +local btrfs_info = dm.get_btrfs_info(mount_point) +local table_btrfs_info = m:section(Table, {btrfs_info}, translate("Btrfs Info")) +table_btrfs_info:option(DummyValue, "uuid", translate("UUID")) +table_btrfs_info:option(DummyValue, "members", translate("Members")) +table_btrfs_info:option(DummyValue, "data_raid_level", translate("Data")) +table_btrfs_info:option(DummyValue, "metadata_raid_lavel", translate("Metadata")) +table_btrfs_info:option(DummyValue, "size_formated", translate("Size")) +table_btrfs_info:option(DummyValue, "used_formated", translate("Used")) +table_btrfs_info:option(DummyValue, "free_formated", translate("Free Space")) +table_btrfs_info:option(DummyValue, "usage", translate("Usage")) +local v_btrfs_label = table_btrfs_info:option(Value, "label", translate("Label")) +local value_btrfs_label = "" +v_btrfs_label.write = function(self, section, value) + value_btrfs_label = value or "" +end +local btn_update_label = table_btrfs_info:option(Button, "_update_label") +btn_update_label.inputtitle = translate("Update") +btn_update_label.inputstyle = "edit" +btn_update_label.write = function(self, section, value) + local cmd = dm.command.btrfs .. " filesystem label " .. mount_point .. " " .. value_btrfs_label + local res = luci.util.exec(cmd) + luci.http.redirect(luci.dispatcher.build_url("admin/system/diskman/btrfs/" .. uuid)) +end +-- subvolume +local subvolume_list = dm.get_btrfs_subv(mount_point) +subvolume_list["_"] = { ID = 0 } +table_subvolume = m:section(Table, subvolume_list, translate("SubVolumes")) +table_subvolume:option(DummyValue, "id", translate("ID")) +table_subvolume:option(DummyValue, "top_level", translate("Top Level")) +table_subvolume:option(DummyValue, "uuid", translate("UUID")) +table_subvolume:option(DummyValue, "otime", translate("Otime")) +table_subvolume:option(DummyValue, "snapshots", translate("Snapshots")) +local v_path = table_subvolume:option(Value, "path", translate("Path")) +v_path.forcewrite = true +v_path.render = function(self, section, scope) + if subvolume_list[section].ID == 0 then + self.template = "cbi/value" + self.placeholder = "/my_subvolume" + self.forcewrite = true + Value.render(self, section, scope) + else + self.template = "cbi/dvalue" + DummyValue.render(self, section, scope) + end +end +local value_path +v_path.write = function(self, section, value) + value_path = value +end +local btn_set_default = table_subvolume:option(Button, "_subv_set_default", translate("Set Default")) +btn_set_default.forcewrite = true +btn_set_default.inputstyle = "edit" +btn_set_default.template = "diskman/cbi/disabled_button" +btn_set_default.render = function(self, section, scope) + if subvolume_list[section].default_subvolume then + self.view_disabled = true + self.inputtitle = translate("Set Default") + elseif subvolume_list[section].ID == 0 then + self.template = "cbi/dvalue" + else + self.inputtitle = translate("Set Default") + self.view_disabled = false + end + Button.render(self, section, scope) +end +btn_set_default.write = function(self, section, value) + local cmd + if value == translate("Set Default") then + cmd = dm.command.btrfs .. " subvolume set-default " .. mount_point..subvolume_list[section].path + else + cmd = dm.command.btrfs .. " subvolume set-default " .. mount_point.."/" + end + local res = luci.util.exec(cmd.. " 2>&1") + if res and (res:match("ERR") or res:match("not enough arguments")) then + m.errmessage = res + else + luci.http.redirect(luci.dispatcher.build_url("admin/system/diskman/btrfs/" .. uuid)) + end +end +local btn_remove = table_subvolume:option(Button, "_subv_remove") +btn_remove.template = "diskman/cbi/disabled_button" +btn_remove.forcewrite = true +btn_remove.render = function(self, section, scope) + if subvolume_list[section].ID == 0 then + btn_remove.inputtitle = translate("Create") + btn_remove.inputstyle = "add" + self.view_disabled = false + elseif subvolume_list[section].path == "/" or subvolume_list[section].default_subvolume then + btn_remove.inputtitle = translate("Delete") + btn_remove.inputstyle = "remove" + self.view_disabled = true + else + btn_remove.inputtitle = translate("Delete") + btn_remove.inputstyle = "remove" + self.view_disabled = false + end + Button.render(self, section, scope) +end + +btn_remove.write = function(self, section, value) + local cmd + if value == translate("Delete") then + cmd = dm.command.btrfs .. " subvolume delete " .. mount_point .. subvolume_list[section].path + elseif value == translate("Create") then + if value_path and value_path:match("^/") then + cmd = dm.command.btrfs .. " subvolume create " .. mount_point .. value_path + else + m.errmessage = translate("Please input Subvolume Path, Subvolume must start with '/'") + return + end + end + local res = luci.util.exec(cmd.. " 2>&1") + if res and (res:match("ERR") or res:match("not enough arguments")) then + m.errmessage = luci.util.pcdata(res) + else + luci.http.redirect(luci.dispatcher.build_url("admin/system/diskman/btrfs/" .. uuid)) + end +end +-- snapshot +-- local snapshot_list = dm.get_btrfs_subv(mount_point, 1) +-- table_snapshot = m:section(Table, snapshot_list, translate("Snapshots")) +-- table_snapshot:option(DummyValue, "id", translate("ID")) +-- table_snapshot:option(DummyValue, "top_level", translate("Top Level")) +-- table_snapshot:option(DummyValue, "uuid", translate("UUID")) +-- table_snapshot:option(DummyValue, "otime", translate("Otime")) +-- table_snapshot:option(DummyValue, "path", translate("Path")) +-- local snp_remove = table_snapshot:option(Button, "_snp_remove") +-- snp_remove.inputtitle = translate("Delete") +-- snp_remove.inputstyle = "remove" +-- snp_remove.write = function(self, section, value) +-- local cmd = dm.command.btrfs .. " subvolume delete " .. mount_point .. snapshot_list[section].path +-- local res = luci.util.exec(cmd.. " 2>&1") +-- if res and (res:match("ERR") or res:match("not enough arguments")) then +-- m.errmessage = luci.util.pcdata(res) +-- else +-- luci.http.redirect(luci.dispatcher.build_url("admin/system/diskman/btrfs/" .. uuid)) +-- end +-- end + +-- new snapshots +local s_snapshot = m:section(SimpleSection, translate("New Snapshot")) +local value_sorce, value_dest, value_readonly +local v_sorce = s_snapshot:option(Value, "_source", translate("Source Path"), translate("The source path for create the snapshot")) +v_sorce.placeholder = "/data" +v_sorce.forcewrite = true +v_sorce.write = function(self, section, value) + value_sorce = value +end + +local v_readonly = s_snapshot:option(Flag, "_readonly", translate("Readonly"), translate("The path where you want to store the snapshot")) +v_readonly.forcewrite = true +v_readonly.rmempty = false +v_readonly.disabled = 0 +v_readonly.enabled = 1 +v_readonly.default = 1 +v_readonly.write = function(self, section, value) + value_readonly = value +end +local v_dest = s_snapshot:option(Value, "_dest", translate("Destination Path (optional)")) +v_dest.forcewrite = true +v_dest.placeholder = "/.snapshot/202002051538" +v_dest.write = function(self, section, value) + value_dest = value +end +local btn_snp_create = s_snapshot:option(Button, "_snp_create") +btn_snp_create.title = " " +btn_snp_create.inputtitle = translate("New Snapshot") +btn_snp_create.inputstyle = "add" +btn_snp_create.write = function(self, section, value) + if value_sorce and value_sorce:match("^/") then + if not value_dest then value_dest = "/.snapshot"..value_sorce.."/"..os.date("%Y%m%d%H%M%S") end + nixio.fs.mkdirr(mount_point..value_dest:match("(.-)[^/]+$")) + local cmd = dm.command.btrfs .. " subvolume snapshot" .. (value_readonly == 1 and " -r " or " ") .. mount_point..value_sorce .. " " .. mount_point..value_dest + local res = luci.util.exec(cmd .. " 2>&1") + if res and (res:match("ERR") or res:match("not enough arguments")) then + m.errmessage = luci.util.pcdata(res) + else + luci.http.redirect(luci.dispatcher.build_url("admin/system/diskman/btrfs/" .. uuid)) + end + else + m.errmessage = translate("Please input Source Path of snapshot, Source Path must start with '/'") + end +end + +return m 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 index 5ed0df6773..84b70d4ff4 100644 --- a/package/ctcgfw/luci-app-diskman/luasrc/model/cbi/diskman/disks.lua +++ b/package/ctcgfw/luci-app-diskman/luasrc/model/cbi/diskman/disks.lua @@ -1,11 +1,6 @@ --[[ 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" @@ -67,17 +62,23 @@ if dm.command.mdadm then 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 +-- btrfs devices +if dm.command.btrfs then + btrfs_devices = dm.list_btrfs_devices() + if next(btrfs_devices) ~= nil then + local table_btrfs = m:section(Table, btrfs_devices, translate("Btrfs")) + table_btrfs:option(DummyValue, "uuid", translate("UUID")) + table_btrfs:option(DummyValue, "label", translate("Label")) + table_btrfs:option(DummyValue, "members", translate("Members")) + -- sieze is error, since there is RAID + -- table_btrfs:option(DummyValue, "size_formated", translate("Size")) + table_btrfs:option(DummyValue, "used_formated", translate("Usage")) + table_btrfs.extedit = luci.dispatcher.build_url("admin/system/diskman/btrfs/%s") + end end --tabs @@ -95,12 +96,12 @@ if dm.command.mdadm then 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")) + local r_name = r:option(Value, "_rname", 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 r_level = r:option(ListValue, "_rlevel", translate("Raid Level")) local valid_raid = luci.util.exec("lsmod | grep md_mod") if valid_raid:match("linear") then r_level:value("linear", "Linear") @@ -121,7 +122,7 @@ if dm.command.mdadm then r_level.write = function(self, section, value) rlevel = value end - local r_member = r:option(DynamicList, "_member", translate("Raid Member")) + local r_member = r:option(DynamicList, "_rmember", 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) @@ -135,7 +136,7 @@ if dm.command.mdadm then r_member.write = function(self, section, value) rmembers = value end - local r_create = r:option(Button, "_create") + local r_create = r:option(Button, "_rcreate") r_create.render = function(self, section, scope) self.title = " " self.inputtitle = translate("Create Raid") @@ -145,8 +146,8 @@ if dm.command.mdadm then 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) + if res and res:match("^ERR") then + m.errmessage = luci.util.pcdata(res) return end dm.gen_mdadm_config() @@ -201,11 +202,17 @@ v_mount_option.render = function(self, section, scope) self.template = "cbi/dvalue" local mp = mount_point[section].mount_options mount_point[section].mount_options = nil + local length = 0 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 + mount_point[section].mount_options = mount_point[section].mount_options and (mount_point[section].mount_options .. ",") or "" + if length > 20 then + mount_point[section].mount_options = mount_point[section].mount_options.. "
" + length = 0 + end + mount_point[section].mount_options = mount_point[section].mount_options .. k + length = length + #k end + self.rawhtml = true -- 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 @@ -244,22 +251,67 @@ 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") + res = luci.util.exec(dm.command.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") + res = luci.util.exec(dm.command.umount .. " "..mount_point[section].mount_point .. " 2>&1") end - if res:match("^mount:") then + if res:match("^mount:") or res:match("^umount:") then m.errmessage = luci.util.pcdata(res) else luci.http.redirect(luci.dispatcher.build_url("admin/system/diskman")) end end --- -- btrfs +-- btrfs if dm.command.btrfs then + local blabel, bmembers, blevel tab_section.tabs.btrfs = translate("Btrfs") - local btrfs_devices = {} - local table_btrfs = m:section(Table, btrfs_devices, translate("Btrfs")) - table_btrfs.config = "btrfs" + local r = m:section(SimpleSection, translate("Multiple Devices Btrfs Creation")) + r.template="diskman/cbi/xnullsection" + r.config = "btrfs" + local btrfs_label = r:option(Value, "_blabel", translate("Btrfs Label")) + btrfs_label.write = function(self, section, value) + blabel = value + end + local btrfs_level = r:option(ListValue, "_blevel", translate("Btrfs Raid Level")) + btrfs_level:value("single", "Single") + btrfs_level:value("raid0", "Raid 0") + btrfs_level:value("raid1", "Raid 1") + btrfs_level:value("raid10", "Raid 10") + btrfs_level.write = function(self, section, value) + blevel = value + end + + local btrfs_member = r:option(DynamicList, "_bmember", translate("Btrfs Member")) + for dev, info in pairs(disks) do + if not info.inuse and #info.partitions == 0 then + btrfs_member:value(info.path, info.path.. " ".. info.size_formated) + end + for i, v in ipairs(info.partitions) do + if not v.inuse then + btrfs_member:value("/dev/".. v.name, "/dev/".. v.name .. " ".. v.size_formated) + end + end + end + btrfs_member.write = function(self, section, value) + bmembers = value + end + local btrfs_create = r:option(Button, "_bcreate") + btrfs_create.render = function(self, section, scope) + self.title = " " + self.inputtitle = translate("Create Btrfs") + self.inputstyle = "add" + Button.render(self, section, scope) + end + btrfs_create.write = function(self, section, value) + -- mkfs.btrfs -L label -d blevel /dev/sda /dev/sdb + local res = dm.create_btrfs(blabel, blevel, bmembers) + if res and res:match("^ERR") then + m.errmessage = luci.util.pcdata(res) + return + end + luci.http.redirect(luci.dispatcher.build_url("admin/system/diskman")) + end 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 index 9de1a98dc3..38cf4c44de 100644 --- a/package/ctcgfw/luci-app-diskman/luasrc/model/cbi/diskman/partition.lua +++ b/package/ctcgfw/luci-app-diskman/luasrc/model/cbi/diskman/partition.lua @@ -1,11 +1,6 @@ --[[ 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" @@ -37,10 +32,11 @@ 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 ")) +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 + -- create table only if not used by raid and no partitions on disk + 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) or (disk_info.p_table:match("LOOP") and not disk_info.partitions[1].inuse)) then self:value(disk_info.p_table, disk_info.p_table) self:value("GPT", "GPT") self:value("MBR", "MBR") @@ -100,7 +96,7 @@ 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!" + m.errmessage = p.name .. translate("is in use! please unmount it first!") return end end @@ -160,7 +156,9 @@ if not disk_info.p_table:match("Raid") then 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, "used_formated", translate("Used")) + s_partition_table:option(DummyValue, "free_formated", translate("Free Space")) + s_partition_table:option(DummyValue, "usage", translate("Usage")) 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 @@ -211,18 +209,21 @@ if not disk_info.p_table:match("Raid") then 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!" + m.errmessage = translate("Partition NOT found!") return end local fs = disk_info.partitions[section]._fs if not format_cmd[fs] then - m.errmessage = "Filesystem NOT support!" + m.errmessage = translate("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)) + local res = luci.util.exec(cmd .. " 2>&1") + if res and res:lower():match("error+") then + m.errmessage = luci.util.pcdata(res) + else + luci.http.redirect(luci.dispatcher.build_url("admin/system/diskman/partition/" .. dev)) + end end local btn_action = s_partition_table:option(Button, "_action") @@ -250,7 +251,6 @@ if not disk_info.p_table:match("Raid") then 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 @@ -267,7 +267,7 @@ if not disk_info.p_table:match("Raid") then start_sec = start_sec .. "s" end else - m.errmessage = "Invalid Start Sector!" + m.errmessage = translate("Invalid Start Sector!") return end -- support +size format for End sector @@ -286,7 +286,7 @@ if not disk_info.p_table:match("Raid") then elseif tonumber(end_sec) then end_sec = end_sec .. "s" else - m.errmessage = "Invalid End Sector!" + m.errmessage = translate("Invalid End Sector!") return end local part_type = "primary" @@ -305,9 +305,9 @@ if not disk_info.p_table:match("Raid") then -- 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 + local res = luci.util.exec(cmd .. " 2>&1") + if res and res:lower():match("error+") then + m.errmessage = luci.util.pcdata(res) else luci.http.redirect(luci.dispatcher.build_url("admin/system/diskman/partition/" .. dev)) end @@ -315,13 +315,13 @@ if not disk_info.p_table:match("Raid") then -- remove partition local number = tostring(disk_info.partitions[section].number) if (not number) or (number == "") then - m.errmessage = "Partition not exists!" + m.errmessage = translate("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 + local res = luci.util.exec(cmd .. " 2>&1") + if res and res:lower():match("error+") then + m.errmessage = luci.util.pcdata(res) else luci.http.redirect(luci.dispatcher.build_url("admin/system/diskman/partition/" .. dev)) end diff --git a/package/ctcgfw/luci-app-diskman/luasrc/model/diskman.lua b/package/ctcgfw/luci-app-diskman/luasrc/model/diskman.lua index ac979849d3..71c567354e 100644 --- a/package/ctcgfw/luci-app-diskman/luasrc/model/diskman.lua +++ b/package/ctcgfw/luci-app-diskman/luasrc/model/diskman.lua @@ -1,17 +1,12 @@ --[[ 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 CMD = {"parted", "mdadm", "blkid", "smartctl", "df", "sgdisk", "btrfs", "mergerfs", "snapraid"} local d = {command ={}} for _, cmd in ipairs(CMD) do @@ -19,6 +14,9 @@ for _, cmd in ipairs(CMD) do d.command[cmd] = command:match("^.+"..cmd) or nil end +d.command.mount = nixio.fs.access("/usr/bin/mount") and "/usr/bin/mount" or "/bin/mount" +d.command.umount = nixio.fs.access("/usr/bin/umount") and "/usr/bin/umount" or "/bin/umount" + 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 "" @@ -142,11 +140,16 @@ local get_mount_point = function(partition) end -local get_partition_useage = function(partition) +-- return used, free, usage +local get_partition_usage = 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 + local used, free, usage = df:match("\n/dev/" .. partition .. "%s+%d+%s+(%d+)%s+(%d+)%s+(%d+)%%%s-") + + usage = usage and (usage .. "%") or "-" + used = used and (tonumber(used) * 1024) or 0 + free = free and (tonumber(free) * 1024) or 0 + + return used, free, usage end local get_parted_info = function(device) @@ -195,7 +198,15 @@ local get_parted_info = function(device) 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 partition_temp["mount_point"]~="-" then + partition_temp["used"], partition_temp["free"], partition_temp["usage"] = get_partition_usage(partition_temp["name"]) + partition_temp["used_formated"] = partition_temp["used"] and byte_format(partition_temp["used"]) or "-" + partition_temp["free_formated"] = partition_temp["free"] and byte_format(partition_temp["free"]) or "-" + else + partition_temp["used"], partition_temp["free"], partition_temp["usage"] = 0,0,"-" + partition_temp["used_formated"] = "-" + partition_temp["free_formated"] = "-" + end -- 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 @@ -288,8 +299,8 @@ d.get_disk_info = function(device, wakeup) { 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 }, + 1 = { number, name, sec_start, sec_end, size, size_mounted, fs, tag_name, type, flags, mount_point, usage, used, free, used_formated, free_formated}, + 2 = { number, name, sec_start, sec_end, size, size_mounted, fs, tag_name, type, flags, mount_point, usage, used, free, used_formated, free_formated}, ... } --raid devices only @@ -537,4 +548,178 @@ d.gen_mdadm_config = function() luci.util.exec("/etc/init.d/mdadm enable") end +-- list btrfs filesystem device +-- {uuid={uuid, label, members, size, used}...} +d.list_btrfs_devices = function() + local btrfs_device = {} + if not d.command.btrfs then return btrfs_device end + local line, _uuid + for _, line in ipairs(luci.util.execl(d.command.btrfs .. " filesystem show -d --raw")) + do + local label, uuid = line:match("^Label:%s+([^%s]+)%s+uuid:%s+([^%s]+)") + if label and uuid then + _uuid = uuid + local _label = label:match("^'([^']+)'") + btrfs_device[_uuid] = {label = _label or label, uuid = uuid} + -- table.insert(btrfs_device, {label = label, uuid = uuid}) + end + local used = line:match("Total devices[%w%s]+used%s+(%d+)$") + if used then + btrfs_device[_uuid]["used"] = tonumber(used) + btrfs_device[_uuid]["used_formated"] = byte_format(tonumber(used)) + end + local size, device = line:match("devid[%w.%s]+size%s+(%d+)[%w.%s]+path%s+([^%s]+)$") + if size and device then + btrfs_device[_uuid]["size"] = btrfs_device[_uuid]["size"] and btrfs_device[_uuid]["size"] + tonumber(size) or tonumber(size) + btrfs_device[_uuid]["size_formated"] = byte_format(btrfs_device[_uuid]["size"]) + btrfs_device[_uuid]["members"] = btrfs_device[_uuid]["members"] and btrfs_device[_uuid]["members"]..", "..device or device + end + end + return btrfs_device +end + +d.create_btrfs = function(blabel, blevel, bmembers) + -- mkfs.btrfs -L label -d blevel /dev/sda /dev/sdb + if not d.command.btrfs or type(bmembers) ~= "table" or next(bmembers) == nil then return "ERR no btrfs support or no members" end + local label = blabel and " -L " .. blabel or "" + local cmd = "mkfs.btrfs -f " .. label .. " -d " .. blevel .. " " .. table.concat(bmembers, " ") + return luci.util.exec(cmd) +end + +-- get btrfs info +-- {uuid, label, members, data_raid_level,metadata_raid_lavel, size, used, size_formated, used_formated, free, free_formated, usage} +d.get_btrfs_info = function(m_point) + local btrfs_info = {} + if not m_point or not d.command.btrfs then return btrfs_info end + local cmd = d.command.btrfs .. " filesystem show --raw " .. m_point + local _, line, uuid, _label, members + for _, line in ipairs(luci.util.execl(cmd)) do + if not uuid and not _label then + _label, uuid = line:match("^Label:%s+([^%s]+)%s+uuid:%s+([^s]+)") + else + local mb = line:match("%s+devid.+path%s+([^%s]+)") + if mb then + members = members and (members .. ", ".. mb) or mb + end + end + end + + if not _label or not uuid then return btrfs_info end + local label = _label:match("^'([^']+)'") + cmd = d.command.btrfs .. " filesystem usage -b " .. m_point + local used, free, data_raid_level, metadata_raid_lavel + for _, line in ipairs(luci.util.execl(cmd)) do + if not used then + used = line:match("^%s+Used:%s+(%d+)") + elseif not free then + free = line:match("^%s+Free %(estimated%):%s+(%d+)") + elseif not data_raid_level then + data_raid_level = line:match("^Data,%s-(%w+)") + elseif not metadata_raid_lavel then + metadata_raid_lavel = line:match("^Metadata,%s-(%w+)") + end + end + if used and free and data_raid_level and metadata_raid_lavel then + used = tonumber(used) + free = tonumber(free) + btrfs_info = { + uuid = uuid, + label = label, + data_raid_level = data_raid_level, + metadata_raid_lavel = metadata_raid_lavel, + used = used, + free = free, + size = used + free, + size_formated = byte_format(used + free), + used_formated = byte_format(used), + free_formated = byte_format(free), + members = members, + usage = string.format("%.2f",(used / (free+used) * 100)) .. "%" + } + end + return btrfs_info +end + +-- get btrfs subvolume +-- {id={id, gen, top_level, path, snapshots, otime, default_subvolume}...} +d.get_btrfs_subv = function(m_point, snapshot) +local subvolume = {} +if not m_point or not d.command.btrfs then return subvolume end + +-- get default subvolume +local cmd = d.command.btrfs .. " subvolume get-default " .. m_point +local res = luci.util.exec(cmd) +local default_subvolume_id = res:match("^ID%s+([^%s]+)") + +-- get the root subvolume +if not snapshot then + local _, line, section_snap, _uuid, _otime, _id, _snap + cmd = d.command.btrfs .. " subvolume show ".. m_point + for _, line in ipairs(luci.util.execl(cmd)) do + if not section_snap then + if not _uuid then + _uuid = line:match("^%s-UUID:%s+([^%s]+)") + elseif not _otime then + _otime = line:match("^%s+Creation time:%s+(.+)") + elseif not _id then + _id = line:match("^%s+Subvolume ID:%s+([^%s]+)") + elseif line:match("^%s+(Snapshot%(s%):)") then + section_snap = true + end + else + local snapshot = line:match("^%s+(.+)") + if snapshot then + _snap = _snap and (_snap ..", /".. snapshot) or ("/"..snapshot) + end + end + end + if _uuid and _otime and _id then + subvolume["0".._id] = {id = _id , uuid = _uuid, otime = _otime, snapshots = _snap, path = "/"} + if default_subvolume_id == _id then + subvolume["0".._id].default_subvolume = 1 + end + end +end + +-- get subvolume of btrfs +cmd = d.command.btrfs .. " subvolume list -gcu" .. (snapshot and "s " or " ") .. m_point +for _, line in ipairs(luci.util.execl(cmd)) do + -- ID 259 gen 11 top level 258 uuid 26ae0c59-199a-cc4d-bd58-644eb4f65d33 path 1a/2b' + local id, gen, top_level, uuid, path, otime, otime2 + if snapshot then + id, gen, top_level, otime, otime2, uuid, path = line:match("^ID%s+([^%s]+)%s+gen%s+([^%s]+)%s+cgen.-top level%s+([^%s]+)%s+otime%s+([^%s]+)%s+([^%s]+)%s+uuid%s+([^%s]+)%s+path%s+([^%s]+)%s-$") + else + id, gen, top_level, uuid, path = line:match("^ID%s+([^%s]+)%s+gen%s+([^%s]+)%s+cgen.-top level%s+([^%s]+)%s+uuid%s+([^%s]+)%s+path%s+([^%s]+)%s-$") + end + if id and gen and top_level and uuid and path then + subvolume[id] = {id = id, gen = gen, top_level = top_level, otime = (otime and otime or "") .." ".. (otime2 and otime2 or ""), uuid = uuid, path = '/'.. path} + if not snapshot then + -- use btrfs subv show to get snapshots + local show_cmd = d.command.btrfs .. " subvolume show "..m_point.."/"..path + local __, line_show, section_snap + for __, line_show in ipairs(luci.util.execl(show_cmd)) do + if not section_snap then + local create_time = line_show:match("^%s+Creation time:%s+(.+)") + if create_time then + subvolume[id]["otime"] = create_time + elseif line_show:match("^%s+(Snapshot%(s%):)") then + section_snap = "true" + end + else + local snapshot = line_show:match("^%s+(.+)") + subvolume[id]["snapshots"] = subvolume[id]["snapshots"] and (subvolume[id]["snapshots"] .. ", /".. snapshot) or ("/"..snapshot) + end + end + end + end +end +if subvolume[default_subvolume_id] then + subvolume[default_subvolume_id].default_subvolume = 1 +end +-- if m_point == "/tmp/.btrfs_tmp" then +-- luci.util.exec("umount " .. m_point) +-- end +return subvolume +end + return d diff --git a/package/ctcgfw/luci-app-diskman/po/pl/diskman.po b/package/ctcgfw/luci-app-diskman/po/pl/diskman.po index 53c33e8d66..7f6e6cac60 100644 --- a/package/ctcgfw/luci-app-diskman/po/pl/diskman.po +++ b/package/ctcgfw/luci-app-diskman/po/pl/diskman.po @@ -61,7 +61,7 @@ msgstr "Sektor początkowy" msgid "End Sector" msgstr "Sektor końcowy" -msgid "Useage" +msgid "Usage" msgstr "Użycie" msgid "Model" @@ -126,3 +126,66 @@ 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}" + +msgid "Multiple Devices Btrfs Creation" +msgstr "Kreator urządzeń Btrfs" + +msgid "Label" +msgstr "Etykieta" + +msgid "Btrfs Label" +msgstr "Etykieta Btrfs" + +msgid "Btrfs Raid Level" +msgstr "Poziom Raid Btrfs" + +msgid "Btrfs Member" +msgstr "Członek Btrfs" + +msgid "Create Btrfs" +msgstr "Utwórz Btrfs" + +msgid "New Snapshot" +msgstr "Nowy obraz" + +msgid "SubVolumes" +msgstr "SubVolumes" + +msgid "Top Level" +msgstr "Top Level" + +msgid "Manage Btrfs" +msgstr "Zarządzaj Btrfs" + +msgid "Otime" +msgstr "Otime" + +msgid "Snapshots" +msgstr "Obrazy" + +msgid "Set Default" +msgstr "Ustaw domyślnie" + +msgid "Source Path" +msgstr "Ścieżka źródłowa" + +msgid "Readonly" +msgstr "Tylko do odczytu" + +msgid "Delete" +msgstr "Usuń" + +msgid "Create" +msgstr "Utwórz" + +msgid "Destination Path (optional)" +msgstr "Ścieżka docelowa (opcjonalnie)" + +msgid "Metadata" +msgstr "Metadata" + +msgid "Data" +msgstr "Data" + +msgid "Btrfs Info" +msgstr "Informacja o Btrfs" diff --git a/package/ctcgfw/luci-app-diskman/po/zh-cn/diskman.po b/package/ctcgfw/luci-app-diskman/po/zh-cn/diskman.po index 6084864ced..b385e68aae 100644 --- a/package/ctcgfw/luci-app-diskman/po/zh-cn/diskman.po +++ b/package/ctcgfw/luci-app-diskman/po/zh-cn/diskman.po @@ -2,7 +2,7 @@ msgid "" msgstr "Content-Type: text/plain; charset=UTF-8\n" msgid "DiskMan" -msgstr "DiskMan磁盘管理" +msgstr "DiskMan 磁盘管理" msgid "Manage Disks over LuCI." msgstr "通过LuCI管理磁盘" @@ -61,8 +61,14 @@ msgstr "起始扇区" msgid "End Sector" msgstr "中止扇区" -msgid "Useage" -msgstr "使用情况" +msgid "Usage" +msgstr "用量" + +msgid "Used" +msgstr "已使用" + +msgid "Free Space" +msgstr "空闲空间" msgid "Model" msgstr "主机型号" @@ -126,3 +132,96 @@ 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" + +msgid "Multiple Devices Btrfs Creation" +msgstr "Btrfs 阵列创建" + +msgid "Label" +msgstr "卷标" + +msgid "Btrfs Label" +msgstr "Btrfs 卷标" + +msgid "Btrfs Raid Level" +msgstr "Btrfs Raid 级别" + +msgid "Btrfs Member" +msgstr "Btrfs 整列成员" + +msgid "Create Btrfs" +msgstr "创建 Btrfs" + +msgid "New Snapshot" +msgstr "新建快照" + +msgid "SubVolumes" +msgstr "子卷" + +msgid "Top Level" +msgstr "父ID" + +msgid "Manage Btrfs" +msgstr "Btrfs 管理" + +msgid "Otime" +msgstr "创建时间" + +msgid "Snapshots" +msgstr "快照" + +msgid "Set Default" +msgstr "默认子卷" + +msgid "Source Path" +msgstr "源目录" + +msgid "Readonly" +msgstr "只读" + +msgid "Delete" +msgstr "删除" + +msgid "Create" +msgstr "创建" + +msgid "Destination Path (optional)" +msgstr "目标目录(可选)" + +msgid "Metadata" +msgstr "元数据" + +msgid "Data" +msgstr "数据" + +msgid "Btrfs Info" +msgstr "Btrfs 信息" + +msgid "The source path for create the snapshot" +msgstr "创建快照的源数据目录" + +msgid "The path where you want to store the snapshot" +msgstr "存放快照数据目录" + +msgid "Please input Source Path of snapshot, Source Path must start with '/'" +msgstr "请输入快照源路径,源路径必须以'/'开头" + +msgid "Please input Subvolume Path, Subvolume must start with '/'" +msgstr "请输入子卷路径,子卷路径必须以'/'开头" + +msgid "is in use! please unmount it first!" +msgstr "正在被使用!请先卸载!" + +msgid "Partition NOT found!" +msgstr "分区未找到!" + +msgid "Filesystem NOT support!" +msgstr "文件系统不支持!" + +msgid "Invalid Start Sector!" +msgstr "无效的起始扇区!" + +msgid "Invalid End Sector" +msgstr "无效的终止扇区!" + +msgid "Partition not exists!" +msgstr "分区不存在!" \ No newline at end of file diff --git a/package/ctcgfw/luci-app-dockerman/Makefile b/package/ctcgfw/luci-app-dockerman/Makefile index d66f23f6de..a6865a4bcc 100644 --- a/package/ctcgfw/luci-app-dockerman/Makefile +++ b/package/ctcgfw/luci-app-dockerman/Makefile @@ -1,7 +1,7 @@ include $(TOPDIR)/rules.mk PKG_NAME:=luci-app-dockerman -PKG_VERSION:=v0.1.9 +PKG_VERSION:=v0.2 PKG_RELEASE:=beta PKG_MAINTAINER:=lisaac PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME) diff --git a/package/ctcgfw/luci-app-dockerman/luasrc/controller/dockerman.lua b/package/ctcgfw/luci-app-dockerman/luasrc/controller/dockerman.lua index 0886cf92df..01e06a18ac 100644 --- a/package/ctcgfw/luci-app-dockerman/luasrc/controller/dockerman.lua +++ b/package/ctcgfw/luci-app-dockerman/luasrc/controller/dockerman.lua @@ -1,11 +1,6 @@ --[[ 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$ +Copyright 2019 lisaac ]]-- require "luci.util" local docker = require "luci.model.docker" 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 index 6e1f906fa4..7a0d483724 100644 --- a/package/ctcgfw/luci-app-dockerman/luasrc/model/cbi/docker/container.lua +++ b/package/ctcgfw/luci-app-dockerman/luasrc/model/cbi/docker/container.lua @@ -1,11 +1,6 @@ --[[ 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$ +Copyright 2019 lisaac ]]-- require "luci.util" 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 index 6939f05d36..01d1e0e22c 100644 --- a/package/ctcgfw/luci-app-dockerman/luasrc/model/cbi/docker/containers.lua +++ b/package/ctcgfw/luci-app-dockerman/luasrc/model/cbi/docker/containers.lua @@ -1,11 +1,6 @@ --[[ 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$ +Copyright 2019 lisaac ]]-- require "luci.util" @@ -94,7 +89,7 @@ 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 = c_table:option(DummyValue, "_name", translate("Container Name")) container_name.width="20%" container_name.template="docker/cbi/dummyvalue" container_name.href = function (self, section) 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 index 6cbb208589..5400fd6485 100644 --- a/package/ctcgfw/luci-app-dockerman/luasrc/model/cbi/docker/images.lua +++ b/package/ctcgfw/luci-app-dockerman/luasrc/model/cbi/docker/images.lua @@ -1,11 +1,6 @@ --[[ 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$ +Copyright 2019 lisaac ]]-- require "luci.util" 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 index b1e924228e..2bad757b80 100644 --- a/package/ctcgfw/luci-app-dockerman/luasrc/model/cbi/docker/networks.lua +++ b/package/ctcgfw/luci-app-dockerman/luasrc/model/cbi/docker/networks.lua @@ -1,11 +1,6 @@ --[[ 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$ +Copyright 2019 lisaac ]]-- require "luci.util" @@ -62,7 +57,7 @@ network_selecter.render = function(self, section, scope) Flag.render(self, section, scope) end -network_name = network_table:option(DummyValue, "_name", translate("Name")) +network_name = network_table:option(DummyValue, "_name", translate("Network 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")) 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 index dbe5c6392b..cb499914b4 100644 --- a/package/ctcgfw/luci-app-dockerman/luasrc/model/cbi/docker/newcontainer.lua +++ b/package/ctcgfw/luci-app-dockerman/luasrc/model/cbi/docker/newcontainer.lua @@ -1,11 +1,6 @@ --[[ 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$ +Copyright 2019 lisaac ]]-- require "luci.util" @@ -55,6 +50,8 @@ if cmd_line and cmd_line:match("^docker.+") then key = "port" elseif key == "e" then key = "env" + elseif key == "dns" then + key = "dns" elseif key == "net" then key = "network" elseif key == "cpu-shares" then @@ -69,7 +66,7 @@ if cmd_line and cmd_line:match("^docker.+") then 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 key == "mount" or key == "link" or key == "env" or key == "dns" 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 @@ -81,7 +78,7 @@ if cmd_line and cmd_line:match("^docker.+") then 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 key == "mount" or key == "link" or key == "env" or key == "dns" 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 @@ -119,6 +116,7 @@ elseif cmd_line and cmd_line:match("^duplicate/[^/]+$") then 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.dns = create_body.HostConfig.Dns default_config.mount = create_body.HostConfig.Binds if create_body.HostConfig.PortBindings and type(create_body.HostConfig.PortBindings) == "table" then @@ -183,12 +181,6 @@ 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 @@ -198,6 +190,12 @@ for _, v in ipairs (images) do end end +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(Flag, "privileged", translate("Privileged")) d.rmempty = true d.disabled = 0 @@ -222,11 +220,6 @@ 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" @@ -234,19 +227,30 @@ d.rmempty = true d:depends("network", "bridge") d.default = default_config.link or nil -d = s:option(DynamicList, "env", translate("Environmental Variable")) +d = s:option(DynamicList, "dns", translate("Set custom DNS servers")) +d.template = "docker/cbi/xdynlist" +d.placeholder = "8.8.8.8" +d.rmempty = true +d.default = default_config.dns or nil + +d = s:option(Value, "user", translate("User(-u)"), translate("The user that commands are run as inside the container.(format: name|uid[:group|gid])")) +d.placeholder = "1000:1000" +d.rmempty = true +d.default = default_config.user or nil + +d = s:option(DynamicList, "env", translate("Environmental Variable(-e)"), translate("Set environment variables to inside the container")) 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 = s:option(DynamicList, "mount", translate("Bind Mount(-v)"), translate("Bind mount a volume")) 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")) +local d_ports = s:option(DynamicList, "port", translate("Exposed Ports(-p)"), translate("Publish container's port(s) to the host")) d_ports.template = "docker/cbi/xdynlist" d_ports.placeholder = "2200:22/tcp" d_ports.rmempty = true @@ -263,6 +267,20 @@ d.disabled = 0 d.enabled = 1 d.default = default_config.advance or 0 +d = s:option(DynamicList, "device", translate("Device(--device)"), translate("Add host device to the container")) +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(--tmpfs)"), translate("Mount tmpfs directory")) +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 + 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 @@ -270,7 +288,7 @@ 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 = 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) @@ -290,19 +308,6 @@ 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 @@ -325,7 +330,7 @@ end m.handle = function(self, state, data) if state ~= FORM_VALID then return end local tmp - local name = data.name + local name = data.name or ("luci_" .. os.date("%Y%m%d%H%M%S")) 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 @@ -336,6 +341,7 @@ m.handle = function(self, state, data) 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 dns = data.dns local network = data.network local ip = (network ~= "bridge" and network ~= "host" and network ~= "none") and data.ip or nil local mount = data.mount @@ -366,12 +372,13 @@ m.handle = function(self, state, data) if h and c then t['PathOnHost'] = h t['PathInContainer'] = c - t['CgroupPermissions'] = p or nil + t['CgroupPermissions'] = p or "rwm" else local _,_, h, c = v:find("(.-):(.+)") if h and c then t['PathOnHost'] = h t['PathInContainer'] = c + t['CgroupPermissions'] = "rwm" end end if next(t) ~= nil then @@ -425,8 +432,8 @@ m.handle = function(self, state, data) create_body.Image = image create_body.ExposedPorts = (next(exposedports) ~= nil) and exposedports or nil create_body.HostConfig = create_body.HostConfig or {} + create_body.HostConfig.Dns = dns 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 @@ -434,8 +441,14 @@ m.handle = function(self, state, data) create_body.HostConfig.CpuShares = tonumber(cpushares) create_body.HostConfig.NanoCPUs = tonumber(cpus) * 10 ^ 9 create_body.HostConfig.BlkioWeight = tonumber(blkioweight) + if create_body.HostConfig.NetworkMode ~= network then + -- network mode changed, need to clear duplicate config + create_body.NetworkingConfig = nil + end + create_body.HostConfig.NetworkMode = network if ip then if create_body.NetworkingConfig and create_body.NetworkingConfig.EndpointsConfig and type(create_body.NetworkingConfig.EndpointsConfig) == "table" then + -- ip + duplicate config 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 @@ -445,18 +458,16 @@ m.handle = function(self, state, data) break end else + -- ip + no duplicate config create_body.NetworkingConfig = { EndpointsConfig = { [network] = { IPAMConfig = { IPv4Address = ip } } } } end elseif not create_body.NetworkingConfig then + -- no ip + no duplicate config 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 + create_body["HostConfig"]["Tmpfs"] = (next(tmpfs) ~= nil) and tmpfs or nil + create_body["HostConfig"]["Devices"] = (next(device) ~= nil) and device or nil if network == "bridge" and next(link) ~= nil then create_body["HostConfig"]["Links"] = link 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 index 7cd15dbc42..08b0c01fb3 100644 --- a/package/ctcgfw/luci-app-dockerman/luasrc/model/cbi/docker/newnetwork.lua +++ b/package/ctcgfw/luci-app-dockerman/luasrc/model/cbi/docker/newnetwork.lua @@ -1,11 +1,6 @@ --[[ 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$ +Copyright 2019 lisaac ]]-- require "luci.util" 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 index b56fe7dfdf..b24dc004b1 100644 --- a/package/ctcgfw/luci-app-dockerman/luasrc/model/cbi/docker/overview.lua +++ b/package/ctcgfw/luci-app-dockerman/luasrc/model/cbi/docker/overview.lua @@ -1,11 +1,6 @@ --[[ 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$ +Copyright 2019 lisaac ]]-- require "luci.util" @@ -87,7 +82,7 @@ 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 = s:option(Flag, "debug", translate("Enable Debug"), translate("For debug, It shows all docker API actions of luci-app-dockerman 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")) 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 index f5e3281ade..b2d5e52182 100644 --- a/package/ctcgfw/luci-app-dockerman/luasrc/model/cbi/docker/volumes.lua +++ b/package/ctcgfw/luci-app-dockerman/luasrc/model/cbi/docker/volumes.lua @@ -1,11 +1,6 @@ --[[ 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$ +Copyright 2019 lisaac ]]-- require "luci.util" diff --git a/package/ctcgfw/luci-app-dockerman/luasrc/model/docker.lua b/package/ctcgfw/luci-app-dockerman/luasrc/model/docker.lua index e1e3a943db..925cd82cba 100644 --- a/package/ctcgfw/luci-app-dockerman/luasrc/model/docker.lua +++ b/package/ctcgfw/luci-app-dockerman/luasrc/model/docker.lua @@ -1,11 +1,6 @@ --[[ 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$ +Copyright 2019 lisaac ]]-- require "luci.util" @@ -231,4 +226,4 @@ _docker.clear_status=function(self) nixio.fs.remove(self.options.status_path) end -return _docker +return _docker \ 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 index 6147e95290..aba03bab55 100644 --- a/package/ctcgfw/luci-app-dockerman/luasrc/view/docker/logs.htm +++ b/package/ctcgfw/luci-app-dockerman/luasrc/view/docker/logs.htm @@ -1,17 +1,3 @@ -<%# -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 %> diff --git a/package/ctcgfw/luci-app-dockerman/luasrc/view/docker/overview.htm b/package/ctcgfw/luci-app-dockerman/luasrc/view/docker/overview.htm index 8684ca4218..da338280e5 100644 --- a/package/ctcgfw/luci-app-dockerman/luasrc/view/docker/overview.htm +++ b/package/ctcgfw/luci-app-dockerman/luasrc/view/docker/overview.htm @@ -81,6 +81,10 @@ https://github.com/pure-css/pure/blob/master/LICENSE.md .img-con { margin: 1rem; + min-width: 4rem; + max-width: 4rem; + min-height: 4rem; + max-height: 4rem; } .block h4 { @@ -123,7 +127,7 @@ https://github.com/pure-css/pure/blob/master/LICENSE.md
- + Docker icon @@ -145,7 +149,7 @@ https://github.com/pure-css/pure/blob/master/LICENSE.md
- + @@ -169,12 +173,7 @@ https://github.com/pure-css/pure/blob/master/LICENSE.md
- - - - + - - - -
@@ -210,8 +205,7 @@ https://github.com/pure-css/pure/blob/master/LICENSE.md
- + command line:", ""); + let cmd_line = prompt("<%:Plese input command line:%>", ""); if (cmd_line == null || cmd_line == "") { s.innerHTML = "Canceled"; return; @@ -12,12 +12,9 @@ s.innerHTML = "Command line Error"; return; } - let re = /\/admin\/docker\/newcontainer\// - let p = window.location.href - let path = p.split(re) - window.location.href = path[0] + "/admin/docker/newcontainer/" + encodeURI(cmd_line) + window.location.href = "/cgi-bin/luci/admin/docker/newcontainer/" + encodeURI(cmd_line) } - + <%+cbi/valuefooter%> \ 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 index a2bcb293aa..18afb89ca2 100644 --- a/package/ctcgfw/luci-app-dockerman/po/zh-cn/dockerman.po +++ b/package/ctcgfw/luci-app-dockerman/po/zh-cn/dockerman.po @@ -58,8 +58,8 @@ msgstr "重启策略" msgid "Update" msgstr "更新" -msgid "Device" -msgstr "设备" +msgid "Device(--device)" +msgstr "设备(--device)" msgid "Mount/Volume" msgstr "挂载/存储卷" @@ -103,26 +103,20 @@ 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 "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 "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 "Block IO weight (relative weight) accepts a weight value between 10 and 1000." +msgstr "IO 权重 (相对权重) 接受10到1000之间的权重值。" msgid "Container Logs" msgstr "容器日志" @@ -151,8 +145,8 @@ msgstr "解析命令行" msgid "Docker Image" msgstr "Docker 镜像" -msgid "User" -msgstr "用户" +msgid "User(-u)" +msgstr "用户(-u)" msgid "New Container" msgstr "新容器" @@ -167,22 +161,22 @@ msgid "Always pull image first" msgstr "始终先拉取镜像" msgid "Privileged" -msgstr "特权模式(Privileged)" +msgstr "特权模式(--privileged)" msgid "IPv4 Address" msgstr "IPv4 地址" msgid "Links with other containers" -msgstr "与其他容器的链接(Links)" +msgstr "与其他容器的链接(--link)" -msgid "Environmental Variable" -msgstr "环境变量(Env)" +msgid "Environmental Variable(-e)" +msgstr "环境变量(-e)" -msgid "Bind Mount" +msgid "Bind Mount(-v)" msgstr "挂载(-v)" -msgid "Exposed Ports" -msgstr "暴露端口" +msgid "Exposed Ports(-p)" +msgstr "暴露端口(-p)" msgid "Run command" msgstr "运行命令" @@ -190,8 +184,8 @@ msgstr "运行命令" msgid "Advance" msgstr "高级" -msgid "Mount tmpfs filesystems" -msgstr "挂载tmpfs文件系统" +msgid "Mount tmpfs directory" +msgstr "挂载tmpfs到容器内部目录" msgid "New Network" msgstr "新网络" @@ -259,8 +253,8 @@ 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 "For debug, It shows all docker API actions of luci-app-dockermab in Debug Tempfile Path" +msgstr "用于调试,它在调试临时文件路径中显示 luci-app-dockermab 的所有docker API操作" msgid "Debug Tempfile Path" msgstr "调试临时文件路径" @@ -296,4 +290,37 @@ msgid "Pull Image" msgstr "拉取镜像" msgid "Pull" -msgstr "拉取" \ No newline at end of file +msgstr "拉取" + +msgid "Command line" +msgstr "输入命令行" + +msgid "Plese input command line:" +msgstr "请输入 docker run/create ... 命令行:" + +msgid "Network Name" +msgstr "网络名" + +msgid "Set custom DNS servers" +msgstr "自定义 DNS 服务器" + +msgid "The user that commands are run as inside the container.(format: name|uid[:group|gid])" +msgstr "容器内部执行命令的用户(组), 格式: UID:GID" + +msgid "Set environment variables to inside the container" +msgstr "容器内部环境变量" + +msgid "Bind mount a volume" +msgstr "绑定挂载" + +msgid "Publish container's port(s) to the host" +msgstr "将容器的端口发布到宿主" + +msgid "Add host device to the container" +msgstr "添加宿主设备到容器内部" + +msgid "Device" +msgstr "设备" + +msgid "Finish Time" +msgstr "结束时间" diff --git a/package/ctcgfw/luci-app-openclash/Makefile b/package/ctcgfw/luci-app-openclash/Makefile index c09597b7ea..9f7b87c40a 100644 --- a/package/ctcgfw/luci-app-openclash/Makefile +++ b/package/ctcgfw/luci-app-openclash/Makefile @@ -1,7 +1,7 @@ include $(TOPDIR)/rules.mk PKG_NAME:=luci-app-openclash -PKG_VERSION:=0.36.2 +PKG_VERSION:=0.36.4 PKG_RELEASE:=beta PKG_MAINTAINER:=vernesong @@ -14,7 +14,7 @@ define Package/$(PKG_NAME) SUBMENU:=3. Applications TITLE:=LuCI support for clash PKGARCH:=all - DEPENDS:=+iptables +dnsmasq-full +coreutils +coreutils-nohup +bash +wget + DEPENDS:=+iptables +dnsmasq-full +coreutils +coreutils-nohup +bash +curl +jsonfilter +ca-certificates MAINTAINER:=vernesong endef @@ -48,6 +48,7 @@ if [ -f "/etc/config/openclash" ]; then cp "/etc/config/openclash_custom_rules.list" "/tmp/openclash_custom_rules.list.bak" >/dev/null 2>&1 cp "/etc/config/openclash_custom_hosts.list" "/tmp/openclash_custom_hosts.list.bak" >/dev/null 2>&1 cp "/etc/config/openclash_custom_fake_black.conf" "/tmp/openclash_custom_fake_black.conf.bak" >/dev/null 2>&1 + cp "/etc/openclash/history" "/tmp/openclash_history.bak" >/dev/null 2>&1 fi if [ -f "/etc/openclash/custom/openclash_custom_rules.list" ]; then cp "/etc/openclash/custom/openclash_custom_rules.list" "/tmp/openclash_custom_rules.list.bak" >/dev/null 2>&1 @@ -76,6 +77,7 @@ if [ -f "/tmp/openclash.bak" ]; then mv "/tmp/openclash_custom_rules.list.bak" "/etc/openclash/custom/openclash_custom_rules.list" >/dev/null 2>&1 mv "/tmp/openclash_custom_hosts.list.bak" "/etc/openclash/custom/openclash_custom_hosts.list" >/dev/null 2>&1 mv "/tmp/openclash_custom_fake_black.conf.bak" "/etc/openclash/custom/openclash_custom_fake_black.conf" >/dev/null 2>&1 + mv "/tmp/openclash_history.bak" "/etc/openclash/history" >/dev/null 2>&1 fi if [ -f "/tmp/config.yaml" ]; then mv "/tmp/config.yaml" "/etc/openclash/config/config.yaml" >/dev/null 2>&1 @@ -113,6 +115,7 @@ fi mv "/etc/openclash/config" "/tmp/openclash_config" >/dev/null 2>&1 mv "/etc/openclash/proxy_provider" "/tmp/openclash_proxy_provider" >/dev/null 2>&1 mv "/etc/openclash/game_rules" "/tmp/openclash_game_rules" >/dev/null 2>&1 + mv "/etc/openclash/history" "/tmp/openclash_history.bak" >/dev/null 2>&1 cp "/etc/config/openclash" "/tmp/openclash.bak" >/dev/null 2>&1 cp "/etc/config/openclash_custom_rules.list" "/tmp/openclash_custom_rules.list.bak" >/dev/null 2>&1 cp "/etc/config/openclash_custom_hosts.list" "/tmp/openclash_custom_hosts.list.bak" >/dev/null 2>&1 @@ -129,6 +132,7 @@ if [ -f "/etc/openclash/clash" ]; then rm -rf /etc/openclash/backup >/dev/null 2>&1 rm -rf /etc/openclash/proxy_provider >/dev/null 2>&1 rm -rf /etc/openclash/game_rules >/dev/null 2>&1 + rm -rf /etc/openclash/history >/dev/null 2>&1 else rm -rf /etc/openclash >/dev/null 2>&1 fi diff --git a/package/ctcgfw/luci-app-openclash/files/etc/init.d/openclash b/package/ctcgfw/luci-app-openclash/files/etc/init.d/openclash index c0a464da6f..5cc9631137 100755 --- a/package/ctcgfw/luci-app-openclash/files/etc/init.d/openclash +++ b/package/ctcgfw/luci-app-openclash/files/etc/init.d/openclash @@ -165,7 +165,7 @@ yml_check() awk '/^proxy-provider:/,/^Proxy Group:/{print}' "$3" | sed '/^Proxy Group:/d' >/tmp/backprovider.yaml 2>/dev/null sed -i '/^Proxy Group:/i\proxy-provider-tag' "$3" 2>/dev/null sed -i '/^proxy-provider:/,/proxy-provider-tag/d' "$3" 2>/dev/null - sed -i '/^Rule:/i\proxy-provider:' "$3" 2>/dev/null + sed -i '/^Proxy:/i\proxy-provider:' "$3" 2>/dev/null sed -i '/^proxy-provider:/d' /tmp/backprovider.yaml 2>/dev/null sed -i '/proxy-provider:/r/tmp/backprovider.yaml' "$3" 2>/dev/null rm -rf /tmp/backprovider.yaml 2>/dev/null @@ -506,11 +506,16 @@ yml_game_rule_get() local section="$1" config_get_bool "enabled" "$section" "enabled" "1" config_get "group" "$section" "group" "" + config_get "config" "$section" "config" "" if [ "$enabled" = "0" ]; then return fi + if [ ! -z "$config" ] && [ "$config" != "$CONFIG_NAME" ] && [ "$config" != "all" ]; then + return + fi + if [ -z "$group" ]; then return fi @@ -523,18 +528,21 @@ yml_game_group_get() local section="$1" config_get_bool "enabled" "$section" "enabled" "1" config_get "group" "$section" "group" "" + config_get "config" "$section" "config" "" if [ "$enabled" = "0" ]; then return fi + if [ ! -z "$config" ] && [ "$config" != "$CONFIG_NAME" ] && [ "$config" != "all" ]; then + return + fi + if [ -z "$group" ]; then return fi - if [ -z "$(grep "^ \{0,\}- name: $group" "$GROUP_FILE")" ]; then - /usr/share/openclash/yml_groups_set.sh "$group" - fi + /usr/share/openclash/yml_groups_set.sh "$group" } yml_game_custom() @@ -611,6 +619,7 @@ else cp $BACKUP_FILE $CONFIG_FILE fi fi +CONFIG_NAME=$(echo $CONFIG_FILE |awk -F '/' '{print $5}' 2>/dev/null) enable=$(uci get openclash.config.enable 2>/dev/null) LOGTIME=$(date "+%Y-%m-%d %H:%M:%S") @@ -628,6 +637,10 @@ if [ "$enable" -eq 1 ] && [ -f "$CONFIG_FILE" ]; then en_mode_tun="1" en_mode="fake-ip" fi + if [ "$en_mode" = "redir-host-tun" ]; then + en_mode_tun="1" + en_mode="redir-host" + fi if [ "$en_mode" = "redir-host-vpn" ]; then en_mode_tun="2" en_mode="redir-host" @@ -647,6 +660,7 @@ if [ "$enable" -eq 1 ] && [ -f "$CONFIG_FILE" ]; then socks_port=$(uci get openclash.config.socks_port 2>/dev/null) enable_redirect_dns=$(uci get openclash.config.enable_redirect_dns 2>/dev/null) lan_ip=$(uci get network.lan.ipaddr 2>/dev/null |awk -F '/' '{print $1}' 2>/dev/null) + wan_ip4=$(ubus call network.interface.wan status 2>/dev/null | grep \"address\" | grep -oE '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}' 2>/dev/null) lan_ip6=$(uci get network.lan.ip6addr 2>/dev/null) direct_dns=$(uci get openclash.config.direct_dns 2>/dev/null) disable_masq_cache=$(uci get openclash.config.disable_masq_cache 2>/dev/null) @@ -688,13 +702,14 @@ if [ "$enable" -eq 1 ] && [ -f "$CONFIG_FILE" ]; then nohup $CLASH -d "$CLASH_CONFIG" -f "$CONFIG_FILE" >> $LOG_FILE 2>&1 & #检测proxy_provider配置文件状态 + echo "第六步: 等待主程序下载代理集..." >$START_LOG yml_proxy_provider_check "$PROXY_PROVIDER_FILE" rm -rf /tmp/yaml_* 2>/dev/null - echo "第六步: 设置控制面板..." >$START_LOG + echo "第七步: 设置控制面板..." >$START_LOG ln -s /usr/share/openclash/yacd /www/openclash 2>/dev/null - echo "第七步: 设置 OpenClash 防火墙规则..." >$START_LOG + echo "第八步: 设置 OpenClash 防火墙规则..." >$START_LOG if [ -z "$(uci get firewall.openclash 2>/dev/null)" ] || [ -z "$(uci get ucitrack.@openclash[-1].init 2>/dev/null)" ]; then uci delete ucitrack.@openclash[-1] >/dev/null 2>&1 uci add ucitrack openclash >/dev/null 2>&1 @@ -717,13 +732,8 @@ mkdir -p /var/etc cat > "/var/etc/openclash.include" <<-EOF /etc/init.d/openclash restart EOF - if [ "$en_mode_tun" != "2" ]; then + if [ -z "$en_mode_tun" ]; then iptables -t nat -N openclash - - if [ "$en_mode_tun" = "1" ]; then - iptables -t nat -A openclash -d 198.18.0.0/16 -j RETURN - fi - iptables -t nat -A openclash -d 0.0.0.0/8 -j RETURN iptables -t nat -A openclash -d 10.0.0.0/8 -j RETURN iptables -t nat -A openclash -d 127.0.0.0/8 -j RETURN @@ -732,29 +742,21 @@ EOF iptables -t nat -A openclash -d 192.168.0.0/16 -j RETURN iptables -t nat -A openclash -d 224.0.0.0/4 -j RETURN iptables -t nat -A openclash -d 240.0.0.0/4 -j RETURN + if [ ! -z "$wan_ip4" ]; then + iptables -t nat -A openclash -d "$wan_ip4" -j RETURN + fi iptables -t nat -A openclash -p tcp -j REDIRECT --to-ports "$proxy_port" - - if [ -z "$(iptables -nvL zone_lan_prerouting -t nat)" ]; then - iptables -t nat -A PREROUTING -p tcp -j openclash - else - iptables -t nat -A zone_lan_prerouting -p tcp -j openclash - fi + iptables -t nat -A PREROUTING -p tcp -j openclash + iptables -t nat -A OUTPUT -p tcp -d 198.18.0.0/16 -j REDIRECT --to-ports "$proxy_port" - if [ "$en_mode_tun" != 1 ]; then - iptables -t nat -A OUTPUT -p tcp -d 198.18.0.0/16 -j REDIRECT --to-ports "$proxy_port" - fi if [ "$ipv6_enable" -eq 1 ]; then ip6tables -t nat -N openclash ip6tables -t nat -A openclash -p tcp -j REDIRECT --to-ports "$proxy_port" - if [ -z "$(ip6tables -nvL zone_lan_prerouting -t nat)" ]; then - ip6tables -t nat -A PREROUTING -p tcp -j openclash - else - ip6tables -t nat -A zone_lan_prerouting -p tcp -j openclash - fi + ip6tables -t nat -A PREROUTING -p tcp -j openclash fi else - #TUN2模式 + #TUN模式 ipset create localnetwork hash:net ipset add localnetwork 127.0.0.0/8 ipset add localnetwork 10.0.0.0/8 @@ -763,10 +765,15 @@ EOF ipset add localnetwork 224.0.0.0/4 ipset add localnetwork 240.0.0.0/4 ipset add localnetwork 172.16.0.0/12 + ipset add localnetwork "$wan_ip4" #启动TUN + if [ "$en_mode_tun" = "2" ]; then ip tuntap add user root mode tun clash0 ip link set clash0 up ip route replace default dev clash0 table "$PROXY_ROUTE_TABLE" + elif [ "$en_mode_tun" = "1" ]; then + ip route replace default dev utun table "$PROXY_ROUTE_TABLE" + fi ip rule add fwmark "$PROXY_FWMARK" table "$PROXY_ROUTE_TABLE" #设置防火墙 iptables -t mangle -N openclash @@ -776,10 +783,12 @@ EOF iptables -t mangle -I OUTPUT -j openclash iptables -t mangle -I PREROUTING -m set ! --match-set localnetwork dst -j MARK --set-mark "$PROXY_FWMARK" #ipv6 - ip6tables -t mangle -I PREROUTING -j MARK --set-mark "$PROXY_FWMARK" + if [ "$ipv6_enable" -eq 1 ]; then + ip6tables -t mangle -I PREROUTING -j MARK --set-mark "$PROXY_FWMARK" + fi fi - echo "第八步: 重启 Dnsmasq 程序..." >$START_LOG + echo "第九步: 重启 Dnsmasq 程序..." >$START_LOG if [ "$(iptables -t nat -nL PREROUTING --line-number |grep dpt:53 |wc -l)" -gt 2 ]; then echo "发现53端口被劫持,如连接异常请将OpenClash设置为劫持53端口程序的上游DNS服务器!" >$START_LOG echo "${LOGTIME} Warring: OpenClash May Can Not Take Over DNS, Please Use OpenClash for Upstream DNS Resolve Server" >> $LOG_FILE @@ -789,15 +798,17 @@ EOF fake_block "$en_mode" "$direct_dns" /etc/init.d/dnsmasq restart >/dev/null 2>&1 if pidof clash >/dev/null; then - echo "第九步: 添加 OpenClash 计划任务,启动进程守护程序..." >$START_LOG + echo "第十步: 添加 OpenClash 计划任务,启动进程守护程序..." >$START_LOG add_cron if [ -z "$(uci get dhcp.lan.dhcpv6 2>/dev/null)" ]; then echo "OpenClash 启动成功,请等待服务器上线!" >$START_LOG echo "${LOGTIME} OpenClash Start Successful" >> $LOG_FILE + /usr/share/openclash/openclash_history_set.sh sleep 5 else echo "OpenClash 启动成功,检测到您启用了IPV6的DHCP服务,可能会造成连接异常!" >$START_LOG echo "${LOGTIME} OpenClash Start Successful, Please Note That Network May Abnormal With IPV6's DHCP Server" >> $LOG_FILE + /usr/share/openclash/openclash_history_set.sh sleep 10 fi echo "" >$START_LOG @@ -817,12 +828,14 @@ EOF if [ -z "$(uci get dhcp.lan.dhcpv6 2>/dev/null)" ]; then echo "OpenClash 使用备份规则启动成功,请更新、检查变动的规则后重试!" >$START_LOG echo "${LOGTIME} OpenClash Start Successful With Backup Rules Config, Please Check Or Update Other Rules And Retry" >> $LOG_FILE + /usr/share/openclash/openclash_history_set.sh sleep 10 else echo "OpenClash 使用备份规则启动成功,请更新、检查变动的规则后重试!" >$START_LOG echo "${LOGTIME} OpenClash Start Successful With Backup Rules Config, Please Check Or Update Other Rules And Retry" >> $LOG_FILE - sleep 10 - echo "OpenClash 启动成功,检测到您启用了IPV6的DHCP服务,可能会造成连接异常!" >$START_LOG + /usr/share/openclash/openclash_history_set.sh + sleep 5 + echo "检测到您启用了IPV6的DHCP服务,可能会造成连接异常!" >$START_LOG echo "${LOGTIME} OpenClash Start Successful, Please Note That Network May Abnormal With IPV6's DHCP Server" >> $LOG_FILE sleep 10 fi @@ -871,12 +884,14 @@ fi stop() { echo "OpenClash 开始关闭..." >$START_LOG - echo "第一步: 删除 OpenClash 防火墙规则..." >$START_LOG + echo "第一步: 备份当前节点状态..." >$START_LOG + /usr/share/openclash/openclash_history_get.sh + + echo "第二步: 删除 OpenClash 防火墙规则..." >$START_LOG rm -rf /var/etc/openclash.include 2>/dev/null #ipv4 iptables -t nat -F openclash >/dev/null 2>&1 iptables -t nat -D PREROUTING -p tcp -j openclash >/dev/null 2>&1 - iptables -t nat -D zone_lan_prerouting -p tcp -j openclash >/dev/null 2>&1 iptables -t nat -X openclash >/dev/null 2>&1 out_lines=$(iptables -nvL OUTPUT -t nat |sed 1,2d |sed -n '/198.18.0.0\/16/=' 2>/dev/null |sort -rn) @@ -887,13 +902,13 @@ stop() #ipv6 ip6tables -t nat -F openclash >/dev/null 2>&1 ip6tables -t nat -D PREROUTING -p tcp -j openclash >/dev/null 2>&1 - ip6tables -t nat -D zone_lan_prerouting -p tcp -j openclash >/dev/null 2>&1 ip6tables -t nat -X openclash >/dev/null 2>&1 #TUN ip link set dev clash0 down >/dev/null 2>&1 ip tuntap del clash0 mode tun >/dev/null 2>&1 ip route del default dev clash0 table "$PROXY_ROUTE_TABLE" >/dev/null 2>&1 + ip route del default dev utun table "$PROXY_ROUTE_TABLE" >/dev/null 2>&1 ip rule del fwmark "$PROXY_FWMARK" table "$PROXY_ROUTE_TABLE" >/dev/null 2>&1 iptables -t mangle -D OUTPUT -j openclash >/dev/null 2>&1 @@ -903,23 +918,23 @@ stop() iptables -t mangle -X openclash >/dev/null 2>&1 ipset destroy localnetwork >/dev/null 2>&1 - echo "第二步: 关闭 OpenClash 守护程序..." >$START_LOG + echo "第三步: 关闭 OpenClash 守护程序..." >$START_LOG watchdog_pids=$(ps |grep openclash_watchdog.sh |grep -v grep |awk '{print $1}' 2>/dev/null) for watchdog_pid in $watchdog_pids; do kill -9 "$watchdog_pid" >/dev/null 2>&1 done - echo "第三步: 关闭 Clash 主程序..." >$START_LOG + echo "第四步: 关闭 Clash 主程序..." >$START_LOG kill -9 "$(pidof clash|sed 's/$//g')" 2>/dev/null - echo "第四步: 重启 Dnsmasq 程序..." >$START_LOG + echo "第五步: 重启 Dnsmasq 程序..." >$START_LOG dns_port=$(uci get openclash.config.dns_port 2>/dev/null) redirect_dns=$(uci get openclash.config.redirect_dns 2>/dev/null) masq_cache=$(uci get openclash.config.masq_cache 2>/dev/null) revert_dns "$redirect_dns" "$masq_cache" "$dns_port" /etc/init.d/dnsmasq restart >/dev/null 2>&1 - echo "第五步:删除 OpenClash 残留文件..." >$START_LOG + echo "第六步:删除 OpenClash 残留文件..." >$START_LOG enable=$(uci get openclash.config.enable 2>/dev/null) if [ "$enable" -eq 0 ]; then rm -rf $LOG_FILE 2>/dev/null @@ -943,4 +958,4 @@ restart() { stop start -} +} \ No newline at end of file diff --git a/package/ctcgfw/luci-app-openclash/files/etc/openclash/ConnersHua.yaml b/package/ctcgfw/luci-app-openclash/files/etc/openclash/ConnersHua.yaml index 73c14f42ec..868cbaad7f 100644 --- a/package/ctcgfw/luci-app-openclash/files/etc/openclash/ConnersHua.yaml +++ b/package/ctcgfw/luci-app-openclash/files/etc/openclash/ConnersHua.yaml @@ -460,8 +460,7 @@ Rule: # (HKMTMedia) # > 愛奇藝台灣站 -- DOMAIN-SUFFIX,iqiyi.com,HKMTMedia -- DOMAIN-SUFFIX,71.am,HKMTMedia +- DOMAIN,cache.video.iqiyi.com,HKMTMedia # > bilibili - DOMAIN-SUFFIX,bilibili.com,HKMTMedia - DOMAIN,upos-hz-mirrorakam.akamaized.net,HKMTMedia diff --git a/package/ctcgfw/luci-app-openclash/files/etc/openclash/Country.mmdb b/package/ctcgfw/luci-app-openclash/files/etc/openclash/Country.mmdb index 8e1bf2e06c..f09a71189d 100644 Binary files a/package/ctcgfw/luci-app-openclash/files/etc/openclash/Country.mmdb and b/package/ctcgfw/luci-app-openclash/files/etc/openclash/Country.mmdb differ diff --git a/package/ctcgfw/luci-app-openclash/files/etc/openclash/openclash_version b/package/ctcgfw/luci-app-openclash/files/etc/openclash/openclash_version index f36499d105..ce5d4336f0 100644 --- a/package/ctcgfw/luci-app-openclash/files/etc/openclash/openclash_version +++ b/package/ctcgfw/luci-app-openclash/files/etc/openclash/openclash_version @@ -1,2 +1,2 @@ -v0.36.2-beta -data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAXMAAAAqCAMAAAB2kksrAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyNpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNi1jMTQ4IDc5LjE2NDAzNiwgMjAxOS8wOC8xMy0wMTowNjo1NyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIDIxLjAgKFdpbmRvd3MpIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOjg5NDIzMUEwM0I3NTExRUFCQjZGRDQ0QjZERTkyNjYxIiB4bXBNTTpEb2N1bWVudElEPSJ4bXAuZGlkOjg5NDIzMUExM0I3NTExRUFCQjZGRDQ0QjZERTkyNjYxIj4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6ODk0MjMxOUUzQjc1MTFFQUJCNkZENDRCNkRFOTI2NjEiIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6ODk0MjMxOUYzQjc1MTFFQUJCNkZENDRCNkRFOTI2NjEiLz4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz471t8EAAADAFBMVEVtbW09PT2Gv9+EvN1Jns6TvdXB1eCEhIS6urokhLs6lspYpdI1dZuizOWx0eNFmsoGVYLR5vIHX5EJeLiCgoKenp53t9va2tqlpaXR4uxTiqplnr54eHjf39/n5+c/Pz/GxsahoaEkapLOzs5jlLFpaWkKaqEJca2RkZFxcXG/v79GRkasrKy1tbWTxeEHXI4KdrSDs84JZZlmrdbKysoGbamy1eoYYo1iYmIWaJcJYZQEXI4FYJQEU4CStchLS0tDQ0Pg4OAEWYkXgb6Li4tkq9OjwNGyytkFcK2ixdl2dnbAwMCcnJwrjsZGi7Lw9fcGdLLCwsJBQUFCQkImcZxFkbyDqsG2trZFgKKXl5eyzdzQ3+gFaaIJWIWEtNDS0tLQ0NA2kcZlZWUnicGNjY2jyN4ahMEGZJochsNHnM0FcrBzobsHZ50HVoQHbKWDrcVyn7iBudmjzuavr69gYGCDq8IZdaqUlJTB2ed0dHQEYpiJweIwk8sUXol0sdVGg6Y1h7UFZZsHV4YIcrARgsMCc7QBcrNRUVFUVFRVVVVSUlILfL1WVlYKe7wFdrcHeLkDdLUDdbUOgMADdLQEdrYOf8AEdbYSg8NXV1cSg8QShMQThMUAcrIOf78Gd7gNfr8Nfr4Mfb4Mfb0IebkJeroJe7sJers6OjqqqqrU1NTV1dWrq6tISEipqak7OzuAgIB+fn7w9/tJSUnC3u6BgYGCqcDq6upMTEzz8/ODvNz19fX09PTh7/fv9Pd/f3/B3e0HcKuFvt6ErMLg6u+JiYnA1N/B3e7o6OjB3u4IaJ+hv9AFZ5/g6vDg7vaEvd10s9jW1tbC3+/D3+8LerkGdbQFZ6CDu9wLdK9Gm8sIWYcZg8AFa6YEVYPv9voKebiDr8gLb6hVos8nbZQJcKsEV4eErcVUk7eyz+DP5PGSudBGiK4GW4tkmbfB2+qixNdTU1MPgMEQgcJZWVlaWlpfX19bW1tcXFxNTU1eXl5PT09QUFBYWFhdXV1OTk7///////948PWPAAABAHRSTlP///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8AU/cHJQAADDZJREFUeNrsVwlUVNcZfoOEUUQRdALRkVFBRR8Yo4K44IBiMLEmSNwRrXpi3EgNxhiNpsG0FRkIbbrRJaYJQbbBMCCLLHHft+ybZE+XmDTTWhsQw0f/e997M+8NYDhN6zkzx+8c7v23+/33fffNew+hvb1u0/CrnoA/uAG2P2Frbxfa47de9Qz83i2wPaBdqBvV4iH4nXtgu03Y5CmSt/zWTfCEMOpbT8FP3ATbhW9vaX6z4UGa/9NdIHzjMbil+c3HP9wFwr89Brc0v/l41l0g/Mtj8Gt3Qaea6yMiIsL/D6exUq9f6XAEvb47a4x6YzfZn+sSvrd73e7rGnx2TW8vLy9v18CcjkUd1z7nBa/n/msIV1wRs7AOHPGLY658T+gj9Bq/Dosd9mxM6A7Fq3i1m82e7wJrXueX8/oaTXSOFEVDb6UsnftenRUF+LpwemnrNPD28n7+huigubEaCCo1GEKplf77ah6BCLWbPRrxjqMFwv+3mv+pC7yGOwbdN+gOvKaJegMpR47cfT/gzX1fG5B45EjiYZciH15kW6PlPIzDXbW7YY5DuK5FTDxqBR2D2VA74Pr3BGmu8UcBSsPFqM3qDoWoE7vZ7IXOMR7nJqampk68H+PVYe+7P01l4XNIZ+5qGxJZWeqITor87sftWlLS9YWucKMch9BBpdoYXVyF2SzqdNnDu6utcYDmeAYMEDrX3BqCobJZgoVtcrGxc8YYF80FbZMYpULBi50jGusDP37n48AjiFaH30lNDRwxYtx7R/Aac9Phk5o6jgIjXIoms6JpUpETpOuLL87x9lWFvBWP5xxBTY0EV83rYDDt4la2mRkl2M+9/SiRx8XxQOn1UpTGlNJjiGVL2QugrpTXATHcLYnhjgQH+y4DqmUB6Y7PI+Fms3x1wnUN+fWh1TzMKEshESfw0OwYuVLgCxeqt26R0RsNstWA3haLDZc/JPuNH8NmUeGdcWPZ9MYXeJCm1cCnk9+wuEIuGvtnVGoTpGvvBv42kPzV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 \ No newline at end of file +v0.36.4-beta +data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAXMAAAAqCAMAAAB2kksrAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyNpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNi1jMTQ4IDc5LjE2NDAzNiwgMjAxOS8wOC8xMy0wMTowNjo1NyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIDIxLjAgKFdpbmRvd3MpIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOjI3QjAxQUIwNDhDNDExRUFBRjA1Rjc0RkJBN0IzQ0IyIiB4bXBNTTpEb2N1bWVudElEPSJ4bXAuZGlkOjI3QjAxQUIxNDhDNDExRUFBRjA1Rjc0RkJBN0IzQ0IyIj4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6MjdCMDFBQUU0OEM0MTFFQUFGMDVGNzRGQkE3QjNDQjIiIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6MjdCMDFBQUY0OEM0MTFFQUFGMDVGNzRGQkE3QjNDQjIiLz4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz6MLmHGAAADAFBMVEUGZZyGv98reqdFgKJtbW0Jca09PT2EhIS6urokhbxilbE6lsoKaqFYpdJTiqqTu9NFmsqCgoKenp7a2tqlpaXR4uxknLt4eHgGXpHR5vLf39/n5+c/Pz8GcKzGxsahoaEla5LOzs5paWmizOV2ttoKdbORkZFxcXE1dJq/v79GRkasrKy1tbUxk8yTxeFmrdaDs87KysoGbamy1upiYmIWaJcFYJRLS0uyytlDQ0MIYpXg4OAEWYmLi4sEU4Bkq9Ox0eOixdh2dnYJX48XgL3AwMCcnJwJZJiiwNEHdLLCwsJBQUFGibDw9feStcgYYo1CQkImcJtFkbwGVYK2trYrjseXl5eDrsayzdwahMEFaaLR3+iDqsGEtNDS0tLB1eDQ0NAGXI5lZWUnicGNjY2jyN4FZZs2kcZHnM2kzuYFcrBzobsHbKUEXI5yn7ivr68JWIVgYGCDq8IZdaqUlJTB2uhJns4chsN0dHQEYphKn8+JweJ0sdU1h7URgsMCc7QBcrNRUVFUVFRVVVVSUlILfL0FdrdWVlYHeLkKe7wEdrYDdbUOgMAEdbYOf8ADdLUDdLQSg8NXV1cSg8QShMQAcrIThMUGd7gOf78Nfr8Nfr4Mfb4Mfb0IebkIeboJe7sJersJero6OjqqqqrU1NTV1dWrq6tISEipqak7Ozvw9/t+fn6AgIDC3u4HVoRJSUmBgYHq6uqEvd3z8/P19fVMTEyEvN3B3u709PTh7/eDvNyFvt5/f3/B3e3v9PcGVYGCqcDg6u+JiYno6OjA1N+ErMLB3e6Fvd4HZ54UXong7vYEVYOhv9ALerng6vDW1tZ0s9gJeLgIWYfC3+8EVYQFZ58GdbRGm8sHVoODu9zD3+8Zg8AFa6ZInc1Inc4IV4SDr8jv9voHV4cLb6gKebiFvd1Vos/B1+MEV4fg7/cFdLOyz+CAudkwk8vP5PFTU1MPgMEQgcJZWVlaWlpfX19bW1tcXFxNTU1eXl5PT09QUFBYWFhdXV1OTk7////////MShwrAAABAHRSTlP///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8AU/cHJQAADE1JREFUeNrsVwlUVNcZHiLMKIjLQByQQUEj6oO6IDogMpqoVcRoXONO0RMMGpUYJZqlrQgCbbrRpiZtXcLuEEA2AYmIG8ElRpMYTTSbWZsmndbagBg++t/73sy8NwOG0+TknJnjd47v/uv33/fd4b2nqqOjatOQm66APzsBfvK0qaND1RG97aZr4E9Oga/9O1RVw1tdBH90DnxtUm1yFclb/+AkeFo1/FtXwc+dBF+rvr2r+Y8NF9L8384C1Tcug7ua//j4l7NA9V+XwV3Nf3w85yxQ/cdl8FtnQaeaa0JDQ0Pcf3hVVms0q62Ou0bTnR6dRtdN9he6hNd9bvd52Qefe9Lbzc3tKfvAos76n7KPusHthf8bqhv2iFhYBY7oxRE3vic0oRqFX4XFVns6xnaH4nW83s1hL3aBJ9/lt/Puk4roIjGKOm9LWRL33RwJvB2jbp3VSUhxS3nxjnDQXFcO+BRotcE0X/N9NQ9FqNzNGIlo69ECIT+s5n/pAm/i3gGzB9yLNxXRFGD5qVMzHwRSuO9lAiJPnYqsd+hnGftoPeq7GnfHHIfqthIR0ah0VzMYtJX9b39PkOYKfzjgLpmLUZnWHQpBLXRz2F87x2icn5ucnDz3QYyWh1NmBiWz8HkkMXepCZGsLLm3ff8iEx5EvV2w3iHSvRyHykGlygh1VJnBIKjVGUO6q62uv+J4+vd371zzwgAMlsx8LGyXinWdM0bYae6uHBJhqbDgb51jHNZP/XjYx1NPYZw8PCw5eWrv3jPeOIU3mZuE+OTkGRTobde+1B+e8ai3i9azyKIUL1koxeLVy6pTUhQ1Iuw1r4JWv4NbGQZm5OMg9w4iX7oujgYKbhegIKKAHkMsW8BeAFUFvA6I4G5+BHdEWNl3aFEuCUi/+GwSbjrLl8fcVpDfHlzOw4yyACJxDA9Nj5Aq3XnjQvnW0yV4o06y6uCdnm7C7E/Ifq0HTOkyeMxg0fTX+uIRWpYCQTNeS+8EJZj5weeot4uSrt51/G0g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 \ No newline at end of file diff --git a/package/ctcgfw/luci-app-openclash/files/usr/lib/lua/luci/model/cbi/openclash/game-settings.lua b/package/ctcgfw/luci-app-openclash/files/usr/lib/lua/luci/model/cbi/openclash/game-settings.lua index 3bc2f2a442..bbb7b3ce03 100644 --- a/package/ctcgfw/luci-app-openclash/files/usr/lib/lua/luci/model/cbi/openclash/game-settings.lua +++ b/package/ctcgfw/luci-app-openclash/files/usr/lib/lua/luci/model/cbi/openclash/game-settings.lua @@ -11,7 +11,14 @@ local uci = require "luci.model.uci".cursor() m = Map(openclash, translate("Game Rules and Groups")) m.pageaction = false -m.description=translate("注意事项:
游戏模式为测试功能,不保证可用性。使用的内核由comzyh修改
项目地址:https://github.com/comzyh/clash
使用步骤:
1、在《服务器与策略组管理》页面创建您准备使用的游戏策略组和游戏节点(节点添加时必须选择要加入的策略组),策略组类型建议:FallBack,游戏节点必须支持UDP
2、在此页面的游戏规则列表下载您要使用的游戏规则
3、在此页面上方设置您已下载的游戏规则的对应策略组并保存设置
4、替换内核,下载地址:(https://github.com/vernesong/OpenClash/releases/tag/TUN)
5、在《全局设置》-《常规设置》-《运行模式》中选择游戏模式并启动") +m.description=translate("注意事项:
游戏代理为测试功能,不保证可用性。其中游戏模式使用的内核由comzyh修改 \ +
项目地址:https://github.com/comzyh/clash
使用步骤: \ +
1、在《服务器与策略组管理》页面创建您准备使用的游戏策略组和游戏节点(节点添加时必须选择要加入的策略组),策略组类型建议:FallBack,游戏节点必须支持UDP \ +
2、在此页面的游戏规则列表下载您要使用的游戏规则 \ +
3、在此页面上方设置您已下载的游戏规则的对应策略组并保存设置 \ +
4、替换内核一,下载地址:https://github.com/Dreamacro/clash/releases/tag/TUN \ +
或替换内核二,下载地址:https://github.com/vernesong/OpenClash/releases/tag/TUN \ +
5、在《全局设置》-《常规设置》-《运行模式》中选择TUN模式(内核一)或者游戏模式(内核二)并启动") function IsRuleFile(e) @@ -20,7 +27,21 @@ local e=string.lower(string.sub(e,-6,-1)) return e==".rules" end -SYS.call("awk -F ',' '{print $1}' /etc/openclash/game_rules.list > /tmp/rules_name 2>/dev/null") +function IsYamlFile(e) + e=e or"" + local e=string.lower(string.sub(e,-5,-1)) + return e == ".yaml" +end + +function IsYmlFile(e) + e=e or"" + local e=string.lower(string.sub(e,-4,-1)) + return e == ".yml" +end + +if not NXFS.access("/tmp/rules_name") then + SYS.call("awk -F ',' '{print $1}' /etc/openclash/game_rules.list > /tmp/rules_name 2>/dev/null") +end file = io.open("/tmp/rules_name", "r"); -- [[ Edit Game Rule ]] -- @@ -39,6 +60,21 @@ o.cfgvalue = function(...) return Flag.cfgvalue(...) or "1" end +---- config +o = s:option(ListValue, "config", translate("Config File")) +o:value("all", translate("Use For All Config File")) +local e,a={} +for t,f in ipairs(fs.glob("/etc/openclash/config/*"))do + a=fs.stat(f) + if a then + e[t]={} + e[t].name=fs.basename(f) + if IsYamlFile(e[t].name) or IsYmlFile(e[t].name) then + o:value(e[t].name) + end + end +end + ---- rule name o = s:option(DynamicList, "rule_name", translate("Game Rule's Name")) local e,a={} @@ -69,9 +105,8 @@ o:value("REJECT") o.rmempty = true ---- Rules List -local e={},a,o,t -a=nixio.fs.access("/tmp/rules_name") -if a then +local e={},o,t +if NXFS.access("/tmp/rules_name") then for o in file:lines() do table.insert(e,o) end diff --git a/package/ctcgfw/luci-app-openclash/files/usr/lib/lua/luci/model/cbi/openclash/settings.lua b/package/ctcgfw/luci-app-openclash/files/usr/lib/lua/luci/model/cbi/openclash/settings.lua index 981dd42bf6..ba5b701c4a 100644 --- a/package/ctcgfw/luci-app-openclash/files/usr/lib/lua/luci/model/cbi/openclash/settings.lua +++ b/package/ctcgfw/luci-app-openclash/files/usr/lib/lua/luci/model/cbi/openclash/settings.lua @@ -48,6 +48,7 @@ o = s:taboption("settings", ListValue, "en_mode", font_red..bold_on..translate(" o.description = translate("Select Mode For OpenClash Work, Network Error Try Flush DNS Cache") o:value("redir-host", translate("redir-host")) o:value("fake-ip", translate("fake-ip")) +o:value("redir-host-tun", translate("redir-host(tun mode)")) o:value("fake-ip-tun", translate("fake-ip(tun mode)")) o:value("redir-host-vpn", translate("redir-host-vpn(game mode)")) o:value("fake-ip-vpn", translate("fake-ip-vpn(game mode)")) diff --git a/package/ctcgfw/luci-app-openclash/files/usr/lib/lua/luci/view/openclash/myip.htm b/package/ctcgfw/luci-app-openclash/files/usr/lib/lua/luci/view/openclash/myip.htm index 295aabf388..851fb24987 100644 --- a/package/ctcgfw/luci-app-openclash/files/usr/lib/lua/luci/view/openclash/myip.htm +++ b/package/ctcgfw/luci-app-openclash/files/usr/lib/lua/luci/view/openclash/myip.htm @@ -132,9 +132,6 @@

IP 地址

-

- IP   登录设备: -

IPIP      国内:

@@ -159,9 +156,6 @@

GitHub:

-

- Facebook: -

YouTube:

@@ -180,7 +174,6 @@ window.open(url2); } const $$ = document; - $$.getElementById('ip-webrtc').innerHTML = '查询中...'; $$.getElementById('ip-pcol').innerHTML = '查询中...'; $$.getElementById('ip-ipify').innerHTML = '查询中...'; $$.getElementById('ip-ipipnet').innerHTML = '查询中...'; @@ -220,23 +213,6 @@ //$$.getElementById(elID).innerHTML = `${resp.data.country} ${resp.data.regionName} ${resp.data.city} ${resp.data.isp}`; }) }, - getWebrtcIP: () => { - window.RTCPeerConnection = window.RTCPeerConnection || window.mozRTCPeerConnection || window.webkitRTCPeerConnection; - let pc = new RTCPeerConnection({ iceServers: [] }), - noop = () => { }; - pc.createDataChannel(''); - pc.createOffer(pc.setLocalDescription.bind(pc), noop); - pc.onicecandidate = (ice) => { - if (!ice || !ice.candidate || !ice.candidate.candidate) { - $$.getElementById('ip-webrtc').innerHTML = '没有查询到 IP'; - return; - } - let ip = /([0-9]{1,3}(\.[0-9]{1,3}){3}|[a-f0-9]{1,4}(:[a-f0-9]{1,4}){7})/.exec(ice.candidate.candidate)[1]; - $$.getElementById('ip-webrtc').innerHTML = ip; - IP.parseIPIpip(ip, 'ip-webrtc-cz88'); - pc.onicecandidate = noop; - }; - }, getIpipnetIP: () => { IP.get(`https://myip.ipip.net/?z=${random}`, 'text') .then((resp) => { @@ -267,7 +243,6 @@ $$.getElementById('http-baidu').innerHTML = '检测中...'; $$.getElementById('http-163').innerHTML = '检测中...'; $$.getElementById('http-github').innerHTML = '检测中...'; - $$.getElementById('http-facebook').innerHTML = '检测中...'; $$.getElementById('http-youtube').innerHTML = '检测中...'; let HTTP = { checker: (domain, cbElID) => { @@ -293,7 +268,6 @@ HTTP.checker('www.baidu.com', 'http-baidu'); HTTP.checker('s1.music.126.net/style', 'http-163'); HTTP.checker('github.com', 'http-github'); - HTTP.checker('www.facebook.com', 'http-facebook'); HTTP.checker('www.youtube.com', 'http-youtube'); } }; @@ -301,7 +275,6 @@ HTTP.runcheck(); IP.getIpipnetIP(); IP.getIpifyIP(); - IP.getWebrtcIP(); function getPcolIP(data){ let pcisp = data.addr.split(' '); @@ -334,7 +307,6 @@ HTTP.runcheck(); IP.getIpipnetIP(); IP.getIpifyIP(); - IP.getWebrtcIP(); function getPcolIP(data){ let pcisp = data.addr.split(' '); diff --git a/package/ctcgfw/luci-app-openclash/files/usr/lib/lua/luci/view/openclash/status.htm b/package/ctcgfw/luci-app-openclash/files/usr/lib/lua/luci/view/openclash/status.htm index 2b4106a367..32c736a8da 100644 --- a/package/ctcgfw/luci-app-openclash/files/usr/lib/lua/luci/view/openclash/status.htm +++ b/package/ctcgfw/luci-app-openclash/files/usr/lib/lua/luci/view/openclash/status.htm @@ -55,6 +55,10 @@ { mode.innerHTML = status.clash ? "<%: Redir-Host(兼容)模式 %>" : '<%:NOT RUNNING%>'; } + else if ( status.mode == "redir-host-tun\n" ) + { + mode.innerHTML = status.clash ? "<%: Redir-Host(TUN)模式 %>" : '<%:NOT RUNNING%>'; + } else if ( status.mode == "fake-ip-tun\n" ) { mode.innerHTML = status.clash ? "<%: Fake-IP(TUN)模式 %>" : '<%:NOT RUNNING%>'; @@ -86,6 +90,10 @@ { mode.innerHTML = status.clash ? "<%: Redir-Host(兼容)模式 %>" : '<%:NOT RUNNING%>'; } + else if ( status.mode == "redir-host-tun\n" ) + { + mode.innerHTML = status.clash ? "<%: Redir-Host(TUN)模式 %>" : '<%:NOT RUNNING%>'; + } else if ( status.mode == "fake-ip-tun\n" ) { mode.innerHTML = status.clash ? "<%: Fake-IP(TUN)模式 %>" : '<%:NOT RUNNING%>'; diff --git a/package/ctcgfw/luci-app-openclash/files/usr/share/openclash/clash_version.sh b/package/ctcgfw/luci-app-openclash/files/usr/share/openclash/clash_version.sh index 49d13fada0..a7a031923e 100755 --- a/package/ctcgfw/luci-app-openclash/files/usr/share/openclash/clash_version.sh +++ b/package/ctcgfw/luci-app-openclash/files/usr/share/openclash/clash_version.sh @@ -3,7 +3,7 @@ CKTIME=$(date "+%Y-%m-%d-%H") LAST_OPVER="/tmp/clash_last_version" version_url="https://raw.githubusercontent.com/vernesong/OpenClash/master/core_version" if [ "$CKTIME" != "$(grep "CheckTime" $LAST_OPVER 2>/dev/null |awk -F ':' '{print $2}')" ]; then - wget-ssl --no-check-certificate --quiet --timeout=10 --tries=2 "$version_url" -O $LAST_OPVER + curl -sL -m 10 --retry 2 "$version_url" -o $LAST_OPVER >/dev/null 2>&1 if [ "$?" -eq "0" ] && [ "$(ls -l $LAST_OPVER 2>/dev/null |awk '{print int($5)}')" -gt 0 ]; then echo "CheckTime:$CKTIME" >>$LAST_OPVER else diff --git a/package/ctcgfw/luci-app-openclash/files/usr/share/openclash/openclash.sh b/package/ctcgfw/luci-app-openclash/files/usr/share/openclash/openclash.sh index c0d22c6f92..f1eeac9688 100755 --- a/package/ctcgfw/luci-app-openclash/files/usr/share/openclash/openclash.sh +++ b/package/ctcgfw/luci-app-openclash/files/usr/share/openclash/openclash.sh @@ -16,12 +16,12 @@ config_download() { if [ "$URL_TYPE" == "v2rayn" ]; then subscribe_url=`echo $subscribe_url |sed 's/{/%7B/g;s/}/%7D/g;s/:/%3A/g;s/\"/%22/g;s/,/%2C/g;s/?/%3F/g;s/=/%3D/g;s/&/%26/g;s/\//%2F/g'` - wget-ssl --no-check-certificate --quiet --timeout=10 --tries=2 https://tgbot.lbyczf.com/v2rayn2clash?url="$subscribe_url" -O /tmp/config.yaml + curl -sL -m 10 --retry 2 https://tgbot.lbyczf.com/v2rayn2clash?url="$subscribe_url" -o /tmp/config.yaml >/dev/null 2>&1 elif [ "$URL_TYPE" == "surge" ]; then subscribe_url=`echo $subscribe_url |sed 's/{/%7B/g;s/}/%7D/g;s/:/%3A/g;s/\"/%22/g;s/,/%2C/g;s/?/%3F/g;s/=/%3D/g;s/&/%26/g;s/\//%2F/g'` - wget-ssl --no-check-certificate --quiet --timeout=10 --tries=2 https://tgbot.lbyczf.com/surge2clash?url="$subscribe_url" -O /tmp/config.yaml + curl -sL -m 10 --retry 2 https://tgbot.lbyczf.com/surge2clash?url="$subscribe_url" -o /tmp/config.yaml >/dev/null 2>&1 else - wget-ssl --no-check-certificate --quiet --timeout=10 --tries=2 "$subscribe_url" -O /tmp/config.yaml + curl -sL -m 10 --retry 2 "$subscribe_url" -o /tmp/config.yaml >/dev/null 2>&1 fi } diff --git a/package/ctcgfw/luci-app-openclash/files/usr/share/openclash/openclash_core.sh b/package/ctcgfw/luci-app-openclash/files/usr/share/openclash/openclash_core.sh index dabc22eeb4..97b807709f 100755 --- a/package/ctcgfw/luci-app-openclash/files/usr/share/openclash/openclash_core.sh +++ b/package/ctcgfw/luci-app-openclash/files/usr/share/openclash/openclash_core.sh @@ -11,7 +11,7 @@ CPU_MODEL=$(uci get openclash.config.core_version 2>/dev/null) if [ "$(/etc/openclash/clash -v 2>/dev/null |awk -F ' ' '{print $2}')" != "$(sed -n 1p /tmp/clash_last_version 2>/dev/null)" ] || [ -z "$(/etc/openclash/clash -v 2>/dev/null |awk -F ' ' '{print $2}')" ] || [ ! -f /etc/openclash/clash ]; then if [ "$CPU_MODEL" != 0 ]; then echo "开始下载 OpenClash 内核..." >$START_LOG - wget-ssl --no-check-certificate --quiet --timeout=10 --tries=5 https://github.com/vernesong/OpenClash/releases/download/Clash/clash-"$CPU_MODEL".tar.gz -O /tmp/clash.tar.gz + curl -sL -m 10 --retry 2 https://github.com/vernesong/OpenClash/releases/download/Clash/clash-"$CPU_MODEL".tar.gz -o /tmp/clash.tar.gz >/dev/null 2>&1 if [ "$?" -eq "0" ] && [ "$(ls -l /tmp/clash.tar.gz |awk '{print int($5/1024)}')" -ne 0 ]; then tar zxvf /tmp/clash.tar.gz -C /tmp >/dev/null 2>&1\ && rm -rf /tmp/clash.tar.gz >/dev/null 2>&1\ diff --git a/package/ctcgfw/luci-app-openclash/files/usr/share/openclash/openclash_game_rule.sh b/package/ctcgfw/luci-app-openclash/files/usr/share/openclash/openclash_game_rule.sh index 29c7790a31..dd31994012 100755 --- a/package/ctcgfw/luci-app-openclash/files/usr/share/openclash/openclash_game_rule.sh +++ b/package/ctcgfw/luci-app-openclash/files/usr/share/openclash/openclash_game_rule.sh @@ -12,7 +12,7 @@ LOGTIME=$(date "+%Y-%m-%d %H:%M:%S") LOG_FILE="/tmp/openclash.log" echo "开始下载【$RULE_FILE_NAME】规则..." >$START_LOG - wget-ssl --no-check-certificate --quiet --timeout=10 --tries=2 https://raw.githubusercontent.com/FQrabbit/SSTap-Rule/master/rules/"$DOWNLOAD_PATH" -O "$TMP_RULE_DIR" + curl -sL -m 10 --retry 2 https://raw.githubusercontent.com/FQrabbit/SSTap-Rule/master/rules/"$DOWNLOAD_PATH" -o "$TMP_RULE_DIR" >/dev/null 2>&1 if [ "$?" -eq "0" ] && [ "$(ls -l $TMP_RULE_DIR |awk '{print $5}')" -ne 0 ]; then echo "【$RULE_FILE_NAME】规则下载成功,检查规则版本是否更新..." >$START_LOG cmp -s $TMP_RULE_DIR $RULE_FILE_DIR diff --git a/package/ctcgfw/luci-app-openclash/files/usr/share/openclash/openclash_history_get.sh b/package/ctcgfw/luci-app-openclash/files/usr/share/openclash/openclash_history_get.sh new file mode 100755 index 0000000000..3b551c1556 --- /dev/null +++ b/package/ctcgfw/luci-app-openclash/files/usr/share/openclash/openclash_history_get.sh @@ -0,0 +1,17 @@ +#!/bin/sh + +CURL_GROUP_CACHE="/tmp/openclash_history_gorup.json" +CURL_NOW_CACHE="/tmp/openclash_history_now.json" +CURL_CACHE="/tmp/openclash_history_curl.json" +HISTORY_PATH="/etc/openclash/history" +SECRET=$(uci get openclash.config.dashboard_password 2>/dev/null) +LAN_IP=$(uci get network.lan.ipaddr 2>/dev/null |awk -F '/' '{print $1}' 2>/dev/null) +PORT=$(uci get openclash.config.cn_port 2>/dev/null) + +curl -w %{http_code}"\n" -H "Authorization: Bearer ${SECRET}" -H "Content-Type:application/json" -X GET http://"$LAN_IP":"$PORT"/proxies > "$CURL_CACHE" 2>/dev/null +if [ "$(sed -n '$p' "$CURL_CACHE")" -eq "200" ]; then + cat "$CURL_CACHE" |jsonfilter -e '@["proxies"][@.type="Selector"]["name"]' > "$CURL_GROUP_CACHE" 2>/dev/null + cat "$CURL_CACHE" |jsonfilter -e '@["proxies"][@.type="Selector"]["now"]' > "$CURL_NOW_CACHE" 2>/dev/null + awk 'NR==FNR{a[i]=$0;i++}NR>FNR{print a[j]"#*#"$0;j++}' "$CURL_GROUP_CACHE" "$CURL_NOW_CACHE" > "$HISTORY_PATH" 2>/dev/null +fi +rm -rf /tmp/openclash_history_* 2>/dev/null \ No newline at end of file diff --git a/package/ctcgfw/luci-app-openclash/files/usr/share/openclash/openclash_history_set.sh b/package/ctcgfw/luci-app-openclash/files/usr/share/openclash/openclash_history_set.sh new file mode 100755 index 0000000000..b988aff8ac --- /dev/null +++ b/package/ctcgfw/luci-app-openclash/files/usr/share/openclash/openclash_history_set.sh @@ -0,0 +1,15 @@ +#!/bin/sh + +HISTORY_PATH="/etc/openclash/history" +SECRET=$(uci get openclash.config.dashboard_password 2>/dev/null) +LAN_IP=$(uci get network.lan.ipaddr 2>/dev/null |awk -F '/' '{print $1}' 2>/dev/null) +PORT=$(uci get openclash.config.cn_port 2>/dev/null) + +if [ ! -z "$(grep "#*#" "$HISTORY_PATH")" ]; then + cat $HISTORY_PATH |while read line + do + GORUP_NAME=$(echo $line |awk -F '#*#' '{print $1}') + NOW_NAME=$(echo $line |awk -F '#*#' '{print $3}') + curl -H "Authorization: Bearer ${SECRET}" -H "Content-Type:application/json" -X PUT -d '{"name":"'"$NOW_NAME"'"}' http://"$LAN_IP":"$PORT"/proxies/"$GORUP_NAME" >/dev/null 2>&1 + done +fi \ No newline at end of file diff --git a/package/ctcgfw/luci-app-openclash/files/usr/share/openclash/openclash_ipdb.sh b/package/ctcgfw/luci-app-openclash/files/usr/share/openclash/openclash_ipdb.sh index 874d063734..055f5f2a3a 100755 --- a/package/ctcgfw/luci-app-openclash/files/usr/share/openclash/openclash_ipdb.sh +++ b/package/ctcgfw/luci-app-openclash/files/usr/share/openclash/openclash_ipdb.sh @@ -3,7 +3,7 @@ LOGTIME=$(date "+%Y-%m-%d %H:%M:%S") LOG_FILE="/tmp/openclash.log" echo "开始下载 GEOIP 数据库..." >$START_LOG - wget-ssl --no-check-certificate --quiet --timeout=10 --tries=2 https://static.clash.to/GeoIP2/GeoIP2-Country.mmdb -O /tmp/Country.mmdb + curl -sL -m 10 --retry 2 https://static.clash.to/GeoIP2/GeoIP2-Country.mmdb -o /tmp/Country.mmdb >/dev/null 2>&1 if [ "$?" -eq "0" ] && [ "$(ls -l /tmp/Country.mmdb |awk '{print int($5/1024)}')" -ne 0 ]; then echo "GEOIP 数据库下载成功,检查数据库版本是否更新..." >$START_LOG cmp -s /tmp/Country.mmdb /etc/openclash/Country.mmdb diff --git a/package/ctcgfw/luci-app-openclash/files/usr/share/openclash/openclash_rule.sh b/package/ctcgfw/luci-app-openclash/files/usr/share/openclash/openclash_rule.sh index 69dda045b0..9feedb3b24 100755 --- a/package/ctcgfw/luci-app-openclash/files/usr/share/openclash/openclash_rule.sh +++ b/package/ctcgfw/luci-app-openclash/files/usr/share/openclash/openclash_rule.sh @@ -6,13 +6,13 @@ rule_source=$(uci get openclash.config.rule_source 2>/dev/null) echo "开始下载使用中的第三方规则..." >$START_LOG if [ "$rule_source" = "lhie1" ]; then - wget-ssl --no-check-certificate --quiet --timeout=10 --tries=2 https://raw.githubusercontent.com/lhie1/Rules/master/Clash/Rule.yml -O /tmp/rules.yaml + curl -sL -m 10 --retry 2 https://raw.githubusercontent.com/lhie1/Rules/master/Clash/Rule.yml -o /tmp/rules.yaml >/dev/null 2>&1 sed -i '1i Rule:' /tmp/rules.yaml elif [ "$rule_source" = "ConnersHua" ]; then - wget-ssl --no-check-certificate --quiet --timeout=10 --tries=2 https://raw.githubusercontent.com/ConnersHua/Profiles/master/Clash/Pro.yaml -O /tmp/rules.yaml + curl -sL -m 10 --retry 2 https://raw.githubusercontent.com/ConnersHua/Profiles/master/Clash/Pro.yaml -o /tmp/rules.yaml >/dev/null 2>&1 sed -i -n '/^Rule:/,$p' /tmp/rules.yaml elif [ "$rule_source" = "ConnersHua_return" ]; then - wget-ssl --no-check-certificate --quiet --timeout=10 --tries=2 https://raw.githubusercontent.com/ConnersHua/Profiles/master/Clash/BacktoCN.yaml -O /tmp/rules.yaml + curl -sL -m 10 --retry 2 https://raw.githubusercontent.com/ConnersHua/Profiles/master/Clash/BacktoCN.yaml -o /tmp/rules.yaml >/dev/null 2>&1 sed -i -n '/^Rule:/,$p' /tmp/rules.yaml fi if [ "$?" -eq "0" ] && [ "$rule_source" != 0 ] && [ "$(ls -l /tmp/rules.yaml |awk '{print int($5/1024)}')" -ne 0 ]; then diff --git a/package/ctcgfw/luci-app-openclash/files/usr/share/openclash/openclash_update.sh b/package/ctcgfw/luci-app-openclash/files/usr/share/openclash/openclash_update.sh index ce2bc69606..b5781a6d62 100755 --- a/package/ctcgfw/luci-app-openclash/files/usr/share/openclash/openclash_update.sh +++ b/package/ctcgfw/luci-app-openclash/files/usr/share/openclash/openclash_update.sh @@ -10,7 +10,7 @@ LAST_OPVER="/tmp/openclash_last_version" LAST_VER=$(sed -n 1p "$LAST_OPVER" 2>/dev/null |sed "s/^v//g") if [ "$(sed -n 1p /etc/openclash/openclash_version 2>/dev/null)" != "$(sed -n 1p $LAST_OPVER 2>/dev/null)" ] && [ -f "$LAST_OPVER" ]; then echo "开始下载 OpenClash-$LAST_VER ..." >$START_LOG - wget-ssl --no-check-certificate --quiet --timeout=10 --tries=5 https://github.com/vernesong/OpenClash/releases/download/v"$LAST_VER"/luci-app-openclash_"$LAST_VER"_all.ipk -O /tmp/openclash.ipk + curl -sL -m 10 --retry 5 https://github.com/vernesong/OpenClash/releases/download/v"$LAST_VER"/luci-app-openclash_"$LAST_VER"_all.ipk -o /tmp/openclash.ipk >/dev/null 2>&1 if [ "$?" -eq "0" ] && [ "$(ls -l /tmp/openclash.ipk |awk '{print int($5/1024)}')" -ne 0 ]; then echo "OpenClash-$LAST_VER 下载成功,开始更新,更新过程请不要刷新页面和进行其他操作..." >$START_LOG cat > /tmp/openclash_update.sh <<"EOF" diff --git a/package/ctcgfw/luci-app-openclash/files/usr/share/openclash/openclash_version.sh b/package/ctcgfw/luci-app-openclash/files/usr/share/openclash/openclash_version.sh index 950a516712..5d3e768260 100755 --- a/package/ctcgfw/luci-app-openclash/files/usr/share/openclash/openclash_version.sh +++ b/package/ctcgfw/luci-app-openclash/files/usr/share/openclash/openclash_version.sh @@ -3,7 +3,7 @@ CKTIME=$(date "+%Y-%m-%d-%H") LAST_OPVER="/tmp/openclash_last_version" version_url="https://raw.githubusercontent.com/vernesong/OpenClash/master/version" if [ "$CKTIME" != "$(grep "CheckTime" $LAST_OPVER 2>/dev/null |awk -F ':' '{print $2}')" ]; then - wget-ssl --no-check-certificate --quiet --timeout=10 --tries=2 "$version_url" -O $LAST_OPVER + curl -sL -m 10 --retry 2 "$version_url" -o $LAST_OPVER >/dev/null 2>&1 if [ "$?" -eq "0" ] && [ "$(ls -l $LAST_OPVER 2>/dev/null |awk '{print int($5)}')" -gt 0 ]; then if [ "$(sed -n 1p /etc/openclash/openclash_version 2>/dev/null)" = "$(sed -n 1p $LAST_OPVER 2>/dev/null)" ]; then sed -i "/^https:/i\CheckTime:${CKTIME}" "$LAST_OPVER" 2>/dev/null diff --git a/package/ctcgfw/luci-app-openclash/files/usr/share/openclash/openclash_watchdog.sh b/package/ctcgfw/luci-app-openclash/files/usr/share/openclash/openclash_watchdog.sh index dd16d7b72c..85047cb67e 100755 --- a/package/ctcgfw/luci-app-openclash/files/usr/share/openclash/openclash_watchdog.sh +++ b/package/ctcgfw/luci-app-openclash/files/usr/share/openclash/openclash_watchdog.sh @@ -19,6 +19,8 @@ if [ "$enable" -eq 1 ]; then CONFIG_FILE=$(uci get openclash.config.config_path 2>/dev/null) echo "${LOGTIME} Watchdog: Clash Core Problem, Restart." >> $LOG_FILE nohup $CLASH -d "$CLASH_CONFIG" -f "$CONFIG_FILE" >> $LOG_FILE 2>&1 & + sleep 3 + /usr/share/openclash/openclash_history_set.sh else echo "${LOGTIME} Watchdog: Already Restart 3 Times With Clash Core Problem, Auto-Exit." >> $LOG_FILE exit 0 @@ -28,11 +30,23 @@ if [ "$enable" -eq 1 ]; then fi fi +## Porxy history + /usr/share/openclash/openclash_history_get.sh + ## Log File Size Manage: LOGSIZE=`ls -l /tmp/openclash.log |awk '{print int($5/1024)}'` if [ "$LOGSIZE" -gt 90 ]; then echo "$LOGTIME Watchdog: Size Limit, Clean Up All Log Records." > $LOG_FILE fi + +## 端口转发重启 + last_line=$(iptables -t nat -nL PREROUTING --line-number |awk '{print $1}' 2>/dev/null |awk 'END {print}' |sed -n '$p') + op_line=$(iptables -t nat -nL PREROUTING --line-number |grep "openclash" 2>/dev/null |awk '{print $1}' 2>/dev/null |head -1) + if [ "$last_line" -ne "$op_line" ]; then + iptables -t nat -D PREROUTING -p tcp -j openclash + iptables -t nat -A PREROUTING -p tcp -j openclash + echo "$LOGTIME Watchdog: Reset Firewall For Enabling Redirect." >>$LOG_FILE + fi ## DNS转发劫持 if [ "$enable_redirect_dns" != "0" ]; then diff --git a/package/ctcgfw/luci-app-openclash/files/usr/share/openclash/yml_groups_set.sh b/package/ctcgfw/luci-app-openclash/files/usr/share/openclash/yml_groups_set.sh index 524a1b8ab6..85368f2cb1 100755 --- a/package/ctcgfw/luci-app-openclash/files/usr/share/openclash/yml_groups_set.sh +++ b/package/ctcgfw/luci-app-openclash/files/usr/share/openclash/yml_groups_set.sh @@ -6,6 +6,7 @@ status=$(ps|grep -c /usr/share/openclash/yml_groups_set.sh) START_LOG="/tmp/openclash_start.log" GROUP_FILE="/tmp/yaml_groups.yaml" +CONFIG_GROUP_FILE="/tmp/yaml_group.yaml" CFG_FILE="/etc/config/openclash" servers_update=$(uci get openclash.config.servers_update 2>/dev/null) CONFIG_FILE=$(uci get openclash.config.config_path 2>/dev/null) @@ -35,6 +36,7 @@ yml_servers_add() local section="$1" config_get_bool "enabled" "$section" "enabled" "1" config_get "config" "$section" "config" "" + config_get "name" "$section" "name" "" if [ ! -z "$config" ] && [ "$config" != "$CONFIG_NAME" ] && [ "$config" != "all" ]; then return @@ -43,8 +45,9 @@ yml_servers_add() if [ "$enabled" = "0" ]; then return else - config_get "name" "$section" "name" "" - config_list_foreach "$section" "groups" set_groups "$name" "$2" + if [ -z "$3" ]; then + config_list_foreach "$section" "groups" set_groups "$name" "$2" + fi if [ ! -z "$if_game_group" ] && [ -z "$(grep -F $name /tmp/yaml_proxy.yaml)" ]; then /usr/share/openclash/yml_proxys_set.sh "$name" "proxy" @@ -83,6 +86,7 @@ set_proxy_provider() local section="$1" config_get_bool "enabled" "$section" "enabled" "1" config_get "config" "$section" "config" "" + config_get "name" "$section" "name" "" if [ ! -z "$config" ] && [ "$config" != "$CONFIG_NAME" ] && [ "$config" != "all" ]; then return @@ -91,8 +95,9 @@ set_proxy_provider() if [ "$enabled" = "0" ]; then return else - config_get "name" "$section" "name" "" - config_list_foreach "$section" "groups" set_provider_groups "$name" "$2" + if [ -z "$3" ]; then + config_list_foreach "$section" "groups" set_provider_groups "$name" "$2" + fi if [ ! -z "$if_game_group" ] && [ -z "$(grep "^ \{0,\}$name" /tmp/yaml_proxy_provider.yaml)" ]; then /usr/share/openclash/yml_proxys_set.sh "$name" "proxy-provider" @@ -146,6 +151,13 @@ yml_groups_set() return fi + #游戏策略组存在时判断节点是否存在 + if [ ! -z "$if_game_group" ] && [ ! -z "$(grep "^ \{0,\}- name: $if_game_group" "$CONFIG_GROUP_FILE")" ]; then + config_foreach yml_servers_add "servers" "$name" "check" #加入服务器节点 + config_foreach set_proxy_provider "proxy-provider" "$group_name" "check" #加入代理集 + return + fi + echo "正在写入【$type】-【$name】策略组到配置文件【$CONFIG_NAME】..." >$START_LOG echo "- name: $name" >>$GROUP_FILE @@ -168,9 +180,8 @@ yml_groups_set() config_foreach yml_servers_add "servers" "$name" #加入服务器节点 echo " use: $group_name" >>$GROUP_FILE - config_foreach set_proxy_provider "proxy-provider" "$group_name" #加入代理集 - + if [ "$set_group" -eq 1 ]; then sed -i "/^ \{0,\}proxies: ${group_name}/c\ proxies:" $GROUP_FILE else @@ -184,10 +195,10 @@ yml_groups_set() fi [ ! -z "$test_url" ] && { - echo " url: $test_url" >>$GROUP_FILE + echo " url: $test_url" >>$GROUP_FILE } [ ! -z "$test_interval" ] && { - echo " interval: \"$test_interval\"" >>$GROUP_FILE + echo " interval: \"$test_interval\"" >>$GROUP_FILE } } @@ -208,6 +219,7 @@ if [ "$create_config" = "0" ] || [ "$servers_if_update" = "1" ] || [ ! -z "$if_g echo "Proxy Group:" >$GROUP_FILE else echo "开始加入游戏策略组【$if_game_group】的信息..." >$START_LOG + rm -rf $GROUP_FILE fi config_load "openclash" config_foreach yml_groups_set "groups" diff --git a/package/ctcgfw/luci-app-openclash/files/usr/share/openclash/yml_proxys_set.sh b/package/ctcgfw/luci-app-openclash/files/usr/share/openclash/yml_proxys_set.sh index 42b7ea7561..620a3e6525 100755 --- a/package/ctcgfw/luci-app-openclash/files/usr/share/openclash/yml_proxys_set.sh +++ b/package/ctcgfw/luci-app-openclash/files/usr/share/openclash/yml_proxys_set.sh @@ -301,7 +301,7 @@ rm -rf /tmp/Proxy_Provider config_load "openclash" config_foreach yml_proxy_provider_set "proxy-provider" sed -i "s/^ \{0,\}/ - /" /tmp/Proxy_Provider 2>/dev/null #添加参数 -if [ "$(grep "-" /tmp/Proxy_Provider |wc -l)" -eq 0 ]; then +if [ "$(grep "-" /tmp/Proxy_Provider 2>/dev/null |wc -l)" -eq 0 ]; then rm -rf $PROXY_PROVIDER_FILE rm -rf /tmp/Proxy_Provider fi @@ -665,9 +665,9 @@ echo "" >$START_LOG if [ -z "$if_game_proxy" ]; then rm -rf $SERVER_FILE 2>/dev/null rm -rf $PROXY_PROVIDER_FILE 2>/dev/null + rm -rf /tmp/yaml_groups.yaml 2>/dev/null fi rm -rf /tmp/Proxy_Server 2>/dev/null -rm -rf /tmp/yaml_groups.yaml 2>/dev/null rm -rf /tmp/Proxy_Provider 2>/dev/null uci set openclash.config.enable=1 2>/dev/null [ "$(uci get openclash.config.servers_if_update)" == "0" ] && [ -z "$if_game_proxy" ] && /etc/init.d/openclash restart >/dev/null 2>&1 diff --git a/package/ctcgfw/luci-app-openclash/i18n/zh-cn/openclash.zh-cn.po b/package/ctcgfw/luci-app-openclash/i18n/zh-cn/openclash.zh-cn.po index b3c7fcebba..cd41999eba 100644 --- a/package/ctcgfw/luci-app-openclash/i18n/zh-cn/openclash.zh-cn.po +++ b/package/ctcgfw/luci-app-openclash/i18n/zh-cn/openclash.zh-cn.po @@ -95,6 +95,9 @@ msgstr "Redir-Host(兼容)模式" msgid "fake-ip" msgstr "Fake-IP(增强)模式" +msgid "redir-host(tun mode)" +msgstr "Redir-Host(TUN)模式【依赖kmod-tun】" + msgid "fake-ip(tun mode)" msgstr "Fake-IP(TUN)模式【依赖kmod-tun】" diff --git a/package/ctcgfw/luci-app-ssr-plus-Jo/Makefile b/package/ctcgfw/luci-app-ssr-plus-Jo/Makefile index 7796c9f85f..57527c5a31 100644 --- a/package/ctcgfw/luci-app-ssr-plus-Jo/Makefile +++ b/package/ctcgfw/luci-app-ssr-plus-Jo/Makefile @@ -11,14 +11,16 @@ PKG_CONFIG_DEPENDS:= CONFIG_PACKAGE_$(PKG_NAME)_INCLUDE_Shadowsocks \ CONFIG_PACKAGE_$(PKG_NAME)_INCLUDE_Shadowsocks_Server \ CONFIG_PACKAGE_$(PKG_NAME)_INCLUDE_ShadowsocksR_Socks \ CONFIG_PACKAGE_$(PKG_NAME)_INCLUDE_Shadowsocks_Socks \ + CONFIG_PACKAGE_$(PKG_NAME)_INCLUDE_ipt2socks \ CONFIG_PACKAGE_$(PKG_NAME)_INCLUDE_dnscrypt_proxy \ CONFIG_PACKAGE_$(PKG_NAME)_INCLUDE_dnsforwarder \ CONFIG_PACKAGE_$(PKG_NAME)_INCLUDE_ChinaDNS \ CONFIG_PACKAGE_$(PKG_NAME)_INCLUDE_haproxy \ + CONFIG_PACKAGE_$(PKG_NAME)_INCLUDE_udpspeeder \ + CONFIG_PACKAGE_$(PKG_NAME)_INCLUDE_udp2raw-tunnel \ CONFIG_PACKAGE_$(PKG_NAME)_INCLUDE_privoxy \ CONFIG_PACKAGE_$(PKG_NAME)_INCLUDE_simple-obfs\ CONFIG_PACKAGE_$(PKG_NAME)_INCLUDE_simple-obfs-server\ - CONFIG_PACKAGE_$(PKG_NAME)_INCLUDE_ipt2socks\ CONFIG_PACKAGE_$(PKG_NAME)_INCLUDE_GoQuiet-client\ CONFIG_PACKAGE_$(PKG_NAME)_INCLUDE_GoQuiet-server\ CONFIG_PACKAGE_$(PKG_NAME)_INCLUDE_v2ray-plugin @@ -33,10 +35,10 @@ config PACKAGE_$(PKG_NAME)_INCLUDE_Shadowsocks config PACKAGE_$(PKG_NAME)_INCLUDE_V2ray bool "Include V2ray" default y - + config PACKAGE_$(PKG_NAME)_INCLUDE_Trojan bool "Include Trojan" - default n + default y config PACKAGE_$(PKG_NAME)_INCLUDE_Kcptun bool "Include Kcptun" @@ -48,7 +50,7 @@ config PACKAGE_$(PKG_NAME)_INCLUDE_ShadowsocksR_Server config PACKAGE_$(PKG_NAME)_INCLUDE_Shadowsocks_Server bool "Include Shadowsocks Server" - default n + default y config PACKAGE_$(PKG_NAME)_INCLUDE_ShadowsocksR_Socks bool "Include ShadowsocksR Socks and Tunnel" @@ -56,51 +58,59 @@ config PACKAGE_$(PKG_NAME)_INCLUDE_ShadowsocksR_Socks config PACKAGE_$(PKG_NAME)_INCLUDE_Shadowsocks_Socks bool "Include Shadowsocks Socks and Tunnel" - default n - -config PACKAGE_$(PKG_NAME)_INCLUDE_dnscrypt_proxy - bool "dnscrypt-proxy-full" - default n - -config PACKAGE_$(PKG_NAME)_INCLUDE_dnsforwarder - bool "dnsforwarder" - default n - -config PACKAGE_$(PKG_NAME)_INCLUDE_ChinaDNS - bool "chinadns" - default n - -config PACKAGE_$(PKG_NAME)_INCLUDE_haproxy - bool "haproxy" - default n - -config PACKAGE_$(PKG_NAME)_INCLUDE_privoxy - bool "privoxy http local" - default n - -config PACKAGE_$(PKG_NAME)_INCLUDE_simple-obfs - bool "simple-obfs-local" - default n - -config PACKAGE_$(PKG_NAME)_INCLUDE_simple-obfs-server - bool "simple-obfs-server" - default n + default y config PACKAGE_$(PKG_NAME)_INCLUDE_ipt2socks bool "Include ipt2socks" - default n + default y + +config PACKAGE_$(PKG_NAME)_INCLUDE_dnscrypt_proxy + bool "Include dnscrypt-proxy-full" + default y + +config PACKAGE_$(PKG_NAME)_INCLUDE_dnsforwarder + bool "Include dnsforwarder" + default y + +config PACKAGE_$(PKG_NAME)_INCLUDE_ChinaDNS + bool "Include chinadns" + default y + +config PACKAGE_$(PKG_NAME)_INCLUDE_haproxy + bool "Include haproxy" + default y + +config PACKAGE_$(PKG_NAME)_INCLUDE_privoxy + bool "Include privoxy http local" + default y + +config PACKAGE_$(PKG_NAME)_INCLUDE_simple-obfs + bool "Include simple-obfsl" + default y +config PACKAGE_$(PKG_NAME)_INCLUDE_simple-obfs-server + bool "Include simple-obfs-server" + default y + +config PACKAGE_$(PKG_NAME)_INCLUDE_udpspeeder + bool "Include udpspeeder" + default y + +config PACKAGE_$(PKG_NAME)_INCLUDE_udp2raw-tunnel + bool "Include udp2raw-tunnel" + default y + config PACKAGE_$(PKG_NAME)_INCLUDE_GoQuiet-client - bool "GoQuiet-client" - default n - + bool "Include GoQuiet-client" + default y + config PACKAGE_$(PKG_NAME)_INCLUDE_GoQuiet-server - bool "GoQuiet-server" - default n + bool "Include GoQuiet-server" + default y config PACKAGE_$(PKG_NAME)_INCLUDE_v2ray-plugin - bool "v2ray-plugin" - default n + bool "Include v2ray-plugin" + default y endef define Package/luci-app-ssr-plus-Jo @@ -112,20 +122,22 @@ define Package/luci-app-ssr-plus-Jo DEPENDS:=+shadowsocksr-libev-alt +ipset +ip-full +iptables-mod-tproxy +dnsmasq-full +coreutils +coreutils-base64 +bash +pdnsd-alt +curl +wget +unzip \ +PACKAGE_$(PKG_NAME)_INCLUDE_Shadowsocks:shadowsocks-libev-ss-redir \ +PACKAGE_$(PKG_NAME)_INCLUDE_V2ray:v2ray \ - +PACKAGE_$(PKG_NAME)_INCLUDE_Trojan:trojan \ + +PACKAGE_$(PKG_NAME)_INCLUDE_Trojan:trojan \ +PACKAGE_$(PKG_NAME)_INCLUDE_Kcptun:kcptun-client \ +PACKAGE_$(PKG_NAME)_INCLUDE_ShadowsocksR_Server:shadowsocksr-libev-server \ +PACKAGE_$(PKG_NAME)_INCLUDE_Shadowsocks_Server:shadowsocks-libev-ss-server \ +PACKAGE_$(PKG_NAME)_INCLUDE_ShadowsocksR_Socks:shadowsocksr-libev-ssr-local \ +PACKAGE_$(PKG_NAME)_INCLUDE_Shadowsocks_Socks:shadowsocks-libev-ss-local \ + +PACKAGE_$(PKG_NAME)_INCLUDE_ipt2socks:ipt2socks \ +PACKAGE_$(PKG_NAME)_INCLUDE_dnscrypt_proxy:dnscrypt-proxy-full \ +PACKAGE_$(PKG_NAME)_INCLUDE_dnsforwarder:dnsforwarder \ +PACKAGE_$(PKG_NAME)_INCLUDE_ChinaDNS:openwrt_chinadns \ +PACKAGE_$(PKG_NAME)_INCLUDE_haproxy:haproxy \ +PACKAGE_$(PKG_NAME)_INCLUDE_privoxy:privoxy \ + +PACKAGE_$(PKG_NAME)_INCLUDE_udpspeeder:speederv2-tunnel \ + +PACKAGE_$(PKG_NAME)_INCLUDE_udp2raw-tunnel:udp2raw-tunnel \ +PACKAGE_$(PKG_NAME)_INCLUDE_simple-obfs:simple-obfs \ +PACKAGE_$(PKG_NAME)_INCLUDE_simple-obfs-server:simple-obfs-server \ - +PACKAGE_$(PKG_NAME)_INCLUDE_ipt2socks:ipt2socks \ +PACKAGE_$(PKG_NAME)_INCLUDE_GoQuiet-client:gq-client \ +PACKAGE_$(PKG_NAME)_INCLUDE_GoQuiet-server:gq-server \ +PACKAGE_$(PKG_NAME)_INCLUDE_v2ray-plugin:v2ray-plugin diff --git a/package/ctcgfw/luci-app-unblockneteasemusic/Makefile b/package/ctcgfw/luci-app-unblockneteasemusic/Makefile index 1ac10332db..c020863c9f 100644 --- a/package/ctcgfw/luci-app-unblockneteasemusic/Makefile +++ b/package/ctcgfw/luci-app-unblockneteasemusic/Makefile @@ -11,8 +11,8 @@ LUCI_TITLE:=LuCI support for UnblockNeteaseMusic LUCI_DEPENDS:=+bash +busybox +coreutils-nohup +curl +dnsmasq-full +ipset +libopenssl +node LUCI_PKGARCH:=all PKG_NAME:=luci-app-unblockneteasemusic -PKG_VERSION:=2.6 -PKG_RELEASE:=3 +PKG_VERSION:=2.7 +PKG_RELEASE:=1 PKG_MAINTAINER:=[CTCGFW]Project-OpenWrt diff --git a/package/ctcgfw/luci-app-unblockneteasemusic/luasrc/controller/unblockneteasemusic.lua b/package/ctcgfw/luci-app-unblockneteasemusic/luasrc/controller/unblockneteasemusic.lua index de66cc9756..9c1c293b0c 100644 --- a/package/ctcgfw/luci-app-unblockneteasemusic/luasrc/controller/unblockneteasemusic.lua +++ b/package/ctcgfw/luci-app-unblockneteasemusic/luasrc/controller/unblockneteasemusic.lua @@ -12,10 +12,11 @@ function index() entry({"admin", "services", "unblockneteasemusic"},firstchild(), _("解除网易云音乐播放限制"), 50).dependent = false entry({"admin", "services", "unblockneteasemusic", "general"},cbi("unblockneteasemusic"), _("基本设定"), 1) - entry({"admin", "services", "unblockneteasemusic", "upgrade_core"},form("unblockneteasemusic_upcore"), _("更新核心"), 2).leaf = true + entry({"admin", "services", "unblockneteasemusic", "upgrade"},form("unblockneteasemusic_upgrade"), _("更新组件"), 2).leaf = true entry({"admin", "services", "unblockneteasemusic", "log"},form("unblockneteasemusiclog"), _("日志"), 3) entry({"admin", "services", "unblockneteasemusic", "status"},call("act_status")).leaf=true + entry({"admin", "services", "unblockneteasemusic", "update_luci"},call("act_update_luci")) entry({"admin", "services", "unblockneteasemusic", "update_core"},call("act_update_core")) end @@ -26,21 +27,49 @@ function act_status() luci.http.write_json(e) end -function update_core() - cloud_ver=luci.sys.exec("curl -s 'https://github.com/nondanee/UnblockNeteaseMusic/commits/master' |tr -d '\n' |grep -Eo 'commit\/[0-9a-z]+' |sed -n 1p |sed 's#commit/##g'") - cloud_ver_mini=luci.sys.exec("curl -s 'https://github.com/nondanee/UnblockNeteaseMusic/commits/master' |tr -d '\n' |grep -Eo 'BtnGroup-item.> [0-9a-z]+' |sed -n 1p |sed 's#BtnGroup-item.> ##g'") - if not cloud_ver or not cloud_ver_mini then +function update_luci() + luci_cloud_ver=luci.sys.exec("curl -s 'https://github.com/project-openwrt/luci-app-unblockneteasemusic/releases/latest'| grep -Eo '[0-9\.]+\-[0-9]+'") + if not luci_cloud_ver then return "1" else - local_ver=luci.sys.exec("cat '/usr/share/unblockneteasemusic/local_ver'") - if not local_ver or (local_ver ~= cloud_ver) then - luci.sys.call("rm -f /usr/share/unblockneteasemusic/update_successfully") - luci.sys.call("/bin/bash /usr/share/unblockneteasemusic/update_core.sh luci_update") - if not nixio.fs.access("/usr/share/unblockneteasemusic/update_successfully") then + luci_local_ver=luci.sys.exec("opkg info 'luci-app-unblockneteasemusic' |sed -n '2p' |tr -d 'Version: '") + if not luci_local_ver or (luci_local_ver ~= luci_cloud_ver) then + luci.sys.call("rm -f /usr/share/unblockneteasemusic/update_luci_successfully") + luci.sys.call("/bin/bash /usr/share/unblockneteasemusic/update.sh update_luci") + if not nixio.fs.access("/usr/share/unblockneteasemusic/update_luci_successfully") then return "2" else - luci.sys.call("rm -f /usr/share/unblockneteasemusic/update_successfully") - return cloud_ver_mini + luci.sys.call("rm -f /usr/share/unblockneteasemusic/update_luci_successfully") + return luci_cloud_ver + end + else + return "0" + end + end +end + +function act_update_luci() + luci.http.prepare_content("application/json") + luci.http.write_json({ + ret = update_luci(); + }) +end + +function update_core() + core_cloud_ver=luci.sys.exec("curl -s 'https://github.com/nondanee/UnblockNeteaseMusic/commits/master' |tr -d '\n' |grep -Eo 'commit\/[0-9a-z]+' |sed -n 1p |sed 's#commit/##g'") + core_cloud_ver_mini=luci.sys.exec("curl -s 'https://github.com/nondanee/UnblockNeteaseMusic/commits/master' |tr -d '\n' |grep -Eo 'BtnGroup-item.> [0-9a-z]+' |sed -n 1p |sed 's#BtnGroup-item.> ##g'") + if not core_cloud_ver or not core_cloud_ver_mini then + return "1" + else + core_local_ver=luci.sys.exec("cat '/usr/share/unblockneteasemusic/core_local_ver'") + if not core_local_ver or (core_local_ver ~= core_cloud_ver) then + luci.sys.call("rm -f /usr/share/unblockneteasemusic/update_core_successfully") + luci.sys.call("/bin/bash /usr/share/unblockneteasemusic/update.sh update_core_from_luci") + if not nixio.fs.access("/usr/share/unblockneteasemusic/update_core_successfully") then + return "2" + else + luci.sys.call("rm -f /usr/share/unblockneteasemusic/update_core_successfully") + return core_cloud_ver_mini end else return "0" @@ -53,4 +82,4 @@ function act_update_core() luci.http.write_json({ ret = update_core(); }) -end +end \ No newline at end of file diff --git a/package/ctcgfw/luci-app-unblockneteasemusic/luasrc/model/cbi/unblockneteasemusic.lua b/package/ctcgfw/luci-app-unblockneteasemusic/luasrc/model/cbi/unblockneteasemusic.lua index 57bbeb4faf..115ebbf14e 100644 --- a/package/ctcgfw/luci-app-unblockneteasemusic/luasrc/model/cbi/unblockneteasemusic.lua +++ b/package/ctcgfw/luci-app-unblockneteasemusic/luasrc/model/cbi/unblockneteasemusic.lua @@ -48,7 +48,7 @@ hijack = s:option(ListValue, "hijack_ways", translate("劫持方法")) hijack:value("dont_hijack", translate("不开启劫持")) hijack:value("use_ipset", translate("使用IPSet劫持")) hijack:value("use_hosts", translate("使用Hosts劫持")) -hijack.description = translate("如果使用Hosts劫持,主实例的HTTP/HTTPS端口将被锁定为80/443") +hijack.description = translate("如果使用Hosts劫持,程序监听的HTTP/HTTPS端口将被锁定为80/443") hijack.default = "dont_hijack" hijack.rmempty = false @@ -103,7 +103,7 @@ pub_access.rmempty = false pub_access:depends("advanced_mode", 1) strict_mode = s:option(Flag, "strict_mode", translate("启用严格模式")) -strict_mode.description = translate("若将服务部署到公网,则强烈建议使用严格模式,此模式下仅放行网易云音乐所属域名的请求;注意:该模式下只能使用PAC方式进行代理") +strict_mode.description = translate("若将服务部署到公网,则强烈建议使用严格模式,此模式下仅放行网易云音乐所属域名的请求;注意:该模式下不能使用全局代理") strict_mode.default = 0 strict_mode.rmempty = false strict_mode:depends("advanced_mode", 1) @@ -112,7 +112,6 @@ netease_server_ip = s:option(Value, "netease_server_ip", translate("网易云服 netease_server_ip.description = translate("通过 ping music.163.com 即可获得IP地址,仅限填写一个") netease_server_ip.placeholder = "59.111.181.38" netease_server_ip.datatype = "ipaddr" -netease_server_ip:depends("set_netease_server_ip", 1) netease_server_ip:depends("advanced_mode", 1) proxy_server_ip = s:option(Value, "proxy_server_ip", translate("代理服务器地址")) @@ -121,4 +120,16 @@ proxy_server_ip.placeholder = "http(s)://host:port" proxy_server_ip.datatype = "string" proxy_server_ip:depends("advanced_mode", 1) +self_issue_cert_crt = s:option(Value, "self_issue_cert_crt", translate("自签发证书公钥位置")) +self_issue_cert_crt.description = translate("[公钥] 默认使用UnblockNeteaseMusic项目提供的CA证书,您可以指定为您自己的证书") +self_issue_cert_crt.placeholder = "/usr/share/unblockneteasemusic/core/server.crt" +self_issue_cert_crt.datatype = "file" +self_issue_cert_crt:depends("advanced_mode", 1) + +self_issue_cert_key = s:option(Value, "self_issue_cert_key", translate("自签发证书私钥位置")) +self_issue_cert_key.description = translate("[私钥] 默认使用UnblockNeteaseMusic项目提供的CA证书,您可以指定为您自己的证书") +self_issue_cert_key.placeholder = "/usr/share/unblockneteasemusic/core/server.key" +self_issue_cert_key.datatype = "file" +self_issue_cert_key:depends("advanced_mode", 1) + return mp diff --git a/package/ctcgfw/luci-app-unblockneteasemusic/luasrc/model/cbi/unblockneteasemusic_upcore.lua b/package/ctcgfw/luci-app-unblockneteasemusic/luasrc/model/cbi/unblockneteasemusic_upgrade.lua similarity index 59% rename from package/ctcgfw/luci-app-unblockneteasemusic/luasrc/model/cbi/unblockneteasemusic_upcore.lua rename to package/ctcgfw/luci-app-unblockneteasemusic/luasrc/model/cbi/unblockneteasemusic_upgrade.lua index d811fc7b29..d28ab28ae3 100644 --- a/package/ctcgfw/luci-app-unblockneteasemusic/luasrc/model/cbi/unblockneteasemusic_upcore.lua +++ b/package/ctcgfw/luci-app-unblockneteasemusic/luasrc/model/cbi/unblockneteasemusic_upgrade.lua @@ -4,6 +4,12 @@ m = SimpleForm("Version") m.reset = false m.submit = false +up_core=m:field(DummyValue,"update_luci",translate("更新LuCI")) +up_core.rawhtml = true +up_core.template = "unblockneteasemusic/update_luci" +up_core.value = translate("未检查") +up_core.description = "更新完毕后请手动刷新该界面" + up_core=m:field(DummyValue,"update_core",translate("更新主程序")) up_core.rawhtml = true up_core.template = "unblockneteasemusic/update_core" diff --git a/package/ctcgfw/luci-app-unblockneteasemusic/luasrc/view/unblockneteasemusic/update_luci.htm b/package/ctcgfw/luci-app-unblockneteasemusic/luasrc/view/unblockneteasemusic/update_luci.htm new file mode 100644 index 0000000000..c555b867bd --- /dev/null +++ b/package/ctcgfw/luci-app-unblockneteasemusic/luasrc/view/unblockneteasemusic/update_luci.htm @@ -0,0 +1,36 @@ +<%+cbi/valueheader%> + + + + + +<%=self.value%> + +<%+cbi/valuefooter%> \ No newline at end of file diff --git a/package/ctcgfw/luci-app-unblockneteasemusic/root/etc/config/unblockneteasemusic b/package/ctcgfw/luci-app-unblockneteasemusic/root/etc/config/unblockneteasemusic index 3593ef2752..af64d919db 100644 --- a/package/ctcgfw/luci-app-unblockneteasemusic/root/etc/config/unblockneteasemusic +++ b/package/ctcgfw/luci-app-unblockneteasemusic/root/etc/config/unblockneteasemusic @@ -17,3 +17,5 @@ config unblockneteasemusic option strict_mode '0' option netease_server_ip '59.111.181.38' option proxy_server_ip '' + option self_issue_cert_crt '/usr/share/unblockneteasemusic/core/server.crt' + option self_issue_cert_key '/usr/share/unblockneteasemusic/core/server.key' diff --git a/package/ctcgfw/luci-app-unblockneteasemusic/root/etc/init.d/unblockneteasemusic b/package/ctcgfw/luci-app-unblockneteasemusic/root/etc/init.d/unblockneteasemusic index 1a3287b8d5..f15c6ba060 100755 --- a/package/ctcgfw/luci-app-unblockneteasemusic/root/etc/init.d/unblockneteasemusic +++ b/package/ctcgfw/luci-app-unblockneteasemusic/root/etc/init.d/unblockneteasemusic @@ -31,46 +31,49 @@ netease_server_ip="$(uci get unblockneteasemusic.@unblockneteasemusic[0].netease proxy_server_ip="$(uci get unblockneteasemusic.@unblockneteasemusic[0].proxy_server_ip 2>"/dev/null")" [ -n "${proxy_server_ip}" ] && proxy_server_ip="-u ${proxy_server_ip}" +self_issue_cert_crt="$(uci get unblockneteasemusic.@unblockneteasemusic[0].self_issue_cert_crt 2>"/dev/null")" +self_issue_cert_key="$(uci get unblockneteasemusic.@unblockneteasemusic[0].self_issue_cert_key 2>"/dev/null")" + set_ipset(){ if [ "${set_type}" = "start" ]; then mkdir -p "/tmp/dnsmasq.d" rm -f "/tmp/dnsmasq.d/dnsmasq-unblockneteasemusic.conf" cat <<-EOF > "/tmp/dnsmasq.d/dnsmasq-unblockneteasemusic.conf" dhcp-option=252,http://${lan_addr}:${http_port}/proxy.pac -ipset=/.music.163.com/music -ipset=/interface.music.163.com/music -ipset=/interface3.music.163.com/music -ipset=/apm.music.163.com/music -ipset=/apm3.music.163.com/music +ipset=/.music.163.com/neteasemusic +ipset=/interface.music.163.com/neteasemusic +ipset=/interface3.music.163.com/neteasemusic +ipset=/apm.music.163.com/neteasemusic +ipset=/apm3.music.163.com/neteasemusic EOF - /etc/init.d/dnsmasq restart > "/dev/null" 2>&1 + /etc/init.d/dnsmasq reload > "/dev/null" 2>&1 - if ! ipset list music > "/dev/null"; then ipset create music hash:ip; fi + if ! ipset list "neteasemusic" > "/dev/null"; then ipset create "neteasemusic" hash:ip; fi curl -s "http://httpdns.n.netease.com/httpdns/v2/d?domain=music.163.com,interface.music.163.com,interface3.music.163.com,apm.music.163.com,apm3.music.163.com,clientlog.music.163.com,clientlog3.music.163.com" |grep -Eo '[0-9]+?\.[0-9]+?\.[0-9]+?\.[0-9]+?' |sort |uniq |awk '{print "ipset add music "$1}' |bash > "/dev/null" 2>&1 - iptables -t nat -N cloud_music - iptables -t nat -A cloud_music -d 0.0.0.0/8 -j RETURN - iptables -t nat -A cloud_music -d 10.0.0.0/8 -j RETURN - iptables -t nat -A cloud_music -d 127.0.0.0/8 -j RETURN - iptables -t nat -A cloud_music -d 169.254.0.0/16 -j RETURN - iptables -t nat -A cloud_music -d 172.16.0.0/12 -j RETURN - iptables -t nat -A cloud_music -d 192.168.0.0/16 -j RETURN - iptables -t nat -A cloud_music -d 224.0.0.0/4 -j RETURN - iptables -t nat -A cloud_music -d 240.0.0.0/4 -j RETURN - iptables -t nat -A cloud_music -p tcp --dport 80 -j REDIRECT --to-ports "${http_port}" - iptables -t nat -A cloud_music -p tcp --dport 443 -j REDIRECT --to-ports "${https_port}" - iptables -t nat -I PREROUTING -p tcp -m set --match-set music dst -j cloud_music + iptables -t nat -N "netease_cloud_music" + iptables -t nat -A "netease_cloud_music" -d "0.0.0.0/8" -j RETURN + iptables -t nat -A "netease_cloud_music" -d "10.0.0.0/8" -j RETURN + iptables -t nat -A "netease_cloud_music" -d "127.0.0.0/8" -j RETURN + iptables -t nat -A "netease_cloud_music" -d "169.254.0.0/16" -j RETURN + iptables -t nat -A "netease_cloud_music" -d "172.16.0.0/12" -j RETURN + iptables -t nat -A "netease_cloud_music" -d "192.168.0.0/16" -j RETURN + iptables -t nat -A "netease_cloud_music" -d "224.0.0.0/4" -j RETURN + iptables -t nat -A "netease_cloud_music" -d "240.0.0.0/4" -j RETURN + iptables -t nat -A "netease_cloud_music" -p tcp --dport 80 -j REDIRECT --to-ports "${http_port}" + iptables -t nat -A "netease_cloud_music" -p tcp --dport 443 -j REDIRECT --to-ports "${https_port}" + iptables -t nat -I PREROUTING -p tcp -m set --match-set "neteasemusic" dst -j "netease_cloud_music" - mkdir -p /var/etc + mkdir -p "/var/etc/" echo -e "/etc/init.d/unblockneteasemusic restart" > "/var/etc/unblockneteasemusic.include" elif [ "${set_type}" = "stop" ]; then - iptables -t nat -D PREROUTING -p tcp -m set --match-set music dst -j cloud_music - iptables -t nat -F cloud_music - iptables -t nat -X cloud_music - ipset destroy music + iptables -t nat -D PREROUTING -p tcp -m set --match-set "neteasemusic" dst -j "netease_cloud_music" + iptables -t nat -F "netease_cloud_music" + iptables -t nat -X "netease_cloud_music" + ipset destroy "neteasemusic" echo "" > "/var/etc/unblockneteasemusic.include" rm -f "/tmp/dnsmasq.d/dnsmasq-unblockneteasemusic.conf" - /etc/init.d/dnsmasq restart > "/dev/null" 2>&1 + /etc/init.d/dnsmasq reload > "/dev/null" 2>&1 fi } @@ -87,14 +90,14 @@ address=/apm.music.163.com/${lan_addr} address=/apm3.music.163.com/${lan_addr} address=/music.httpdns.c.163.com/0.0.0.0 EOF - /etc/init.d/dnsmasq restart > "/dev/null" 2>&1 + /etc/init.d/dnsmasq reload > "/dev/null" 2>&1 - ip route add 223.252.199.10 dev lo + ip route add "223.252.199.10" dev lo elif [ "${set_type}" = "stop" ]; then rm -f "/tmp/dnsmasq.d/dnsmasq-unblockneteasemusic.conf" - /etc/init.d/dnsmasq restart > "/dev/null" 2>&1 + /etc/init.d/dnsmasq reload > "/dev/null" 2>&1 - ip route del 223.252.199.10 + ip route del "223.252.199.10" fi } @@ -103,7 +106,7 @@ set_ports(){ iptables -I INPUT -p tcp --dport "${http_port}" -j ACCEPT iptables -I INPUT -p tcp --dport "${https_port}" -j ACCEPT - mkdir -p /var/etc + mkdir -p "/var/etc/" echo -e "/etc/init.d/unblockneteasemusic restart" > "/var/etc/unblockneteasemusic.include" elif [ "${set_type}" = "stop" ]; then iptables -D INPUT -p tcp --dport "${http_port}" -j ACCEPT @@ -119,7 +122,7 @@ start() [ "${enable}" -ne "1" ] && exit 0 - [ ! -e "/usr/share/unblockneteasemusic/core/app.js" ] && rm -f "/usr/share/unblockneteasemusic/local_ver" && bash "/usr/share/unblockneteasemusic/update_core.sh" + [ ! -e "/usr/share/unblockneteasemusic/core/app.js" ] && rm -f "/usr/share/unblockneteasemusic/local_ver" && bash "/usr/share/unblockneteasemusic/update.sh" "update_core_non_restart" [ ! -e "/usr/share/unblockneteasemusic/core/app.js" ] && echo "Core Not Found, please download it before starting." >> "/tmp/unblockneteasemusic.log" && exit 1 if [ "${music_source}" = "qq" ];then @@ -133,6 +136,9 @@ start() sed -i -e "1i const key = '${youtube_key}'" "/usr/share/unblockneteasemusic/core/provider/youtube.js" fi + [ -f "${self_issue_cert_crt}" ] && { [ "${self_issue_cert_crt}" != "/usr/share/unblockneteasemusic/core/server.crt" ] && ln -sf "${self_issue_cert_crt}" "/usr/share/unblockneteasemusic/core/server.crt"; } + [ -f "${self_issue_cert_key}" ] && { [ "${self_issue_cert_key}" != "/usr/share/unblockneteasemusic/core/server.key" ] && ln -sf "${self_issue_cert_key}" "/usr/share/unblockneteasemusic/core/server.key"; } + [ "${hijack_ways}" = "use_hosts" ] && { http_port="80"; https_port="443"; } if [ "${music_source}" = "default" ]; then nohup node "/usr/share/unblockneteasemusic/core/app.js" -a "${addr}" -p "${http_port}":"${https_port}" -e "${endpoint_url}" ${netease_server_ip} ${proxy_server_ip} ${strict_mode} >> "/tmp/unblockneteasemusic.log" 2>&1 & @@ -150,7 +156,7 @@ start() [ "*$(uci get unblockneteasemusic.@unblockneteasemusic[0].pub_access 2>"/dev/null")*" = "*1*" ] && set_ports > "/dev/null" 2>&1 sed -i '/unblockneteasemusic/d' /etc/crontabs/root - [ "${auto_update}" -eq "1" ] && echo "0 ${update_time} * * * /usr/share/unblockneteasemusic/update_core.sh" >> "/etc/crontabs/root" + [ "${auto_update}" -eq "1" ] && echo "0 ${update_time} * * * /usr/share/unblockneteasemusic/update.sh update_core" >> "/etc/crontabs/root" echo "*/5 * * * * /usr/share/unblockneteasemusic/log_check.sh" >> "/etc/crontabs/root" /etc/init.d/cron restart > "/dev/null" 2>&1 } @@ -163,7 +169,7 @@ stop() /etc/init.d/cron restart > "/dev/null" 2>&1 sed -i '/unblockneteasemusic/d' "/etc/sysupgrade.conf" - [ "${keep_core_when_upgrade}" -eq 1 ] && { echo "/usr/share/unblockneteasemusic/core/" >> "/etc/sysupgrade.conf"; echo "/usr/share/unblockneteasemusic/local_ver" >> "/etc/sysupgrade.conf"; } + [ "${keep_core_when_upgrade}" -eq "1" ] && { echo "/usr/share/unblockneteasemusic/core/" >> "/etc/sysupgrade.conf"; echo "/usr/share/unblockneteasemusic/local_ver" >> "/etc/sysupgrade.conf"; } rm -f "/tmp/unblockneteasemusic.log" diff --git a/package/ctcgfw/luci-app-unblockneteasemusic/root/usr/share/unblockneteasemusic/update.sh b/package/ctcgfw/luci-app-unblockneteasemusic/root/usr/share/unblockneteasemusic/update.sh new file mode 100755 index 0000000000..4fe9f89591 --- /dev/null +++ b/package/ctcgfw/luci-app-unblockneteasemusic/root/usr/share/unblockneteasemusic/update.sh @@ -0,0 +1,120 @@ +#!/bin/bash +# Created By [CTCGFW]Project OpenWRT +# https://github.com/project-openwrt + +function check_core_if_already_running(){ + running_tasks="$(ps |grep "unblockneteasemusic" |grep "update" |grep "core" |grep -v "grep" |awk '{print $1}' |wc -l)" + [ "${running_tasks}" -gt "2" ] && echo -e "\nA task is already running." >>/tmp/unblockneteasemusic.log && exit 2 +} + +function check_luci_if_already_running(){ + running_tasks="$(ps |grep "unblockneteasemusic" |grep "update" |grep "update_luci" |grep -v "grep" |awk '{print $1}' |wc -l)" + [ "${running_tasks}" -gt "2" ] && echo -e "\nA task is already running." >>/tmp/unblockneteasemusic.log && exit 2 +} + +function clean_log(){ + echo "" > /tmp/unblockneteasemusic.log +} + +function check_luci_latest_version(){ + luci_latest_ver="$(curl -s 'https://github.com/project-openwrt/luci-app-unblockneteasemusic/releases/latest'| grep -Eo '[0-9\.]+\-[0-9]+')" + [ -z "${luci_latest_ver}" ] && echo -e "\nFailed to check latest LuCI version, please try again later." >>/tmp/unblockneteasemusic.log && exit 1 + if [ "$(opkg info 'luci-app-unblockneteasemusic' |sed -n '2p' |tr -d 'Version: ')" != "${luci_latest_ver}" ]; then + clean_log + echo -e "Local LuCI version: $(opkg info 'luci-app-unblockneteasemusic' |sed -n '2p' |tr -d 'Version: '), cloud LuCI version: ${luci_latest_ver}." >>/tmp/unblockneteasemusic.log + update_luci + else + echo -e "\nLocal LuCI version: $(opkg info 'luci-app-unblockneteasemusic' |sed -n '2p' |tr -d 'Version: '), cloud LuCI version: ${luci_latest_ver}." >>/tmp/unblockneteasemusic.log + echo -e "You're already using the latest LuCI version." >>/tmp/unblockneteasemusic.log + exit 3 + fi +} + +function update_luci(){ + echo -e "Updating LuCI..." >>/tmp/unblockneteasemusic.log + + mkdir -p "/tmp" >/dev/null 2>&1 + + curl -sL "https://github.com/project-openwrt/luci-app-unblockneteasemusic/releases/download/v${luci_latest_ver}/luci-app-unblockneteasemusic_${luci_latest_ver}_all.ipk" -o "/tmp/luci-app-unblockneteasemusic_${luci_latest_ver}_all.ipk" >/dev/null 2>&1 + opkg install "/tmp/luci-app-unblockneteasemusic_${luci_latest_ver}_all.ipk" + rm -f "/tmp/luci-app-unblockneteasemusic_${luci_latest_ver}_all.ipk" + rm -rf "/tmp/luci-indexcache" "/tmp/luci-modulecache" + + if [ "$(opkg info 'luci-app-unblockneteasemusic' |sed -n '2p' |tr -d 'Version: ')" != "$1" ]; then + echo -e "Failed to update LuCI." >>/tmp/unblockneteasemusic.log + exit 1 + else + touch "/usr/share/unblockneteasemusic/update_luci_successfully" + fi + + echo -e "Succeeded in updating LuCI." >/tmp/unblockneteasemusic.log + echo -e "Current LuCI version: ${luci_latest_ver}.\n" >>/tmp/unblockneteasemusic.log +} + +function check_core_latest_version(){ + core_latest_ver="$(curl -s https://github.com/nondanee/UnblockNeteaseMusic/commits/master |tr -d '\n' |grep -Eo 'commit\/[0-9a-z]+' |sed -n 1p |sed 's#commit/##g')" + [ -z "${core_latest_ver}" ] && echo -e "\nFailed to check latest core version, please try again later." >>/tmp/unblockneteasemusic.log && exit 1 + if [ ! -e "/usr/share/unblockneteasemusic/core_local_ver" ]; then + clean_log + echo -e "Local version: NOT FOUND, cloud version: ${core_latest_ver}." >>/tmp/unblockneteasemusic.log + update_core + else + if [ "$(cat /usr/share/unblockneteasemusic/core_local_ver)" != "${core_latest_ver}" ]; then + clean_log + echo -e "Local core version: $(cat /usr/share/unblockneteasemusic/core_local_ver 2>/dev/null), cloud core version: ${core_latest_ver}." >>/tmp/unblockneteasemusic.log + update_core + else + echo -e "\nLocal core version: $(cat /usr/share/unblockneteasemusic/core_local_ver 2>/dev/null), cloud core version: ${core_latest_ver}." >>/tmp/unblockneteasemusic.log + echo -e "You're already using the latest core version." >>/tmp/unblockneteasemusic.log + exit 3 + fi + fi +} + +function update_core(){ + echo -e "Updating core..." >>/tmp/unblockneteasemusic.log + + mkdir -p "/usr/share/unblockneteasemusic/core" >/dev/null 2>&1 + rm -rf /usr/share/unblockneteasemusic/core/* >/dev/null 2>&1 + + curl -sL "https://github.com/nondanee/UnblockNeteaseMusic/archive/master.tar.gz" -o "/usr/share/unblockneteasemusic/core/core.tar.gz" >/dev/null 2>&1 + tar -zxf "/usr/share/unblockneteasemusic/core/core.tar.gz" -C "/usr/share/unblockneteasemusic/core/" >/dev/null 2>&1 + mv /usr/share/unblockneteasemusic/core/UnblockNeteaseMusic-master/* "/usr/share/unblockneteasemusic/core/" + rm -rf "/usr/share/unblockneteasemusic/core/core.tar.gz" "/usr/share/unblockneteasemusic/core/UnblockNeteaseMusic-master" >/dev/null 2>&1 + + if [ ! -e "/usr/share/unblockneteasemusic/core/app.js" ]; then + echo -e "Failed to download core." >>/tmp/unblockneteasemusic.log + exit 1 + else + [ "${update_core_from_luci}" == "y" ] && touch "/usr/share/unblockneteasemusic/update_core_successfully" + echo -e "${core_latest_ver}" > /usr/share/unblockneteasemusic/core_local_ver + [ "${non_restart}" != "y" ] && /etc/init.d/unblockneteasemusic restart + fi + + echo -e "Succeeded in updating core." >/tmp/unblockneteasemusic.log + echo -e "Current core version: ${core_latest_ver}.\n" >>/tmp/unblockneteasemusic.log +} + +case "$1" in + "update_luci") + check_luci_if_already_running + check_luci_latest_version + ;; + "update_core") + check_core_if_already_running + check_core_latest_version + ;; + "update_core_non_restart") + non_restart="y" + check_core_if_already_running + check_core_latest_version + ;; + "update_core_from_luci") + update_core_from_luci="y" + check_core_if_already_running + check_core_latest_version + ;; + *) + echo -e "Usage: ./update.sh {update_luci|update_core}" + ;; +esac \ No newline at end of file diff --git a/package/ctcgfw/luci-app-unblockneteasemusic/root/usr/share/unblockneteasemusic/update_core.sh b/package/ctcgfw/luci-app-unblockneteasemusic/root/usr/share/unblockneteasemusic/update_core.sh deleted file mode 100755 index ee3701e8db..0000000000 --- a/package/ctcgfw/luci-app-unblockneteasemusic/root/usr/share/unblockneteasemusic/update_core.sh +++ /dev/null @@ -1,64 +0,0 @@ -#!/bin/bash -# Created By [CTCGFW]Project OpenWRT -# https://github.com/project-openwrt - -function check_if_already_running(){ - running_tasks="$(ps |grep "unblockneteasemusic" |grep "update_core" |grep -v "grep" |awk '{print $1}' |wc -l)" - [ "${running_tasks}" -gt "2" ] && echo -e "\nA task is already running." >>/tmp/unblockneteasemusic.log && exit 2 -} - -function clean_log(){ - echo "" > /tmp/unblockneteasemusic.log -} - -function check_latest_version(){ - latest_ver="$(curl -s https://github.com/nondanee/UnblockNeteaseMusic/commits/master |tr -d '\n' |grep -Eo 'commit\/[0-9a-z]+' |sed -n 1p |sed 's#commit/##g')" - [ -z "${latest_ver}" ] && echo -e "\nFailed to check latest version, please try again later." >>/tmp/unblockneteasemusic.log && exit 1 - if [ ! -e "/usr/share/unblockneteasemusic/local_ver" ]; then - clean_log - echo -e "Local version: NOT FOUND, cloud version: ${latest_ver}." >>/tmp/unblockneteasemusic.log - update_core - else - if [ "$(cat /usr/share/unblockneteasemusic/local_ver)" != "${latest_ver}" ]; then - clean_log - echo -e "Local version: $(cat /usr/share/unblockneteasemusic/local_ver 2>/dev/null), cloud version: ${latest_ver}." >>/tmp/unblockneteasemusic.log - update_core - else - echo -e "\nLocal version: $(cat /usr/share/unblockneteasemusic/local_ver 2>/dev/null), cloud version: ${latest_ver}." >>/tmp/unblockneteasemusic.log - echo -e "You're already using the latest version." >>/tmp/unblockneteasemusic.log - exit 3 - fi - fi -} - -function update_core(){ - echo -e "Updating core..." >>/tmp/unblockneteasemusic.log - - mkdir -p "/usr/share/unblockneteasemusic/core" >/dev/null 2>&1 - rm -rf /usr/share/unblockneteasemusic/core/* >/dev/null 2>&1 - - curl -L "https://github.com/nondanee/UnblockNeteaseMusic/archive/master.tar.gz" -o "/usr/share/unblockneteasemusic/core/core.tar.gz" >/dev/null 2>&1 - tar -zxf "/usr/share/unblockneteasemusic/core/core.tar.gz" -C "/usr/share/unblockneteasemusic/core/" >/dev/null 2>&1 - mv /usr/share/unblockneteasemusic/core/UnblockNeteaseMusic-master/* "/usr/share/unblockneteasemusic/core/" - rm -rf "/usr/share/unblockneteasemusic/core/core.tar.gz" "/usr/share/unblockneteasemusic/core/UnblockNeteaseMusic-master" >/dev/null 2>&1 - - if [ ! -e "/usr/share/unblockneteasemusic/core/app.js" ]; then - echo -e "Failed to download core." >>/tmp/unblockneteasemusic.log - exit 1 - else - [ "${luci_update}" == "y" ] && touch "/usr/share/unblockneteasemusic/update_successfully" - echo -e "${latest_ver}" > /usr/share/unblockneteasemusic/local_ver - /etc/init.d/unblockneteasemusic restart - fi - - echo -e "Succeeded in updating core." >/tmp/unblockneteasemusic.log - echo -e "Current version: ${latest_ver}.\n" >>/tmp/unblockneteasemusic.log -} - -function main(){ - check_if_already_running - check_latest_version -} - - [ "$1" == "luci_update" ] && luci_update="y" - main diff --git a/package/ctcgfw/luci-theme-argon/Makefile b/package/ctcgfw/luci-theme-argon/Makefile index 11c8c49f2b..dd415ef369 100644 --- a/package/ctcgfw/luci-theme-argon/Makefile +++ b/package/ctcgfw/luci-theme-argon/Makefile @@ -8,8 +8,8 @@ include $(TOPDIR)/rules.mk LUCI_TITLE:=Argon Theme LUCI_DEPENDS:= -PKG_VERSION:=2.0 -PKG_RELEASE:=20200131 +PKG_VERSION:=2.1 +PKG_RELEASE:=20200206 include $(TOPDIR)/feeds/luci/luci.mk diff --git a/package/ctcgfw/luci-theme-argon/htdocs/luci-static/argon/cascade.css b/package/ctcgfw/luci-theme-argon/htdocs/luci-static/argon/cascade.css index 8ac7cf751f..8b9f9c4e92 100644 --- a/package/ctcgfw/luci-theme-argon/htdocs/luci-static/argon/cascade.css +++ b/package/ctcgfw/luci-theme-argon/htdocs/luci-static/argon/cascade.css @@ -25,7 +25,7 @@ */ @import url("custom.css?v=1"); /* - * Icon Css and Fonts + * Icon Css and Fonts */ @font-face { font-family: 'argon'; @@ -356,9 +356,10 @@ button, select, input, .cbi-dropdown { + line-height: 1.5rem; height: 2.5rem; padding: 0.625rem 0.75rem; - margin: 0.25rem 0; + margin: 0.25rem 0.1rem; color: #8898aa; border: 1px solid #dee2e6; border-radius: 0.25rem; @@ -607,11 +608,23 @@ header .fill .status * { margin-bottom: 1em; padding: 1rem; border: 0; - border-radius: 0 !important; + border-radius: 0.375rem !important; background-color: #fff; box-shadow: 0 2px 2px 0 rgba(0, 0, 0, 0.16), 0 0 2px 0 rgba(0, 0, 0, 0.12); text-shadow: 1px 1px rgba(0, 0, 0, 0.1); } +.alert.error, +.alert-message.error { + background-color: #ffd600; +} +.alert h4, +.alert-message h4 { + padding: 0rem 1.5rem 0.75rem 0rem; +} +.alert .btn, +.alert-message .btn { + height: auto; +} .alert-message > h4 { font-size: 110%; font-weight: bold; @@ -1532,10 +1545,13 @@ body:not(.Interfaces) .cbi-rowstyle-2:first-child { .cbi-dropdown > ul.preview { display: none; } -.cbi-dropdown > ul.preview li { +.cbi-button-apply > ul.preview { + display: none; +} +.cbi-button-apply > ul.preview li { color: #fff; } -.cbi-dropdown > ul:first-child li { +.cbi-button-apply > ul:first-child li { color: #fff; } .cbi-dropdown > .open { @@ -2264,18 +2280,24 @@ input[name="nslookup"] { .node-main-login .main .main-right #maincontent .container .alert-message.error { position: absolute; color: #fff; - width: calc(100% - 4rem); + width: calc(100% - 2rem); background-color: #f0ad4e; border-color: #eea236; box-sizing: border-box; - margin-top: 8rem; - border-radius: 5px; - padding: 1rem 2rem; + margin-top: -7rem; + border-radius: 5px !important; + padding: 1rem 2rem 0.5rem 2rem; text-align: center; } .node-main-login .main .main-right #maincontent .container .alert-message.error p { color: #fff; } +.node-main-login .main .main-right #maincontent .container .alert-message.error h4 { + font-size: 1rem; +} +.node-main-login .main .main-right #maincontent .container .alert-message.error .btn { + height: auto; +} .node-main-login .main .main-right #maincontent .container .cbi-map h2 { width: 120px; height: 120px; diff --git a/package/ctcgfw/luci-theme-argon/htdocs/luci-static/argon/cascade.css.map b/package/ctcgfw/luci-theme-argon/htdocs/luci-static/argon/cascade.css.map index 880b888acf..e2a8a32717 100644 --- a/package/ctcgfw/luci-theme-argon/htdocs/luci-static/argon/cascade.css.map +++ b/package/ctcgfw/luci-theme-argon/htdocs/luci-static/argon/cascade.css.map @@ -1 +1 @@ -{"version":3,"sources":["cascade.less"],"names":[],"mappings":"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"} \ No newline at end of file +{"version":3,"sources":["cascade.less"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/package/ctcgfw/luci-theme-argon/htdocs/luci-static/argon/cascade.less b/package/ctcgfw/luci-theme-argon/htdocs/luci-static/argon/cascade.less index ee6cd50832..3e77071c14 100644 --- a/package/ctcgfw/luci-theme-argon/htdocs/luci-static/argon/cascade.less +++ b/package/ctcgfw/luci-theme-argon/htdocs/luci-static/argon/cascade.less @@ -29,7 +29,7 @@ @import url("custom.css?v=1"); /* - * Icon Css and Fonts + * Icon Css and Fonts */ @font-face { font-family: 'argon'; @@ -417,9 +417,10 @@ button, select, input, .cbi-dropdown { + line-height: 1.5rem; height: 2.5rem; padding: .625rem .75rem; - margin: 0.25rem 0; + margin: 0.25rem 0.1rem; color: #8898aa; border: 1px solid #dee2e6; @@ -714,10 +715,22 @@ header { margin-bottom: 1em; padding: 1rem; border: 0; - border-radius: 0 !important; + border-radius: 0.375rem !important; background-color: #fff; box-shadow: 0 2px 2px 0 rgba(0, 0, 0, .16), 0 0 2px 0 rgba(0, 0, 0, .12); text-shadow: 1px 1px rgba(0, 0, 0, .1); + + &.error{ + background-color: #ffd600; + } + + h4{ + padding: 0rem 1.5rem 0.75rem 0rem; + } + + .btn{ + height: auto; + } } .alert-message>h4 { @@ -1809,13 +1822,17 @@ body:not(.Interfaces) .cbi-rowstyle-2:first-child { .cbi-dropdown>ul.preview { display: none; +} +.cbi-button-apply>ul.preview { + display: none; + li { color: #fff; } } -.cbi-dropdown>ul:first-child { +.cbi-button-apply>ul:first-child { li { color: #fff; } @@ -2679,17 +2696,23 @@ input[name="nslookup"] { &.error { position: absolute; color: #fff; - width: calc(100% - 4rem); + width: calc(100% - 2rem); background-color: #f0ad4e; border-color: #eea236; box-sizing: border-box; - margin-top: 8rem; - border-radius: 5px; - padding: 1rem 2rem; + margin-top: -7rem; + border-radius: 5px !important; + padding: 1rem 2rem 0.5rem 2rem; text-align: center; p{ color: #fff; } + h4{ + font-size: 1rem; + } + .btn{ + height: auto; + } } } diff --git a/package/ctcgfw/luci-theme-argon/htdocs/luci-static/argon/js/script.js b/package/ctcgfw/luci-theme-argon/htdocs/luci-static/argon/js/script.js index 235e848e1c..b1524eacd0 100644 --- a/package/ctcgfw/luci-theme-argon/htdocs/luci-static/argon/js/script.js +++ b/package/ctcgfw/luci-theme-argon/htdocs/luci-static/argon/js/script.js @@ -1,21 +1,24 @@ /** - * Material is a clean HTML5 theme for LuCI. It is based on luci-theme-bootstrap and MUI + * Argon is a clean HTML5 theme for LuCI. It is based on luci-theme-material and Argon Template * - * luci-theme-material - * Copyright 2015 Lutty Yang + * luci-theme-argon + * Copyright 2019 Jerrykuku * - * Have a bug? Please create an issue here on GitHub! - * https://github.com/LuttyYang/luci-theme-material/issues + * Have a bug? Please create an issue here on GitHub! + * https://github.com/jerrykuku/luci-theme-argon/issues * - * luci-theme-bootstrap: - * Copyright 2008 Steven Barth - * Copyright 2008 Jo-Philipp Wich - * Copyright 2012 David Menting + * luci-theme-material: + * Copyright 2015 Lutty Yang + * https://github.com/LuttyYang/luci-theme-material/ * - * MUI: - * https://github.com/muicss/mui + * Agron Theme + * https://demos.creative-tim.com/argon-dashboard/index.html * - * Licensed to the public under the Apache License 2.0 + * Login background + * https://unsplash.com/ + * Font generate by Icomoon + * + * Licensed to the public under the Apache License 2.0 */ document.addEventListener('luci-loaded', function(ev) { diff --git a/package/ctcgfw/luci-theme-argon/luasrc/view/themes/argon/footer.htm b/package/ctcgfw/luci-theme-argon/luasrc/view/themes/argon/footer.htm index 615620f7db..8b58ab05d7 100644 --- a/package/ctcgfw/luci-theme-argon/luasrc/view/themes/argon/footer.htm +++ b/package/ctcgfw/luci-theme-argon/luasrc/view/themes/argon/footer.htm @@ -16,27 +16,11 @@ Licensed to the public under the Apache License 2.0 -%> -<% - local ver = require "luci.version" - local disp = require "luci.dispatcher" - local request = disp.context.path - local category = request[1] - local tree = disp.node() - local categories = disp.node_childs(tree) -%> +<% local ver = require "luci.version" %>
@@ -44,8 +28,8 @@ // thanks for Jo-Philipp Wich var luciLocation = <%= luci.http.write_json(luci.dispatcher.context.path) %>; - - + + diff --git a/package/ctcgfw/luci-theme-argon/luasrc/view/themes/argon/header.htm b/package/ctcgfw/luci-theme-argon/luasrc/view/themes/argon/header.htm index 7ac5770428..d71bcb3c04 100644 --- a/package/ctcgfw/luci-theme-argon/luasrc/view/themes/argon/header.htm +++ b/package/ctcgfw/luci-theme-argon/luasrc/view/themes/argon/header.htm @@ -17,146 +17,24 @@ -%> <% - local sys = require "luci.sys" + local sys = require "luci.sys" local util = require "luci.util" local http = require "luci.http" local disp = require "luci.dispatcher" - local fs = require "nixio.fs" - local nutil = require "nixio.util" local boardinfo = util.ubus("system", "board") - local request = disp.context.path - local request2 = disp.context.request - - local category = request[1] - local cattree = category and disp.node(category) - - local leaf = request2[#request2] - - local tree = disp.node() local node = disp.context.dispatched - - local categories = disp.node_childs(tree) - - local c = tree - local i, r - - -- tag all nodes leading to this page - for i, r in ipairs(request) do - if c.nodes and c.nodes[r] then - c = c.nodes[r] - c._menu_selected = true - end - end - + + local fs = require "nixio.fs" + local nutil = require "nixio.util" + + + -- send as HTML5 http.prepare_content("text/html") - - local function nodeurl(prefix, name, query) - local u = url(prefix, name) - if query then - u = u .. http.build_querystring(query) - end - return pcdata(u) - end - - local function render_tabmenu(prefix, node, level) - if not level then - level = 1 - end - - local childs = disp.node_childs(node) - if #childs > 0 then - if level > 2 then - write('
    ') - end - - local selected_node - local selected_name - local i, v - - for i, v in ipairs(childs) do - local nnode = node.nodes[v] - if nnode._menu_selected then - selected_node = nnode - selected_name = v - end - - if level > 2 then - write('
  • %s
  • ' %{ - v, (nnode._menu_selected or (node.leaf and v == leaf)) and 'active' or '', - nodeurl(prefix, v, nnode.query), - striptags(translate(nnode.title)) - }) - end - end - - if level > 2 then - write('
') - end - - if selected_node then - render_tabmenu(prefix .. "/" .. selected_name, selected_node, level + 1) - end - end - end - - local function render_submenu(prefix, node) - local childs = disp.node_childs(node) - if #childs > 0 then - write('
    ') - - for i, r in ipairs(childs) do - local nnode = node.nodes[r] - local title = striptags(translate(nnode.title)) - - write('
  • %s
  • ' %{ - title, - nodeurl(prefix, r, nnode.query), - title - }) - end - - write('
') - end - end - - local function render_topmenu() - local childs = disp.node_childs(cattree) - if #childs > 0 then - write('') - end - end - - math.randomseed(os.time()) + + math.randomseed(os.time()) function glob(...) local iter, code, msg = fs.glob(...) if iter then @@ -167,16 +45,21 @@ end local bgcount = 0 - for f in ipairs(glob("/www/luci-static/material/img/*")) do + for f in ipairs(glob("/www/luci-static/argon/img/*")) do bgcount = bgcount + 1 end + + -%> + - <%=striptags( (boardinfo.hostname or "?") .. ( (node and node.title) and ' - ' .. translate(node.title) or '')) %> - LuCI - + + <%=striptags( (boardinfo.hostname or "?") .. ( (node and node.title) and ' - ' .. translate(node.title) or '')) %> + - LuCI + @@ -184,82 +67,219 @@ - LuCI"> - LuCI"> - - - - + + + + <% if node and node.css then %> - + <% end -%> <% if css then %> - + <% end -%> - - - - -"> + + + + + + +"> + +
+
+
+
+
+
+
+
+
+ +
+
+
+
+ + <%=boardinfo.hostname or "?"%> ™ +
+ +
+
+
+
+
+ +
+
+ <%- if luci.sys.process.info("uid") == 0 and luci.sys.user.getuser("root") and not luci.sys.user.getpasswd("root") then -%> +

<%:No password set!%>

-

<%:There is no password set on this router. Please configure a root password to protect the web interface and enable SSH.%>

+

<%:There is no password set on this router. Please configure a root password to protect the web interface and enable SSH.%> +

<% if disp.lookup("admin/system/admin") then %> - + <% end %>
- <%- end -%> + <%- end -%> - + - <% if category then render_tabmenu(category, cattree) end %> + \ No newline at end of file diff --git a/package/ctcgfw/openwrt-udpspeeder/Makefile b/package/ctcgfw/openwrt-udpspeeder/Makefile index 8f2dff7a0a..c8654ce354 100644 --- a/package/ctcgfw/openwrt-udpspeeder/Makefile +++ b/package/ctcgfw/openwrt-udpspeeder/Makefile @@ -52,6 +52,7 @@ endef define Package/speederv2-tunnel/install $(INSTALL_DIR) $(1)/usr/bin $(INSTALL_BIN) $(PKG_BUILD_DIR)/speederv2_cross $(1)/usr/bin/speederv2 + ( cd $(1)/usr/bin; $(LN) speederv2 udpspeeder; ) endef $(eval $(call BuildPackage,speederv2-tunnel))