first commit
This commit is contained in:
commit
6ce5a542f2
77
registry.json
Normal file
77
registry.json
Normal file
@ -0,0 +1,77 @@
|
||||
{
|
||||
"zone": {
|
||||
"soa": "eve.dn42.",
|
||||
"ns": "eve.dn42.",
|
||||
"serial": 93,
|
||||
"refresh": "1H",
|
||||
"retry": "4H",
|
||||
"expire": "3W",
|
||||
"minimum": "1D",
|
||||
"v4_subnet": "172.23.75.0/24",
|
||||
"v6_subnet": "fdc0:4992:6a6d::/48"
|
||||
},
|
||||
"host": {
|
||||
"as": "4242420092",
|
||||
"v4_tunnel": "172.23.75.1",
|
||||
"start-port": 5001,
|
||||
"end-port": 5020
|
||||
},
|
||||
"network": {
|
||||
"hax404": {
|
||||
"as": "76114",
|
||||
"type": "openvpn",
|
||||
"proto": "udp6",
|
||||
"remote": "2a03:4000:6:145:11::1",
|
||||
"v4_tunnel": "172.23.136.65",
|
||||
"lport": 5001,
|
||||
"rport": 5001
|
||||
},
|
||||
"chelnok": {
|
||||
"as": "4242421375",
|
||||
"type": "openvpn",
|
||||
"proto": "udp6",
|
||||
"remote": "portal.chelnok.de",
|
||||
"v4_tunnel": "172.23.64.1",
|
||||
"rport": 2322,
|
||||
"lport": 5002
|
||||
},
|
||||
"wetu": {
|
||||
"as": "64698",
|
||||
"type": "openvpn",
|
||||
"proto": "udp6",
|
||||
"remote": "dn42.wetu.c3d2.de",
|
||||
"v4_tunnel": "172.22.100.254",
|
||||
"lport": 5003,
|
||||
"rport": 5003
|
||||
},
|
||||
"tobee": {
|
||||
"as": "4242420022",
|
||||
"type": "openvpn",
|
||||
"proto": "udp6",
|
||||
"remote": "2001:1640:3::a",
|
||||
"v4_tunnel": "172.23.67.1",
|
||||
"lport": 5018,
|
||||
"rport": 5018
|
||||
},
|
||||
"flatbert": {
|
||||
"type": "openvpn",
|
||||
"proto": "udp",
|
||||
"float": true,
|
||||
"v4_tunnel": "172.22.99.253",
|
||||
"lport": 5002
|
||||
},
|
||||
"eve": {
|
||||
"type": "local",
|
||||
"ipv4": "172.23.75.1"
|
||||
},
|
||||
"matchbox": {
|
||||
"type": "tinc",
|
||||
"ipv4": "172.23.75.2"
|
||||
},
|
||||
"turingmachine": {
|
||||
"type": "tinc",
|
||||
"ipv4": "172.23.75.3",
|
||||
"mac": "02:1f:02:a6:62:8e"
|
||||
}
|
||||
}
|
||||
}
|
88
scripts/dhcp
Executable file
88
scripts/dhcp
Executable file
@ -0,0 +1,88 @@
|
||||
#!/usr/bin/ruby
|
||||
require_relative "utils"
|
||||
require "optparse"
|
||||
|
||||
class DhcpRegistry < Registry
|
||||
def add_lease(name, macaddress, ipv4, ipv6)
|
||||
data["network"][name] ||= {}
|
||||
host = data["network"][name]
|
||||
host["macaddress"] = macaddress
|
||||
host["ipv4"] = ipv4 if ipv4
|
||||
host["ipv6"] = ipv6 if ipv6
|
||||
end
|
||||
|
||||
def remove_lease(name)
|
||||
if data["network"].delete(name).nil?
|
||||
die "no such lease name #{name} in registry.json"
|
||||
end
|
||||
end
|
||||
|
||||
def update_leases
|
||||
template_path = Pathname.new(File.expand_path("../../templates", __FILE__))
|
||||
dhcp_template = Template.new(template_path.join("dhcp.conf.erb"))
|
||||
static_leases = data["network"].select do |name, data|
|
||||
data["mac"] && (data["ipv4"] || data["ipv6"])
|
||||
end.map do |name, data|
|
||||
TemplateContext.new(data.merge(name: name))
|
||||
end
|
||||
dhcp_path = Pathname.new(File.expand_path("../../dhcp.peers.conf", __FILE__))
|
||||
File.open(dhcp_path, "w+").write(dhcp_template.render(leases: static_leases))
|
||||
end
|
||||
end
|
||||
|
||||
GLOBAL_OPTIONS = OptionParser.new do |opts|
|
||||
opts.banner = "Usage: dhcp [options] [subcommand [options]]"
|
||||
opts.separator ""
|
||||
opts.separator <<HELP
|
||||
Available subcommands:
|
||||
add [options] NAME MACADDRESS: add dhcp lease
|
||||
remove [options] NAME: remove dhcp static lease
|
||||
|
||||
See 'dhcp COMMAND --help' for more information on a specific command.
|
||||
HELP
|
||||
end
|
||||
|
||||
def add_command(registry, args)
|
||||
ipv4, ipv6 = nil, nil
|
||||
parser = OptionParser.new do |opts|
|
||||
opts.banner = "Usage: dhcp add [options] NAME MACADDRESS"
|
||||
opts.on("-4", "--ipv4 ADDRESS", "set fixed ipv4 address") do |address|
|
||||
ipv4 = address
|
||||
end
|
||||
opts.on("-6", "--ipv6 ADDRESS", "set fixed ipv6 address") do |address|
|
||||
ipv6 = address
|
||||
end
|
||||
end.order!
|
||||
if ARGV.size < 2
|
||||
$stderr.puts "no enough arguments"
|
||||
die(parser.help)
|
||||
end
|
||||
name, macaddress = args
|
||||
registry.add_lease(name, macaddress, ipv4, ipv6)
|
||||
end
|
||||
|
||||
def remove_command(registry, args)
|
||||
parser = OptionParser.new do |opts|
|
||||
opts.banner = "Usage: dhcp remove NAME"
|
||||
end.order!
|
||||
if args.empty?
|
||||
$stderr.puts "no enough arguments"
|
||||
die(parser.help)
|
||||
end
|
||||
registry.remove_lease(args.first)
|
||||
end
|
||||
|
||||
GLOBAL_OPTIONS.order!
|
||||
registry = DhcpRegistry.new
|
||||
case command = ARGV.shift
|
||||
when "add"
|
||||
add_command(registry, ARGV)
|
||||
when "remove"
|
||||
remove_command(registry, ARGV)
|
||||
when nil # just update
|
||||
else
|
||||
die "unknown subcommand #{command}"
|
||||
end
|
||||
|
||||
registry.save
|
||||
registry.update_leases
|
6
scripts/dns
Executable file
6
scripts/dns
Executable file
@ -0,0 +1,6 @@
|
||||
#!/usr/bin/ruby
|
||||
require_relative "utils"
|
||||
|
||||
registry = Registry.new
|
||||
template_path = Pathname.new(File.expand_path("../../templates", __FILE__))
|
||||
dn42_zone_template = Template.new(template_path.join("dn42-zone.erb"))
|
43
scripts/openvpn
Executable file
43
scripts/openvpn
Executable file
@ -0,0 +1,43 @@
|
||||
#!/usr/bin/ruby
|
||||
require_relative "utils"
|
||||
|
||||
template_path = Pathname.new(File.expand_path("../../templates", __FILE__))
|
||||
openvpn_path = Pathname.new(File.expand_path("../../openvpn", __FILE__))
|
||||
openvpn_template = Template.new(template_path.join("openvpn.conf.erb"))
|
||||
|
||||
registry = Registry.new
|
||||
|
||||
host = registry.data["host"]
|
||||
host["v4_tunnel"] || die("v4_tunnel not set for host")
|
||||
|
||||
registry.data["network"].each do |name, data|
|
||||
next unless data["type"] == "openvpn"
|
||||
key = openvpn_path.join("#{name}.key")
|
||||
unless File.exists?(key)
|
||||
sh("openvpn", "--genkey", "--secret", key)
|
||||
end
|
||||
required_params = [:proto, :lport, :tunnel_v4]
|
||||
unless data["float"]
|
||||
required_params += [:remote, :rport]
|
||||
end
|
||||
required_params.each do |param|
|
||||
unless data[param.to_s]
|
||||
die "#{param.to_s} not set for peer #{name}"
|
||||
end
|
||||
end
|
||||
|
||||
context = data.merge(own_v4_tunnel: host["v4_tunnel"])
|
||||
atomic_write(openvpn_path.join("#{name}.conf"), openvpn_template.render(context))
|
||||
end
|
||||
|
||||
GLOBAL_OPTIONS = OptionParser.new do |opts|
|
||||
opts.banner = "Usage: dhcp [options] [subcommand [options]]"
|
||||
opts.separator ""
|
||||
opts.separator <<HELP
|
||||
Available subcommands:
|
||||
add [options] NAME MACADDRESS: add dhcp lease
|
||||
remove [options] NAME: remove dhcp static lease
|
||||
|
||||
See 'dhcp COMMAND --help' for more information on a specific command.
|
||||
HELP
|
||||
end
|
53
scripts/utils.rb
Normal file
53
scripts/utils.rb
Normal file
@ -0,0 +1,53 @@
|
||||
require "ostruct"
|
||||
require "fileutils"
|
||||
require "erb"
|
||||
require "json"
|
||||
require "pathname"
|
||||
require "pry"
|
||||
|
||||
class Registry
|
||||
PATH = Pathname.new(File.expand_path("../../registry.json", __FILE__))
|
||||
def initialize
|
||||
@data = JSON.load(File.open(Registry::PATH))
|
||||
end
|
||||
attr_accessor :data
|
||||
def save
|
||||
f = File.open(Registry::PATH, "w+")
|
||||
f.puts JSON.pretty_generate(@data)
|
||||
f.close
|
||||
end
|
||||
end
|
||||
|
||||
def atomic_write(path, content)
|
||||
temp_path = path.to_s + ".tmp"
|
||||
File.open(temp_path, 'w+') do |f|
|
||||
f.write(content)
|
||||
end
|
||||
|
||||
FileUtils.mv(temp_path, path)
|
||||
end
|
||||
|
||||
def sh(cmd, *args)
|
||||
puts "$ #{cmd} "+ args.map {|a| "'#{a}'" }.join(" ")
|
||||
#system(cmd, *args)
|
||||
end
|
||||
|
||||
def die(msg)
|
||||
$stderr.puts(msg)
|
||||
exit(1)
|
||||
end
|
||||
|
||||
class TemplateContext < OpenStruct
|
||||
def get_binding
|
||||
binding
|
||||
end
|
||||
end
|
||||
|
||||
class Template
|
||||
def initialize(path)
|
||||
@erb = ERB.new(File.read(path), nil, '-')
|
||||
end
|
||||
def render(params={})
|
||||
@erb.result(TemplateContext.new(params).get_binding)
|
||||
end
|
||||
end
|
12
templates/dhcp.conf.erb
Normal file
12
templates/dhcp.conf.erb
Normal file
@ -0,0 +1,12 @@
|
||||
<% leases.each do |lease| -%>
|
||||
|
||||
host <%= lease.name %> {
|
||||
hardware ethernet <%= lease.mac %>;
|
||||
<% if lease.ipv4 -%>
|
||||
fixed-address <%= lease.ipv4 %>;
|
||||
<% end -%>
|
||||
<% if lease.ipv6 -%>
|
||||
fixed-address6 <%= lease.ipv6 %>;
|
||||
<% end -%>
|
||||
}
|
||||
<% end -%>
|
24
templates/dn42-zone.erb
Normal file
24
templates/dn42-zone.erb
Normal file
@ -0,0 +1,24 @@
|
||||
@ IN SOA <%= data["zone"]["soa"] %> hostmaster (
|
||||
<%= data["zone"]["serial"] %> ; serial
|
||||
<%= data["zone"]["refresh"] %> ; refresh
|
||||
<%= data["zone"]["retry"] %> ; retry
|
||||
<%= data["zone"]["expire"] %> ; expire
|
||||
<%= data["zone"]["minimum"] %>) ; minimum
|
||||
NS <%= data["zone"]["ns"] %>
|
||||
|
||||
<% data["network"].each do |name, value| %>
|
||||
<% if value["cname"] -%>
|
||||
<%= name %> CNAME <%= value["cname"] %>
|
||||
<% end -%>
|
||||
<% if value["srv"] -%>
|
||||
<%= name %> SRV <%= value["srv"] %>
|
||||
<% end -%>
|
||||
<% if value["ipv4"] -%>
|
||||
<%= name %> A <%= ip(value["ipv4"]) %>
|
||||
ipv4.<%= name %> A <%= ip(value["ipv4"]) %>
|
||||
<% end -%>
|
||||
<% if value["ipv6"] -%>
|
||||
<%= name %> AAAA <%= ip(value["ipv6"]) %>
|
||||
ipv6.<%= name %> AAAA <%= ip(value["ipv6"]) %>
|
||||
<% end -%>
|
||||
<% end -%>
|
24
templates/openvpn.conf.erb
Normal file
24
templates/openvpn.conf.erb
Normal file
@ -0,0 +1,24 @@
|
||||
daemon
|
||||
proto <%= proto %>
|
||||
mode p2p
|
||||
dev-type tun
|
||||
comp-lzo
|
||||
dev <%= name %>
|
||||
persist-key
|
||||
persist-tun
|
||||
user nobody
|
||||
group nogroup
|
||||
|
||||
<% if float %>
|
||||
float
|
||||
port <%= lport %>
|
||||
<% else %>
|
||||
remote <%= remote %>
|
||||
rport <%= rport %>
|
||||
lport <%= lport %>
|
||||
<% end %>
|
||||
|
||||
ifconfig <%= own_v4_tunnel %> <%= v4_tunnel %>
|
||||
secret /etc/openvpn/<%= name %>.key
|
||||
script-security 2 execve
|
||||
up "/etc/openvpn/scripts/ipv6.sh fd70:96c9:ef25::fe:6/124 <%= name %>"
|
11
templates/rdns-zone.erb
Normal file
11
templates/rdns-zone.erb
Normal file
@ -0,0 +1,11 @@
|
||||
@ IN SOA <%= data["zone"]["soa"] %> hostmaster (
|
||||
<%= data["zone"]["serial"] %> ; serial
|
||||
<%= data["zone"]["refresh"] %> ; refresh
|
||||
<%= data["zone"]["retry"] %> ; retry
|
||||
<%= data["zone"]["expire"] %> ; expire
|
||||
<%= data["zone"]["minimum"] %>) ; minimum
|
||||
NS <%= data["zone"]["ns"] %>
|
||||
|
||||
<% pointers do |addr, name| %>
|
||||
<%= addr %> PTR <%= name %>.lxc.
|
||||
<% end -%>
|
Loading…
Reference in New Issue
Block a user