找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
广告投放联系QQ68610888
查看: 12495|回复: 33

分析Padavan源码三,添加迅雷演示

[复制链接]
前面说到httpd的几个重要流程,update_variables(); asus_nvram_commit(); notify_services();这就是更改设置后的几个操作:1、更新参数集;2、更新nvram;3、通知rc处理(里面主要是重启相应的程序)。


我们先来看一下主要的数据结构:


在httpd/commom.h里面定义了这些:
struct svcLink{
        const char *serviceId;       //参数组名,将各种参数分类,像General、Storage等
        struct variable *variables;  //定义在下面
};
struct variable{
        const char *name;            //参数名
        const char *longname;        //没有用,也不知道干嘛,都是空
        char **argv;                 //没有用,也不知道干嘛,都是NULL
        u64 event_mask;              //事件掩码,从实现函数里看,主要用于是否要重启,不用重启就定义为0
};
variable包含在svcLink里面,结构上像是一个二维数组。
所以要新增功能,先想想把参数加到哪个组,或是自己新建一个组。


还有一个结构,叫事件描述集:
struct evDesc{
        u64 event_mask;              //对应上面的事件掩码,和上面的结构相匹配
        u32 max_time;                //可能是重启需要时间吧
        const char* notify_cmd;             //对称通知名,在shared/notify_rc.h里面有定义
        u64 event_unmask;            //可能是有干扰的,需要重启或屏蔽,和上面对应。
};
event_mask,event_unmask这两个的定义类似#define EVM_RESTART_DHCPD (1ULL <<  1)#define EVM_RESTART_RADV (1ULL <<  2);
意思是,1扩展成无符号长整 unsige long long =ULL,向左位移,这样,不同的参数用OR可以提高速度,在CPU里,逻辑运算总是比加减快。
EVM_RESTART_DHCPD就是:0~0010,共64位,
EVM_RESTART_RADV就时: 0~0100,也是64位,
OR的结果是:           0~0110,
AND的结果是:          0~0000,
这里这样定义主要是提高速度的,不是重点。Padavan定义了u64(u_int64_t),用这种运算,可以处理64种不同的动作,已经用了0~42,62,63,还有19个可以加,对大家应该是够了。


把这些数据定义好后(当然别忘了在nvram项里面也要加入相应数据哦),上面的3个操作最后会用通知的办法通知到rc进行处理,下面就可以在rc里加入相应的处理代码就够了~(这部分在前两集有讲过,就此略过哦。)


大概流程就是这样,下面就实践操作,加入迅雷。


我们要先要就用命令行,能让迅雷打开,关闭,重启,改位置等等,达到你自已的目的,这都不能做到,就不要想别的事啦,先让你的程序能自由运转吧。这时你就知道了你的程序需要定义多少个参数,开启有哪些动作,关闭有哪些动作,哪些有冲突,要屏蔽或跟着重启。


说说迅雷远程,已经停止更新的,也不是开源,资料有限,现在能用的最新稳定版是1.0.31,下好与自已CPU体系结构对应的文件,里面有4个文件,vod_httpservice可以删除,不影响,删了CPU占用率也会下降。还剩3个,portal是启动/关闭入口,还有两个是真正做事的。portal可以打开程序,portal -s可以关闭程序。还要一堆运行库,运行后,会新建一个lib文件夹,把两个做事的放进去,新建一个配置文件夹。
根据迅雷的这个特点,我选择用脚本运行,先把迅雷打个包,启动时,解压到挂载的硬盘,再执行,不然固件的是只读的,运行出错。脚本运行的参数从nvram里面读取,所以rc里面,通知的处理也很简单,运行这个脚本就够了,我的是这样改的:在rc/services_stor.c里面
void restart_xunlei(void) {
        if (count_stor_mountpoint())
                eval("/usr/bin/xunlei.sh");
}
是不是有点太简单了,嗯,就是这样简单粗暴。


我的迅雷运行需要两个参数,一个是是否开启,一个是解压到哪里,定义成:xunlei_enable,xunlei_dir我额外加了个,激活码,方便拷贝,叫xunlei_sn,这三个在nvram的定义里有加上,
因为xunlei_sn不是自己设置的,就不用在参数集里加了,httpd/variable.c里面加上xunlei_enable,xunlei_dir这两个就行,因为也是存储相关的,所以我就加在Storage组了,
通知名我定义为:RCN_RESTART_XUNLEI,具体在shared/notify_rc.h里面,值是“restart_xunlei”。
我的迅雷启动或关闭与别人无关,事件描述集就可以这样定义:
{EVM_RESTART_XUNLEI,EVT_RESTART_XUNLEI,RCN_RESTART_XUNLEI,0},真正的值是:
{(1ULL << 43),3,"restart_xunlei",0}


然后在rc/rc.c里的void handle_notifications(void)函数里面,加上对restart_xunlei的通知处理:
else if (strcmp(entry->d_name, RCN_RESTART_XUNLEI) == 0){
        restart_xunlei();
}
这样就可以执行上面的操作啦:运行/usr/bin/xunlei.sh,嗯,就是这样,流程简单吧。。。。。






