精华内容
下载资源
问答
  • confd

    2018-09-20 17:07:00
    1.下载安装confd ]# wget https://github.com/kelseyhightower/confd/releases/download/v0.15.0/confd-0.15.0-linux-amd64 ]# mkdir -p /opt/confd/bin ]# mv confd-0.15.0-linux-amd64 /opt/confd/bin/confd ....
    1.下载安装confd
    ]# wget https://github.com/kelseyhightower/confd/releases/download/v0.15.0/confd-0.15.0-linux-amd64
    ]# mkdir -p /opt/confd/bin
    ]# mv confd-0.15.0-linux-amd64 /opt/confd/bin/confd
    ]# chmod +x /opt/confd/bin/confd
    ]# export PATH="$PATH:/opt/confd/bin"
     
    为了方便,我一般将confd直接安装到/sbin中
     
    2.创建confd配置目录
    ]# mkdir -p /etc/confd/{conf.d,templates}
     
    目录结构如下:
    ├── confd
    │   ├── conf.d
    │   │   └── haproxy.toml
    │   ├── confd.toml
    │   └── templates
    │       └── haproxy.cfg.tmpl
     
    conf.d 目录中是应用的配置文件定义
    templates 目录中是应用的模版文件
    confd.toml 是confd本身的配置文件
     
    3.confd本身的配置文件  
    ]# cat /etc/confd/confd.toml
    backend = "etcd"
    confdir = "/etc/confd"
    log-level = "debug"
    interval = 60
    nodes = [
      "http://10.1.1.1:2379",
      "http://10.1.1.2:2379",
      "http://10.1.1.3:2379",
    ]
    prefix = "/production"
    scheme = "https"
     
    配置很简单明了
     
    backend 后端类型,默认etcd
    confdir confd的配置文件目录,默认/etc/confd
    interval confd向后端轮询的周期,单位”秒“,默认600秒
    log-level 日志详细等级,默认“info”
    node 后端节点地址
    prefix 访问key的前缀,默认是“/”
    scheme  访问后端的URI scheme ,可以是"http"或"https"
     
    更多配置项,自行参考confd的github文档。
     
    3.创建confd启动文件
    ]# cat /etc/systemd/system/confd.service
    [Unit]
    Description=Confd
    After=haproxy.service
     
    [Service]
    ExecStart=/sbin/confd
    Restart=always
     
    [Install]
    WantedBy=basic.target
     
    ]# systemctl enable /etc/systemd/system/confd.service
    ]# systemctl start /etc/systemd/system/confd.service
    ]# journalctl -f -u confd.service
     
    4.创建haproxy的应用配置定义
    ]# cat /etc/confd/conf.d/haproxy.toml
     
    [template]
    src = "haproxy.cfg.tmpl"
    dest = "/etc/haproxy/haproxy.cfg"
    keys = [
            "/app/your_awesome_app"
    ]
    reload_cmd = "echo restarting && /usr/bin/systemctl reload haproxy"
     
    src 定义了模板文件
    dest 定义了用模版生成的配置文件
    keys 是我们要监控的etcd中的key
    reload_cmd 是生成confd生成新的配置以后的动作
     
    5.创建haproxy的模板文件
    ]# cat /etc/confd/templates/haproxy.cfg.tmpl)
     
    global
        log 127.0.0.1    local0
        log 127.0.0.1    local1 notice
        maxconn 4096
        user haproxy
        group haproxy
        daemon
        stats socket /var/run/haproxy.sock mode 600 level admin    
     
    defaults
        log    global
        mode    http
        option    httplog
        option    dontlognull
        retries    3
        option redispatch
        maxconn    2000
        contimeout    5000
        clitimeout    50000
        srvtimeout    50000
        option forwardfor
        option http-server-close
     
    frontend stats
        bind *:8888
        stats enable
        stats uri /
     
    frontend http-in
        bind *:80
        default_backend application-backend
     
    backend application-backend
        balance leastconn
        option httpclose
        option forwardfor
        cookie JSESSIONID prefix
     
        {{range getvs "/app/your_awesome_app*"}}
        server {{.}} cookie A check
        {{end}}
     
    backend app
        balance     roundrobin
        {{range gets "/app/servers/*"}}
        server {{base .Key}} {{.Value}} check inter 5000 fall 1 rise 2
        {{end}}
     
     
    6.confd模板相关
     
    6.1 模板内内嵌的语法支持,全部需要加{{}}来标记。
    6.2 在模板文件内, . 代表了当前变量,即在非循环体内,.就代表了传入的那个变量。
    6.3 模板内的变量定义方法:  {{$variable := value}},例如{{$username := "jhon"}}
     
    假设我们定义了一个结构体:
     
    type Article struct {
        ArticleId int
        ArticleContent string
     
    那么我们在模板内可以通过.ArticleContent和.ArticleId的方式来获取并把变量的内容渲染到模板内。
     

    {{.ArticleContent}}{{.ArticleId}}

     
    6.4 with语句创建一个封闭的作用域,在其范围内,可以使用.action,而与外面的.无关,只与with的参数有关:
     
    {{ with arg }}
        此时的点 . 就是arg
    {{ end }}
     
    6.5 循环依靠range语句
     
    {{range gets "/services/zookeeper/*"}}
    {{$data := json .Value}}
      id: {{$data.Id}}
      ip: {{$data.IP}}
    {{end}}
     
    6.6 如果取回的值是json格式的,可以创建一个map
    例如: etcdctl set /myapp/upstream/app1 '{"IP": "99.99.99.99","NAME": "jhon"}'
     
    {{with get "/myapp/upstream/app1"}}
      key: {{base .Key}}
      {{$data := json .Value}}
      Ipaddress: {{$data.IP}} Username: {{$data.NAME}}
    {{end}}
     
    6.7 confd一些常用的函数
    get 返回匹配的“键-值”对
    gets 返回所有匹配的“键-值”对
     
    getv 返回匹配“键”的“值”
    getvs 返回所有匹配“键”的“值”
     
    ls 返回指定路径下的所有子键
    lsdir 返回指定路径下所有具有子目录的子键
    dir 返回指定“键”的父目录
    exist 检查指定的“键”是否存在
    base 返回路径的最后一个元素
     
    另有一些go函数的别名,具体用法看文档
    join
    split
    replace
    toUpper
    toLower
    getenv
    datatime
     
    参考文档:
    https://github.com/kelseyhightower/confd/blob/master/docs/templates.md
    https://seanmcgary.com/posts/automatically-scale-haproxy-with-confd-and-etcd/
    https://www.jianshu.com/p/05671bab2357
    https://www.cnblogs.com/iamdoufu/p/4533063.html

    转载于:https://www.cnblogs.com/zhengchunyuan/p/9681947.html

    展开全文
  • confd out of sync

    2020-12-05 04:26:55
    <div><p>When I run confd, I got the out of sync errors, here is the log: <p>2016-05-03T03:38:07+08:00 localhost.localdomain confd[39170]: INFO Backend set to etcd 2016-05-03T03:38:07+08:00 ...
  • confd-init 用于为 haproxy 初始化 confd 的 docker 文件 注意:也许不需要。 我们可以添加一个前缀来启动 confd 容器。
  • confd study

    2019-09-11 14:47:14
    Etcd+Confd实现Nginx配置文件自动管理 - 李振良的技术博客 - 51CTO技术博客 基于etcd+confd通过nginx对docker服务混合注册发现详解 - 奔跑的linux - 51CTO技术博客 confd - 推酷 etcd:从应用...
    展开全文
  • 带有 confd 的死简单 nginx 代理传递。 docker run -d --name nginx dockerinpractice/confd-nginx 在/app/upstream/下添加您的 etcd 上游。
  • confd用法

    2019-10-25 21:40:49
    转载自:...1. confd的部署 以下Linux系统为例。 下载confd的二进制文件,下载地址为:https://github.com/kelseyhightower/confd/releases。例如: # Download the binary wget https://github.co...

    转载自:https://blog.csdn.net/huwh_/article/details/82286934

    1. confd的部署

    以下Linux系统为例。

    下载confd的二进制文件,下载地址为:https://github.com/kelseyhightower/confd/releases。例如:

    # Download the binary wget https://github.com/kelseyhightower/confd/releases/download/v0.16.0/confd-0.16.0-linux-amd64
    # 重命名二进制文件,并移动到PATH的目录下 mv confd-0.16.0-linux-amd64 /usr/local/bin/confd chmod +x /usr/local/bin/confd
    # 验证是否安装成功 confd --help
    

    2. confd的配置

    Confd通过读取后端存储的配置信息来动态更新对应的配置文件,对应的后端存储可以是etcd,redis等,其中etcd的v3版本对应的存储后端为etcdv3。

    2.1. 创建confdir

    confdir底下包含两个目录:

    conf.d:confd的配置文件,主要包含配置的生成逻辑,例如模板源,后端存储对应的keys,命令执行等。
    templates:配置模板Template,即基于不同组件的配置,修改为符合 Golang text templates的模板文件。
    
    sudo mkdir -p /etc/confd/{conf.d,templates}
    

    2.2. Template Resources

    模板源配置文件是TOML格式的文件,主要包含配置的生成逻辑,例如模板源,后端存储对应的keys,命令执行等。默认目录在/etc/confd/conf.d。

    参数说明:

    必要参数

    • dest (string) - The target file.
    • keys (array of strings) - An array of keys.
    • src (string) - The relative path of a configuration template.

    可选参数

    • gid (int) - The gid that should own the file. Defaults to the effective gid.
    • mode (string) - The permission mode of the file.
    • uid (int) - The uid that should own the file. Defaults to the effective uid.
    • reload_cmd (string) - The command to reload config.
    • check_cmd (string) - The command to check config. Use {{.src}} to reference the rendered source template.
    • prefix (string) - The string to prefix to keys.

    例子

    例如:/etc/confd/conf.d/myapp-nginx.toml

    [template] 
    prefix = "/myapp" 
    src = "nginx.tmpl" 
    dest = "/tmp/myapp.conf" 
    owner = "nginx" 
    mode = "0644" 
    keys = [
    	 "/services/web"
      ]
    check_cmd = "/usr/sbin/nginx -t -c {{.src}}" 
    reload_cmd = "/usr/sbin/service nginx reload"
    

    2.3. Template

    Template定义了单一应用配置的模板,默认存储在/etc/confd/templates目录下,模板文件符合Go的text/template格式。

    模板文件常用函数有base,get,gets,lsdir,json等。具体可参考https://github.com/kelseyhightower/confd/blob/master/docs/templates.md。

    例子:

    /etc/confd/templates/nginx.tmpl

    {{range $dir := lsdir "/services/web"}}
    upstream {{base $dir}} {
        {{$custdir := printf "/services/web/%s/*" $dir}}{{range gets $custdir}}
        server {{$data := json .Value}}{{$data.IP}}:80;
        {{end}}
    }
    
    server {
        server_name {{base $dir}}.example.com;
        location / {
            proxy_pass {{base $dir}};
        }
    }
    {{end}}
    

    3. 创建后端存储的配置数据

    以etcdv3存储为例,在etcd中创建以下数据。

    etcdctl --endpoints=$endpoints put /services/web/cust1/2 '{"IP": "10.0.0.2"}'
    etcdctl --endpoints=$endpoints put /services/web/cust2/2 '{"IP": "10.0.0.4"}'
    etcdctl --endpoints=$endpoints put /services/web/cust2/1 '{"IP": "10.0.0.3"}'
    etcdctl --endpoints=$endpoints put /services/web/cust1/1 '{"IP": "10.0.0.1"}'
    

    4. 启动confd的服务

    confd支持以daemon或者onetime两种模式运行,当以daemon模式运行时,confd会监听后端存储的配置变化,并根据配置模板动态生成目标配置文件。

    如果以daemon模式运行,则执行以下命令:

    confd -watch -backend etcdv3 -node http://172.16.5.4:12379 &
    
    # 执行命令
    confd -onetime -backend etcdv3 -node http://172.16.5.4:12379
    
    # output
    2018-05-11T18:04:59+08:00 k8s-dbg-master-1 confd[35808]: INFO Backend set to etcdv3
    2018-05-11T18:04:59+08:00 k8s-dbg-master-1 confd[35808]: INFO Starting confd
    2018-05-11T18:04:59+08:00 k8s-dbg-master-1 confd[35808]: INFO Backend source(s) set to http://172.16.5.4:12379
    2018-05-11T18:04:59+08:00 k8s-dbg-master-1 confd[35808]: INFO /root/myapp/twemproxy/conf/twemproxy.conf has md5sum 6f0f43abede612c75cb840a4840fbea3 should be 32f48664266e3fd6b56ee73a314ee272
    2018-05-11T18:04:59+08:00 k8s-dbg-master-1 confd[35808]: INFO Target config /root/myapp/twemproxy/conf/twemproxy.conf out of sync
    2018-05-11T18:04:59+08:00 k8s-dbg-master-1 confd[35808]: INFO Target config /root/myapp/twemproxy/conf/twemproxy.conf has been updated
    

    5. 查看生成的配置文件

    在/etc/confd/conf.d/myapp-nginx.toml中定义的配置文件的生成路径为/tmp/myapp.conf。
    [root@k8s-dbg-master-1 dest]# cat myapp.conf

    upstream cust1 {
        server 10.0.0.1:80;
        server 10.0.0.2:80;
    }
    
    server {
        server_name cust1.example.com;
        location / {
            proxy_pass cust1;
        }
    }
    
    upstream cust2 {
        server 10.0.0.3:80;
        server 10.0.0.4:80;
    }
    
    server {
        server_name cust2.example.com;
        location / {
            proxy_pass cust2;
        }
    }
    

    6. confd动态更新twemproxy

    6.1. twemproxy.toml

    confd的模板源文件配置:/etc/confd/conf.d/twemproxy.toml

    [template]
    src = "twemproxy.tmpl"
    dest = "/root/myapp/twemproxy/conf/twemproxy.conf"
    keys = [
      "/twemproxy/pool"
    ]
    check_cmd = "/usr/local/bin/nutcracker -t -c /root/myapp/twemproxy/conf/twemproxy.conf"
    reload_cmd = "bash /root/myapp/twemproxy/reload.sh"
    

    6.2. twemproxy.tmpl

    模板文件:/etc/confd/templates/twemproxy.tmpl

    global:
      worker_processes: 4         # 并发进程数, 如果为0, 这 fallback 回原来的单进程模型(不支持 config reload!)
      user: nobody                # worker 进程的用户, 默认 nobody. 只要主进程是 root 用户启动才生效.
      group: nobody               # worker 进程的用户组
      worker_shutdown_timeout: 30 # 单位为秒. 用于 reload 过程中在改时间段之后强制退出旧的 worker 进程.
    
    pools: {{range gets "/twemproxy/pool/*"}}
      {{base .Key}}: {{$pool := json .Value}}
        listen: {{$pool.ListenAddr.IP}}:{{$pool.ListenAddr.Port}}
        hash: fnv1a_64 # 选择实例的 hash 规则
        distribution: ketama
        auto_eject_hosts: true # server 有问题是否剔除
        redis: true # 是否为 Redis 协议
        {{if $pool.Password}}redis_auth: {{$pool.Password}}{{end}}
        server_retry_timeout: 5000 # 被剔除多长时间后会重试
        server_connections: 25 # NOTE: server 连接池的大小, 默认为 1, 建议调整
        server_failure_limit: 5 # 失败多少次后暂时剔除
        timeout: 1000 # Server 超时时间, 1 sec
        backlog: 1024 # 连接队列大小
        preconnect: true # 预连接大小
        servers:{{range $server := $pool.Servers}}
         - {{$server.IP}}:{{$server.Port}}:1 {{if $server.Master}}master{{end}}
        {{end}}
    {{end}}
    

    6.3. etcd中的配置格式

    etcd中的配置通过一个map来定义为完整的配置内容。其中key是twemproxy中pool的名称,value是pool的所有内容。

    配置对应go结构体如下:

    type Pool struct{
        ListenAddr  ListenAddr `json:"ListenAddr,omitempty"`
        Servers []Server `json:"Servers,omitempty"`
        Password string `json:"Password,omitempty"`
    }
    
    type ListenAddr struct {
        IP string `json:"IP,omitempty"`
        Port string `json:"Port,omitempty"`
    }
    
    type Server struct {
        IP string `json:"IP,omitempty"`
        Port string `json:"Port,omitempty"`
        Master bool `json:"Master,omitempty"`
    }
    

    配置对应JSON格式如下:

    {
        "ListenAddr": {
            "IP": "192.168.5.7",
            "Port": "22225"
        },
        "Servers": [
            {
                "IP": "10.233.116.168",
                "Port": "6379",
                "Master": true
            },
            {
                "IP": "10.233.110.207",
                "Port": "6379",
                "Master": false
            }
        ],
        "Password": "987654"
    }
    

    6.4. 生成twemproxy配置文件

    global:
      worker_processes: 4         # 并发进程数, 如果为0, 这 fallback 回原来的单进程模型(不支持 config reload!)
      user: nobody                # worker 进程的用户, 默认 nobody. 只要主进程是 root 用户启动才生效.
      group: nobody               # worker 进程的用户组
      worker_shutdown_timeout: 30 # 单位为秒. 用于 reload 过程中在改时间段之后强制退出旧的 worker 进程.
    
    pools:
      redis1:
        listen: 192.168.5.7:22223
        hash: fnv1a_64 # 选择实例的 hash 规则
        distribution: ketama
        auto_eject_hosts: true # server 有问题是否剔除
        redis: true # 是否为 Redis 协议
        redis_auth: 987654
        server_retry_timeout: 5000 # 被剔除多长时间后会重试
        server_connections: 25 # NOTE: server 连接池的大小, 默认为 1, 建议调整
        server_failure_limit: 5 # 失败多少次后暂时剔除
        timeout: 1000 # Server 超时时间, 1 sec
        backlog: 1024 # 连接队列大小
        preconnect: true # 预连接大小
        servers:
         - 10.233.116.169:6379:1
    
    
      redis2:
        listen: 192.168.5.7:22224
        hash: fnv1a_64 # 选择实例的 hash 规则
        distribution: ketama
        auto_eject_hosts: true # server 有问题是否剔除
        redis: true # 是否为 Redis 协议
        redis_auth: 987654
        server_retry_timeout: 5000 # 被剔除多长时间后会重试
        server_connections: 25 # NOTE: server 连接池的大小, 默认为 1, 建议调整
        server_failure_limit: 5 # 失败多少次后暂时剔除
        timeout: 1000 # Server 超时时间, 1 sec
        backlog: 1024 # 连接队列大小
        preconnect: true # 预连接大小
        servers:
         - 10.233.110.223:6379:1 master
    
         - 10.233.111.21:6379:1
    

    参考文章:

    https://github.com/kelseyhightower/confd/blob/master/docs/installation.md
    
    https://github.com/kelseyhightower/confd/blob/master/docs/quick-start-guide.md
    
    https://github.com/kelseyhightower/confd/blob/master/docs/template-resources.md
    
    https://github.com/kelseyhightower/confd/blob/master/docs/templates.md
    
    展开全文
  • nginx-confd 通过 confd 配置的 NGINX 服务发现 本地测试 您可以通过调整docker-compose.yml以匹配本地主机的配置,在本地机器上进行测试。 默认情况下,您需要有一个主机记录docker指向您的 docker 主机才能使其...
  • confd test

    2017-10-11 11:40:00
    vi /etc/confd/confd.toml backend = "consul"confdir = "/etc/confd"log-level = "debug"interval = 600nodes = [ "127.0.0.1:8500",]noop = false ./confd -onetime ./confd 转载于:...

    vi /etc/confd/confd.toml

    backend = "consul"
    confdir = "/etc/confd"
    log-level = "debug"
    interval = 600
    nodes = [
      "127.0.0.1:8500",
    ]
    noop = false

    ./confd -onetime

    ./confd

    转载于:https://www.cnblogs.com/mhc-fly/p/7649806.html

    展开全文
  • confd的使用

    千次阅读 2018-09-01 14:29:48
    1. confd的部署 以下Linux系统为例。 下载confd的二进制文件,下载地址为:https://github.com/kelseyhightower/confd/releases。例如: # Download the binary wget ...
  • Confd 0.10.0支持的HAProxy 1.5.x 暂时来自jnummelin / confd分支的ConfD,因为它具有用于Alpine Linux的预构建包 使用零停机时间重新配置(例如-代替harpy reload,这将删除所有连接,并将逐渐将新的连接转移到新...
  • 通过 Confd 自动生成的配置在 Nginx 后面运行同步网关
  • <div><p>I've cut a confd release based on the two branches Cory implemented - install updated to pull in this release.</p><p>该提问来源于开源项目:projectcalico/calicoctl</p></div>
  • nginx-confd-etcd 集装箱配置基于由生成的值 。 主要用于集群。 我从开始,但我不喜欢 sidekick 实例的想法。 我将 sidekick 更改为 Registrator 并在 Confd 配置中进行了一些更改。 集群配置的先决条件 这个 ...
  • confd 代码分析

    2019-05-30 22:53:45
    Confd代码比较简单,这里没有分析它的各种backend的代码,只分析了主体执行部分,涉及: *confd.go *processor.go *resource.go main 函数在confd.go 中,依次执行 initConfig ,读取-configfile ,结构体为...
  • confd 使用来自 etcd 的模板和数据管理本地应用程序配置文件 一个轻量级的配置管理工具,专注于: 通过轮询 etcd 和处理模板资源来同步配置文件。 重新加载应用程序以获取新的配置文件更改 注意:要获得 confd ...
  • Turn off confd discovery

    2020-11-22 15:22:02
    <p>Currently, all other calico components besides confd (i.e. Felix, startup.go, calicoctl, and k8s-policy) do not connect with "discovery" on. They ignore the bad advertise url and have no ...
  • confd中文文档

    千次阅读 2019-03-01 09:36:05
    开始之前请确认 下载并安装了confd. 选择一个后端 confd支持以下后端: etcd consul vault 环境变量 文件 redis zookeeper dynamodb rancher ssm (AWS Simple Systems Manager Parameter Store) 添加keys 本教程...
  • Confd 配置指导

    2018-04-04 14:52:00
    Before we begin be sure todownload and install confd. Select a backend confd supports the following backends: etcd consul vault environment variables redis zookeeper dyn...
  • Move to use upstream confd

    2020-11-22 15:17:10
    <p>confd generates O(n^2) work in regenerating the BIRD config, which is expected. However, it seems to always pick a single etcd cluster node to talk to, which results in overloading the chosen node....
  • confd+etcd

    2018-10-25 17:23:44
    Confd是一个轻量级的配置管理工具。通过查询Etcd,结合配置模板引擎,保持本地配置最新,同时具备定期探测机制,配置变更自动reload。其后端支持的数据类型有:etcd、consul、vault、environment variables、redis、...
  • ve been notified that the underlying cause is ConfD not able to resolve hostnames. <p>...
  • confd使用etcd作为后端配置的NGINX反向代理 这是一个使用作为后端通过动态配置的。 我们使用侦听etcd文件夹/applications更改,以防在/applications某些键更改时重新加载nginx.conf 。 这用于将请求代理到在...
  • confd动态配置文件详解

    千次阅读 2020-07-16 11:28:28
    confd介绍 Confd是一个轻量级的配置管理工具。通过查询后端存储,结合配置模板引擎,保持本地配置最新,同时具备定期探测机制,配置变更自动reload。 对应的后端存储可以是etcd,redis、zookeeper等等 confd的部署 ...
  • 2017-01-29T21:19:28Z cc366de4d3e2 confd[6]: INFO Starting confd 2017-01-29T21:19:28Z cc366de4d3e2 confd[6]: INFO Backend nodes set to http://etcd0:4001/ 2017-01-29T21:19:28Z cc366de4d3e2 confd[6]: ...
  • etcd+confd

    千次阅读 2017-03-03 16:37:15
    Confd适用于需要本地化文件配置的情景,比如动态获取配置后生成nginx配置文件。此时无法修改程序代码从而读取。 其余情况,直接使用etcd即可 http://www.tuicool.com/articles/BvAruif 使用etcd+confd...
  • Confd user name is empty

    2020-02-27 21:53:44
    问题:Confd 启动时报 "user name is empty"的错 后端存储:etcdv3 (开启Basic Auth认证) confd版本:confd-0.16.0-linux-amd64 这个报错会在以下三种情况下出现: 1、confd启动时没有加-username 、-password和-...
  • Add confd_only option

    2020-12-29 00:51:49
    <div><p>This PR adds an option $confd_only</code> (defaulting to false), that avoids using the Ubuntu style $conf_dir/sites-{available,enabled}</code> mechanism with symlinks. Obviously, the current ...
  • confd_user_guide-7.3.pdf

    2020-02-05 18:52:45
    This document provides a wealth of information about ConfD and how to use it for your particular needs. It is written to be useful both when read front-to-back and also for readers that need to dive ...
  • Once issue 318 is fixed, we can implement network-related queries in confd, based on changes done to the Python codebase in commit “Implement LUNetworkQuery”. </code></pre> <p>Originally added on ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 549
精华内容 219
关键字:

confd