noipy 2.0.0
Command line tool for DDNS IP address updating.
License: Apache License, Version 2.0
Keywords: no-ip, dyndns, duckdns, ddns, api

noipy: DDNS update tool
=======================


.. image:: https://img.shields.io/pypi/v/noipy.svg
        :target: https://pypi.python.org/pypi/noipy/

.. image:: https://img.shields.io/pypi/pyversions/noipy.svg
        :target: https://pypi.python.org/pypi/noipy

.. image:: https://snapcraft.io/noipy/badge.svg
        :target: https://snapcraft.io/noipy
        :alt: Snap Status

.. image:: https://snapcraft.io/noipy/trending.svg?name=0
        :target: https://snapcraft.io/noipy
        :alt: Snap Trending

.. image:: https://api.travis-ci.org/pv8/noipy.svg?branch=master
        :target: https://travis-ci.org/pv8/noipy

.. image:: https://codecov.io/gh/pv8/noipy/branch/master/graph/badge.svg
        :target: https://codecov.io/gh/pv8/noipy

.. image:: https://landscape.io/github/pv8/noipy/master/landscape.svg
        :target: https://landscape.io/github/pv8/noipy/master
        :alt: Code Health

.. image:: https://api.codeclimate.com/v1/badges/1f700be0ea796c8a49e9/maintainability
        :target: https://codeclimate.com/github/pv8/noipy/maintainability
        :alt: Maintainability

.. image:: https://zenodo.org/badge/doi/10.5281/zenodo.29017.svg?style=flat-square
        :target: http://dx.doi.org/10.5281/zenodo.29017

Command line tool to update DDNS hosts IP address via update API. Initially
the tool was designed to update IP address only on No-IP DDNS provider. But
now **noipy** has support for the following DDNS providers:

- `No-IP <http://www.noip.com/integrate/request>`_
- `DuckDNS <https://www.duckdns.org/install.jsp>`_
- `DynDNS <http://dyn.com/support/developers/api/perform-update/>`_


Installation
------------

Install with `pip <https://pip.pypa.io/en/stable/>`_:

.. code-block:: bash

    $ pip install noipy

Or with `Snappy <https://en.wikipedia.org/wiki/Snappy_(package_manager)>`_ on `supported distros <https://docs.snapcraft.io/core/install#support-overview>`_:

.. code-block:: bash

    $ sudo snap install noipy

**Note**: **noipy** will also install the `Requests HTTP library <https://github.com/kennethreitz/requests>`_.


Usage
-----

Basic usage of **noipy** command line tool:

.. code-block:: bash

    $ noipy -u <your username> -p <your password> -n <your hostname on DDNS provider>
            --provider {generic|noip|dyn|duck}


For `DuckDNS provider <https://www.duckdns.org>`_, the command line would look like this:

.. code-block:: bash

    $ noipy -u <your token> -n <your DuckDNS domain> --provider duck


Or you can just use ``--hostname`` (``-n``) and ``--provider`` arguments if you have
previously `stored your auth information <#storing-auth-information>`_ with ``--store`` option.

.. code-block:: bash

    $ noipy --hostname <your hostname on DDNS provider> --provider {generic|noip|dyn| duck}


You can also specify a custom DDNS URL (thanks to `@jayennis22 <https://github.com/jayennis22>`_):

.. code-block:: bash

    $ noipy --hostname <your hostname on DDNS provider> [--provider  generic]
            --url <custom DDNS URL>


It is also possible to inform an IP address other than the machine's current:

.. code-block:: bash

    $ noipy --hostname <your hostname on DDNS provider> 127.0.0.1


If ``--provider`` option is not informed, **generic** will be used as provider.


For details:

.. code-block:: bash

    $ noipy --help


Storing auth information
------------------------

With ``--store`` option it is possible to store login information. The
information is sotred in ``$HOME/.noipy/`` directory:

.. code-block:: bash

    $ noipy --store --username <your username> --password <your password> \
        --provider {generic|noip|dyn| duck}

Or simply:

.. code-block:: bash

    $ noipy --store --provider {generic|noip|dyn| duck}

And type username and password when required.

**Note:** password is stored simply encoded with
`Base64 <https://en.wikipedia.org/wiki/Base64>`_ method and is not actually
*encrypted*!

Running tests
~~~~~~~~~~~~~

