华硕改版的Koolshare软件中心插件开发方法汇总

相信使用华硕路由器官方改版梅林固件的小伙伴很大大部分是因为Koolshare软件中心,有了它,可以通过安装插件获得更多玩法。

其实没有Koolshare时,定制新功能也是可以的,只不过一切操作都是通过命令完成(只适合开发人员),少了界面的直观和简单(更适合大众)。

那么,为了让新功能可以让更多人可以使用到,开发一个Koolshare软件中心插件,并分享出来帮助大家使用。

v1.0版本软件中心插件开发方法

开发1.0版本插件有完整的开发教程: 梅林AM380软件中心插件开发教程详解

这个版本的文档编写的还算不错,基本上参考下来就可以编写出自己的插件来。

v1.0和v1.5两个版本都使用了

  • skipdb: 嵌入式 k/v 数据库, 编译大小只有 300k。

skipdb可以代替nvram,并拥有比nvram更强大的功能。为了在嵌入式下更少的占用jffs的空间。建议最多使用配置条目为1w。(merlin正常使用nvram的配置条目为2000条) 当jffs占用大于8M时,会进行一次refresh,重新计算空间。 skipdbv2源码地址

了解更多可以阅读之前的文章380固件的Clash插件开发总结

v1.5版本软件中心插件开发方法

开发1.5版本插件需要提前阅读开发须知了解与1.0版本插件的差别。

API获取数据方法

var $j = jQuery.noConflict();
var dbus = {};

function get_dbus_data() {
    $j.ajax({
        type: "GET",
        url: "/_api/clash",
        async: false,
        success: function(data) {
            dbus = data.result[0];
            conf2obj();
        }
    });
}

function conf2obj(){
    var params = ['clash_group_type', 'clash_provider_file' ];
    var params_chk = ['clash_gfwlist_mode', 'clash_trans', 'clash_enable', 'clash_use_local_dns' ];
    for (var i = 0; i < params_chk.length; i++) {
        if(dbus[params_chk[i]]){
            E(params_chk[i]).checked = dbus[params_chk[i]] == "on";
        }
    }
    for (var i = 0; i < params.length; i++) {
        if(dbus[params[i]]){
            E(params[i]).value = dbus[params[i]];
        }
    }
}

API提交数据方法

var $j = jQuery.noConflict();

//提交任务方法,实时日志显示
function post_dbus_data(script, arg, obj, flag){
    var id = parseInt(Math.random() * 100000000);
    var postData = {"id": id, "method": script, "params":[arg], "fields": obj};
    $j.ajax({
        type: "POST",
        cache:false,
        url: "/_api/",
        data: JSON.stringify(postData),
        dataType: "json",
        success: function(response){
            if(response.result == id){
                if(flag && flag == "1"){
                    refreshpage();
                }else if(flag && flag == "2"){
                    //continue;
                    //do nothing
                }else{
                    document.getElementById("loadingIcon").style.display = "";
                    show_status();
                }
            }
        }
    });
}

function apply_action(action, data){
    if( ! action ) {
        return ;
    }
    if ( !data ) {
        data = dbus
    }
    post_dbus_data("clash_control.sh", action,  data);
}
function service_stop() {
    apply_action("stop");
}
function service_start() {
    apply_action("start");
}
function switch_service() {
    if (document.getElementById('clash_enable').checked) {
        dbus["clash_enable"] = "on";
        service_start();
    } else {
        dbus["clash_enable"] = "off";
        service_stop();
    }
}

更新执行过程日志信息方法

  1. 脚本需要将执行日志内容保存到 /tmp/upload/xxxx.log 文件中。
  2. 通过调用GET方法获取日志信息,直到找到XU6J03M6结束字符串(384/386版本需要在脚本中输出,380版本是CGI服务自动输出)为止。
//显示脚本执行过程的日志信息
function show_status() {
    $j.ajax({
        url: '/_temp/clash_status.log',
        type: 'GET',
        async: true,
        cache: false,
        dataType: 'text',
        success: function(response) {
            var retArea = E("clash_text_log");
            if (response.search("XU6J03M6") != -1) {
                document.getElementById("loadingIcon").style.display = "none";
                retArea.value = response.replace("XU6J03M6", " ");
                retArea.scrollTop = retArea.scrollHeight;
                return true;
            }
            if (_responseLen == response.length) {
                noChange++;
            } else {
                noChange = 0;
            }
            if (noChange > 1000) {
                document.getElementById("loadingIcon").style.display = "none";
                return false;
            } else {
                setTimeout("show_status();", 500);
            }
            retArea.value = response.replace("XU6J03M6", " ");
            retArea.scrollTop = retArea.scrollHeight;
            _responseLen = response.length;
        },
        error: function() {
            setTimeout("show_status();", 500);
        }
    });
}

离线安装非法关键词检测屏蔽方法

离线安装时,非法关键词检测是在ks_tar_install.sh脚本中设置的,检测关键词信息如下:

    local ILLEGAL_KEYWORDS="ss|ssr|shadowsocks|shadowsocksr|v2ray|trojan|clash|wireguard|koolss|brook|fuck"

屏蔽它的方法就是将关键词替换个无意义的词,例如"xxxxxxxxx"。

接下来,我们就来实现这个操作,在路由器控制台终端执行如下命令:


# 先检查关键词变量是否存在
grep ILLEGAL_KEYWORDS /koolshare/scripts/ks_tar_install.sh

# 替换掉非法关键词信息
sed -i 's/local ILLEGAL_KEYWORDS=.*/local ILLEGAL_KEYWORDS="xxxxxxxxxxxxxxxxxxx"/g' /koolshare/scripts/ks_tar_install.sh

就这样,以后可以通过离线上传安装了。