mirror of
https://github.com/Zxilly/UA2F.git
synced 2025-12-25 04:28:28 +00:00
style: clean code
This commit is contained in:
parent
da8ed67881
commit
f3c90cdd09
10
.gitignore
vendored
10
.gitignore
vendored
@ -1,7 +1,3 @@
|
||||
# Created by .ignore support plugin (hsz.mobi)
|
||||
### Example user template template
|
||||
### Example user template
|
||||
|
||||
# IntelliJ project files
|
||||
.idea
|
||||
*.iml
|
||||
@ -77,10 +73,8 @@ Module.symvers
|
||||
Mkfile.old
|
||||
dkms.conf
|
||||
|
||||
|
||||
# Project exclude paths
|
||||
/cmake-build-*/
|
||||
|
||||
test/
|
||||
|
||||
/build/
|
||||
/build/
|
||||
/third_party/
|
||||
@ -8,7 +8,7 @@ include_directories("/usr/local/include")
|
||||
add_compile_options(-fsanitize=address)
|
||||
add_link_options(-fsanitize=address)
|
||||
|
||||
add_executable(ua2f src/ua2f.c)
|
||||
add_executable(ua2f src/ua2f.c src/statistics.c)
|
||||
|
||||
target_link_libraries(ua2f mnl netfilter_queue ipset)
|
||||
|
||||
|
||||
4
Makefile
4
Makefile
@ -16,7 +16,7 @@ define Package/ua2f
|
||||
TITLE:=Change User-Agent to Fwords on the fly.
|
||||
URL:=https://github.com/Zxilly/UA2F
|
||||
DEPENDS:=+ipset +iptables-mod-conntrack-extra +iptables-mod-nfqueue \
|
||||
+libnetfilter-conntrack +libnetfilter-queue
|
||||
+libnetfilter-conntrack +libnetfilter-queue +iptables-mod-filter +iptables-mod-ipopt
|
||||
endef
|
||||
|
||||
define Package/ua2f/description
|
||||
@ -27,7 +27,7 @@ EXTRA_LDFLAGS += -lmnl -lnetfilter_queue -lipset
|
||||
|
||||
define Build/Compile
|
||||
$(TARGET_CC) $(TARGET_CFLAGS) $(TARGET_LDFLAGS) $(EXTRA_LDFLAGS) \
|
||||
$(PKG_BUILD_DIR)/ua2f.c -o $(PKG_BUILD_DIR)/ua2f
|
||||
$(PKG_BUILD_DIR)/ua2f.c $(PKG_BUILD_DIR)/statistics.c -o $(PKG_BUILD_DIR)/ua2f
|
||||
endef
|
||||
|
||||
define Package/ua2f/install
|
||||
|
||||
68
src/statistics.c
Normal file
68
src/statistics.c
Normal file
@ -0,0 +1,68 @@
|
||||
#include <memory.h>
|
||||
#include <stdio.h>
|
||||
#include <time.h>
|
||||
#include <syslog.h>
|
||||
#include "statistics.h"
|
||||
|
||||
static long long UserAgentPacketCount = 0;
|
||||
static long long TcpPacketCount = 0;
|
||||
static long long PacketWithUserAgentMark = 0;
|
||||
static long long PacketWithoutUserAgentMark = 0;
|
||||
static long long HttpPacketCount = 4;
|
||||
|
||||
static time_t start_t;
|
||||
|
||||
void init_statistics() {
|
||||
start_t = time(NULL);
|
||||
}
|
||||
|
||||
void count_user_agent_packet() {
|
||||
UserAgentPacketCount++;
|
||||
}
|
||||
|
||||
void count_tcp_packet() {
|
||||
TcpPacketCount++;
|
||||
}
|
||||
|
||||
void count_packet_with_user_agent_mark() {
|
||||
PacketWithUserAgentMark++;
|
||||
}
|
||||
|
||||
void count_packet_without_user_agent_mark() {
|
||||
PacketWithoutUserAgentMark++;
|
||||
}
|
||||
|
||||
void count_http_packet() {
|
||||
HttpPacketCount++;
|
||||
}
|
||||
|
||||
static char TimeStringBuffer[60];
|
||||
|
||||
char *fill_time_string(int sec) {
|
||||
memset(TimeStringBuffer, 0, sizeof(TimeStringBuffer));
|
||||
if (sec <= 60) {
|
||||
sprintf(TimeStringBuffer, "%d seconds", sec);
|
||||
} else if (sec <= 3600) {
|
||||
sprintf(TimeStringBuffer, "%d minutes and %d seconds", sec / 60, sec % 60);
|
||||
} else if (sec <= 86400) {
|
||||
sprintf(TimeStringBuffer, "%d hours, %d minutes and %d seconds", sec / 3600, sec % 3600 / 60, sec % 60);
|
||||
} else {
|
||||
sprintf(TimeStringBuffer, "%d days, %d hours, %d minutes and %d seconds", sec / 86400, sec % 86400 / 3600,
|
||||
sec % 3600 / 60,
|
||||
sec % 60);
|
||||
}
|
||||
return TimeStringBuffer;
|
||||
}
|
||||
|
||||
void try_print_statistics() {
|
||||
if (UserAgentPacketCount / HttpPacketCount == 2 || UserAgentPacketCount - HttpPacketCount >= 8192) {
|
||||
HttpPacketCount = UserAgentPacketCount;
|
||||
time_t current_t = time(NULL);
|
||||
syslog(LOG_INFO,
|
||||
"UA2F has handled %lld ua http, %lld tcp. Set %lld mark and %lld noUA mark in %s",
|
||||
UserAgentPacketCount, TcpPacketCount, PacketWithUserAgentMark, PacketWithoutUserAgentMark,
|
||||
fill_time_string((int) difftime(current_t, start_t)));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
16
src/statistics.h
Normal file
16
src/statistics.h
Normal file
@ -0,0 +1,16 @@
|
||||
#ifndef UA2F_STATISTICS_H
|
||||
#define UA2F_STATISTICS_H
|
||||
|
||||
void count_user_agent_packet();
|
||||
|
||||
void count_tcp_packet();
|
||||
|
||||
void count_packet_with_user_agent_mark();
|
||||
|
||||
void count_packet_without_user_agent_mark();
|
||||
|
||||
void count_http_packet();
|
||||
|
||||
void init_statistics();
|
||||
|
||||
#endif //UA2F_STATISTICS_H
|
||||
60
src/ua2f.c
60
src/ua2f.c
@ -1,12 +1,5 @@
|
||||
#ifndef _GNU_SOURCE
|
||||
#define _GNU_SOURCE
|
||||
#endif
|
||||
|
||||
#ifndef __USE_GNU
|
||||
#define __USE_GNU
|
||||
#endif
|
||||
|
||||
#include "ipset_hook.h"
|
||||
#include "statistics.h"
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
@ -36,16 +29,6 @@ int child_status;
|
||||
static struct mnl_socket *nl;
|
||||
static const int queue_number = 10010;
|
||||
|
||||
static long long UAcount = 0;
|
||||
static long long tcpcount = 0;
|
||||
static long long UAmark = 0;
|
||||
static long long noUAmark = 0;
|
||||
static long long httpcount = 4;
|
||||
|
||||
static time_t start_t, current_t;
|
||||
|
||||
static char timestr[60];
|
||||
|
||||
char *UAstr = NULL;
|
||||
|
||||
static struct ipset *Pipset;
|
||||
@ -77,22 +60,6 @@ void *memncasemem(const void *l, size_t l_len, const void *s, size_t s_len) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static char *time2str(int sec) {
|
||||
memset(timestr, 0, sizeof(timestr));
|
||||
if (sec <= 60) {
|
||||
sprintf(timestr, "%d seconds", sec);
|
||||
} else if (sec <= 3600) {
|
||||
sprintf(timestr, "%d minutes and %d seconds", sec / 60, sec % 60);
|
||||
} else if (sec <= 86400) {
|
||||
sprintf(timestr, "%d hours, %d minutes and %d seconds", sec / 3600, sec % 3600 / 60, sec % 60);
|
||||
} else {
|
||||
sprintf(timestr, "%d days, %d hours, %d minutes and %d seconds", sec / 86400, sec % 86400 / 3600,
|
||||
sec % 3600 / 60,
|
||||
sec % 60);
|
||||
}
|
||||
return timestr;
|
||||
}
|
||||
|
||||
static int parse_attrs(const struct nlattr *attr, void *data) {
|
||||
const struct nlattr **tb = data;
|
||||
int type = mnl_attr_get_type(attr);
|
||||
@ -140,14 +107,14 @@ nfq_send_verdict(int queue_num, uint32_t id, struct pkt_buff *pktb, uint32_t mar
|
||||
|
||||
ipset_parse_line(Pipset, addcmd); //加 ipset 标记
|
||||
|
||||
noUAmark++;
|
||||
count_packet_without_user_agent_mark();
|
||||
}
|
||||
} else {
|
||||
if (mark != 44) {
|
||||
nest = mnl_attr_nest_start(nlh, NFQA_CT);
|
||||
mnl_attr_put_u32(nlh, CTA_MARK, htonl(44));
|
||||
mnl_attr_nest_end(nlh, nest);
|
||||
UAmark++;
|
||||
count_packet_with_user_agent_mark();
|
||||
}
|
||||
}
|
||||
|
||||
@ -158,7 +125,7 @@ nfq_send_verdict(int queue_num, uint32_t id, struct pkt_buff *pktb, uint32_t mar
|
||||
exit(EXIT_FAILURE);
|
||||
}
|
||||
|
||||
tcpcount++;
|
||||
count_tcp_packet();
|
||||
pktb_free(pktb);
|
||||
}
|
||||
|
||||
@ -169,7 +136,7 @@ static int queue_cb(const struct nlmsghdr *nlh, void *data) {
|
||||
struct nlattr *originattr[CTA_TUPLE_MAX + 1] = {};
|
||||
struct nlattr *ipattr[CTA_IP_MAX + 1] = {};
|
||||
struct nlattr *portattr[CTA_PROTO_MAX + 1] = {};
|
||||
uint16_t plen;
|
||||
uint16_t payloadLength;
|
||||
struct pkt_buff *pktb;
|
||||
struct iphdr *ippkhdl;
|
||||
struct tcphdr *tcppkhdl;
|
||||
@ -235,11 +202,11 @@ static int queue_cb(const struct nlmsghdr *nlh, void *data) {
|
||||
|
||||
ph = mnl_attr_get_payload(attr[NFQA_PACKET_HDR]);
|
||||
|
||||
plen = mnl_attr_get_payload_len(attr[NFQA_PAYLOAD]);
|
||||
payloadLength = mnl_attr_get_payload_len(attr[NFQA_PAYLOAD]);
|
||||
payload = mnl_attr_get_payload(attr[NFQA_PAYLOAD]);
|
||||
|
||||
|
||||
pktb = pktb_alloc(AF_INET, payload, plen, 0); //IP包
|
||||
pktb = pktb_alloc(AF_INET, payload, payloadLength, 0); //IP包
|
||||
|
||||
if (!pktb) {
|
||||
syslog(LOG_ERR, "pktb malloc failed");
|
||||
@ -283,7 +250,7 @@ static int queue_cb(const struct nlmsghdr *nlh, void *data) {
|
||||
|
||||
if (ualength > 0) {
|
||||
if (nfq_tcp_mangle_ipv4(pktb, uaoffset, ualength, UAstr, ualength) == 1) {
|
||||
UAcount++; //记录修改包的数量
|
||||
count_user_agent_packet();
|
||||
} else {
|
||||
syslog(LOG_ERR, "Mangle packet failed.");
|
||||
pktb_free(pktb);
|
||||
@ -297,15 +264,6 @@ static int queue_cb(const struct nlmsghdr *nlh, void *data) {
|
||||
|
||||
nfq_send_verdict(ntohs(nfg->res_id), ntohl((uint32_t) ph->packet_id), pktb, mark, noUA, addcmd);
|
||||
|
||||
if (UAcount / httpcount == 2 || UAcount - httpcount >= 8192) {
|
||||
httpcount = UAcount;
|
||||
current_t = time(NULL);
|
||||
syslog(LOG_INFO,
|
||||
"UA2F has handled %lld ua http, %lld tcp. Set %lld mark and %lld noUA mark in %s",
|
||||
UAcount, tcpcount, UAmark, noUAmark,
|
||||
time2str((int) difftime(current_t, start_t)));
|
||||
}
|
||||
|
||||
return MNL_CB_OK;
|
||||
}
|
||||
|
||||
@ -357,7 +315,7 @@ int main(int argc, char *argv[]) {
|
||||
|
||||
openlog("UA2F", LOG_PID, LOG_SYSLOG);
|
||||
|
||||
start_t = time(NULL);
|
||||
init_statistics();
|
||||
|
||||
ipset_load_types();
|
||||
Pipset = ipset_init();
|
||||
|
||||
Loading…
Reference in New Issue
Block a user