Install tests dependencies (`tox <http://tox.readthedocs.org/en/latest/>`_
and `flake8 <https://flake8.readthedocs.org/>`_):

.. code-block:: bash

    $ pip install -r requirements_dev.txt


Test the code against all supported Python versions and check it against **PEP8** with ``tox``:

.. code-block:: bash

    $ tox

Check **PEP8** only:

.. code-block:: bash

    $ tox -e pep8


Copyright & License
-------------------

.. image:: https://img.shields.io/github/license/pv8/noipy.svg?style=flat-square
        :target: LICENSE
        :alt: License

Copyright (c) 2013 Pablo Vieira (pv8).


.. :changelog:

Changelog
=========

2.0.0 (2025-06-28)
------------------

- **BREAKING CHANGE**: Dropped support for Python 2.7 and Python 3.6/3.7
- **BREAKING CHANGE**: Now requires Python 3.8 or higher
- Remove Python 2/3 compatibility code (`from __future__ import print_function`, `raw_input`)
- Update dependencies to modern versions:
  - pytest: 4.6.9 → 7.4.0 (Python 3.13 compatible)
  - flake8: 3.8.4 → 6.1.0
  - tox: 3.25.0 → 4.7.0
- Add support for Python 3.10, 3.11, 3.12, 3.13
- Fix tox configuration for modern Python versions
- Remove `argparse` conditional import (built-in since Python 3.2)
- GitHub Actions workflow modernization
- Release Drafter automation for better release notes

1.5.3 (2020-02-09)
------------------

- Back to the previous response format from https://httpbin.org/ip

1.5.2 (2019-04-03)
------------------

- Handle new response from https://httpbin.org/ip

1.5.1 (2017-12-19)
------------------

- Support for Python 3.6
- Minor refactor related to code style
- Improved integration with `codeclimate <https://codeclimate.com/>`_

1.5.0 (2016-10-30)
------------------

- Automatic deploy to `PyPI <https://pypi.python.org/pypi>`_ via `Travis CI <https://docs.travis-ci.com/user/deployment/pypi/>`_
- Minor refactor
- **Dropped support for Python 3.2**

1.4.4 (2016-04-11)
------------------

- Bugfix

1.4.3 (2015-10-15)
------------------

- Included ``User-Agent`` in request Header
- Improvements on plugins test cases
- Changed code coverage service from `Coveralls <https://coveralls.io>`_ to `Codecov <https://codecov.io>`_

1.4.2 (2015-08-22)
------------------

- **Bugfix**: storing auth credentials properly from ``stdin``
- Test case for ``--store`` option getting username/password from ``stdin``

1.4.0 (2015-04-25)
------------------

- Using the awesome `Requests HTTP library <https://github.com/kennethreitz/requests>`_
- Using `tox <http://tox.readthedocs.org/en/latest/>`_ in order to ease test against multiple Python versions

1.3.1 (2014-12-19)
------------------

- Send update to DDNS only if IP address has changed

1.3.0 (2014-12-16)
------------------

- Support for custom DDNS URL via ``--url`` parameter

1.2.3 (2014-10-10)
------------------

- Unit tests improvements and ``PluginsTest`` bug fixes
- Custom config directory feature bug fix (``--config`` argument)

1.2.2 (2014-07-03)
------------------

- PEP8'd code (Closes #5)
- Switched to `Apache License, Version 2.0 <https://www.apache.org/licenses/LICENSE-2.0>`_
- Unit test improvement
- Minor feature: custom config directory via ``-c`` or ``--config`` argument.

1.2.1 (2014-06-30)
------------------

- Bug fix (execution via command line. issue #5)

1.2.0 (2014-04-21)
------------------

- Support for `DuckDNS domains update <https://www.duckdns.org/install.jsp>`_

1.1.4 (2013-08-29)
------------------

- Test case improvements
- `Coveralls.io <http://coveralls.io/>`_ support

1.1.3 (2013-07-24)
------------------

- Python 3.3 compatibility

1.1.0 (2013-05-15)
------------------

- Support for `DynDNS Update API <http://dyn.com/support/developers/api/>`_
- DDNS auth info storage changed

1.0.1 (2013-05-10)
------------------

- Added flexibility to DNS updater with ``abc.ABCMeta``
- Code organization
- Manual settings file removed (auth info can be stored via command line)

0.1.0 (2013-03-22)
------------------

- Conception