【源码解析】openwrt架构页面上传下载文件
本文最后更新于 28 天前,其中的信息可能已经有所发展或是发生改变。

openwrt架构在web页面接口将文件的导出导入,例如固件升级,配置文件导出导入;主要流程如下

  1. js上创建一个from表单,表单中携带着文件传输的请求
  2. uhttp模块处理这个请求,在/rom/www/cgi-bin目录下去寻找对应的接口
  3. 底层cgi-io模块实现具体业务

整体流程如下图

以下用配置文件导出举例

js代码

代码路径:package/feeds/luci/luci-mod-system/htdocs/luci-static/resources/view/system/backup.js

handleBackup: function() {
    var thit= this;
    return thit.handleCreartBackup().then(function(){
        var form = E('form', {
            method: 'post',
            action: L.env.cgi_base + '/cgi-backup',
            enctype: 'application/x-www-form-urlencoded'
        }, E('input', { type: 'hidden', name: 'sessionid', value: rpc.getSessionID() }));

        var div = document.querySelector('#view');
        div.appendChild(form);

        form.submit();
        form.parentNode.removeChild(form);
    });
},

uhttpd模块

uhttpd/rom/www/cgi-bin目录下调用对应cgi接口

代码路径:build_dir/target-arm/uhttpd-2020-10-01-3abcc891/main.c

// 初始化cgi接口路径
static void init_defaults_pre(void)
{
    conf.script_timeout = 60;
    conf.network_timeout = 30;
    conf.http_keepalive = 20;
    conf.max_script_requests = 3;
    conf.max_connections = 100;
    conf.realm = "Protected Area";
    conf.cgi_prefix = "/cgi-bin";
    conf.cgi_path = "/sbin:/usr/sbin:/bin:/usr/bin";
    INIT_LIST_HEAD(&conf.cgi_alias);
    INIT_LIST_HEAD(&conf.lua_prefix);
}

查看uhttp相关配置文件可以找到这个字段的含义

代码路径:build_dir/target-arm/uhttpd-2020-10-01-3abcc891/.pkgdir/uhttpd/etc/config/uhttpd

# CGI url prefix, will be searched in docroot.
# Default is /cgi-bin
option cgi_prefix    /cgi-bin

cgi-io模块

cig-io模块实际上主要是实现业务上的逻辑,按照业务要求将数据获取后写入到自身进程的标准输出中,此处详细代码省略;

由此可以断定浏览器与cgi-io之间还有一个中间层即uhttpd

编译产物

cgi-io模块编译产物与自身同名也叫cgi-io,同时会创建数个软连接指向这个编译产物

代码路径:package/feeds/packages/cgi-io/Makefile

define Package/cgi-io/install
    $(INSTALL_DIR) $(1)/usr/libexec $(1)/www/cgi-bin/
    $(INSTALL_BIN) $(PKG_BUILD_DIR)/cgi-io $(1)/usr/libexec
    $(LN) ../../usr/libexec/cgi-io $(1)/www/cgi-bin/cgi-upload
    $(LN) ../../usr/libexec/cgi-io $(1)/www/cgi-bin/cgi-download
    $(LN) ../../usr/libexec/cgi-io $(1)/www/cgi-bin/cgi-backup
    $(LN) ../../usr/libexec/cgi-io $(1)/www/cgi-bin/cgi-exportlogs
    $(LN) ../../usr/libexec/cgi-io $(1)/www/cgi-bin/cgi-tarlogs
    $(LN) ../../usr/libexec/cgi-io $(1)/www/cgi-bin/cgi-exec
endef
上一篇
下一篇