-
Notifications
You must be signed in to change notification settings - Fork 4
/
Copy pathslicedns.rb
executable file
·182 lines (149 loc) · 5.69 KB
/
slicedns.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
#!/usr/bin/env ruby
require 'rubygems'
require 'activeresource'
# Get your API key from your SliceManager here:
# https://manage.slicehost.com/api/
# and put it here:
API_PASSWORD = 'your_api_key_goes_here'
unless ARGV.size == 2 && ARGV[1].end_with?('.')
puts "Usage: #{__FILE__} slice domain.com."
exit
end
# Get command line arguments
slice_name = ARGV.shift
zone_name = ARGV.shift
# Make sure you set this thing up
if API_PASSWORD == 'your_api_key_goes_here'
puts "Open the script in a text editor and put your api key on line 13."
exit
end
# Address class is required for Slice class
class Address < String; end
# Define the ActiveResource classes
class Slice < ActiveResource::Base
self.site = "https://#{API_PASSWORD}@api.slicehost.com/"
def self.find_by_name(name)
Slice.find(:first, :params => { :name => name })
end
end
class Zone < ActiveResource::Base
self.site = "https://#{API_PASSWORD}@api.slicehost.com/"
def records
Record.find(:all, :params => { :zone_id => self.id })
end
def self.exists?(name)
!Zone.find(:all, :params => { :origin => name }).empty?
end
def self.find_by_name(name)
Zone.find(:first, :params => { :origin => name })
end
end
class Record < ActiveResource::Base
self.site = "https://#{API_PASSWORD}@api.slicehost.com/"
end
# Method to add a new record based on a hash
def create_record(r, defaults)
rec = Record.new(defaults.merge(r))
rec.save
puts notice(rec)
end
# Prints the record's details
def notice(r)
' | ' + r.name.to_s.ljust(30) +
' | ' + r.record_type.to_s.ljust(5) +
' | ' + r.aux.to_s.rjust(4) +
' | ' + r.data.to_s.ljust(34) +
' | '
end
# Find the IP address of the slice
slice = Slice.find_by_name(slice_name)
# Bail if the slice name doesn't work out
if slice.nil?
puts "\nSlice not found. :( "
puts "Aborted."
exit
end
slice_ip = slice.ip_address
# Check if zone exists
if Zone.exists?(zone_name)
puts "\nA zone for #{zone_name} already exists."
print "Cancel or Overwrite? [Co] "
input = STDIN.gets.chomp.strip
# Respond accordingly
if input.downcase == 'o'
Zone.find_by_name(zone_name).destroy
else
puts " Cancelled"
exit
end
end
# Create new zone
z = Zone.new(:origin => zone_name, :ttl => 43200)
z.save
# Record definitions
defaults = { :zone_id => z.id, :ttl => 43200 }
a_records = [
{ :record_type => 'A', :name => zone_name, :data => slice_ip },
{ :record_type => 'A', :name => "*.#{zone_name}", :data => slice_ip }
]
google_mx = [
{ :record_type => 'MX', :name => zone_name, :aux => 10, :data => 'ASPMX.L.GOOGLE.COM.' },
{ :record_type => 'MX', :name => zone_name, :aux => 20, :data => 'ALT1.ASPMX.L.GOOGLE.COM.' },
{ :record_type => 'MX', :name => zone_name, :aux => 20, :data => 'ALT2.ASPMX.L.GOOGLE.COM.' },
{ :record_type => 'MX', :name => zone_name, :aux => 30, :data => 'ASPMX2.GOOGLEMAIL.COM.' },
{ :record_type => 'MX', :name => zone_name, :aux => 30, :data => 'ASPMX3.GOOGLEMAIL.COM.' },
{ :record_type => 'MX', :name => zone_name, :aux => 30, :data => 'ASPMX4.GOOGLEMAIL.COM.' },
{ :record_type => 'MX', :name => zone_name, :aux => 30, :data => 'ASPMX5.GOOGLEMAIL.COM.' }
]
google_cname = [
{ :record_type => 'CNAME', :name => 'mail', :data => 'ghs.google.com.' },
{ :record_type => 'CNAME', :name => 'start', :data => 'ghs.google.com.' },
{ :record_type => 'CNAME', :name => 'docs', :data => 'ghs.google.com.' },
{ :record_type => 'CNAME', :name => 'calendar', :data => 'ghs.google.com.' }
]
google_srv = [
{ :record_type => 'SRV', :name => "_xmpp-server._tcp.#{zone_name}", :aux => 5, :data => '0 5269 xmpp-server.l.google.com.'},
{ :record_type => 'SRV', :name => "_xmpp-server._tcp.#{zone_name}", :aux => 20, :data => '0 5269 xmpp-server1.l.google.com.'},
{ :record_type => 'SRV', :name => "_xmpp-server._tcp.#{zone_name}", :aux => 20, :data => '0 5269 xmpp-server2.l.google.com.'},
{ :record_type => 'SRV', :name => "_xmpp-server._tcp.#{zone_name}", :aux => 20, :data => '0 5269 xmpp-server3.l.google.com.'},
{ :record_type => 'SRV', :name => "_xmpp-server._tcp.#{zone_name}", :aux => 20, :data => '0 5269 xmpp-server4.l.google.com.'},
{ :record_type => 'SRV', :name => "_jabber._tcp.#{zone_name}", :aux => 5, :data => '0 5269 xmpp-server.l.google.com.'},
{ :record_type => 'SRV', :name => "_jabber._tcp.#{zone_name}", :aux => 20, :data => '0 5269 xmpp-server1.l.google.com.'},
{ :record_type => 'SRV', :name => "_jabber._tcp.#{zone_name}", :aux => 20, :data => '0 5269 xmpp-server2.l.google.com.'},
{ :record_type => 'SRV', :name => "_jabber._tcp.#{zone_name}", :aux => 20, :data => '0 5269 xmpp-server3.l.google.com.'},
{ :record_type => 'SRV', :name => "_jabber._tcp.#{zone_name}", :aux => 20, :data => '0 5269 xmpp-server4.l.google.com.'}
]
ns_records = [
{ :record_type => 'NS', :name => zone_name, :data => 'ns1.slicehost.net.' },
{ :record_type => 'NS', :name => zone_name, :data => 'ns2.slicehost.net.' },
{ :record_type => 'NS', :name => zone_name, :data => 'ns3.slicehost.net.' }
]
# DO IT!!
puts "\nCreating A records..."
a_records.each do |r|
create_record(r, defaults)
end
puts "\nCreating NS records..."
ns_records.each do |r|
create_record(r, defaults)
end
# Ask to add Google records
print "\nAdd records for Google Apps? [Yn] "
input = STDIN.gets.chomp.strip
# Respond accordingly
unless input.downcase == "n"
puts "\nCreating Google MX records..."
google_mx.each do |r|
create_record(r, defaults)
end
puts "\nCreating Google SRV records..."
google_srv.each do |r|
create_record(r, defaults)
end
puts "\nCreating Google CNAME records..."
google_cname.each do |r|
create_record(r, defaults)
end
end
# Finally, let everyone know we're finished
puts "\nALL DONE!"