Provided by: dyndns_2014.0708-1_all bug

NAME

       dyndns - Update IP address to dynamic DNS (DDNS) provider

SYNOPSIS

           dyndns --login LOGIN --password PASSWORD \
                  --host yourhost.dyndns.org

DESCRIPTION

       A cross platform Perl client for updating dynamic DNS IP information at supported
       providers (see "--provider"). By Default this program expects www.dyndns.org provider.

       The dynamic DNS services allow mapping a dynamic IP address to a static hostname. This way
       the host can be refered by name instead of the changing IP address from the ISP's pool.
       Some DDNS providers offer a single account and a single host namefree of charge. Please
       check the information from the Providers' pages.

       Separate files are used for remembering the last IP address to prevent updating the same
       IP address again. This is necessary in order to comply guidelines of the providers where
       multiple updates of the same IP address could cause your domain to be blocked. You should
       not normally need to touch the files where the IP addresses are stored.

       If you know what you are doing and desperately need a forced update, delete the IP files
       and start program with apropriate arguments.  Without the information about previous IP
       address, program sends a new update request to the provider.

       Program has been designed to work under any version of Windows or Linux, possibly Mac OS
       included. It may not work under other Unix/BSD variants. Please see BUGS section how to
       provide details to add support for other operating systems.

       Visit the page of the provider and create an account. Write down the login name, password
       and host name you registered.

       For Windows operating systems, you need to install Perl. There are two Perl incarnatons:
       Native Windows version (Activestate Perl) and Cygwin version. The "http://www.cygwin.com/"
       is recommended as it more closely follows the original Perl environment.

