· 4 years ago · Jul 01, 2021, 11:24 PM
1#!/usr/bin/env ruby
2
3require 'sinatra'
4require 'json'
5require 'resolv'
6
7set :bind, '0.0.0.0'
8set :dump_errors, true
9
10# DNS
11dns_server = '10.143.43.66'
12
13
14# default TTL
15default_ttl = '300'
16# default record type (A/AAAA/MX only)
17default_type = 'A'
18# default mx priority
19default_mx_priority = '10'
20
21print default_mx_priority
22
23# Authenticate all requests with an API key
24before do
25 # X-Api-Key
26 error 401 unless env['HTTP_X_API_KEY'] =~ /secretkey/
27end
28
29# Add DNS record
30post '/dns' do
31 # renew variables
32 ttl = default_ttl
33 type = default_type
34 mx_priority = default_mx_priority
35
36 request_params = JSON.parse(request.body.read)
37 ttl = if request_params["ttl"].nil? then ttl else request_params["ttl"] end
38 type = if request_params["type"].nil? then type else request_params["type"] end
39 mx_priority = if request_params["mx_priority"].nil? then mx_priority else request_params["mx_priority"] end
40 # Select supported record
41 case type.upcase
42 when 'A', 'AAAA'
43 nsupdate_command = "update add #{request_params["domain"]} #{ttl} #{type} #{request_params["data"]}"
44 when 'MX'
45 nsupdate_command = "update add #{request_params["domain"]} #{ttl} #{type} #{mx_priority} #{request_params["data"]}"
46 else
47 error 400
48 end
49 # Call nsupdate to write record via local connection
50 IO.popen("nsupdate -l",'r+') do |f|
51 f << <<-EOF
52 #{nsupdate_command}
53 send
54 EOF
55 f.close_write
56 end
57 error 500 unless $? == 0
58 status 201
59end
60
61# Remove DNS record
62delete '/dns' do
63 # renew variables
64 ttl = default_ttl
65 type = default_type
66 mx_priority = default_mx_priority
67
68 request_params = JSON.parse(request.body.read)
69 type = if request_params["type"].nil? then type else request_params["type"] end
70 mx_priority = if request_params["mx_priority"].nil? then mx_priority else request_params["mx_priority"] end
71 case type.upcase
72 when 'A', 'AAAA'
73 nsupdate_command = "update delete #{request_params["domain"]} #{type} #{request_params["data"]}"
74 when 'MX'
75 nsupdate_command = "update delete #{request_params["domain"]} #{type} #{mx_priority} #{request_params["data"]}"
76 else
77 error 400
78 end
79 # Call nsupdate to remove record via local connection
80 IO.popen("nsupdate -l",'r+') do |f|
81 f << <<-EOF
82 #{nsupdate_command}
83 send
84 EOF
85 f.close_write
86 end
87 error 500 unless $? == 0
88end
89