1.Support i18n 2.add English feature file,support filtering youtube,facebook,etc.

This commit is contained in:
derry 2021-08-31 20:26:17 +08:00
parent d073dd9c0e
commit 04b701357c
16 changed files with 288 additions and 121 deletions

View File

@ -8,14 +8,11 @@ function index()
end
local page
--hide save button
page = entry({"admin", "network", "appfilter"}, arcombine(cbi("appfilter/appfilter"), cbi("appfilter/dev_status", {hideapplybtn=true, hidesavebtn=true, hideresetbtn=true})), _("appfilter"), 100)
page = entry({"admin", "network", "appfilter"}, arcombine(cbi("appfilter/appfilter"), cbi("appfilter/dev_status", {hideapplybtn=true, hidesavebtn=true, hideresetbtn=true})), _("App Filter"), 100)
page.leaf = true
page.subindex = true
--page.dependent = true
page = entry({"admin", "network", "user_status"}, call("user_status"), nil)
page.leaf = true
@ -114,8 +111,6 @@ function user_status()
hostname=get_hostname_by_mac(user_array[i].mac),
appid=visit_array[j].appid,
appname=get_app_name_by_id(visit_array[j].appid),
--total_num=visit_array[j].total_num,
--drop_num=visit_array[j].drop_num,
total_num=0,
drop_num=0,
latest_action=visit_array[j].latest_action,

View File

