]>
Commit | Line | Data |
---|---|---|
cd1a2927 MT |
1 | #!/usr/bin/perl\r |
2 | #\r | |
3 | # SmoothWall CGIs\r | |
4 | #\r | |
5 | # This code is distributed under the terms of the GPL\r | |
6 | #\r | |
7 | # (c) The SmoothWall Team\r | |
8 | #\r | |
9 | # $Id: setddns.pl,v 1.4.2.32 2006/02/07 01:29:47 franck78 Exp $\r | |
10 | #\r | |
11 | \r | |
12 | #close(STDIN);\r | |
13 | #close(STDOUT);\r | |
14 | #close(STDERR);\r | |
15 | \r | |
16 | use strict;\r | |
17 | use IO::Socket;\r | |
18 | use Net::SSLeay;\r | |
19 | \r | |
20 | require '/var/ipcop/general-functions.pl';\r | |
21 | \r | |
22 | #Prototypes functions\r | |
23 | sub encode_base64 ($;$);\r | |
24 | \r | |
25 | my %settings;\r | |
26 | my $filename = "${General::swroot}/ddns/config";\r | |
27 | my $cachefile = "${General::swroot}/ddns/ipcache";\r | |
28 | my $ipcache = 0;\r | |
29 | my @current = ();\r | |
30 | \r | |
31 | if (open(FILE, "$filename")) {\r | |
32 | @current = <FILE>;\r | |
33 | close(FILE);\r | |
34 | unless(@current) { \r | |
35 | exit 0; \r | |
36 | }\r | |
37 | } else {\r | |
38 | &General::log('Dynamic DNS failure : unable to open config file.');\r | |
39 | exit 0;\r | |
40 | }\r | |
41 | \r | |
42 | &General::readhash("${General::swroot}/ddns/settings", \%settings);\r | |
43 | \r | |
44 | # ignore monthly update if not in minimize update mode\r | |
45 | exit 0 if (($settings{'MINIMIZEUPDATES'} ne 'on') && ($ARGV[1] eq '-m'));\r | |
46 | \r | |
47 | my $ip;\r | |
48 | if (open(IP, "${General::swroot}/red/local-ipaddress")) {\r | |
49 | $ip = <IP>;\r | |
50 | close(IP);\r | |
51 | chomp $ip;\r | |
52 | } else {\r | |
53 | &General::log('Dynamic DNS failure : unable to open local-ipaddress file.');\r | |
54 | exit 0;\r | |
55 | }\r | |
56 | \r | |
57 | #If IP is reserved network, we are behind a router. May we ask for our real public IP ?\r | |
58 | if ( &General::IpInSubnet ($ip,'10.0.0.0','255.0.0.0') ||\r | |
59 | &General::IpInSubnet ($ip,'172.16.0.0','255.240.0.0') ||\r | |
60 | &General::IpInSubnet ($ip,'192.168.0.0','255.255.0.0')) {\r | |
61 | # We can, but are we authorized by GUI ?\r | |
62 | if ($settings{'BEHINDROUTER'} eq 'FETCH_IP') {\r | |
63 | if ($ARGV[0] eq '-f'){\r | |
64 | $settings{'BEHINDROUTERWAITLOOP'} = -1; # When forced option, fectch PublicIP now\r | |
65 | }\r | |
66 | \r | |
67 | # Increment counter modulo 4. When it is zero, fetch ip else exit\r | |
68 | # This divides by 4 the requests to the dyndns server.\r | |
69 | $settings{'BEHINDROUTERWAITLOOP'} = ($settings{'BEHINDROUTERWAITLOOP'}+1) %4;\r | |
70 | &General::writehash("${General::swroot}/ddns/settings", \%settings);\r | |
71 | exit 0 if ( $settings{'BEHINDROUTERWAITLOOP'} ne 0 );\r | |
72 | my $RealIP = &General::FetchPublicIp;\r | |
73 | $ip = (&General::validip ($RealIP) ? $RealIP : 'unavailable');\r | |
74 | &General::log ("Dynamic DNS public router IP is:$ip");\r | |
75 | }\r | |
76 | }\r | |
77 | \r | |
78 | \r | |
79 | if ($ARGV[0] eq '-f') {\r | |
80 | unlink ($cachefile); # next regular calls will try again if this force update fails.\r | |
81 | } else {\r | |
82 | open(IPCACHE, "$cachefile");\r | |
83 | $ipcache = <IPCACHE>;\r | |
84 | close(IPCACHE);\r | |
85 | chomp $ipcache;\r | |
86 | }\r | |
87 | \r | |
88 | if ($ip ne $ipcache) {\r | |
89 | my $id = 0;\r | |
90 | my $success = 0;\r | |
91 | my $line;\r | |
92 | my $lines = @current;\r | |
93 | \r | |
94 | foreach $line (@current) {\r | |
95 | $id++;\r | |
96 | chomp($line);\r | |
97 | my @temp = split(/\,/,$line);\r | |
98 | unless ($temp[7] ne "on") {\r | |
99 | $settings{'SERVICE'} = $temp[0];\r | |
100 | $settings{'HOSTNAME'} = $temp[1];\r | |
101 | $settings{'DOMAIN'} = $temp[2];\r | |
102 | $settings{'PROXY'} = $temp[3];\r | |
103 | $settings{'WILDCARDS'} = $temp[4];\r | |
104 | $settings{'LOGIN'} = $temp[5];\r | |
105 | $settings{'PASSWORD'} = $temp[6];\r | |
106 | $settings{'ENABLED'} = $temp[7];\r | |
107 | \r | |
108 | #Some connection are very stable (more than 40 days). Finally force\r | |
109 | #one update / month to avoid account lost\r | |
110 | #cron call once/week with -f & once/month with -f -m options\r | |
111 | #minimize update ?\r | |
112 | if ( ($settings{'MINIMIZEUPDATES'} eq 'on') && ($ARGV[1] ne '-m') ) {\r | |
113 | if (General::DyndnsServiceSync($ip, $settings{'HOSTNAME'},$settings{'DOMAIN'})) {\r | |
114 | &General::log ("Dynamic DNS ip-update for $settings{'HOSTNAME'}.$settings{'DOMAIN'} is uptodate [$ip]");\r | |
115 | $success++;\r | |
116 | next; # do not update, go to test next service\r | |
117 | }\r | |
118 | }\r | |
119 | my @service = split(/\./, "$settings{'SERVICE'}");\r | |
120 | $settings{'SERVICE'} = "$service[0]";\r | |
121 | if ($settings{'SERVICE'} eq 'no-ip') {\r | |
122 | open(F, ">${General::swroot}/ddns/noipsettings");\r | |
123 | flock F, 2;\r | |
124 | print F "PROXY=" . ($settings{'PROXY'} eq 'on' ? "Y\n" : "N\n");\r | |
125 | print F "PASSWORD=$settings{'PASSWORD'}\n";\r | |
126 | print F "NAT=N\n";\r | |
127 | print F "LOGIN=$settings{'LOGIN'}\n";\r | |
128 | print F "INTERVAL=1\n";\r | |
129 | if ($settings{'HOSTNAME'} !~ s/$General::noipprefix//) {\r | |
130 | print F "HOSTNAME=$settings{'HOSTNAME'}\n";\r | |
131 | print F "GROUP=\n";\r | |
132 | } else {\r | |
133 | print F "HOSTNAME=\n";\r | |
134 | print F "GROUP=$settings{'HOSTNAME'}\n";\r | |
135 | }\r | |
136 | print F "DOMAIN=$settings{'DOMAIN'}\n";\r | |
137 | print F "DEVICE=\n";\r | |
138 | print F "DAEMON=N\n";\r | |
139 | close(F);\r | |
140 | \r | |
141 | my @ddnscommand = ('/usr/bin/noip','-c',"${General::swroot}/ddns/noipsettings",'-i',"$ip");\r | |
142 | \r | |
143 | my $result = system(@ddnscommand);\r | |
144 | if ( $result != 0) { \r | |
145 | &General::log("Dynamic DNS ip-update for $settings{'HOSTNAME'}.$settings{'DOMAIN'} : failure");\r | |
146 | } else {\r | |
147 | &General::log("Dynamic DNS ip-update for $settings{'HOSTNAME'}.$settings{'DOMAIN'} : success");\r | |
148 | $success++;\r | |
149 | }\r | |
150 | }\r | |
151 | \r | |
152 | elsif ($settings{'SERVICE'} eq 'cjb') {\r | |
153 | # use proxy ?\r | |
154 | my %proxysettings;\r | |
155 | &General::readhash("${General::swroot}/proxy/settings", \%proxysettings);\r | |
156 | if ($_=$proxysettings{'UPSTREAM_PROXY'}) {\r | |
157 | my ($peer, $peerport) = (/^(?:[a-zA-Z ]+\:\/\/)?(?:[A-Za-z0-9\_\.\-]*?(?:\:[A-Za-z0-9\_\.\-]*?)?\@)?([a-zA-Z0-9\.\_\-]*?)(?:\:([0-9]{1,5}))?(?:\/.*?)?$/);\r | |
158 | Net::SSLeay::set_proxy($peer,$peerport,$proxysettings{'UPSTREAM_USER'},$proxysettings{'UPSTREAM_PASSWORD'} );\r | |
159 | }\r | |
160 | \r | |
161 | my ($out, $response) = Net::SSLeay::get_http( 'www.cjb.net',\r | |
162 | 80,\r | |
163 | "/cgi-bin/dynip.cgi?username=$settings{'LOGIN'}&password=$settings{'PASSWORD'}&ip=$ip",\r | |
164 | Net::SSLeay::make_headers('User-Agent' => 'Ipcop' )\r | |
165 | );\r | |
166 | \r | |
167 | if ($response =~ m%HTTP/1\.. 200 OK%) {\r | |
168 | if ( $out !~ m/has been updated to point to/ ) {\r | |
169 | &General::log("Dynamic DNS ip-update for cjb.net ($settings{'LOGIN'}) : failure (bad password or login)");\r | |
170 | } else {\r | |
171 | &General::log("Dynamic DNS ip-update for cjb.net ($settings{'LOGIN'}) : success");\r | |
172 | $success++;\r | |
173 | }\r | |
174 | } else {\r | |
175 | &General::log("Dynamic DNS ip-update for cjb.net ($settings{'LOGIN'}) : failure (could not connect to server)");\r | |
176 | }\r | |
177 | }\r | |
178 | elsif ($settings{'SERVICE'} eq 'selfhost') {\r | |
179 | # use proxy ?\r | |
180 | my %proxysettings;\r | |
181 | &General::readhash("${General::swroot}/proxy/settings", \%proxysettings);\r | |
182 | if ($_=$proxysettings{'UPSTREAM_PROXY'}) {\r | |
183 | my ($peer, $peerport) = (/^(?:[a-zA-Z ]+\:\/\/)?(?:[A-Za-z0-9\_\.\-]*?(?:\:[A-Za-z0-9\_\.\-]*?)?\@)?([a-zA-Z0-9\.\_\-]*?)(?:\:([0-9]{1,5}))?(?:\/.*?)?$/);\r | |
184 | Net::SSLeay::set_proxy($peer,$peerport,$proxysettings{'UPSTREAM_USER'},$proxysettings{'UPSTREAM_PASSWORD'} );\r | |
185 | }\r | |
186 | \r | |
187 | my ($out, $response) = Net::SSLeay::get_https( 'carol.selfhost.de',\r | |
188 | 443,\r | |
189 | "/update?username=$settings{'LOGIN'}&password=$settings{'PASSWORD'}&textmodi=1",\r | |
190 | Net::SSLeay::make_headers('User-Agent' => 'Ipcop' )\r | |
191 | );\r | |
192 | \r | |
193 | if ($response =~ m%HTTP/1\.. 200 OK%) {\r | |
194 | if ( $out !~ m/status=(200|204)/ ) {\r | |
195 | $out =~ s/\n/ /g;\r | |
196 | &General::log("Dynamic DNS ip-update for $settings{'HOSTNAME'}.$settings{'DOMAIN'} : failure ($out)");\r | |
197 | } else {\r | |
198 | &General::log("Dynamic DNS ip-update for $settings{'HOSTNAME'}.$settings{'DOMAIN'} : success");\r | |
199 | $success++;\r | |
200 | }\r | |
201 | } else {\r | |
202 | &General::log("Dynamic DNS ip-update for $settings{'HOSTNAME'}.$settings{'DOMAIN'} : failure (could not connect to server)");\r | |
203 | }\r | |
204 | }\r | |
205 | elsif ($settings{'SERVICE'} eq 'dnspark') {\r | |
206 | # use proxy ?\r | |
207 | my %proxysettings;\r | |
208 | &General::readhash("${General::swroot}/proxy/settings", \%proxysettings);\r | |
209 | if ($_=$proxysettings{'UPSTREAM_PROXY'}) {\r | |
210 | my ($peer, $peerport) = (/^(?:[a-zA-Z ]+\:\/\/)?(?:[A-Za-z0-9\_\.\-]*?(?:\:[A-Za-z0-9\_\.\-]*?)?\@)?([a-zA-Z0-9\.\_\-]*?)(?:\:([0-9]{1,5}))?(?:\/.*?)?$/);\r | |
211 | Net::SSLeay::set_proxy($peer,$peerport,$proxysettings{'UPSTREAM_USER'},$proxysettings{'UPSTREAM_PASSWORD'} );\r | |
212 | }\r | |
213 | \r | |
214 | if ($settings{'HOSTNAME'} eq '') {\r | |
215 | $settings{'HOSTDOMAIN'} = $settings{'DOMAIN'};\r | |
216 | } else {\r | |
217 | $settings{'HOSTDOMAIN'} = "$settings{'HOSTNAME'}.$settings{'DOMAIN'}";\r | |
218 | }\r | |
219 | \r | |
220 | my ($out, $response) = Net::SSLeay::get_https( "www.dnspark.net",\r | |
221 | 443,\r | |
222 | "/api/dynamic/update.php?hostname=$settings{'HOSTDOMAIN'}&ip=$ip",\r | |
223 | Net::SSLeay::make_headers('User-Agent' => 'Ipcop',\r | |
224 | 'Authorization' => 'Basic ' . encode_base64("$settings{'LOGIN'}:$settings{'PASSWORD'}")\r | |
225 | )\r | |
226 | );\r | |
227 | # Valid response are 'ok' 'nochange'\r | |
228 | if ($response =~ m%HTTP/1\.. 200 OK%) {\r | |
229 | if ( $out !~ m/^(ok|nochange)/ ) {\r | |
230 | $out =~ s/\n/ /g;\r | |
231 | &General::log("Dynamic DNS ip-update for $settings{'HOSTDOMAIN'} : failure ($out)");\r | |
232 | } else {\r | |
233 | &General::log("Dynamic DNS ip-update for $settings{'HOSTDOMAIN'} : success");\r | |
234 | $success++;\r | |
235 | }\r | |
236 | } else {\r | |
237 | &General::log("Dynamic DNS ip-update for $settings{'HOSTDOMAIN'} : failure (could not connect to server, check your credentials)");\r | |
238 | }\r | |
239 | }\r | |
240 | elsif ($settings{'SERVICE'} eq 'enom') {\r | |
241 | # use proxy ?\r | |
242 | my %proxysettings;\r | |
243 | &General::readhash("${General::swroot}/proxy/settings", \%proxysettings);\r | |
244 | if ($_=$proxysettings{'UPSTREAM_PROXY'}) {\r | |
245 | my ($peer, $peerport) = (/^(?:[a-zA-Z ]+\:\/\/)?(?:[A-Za-z0-9\_\.\-]*?(?:\:[A-Za-z0-9\_\.\-]*?)?\@)?([a-zA-Z0-9\.\_\-]*?)(?:\:([0-9]{1,5}))?(?:\/.*?)?$/);\r | |
246 | Net::SSLeay::set_proxy($peer,$peerport,$proxysettings{'UPSTREAM_USER'},$proxysettings{'UPSTREAM_PASSWORD'} );\r | |
247 | }\r | |
248 | if ($settings{'HOSTNAME'} eq '') {\r | |
249 | $settings{'HOSTDOMAIN'} = $settings{'DOMAIN'};\r | |
250 | } else {\r | |
251 | $settings{'HOSTDOMAIN'} = "$settings{'HOSTNAME'}.$settings{'DOMAIN'}";\r | |
252 | }\r | |
253 | \r | |
254 | my ($out, $response) = Net::SSLeay::get_http( 'dynamic.name-services.com',\r | |
255 | 80,\r | |
256 | "/interface.asp?Command=SetDNSHost&Zone=$settings{'DOMAIN'}&DomainPassword=$settings{'PASSWORD'}&Address=$ip",\r | |
257 | Net::SSLeay::make_headers('User-Agent' => 'Ipcop' )\r | |
258 | );\r | |
259 | \r | |
260 | if ($response =~ m%HTTP/1\.. 200 OK%) {\r | |
261 | #Valid responses from update => ErrCount=0\r | |
262 | if ( $out !~ m/ErrCount=0/ ) {\r | |
263 | $out =~ s/(\n|\x0D)/ /g;\r | |
264 | $out =~ /Err1=([\w ]+) /;\r | |
265 | &General::log("Dynamic DNS ip-update for $settings{'HOSTNAME'}.$settings{'DOMAIN'} : failure ($1)");\r | |
266 | } else {\r | |
267 | &General::log("Dynamic DNS ip-update for $settings{'HOSTNAME'}.$settings{'DOMAIN'} : success");\r | |
268 | $success++;\r | |
269 | }\r | |
270 | } else {\r | |
271 | &General::log("Dynamic DNS ip-update for $settings{'HOSTNAME'}.$settings{'DOMAIN'} : failure (could not connect to server)");\r | |
272 | }\r | |
273 | }\r | |
274 | elsif ($settings{'SERVICE'} eq 'nsupdate') {\r | |
275 | # Fetch UI configurable values and assemble the host name.\r | |
276 | \r | |
277 | my $hostName="$settings{'DOMAIN'}";\r | |
278 | if ($settings{'HOSTNAME'} ne "") {\r | |
279 | $hostName="$settings{'HOSTNAME'}.$hostName";\r | |
280 | }\r | |
281 | my $keyName=$settings{'LOGIN'};\r | |
282 | my $keySecret=$settings{'PASSWORD'};\r | |
283 | \r | |
284 | # Use a relatively long TTL value to reduce load on DNS.\r | |
285 | # Some public Dynamic DNS servers use values around 4 hours,\r | |
286 | # some use values as low as 60 seconds.\r | |
287 | # XXX Maybe we could fetch the master value from the server\r | |
288 | # (not the timed-down version supplied by DNS cache)\r | |
289 | \r | |
290 | my $timeToLive="3600";\r | |
291 | \r | |
292 | # Internal setting that can be used to override the DNS server\r | |
293 | # where the update is applied. It can be of use when testing\r | |
294 | # against a private DNS server.\r | |
295 | \r | |
296 | my $masterServer="";\r | |
297 | \r | |
298 | # Prepare the nsupdate command script to remove and re-add the\r | |
299 | # updated A record for the domain.\r | |
300 | \r | |
301 | my $cmdFile="/tmp/nsupdate-$hostName-commands";\r | |
302 | my $logFile="/tmp/nsupdate-$hostName-result";\r | |
303 | open(TF, ">$cmdFile");\r | |
304 | if ($masterServer ne "") {\r | |
305 | print TF "server $masterServer\n";\r | |
306 | }\r | |
307 | if ($keyName ne "" && $keySecret ne "") {\r | |
308 | print TF "key $keyName $keySecret\n";\r | |
309 | }\r | |
310 | print TF "update delete $hostName A\n";\r | |
311 | print TF "update add $hostName $timeToLive A $ip\n";\r | |
312 | print TF "send\n";\r | |
313 | close(TF);\r | |
314 | \r | |
315 | # Run nsupdate with -v to use TCP instead of UDP because we're\r | |
316 | # issuing multiple cmds and potentially long keys, and -d to\r | |
317 | # get diagnostic result output.\r | |
318 | \r | |
319 | my $result = system("/usr/bin/nsupdate -v -d $cmdFile 2>$logFile");\r | |
320 | if ($result != 0) {\r | |
321 | &General::log("Dynamic DNS ip-update for $hostName : failure");\r | |
322 | open(NSLOG, "$logFile");\r | |
323 | my @nsLog = <NSLOG>;\r | |
324 | close(NSLOG);\r | |
325 | my $logLine;\r | |
326 | foreach $logLine (@nsLog) {\r | |
327 | chomp($logLine);\r | |
328 | if ($logLine ne "") {\r | |
329 | &General::log("... $logLine");\r | |
330 | }\r | |
331 | }\r | |
332 | } else {\r | |
333 | &General::log("Dynamic DNS ip-update for $hostName : success");\r | |
334 | $success++;\r | |
335 | }\r | |
336 | unlink $cmdFile, $logFile;\r | |
337 | }\r | |
338 | elsif ($settings{'SERVICE'} eq 'freedns') {\r | |
339 | # use proxy ?\r | |
340 | my %proxysettings;\r | |
341 | &General::readhash("${General::swroot}/proxy/settings", \%proxysettings);\r | |
342 | if ($_=$proxysettings{'UPSTREAM_PROXY'}) {\r | |
343 | my ($peer, $peerport) = (/^(?:[a-zA-Z ]+\:\/\/)?(?:[A-Za-z0-9\_\.\-]*?(?:\:[A-Za-z0-9\_\.\-]*?)?\@)?([a-zA-Z0-9\.\_\-]*?)(?:\:([0-9]{1,5}))?(?:\/.*?)?$/);\r | |
344 | Net::SSLeay::set_proxy($peer,$peerport,$proxysettings{'UPSTREAM_USER'},$proxysettings{'UPSTREAM_PASSWORD'} );\r | |
345 | }\r | |
346 | \r | |
347 | my ($out, $response) = Net::SSLeay::get_https( 'freedns.afraid.org',\r | |
348 | 443,\r | |
349 | "/dynamic/update.php?$settings{'LOGIN'}",\r | |
350 | Net::SSLeay::make_headers('User-Agent' => 'Ipcop' )\r | |
351 | );\r | |
352 | #Valid responses from service are:\r | |
353 | #Updated n host(s) <domain>\r | |
354 | #ERROR: <ip> has not changed.\r | |
355 | if ($response =~ m%HTTP/1\.. 200 OK%) {\r | |
356 | #Valid responses from update => ErrCount=0\r | |
357 | if ( $out !~ m/(^Updated|Address .* has not changed)/ig ) {\r | |
358 | &General::log("Dynamic DNS ip-update for $settings{'HOSTNAME'}.$settings{'DOMAIN'} : failure ($out)");\r | |
359 | } else {\r | |
360 | &General::log("Dynamic DNS ip-update for $settings{'HOSTNAME'}.$settings{'DOMAIN'} : success");\r | |
361 | $success++;\r | |
362 | }\r | |
363 | } else {\r | |
364 | &General::log("Dynamic DNS ip-update for $settings{'HOSTNAME'}.$settings{'DOMAIN'} : failure (could not connect to server)");\r | |
365 | }\r | |
366 | }\r | |
367 | elsif ($settings{'SERVICE'} eq 'regfish') {\r | |
368 | # use proxy ?\r | |
369 | my %proxysettings;\r | |
370 | &General::readhash("${General::swroot}/proxy/settings", \%proxysettings);\r | |
371 | if ($_=$proxysettings{'UPSTREAM_PROXY'}) {\r | |
372 | my ($peer, $peerport) = (/^(?:[a-zA-Z ]+\:\/\/)?(?:[A-Za-z0-9\_\.\-]*?(?:\:[A-Za-z0-9\_\.\-]*?)?\@)?([a-zA-Z0-9\.\_\-]*?)(?:\:([0-9]{1,5}))?(?:\/.*?)?$/);\r | |
373 | Net::SSLeay::set_proxy($peer,$peerport,$proxysettings{'UPSTREAM_USER'},$proxysettings{'UPSTREAM_PASSWORD'} );\r | |
374 | }\r | |
375 | \r | |
376 | \r | |
377 | my ($out, $response) = Net::SSLeay::get_https( 'www.regfish.com',\r | |
378 | 443,\r | |
379 | "/dyndns/2/?fqdn=$settings{'DOMAIN'}&ipv4=$ip&forcehost=1&authtype=secure&token=$settings{'LOGIN'}",\r | |
380 | Net::SSLeay::make_headers('User-Agent' => 'Ipcop' )\r | |
381 | );\r | |
382 | #Valid responses from service are:\r | |
383 | #success|100|update succeeded!\r | |
384 | #success|101|no update needed at this time..\r | |
385 | if ($response =~ m%HTTP/1\.. 200 OK%) {\r | |
386 | if ( $out !~ m/(success\|(100|101)\|)/ig ) {\r | |
387 | &General::log("Dynamic DNS ip-update for $settings{'DOMAIN'} : failure ($out)");\r | |
388 | } else {\r | |
389 | &General::log("Dynamic DNS ip-update for $settings{'DOMAIN'} : success");\r | |
390 | $success++;\r | |
391 | }\r | |
392 | } else {\r | |
393 | &General::log("Dynamic DNS ip-update for $settings{'DOMAIN'} : failure (could not connect to server)");\r | |
394 | }\r | |
395 | }\r | |
396 | elsif ($settings{'SERVICE'} eq 'ovh') {\r | |
397 | my %proxysettings;\r | |
398 | &General::readhash("${General::swroot}/proxy/settings", \%proxysettings);\r | |
399 | \r | |
400 | my $peer = 'www.ovh.com';\r | |
401 | my $peerport = 80;\r | |
402 | \r | |
403 | if ($_=$proxysettings{'UPSTREAM_PROXY'}) {\r | |
404 | ($peer, $peerport) = (/^(?:[a-zA-Z ]+\:\/\/)?(?:[A-Za-z0-9\_\.\-]*?(?:\:[A-Za-z0-9\_\.\-]*?)?\@)?([a-zA-Z0-9\.\_\-]*?)(?:\:([0-9]{1,5}))?(?:\/.*?)?$/);\r | |
405 | }\r | |
406 | \r | |
407 | my $sock;\r | |
408 | unless($sock = new IO::Socket::INET (PeerAddr => $peer, PeerPort => $peerport, Proto => 'tcp', Timeout => 5)) {\r | |
409 | &General::log("Dynamic DNS failure : could not connect to $peer:$peerport: $@");\r | |
410 | next;\r | |
411 | }\r | |
412 | \r | |
413 | if ($settings{'HOSTNAME'} eq '') {\r | |
414 | $settings{'HOSTDOMAIN'} = $settings{'DOMAIN'};\r | |
415 | } else {\r | |
416 | $settings{'HOSTDOMAIN'} = "$settings{'HOSTNAME'}.$settings{'DOMAIN'}";\r | |
417 | }\r | |
418 | \r | |
419 | my ($GET_CMD, $code64);\r | |
420 | $GET_CMD = "GET http://www.ovh.com/nic/update?system=dyndns&hostname=$settings{'HOSTDOMAIN'}&myip=$ip HTTP/1.1\r\n";\r | |
421 | $GET_CMD .= "Host: www.ovh.com\r\n";\r | |
422 | chomp($code64 = encode_base64("$settings{'LOGIN'}:$settings{'PASSWORD'}"));\r | |
423 | $GET_CMD .= "Authorization: Basic $code64\r\n";\r | |
424 | $GET_CMD .= "User-Agent: ipcop\r\n";\r | |
425 | #$GET_CMD .= "Content-Type: application/x-www-form-urlencoded\r\n";\r | |
426 | $GET_CMD .= "\r\n";\r | |
427 | print $sock "$GET_CMD";\r | |
428 | \r | |
429 | my $out = '';\r | |
430 | while(<$sock>) {\r | |
431 | $out .= $_;\r | |
432 | }\r | |
433 | close($sock);\r | |
434 | \r | |
435 | #HTTP response => error (in Title tag) else text response\r | |
436 | #Valid responses from service:good,nochg (ez-ipupdate like)\r | |
437 | #Should use ez-ipdate but "system=dyndns" is not present\r | |
438 | if ( $out =~ m/<Title>(.*)<\/Title>/ig ) {\r | |
439 | &General::log("Dynamic DNS ovh.com : failure ($1)");\r | |
440 | }\r | |
441 | elsif ($out !~ m/good |nochg /ig) {\r | |
442 | $out =~ s/.+?\015?\012\015?\012//s; # header HTTP\r | |
443 | my @out = split("\r", $out);\r | |
444 | &General::log("Dynamic DNS ip-update for $settings{'DOMAIN'} : failure ($out[1])");\r | |
445 | } else {\r | |
446 | &General::log("Dynamic DNS ip-update for $settings{'DOMAIN'} : success");\r | |
447 | $success++;\r | |
448 | }\r | |
449 | }\r | |
450 | elsif ($settings{'SERVICE'} eq 'dtdns') {\r | |
451 | # use proxy ?\r | |
452 | my %proxysettings;\r | |
453 | &General::readhash("${General::swroot}/proxy/settings", \%proxysettings);\r | |
454 | if ($_=$proxysettings{'UPSTREAM_PROXY'}) {\r | |
455 | my ($peer, $peerport) = (/^(?:[a-zA-Z ]+\:\/\/)?(?:[A-Za-z0-9\_\.\-]*?(?:\:[A-Za-z0-9\_\.\-]*?)?\@)?([a-zA-Z0-9\.\_\-]*?)(?:\:([0-9]{1,5}))?(?:\/.*?)?$/);\r | |
456 | Net::SSLeay::set_proxy($peer,$peerport,$proxysettings{'UPSTREAM_USER'},$proxysettings{'UPSTREAM_PASSWORD'} );\r | |
457 | }\r | |
458 | \r | |
459 | if ($settings{'HOSTNAME'} eq '') {\r | |
460 | $settings{'HOSTDOMAIN'} = $settings{'DOMAIN'};\r | |
461 | } else {\r | |
462 | $settings{'HOSTDOMAIN'} = "$settings{'HOSTNAME'}.$settings{'DOMAIN'}";\r | |
463 | }\r | |
464 | \r | |
465 | my ($out, $response) = Net::SSLeay::get_http( 'www.dtdns.com',\r | |
466 | 80,\r | |
467 | "/api/autodns.cfm?id=$settings{'HOSTDOMAIN'}&pw=$settings{'PASSWORD'}",\r | |
468 | Net::SSLeay::make_headers('User-Agent' => 'Ipcop' )\r | |
469 | );\r | |
470 | #Valid responses from service are:\r | |
471 | # now points to\r | |
472 | #\r | |
473 | if ($response =~ m%HTTP/1\.. 200 OK%) {\r | |
474 | if ( $out !~ m/Host .* now points to/ig ) {\r | |
475 | &General::log("Dynamic DNS ip-update for $settings{'HOSTDOMAIN'} : failure ($out)");\r | |
476 | } else {\r | |
477 | &General::log("Dynamic DNS ip-update for $settings{'HOSTDOMAIN'} : success");\r | |
478 | $success++;\r | |
479 | }\r | |
480 | } else {\r | |
481 | &General::log("Dynamic DNS ip-update for $settings{'HOSTDOMAIN'} : failure (could not connect to server)");\r | |
482 | }\r | |
483 | }\r | |
484 | elsif ($settings{'SERVICE'} eq 'dynu') {\r | |
485 | # use proxy ?\r | |
486 | my %proxysettings;\r | |
487 | &General::readhash("${General::swroot}/proxy/settings", \%proxysettings);\r | |
488 | if ($_=$proxysettings{'UPSTREAM_PROXY'}) {\r | |
489 | my ($peer, $peerport) = (/^(?:[a-zA-Z ]+\:\/\/)?(?:[A-Za-z0-9\_\.\-]*?(?:\:[A-Za-z0-9\_\.\-]*?)?\@)?([a-zA-Z0-9\.\_\-]*?)(?:\:([0-9]{1,5}))?(?:\/.*?)?$/);\r | |
490 | Net::SSLeay::set_proxy($peer,$peerport,$proxysettings{'UPSTREAM_USER'},$proxysettings{'UPSTREAM_PASSWORD'} );\r | |
491 | }\r | |
492 | \r | |
493 | if ($settings{'HOSTNAME'} eq '') {\r | |
494 | $settings{'HOSTDOMAIN'} = $settings{'DOMAIN'};\r | |
495 | } else {\r | |
496 | $settings{'HOSTDOMAIN'} = "$settings{'HOSTNAME'}.$settings{'DOMAIN'}";\r | |
497 | }\r | |
498 | \r | |
499 | my ($out, $response) = Net::SSLeay::get_http( 'dynserv.ca',\r | |
500 | 80,\r | |
501 | "/dyn/dynengine.cgi?func=set&name=$settings{'LOGIN'}&pass=$settings{'PASSWORD'}&ip=$ip&domain=$settings{'DOMAIN'}",\r | |
502 | Net::SSLeay::make_headers('User-Agent' => 'Ipcop' )\r | |
503 | );\r | |
504 | #Valid responses from service are:\r | |
505 | # 02 == Domain already exists, refreshing data for ... => xxx.xxx.xxx.xxx\r | |
506 | #\r | |
507 | if ($response =~ m%HTTP/1\.. 200 OK%) {\r | |
508 | if ( $out !~ m/Domain already exists, refreshing data for/ig ) {\r | |
509 | &General::log("Dynamic DNS ip-update for $settings{'HOSTDOMAIN'} : failure ($out)");\r | |
510 | } else {\r | |
511 | &General::log("Dynamic DNS ip-update for $settings{'HOSTDOMAIN'} : success");\r | |
512 | $success++;\r | |
513 | }\r | |
514 | } else {\r | |
515 | &General::log("Dynamic DNS ip-update for $settings{'HOSTDOMAIN'} : failure (could not connect to server)");\r | |
516 | }\r | |
517 | } else {\r | |
518 | if ($settings{'WILDCARDS'} eq 'on') {\r | |
519 | $settings{'WILDCARDS'} = '-w';\r | |
520 | } else {\r | |
521 | $settings{'WILDCARDS'} = '';\r | |
522 | }\r | |
523 | \r | |
524 | if (($settings{'SERVICE'} eq 'dyndns-custom' ||\r | |
525 | $settings{'SERVICE'} eq 'easydns' || \r | |
526 | $settings{'SERVICE'} eq 'zoneedit') && $settings{'HOSTNAME'} eq '') {\r | |
527 | $settings{'HOSTDOMAIN'} = $settings{'DOMAIN'};\r | |
528 | } else {\r | |
529 | $settings{'HOSTDOMAIN'} = "$settings{'HOSTNAME'}.$settings{'DOMAIN'}";\r | |
530 | }\r | |
531 | \r | |
532 | my @ddnscommand = ('/usr/bin/ez-ipupdate', '-a', "$ip", '-S', "$settings{'SERVICE'}", '-u', "$settings{'LOGIN'}:$settings{'PASSWORD'}", '-h', "$settings{'HOSTDOMAIN'}", "$settings{'WILDCARDS'}", '-q');\r | |
533 | \r | |
534 | my $result = system(@ddnscommand);\r | |
535 | if ( $result != 0) { \r | |
536 | &General::log("Dynamic DNS ip-update for $settings{'HOSTDOMAIN'}: failure");\r | |
537 | } else {\r | |
538 | &General::log("Dynamic DNS ip-update for $settings{'HOSTDOMAIN'}: success");\r | |
539 | $success++;\r | |
540 | }\r | |
541 | }\r | |
542 | } else {\r | |
543 | # If a line is disabled, then we should discount it\r | |
544 | $lines--;\r | |
545 | }\r | |
546 | }\r | |
547 | \r | |
548 | if ($lines == $success) {\r | |
549 | open(IPCACHE, ">$cachefile");\r | |
550 | flock IPCACHE, 2;\r | |
551 | print IPCACHE $ip;\r | |
552 | close(IPCACHE);\r | |
553 | exit 1;\r | |
554 | }\r | |
555 | \r | |
556 | }\r | |
557 | exit 0;\r | |
558 | \r | |
559 | # Extracted from Base64.pm\r | |
560 | sub encode_base64 ($;$) {\r | |
561 | my $res = "";\r | |
562 | my $eol = $_[1];\r | |
563 | $eol = "\n" unless defined $eol;\r | |
564 | pos($_[0]) = 0; # ensure start at the beginning\r | |
565 | while ($_[0] =~ /(.{1,45})/gs) {\r | |
566 | $res .= substr(pack('u', $1), 1);\r | |
567 | chop($res);\r | |
568 | }\r | |
569 | $res =~ tr|` -_|AA-Za-z0-9+/|; # `# help emacs\r | |
570 | # fix padding at the end\r | |
571 | my $padding = (3 - length($_[0]) % 3) % 3;\r | |
572 | $res =~ s/.{$padding}$/'=' x $padding/e if $padding;\r | |
573 | # break encoded string into lines of no more than 76 characters each\r | |
574 | if (length $eol) {\r | |
575 | $res =~ s/(.{1,76})/$1$eol/g;\r | |
576 | }\r | |
577 | $res;\r | |
578 | }\r | |
579 | \r | |
580 | \r | |
581 | \r | |
582 | __END__\r | |
583 | old code for selfhost.de\r | |
584 | \r | |
585 | my %proxysettings;\r | |
586 | &General::readhash("${General::swroot}/proxy/settings", \%proxysettings);\r | |
587 | \r | |
588 | my $peer = 'carol.selfhost.de';\r | |
589 | my $peerport = 80;\r | |
590 | \r | |
591 | if ($_=$proxysettings{'UPSTREAM_PROXY'}) {\r | |
592 | ($peer, $peerport) = (/^(?:[a-zA-Z ]+\:\/\/)?(?:[A-Za-z0-9\_\.\-]*?(?:\:[A-Za-z0-9\_\.\-]*?)?\@)?([a-zA-Z0-9\.\_\-]*?)(?:\:([0-9]{1,5}))?(?:\/.*?)?$/);\r | |
593 | }\r | |
594 | \r | |
595 | my $sock;\r | |
596 | unless($sock = new IO::Socket::INET (PeerAddr => $peer, PeerPort => $peerport, Proto => 'tcp', Timeout => 5)) {\r | |
597 | die "Could not connect to $peer:$peerport: $@";\r | |
598 | return 1;\r | |
599 | }\r | |
600 | \r | |
601 | my $GET_CMD;\r | |
602 | $GET_CMD = "GET https://carol.selfhost.de/update?username=$settings{'LOGIN'}&password=$settings{'PASSWORD'}&myip=$ip&textmodi=1 HTTP/1.1\r\n";\r | |
603 | $GET_CMD .= "Host: carol.selfhost.de\r\n";\r | |
604 | $GET_CMD .= "User-Agent: ipcop\r\n";\r | |
605 | $GET_CMD .= "Connection: close\r\n\r\n";\r | |
606 | print $sock "$GET_CMD";\r | |
607 | \r | |
608 | my $out = '';\r | |
609 | while(<$sock>) {\r | |
610 | $out .= $_;\r | |
611 | }\r | |
612 | close($sock);\r | |
613 | \r | |
614 | if ( $out !~ m/status=(200|204)/ ) {\r | |
615 | #cleanup http response...\r | |
616 | $out =~ s/.+?\015?\012\015?\012//s; # header HTTP\r | |
617 | my @out = split("\r", $out);\r | |
618 | &General::log("Dynamic DNS ip-update for $settings{'HOSTNAME'}.$settings{'DOMAIN'} : failure ($out[1])");\r | |
619 | } else {\r | |
620 | &General::log("Dynamic DNS ip-update for $settings{'HOSTNAME'}.$settings{'DOMAIN'} : success");\r | |
621 | $success++;\r | |
622 | }\r | |
623 | \r | |
624 | \r | |
625 | \r |