完全屬於我自己的Blog,運行在我的路由器H218N上.記錄著我想記錄的文字.

标签 openwrt 下的文章

08月 05

利用tcpdump抓取IPTV播放列表

之前抓取IPTV播放列表都是用Openwrt的端口镜像,配合台式机去抓包的,但是每次这样弄都好麻烦了,路由器,机顶盒,电脑都要用网线连接在一起,主力机变成XPS 15后,没有网口就显得更麻烦了。
此时就想起tcpdump了,这货不是能把所有数据包全抓下来吗,在路由器搞一搞就好了!
家里用的是软路由,弄个tcpdump还是很简单的,但是老人家里用的是K2P,还没硬改过的,装这个包和对应依赖空间有压力啊。。。
Google一番,没找到能用的tcpdump静态链接版本,又是DIY时刻了。
K2P刷的是高恪的固件,基于openwrt 14.07的,找到对应SDK和Toolchain,
参照之前的高恪插件编译教程弄起来了,却发现没有tcpdump这个包,搜索一番得知在base这个repo,SDK默认是没有添加这个repo的.

Openwrt 14.07也算是年代久远了,费劲一番才找到这个repo的源

git://git.archive.openwrt.org/14.07/openwrt.git

添加后就是常规操作

./script/feeds update
./script/feeds install

先按照官方动态链接的方式编译一遍看会不会出错。

make -j16 package/network/utils/tcpdump compile

成功编译后,看到依赖库libpcap把静态链接库也编译出来了。
接下来就是尝试编译静态链接的tcpdump了
只需要对Makefile稍作改动

  49 CONFIGURE_ARGS += \
  50         --without-crypto
  51 
  52 ifeq ($(CONFIG_IPV6),y)
  53 CONFIGURE_ARGS += \
  54         --enable-ipv6
  55 endif
  56 
  57 TARGET_CFLAGS += -ffunction-sections -fdata-sections
  58 TARGET_LDFLAGS += -Wl,--gc-sections
  59 
  60 CONFIGURE_VARS += \
  61         BUILD_CC="$(TARGET_CC)" \
  62         HOSTCC="$(HOSTCC)" \
  63         td_cv_buggygetaddrinfo="no" \
  64         ac_cv_linux_vers=$(LINUX_VERSION) \
  65         ac_cv_header_rpc_rpcent_h=no \
  66         ac_cv_lib_rpc_main=no \
  67         ac_cv_path_PCAP_CONFIG=""
  68 
  69 MAKE_FLAGS :=

改成

  49 CONFIGURE_ARGS += \
  50         --without-crypto
  51 
  52 ifeq ($(CONFIG_IPV6),y)
  53 CONFIGURE_ARGS += \
  54         --enable-ipv6
  55 endif
  56 
  57 TARGET_CFLAGS += -ffunction-sections -fdata-sections
  58 TARGET_LDFLAGS += -static -Wl,--gc-sections
  59 
  60 CONFIGURE_VARS += \
  61         BUILD_CC="$(TARGET_CC)" \
  62         HOSTCC="$(HOSTCC)" \
  63         td_cv_buggygetaddrinfo="no" \
  64         ac_cv_linux_vers=$(LINUX_VERSION) \
  65         ac_cv_header_rpc_rpcent_h=no \
  66         ac_cv_lib_rpc_main=no \
  67         ac_cv_path_PCAP_CONFIG=""
  68 
  69 MAKE_FLAGS :=

再次执行编译命令就可以了。

make -j16 package/network/utils/tcpdump compile

编译好的静态链接tcpdump和tcpdump-mini二进制附上。

在路由器上开始抓到包

tcpdump -i br-lan -s 0 -w iptv.pcap host 192.168.2.113

完了用scp把抓包文件传回到Mac上,直接用Charles就可以打开。
我这边都是rtsp协议的直播,所以直接查找关键词rtsp就可以找到列表页了,找到以后就是用正则提取一下电视台名称播放地址
查找关键词就找到播放列表页
用到的正则也很简单ChannelName="(.*?)".*ChannelURL="(?:.*?((?:rtsp|http).*?(?:smil|m3u8).*?END.*?))",最后就是根据个人习惯调整一下列表的顺序了。
广东电信这里抓到的播放列表在此

05月 05

在路由器上搭建NextCloud作为个人网盘

缘由

自以为很明智地买了32G的手机,应该能用上3,4年.没想还不到两年,女王就天天抱怨手机木有空间.
还好,不像我整个手机装的都是各种软件,她手机里占空间的主要还是照片和视频.
那就弄个远程备份咯.
可是放眼在线云盘,国内的说真的不敢用,要担心那天挂掉,或者那天数据泄露.免费用户还得忍受龟速下载.
国外的虽然节操比国内的好些,但是订阅的价钱不低,还有墙的存在,始终放心不下.
既然家里的城中村宽带在万能淘宝加持下变成了200M下行/30M上行,那就得用起来.

开搞

家里的路由器跑的梅林,早已经搭好了Optware-Ng的环境了,综合的各家评论,觉得搭个NextCloud云盘好了.
下载源码包,配置nginx,开始安装,路由器是EA6500V2,armv7的CPU,256M的内存,挂载了一个1T的硬盘和远古时代的2G MiniSD卡,
几分钟下来,终于是装好了,可是一登录,就来一个500错误!
500错误

调试

虽说有了心里准备,在路由上跑大型软件会有坑,可这登录就摸门钉,太...
二话不说,看日志,可是这日志记录的太长了,被截断了.
错误日志

本来还想看看源码的,可面对着这庞大的项目却不知从何下手,算了,还是编译个xdebug慢慢追吧.
既然抛出一个NotFoundException,那就在报错的地方,抛异常前打几个断点.
PHP_INT_SIZE
试了几次,终于找到问题所在了.
本来在获取一个文件时,应该返回该文件的元信息,例如创建时间,修改时间,文件大小之类的.
可程序的到的却是一个个的null.这些元信息是原本是通过PHP的stat方法获取的.
CALL_STAT
但是,如果PHP_INT_SIZE===4的话,却是通过系统命令stat获取的,而这梅林却没有这命令,stat命令不存在,PHP自然就返回null了,
RETURN_NULL
继而就抛出了NotFoundException.
解决方法也很简单.查到stat命令是属于coreutils-stat这个包的,

ipkg update && ipkg install coreutils-stat

装上stat命令后果然正常了,创建个账号,试了下手机客户端,可以正常备份了.