networks.lua 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130
  1. --[[
  2. LuCI - Lua Configuration Interface
  3. Copyright 2019 lisaac <https://github.com/lisaac/luci-app-dockerman>
  4. ]]--
  5. require "luci.util"
  6. local uci = luci.model.uci.cursor()
  7. local docker = require "luci.model.docker"
  8. local dk = docker.new()
  9. local networks
  10. local res = dk.networks:list()
  11. if res.code < 300 then networks = res.body else return end
  12. local get_networks = function ()
  13. local data = {}
  14. if type(networks) ~= "table" then return nil end
  15. for i, v in ipairs(networks) do
  16. local index = v.Created .. v.Id
  17. data[index]={}
  18. data[index]["_selected"] = 0
  19. data[index]["_id"] = v.Id:sub(1,12)
  20. data[index]["_name"] = v.Name
  21. data[index]["_driver"] = v.Driver
  22. if v.Driver == "bridge" then
  23. data[index]["_interface"] = v.Options["com.docker.network.bridge.name"]
  24. elseif v.Driver == "macvlan" then
  25. data[index]["_interface"] = v.Options.parent
  26. end
  27. data[index]["_subnet"] = v.IPAM and v.IPAM.Config[1] and v.IPAM.Config[1].Subnet or nil
  28. data[index]["_gateway"] = v.IPAM and v.IPAM.Config[1] and v.IPAM.Config[1].Gateway or nil
  29. end
  30. return data
  31. end
  32. local network_list = get_networks()
  33. -- m = Map("docker", translate("Docker"))
  34. m = SimpleForm("docker", translate("Docker"))
  35. m.submit=false
  36. m.reset=false
  37. network_table = m:section(Table, network_list, translate("Networks"))
  38. network_table.nodescr=true
  39. network_selecter = network_table:option(Flag, "_selected","")
  40. network_selecter.template = "dockerman/cbi/xfvalue"
  41. network_id = network_table:option(DummyValue, "_id", translate("ID"))
  42. network_selecter.disabled = 0
  43. network_selecter.enabled = 1
  44. network_selecter.default = 0
  45. network_selecter.render = function(self, section, scope)
  46. self.disable = 0
  47. if network_list[section]["_name"] == "bridge" or network_list[section]["_name"] == "none" or network_list[section]["_name"] == "host" then
  48. self.disable = 1
  49. end
  50. Flag.render(self, section, scope)
  51. end
  52. network_name = network_table:option(DummyValue, "_name", translate("Network Name"))
  53. network_driver = network_table:option(DummyValue, "_driver", translate("Driver"))
  54. network_interface = network_table:option(DummyValue, "_interface", translate("Parent Interface"))
  55. network_subnet = network_table:option(DummyValue, "_subnet", translate("Subnet"))
  56. network_gateway = network_table:option(DummyValue, "_gateway", translate("Gateway"))
  57. network_selecter.write = function(self, section, value)
  58. network_list[section]._selected = value
  59. end
  60. docker_status = m:section(SimpleSection)
  61. docker_status.template = "dockerman/apply_widget"
  62. docker_status.err=docker:read_status()
  63. docker_status.err=docker_status.err and docker_status.err:gsub("\n","<br>"):gsub(" ","&nbsp;")
  64. if docker_status.err then docker:clear_status() end
  65. action = m:section(Table,{{}})
  66. action.notitle=true
  67. action.rowcolors=false
  68. action.template="cbi/nullsection"
  69. btnnew=action:option(Button, "_new")
  70. btnnew.inputtitle= translate("New")
  71. btnnew.template = "dockerman/cbi/inlinebutton"
  72. btnnew.notitle=true
  73. btnnew.inputstyle = "add"
  74. btnnew.forcewrite = true
  75. btnnew.write = function(self, section)
  76. luci.http.redirect(luci.dispatcher.build_url("admin/docker/newnetwork"))
  77. end
  78. btnremove = action:option(Button, "_remove")
  79. btnremove.inputtitle= translate("Remove")
  80. btnremove.template = "dockerman/cbi/inlinebutton"
  81. btnremove.inputstyle = "remove"
  82. btnremove.forcewrite = true
  83. btnremove.write = function(self, section)
  84. local network_selected = {}
  85. local network_name_selected = {}
  86. local network_driver_selected = {}
  87. -- 遍历table中sectionid
  88. local network_table_sids = network_table:cfgsections()
  89. for _, network_table_sid in ipairs(network_table_sids) do
  90. -- 得到选中项的名字
  91. if network_list[network_table_sid]._selected == 1 then
  92. network_selected[#network_selected+1] = network_list[network_table_sid]._id --network_name:cfgvalue(network_table_sid)
  93. network_name_selected[#network_name_selected+1] = network_list[network_table_sid]._name
  94. network_driver_selected[#network_driver_selected+1] = network_list[network_table_sid]._driver
  95. end
  96. end
  97. if next(network_selected) ~= nil then
  98. local success = true
  99. docker:clear_status()
  100. for ii, net in ipairs(network_selected) do
  101. docker:append_status("Networks: " .. "remove" .. " " .. net .. "...")
  102. local res = dk.networks["remove"](dk, {id = net})
  103. if res and res.code >= 300 then
  104. docker:append_status("code:" .. res.code.." ".. (res.body.message and res.body.message or res.message).. "\n")
  105. success = false
  106. else
  107. docker:append_status("done\n")
  108. if network_driver_selected[ii] == "macvlan" then
  109. docker.remove_macvlan_interface(network_name_selected[ii])
  110. end
  111. end
  112. end
  113. if success then
  114. docker:clear_status()
  115. end
  116. luci.http.redirect(luci.dispatcher.build_url("admin/docker/networks"))
  117. end
  118. end
  119. return m