TODO.html 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564
  1. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
  2. "http://www.w3.org/TR/html4/loose.dtd">
  3. <html>
  4. <head>
  5. <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
  6. <title>
  7. GnuDIP Release 2.3.5 - TODO File
  8. </title>
  9. <base target="_blank">
  10. </head>
  11. <body bgcolor=white>
  12. <table><tr valign=middle><td>
  13. <img align=middle src="gnudip/html/gnudip.jpg" alt="GnuDIP Logo" border=0 height=60 width=113>
  14. </td><td>
  15. <h1>GnuDIP Release 2.3.5 - TODO File</h1>
  16. </table>
  17. <hr>
  18. <p>
  19. <b><u>GnuDIP is now only minimally maintained.
  20. New development will not occur unless a new developer steps forward.
  21. </u></b>
  22. <p>
  23. These items are just here as food for thought.
  24. <p><hr>
  25. <p>
  26. <h3>Better Documentation</h3>
  27. <blockquote>
  28. <p>
  29. In particular the "Help" available from the Web Tool could be better.
  30. </blockquote>
  31. <h3>A MacPerl Client Package</h3>
  32. <blockquote>
  33. <p>
  34. There is a port of Perl for MacOS called
  35. <a href="http://www.macperl.com/">MacPerl</a>.
  36. <p>
  37. Perhaps someone could create a MacPerl client package similiar to the Windows
  38. <a href="http://aspn.activestate.com/ASPN/Downloads/ActivePerl/">ActivePerl</a>
  39. client package.
  40. </blockquote>
  41. <h3>Navigation Buttons in the GUI</h3>
  42. <blockquote>
  43. <p>
  44. The GUI interface might be more user friendly with navigation buttons. It
  45. should be noted that this would have the drawback of accumulating cached pages on
  46. the browsers "Back" button.
  47. </blockquote>
  48. <h3>Have the Client Check for a Default Gateway</h3>
  49. <blockquote>
  50. <p>
  51. The GnuDIP client at present attempts to connect to the GnuDIP server whenever
  52. it determines that the address it recorded at the time of the last update is
  53. no longer valid, or it has no recorded address. But this will be the case if
  54. the external connection no longer exists. So when the client is being run at
  55. intervals, in order to "poll" for IP address changes,
  56. the client will repeatedly attempt a connection,
  57. timing out each time. Perhaps a check could be made to see if there is a
  58. "default gateway" to the internet before attempting to connect to the GnuDIP
  59. server.
  60. </blockquote>
  61. <h3>A Mechanism to Link Non-GnuDIP Host Names to a GnuDIP Host Name</h3>
  62. <blockquote>
  63. <p>
  64. Some sites use DNS <code>CNAME</code> records to point non-GnuDIP host names
  65. at a GnuDIP ("canonical") host name. The objective is to provide dynamic IP support
  66. for these non-GnuDIP domain names.
  67. <p>
  68. This can be problematic in some circumstances. For example:
  69. <p>
  70. <ul>
  71. <li>
  72. It is not possible to have a <code>CNAME</code> and an <code>SOA</code> record
  73. for the same name. So the zone for <code>site.com</code> cannot have a
  74. <code>CNAME</code> record for <code>site.com</code>.
  75. <p><li>
  76. It is not possible to have a <code>CNAME</code> and an <code>MX</code> record
  77. for the same name.
  78. <p><li>
  79. If mail is sent to a host name defined in a <code>CNAME</code> record, a
  80. standards compliant MTA will re-address the mail to the canonical host name, so
  81. that the receiving MTA must accept mail addressed to the canonical/GnuDIP host
  82. name.
  83. </ul>
  84. <p>
  85. It would be better if the <code>CNAME</code> record could be replaced with an
  86. <code>A</code> record.
  87. <p>
  88. To remedy this, GnuDIP could maintain a list of host names for which an
  89. <code>A</code> record update should be done, whenever an <code>A</code>
  90. record update is done for the GnuDIP host. This list would be maintainable only
  91. by a GnuDIP administrative user. It would be up to the GnuDIP site operator to
  92. set up the appropriate non-GnuDIP dynamic domains.
  93. <p>
  94. <b>It would be possible in principle to implement this as a separate software
  95. component, by providing a "drop in replacement" for the <code>nsupdate</code>
  96. command.</b> To make this more efficient, GnuDIP could be modified to be able to
  97. either invoke <code>nsupdate</code>, or alternatively send the update information
  98. to a UNIX domain socket. The "add on" component could then provide a daemon to
  99. process these updates, rather than a replacement for <code>nsupdate</code>.
  100. <p>
  101. Please note that since this blurb was first written, the script
  102. <a href="gnudip/sbin/multinsupd.pl"><code>gnudip/sbin/multinsupd.pl</code></a>
  103. has been written, to filter the commands being passed to the
  104. <code>nsupdate</code> command, in order to insert non-GnuDIP aliases for GnuDIP
  105. host names. See the comments in the script, as well as the example and comments in
  106. <a href="gnudip/etc/gnudip.conf"><code>gnudip/etc/gnudip.conf</code></a>,
  107. <a href="gnudip/etc/minidip.conf"><code>gnudip/etc/minidip.conf</code></a> and
  108. <a href="gnudip/etc/multinsupd.conf"><code>gnudip/etc/multinsupd.conf</code></a>.
  109. This script goes a long towards addressing this blurb. There is however no
  110. web GUI.
  111. </blockquote>
  112. <h3>Per User TTL Specification</h3>
  113. <blockquote>
  114. <p>
  115. The web interface could allow an administrator to set a TTL value on a
  116. per user basis. Users that are observed to have a high DNS volume could have
  117. their TTL value raised, to increase caching and reduce the load on the GnuDIP
  118. DNS server. This would have the drawback of making the dynamic DNS service for
  119. that user less responsive to IP address changes.
  120. <p>
  121. Please note that since this blurb was first written, changes have been
  122. made to allow a user level TTL override to be done from the
  123. <code>gnudip.conf</code> (or <code>minidip.conf</code>) file, in the
  124. same way as for domain level override. There is however no
  125. web GUI.
  126. </blockquote>
  127. <h3>Automatic Server Abuse Detection and Prevention</h3>
  128. <blockquote>
  129. <p>
  130. An effort could be made to detect server abuse automatically, and take
  131. steps to stop it. For example:
  132. <ol>
  133. <li>
  134. The server could
  135. record the most recent login attempt, successful or not, for all host
  136. names, not just registered hosts. A separate table would be used for
  137. this. There would be a system (or per host) parameter for the minimum acceptable
  138. time between updates. If an update arrives for a host within this interval,
  139. the server would disable the host (creating it if necessary!).
  140. <p>
  141. Note that automatic disabling of a host would not be done for updates
  142. for a valid user but with an invalid password. Otherwise it would be
  143. possible for a third party to disable any GnuDIP host's DNS entry.
  144. This would be done only when the host does not exist or the login
  145. succeeds. It may also be desirable to have a flag for hosts that the
  146. administrator can set to exempt a host from this regimen.
  147. <p><li>
  148. A utility could be written to scan the BIND <code>named</code> log for activity for
  149. GnuDIP users. At intervals the activity levels for each user could be assessed, and
  150. adjustments to the TTL value for each user adjusted to reduce the DNS load.
  151. </ol>
  152. </blockquote>
  153. <h3>Use of Windows IP Interface Change Notification</h3>
  154. <blockquote>
  155. <p>
  156. On later versions of Windows, it is possible for a daemon process to request a
  157. notification when a change occurs to any IP interface. The GnuDIP client could
  158. use this when running in "daemon mode", in addition to the current polling. This
  159. would provide more timely detection of IP address changes.
  160. <p>
  161. However the author does not own a recent enough version of Windows to test this,
  162. and is not going to give any more money to Bill Gates until he absolutely has
  163. too.
  164. </blockquote>
  165. <h3>General Enhancements</h3>
  166. <blockquote>
  167. <ul>
  168. <li>
  169. support for <a href="http://www.ipv6.org/">IPv6</a>
  170. <p>
  171. This will eventually be necessary.
  172. <p><li>
  173. instructions for <b>byte compiling</b> the GnuDIP Perl scripts
  174. <p>
  175. Hopefully the Perl byte code generation and reload facilities will soon
  176. be easily usable.
  177. When that occurs, the necessary steps for GnuDIP should be documented.
  178. <p>
  179. Precompilation should improve the start up time for the (X)INETD server
  180. script and the web tool when it is not running under mod_perl.
  181. <p><li>
  182. multiple language support
  183. <p>
  184. A set of patches could be developed which alter the base file set for
  185. other languages. Those text strings in HTML, E-mail and messages from the
  186. client as well as documentation, <u>intended to be seen by end users</u>.
  187. would be translated.
  188. <p>
  189. People who wish to provide a GnuDIP service for speakers of a particular
  190. language could then apply the patch for the desired language.
  191. </ul>
  192. </blockquote>
  193. <h3>Internal Restructuring</h3>
  194. <blockquote>
  195. <ul>
  196. <li>
  197. improvements to name space management for functions
  198. <p>
  199. Each Perl module in GnuDIP has its own name space for variables.
  200. Variables that are to be visible to more than one module must be
  201. declared as "global". This is very convenient. However this is not so
  202. for function names, and the GnuDIP code has grown to a size where this
  203. is a hassle, and possibly a deterent to making code changes.
  204. It would be desirable to use the Perl "<code>package</code>" statement
  205. in each GnuDIP module to provide the same sort of "local" name space
  206. for function names. It would then be necessary to use the
  207. "<code>Exporter</code>" Perl module to export those function names
  208. meant to be global.
  209. <p>
  210. This would be quite a sweeping change, and would require careful
  211. testing. <b>It would be a good project for someone who wanted to become
  212. familiar with the GnuDIP code</b>, and add new features to it.
  213. <p><li>
  214. multiple language support
  215. <p>
  216. The GnuDIP code could stand to be restrucured with multiple
  217. language support in mind. A user of the Web Interface should be able to
  218. select their prefered language, and see all prompts and help screens in
  219. that language. The GnuDIP client should also support multiple languages.
  220. <p>
  221. As part of this, all messages would have to be extracted to a separate
  222. Perl module, and imbedded in HTML by using Perl variables. The "Help"
  223. pages would have to be presented by a simple CGI script in order that
  224. different versions of the HTML files would be provided depending on the
  225. language chosen. The prefered language could be saved in an HTTP
  226. cookie.
  227. <p>
  228. Initially, there would only be an English version of all
  229. messages and HTML files, unless the person who did this spoke some other
  230. language(s). But it would become simple for non-technical
  231. people to provide new translations.
  232. <p><li>
  233. atomic file replacement for "flat file database" mode
  234. <p>
  235. The code that reads and overwrites the files used in flat file database
  236. mode simply overwrites the existing files. In principle, this could result
  237. in file corruption if two processes update a file at the same time.
  238. <p>
  239. The author decided that this was not a problem in this case because each
  240. file is very small, and will probably be read or written in a single I/O,
  241. and because the usage pattern of these files would make it extremely
  242. unlikely that a collision would occur. The preferences file, once set up,
  243. is never rewritten in normal operation. A user file is only rewritten if
  244. a transaction has provided the correct user password. So a user file could
  245. only be trashed if someone knowing the password for the user manages to
  246. run two updates for the same user within milliseconds. And if they achieve
  247. this, only that user file would be damaged (serves them right!).
  248. <p>
  249. However, instead of directly overwriting files, a new file with a randomly
  250. generated name could be created, and then this file renamed,
  251. thereby overwriting the directory entry. The Perl documentation however
  252. warns that there can be portability issues with rename - even cautioning
  253. that some Unix variant may not clobber an existing file. If so, then this
  254. could end up being more trouble than it is worth.
  255. <p><li>
  256. move the GnuDIP "*.pm" files from <code>lib</code> to <code>lib/gnudip</code>
  257. <p>
  258. There is a potential at the moment for some GnuDIP module name to block
  259. some other non-GnuDIP module.
  260. </ul>
  261. </blockquote>
  262. <h3>More Sample Scripts for the Use of a DNS Server on the Client Machine</h3>
  263. <blockquote>
  264. <p>
  265. As discussed in <a href="gnudip/html/owndomain.html">owndomain.html</a>,
  266. users may use their own domain name with a dynamic IP address if they are willing
  267. to run BIND on the client machine.
  268. <p>
  269. More documentation and sample scripts could be written explaining how to
  270. do this.
  271. <p>
  272. Documentation and samples for <a href="http://tinydns.org/">tinydns</a> and
  273. other DNS server software could also be written.
  274. </blockquote>
  275. <h3>Sample Scripts for Querying NAT Devices for their External IP Address</h3>
  276. <blockquote>
  277. <p>
  278. The current support for operation of the client behind closed NAT devices should
  279. handle all but very exceptional cases.
  280. <p>
  281. However if the NAT device itself is behind an IP masking/anonymizing proxy,
  282. the GnuDIP server will not be able to see the external
  283. IP address of the NAT device, and so will not be able to return it to the
  284. client.
  285. <p>
  286. In this situation it would be necessary for the client to directly query the NAT
  287. device for its external IP address.
  288. <p>
  289. Ideally, all closed NAT devices would implement
  290. <a href="http://ietf.org/rfc/rfc1213.txt">MIB-II</a>
  291. /
  292. <a href="http://ietf.org/rfc/rfc1157.txt">SNMP</a>.
  293. Most Linux distributions do not install this capability by default.
  294. One must install <a href="http://net-snmp.sourceforge.net/">net-snmp</a>
  295. in order to support this. This fact causes the author to wonder whether
  296. very many vendors of NAT devices have implemented this.
  297. <p>
  298. A sample script is currently provided in the client package to query
  299. for the external address of a host using MIB-II/SNMP ("<code>snmpqry.pl</code>").
  300. It uses
  301. <a href="http://www.switch.ch/misc/leinen/snmp/perl/">
  302. a pure Perl SNMP implementation</a> to retrieve the routing table
  303. entry interface number for address <code>0.0.0.0</code>, and then scans the
  304. IP address table entries for a matching interface number.
  305. The client script can invoke this sample script using the "<code>-q</code>"
  306. option.
  307. </blockquote>
  308. <h3>An SMTP Monitor Daemon</h3>
  309. <blockquote>
  310. <p>
  311. This would be a process to run continually, connecting to the SMTP port
  312. for particular GnuDIP users, to ensure that mail sent to their host name
  313. will be correctly
  314. received. When an SMTP agent does not respond correctly to a TCP connection,
  315. the monitor would automatically change the address for the associated
  316. GnuDIP user to a "dead" IP address, so that packets sent to it are dropped.
  317. <p>
  318. This would ensure that the originating SMTP agent sends E-mail
  319. to the "backup" SMTP agent instead
  320. and that the backup SMTP agent does not bounce this E-mail.
  321. <p>
  322. Original addresses would be cached. For subsequent checks for that
  323. GnuDIP user, if the address has not been reset by an update from the
  324. associated GnuDIP client, the original address would be retested and
  325. restored if found to work again.
  326. </blockquote>
  327. <h3>An Extension to GnuDIP to Handle Any Domain Name</h3>
  328. <blockquote>
  329. <p>
  330. This could be built as separate add-on component for GnuDIP to make thngs
  331. simpler. We will refer to it here as "MyGnuDIP".
  332. <p>
  333. Zones have to be individually defined in the BIND <code>named.conf</code> file, or
  334. files that it includes. These files must be parsed by <code>named</code> whenever
  335. it starts up, or whenever an "<code>rndc reconfig</code>" command is issued to add
  336. or remove zones. Almost a megabyte of sequential files would need to be parsed when
  337. a new domain is created, once there are about five thousand users.
  338. <b>This does not scale well</b>.
  339. <p>Nevertheless, MyGnuDIP could maintain a sequential file of zone definitions
  340. which has an "<code>include</code>" statement for it in the
  341. <code>named.conf</code> file, and generate an "<code>rndc reconfig</code>"
  342. command whenever this was changed.
  343. <p>
  344. It would also be necessary to create a protocol and daemon software to propogate
  345. new zones to slave servers.
  346. <p>
  347. And of course an elaborate (depending on how much detail of the contents of
  348. the zone the user may maintain) web interface would have to be built.
  349. The blurb "Mechanism to Link Non-GnuDIP Host Names to a GnuDIP Host Name"
  350. above would be rolled into this functionality. MyGnuDIP "<code>A</code>"
  351. records would refer to a GnuDIP domain name, and would be updated whenever
  352. the corresponding GnuDIP "<code>A</code>" record was updated.
  353. <p>
  354. To make sure no one else can "hijack" a domain they do not own on the MyGnuDIP
  355. server, the following scheme could be used. A user can claim an existing domain
  356. name if an SOA query for that domain does not return the name of the MyGnuDIP
  357. master DNS server. It is true that a user could have a struggle with someone
  358. else until they get the domain name "nailed down". The E-mail address could
  359. be used to nofify people when their domain name is claimed.
  360. <p>
  361. The SOA query would be done using the BIND <code>dig</code> command.
  362. <p>
  363. It should also be noted here that:
  364. <ul>
  365. <li>
  366. <b>Many installers of GnuDIP may not want such a feature</b>.
  367. <p>
  368. There are a number of Virtual Domain/DNS providers who provide a free GnuDIP-style service
  369. as a "loss leader", to get you in the door. They then charge for custom DNS hosting.
  370. <p>
  371. There is also some promotional advantage to them to have other people using a subdomain
  372. of their domain.
  373. <p>
  374. So many sites may not want this "MyGnuDIP" add-on, unless it has hooks for billing
  375. code to be added (ugh!).
  376. <p><li>
  377. <b>The same end result can be achieved by setting up a DNS server on the client machine</b>.
  378. <p>
  379. This is discussed in <a href="gnudip/html/owndomain.html">owndomain.html</a>.
  380. </ul>
  381. </blockquote>
  382. <h3>C Packaged by GNU Autoconf for the (X)INETD Server</h3>
  383. <blockquote>
  384. <p>
  385. The Perl version of this server has to be compiled each time the server is run.
  386. <p>
  387. One could write a C version of this server. Also, most open source C system
  388. software now uses
  389. <a href="http://www.gnu.org/directory/autoconf.html">GNU autoconf</a>
  390. to facilitate portability.
  391. <p>
  392. This may be less of a concern once <u>the Perl byte-code compiler and interpreter</u>
  393. modules reach maturity. It may in fact not be a major issue in any case.
  394. </blockquote>
  395. <h3>C Packaged by GNU Autoconf for the GnuDIP Client</h3>
  396. <blockquote>
  397. <p>
  398. The Perl version of the client has to be compiled each time it is run.
  399. <p>
  400. Also, because the Perl "infrastructure" must be in place for it to work,
  401. it does not lend itself to being invoked from another program, such as a GUI
  402. front-end (e.g., C/KDE, C/GNOME, C/MFC, C/wxWin, VB, Delphi).
  403. <p>
  404. One could write a C version of this server. Also, most open source C system
  405. software now uses
  406. <a href="http://www.gnu.org/directory/autoconf.html">GNU autoconf</a>
  407. to facilitate portability.
  408. <p>
  409. Note that <a href="http://sources.redhat.com/cygwin/">cygwin</a>
  410. makes the usual GNU C development environment available for Windows.
  411. <p>
  412. The client functionality could also be made available as a C API available
  413. through shared libraries (for Linux "shared library" == "*.so";
  414. on Windows "shared library" == "*.dll").
  415. <p>
  416. This would allow people to develop nice looking GUI-s using the plethora
  417. of GUI development tools now available, without having to understand all
  418. of the nasty networking/DNS issues associated with GnuDIP.
  419. </blockquote>
  420. <h3>Windows GUI Client</h3>
  421. <blockquote>
  422. <p>
  423. Windows users like and are used to GUI interfaces.
  424. <p>
  425. To avoid completely rewriting the Windows client,
  426. one could use the <code>Tk</code> and <code>Win32::API</code> Perl
  427. modules to write a Windows GUI client. This could be
  428. packaged for installation using Microsoft Software Installer (MSI) and/or
  429. <a href="http://www.jrsoftware.org/isinfo.php">Inno Setup</a>.
  430. The necessary pieces from ActivePerl could be included to make it stand-alone.
  431. <p>
  432. The Web Tool provides a reasonably easy to use the GUI interface for manual
  433. updates. This is particulary true if the user sets up a Desktop Shortcut for
  434. their "Quick Login" URL. If the user wants to be able to manually update several
  435. servers at once, they can install the Perl client and set up a Desktop
  436. Shortcut to "gdipc.bat". Also, experience at legacy GnuDIP sites showed that most
  437. GnuDIP users used the browser to update, even though there was a Visual Basic GUI
  438. client available.
  439. <p>
  440. The main advantage of a GUI windows client may be to provide an alternative method
  441. to "gdipc.bat" for automatic detection and reporting of IP address changes.
  442. A Windows GUI could remove the need to use a DOS box, notepad and the Windows Task
  443. Scheduler GUI interface for configuration. The need for these activities may deter
  444. some less technical users from using "gdipc.bat".
  445. <p>
  446. Please note that since this blurb was first written, an Open Source Windows
  447. GUI client has been written using Delphi - see
  448. <a href="http://gnudip2.sourceforge.net/dynclient/">
  449. http://gnudip2.sourceforge.net/dynclient/</a>.
  450. However a fully Open Source client requiring only other Open Source tools
  451. (e.g. <a href="http://sources.redhat.com/cygwin/">cygwin</a>)
  452. may still be desirable.
  453. </blockquote>
  454. <p><hr>
  455. </body>
  456. </html>