OPTIONS

   Gneneral options
       --config=FILE [--config=FILE ...]
           List of configuration files to read. No command line options other than --verbose,
           --debug or --test should be appended or results are undefined. Each file must contain
           complete DDNS account configuration.

           The FILE part will go through Perl's "glob()" function, meaning that the filenames are
           expanded. Series of configuration files can be run at once e.g. within directory
           "/etc/dyndns/" by using a single option. The order of the files processed is
           alphabetical:

               --config=/etc/dyndns/*

           See section CONFIGURATION FILE for more information how to write the files.

       --host=host1 [--host=host2 ...]
           Use registered HOST(s).

       --group GROUP
           This option is only for --provider noip

           Assign IP to GROUP. Do you have many hosts that all update to the same IP address?
           Update a group instead of a many hosts.

       --login LOGIN
           DDNS account's LOGIN name.

       --mxhost MX-HOST-NAME
           This option is only for --provider dyndns

           Update account information with MX hostname. Specifies a Mail eXchanger for use with
           the host being modified. Must resolve to an static IP address, or it will be ignored.
           If you don't know DNS, don't touch this option.

           The servers you list need to be correctly configured to accept mail for your hostname,
           or this will do no good. Setting up a server as an MX without permission of the
           administrator may get them angry at you. If someone is contacted about such an
           infraction, your MX record will be removed and possibly further action taken to
           prevent it from happening again. Any mail sent to a misconfigured server listed as an
           MX may bounce, and may be lost.

       --mx-option
           This option is only for --provider dyndns

           Turn on MX option. Request that the MX in the previous parameter be set up as a
           backup. This means that mail will first attempt to deliver to your host directly, and
           will be delivered to the MX listed as a backup.

           Note regarding provider "noip":

           Update clients cannot change this value. Clients can only submit requests to the php
           script to update the A record. Changes such as MX records must be done through
           website.

       --offline
           If given, set the host to offline mode.

           "Note:" [dyndns] This feature is only available to donators. The "!donator" return
           message will appear if this is set on a non-donator host.

           This is useful if you will be going offline for an extended period of time. If someone
           else gets your old IP your users will not go to your old IP address.

       --password PASSWORD
           DDNS account's PASSWORD.

       --system {dyndns|statdns|custom}
           This option is only for --provider dyndns

           The system you wish to use for this update. "dyndns" will update a dynamic host,
           "custom" will update a MyDynDNS Custom DNS host and "statdns" will update a static
           host. The default value is "dyndns" and you cannot use other options (statdns|custom)
           unless you donate and gain access to the more advanced features.

           See the DDNS provider's pages for more information.

       --wildcard
           Turn on wildcard option. The wildcard aliases "*.yourhost.ourdomain.ext" to the same
           address as "yourhost.ourdomain.ext"

   Additional options
       -D, --daemon [WAIT-MINUTES]
           Enter daemon mode. The term "daemon" refers to a standalone processes which keep
           serving until killed. In daemon mode program enters into infinite loop where IP
           address changes are checked periodically. For each new ip address check, program waits
           for WAIT-MINUTES. Messages in this mode are reported using syslog(3); if available.

           This option is designed to be used in systems that do not provide Unix-like cron
           capabilities (e.g under Windows OS). It is better to use cron(8) and define an entry
           using crontab(5) notation to run the update in periodic intervals. This will use less
           memory when Perl is not permanently kept in memory like it would with option --daemon.

           The update to DDNS provider happens only if

               1) IP address changes
               2) or it has taken 30 days since last update.
                  (See DDNS providers' account expiration time documentation)

           The minimum sleep time is 5 minutes. Program will not allow faster wake up times(*).
           The value can be expressed in formats:

               15      Plain number, minutes
               15m     (m)inutes. Same sa above
               1h      (h)ours
               1d      (d)days

           This options is primarily for permanent Internet connection. If you have a dial-up
           connection, it is better to arrange the IP update at the same time as when the
           connection is started. In Linux this would happen during ifup(1).

           (*) Perl language is CPU intensive so any faster check would put considerable strain
           on system resources. Normally a value of 30 or 60 minutes will work fine in most
           cases. Monitor the ISP's IP rotation time to adjust the time in to use sufficiently
           long wake up times.

       --ethernet [CARD]
           In Linux system, the automatic IP detection uses program ifconfig(1). If you have
           multiple network cards, select the correct card with this option. The default device
           used for query is "eth0".

       --file PREFIX
           Prefix where to save IP information. This can be a) a absolute path name to a file b)
           directory where to save or c) directory + prefix where to save.  Make sure that files
           in this location do not get deleted. If they are deleted and you happen to update SAME
           ip twice within a short period - according to www.dyndns.org FAQ - your address may be
           blocked.

           On Windows platform all filenames must use forward slashs like "C:/somedir/to/", not
           "C:\somedir\to\".

           The PREFIX is only used as a basename for supported DDNS accounts (see --provider).
           The saved filename is constructed like this:

              PREFIX<ethernet-card>-<update-system>-<host>-<provider>.log
                                     |
                                     See option --system

           A sample filename in Linux could be something like this if PREFIX were set to
           "/var/log/dyndns/":

               /var/log/dyndns/eth0-statdns-my.dyndns.org-dyndns.log

       -f, --file-default
           Use reasonable default for saved IP file PREFIX (see --file). Under Windows, %WINDIR%
           is used. Under Linux the PREFIXes searched are

               /var/log/dyndns/     (if directory exists)
               /var/log/            (system's standard)
               $HOME/tmp or $HOME   If process is not running under root

           This options is by default activated if --file is not in use.

       --proxy HOST
           Use HOST as outgoing HTTP proxy.

       -P, --provider TYPE
           By default, program connects to "dyndns.org" to update the dynamic IP address. There
           are many free dynamic DNS providers are reported.  Supported list of TYPES in
           alphabetical order:

               hnorg       No domain name limists
                           Basic DDNS service is free (as of 2003-10-02)
                           http://hn.org/

               dyndns      No domain name limits.
                           Basic DDNS service is free (as of 2003-10-02)
                           http://www.dyndns.org/
                           See also http://members.dyndns.org/

               noip        No domain name limits.
                           Basic DDNS service is free (as of 2003-10-02)
                           http://www.no-ip.com/

           NOTE: as of 2010, the support for sites of hnorg, noip is probably non-working due to
           changes in the interfaces. Please use only dyndns at this time.

       --query
           Query current IP address and quit. Note: if you use router, you may need --urlping*
           options, otherwise the IP address returned is your subnet's DHCP IP and not the ISP's
           Internet IP.

           Output of the command is at least two string. The second string is
           "last-ip-info-not-available" if the saved ip file name is not specified.  In order to
           program to know where to look for saved IP files you need to give some --file* or
           --config option. The second string can also be "nochange" if current IP address is
           same as what was found from saved file. Examples:

               100.197.1.6 last-ip-info-not-available
               100.197.1.6 100.197.1.7
               100.197.1.6 nochange 18
                                    |
                                    How many days since last saved IP

           Note for tool developers: additional information may be provided in future. Don't rely
           on the count of the output words, but instead parse output from left to right.

       --query-ipchanged ['exitcode']
           Print message if IP has changed or not. This option can take an optional string
           argument "exitcode" which causes program to indicate changed ip address with standard
           shell status code (in bash shell that would available at variable $?):

               $ dyndns --query-ipchange exitcode --file-default \
                 --provider dyndns --host xxx.dyndns.org
               $ echo $?

               ... the status code of shell ($?) would be:

               0   true value, changed
               1   false value, error code, i.e. not changed

           Without the "exitcode" argument, the returned strings are:

                           Current IP address
                           |
               changed  35 111.222.333.444
               nochange 18
                        |
                        Days since last IP update. Based on saved IP file's
                        time stamp.

           If the last saved IP file's time stamp is too old, then even if the IP were not really
           changed, the situation is reported with word "changed". This is due to time limits the
           DDNS providers have. The account would expire unless it is updated in NN days.

           Note for tool developers: additional information may be provided in future. Don't rely
           on the count of the output words, but instead parse output from left to right.

       --query-ipfile
           Print the name of the IP file and quit.

           Note: In order for this option to work, you must supply all other options would be
           normally pass to update the DDNS account, because the Ip filename depends on these
           options. Alternatively provide option --config FILE from where all relevant
           information if read.

               --ethernet      [optional, defaults to eth0]
               --provider      [optional, defaults to dyndns]
               --system        [optional, defaults to dyndns]
               --host          required.

           Here is an example which supposed that directory "/var/log/dyndns/" already exists:

               $ dyndns --file-default --query-ipfile \
                 --provider dyndns --host xxx.dyndns.org
               /var/log/dyndns/eth0-dyndns-dyndns-xxx-dyndns.org.log

       --regexp REGEXP
           In host, which has multiple netword cards, the response can include multiple IP
           addresses. The default is to pick always the first choice, but that may not be what is
           wanted. The regexp MUST not contain capturing parentheses: if you need one, use non-
           capturing choice (?:). Refer to Perl manual page "perlre" for more information about
           non-cpaturing regular expression parentheses.

           Here is an example from Windows:

               Ethernet adapter {3C317757-AEE8-4DA7-9B68-C67B4D344103}:

                   Connection-specific DNS Suffix  . :
                   Autoconfiguration IP Address. . . : 169.254.241.150
                   Subnet Mask . . . . . . . . . . . : 255.255.0.0
                   Default Gateway . . . . . . . . . :

               Ethernet adapter Local Area Connection 3:

                   Connection-specific DNS Suffix  . : somewhere.net
                   IP Address. . . . . . . . . . . . : 193.10.221.45
                   Subnet Mask . . . . . . . . . . . : 255.255.0.0
                   Default Gateway . . . . . . . . . : 10.10.0.101

           The 193.10.221.45 is the intended dynamic IP address, not the first one.  To instruct
           searching from somewhere else in the listing, supply a regular expressions that can
           match a portion in the listing after which the IP address appears. In the above case,
           the regexp could be:

               --regexp "Connection 3:"

           In Windows, the words that follow "IP Address" are automatically expected, so you
           should not add them to the regexp.

           In FreeBSD 4.5, you may get following response:

               tun0: flags <UP,POINTOPOINT,RUNNING,MULTICAST> mtu 1492
                   inet6 fe80::250:4ff:feef:7998%tun0 prefixlen 64 scopeid 0x7
                   inet 62.214.33.49 --> 255.255.255.255 netmask 0xffffffff
                   inet 62.214.32.12 --> 255.255.255.255 netmask 0xffffffff
                   inet 62.214.35.49 --> 255.255.255.255 netmask 0xffffffff
                   inet 62.214.33.163 --> 62.214.32.1 netmask 0xff000000
                   Opened by PID 64

           The correct IP address to pick from the listing is the one, which does not contain
           netmask 0xffffffff. The picked address for above is therefore 62.214.33.163. The
           regexp that finds that line is:

               --regexp ".*0xffffffff.*?inet"
                          |            |
                          |            Search minimum match until word "inet"
                          search maximum match

           This will match all the way until the the last line with netmask 0xffffffff, after
           which shortest match ".*?" to "inet" is reached to read the number following it. The
           regexp must make sure that the next word after its match point is the wanted address.

   Cable, DSL and router options
       If you do not have direct access to world known "real" IP address, but to a subnet IP
       address, then you cannot determine your outside world IP address from your machine
       directly. See picture below:

                               router/subnet                    Internet
                              +-------------+                +-----------+
          Your PC:            |             | maps address   |           |
          connect to ISP -->  | ROUTER      | -------------> |           |
                              | 192.168.... |                | 80.1.1.1  |
          local ip says:      +-------------+                +-----------+
          192.168.xxx.xxx                                    THE REAL IP

       ASDL and cable modem and other connections may not be directly connected to Internet, but
       to a router to allow subnnetting internal hosts. This makes several computers to access
       the Internet while the ISP has offered only one visible IP address to you. The router
       makes the mapping of the local subnet IP to the world known IP address, provided by the
       ISP when the connection was established.

       You need some way to find out what is the real IP is. The simplest way is to connect to a
       some web page, which runs a reverse lookup service which can show the connecting IP
       address.

       Note: the following web web page does not exists. To find a service that is able to
       display your IP address, do a google search. Let's say, that you found a fictional service
       "http://www.example.com/showip" and somewhere in the web page it reads:

               Your IP address is: 212.111.11.10

       This is what you need. To automate the lookup from web page, you need to instruct the
       program to connect to URL page and tell how to read the ip from page by using a regular
       expression. Consult Perl's manual page "perlre" if you are unfamiliar with the regular
       expressions. For the above fictional service, the options needed would be:

           --urlping         "http://showip.org/?showit.pl"
           --urlping-regexp  "address is:\s+([\d.]+)"
                                         |  ||
                                         |  |+- Read all digits and periods
                                         |  |
                                         |  +- capturing parentheses
                                         |
                                         +- expect any number of whitespaces

       NOTE: The text to match from web page is not text/plain, but text/html, so you must look
       at the HTML page's sources to match the IP address correctly without the bold <b> tags
       etc.

       --urlping URL
           Web page where world known IP address can be read. If you find a Web server that is
           running some program, which can show your IP addres, use it. The example below
           connects to site and calls CGI program to make show the connector's IP address. Be
           polite. Making calls like this too often may cause putting blocks to your site.

               http://www.dyndns.org/cgi-bin/check_ip.cgi

           Be sure to use period of 60 minutes or more with --daemon option to not increase the
           load in the "ping" site and cause admin's to shut down the service.

       --urlping-dyndns
           Contact http://www.dyndns.org service to obtain IP address information. This is
           shorthand to more general optiopn --urlping.

       --urlping-linksys [TYPE]
           Specialized router option for Linksys products.

           This option connects to Linksys Wireless LAN 4-point router, whose page is by default
           at local network address -<http://192.168.1.1/Status.htm>. The world known IP address
           (which is provided by ISP) is parsed from that page. The product is typically
           connected to the cable or DSL modem. Refer to routing picture presented previously.

           If the default login and password has been changed, options --urlping-login and
           --urlping-password must be supplied

           For TYPE information, See <http://www.linksys.com/>. Products codes currently
           supported include:

            - BEFW11S4, Wireless Access Point Router with 4-Port Switch.
              Page: http://192.168.1.1/Status.htm
            - WRT54GL, Wireless WRT54GL Wireless-G Broadband Router.
              Page: http://192.168.1.1/Status_Router.asp

       --urlping-login LOGIN
           If "--urlping" web page requires authentication, supply user name for a secured web
           page.

       --urlping-password LOGIN
           If "--urlping" web page requires authentication, supply password for a secured web
           page.

       --urlping-regexp REGEXP
           After connecting to page with --urlping URL, the web page is examined for REGEXP. The
           regexp must catch the IP to perl match $1. Use non-capturing parenthesis to control
           the match as needed. For example this is incorrect:

               --urlping-regexp "(Address|addr:)\s+([0-9.]+)"
                                 |                 |
                                 $1                $2

           The match MUST be in "$1", so you must use non-capturing perl paentheses for the first
           one:

               --urlping-regexp "(?:Address|addr:) +([0-9.]+)"
                                  |                 |
                                  non-capturing     $1

           If this option is not given, the default value is to find first word that matches:

               ([0-9]+\.[0-9]+\.[0-9]+\.[0-9]+)

   Miscellaneous options
       --debug [LEVEL]
           Turn on debug with optional positive LEVEL. Use this if you want to know details how
           the program initiates connection or if you experience trouble contacting DDNS
           provider.

       --help
           Print help

       --help-html
           Print help in HTML format.

       --help-man
           Print help page in Unix manual page format. You want to feed this output to nroff -man
           in order to read it.

       --test [LEVEL]
           Run in test mode, do not actually update anything. LEVEL 1 allows sending HTTP ping
           options and getting answers.

       --test-driver
           This is for developer only. Run internal integrity tests.

       --test-account
           This is for developer only. Uses DYNDNS test account options. All command line values
           that set host information or provider are ignored. Refer to client page at
           http://clients.dyndns.org/devel

       --verbose
           Print informational messages.

       --version
           Print version and contact information.

EXAMPLES

       To update IP address periodically, use crontab(5) entry. The update will happen only if IP
       has changed since last time:

           0 0-23 * * * perl <absolute path>/dyndns <options>

       To check current IP address:

         dyndns --query [--urlping...]
                        |
                        Select correct option to do the "ping" for IP

       Show where the ip file is/would be stored with given connect options.  The option
       --file-default uses OS's default directory structure.

         dyndns --file-default --query-ipfile --provider dyndns \
                 --host xxx.dyndns.org

       To upate account information to DDNS provider:

         dyndns --provider dyndns --login <login> --password <pass> --host your.dyndns.org

       If your router can display a web page containing the world known IP address, you can
       instruct to "ping" it. Suppose that router is at address 192.168.1.1 and page that
       displays the world known IP is "status.html", and you have to log in to the router using
       username "foo" and password "bar":

         dyndns --urlping http://192.168.1.1/Status.html \
                --urlping-login foo                      \
                --urlping-pass  bar                      \

       If the default regexp does not find IP address from the page, supply your own match with
       option --urlping-regexp. In case of doubt, add option --debug 1 and examine the responses.
       In serious doubt, contact the maintainer (see option --version) and send the full debug
       output.

       Tip: if you run a local web server, provider "www.dyndns.org" can direct calls to it. See
       option "--wildcard" to enable `*.your.dyndns.org' domain delegation, like if it we
       accessed using `www.your.dyndns.org'.

CONFIGURATION FILE

       Instead of supplying options at command line, they can be stored to a configuration file.
       For each DDNS account and different domains, a separate configuration file must be
       created. The configuration files are read with option --config.

       The syntax of the configuration file includes comments that start with (#).  Anything
       after hash-sign is interpreted as comment. Values are set in KEY = VALUE fashion, where
       spaces are non-significant. Keys are not case sensitive, but values are.

       Below, lines marked with [default] need only be set if the default value needs to be
       changed. Lines marked with [noip] or [dyndns] apply to only those providers' DDNS
       accounts. Notice that some keys, like "host", can take multple values seprated by colons.
       On/Off options take values [1/0] respectively. All host name values below are fictional.

           # /etc/dyndns/dyndns.conf

           #  Set to "yes" to make this configuration file excluded
           #  from updates.

           disable  = no       # [default]

           ethernet = eth0     # [default]
           group    = mygourp  # Provider [noip] only.
           host     = host1.dyndns.org, host1.dyndns.org

           #   If you route mail. See dyndns.org documentation for details
           #   how to set up MX records. If you know nothing about DNS/BIND
           #   Don't even consider using this option. Misuse or broken
           #   DNS at your end will probably terminate your 'free' dyndns contract.

           mxhost   = mxhost.dyndns.org

           #   Details how to get the world known IP address, in case the standard
           #   Linux 'ifconfig' or Windows 'ipconfig' programs cannot be used. This
           #   interests mainly Cable, DSL and router owners. NOTE: You may
           #   not use all these options. E.g. [urlping-linksys4] is alternate
           #   to [urlping] etc. See documentation.

           urlping-linksys  = BEFW11S4
           urlping-login    = joe
           urlping-password = mypass

           urlping          = fictional.showip.org
           urlping-regexp   = (?:Address|addr:)\s+([0-9.]+)

           #   Where IPs are stored. Directory name or Directory name with
           #   additional file prefix. The directory part must exist. You could
           #   say 'file = /var/log/dyndns/' but that's the default.

           file     = default              # Use OS's default location

           #   The DDNS account details

           login    = mylogin
           password = mypass
           provider = dyndns               # [default]
           proxy    = myproxy.myisp.net    # set only if needed for HTTP calls

           #   Hou need this option only if you have multiple ethernet cards.
           #   After which regexp the IP number appers in ifconfig(1) listing?

           regexp   = .*0xffffffff.*?inet

           #   What account are you using? Select 'dyndns|statdns|custom'

           system   = dyndns               # Provider [dyndns] only

           #   Yes, delegate all *.mydomain.dyndns.org calls

           wildcard = 1

           # End of cnfiguration file

       See the details of all of these options from the corresponding command line option
       descriptions. E.g. option 'ethernet' in configuration file corresponds to --ethernet
       command line option. The normal configuration file for average user would only include few
       lines:

           # /etc/dyndns/myhost.dyndns.org.conf

           host             = myhost.dyndns.org
           file             = default      # Use OS's default location
           login            = mylogin
           password         = mypassword
           provider         = dyndns
           system           = dyndns       # or 'statdns'
           wildcard         = 1            # Delegate *.mydomain.dyndns.org

           # End of cnfiguration file

       TODO (write Debian daemon scripts) FIXME:

           update-rc.d dyndns start 3 4 5 6    # Debian

SUPPORT REQUESTS

       For new Operating System, provide all relevant commands, their options, examples and their
       output which answer to following questions. The items in parentheses are examples from
       Linux:

           - How is the OS detected? Send result of 'id -a', or if file/dir
             structure can be used to detect the system. In Lunux the
             existence of /boot/vmlinuz could indicate that "this is a Linux
             OS".
           - What is the command to get network information (commandlike 'ifconfig')
           - Where are the system configuration files stored (in directory /etc?)
           - Where are the log files stored (under /var/log?)

       To add support for routers that can be connected through HTTP protocol or with some other
       commands, please provide connection details and full HTTP response:

         wget -O <route-model>-dump.html http://192.168.1.0/your-network/router/page.html

TROUBLESHOOTING

       1. Turn on --debug to see exact details how the program runs and what HTTP requests are
       sent and received.

       2. Most of the <--query> options can't be used standalone. Please see documentation what
       additional options you need to supply with them.

ENVIRONMENT

       TMPDIR
           Directory of temporary files. Defaults to system temporary dir.

FILES

       Daemon startup file

           /etc/default/dyndns

       In Linux the syslog message files are:

           /etc/syslog.conf         daemon.err daemon.warning
           /var/log/daemon.log

       There is no default location where program would search for configuration files.
       Configuration files may be found in directory "/etc/dyndns/examples". It is recommended
       that the examples are modified and copied one directorory up in order to use option
       --config /etc/dyndns/*.

       If program is run with Windows Activestate Perl, the log file is stored to file
       "C:/syslog.txt".

EXIT STATUS

       Not defined.

DEPENDENCIES

       Uses standard Perl modules.

       HTTP::Headers HTTP::Request::Common LWP::UserAgent LWP::Simple Sys::Syslog

STANDARDS

       The dyndns provider's client specification is at https://www.dyndns.com/developers/specs/

BUGS AND LIMITATIONS

   Cygwin syslog
       There is no syslog daemon in Cygwin. The Cygwin POSIX emulation layer takes care about
       syslog requests. On NT and above systems it logs to the Windows's event manager, on Win9x
       and ME a file is created in the root of drive "C:". See message
       <http://cygwin.com/ml/cygwin/2002-10/msg00219.html> for more details.

       You can see the entries in W2K Start => Settings => Administrative Tools => Computer
       Management: [ System Tools / Event Viewer / Application ]

   Debugging errors
       Please use option --debug 2 and save the result. Contact maintainer if you find bugs or
       need new features.

   About providers hnorg and noip
       The program is primarily developed and maintained to support dyndns.org.  The other
       providers haven't been tested since 2003.

SEE ALSO

       syslog(3), Debian package ddclient(1)

       See other client software at http://clients.dyndns.org

AVAILABILITY

       http://freecode.com/projects/perl-dyndns

AUTHOR

       This program is free software; you can redistribute and/or modify program under the terms
       of GNU General Public license either version 2 of the License, or (at your option) any
       later version.

       The documentation may be distributed subject to the terms and conditions set forth in GNU
       General Public License v2 or later (GNU GPL); or, at your option, distributed under the
       terms of GNU Free Documentation License version 1.2 or later (GNU FDL).