这改好的文件明天上传,因为上夜班不在家。。。。




全部过程的难点在网页前端,我分析了几天才搞清楚,很多项都在state.js里面,像菜单啥的,


自已建的网页表单里,下面这行要写成:
<input type="hidden" name="sid_list" value="Storage;">
因为我的参数集在Storage组里面,就这样。


enjoy it youself !


评分

参与人数 6恩山币 +9 收起 理由
luc*** + 2 强大的恩山!(以下重复1万次)
云*** + 1 一看就是觉得高端、大气、上档次!
big*** + 3 难得有人这样分析。
蓝色*** + 1 城会玩
daha*** + 1 泥马,真给力,我要顶!
work*** + 1 亲,你太牛逼了,走,我请你吃鳇鱼头去~~~

查看全部评分

我的恩山、我的无线 The best wifi forum is right here.
 楼主| | 显示全部楼层
本帖最后由 lostlonger 于 2017-4-28 18:50 编辑

上图:






本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
我的恩山、我的无线 The best wifi forum is right here.
回复

使用道具 举报

谢谢楼主的分享!这个绝对要顶!!!
我的恩山、我的无线 The best wifi forum is right here.
回复

使用道具 举报

 楼主| | 显示全部楼层
本帖最后由 lostlonger 于 2017-4-28 18:49 编辑

上代码:
#!/bin/sh

### 迅雷下载启动脚本
### 流程1:首先检测有无挂载硬盘,无挂载肯定不能运行啊,直接退出。
### 流程2:迅雷未开启+迅雷在运行=要关闭迅雷
### 流程3:迅雷未开启则退出,这句是在开机启动时检测的
### 下面就是运行迅雷的动作啦

xunleidir=`nvram get xunlei_dir`
xunleienable=`nvram get xunlei_enable`

[ ! -d "$xunleidir" ] && logger -t "远程迅雷下载" "未检测到挂载硬盘" && exit 0

[ "$xunleienable" != 1 -a -n "`pidof ETMDaemon`" ] && killall ETMDaemon EmbedThunderManager && logger -t "远程迅雷下载" "已关闭。" && exit 0

[ "$xunleienable" != 1 ] && logger -t "远程迅雷下载" "未开启" && exit 0

if [ ! -f "$xunleidir/xunlei/portal" ]; then
        mkdir -p "$xunleidir/xunlei/"
        tar -xzvf "/etc_ro/xware.tgz" -C "$xunleidir/xunlei/"
        logger -t "远程迅雷下载" "成功解压至:$xunleidir/xunlei/"
fi

if [ ! -x "$xunleidir/xunlei/portal" ]; then
        chmod 777 "$xunleidir/xunlei/portal"
fi

codeline=""
export LD_LIBRARY_PATH="$xunleidir/xunlei/lib:/lib:/opt/lib"
while [ -z "$codeline" ]
do
        logger -t "远程迅雷下载" "启动中..."
        $xunleidir/xunlei/portal > /tmp/xunlei.conf
        codeline=`grep "THE ACTIVE CODE IS" /tmp/xunlei.conf`
        if [ -z "$codeline" ]; then
                codeline=`grep "THIS DEVICE HAS BOUND TO USER" /tmp/xunlei.conf`
                if [ -z "$codeline" ]; then
                        logger -t "远程迅雷下载" "启动失败,正在重试中,请检查!"
                        sleep 5
                fi
        fi
done
code=`expr "$codeline" : '[^\:]*: \([^.]*\)'`
nvram set xunlei_sn="$code"
export LD_LIBRARY_PATH=/lib:/opt/lib
logger -t "远程迅雷下载" "守护进程启动在:$xunleidir/xunlei。"



文件打包:

来个自己用的固件:newifi mini的:http://pan.baidu.com/s/1i5uqSGd

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
我的恩山、我的无线 The best wifi forum is right here.
回复

使用道具 举报

来自手机 | 显示全部楼层
lostlonger 发表于 2017-4-28 18:39
上代码:
#!/bin/sh


楼主。能不能做一个函数触发(非脚本)的kms和mproxy?
我的恩山、我的无线 The best wifi forum is right here.
回复

使用道具 举报

 楼主| | 显示全部楼层
nns 发表于 2017-4-28 19:58
楼主。能不能做一个函数触发(非脚本)的kms和mproxy?

kms是微软认证的?那个mproxy是干嘛的?都不懂耶,先要知道本身怎么运行才行啊
我的恩山、我的无线 The best wifi forum is right here.
回复

使用道具 举报

来自手机 | 显示全部楼层
lostlonger 发表于 2017-4-28 21:21
kms是微软认证的?那个mproxy是干嘛的?都不懂耶,先要知道本身怎么运行才行啊

代码和文件我都给你发了邮件的啊
我的恩山、我的无线 The best wifi forum is right here.
回复

使用道具 举报

来自手机 | 显示全部楼层
关注楼主对padavan的科普
我的恩山、我的无线 The best wifi forum is right here.
回复

使用道具 举报

 楼主| | 显示全部楼层
