#!/usr/libexec/flua local ucl = require("ucl") local parser = ucl.parser() local res,err = parser:parse_file('/mnt/openstack/latest/meta_data.json') if not res then print("Error parsing meta_data.json: " .. err) os.exit(1) end local obj = parser:get_object() local sshkeys = obj["public_keys"] if sshkeys then for _,v in pairs(sshkeys) do lfs.mkdir("/root/.ssh") f = io.open("/root/.ssh/authorized_keys", "w+") f:write(v .. "\n") f:close() end end local meh = obj["meh"] local hostname = obj["hostname"] if hostname then f = io.open("/etc/rc.conf.d/hostname", "w") f:write("hostname=\""..hostname.."\"\n") f:close() end -- network parser = ucl.parser() local res,err = parser:parse_file('/mnt/openstack/latest/network_data.json') if not res then print("Error parsing network_data.json: " .. err) os.exit(1) end obj = parser:get_object() -- grab ifaces local ns = io.popen('netstat -i --libxo json') local netres = ns:read("*a") ns:close() parser = ucl.parser() local res,err = parser:parse_string(netres) local ifaces = parser:get_object() local myifaces = {} for _,iface in pairs(ifaces["statistics"]["interface"]) do for o in iface["network"]:gmatch("") do local s = iface["address"]:lower() myifaces[s] = iface["name"] end end local mylinks = {} for _,v in pairs(obj["links"]) do local s = v["ethernet_mac_address"]:lower() mylinks[v["id"]] = myifaces[s] end local netif = io.open("/etc/rc.conf.d/netif", "w") local routing = io.open("/etc/rc.conf.d/routing", "w") local ipv6 = {} for _,v in pairs(obj["networks"]) do if v["type"] == "ipv4_dhcp" then netif:write("ifconfig_"..mylinks[v["link"]].."=\"DHCP\"\n") end if v["type"] == "ipv6" then table.insert(ipv6, mylinks[v["link"]]) netif:write("ifconfig_"..mylinks[v["link"]].."_ipv6=\"inet6 "..v["ip_address"].." prefixlen 128 accept_rtadv no_radr\"\n") routing:write("ipv6_defaultrouter=\""..v["gateway"].."\"\n") routing:write("ipv6_route_"..mylinks[v["link"]].."=\""..v["gateway"].." -prefixlen 128 -interface "..mylinks[v["link"]].."\"\n") if v["route"] then for _,r in v["route"] do -- skip all the routes which are already covered by the default gateway, some provider -- still list plenty of them. if v["gateway"] == r["gateway"] then goto next end print("Not implemented yet") os.exit(1) ::next:: end end end end netif:write("ipv6_network_interfaces=\"") for _,v in pairs(ipv6) do netif:write(v.. " ") end netif:write("\"\n") routing:write("ipv6_static_routes=\"") for _,v in pairs(ipv6) do routing:write(v.. " ") end routing:write("\"\n") netif:write("ipv6_default_interface=\""..ipv6[1].."\"\n") netif:close() routing:close()