1 var REG_NONE = NewRegistrar("none");
2 var REG_GANDI = NewRegistrar("gandi_v5");
3 var PROVIDER = NewDnsProvider("cloudflare");
9 var QUALIFY = function (name) {
10 return name + "." + DOMAIN + ".";
13 function loadTemplate(template) {
14 return function (domain, registrar) {
16 REGISTRAR = registrar;
18 require("src/" + template + ".js");
23 * Create A, optional AAAA, and optional HTTPS (SVCB) records for an OSM web service,
24 * with optional Cloudflare proxy support.
26 * @param {string} name - Hostname (e.g. "www").
27 * @param {string[]} servers - Required array of servers.
28 * @param {Object} [options] - Optional settings for HTTPS and Cloudflare.
29 * @param {boolean} [options.h1=false] - If true, sets HTTPS apn=http1.1
30 * @param {boolean} [options.h2=true] - If true, sets HTTPS apn=h2
31 * @param {boolean} [options.h3=false] - If true, sets HTTPS apn=h3
32 * @param {boolean} [options.cfproxy=false] - If true, enables Cloudflare proxy on A/AAAA.
35 function osm_web_service(
41 // If servers is a string, convert to a single-element array
42 if (typeof servers === "string") {
46 if (options === undefined) {
50 // Set default values for options.h1, options.h2, and options.h3
51 options.h1 = options.h1 !== undefined ? options.h1 : false;
52 options.h2 = options.h2 !== undefined ? options.h2 : true;
53 options.h3 = options.h3 !== undefined ? options.h3 : false;
59 servers.forEach(function(serverName) {
60 if (IPV4[serverName]) {
61 ipv4s.push(IPV4[serverName]);
62 if (!options.cfproxy) {
63 records.push(A(name, IPV4[serverName]));
65 records.push(A(name, IPV4[serverName], CF_PROXY_ON));
68 if (IPV6[serverName]) {
69 ipv6s.push(IPV6[serverName]);
70 if (!options.cfproxy) {
71 records.push(AAAA(name, IPV6[serverName]));
73 records.push(AAAA(name, IPV6[serverName], CF_PROXY_ON));
78 if (ipv4s.length === 0 && ipv6s.length === 0) {
79 throw new Error("An IPv4 or IPv6 address is required for " + name + " service");
83 // Build a parameter string for DNSControl HTTPS() syntax.
84 // Example: "ipv4hint=1.2.3.4,1.2.3.5 ipv6hint=2001:db8::1,2001:db8::2 alpn=h2"
87 if (ipv4s.length > 0) {
88 // Join IPv4 addresses with comma+space
89 paramParts.push("ipv4hint=" + ipv4s.join(","));
91 if (ipv6s.length > 0) {
92 // Join IPv6 addresses with comma+space
93 paramParts.push("ipv6hint=" + ipv6s.join(","));
96 if (options.h1 || options.h2 || options.h3) {
97 var paramPartsALPN = [];
99 paramPartsALPN.push("h3");
102 paramPartsALPN.push("h2");
105 paramPartsALPN.push("http/1.1");
107 paramParts.push("alpn=" + paramPartsALPN.join(","));
110 // Join the parts with a space
111 var paramString = paramParts.join(" ");
113 // Create the HTTPS record with 4 arguments
114 records.push(HTTPS(name, 1, ".", paramString));
120 // Ensure that the reverse DNS records are in RFC 4183 notation
121 REVCOMPAT("rfc4183");
123 var IPV4 = require("src/ipv4.json");
124 var IPV6 = require("src/ipv6.json");
126 var HOST_RECORDS = [];
128 for (var name in IPV4) {
129 HOST_RECORDS.push(A(name, IPV4[name]));
132 for (var name in IPV6) {
133 HOST_RECORDS.push(AAAA(name, IPV6[name]));
136 var OPENSTREETMAP = loadTemplate("openstreetmap");
138 require("include/sshfp.js");
139 require("include/nominatim.js");
142 require("include/geo.js");
144 var GEO_NS_RECORDS = [];
147 OPENSTREETMAP("openstreetmap.org", REG_GANDI);
148 OPENSTREETMAP("openstreetmap.com", REG_GANDI);
149 OPENSTREETMAP("openstreetmap.net", REG_GANDI);
150 OPENSTREETMAP("openstreetmap.ca", REG_GANDI);
151 OPENSTREETMAP("openstreetmap.eu", REG_NONE);
152 OPENSTREETMAP("openstreetmap.pro", REG_GANDI);
153 OPENSTREETMAP("openstreetmap.gay", REG_GANDI);
154 OPENSTREETMAP("openstreetmaps.org", REG_GANDI);
155 OPENSTREETMAP("osm.org", REG_GANDI);
156 OPENSTREETMAP("openmaps.org", REG_GANDI);
157 OPENSTREETMAP("openstreetmap.io", REG_GANDI);
158 OPENSTREETMAP("osm.io", REG_GANDI);
159 OPENSTREETMAP("openstreetmap.li", REG_GANDI);
160 OPENSTREETMAP("openworldmap.org", REG_GANDI);
161 OPENSTREETMAP("freeosm.org", REG_GANDI);
162 OPENSTREETMAP("open-maps.org", REG_GANDI);
163 OPENSTREETMAP("open-maps.com", REG_GANDI);
164 OPENSTREETMAP("osmbugs.org", REG_GANDI);
165 OPENSTREETMAP("openstreetmap.ai", REG_GANDI);
166 OPENSTREETMAP("openstreetmap.am", REG_GANDI);
167 OPENSTREETMAP("openstreetmap.fi", REG_GANDI);
168 OPENSTREETMAP("openstreetmap.gr", REG_GANDI);
169 OPENSTREETMAP("openstreetmap.me", REG_GANDI);
170 OPENSTREETMAP("openstreetmap.mx", REG_GANDI);
171 OPENSTREETMAP("openstreetmap.pe", REG_GANDI);
172 OPENSTREETMAP("openstreetmap.ph", REG_GANDI);
173 OPENSTREETMAP("openstreetmap.sg", REG_GANDI);
174 OPENSTREETMAP("openstreetmap.tv", REG_GANDI);
175 OPENSTREETMAP("openstreetmap.wales", REG_GANDI);
176 OPENSTREETMAP("openstreetmapdata.org", REG_GANDI);
178 // Disable due to registration issue
179 // OPENSTREETMAP("openstreetmap.al", REG_NONE);
181 D_EXTEND("openstreetmap.org",
182 CNAME("_acme-challenge.tile", "bxve5ryiwwv7woiraq.fastly-validations.com.", TTL("10m")),
184 // Uptime site at StatusCake
185 CNAME("uptime", "uptimessl-new.statuscake.com."),
194 CNAME("_acme-challenge.tile", "21gvdfyyxjoc4lmsem.fastly-validations.com.", TTL("10m")),
200 // Mastodon redirects to en.osm.town
201 var OPENSTREETMAP_TOWN = loadTemplate("openstreetmap-town");
202 OPENSTREETMAP_TOWN("openstreetmap.town", REG_GANDI);
204 // Domain owned by Amanda McCann
207 // Managed independently by Guillaume Rischard
211 var OSM_LI = loadTemplate("osm-li");
213 OSM_LI("osm.li", REG_GANDI);
215 var OPENSTREETMAP_NZ = loadTemplate("openstreetmap-nz");
217 OPENSTREETMAP_NZ("openstreetmap.nz", REG_GANDI);
218 OPENSTREETMAP_NZ("openstreetmap.org.nz", REG_GANDI);
220 var OPENSTREETMAP_UK = loadTemplate("openstreetmap-uk");
222 OPENSTREETMAP_UK("openstreetmap.uk", REG_GANDI);
223 OPENSTREETMAP_UK("openstreetmap.org.uk", REG_GANDI);
224 OPENSTREETMAP_UK("openstreetmap.co.uk", REG_GANDI);
226 var OPENSTREETMAP_ZA = loadTemplate("openstreetmap-za");
228 OPENSTREETMAP_ZA("openstreetmap.org.za", REG_NONE);
229 OPENSTREETMAP_ZA("osm.org.za", REG_NONE);
231 var OSMFOUNDATION = loadTemplate("osmfoundation");
233 OSMFOUNDATION("osmfoundation.org", REG_GANDI);
235 var STATEOFTHEMAP = loadTemplate("stateofthemap");
237 STATEOFTHEMAP("stateofthemap.org", REG_GANDI);
238 STATEOFTHEMAP("stateofthemap.com", REG_GANDI);
239 STATEOFTHEMAP("sotm.org", REG_GANDI);
241 // The domain is registation is managed by FOSSGIS.de
242 var STATEOFTHEMAP_EU = loadTemplate("stateofthemap-eu");
243 STATEOFTHEMAP_EU("stateofthemap.eu", REG_NONE);
245 // State of the Map Madagascar
246 var OPENSTREETMAP_MG = loadTemplate("openstreetmap-mg");
247 OPENSTREETMAP_MG("openstreetmap.mg", REG_GANDI);
249 var OPENGEODATA = loadTemplate("opengeodata");
250 OPENGEODATA("opengeodata.org", REG_GANDI);
252 var SWITCH2OSM = loadTemplate("switch2osm");
254 SWITCH2OSM("switch2osm.org", REG_GANDI);
255 SWITCH2OSM("switch2osm.com", REG_GANDI);
257 var OSM2PGSQL = loadTemplate("osm2pgsql");
259 OSM2PGSQL("osm2pgsql.org", REG_GANDI);
260 OSM2PGSQL("osm2pgsql.com", REG_GANDI);
262 var IDEDITOR = loadTemplate("ideditor");
264 IDEDITOR("ideditor.com", REG_GANDI);
266 var OSMWIKI = loadTemplate("osm-wiki");
267 OSMWIKI("osm.wiki", REG_GANDI);
269 var PTR_HE_AMS_IPV4 = loadTemplate("ptr_he_ams_ipv4");
271 PTR_HE_AMS_IPV4(REV("184.104.179.128/27"), REG_NONE);
273 var PTR_HE_AMS_IPV6 = loadTemplate("ptr_he_ams_ipv6");
275 PTR_HE_AMS_IPV6(REV("2001:470:1:fa1::/64"), REG_NONE);
277 var PTR_HE_DUB_IPV4 = loadTemplate("ptr_he_dub_ipv4");
279 PTR_HE_DUB_IPV4(REV("184.104.226.96/27"), REG_NONE);
281 var PTR_HE_DUB_IPV6 = loadTemplate("ptr_he_dub_ipv6");
283 PTR_HE_DUB_IPV6(REV("2001:470:1:b3b::/64"), REG_NONE);
285 var PTR_EQUINIX_AMS_IPV4 = loadTemplate("ptr_equinix_ams_ipv4");
287 PTR_EQUINIX_AMS_IPV4(REV("82.199.86.96/27"), REG_NONE);
289 var PTR_EQUINIX_AMS_IPV6 = loadTemplate("ptr_equinix_ams_ipv6");
291 PTR_EQUINIX_AMS_IPV6(REV("2001:4d78:500:5e3::/64"), REG_NONE);
293 var PTR_EQUINIX_DUB_IPV4 = loadTemplate("ptr_equinix_dub_ipv4");
295 PTR_EQUINIX_DUB_IPV4(REV("87.252.214.96/27"), REG_NONE);
297 var PTR_EQUINIX_DUB_IPV6 = loadTemplate("ptr_equinix_dub_ipv6");
299 PTR_EQUINIX_DUB_IPV6(REV("2001:4d78:fe03:1c::/64"), REG_NONE);
301 // No immediate plans
302 // External DNS and hosting still up
303 // freethepostcode.org
305 // External DNS and hosting
306 // openstreetmap.cymru