local j=require("luci.jsonc") local u=require("luci.model.uci").cursor() local r=j.parse([==[{"proxy": ["geosite:youtube", "geosite:telegram", "domain:telegram.org", "domain:t.me", "domain:telegram.me", "domain:tdesktop.com", "domain:telesco.pe", "domain:telegram.dog", "domain:telegra.ph", "domain:youtube.com", "domain:m.youtube.com", "domain:youtu.be", "domain:youtube.googleapis.com", "domain:youtubei.googleapis.com", "domain:youtubeembeddedplayer.googleapis.com", "domain:jnn-pa.googleapis.com", "domain:wide-youtube.l.google.com", "domain:youtube-ui.l.google.com", "domain:yt-video-upload.l.google.com", "domain:ytimg.l.google.com", "domain:googlevideo.com", "domain:ytimg.com", "domain:yt3.ggpht.com", "domain:yt4.ggpht.com", "domain:yt3.googleusercontent.com", "domain:yt1.ggpht.com", "domain:yt2.ggpht.com", "domain:ggpht.com", "domain:music.youtube.com", "domain:ytmusic.google.com", "domain:music.googleapis.com", "domain:music-storage.googleapis.com", "domain:openai.com", "domain:chatgpt.com", "domain:oaistatic.com", "domain:rockblack.su", "domain:www.youtube.com", "domain:rutracker.org", "domain:googleapis.com", "domain:auth.openai.com", "domain:instagram.com", "domain:twitter.com", "domain:facebook.com", "domain:x.com", "domain:twimg.com", "domain:cdninstagram.com", "domain:ntc.party", "domain:dis.gd", "domain:discord.co", "domain:discord.com", "domain:discord.design", "domain:discord.dev", "domain:discord.gg", "domain:discord.gift", "domain:discord.gifts", "domain:discord.media", "domain:discord.new", "domain:discord.store", "domain:discord.tools", "domain:discordapp.com", "domain:discordapp.net", "domain:discordmerch.com", "domain:discordpartygames.com", "domain:discord-activities.com", "domain:discordactivities.com", "domain:discordsays.com", "domain:discordstatus.com", "domain:discordcdn.com", "domain:nperf.com", "domain:habr.com", "domain:rt.pornhub.org", "domain:drive.proton.me", "domain:play.google.com", "domain:play-apps-features.googleusercontent.com", "domain:play-lh.googleusercontent.com", "domain:play-fe.googleapis.com", "domain:vrmodels.store", "domain:autodesk.com", "domain:speedtest.net", "domain:mega.nz", "domain:workers.dev", "domain:yandex.by", "regexp:(^|\\.)babble\\.[^.]+$", "domain:stable.dl2.discordapp.net", "domain:forum.ripper.store", "domain:apkmirror.com", "domain:helpdesk.dotzf.ru", "domain:vcc.vrcfury.com", "domain:orangefox.download", "domain:wiki.itsvixano.me", "domain:files.itsvixano.me", "full:cloudflare.com", "full:cloudflare.net", "full:cdnjs.cloudflare.com", "full:pages.dev", "full:trycloudflare.com", "full:workers.dev", "full:chatgpt.com"], "direct": ["domain:graph.org", "domain:steamcdn-a.akamaihd.net", "domain:steamcontent.com", "domain:steamusercontent-a.akamaihd.net"], "ips": ["103.21.244.0/22", "103.22.200.0/22", "103.31.4.0/22", "104.16.0.0/13", "104.24.0.0/14", "108.162.192.0/18", "131.0.72.0/22", "141.101.64.0/18", "162.158.0.0/15", "172.64.0.0/13", "173.245.48.0/20", "188.114.96.0/20", "190.93.240.0/20", "197.234.240.0/22", "198.41.128.0/17"]}]==]) local function rule(name,label,domains,ips,protocol,dest) u:section("passwall2","shunt_rules",name,{remarks=label,network="tcp,udp"}) if domains then u:set("passwall2",name,"domain_list",table.concat(domains,"\n")) end if ips then u:set("passwall2",name,"ip_list",table.concat(ips,"\n")) end if protocol then u:set("passwall2",name,"protocol",protocol) end u:set("passwall2","rulenode",name,dest) end rule("UserDirect","Direct exceptions",r.direct,nil,nil,"_direct") rule("UserBitTorrent","BitTorrent direct",nil,nil,"bittorrent","_direct") rule("UserProxy","User proxy rules",r.proxy,r.ips,nil,"Ziur7TjM") u:delete("passwall2","rulenode","YouTube") u:set("passwall2","rulenode","default_node","_direct") u:reorder("passwall2","UserProxy",0) u:reorder("passwall2","UserBitTorrent",0) u:reorder("passwall2","UserDirect",0) u:commit("passwall2") print("Rules saved")