nns 发表于 2017-4-28 21:55
代码和文件我都给你发了邮件的啊

没完全懂,你是想要kms和mproxy的程序文件能单独运行,停止不?

是这样的话,你定义参数的event_mask就不能是EVM_RESTART_FIREWALL了,要定义个新的,如EVM_RESTART_KMS、EVM_RESTART_MPROXY


然后EVM_RESTART_KMS、EVM_RESTART_MPROXY有对应的通知事件,RCN_RESTART_KMS,RCN_RESTART_MPROXY,在shared/notify.h里定义RCN_RESTART_KMS,RCN_RESTART_MPROXY


然后在rc.c的handle_notifications()加上:
else if (strcmp(entry->d_name, RCN_RESTART_KMS) == 0){
        restart_kms();
}


最后写restart_kms();这个函数
内容就控脚本里写的啊:检测,设置,运行啥的



我的恩山、我的无线 The best wifi forum is right here.
回复

使用道具 举报

来自手机 | 显示全部楼层
lostlonger 发表于 2017-4-29 14:27
没完全懂,你是想要kms和mproxy的程序文件能单独运行,停止不?

是这样的话,你定义参数的event_mask ...

多谢!我就是不会写restart_kms();这个函数。
我的恩山、我的无线 The best wifi forum is right here.
回复

使用道具 举报

lostlonger 发表于 2017-4-29 14:27
没完全懂,你是想要kms和mproxy的程序文件能单独运行,停止不?

是这样的话,你定义参数的event_mask ...

脚本是这样  
mproxy -l $mproxy_wport -d

vlmcsd -l syslog -L 0.0.0.0kms_wport

写成函数应该怎么写呢?
我的恩山、我的无线 The best wifi forum is right here.
回复

使用道具 举报

 楼主| | 显示全部楼层
nns 发表于 2017-4-29 14:56
脚本是这样  
mproxy -l $mproxy_wport -d

用eval(); doSystem();

看看这样行不行,我也不是专业的,哈

void restart_mproxy(void)
{
        char *mproxy_wport = nvram_safe_get("mproxy_wport");

        if (nvram_match("mproxy_wopen", "0") && ((pids("mproxy")) ? 1 : 0))        {
                doSystem("killall %s", "mproxy");
                return;
        }
               
        if (nvram_match("mproxy_wopen", "0"))
                return;

        eval("/sbin/mproxy", "-l", *mproxy_wport, "-d");
}
我的恩山、我的无线 The best wifi forum is right here.
回复

使用道具 举报

 楼主| | 显示全部楼层
lostlonger 发表于 2017-4-29 18:56
用eval(); doSystem();

看看这样行不行,我也不是专业的,哈

kms 的也一样,照葫芦画瓢,哈
我的恩山、我的无线 The best wifi forum is right here.
回复

使用道具 举报

本帖最后由 蓝色小小 于 2017-4-29 22:05 编辑

楼主对www文件的改动挺大,删除和添加也没在有说明,最好把调整的也注释,是不是少一个压缩包xware.tgz
ifneq ($(STORAGE_ENABLED),y)
        rm -f $(INSTALLDIR)/www/Advanced_AiDisk_others.asp
        rm -f $(INSTALLDIR)/www/Advanced_AiDisk_samba.asp
        rm -f $(INSTALLDIR)/www/device-map/disk.asp
endif

        rm -f $(INSTALLDIR)/www/aidisk.asp
        rm -f $(INSTALLDIR)/www/Advanced_AiDisk_ftp.asp
        rm -f $(INSTALLDIR)/www/disk_folder_tree.js
        rm -f $(INSTALLDIR)/www/device-map/safely_remove_disk.asp
        rm -rf $(INSTALLDIR)/www/aidisk
        rm -rf $(INSTALLDIR)/www/images/AiDisk
        rm -rf $(INSTALLDIR)/www/images/Tree


这段主要是取消一些显示还是去掉不使用的功能

看到楼主的热心真是挺赞的。
一直有个问题没有明白,对mtd_storage.sh里添加一些脚本中文注释,编译正常,可是安装后却所有脚本不能正常加载,都是空白。脚本不正常加载后固件也不能使用
还有在加入$的内容。其它都正常的情况下,就$会成为空格。。是不是也要写成 \$ 才行。这个\是什么个说法。


我的恩山、我的无线 The best wifi forum is right here.
回复

使用道具 举报

来自手机 | 显示全部楼层
lostlonger 发表于 2017-4-29 18:59
kms 的也一样,照葫芦画瓢,哈

修改了编译出来2个都没法运行,用ps看不到进程
我的恩山、我的无线 The best wifi forum is right here.
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

有疑问请添加管理员QQ86788181|手机版|小黑屋|Archiver|恩山无线论坛(常州市恩山计算机开发有限公司版权所有) ( 苏ICP备05084872号 )

GMT+8, 2024-4-27 02:35

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

| 江苏省互联网有害信息举报中心 举报信箱:js12377 | @jischina.com.cn 举报电话:025-88802724 本站不良内容举报信箱:68610888@qq.com 举报电话:0519-86695797

快速回复 返回顶部 返回列表