@ -14,56 +14,43 @@ local SYS = require "luci.sys"
local m, s
m = Map("appfilter",
translate("appfilter"),
translate("App Filter"),
translate(""))
s = m:section(TypedSection, "global", translate("Basic Settings"))
s:option(Flag, "enable", translate("Enable App Filter"),translate(""))
um = s:option(DummyValue, "")
um.template="cbi/oaf_dvalue"
local fullcone=SYS.exec("uci get firewall.@defaults[0].fullcone");
local bbr=SYS.exec("uci get flowoffload.@flow[0].bbr");
local flow_offloading=SYS.exec("uci get flowoffload.@flow[0].flow_offloading");
if string.match(fullcone, "1") or string.match(bbr, "1") or string.match(flow_offloading, "1") then
um.value="运行环境检测失败请先关闭ACC加速模块!"
end
s.anonymous = true
local rule_count=0
local version=""
if nixio.fs.access("/etc/appfilter/feature.cfg") then
rule_count=tonumber(SYS.exec("cat /etc/appfilter/feature.cfg | wc -l"))
version=SYS.exec("cat /etc/appfilter/feature.cfg |grep \"#version\" | awk '{print $2}'")
if nixio.fs.access("/tmp/feature.cfg") then
rule_count=tonumber(SYS.exec("cat /tmp/feature.cfg | wc -l"))
version=SYS.exec("cat /tmp/feature.cfg |grep \"#version\" | awk '{print $2}'")
end
local display_str="<strong>当前版本: </strong>"..version.."<br><strong>特征码个数:</strong> "..rule_count.."<br><strong> 下载地址:</strong><a href=\"https://destan19.github.io\">https://destan19.github.io</a>"
s = m:section(TypedSection, "feature", translate("特征库更新"), display_str )
local display_str="<strong>"..translate("Current Version")..": </strong>"..version.."<br><strong>"..translate("App Feature Num")..":</strong> "..rule_count
s = m:section(TypedSection, "feature", translate("Update feature"), display_str )
fu = s:option(FileUpload, "")
fu.template = "cbi/oaf_upload"
s.anonymous = true
um = s:option(DummyValue, "rule_data")
um.template="cbi/oaf_dvalue"
s=m:section(TypedSection,"time",translate("时间控制")) s.anonymous = true
hv = s:option(Value, "start_time", translate("开始时间")) hv.default="00:00"
s=m:section(TypedSection,"time",translate("Time Setting")) s.anonymous = true
hv = s:option(Value, "start_time", translate("Start Time")) hv.default="00:00"
hv.optional=false
hv = s:option(Value, "end_time", translate("结束时间")) hv.default="23:59"
hv = s:option(Value, "end_time", translate("End Time")) hv.default="23:59"
hv.optional=false days = s:option(MultiValue, "days", "", translate(""))
days.widget="checkbox" days.size=10
days:value("0", "周日");
days:value("1", "周一");
days:value("2", "周二");
days:value("3", "周三");
days:value("4", "周四");
days:value("5", "周五");
days:value("6", "周六");
--um.value =rule_count .. " " .. translate("Records").. " "..version
days:value("0", translate("Sun"));
days:value("1", translate("Mon"));
days:value("2", translate("Tue"));
days:value("3", translate("Wed"));
days:value("4", translate("Thur"));
days:value("5", translate("Fri"));
days:value("6", translate("Sat"));
s = m:section(TypedSection, "appfilter", translate("App Filter Rules"))
s.anonymous = true
@ -80,13 +67,9 @@ if class_fd then
end
class = path:match("([^/]+)%.class$")
-- add a tab
s:tab(class, translate(class))
-- multi value option
apps = s:taboption(class, MultiValue, class.."apps", translate(""))
apps.rmempty=true
--apps.delimiter=";"
-- select
apps.widget="checkbox"
apps.size=10
@ -121,9 +104,6 @@ if class_fd then
class_fd:close()
end
function get_hostname_by_mac(dst_mac)
leasefile="/tmp/dhcp.leases"
local fd = io.open(leasefile, "r")
@ -143,6 +123,7 @@ function get_hostname_by_mac(dst_mac)
fd:close()
return nil
end
function get_cmd_result(command)
local fd
local result
@ -213,14 +194,22 @@ http.setfilehandler(
local line=fd2:read("*l");
fd2:close()
local ret=string.match(line, "#version")
local lang=m.uci:get_all("luci.main.lang")
local feature_file=""
if "" == lang or "auto" == lang then
feature_file="/etc/appfilter/feature.cfg"
else
feature_file="/etc/appfilter/feature_"..lang..".cfg"
end
if ret ~= nil then
local cmd="cp /tmp/upload/"..meta.file.." /etc/appfilter/feature.cfg";
local cmd="cp /tmp/upload/"..meta.file.." "..feature_file;
os.execute(cmd);
os.execute("chmod 666 "..feature_file);
os.execute("rm /tmp/appfilter -fr");
luci.sys.exec("/etc/init.d/appfilter restart &");
um.value = translate("更新成功,请刷新页面!")
um.value = translate("Update the feature file successfully, please refresh the page")
else
um.value = translate("更新失败,格式错误!")
um.value = translate("Failed to update feature file, format error")
end
os.execute("rm /tmp/upload/* -fr");
end
@ -236,6 +225,4 @@ if luci.http.formvalue("upload") then
elseif luci.http.formvalue("download") then
Download()
end
return m

View File

@ -13,7 +13,7 @@ local jsc = require "luci.jsonc"
local m, s
arg[1] = arg[1] or ""
m = Map("appfilter",
translate("上网统计("..arg[1]..")"),
translate("Data Statistics").."("..arg[1]..")",
translate(""))
local v

View File

@ -51,11 +51,11 @@ table.imagetable td {
var total_time_str;
if (hour > 0)
total_time_str=hour + "小时" + min + "分"
total_time_str=hour + "<%:h%>" + min + "<%:m%>"
else{
if (min == 0 && seconds2 != 0)
min = 1;
total_time_str=min + ""
total_time_str=min + "<%:m%>"
}
return total_time_str;
}
@ -82,7 +82,7 @@ table.imagetable td {
option = {
title: [
{
text: 'APP时间统计',
text: "<%:App Time Statistics%>",
textStyle: {
fontSize: 16,
color: "black"
@ -110,8 +110,8 @@ table.imagetable td {
var total_time = get_display_time(parms.data.value);
var str= parms.seriesName+"</br>"+
parms.marker+""+parms.data.legendname+"</br>"+
"时间:"+ total_time+"</br>"+
"占比:"+ parms.percent+"%";
"<%:Visit Time%>: "+ total_time+"</br>"+
"<%:Percentage%>: "+ parms.percent+"%";
return str ;
}
},
@ -128,11 +128,11 @@ table.imagetable td {
},
series: [
{
name: "访问时间",
name: "<%:Visit Time%>",
type:'pie',
center: ['35%', '50%'],
radius: ['40%', '65%'],
clockwise: false, //饼图的扇区是否是顺时针排布
clockwise: false,
avoidLabelOverlap: false,
label: {
normal: {
@ -164,8 +164,6 @@ table.imagetable td {
var m2R2Data=new Array()
var total_time=0
for(var i = 0; i < data.length; i++){
console.log("begin display222.");
var dev_obj = data[i];
if (dev_obj.visit_time == 0)
continue;
@ -186,7 +184,7 @@ table.imagetable td {
option = {
title: [
{
text: 'APP分类时间统计',
text: "<%:App classification time statistics%>",
textStyle: {
fontSize: 16,
color: "black"
@ -213,9 +211,8 @@ table.imagetable td {
formatter:function (parms){
var total_time = get_display_time(parms.data.value);
var str= parms.seriesName+"</br>"+
parms.marker+""+parms.data.legendname+"</br>"+
"时间:"+ total_time +"</br>"+
"占比:"+ parms.percent+"%";
parms.marker+""+parms.data.legendname+"</br>"+"<%:Visit Time%>: "+ total_time +"</br>" +
"<%:Percentage%>: "+ parms.percent+"%";
return str ;
}
},
@ -232,11 +229,11 @@ table.imagetable td {
},
series: [
{
name:'访问时间',
name:"<%:Visit Time%>",
type:'pie',
center: ['35%', '50%'],
radius: ['40%', '65%'],
clockwise: false, //饼图的扇区是否是顺时针排布
clockwise: false,
avoidLabelOverlap: false,
label: {
normal: {
@ -289,12 +286,12 @@ table.imagetable td {
{
var action_status=""
if(st[i].latest_action == 1)
action_status="已过滤"
action_status="<%:Filtered%>"
else
action_status="未过滤"
action_status="<%:Unfiltered%>"
var hostname=""
if(st[i].hostname == "" || st[i].hostname == "*"){
hostname="?";
hostname="--";
}
else{
hostname=st[i].hostname;
@ -313,11 +310,11 @@ table.imagetable td {
total_time_str="-"
else {
if (hour > 0)
total_time_str=hour + "小时" + min + "分"
total_time_str=hour + "<%:h%>" + min + "<%:m%>"
else{
if (min == 0)
min = 1;
total_time_str=min + ""
total_time_str=min + "<%:m%>"
}
}
@ -331,6 +328,7 @@ table.imagetable td {
//]]></script>
<fieldset class="cbi-section">
<div id="display">
<div id="main" style="width: 500px;height:300px;"></div>
@ -338,12 +336,12 @@ table.imagetable td {
</div>
<table class="imagetable" id="user_status_table">
<tr>
<th ><%:App%></th>
<th ><%:主机名%></th>
<th ><%:mac地址%></th>
<th><%:开始时间%></th>
<th><%:访问时长%></th>
<th><%:过滤状态%></th>
<th ><%:App Name%></th>
<th ><%:Hostname%></th>
<th ><%:Mac%></th>
<th><%:Start Time%></th>
<th><%:Visit Time%></th>
<th><%:Filter Status%></th>
</tr>
<tr>
<td colspan="8"><em><br /><%:Collecting data...%></em></td>

View File

@ -42,7 +42,7 @@ table.imagetable td {
{
var hostname=""
if(devlist[i].hostname == "" || devlist[i].hostname == "*"){
hostname="?";
hostname="--";
}
else{
hostname=devlist[i].hostname;
@ -65,9 +65,9 @@ table.imagetable td {
}
tr.insertCell(-1).innerHTML = app_list_str;
if (devlist[i].online == 1)
tr.insertCell(-1).innerHTML = "在线";
tr.insertCell(-1).innerHTML = "<%:Online%>";
else
tr.insertCell(-1).innerHTML = "离线";
tr.insertCell(-1).innerHTML = "<%:Offline%>";
}
}
}
@ -77,15 +77,15 @@ table.imagetable td {
<fieldset class="cbi-section">
<legend><%:终端列表%></legend>
<legend><%:Client List%></legend>
<table class="imagetable" id="user_status_table">
<tr>
<th ><%:编号%></th>
<th ><%:主机名%></th>
<th ><%:mac地址%></th>
<th ><%:ip地址%></th>
<th><%:常用APP(TOP5)%></th>
<th><%:在线状态%></th>
<th ><%:Id%></th>
<th ><%:Hostname%></th>
<th ><%:Mac%></th>
<th ><%:Ip%></th>
<th><%:Common App(TOP5)%></th>
<th><%:Online Status%></th>
</tr>
<tr>
<td colspan="8"><em><br /><%:Collecting data...%></em></td>

View File

@ -1,5 +1,5 @@
<%+cbi/valueheader%>
<label class="cbi-value" style="display:inline-block; width: 130px" for="ulfile"><%:选择本地特征库文件:%></label>
<label class="cbi-value" style="display:inline-block; width: 130px" for="ulfile"><%:Select feature file:%></label>
<input class="cbi-input-file" style="width: 500px" type="file" id="ulfile" name="ulfile" />
<input type="submit" class="cbi-button cbi-input-apply" name="upload" value="<%:Upload%>" />
<%+cbi/valuefooter%>

View File

@ -5,31 +5,34 @@ msgstr "常用网站"
msgid "appfilter"
msgstr "应用过滤"
msgid "App Filter"
msgstr "应用过滤"
msgid "game"
msgstr "游戏"
msgid "web"
msgid "web"
msgstr "网页"
msgid "video"
msgstr "视频"
msgid "chat"
msgstr "聊天"
msgid "download"
msgstr "下载"
msgid "p2p"
msgstr "p2p"
msgid "music"
msgstr "音乐"
msgid "shopping"
msgstr "购物"
msgid "working"
msgid "video"
msgstr "视频"
msgid "chat"
msgstr "聊天"
msgid "download"
msgstr "下载"
msgid "p2p"
msgstr "p2p"
msgid "music"
msgstr "音乐"
msgid "shopping"
msgstr "购物"
msgid "working"
msgstr "办公"
msgid "employee"
@ -47,6 +50,110 @@ msgstr "至少选择一个用户,否则对所有用户生效"
msgid "Select users"
msgstr "选择用户"
msgid "Id"
msgstr "编号"
msgid "Hostname"
msgstr "主机名"
msgid "Common App(TOP5)"
msgstr "常用APP(TOP5)"
msgid "Online Status"
msgstr "在线状态"
msgid "Client List"
msgstr "终端列表"
msgid "Online"
msgstr "在线"
msgid "Offline"
msgstr "离线"
msgid "App Time Statistics"
msgstr "App 时间统计"
msgid "Filter Status"
msgstr "过滤状态"
msgid "Data Statistics"
msgstr "数据统计"
msgid "Current Version"
msgstr "当前版本"
msgid "App Feature Num"
msgstr "特征码个数"
msgid "Update feature"
msgstr "特征库更新"
msgid "Time Setting"
msgstr "时间控制"
msgid "Sun"
msgstr "周日"
msgid "Mon"
msgstr "周一"
msgid "Tue"
msgstr "周二"
msgid "Wed"
msgstr "周三"
msgid "Thur"
msgstr "周四"
msgid "Fri"
msgstr "周五"
msgid "Sat"
msgstr "周六"
msgid "Update the feature file successfully, please refresh the page"
msgstr "更新特征库成功,请刷新页面!"
msgid "Failed to update feature file, format error"
msgstr "更新特征库失败,格式错误!"
msgid "Select feature file:"
msgstr "选择本地特征库文件:"
msgid "Start Time"
msgstr "开始时间"
msgid "End Time"
msgstr "结束时间"
msgid "App Name"
msgstr "App名称"
msgid "Visit Time"
msgstr "访问时间"
msgid "App classification time statistics"
msgstr "App分类时间统计"
msgid "Percentage"
msgstr "占比"
msgid "Filtered"
msgstr "已过滤"
msgid "Unfiltered"
msgstr "未过滤"
msgid "h"
msgstr "小时"
msgid "m"
msgstr "分"
msgid "Enable App Filter"
msgstr "开启应用过滤"

View File

@ -2,7 +2,7 @@
#define APP_FILTER_H
#define AF_VERSION "5.0.1"
#define AF_FEATURE_CONFIG_FILE "/etc/appfilter/feature.cfg"
#define AF_FEATURE_CONFIG_FILE "/tmp/feature.cfg"
#define MAX_PARSE_PKT_NUM 16
#define MIN_HTTP_DATA_LEN 16
@ -92,7 +92,7 @@ typedef struct https_proto{
}https_proto_t;
typedef struct flow_info{
struct nf_conn *ct; // Á¬½Ó¸ú×ÙÖ¸Õë
struct nf_conn *ct; // <EFBFBD><EFBFBD><EFBFBD>Ӹ<EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><EFBFBD>
u_int32_t src;
u_int32_t dst;
int l4_protocol;

View File

@ -46,8 +46,8 @@ define Package/appfilter/install
$(INSTALL_DIR) $(1)/usr/bin $(1)/etc/init.d
$(INSTALL_DIR) $(1)/etc/appfilter
$(INSTALL_DIR) $(1)/etc/config
$(CP) ./files/feature.cfg $(1)/etc/appfilter/
$(CP) ./files/app_class.txt $(1)/etc/appfilter/
$(CP) ./files/*.cfg $(1)/etc/appfilter/
$(CP) ./files/*.txt $(1)/etc/appfilter/
$(INSTALL_BIN) ./files/appfilter.init $(1)/etc/init.d/appfilter
$(INSTALL_BIN) ./files/oaf_rule $(1)/usr/bin
$(INSTALL_BIN) ./files/gen_class.sh $(1)/usr/bin

View File

@ -0,0 +1,8 @@
1 chat
2 game
3 video
4 shopping
5 music
6 recruitment
7 download
8 website

View File

@ -8,3 +8,4 @@ config time 'time'
option end_time '23:59'
option days '0 1 2 3 4 5 6'
option start_time '00:00'
config user user

View File

@ -5,7 +5,8 @@
START=96
USE_PROCD=1
OAFD_BIN="/usr/bin/oafd"
FEATURE_FILE="/tmp/feature.cfg"
CLASS_FILE="/tmp/app_class.txt"
service_triggers()
{
procd_add_reload_trigger "appfilter"
@ -17,7 +18,26 @@ stop_service(){
}
start_service(){
gen_class.sh /etc/appfilter/feature.cfg
lang=`uci get luci.main.lang`
test -f $FEATURE_FILE && rm $FEATURE_FILE
test -f $CLASS_FILE && rm $CLASS_FILE
if [ x"" == x"$lang" -o x"auto" == x"$lang" ];then
ln -s /etc/appfilter/feature.cfg $FEATURE_FILE
ln -s /etc/appfilter/app_class.txt $CLASS_FILE
else
if [ -f "/etc/appfilter/feature_$lang.cfg" ];then
ln -s /etc/appfilter/feature_$lang.cfg $FEATURE_FILE
else
ln -s /etc/appfilter/feature.cfg $FEATURE_FILE
fi
if [ -f "/etc/appfilter/app_class_$lang.txt" ];then
ln -s /etc/appfilter/app_class_$lang.txt $CLASS_FILE
else
ln -s /etc/appfilter/app_class.txt $CLASS_FILE
fi
fi
gen_class.sh /tmp/feature.cfg
insmod oaf
/usr/bin/oaf_rule reload
procd_open_instance

0
open-app-filter/files/appfilter.lua Normal file → Executable file
View File

View File

@ -0,0 +1,51 @@
#version v21.9.1
#id name:[proto;sport;dport;host url;request;dict]
#class chat
1001 Facebook:[tcp;;;facebook.com;;]
1002 Whatsapp:[tcp;;;whatsapp;;]
1003 Twitter:[tcp;;;twitter.com;;]
1004 Instagram:[tcp;;;instagram.com;;]
1005 VK:[tcp;;;vk.com;;]
1006 Line:[tcp;;;line;;]
#class video
3001 YouTube:[tcp;;;youtube;;]
3002 NetFlix:[tcp;;;netflix;;]
3003 Vimeo:[tcp;;;vimeo;;]
3004 DailyMotion:[tcp;;;dailymotion;;]
3005 Hulu:[tcp;;;hulu;;]
3006 Vube:[tcp;;;vube;;]
3007 Twitch:[tcp;;;twitch;;]
3008 LiveLeak:[tcp;;;itemfix;;]
3009 LiveLeak:[tcp;;;itemfix;;]
3010 Xvideos:[tcp;;;xvideos.com;;]
3011 Pornhub:[tcp;;;pornhub.com;;]
#class shopping
4001 Amazon:[tcp;;;amazon.com;;]
4002 eBay:[tcp;;;ebay.com;;]
4003 Etsy:[tcp;;;etsy.com;;]
4004 Wish:[tcp;;;wish.com;;]
4005 Alibaba:[tcp;;;alibaba;;]
4006 Aliexpress:[tcp;;;aliexpress.com;;]
4007 Walmart:[tcp;;;walmart.com;;]
4008 Sears:[tcp;;;sears.com;;]
4009 Kohls:[tcp;;;kohls.com;;]
4010 Costco:[tcp;;;costco.com;;]
4011 Asos:[tcp;;;asos.com;;]
4012 Cuyana:[tcp;;;cuyana.com;;]
#class download
7001 Google Play:[tcp;;;play.google.com;;]
7002 AppStore:[tcp;;80;iosapps.itunes.apple.com;;]
#class website
8001 Google:[tcp;;;www.google.com;;]
8002 Wiki:[tcp;;;www.wikipedia.com;;]
8003 Yahoo:[tcp;;;www.yahoo.com;;]
8004 Apple:[tcp;;;www.apple.com;;]
8010 Reddit:[tcp;;;www.reddit.com;;]
8011 Outlook:[tcp;;;www.outlook.live.com;;]
8012 Naver:[tcp;;;www.naver.com;;]
8013 Fandom:[tcp;;;www.fandom.com;;]
8015 Globo:[tcp;;;www.globo.com;;]

View File

@ -59,12 +59,12 @@ load_mac_list()
json_add_int "op" 4
json_add_object "data"
json_add_array "mac_list"
config_get appid_list "user" "users"
echo "appid list=$appid_list"
for appid in $appid_list:
config_get mac_list "user" "users"
echo "mac list=$mac_list"
for mac in $mac_list:
do
echo "appid=$appid"
json_add_string "" $appid
echo "mac=$mac"
json_add_string "" $mac
done
json_str=`json_dump`
config_apply "$json_str"

View File

@ -76,7 +76,7 @@ void init_app_name_table(void)
int count = 0;
char line_buf[2048] = {0};
FILE *fp = fopen("/etc/appfilter/feature.cfg", "r");
FILE *fp = fopen("/tmp/feature.cfg", "r");
if (!fp)
{
printf("open file failed\n");
@ -110,7 +110,7 @@ void init_app_class_name_table(void)
char line_buf[2048] = {0};
int class_id;
char class_name[64] = {0};
FILE *fp = fopen("/etc/appfilter/app_class.txt", "r");
FILE *fp = fopen("/tmp/app_class.txt", "r");
if (!fp)
{
printf("open file failed\n");