summaryrefslogtreecommitdiffhomepage
path: root/applications/luci-app-dockerman/luasrc/model/cbi/dockerman/networks.lua
blob: 1659596a47ffa74ce8c759e3255d4394c5945e8d (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
--[[
LuCI - Lua Configuration Interface
Copyright 2019 lisaac <https://github.com/lisaac/luci-app-dockerman>
]]--

require "luci.util"
local uci = luci.model.uci.cursor()
local docker = require "luci.model.docker"
local dk = docker.new()
local networks
local res = dk.networks:list()
if res.code < 300 then networks = res.body else return end

local get_networks = function ()
  local data = {}

  if type(networks) ~= "table" then return nil end
  for i, v in ipairs(networks) do
    local index = v.Created .. v.Id
    data[index]={}
    data[index]["_selected"] = 0
    data[index]["_id"] = v.Id:sub(1,12)
    data[index]["_name"] = v.Name
    data[index]["_driver"] = v.Driver
    if v.Driver == "bridge" then
      data[index]["_interface"] = v.Options["com.docker.network.bridge.name"]
    elseif v.Driver == "macvlan" then
      data[index]["_interface"] = v.Options.parent
    end
    data[index]["_subnet"] = v.IPAM and v.IPAM.Config[1] and v.IPAM.Config[1].Subnet or nil
    data[index]["_gateway"] = v.IPAM and v.IPAM.Config[1] and v.IPAM.Config[1].Gateway or nil
  end
  return data
end

local network_list = get_networks()
-- m = Map("docker", translate("Docker"))
m = SimpleForm("docker", translate("Docker"))
m.submit=false
m.reset=false

network_table = m:section(Table, network_list, translate("Networks"))
network_table.nodescr=true

network_selecter = network_table:option(Flag, "_selected","")
network_selecter.template = "dockerman/cbi/xfvalue"
network_id = network_table:option(DummyValue, "_id", translate("ID"))
network_selecter.disabled = 0
network_selecter.enabled = 1
network_selecter.default = 0
network_selecter.render = function(self, section, scope)
  self.disable = 0
  if network_list[section]["_name"] == "bridge" or network_list[section]["_name"] == "none" or network_list[section]["_name"] == "host" then
    self.disable = 1
  end
  Flag.render(self, section, scope)
end

network_name = network_table:option(DummyValue, "_name", translate("Network Name"))
network_driver = network_table:option(DummyValue, "_driver", translate("Driver"))
network_interface = network_table:option(DummyValue, "_interface", translate("Parent Interface"))
network_subnet = network_table:option(DummyValue, "_subnet", translate("Subnet"))
network_gateway = network_table:option(DummyValue, "_gateway", translate("Gateway"))

network_selecter.write = function(self, section, value)
  network_list[section]._selected = value
end

docker_status = m:section(SimpleSection)
docker_status.template = "dockerman/apply_widget"
docker_status.err=docker:read_status()
docker_status.err=docker_status.err and docker_status.err:gsub("\n","<br>"):gsub(" ","&nbsp;")
if docker_status.err then docker:clear_status() end

action = m:section(Table,{{}})
action.notitle=true
action.rowcolors=false
action.template="cbi/nullsection"
btnnew=action:option(Button, "_new")
btnnew.inputtitle= translate("New")
btnnew.template = "dockerman/cbi/inlinebutton"
btnnew.notitle=true
btnnew.inputstyle = "add"
btnnew.forcewrite = true
btnnew.write = function(self, section)
  luci.http.redirect(luci.dispatcher.build_url("admin/docker/newnetwork"))
end
btnremove = action:option(Button, "_remove")
btnremove.inputtitle= translate("Remove")
btnremove.template = "dockerman/cbi/inlinebutton"
btnremove.inputstyle = "remove"
btnremove.forcewrite = true
btnremove.write = function(self, section)
  local network_selected = {}
  local network_name_selected = {}
  local network_driver_selected = {}
  -- 遍历table中sectionid
  local network_table_sids = network_table:cfgsections()
  for _, network_table_sid in ipairs(network_table_sids) do
    -- 得到选中项的名字
    if network_list[network_table_sid]._selected == 1 then
      network_selected[#network_selected+1] = network_list[network_table_sid]._id --network_name:cfgvalue(network_table_sid)
      network_name_selected[#network_name_selected+1] = network_list[network_table_sid]._name
      network_driver_selected[#network_driver_selected+1] = network_list[network_table_sid]._driver
    end
  end
  if next(network_selected) ~= nil then
    local success = true
    docker:clear_status()
    for ii, net in ipairs(network_selected) do
      docker:append_status("Networks: " .. "remove" .. " " .. net .. "...")
      local res = dk.networks["remove"](dk, {id = net})
      if res and res.code >= 300 then
        docker:append_status("code:" .. res.code.." ".. (res.body.message and res.body.message or res.message).. "\n")
        success = false
      else
        docker:append_status("done\n")
        if network_driver_selected[ii] == "macvlan" then
          docker.remove_macvlan_interface(network_name_selected[ii])
        end
      end
    end
    if success then
      docker:clear_status()
    end
    luci.http.redirect(luci.dispatcher.build_url("admin/docker/networks"))
  end
end

return m