#!/usr/bin/env ruby require "json" require "pathname" require 'ostruct' require 'optparse' require 'json' require 'netaddr' require_relative 'lib/container' def try_env(key) ENV[key] or abort("environment variable '#{key}' not set") end options = OpenStruct.new options.container_name = try_env("LXC_NAME") options.container_config = try_env("LXC_CONFIG_FILE") options.rootfs = try_env("LXC_ROOTFS_PATH") OptionParser.new do |opts| opts.banner = "Usage: create-lxc-config [options]" opts.on("-4", "--ipv4", "private Ipv4 subnet") do |v| options.ipv4 = v end opts.on("-6", "--ipv6", "public Ipv6 subnet") do |v| options.ipv6 = v end opts.on("--dn42-ipv4", String, "dn42 ipv4") do |v| options.dn42_ipv4 = v end opts.on("--dn42-ipv6", String, "dn42 ipv6") do |v| options.dn42_ipv6 = v end opts.on("--group GROUP", String, "set ansible group (default NONE)") do |group| options.group = group end opts.on("--vars FILE", String, "set json file for ansible variables") do |vars| begin options.vars = JSON.load(File.open(vars)) unless options.vars.is_a? Hash abort "vars: Should be a json object" end rescue SystemCallError => e abort "Failed to open '#{vars}': #{e.message}" rescue JSON::ParserError => e abort "Failed to parse ansible variables: #{e.message}" end end end.parse! CONFIG_PATH = Pathname.new("/etc/lxc/") container_data = CONFIG_PATH.join("container.json") data = if File.exists?(container_data) JSON.load(File.open(container_data)) else {} end data["network"] ||= {} data["network"][options.container_name] = {} network = data["network"][options.container_name] network["ipv4"] = NetAddr::CIDR.create(ipv4_address).to_s(Short: true) network["ipv6"] = NetAddr::CIDR.create(ipv6_address).to_s(Short: true) network["group"] = options.group network["vars"] = options.vars open(container_data, File::CREAT|File::TRUNC|File::RDWR) do |f| f.write(JSON.pretty_generate(data)) end container = Container.new(data, name: options.container_name, ipv4: ipv4_address, ipv6: ipv6_address, rootfs: options.rootfs, dn42_ipv4: options.dn42_ipv4, dn42_ipv6: options.dn42_ipv4) container.write_config(options.container_config)