Sophie

Sophie

distrib > Mageia > 4 > x86_64 > by-pkgid > a9861aac0977a468c7b077c3f480368d > files > 9

mirrorbrain-2.17.0-1.mga4.x86_64.rpm

.. _release_notes:

Release Notes/Change History
============================


Release 2.17.0 (r8289, Apr 21, 2012)
------------------------------------


New features:

* :program:`mod_mirrorbrain`: IPv6 geolocation for IPv6 clients is now enabled.
  This requires :program:`GeoIP` 1.4.8 and :program:`mod_geoip` 1.2.7 or newer (which add experimental
  support for IPv6 resolution) (`issue 106`_).

* :program:`mb update`, :program:`mb iplookup`: DNS resolution now works with IPv4 + IPv6.

* Support for Metalink/HTTP (:rfc:`6249`) has been implemented (`issue 15`_). This
  was long on my todo list! This makes MirrorBrain include in its server HTTP
  responses useful metadata like cryptohashes, mirror URLs and links to
  alternate representations. There's support for :rfc:`5988` Web Linking, for :rfc:`6249`
  Metalink/HTTP: Mirrors and Hashes, and for :rfc:`3230` HTTP Instance
  Digests (including updates from :rfc:`5843`). Here's an `example (screenshot)`_.

* :program:`mb edit`: An editor set via the environmental variable ``$VISUAL``
  is now used, if none is set in ``$EDITOR``. This fixed `issue 96`_.

* :program:`mb db vacuum`: A new option ``-q`` allows to silence the commands
  output (`issue 99`_).

New platforms:

* Ubuntu 11.10 packages are now built and tested.

* Debian 6.0 packages have been tested.


Bug fixes:

* :program:`mb makehashes`: A problem was fixed with filenames containing
  characters that could be interpreted as magic characters in regular
  expressions (`issue 94`_) Thanks, KDE sysadmins, for your help!
 
* :program:`mirrorprobe`: Incomplete responses returned by mirrors (less
  bytes sent than announced) spawned an annoying error message. Now this error
  is just logged, as it should.

* :program:`mb scan`: A typo has been fixed (patch by Oliver Beattie)

Internally, a way to migrate the database after updates has been implemented. A
table named ``version`` keeps info about the state of the database. Thus,
database schema upgrades can happen automatically when possible. This release
adds a new flag to the database called ``ipv6_only`` to denote mirrors that are
not reachable by IPv4. Once this new flag is used, it will allow to redirect
clients to this type of mirrors. (And IPv6-only mirrors won't go away -- rather
the contrary :-)

.. _`example (screenshot)`: http://mirrorbrain.org/static/images/screenshots/metalink_http.png
.. _`issue 15`: http://mirrorbrain.org/issues/issue15
.. _`issue 94`: http://mirrorbrain.org/issues/issue94
.. _`issue 96`: http://mirrorbrain.org/issues/issue96
.. _`issue 99`: http://mirrorbrain.org/issues/issue99
.. _`issue 102`: http://mirrorbrain.org/issues/issue102
.. _`issue 106`: http://mirrorbrain.org/issues/issue106



Release 2.16.1 (r8261, Mar 25, 2012)
------------------------------------


Bugs fixed:

* :program:`mb makehashes`: It didn't work with PGP signature files that were
  not detached signatures. Non-detached (attached) signatures are now ignored
  because they could be very large (file size of the original file plus
  signature) (`issue 102`_). Thanks to Tom Albers for his help here.



* :program:`mb makehashes`: It no longer writes metalink data / cryptohashes
  into files. All hashes are stored in the database since 2.13.0. The obsolete
  storage in files had been kept only for backwards compatibility with 2.12 and
  earlier. (Which are outdated since ~18 months now. So let's avoid confusion.)


* :program:`mod_mirrorbrain`:
  Reworked error handling regarding the acquisition of database connections,
  including more detailed logging of errors. This fixes a crash that affected
  only setups with ``MirrorBrainFallback`` configuration. The crash could occur
  when no database connection was available -- because the logging code wrongly
  tried to log details about the (unavailable) connection.

New features:

* :program:`mb mirrorlist`: Path names can now contain wildcards. (Edited via
  :program:`mb markers -e`). Very nice improvement, thanks to idea and patch
  from Stephan Jauernick.


* There is a little new tool: :program:`tools/push2mirrors`, an example script to
  run rsync processes in parallel to push content to mirrors.

.. _`issue 102`: http://mirrorbrain.org/issues/issue102



Release 2.16.0 (r8251, Feb 21, 2012)
------------------------------------

This release sums up small fixes that piled up slowly, over a good
year.

*URL signing* is no longer regarded experimental. See
:ref:`configuring_url_signatures` for more information on this interesting
feature.

:program:`mb dirs`: A new option was added to list all mirrors which don't have
a specified directory: ``mb dirs --missing DIR`` 

The following bugs were fixed:

* :program:`mod_mirrorbrain`: The server could crash if there was configuration for fallback mirrors in
  place and acquisition of a database connection failed.  This has been fixed
  (`issue 84`_).

* :program:`mb scan`:

  - If some directories on a mirror return 404, the scanner crashed. This
    is fixed with a patch kindly contributed by Thorsten Behrens.
  - As adjunct to r8180 (terse logging), logging messages in the large file check
    have been silenced (and their formatting improved, while at it) 

* :program:`mb`: A compatibility issue in Python has been fixed, by updating the way how
  exceptions are raised. Thanks to Christian Lohmaier for bringing this up.

* :program:`mb makehashes`: Handling of non-availability of SHA256 cipher was
  fixed for old Python versions (`issue 85`_).

  
In the documentation, the section about :ref:`configuring_url_signatures` has
been added, and a general build problem has been documented: On some newer
platforms, there is a need for linking the math library (as in ``-lm``).


.. _`issue 84`: http://mirrorbrain.org/issues/issue84
.. _`issue 85`: http://mirrorbrain.org/issues/issue85



Release 2.15.0 (r8232, Nov 13, 2010)
------------------------------------

This release comes with a new feature useful for RPM-based Linux distributions:
generation of `Yum`_ mirror lists. Another new feature is that `nginx`_
directory indexes can be scanned. In addition, there are several bug fixes and
improvements, and new documentation on tuning your database server for optimal
performance.


**Yum-style mirror list support** is configured with a new Apache configuration
directive which creates a mapping of Yum's query arguments to directories in
the file tree.  Please refer to the complete instructions in
:ref:`yum_style_lists`.

To make this possible, the main handler function in :program:`mod_mirrorbrain`
is now run before all other configured handlers from other modules, not as the
very last one. This means we can run before :program:`mod_autoindex`, which
would otherwise handle a request on a directory, despite the presence of query
arguments requesting a yum mirror list. It also means that we run before
:program:`mod_php` (most modules' handlers run as middle hook and therefore not
in strictly defined order).

A small bugfix is that, for generated torrent files, hashes from the database
were retrieved twice from the database. This has been fixed.


The mirror scanner (:program:`mb scan`) underwent the following small
improvements, other than implementing support for **scanning Nginx
directories**:

- When scanning only a subdirectory, the calculation of added/removed files was
  wrong. (It functinally did the right thing, but the logging was wrong.)
- The pre-scanning check for existance of a subdirectory is now skipped, when
  scanning only a single mirror. 
- The messages logged when encoungering unparseable HTML index when scanning
  over HTTP have been improved.
- Logging messages about directories "not in top_include_list" have been
  silenced (but can be brought up again by increasing verbosity).
- Displaying of file sizes > 4GB when scanning over rsync has been fixed
  (a finding from `issue 8`_).



In :program:`mb makehashes`, `issue 72`_ has been fixed: If specified path
names contain duplicated slashes, these were introduced as wrong filenames into
the database.


The documentation on :ref:`tuning_postgresql` has been extensively reworked and
gives a complete set of instructions now. 


.. _`Yum`: http://en.wikipedia.org/wiki/Yellowdog_Updater,_Modified
.. _`nginx`: http://nginx.org/
.. _`issue 8`: http://mirrorbrain.org/issues/issue8
.. _`issue 72`: http://mirrorbrain.org/issues/issue72



Release 2.14.0 (r8210, Nov 6, 2010)
-----------------------------------

This release brings a number of new features, and also some bug fixes.


- On the precondition that the "GeoLite City" GeoIP database is used,
  MirrorBrain now uses geographical distance as additional criterion in mirror
  selection. This is useful in
  
    1) large countries (like the US), and probably any countries with many
       mirrors 
    
    2) countries without mirrors, where only a random mirror from the continent
       could be selected otherwise. (Defining fallback mirrors for such
       countries worked before, and still has precedence.) 
  
  This implements `issue 34`_. To take advantage of this feature, the free
  `GeoLite City <http://www.maxmind.com/app/geolitecity>`_ GeoIP database needs
  to be used.  See the `2.14.0 upgrade notes`_ for instructions.

- Per-file mirror lists have been improved by showing data in a better readable
  way, and by embedding a link to a Google map visualizing the 9 closest mirrors.

- When running behind a load balancer or other reverse proxy, prefix detection
  (for containment in network prefixes of mirrors) did not work because
  mod_mirrorbrain only saw the connecting IP address, and didn't look at an
  address passed via HTTP headers from the proxy. This has been fixed. (AS,
  country and continent comparisons already did this.)

- Experimental support for restricted downloads has been implemented, by
  redirecting to temporary URLs whose validity can be verified by the
  mirrors. See
  http://www.mail-archive.com/mirrorbrain@mirrorbrain.org/msg00011.html This a
  prototype implementation that might still be changed, hence the new Apache
  config directive is called ``MirrorBrainRedirectStampKey_EXPERIMENTAL`` at
  the moment.

- MirrorBrain did not accept requests when access was restricted with
  authentication (e.g.  Basic Authentication), due to a broken check which
  simply needed to be removed. (A bit of code inherited from mod_offload, and
  likely still dating back to old Apache 1.3 API.)

- MirrorBrain has been tested (successfully) against the latest
  :program:`zsync` release (0.6.2) and the documentation updated. 

- Minor optimizations and code cleanups have been done.

Please read the `2.14.0 upgrade notes`_ before upgrading!

.. _`2.14.0 upgrade notes`: http://mirrorbrain.org/docs/upgrading/#to-2-14-0
.. _`issue 34`: http://mirrorbrain.org/issues/issue34


Release 2.13.4 (r8188, Oct 19, 2010)
------------------------------------

This is a maintenance release with improvements in the mirror scan reporting,
and small fixes and improved usability. In addition the documentation were
enhanced and added to in some places.

Noteworthy are the added instructions on setting up automatic GeoIP database
updates (see below).


* :program:`mb scan`:

  - The output of the scanner has been improved, by introducing a
    ``-q|--quiet`` option. Used once, only a summary line per scanned mirror
    will be shown. Used twice, no output will be produced except errors.
  - When a scan via rsync ran into a timeout, the name of the affected
    mirror was not reported. The error message was only "rsync timeout", and
    while there normally were other messages giving a hint, output is now
    improved to include the mirror identifier.
  - When enabling a mirror after successful scanning, the scanner now makes
    sure that the mirror is not only marked "enabled" but also marked being
    "online". Mirrors are normally marked online by the mirrorprobe (which is
    typically run once per minute), but it is much more logical when a mirror
    is really directly available after scanning with ``--enable``.

* :program:`mb scan` and :program:`mirrorprobe`:

  - There was a case of a quirky web server software that ignores requests
    without Accept header. The mirrorprobe and the scanner now send an Accept
    header with value '*/*', because sending this header in general should not
    harm.

* :program:`geoip-lite-update`:

  - This script now works on Ubuntu. It no longer relies on a command named
    :program:`ftp` being capable of doing HTTP downloads, and prefers
    :program:`curl` or :program:`wget` if available.
  - The script is quiet now, producing no output if no error is encountered.

Documentation improvements:

- The logging configuration example has been updated (See
  :ref:`initial_configuration_logging_setup`)
- The instructions to update the GeoIP databases on Ubuntu have been updated.
  (See :ref:`installation_ubuntu_debian`)
- Documentation (for all platforms) about setting up automatic updates of the
  GeoIP database was blatantly missing.
- A possibly disturbing '-' in front of cron examples has been removed, which
  work with Vixie cron but not with Anacron as used by Ubuntu.
- Ubuntu install docs for 10.04 have been updated.
- The example for using the :program:`geoiplookup_continent` tool now shows how
  to specify the path to a GeoIP database.


Release 2.13.3 (r8166, Sep 26, 2010)
------------------------------------

This is a release that fixes two important bugs in the Metalink generator. In
addition, it includes a number of compatibility fixes for Torrents.

* :program:`mod_mirrorbrain`:

  - The Magnet links embedded in Metalinks could cause the Metalink client
    :program:`aria2c` to wait a long time on P2P connections, and not try the
    listed mirrors anymore (`issue 73`_). These links are no longer included at
    the moment, unless ``MirrorBrainMetalinkMagnetLinks On`` is set in the
    Apache configuration.
  - Under the conditions that 

    + an ``Accept`` header with ``application/metalink+xml`` or ``metalink4+xml`` is sent,
    + and the request goes to a path that doesn't exist, 
    + but some extension (``.foo``) could be split off, 
    + and a corresponding path without extension exists, 
      
    mod_mirrorbrain delivered the file matching the path with the extension
    split off, instead of replying with a ``404 Not found``. This affected
    :program:`aria2c` when it requested non-existing files. The bug was found
    and fixed by Michael Schröder and closes `issue 75`_.
  - When generating Torrents, the order of keys was not obeyed, which should be
    lexicographical. This is now the case, so the Torrents should be valid also
    for clients that insist on correct ordering. This should improve the
    compatibility to some clients, notably :program:`rtorrent`. Tracked in
    `issue 74`_ and `issue 78`_.
  - The MD5 sum in Torrent info hashes was wrongly sent in binary form, instead
    of being hex-encoded. In addition, the key was wrongly named ``md5`` while
    ``md5sum`` is the correct name. Fixing `issue 77`_.
  - Not a bugfix, but a hopefully useful addition is that Torrents now contain
    a "created by" key, indicating the generator of the torrent, and the
    version number (e.g. ``MirrorBrain/2.13.3``). Suggested in `issue 65`_.
  
Please read the `2.13.3 upgrade notes`_ before upgrading.

Thanks for all kind help and contribution!

.. _`issue 65`: http://mirrorbrain.org/issues/issue65
.. _`issue 73`: http://mirrorbrain.org/issues/issue73
.. _`issue 74`: http://mirrorbrain.org/issues/issue74
.. _`issue 75`: http://mirrorbrain.org/issues/issue75
.. _`issue 77`: http://mirrorbrain.org/issues/issue77
.. _`issue 78`: http://mirrorbrain.org/issues/issue78
.. _`2.13.3 upgrade notes`: http://mirrorbrain.org/docs/upgrading/#from-2-13-x-to-2-13-3




Release 2.13.2 (r8153, Sep 19, 2010)
------------------------------------

This release adds worthwhile new features to the mirror list generator that
you will enjoy:

* :program:`mod_mirrorbrain`:

  - The content of the mirror lists (details pages) are now wrapped into a
    XHTML/HTML ``DIV`` container with ``id="mirrorbrain-details"``. This
    improves the possibilities for styling in conjunction with a stylesheet
    linked in via the ``MirrorBrainMirrorlistStyleSheet`` directive (`issue
    63`_).

  - Further individual design can now be achieved by specifying the XHTML/HTML
    header and footer which are placed around the page body instead of the
    built-in XHTML (`issue 63`_). This is configured with two new Apache
    configuration directives.

    This is documented here: :ref:`styling_details_pages`.

  - Hashes can now be requested without a filename being included in the
    response, to simplify parsing (`issue 68`_). This is done by sending the
    query string ``only_hash``. This works with different ways to request a
    hash::

      http://host.example.com/foo.md5?only_hash 
      http://host.example.com/foo?md5&only_hash

    Instead of ``99eaed37390ba0571f8d285829ff63fc  du.list``, the server will
    just return ``99eaed37390ba0571f8d285829ff63fc``.

  - The filename in hashes can also be suppressed site-wide (and therewith, on
    the server side) with a new Apache config directive
    ``MirrorBrainHashesSuppressFilenames On``. It goes into virtualhost context.

  - When sending out a hash to a client (as requested by appending e.g.
    ``.md5``), there is now a *double* space between hash and filename -- just
    like as the familiar tools like :program:`md5sum` and :program:`sha1sum` do
    it. This should avoid confusion and extra effort in parsing.

  - The mirror list's content type header now comes with UTF-8 as character
    set, instead of ISO-8859-1, which should make more sense.

* :program:`mb export --format=mirmon`:

  - Exporting a mirror list for `mirmon
    <http://people.cs.uu.nl/henkp/mirmon/>`_ has been adjusted to the default
    in mirmon-2.3 of its option ``list_style=plain``. The other format
    (``list_style=apache``) can also be generated, if mb export is used with
    ``--format=mirmon-apache``. This fixes `issue 62`_.

    The documentation :ref:`export_mirmon` has been updated to reflect this.


.. _`issue 62`: http://mirrorbrain.org/issues/issue62
.. _`issue 63`: http://mirrorbrain.org/issues/issue63
.. _`issue 68`: http://mirrorbrain.org/issues/issue68


Release 2.13.1 (r8136, Sep 18, 2010)
------------------------------------

This is a minor release, adding some improvements and fixing a bug that sneaked
into the last release.

* :program:`mb edit`:

  - A problem was fixed that made it impossible to remove an URL by setting it
    to an empty string. The fix for `issue 30`_ was the culprit. This was a
    regression that came with the last release (2.13.0).

* :program:`mb list/edit/show/...`: 

  - In some situations, the fuzzy-matching on mirror identifiers made it
    impossible to select certain mirrors. Phillip Smith reported this
    issue and submitted a clever patch, which retains the convenient
    behaviour, but also allows for selection mirrors by their full name. 
    This fixes `issue 61`_.
  
* :program:`mb scan`:

  - Scanning lighttpd web servers is now supported. Thanks to patch contributed
    by Phillip Smith. This fixes `issue 60`_.


* Changes regarding packaging:

  - Thanks to the work of Phillip Smith, there are now packages for Arch Linux
    and the ArchServer distribution.

  - On Debian and Ubuntu, the mirrorbrain user and group are now automatically
    created by the package, as well as /var/log/mirrorbrain. This simplifies
    the installation procedure and fixes `issue 4`_.

  - Thanks to the help of Cory Fields, the 2.12 -> 2.13.0 upgrade now works
    seamlessly on Debian/Ubuntu. Fixing `issue 57`_.


.. _`issue 4`: http://mirrorbrain.org/issues/issue4
.. _`issue 30`: http://mirrorbrain.org/issues/issue30
.. _`issue 57`: http://mirrorbrain.org/issues/issue57
.. _`issue 60`: http://mirrorbrain.org/issues/issue60
.. _`issue 61`: http://mirrorbrain.org/issues/issue61



Release 2.13.0 (r8123, Sep 6, 2010)
-----------------------------------

This is a big release, with many new features, and lots of bugs fixed. Big
effort has also been put in to ensure a seamless upgrade. 

Please read the `2.13.0 upgrade notes`_.

New features:

* This release **fully supports IETF Metalinks**, as finalized in :rfc:`5854` early in 2010.
  The extension ``.meta4`` triggers the IETF Metalink response. An HTTP Accept
  header containing ``metalink4+xml`` also elicits this kind of response. This
  closes `issue 14`_. The old (v3) Metalinks are still supported, and
  transparent content negotiation (TCN) is supported with both variants.  

* As the cache of hashes needed to be restructured for this feature, it became
  possible to implement a number of additional features. Inclusion of **various
  metadata in the mirror lists** is supported now (`issue 41`_): 
  
  - file size and modification time
  - SHA256 hash
  - SHA1 hash
  - MD5 hashes
  - BitTorrent infohash
  - link to Metalink
  - link to Torrent
  - zsync link 
  - Magnet link (needs testing)
  - link to PGP signature (if available)

  These metadata pages resp. mirror lists can now be requested by appending
  ``.mirrorlist`` to an URL. The previous way, using a question mark
  (``&mirrorlist``) continues to be supported for backwards compatibility.

* Thus, MirrorBrain is now a feature-rich **hash/metadata server**. A so-called
  "top hash" (cryptographic hash of the complete file) can now be requested.
  Depending on the extension added to the URL, like ``.md5``, ``.sha1``, or
  ``.sha256``, the respective representation is returned. This closes `issue
  42`_.

  Like before, MirrorBrain also stores piece-wise hashes for chunks of the files.
  The chunk size is now configurable via :file:`/etc/mirrorbrain.conf`, see
  :ref:`configuring_torrent_generation`.

  All hashes are now stored in the database. (See
  :ref:`design_database_hash_store` design notes.)

  A fallback mechanism is in place to read existing hashes from disk, if the
  database doesn't have the new hashes yet (useful for the migration period).

* Even though more hashes are calculated, and hashes stored in the database,
  hashing is **twice as fast** as before, not relying the external metalink
  binary any longer. All functionality of the :program:`metalink-hasher` tool
  has been integrated into :program:`mb makehashes`, which makes sure to never
  read data from disk more than once, regardless of how many hashes are
  calculated. 

  The external tool names :program:`metalink` is no longer used, and the
  package dependency on the :program:`metalink` package is no longer there.

* MirrorBrain now has a **torrent generator embedded**. Torrents are generated in
  realtime (from hashes cached in the database). See
  :ref:`configuring_torrent_generation` for details. This resolves `issue 37`_.

* MirrorBrain now has basic **zsync support**. The `zsync distribution method
  <http://zsync.moria.org.uk/>`_ is rsync over HTTP, so to speak, and
  MirrorBrain can generate zsync files on-the-fly. MirrorBrain supports the
  simpler variant which doesn't look into compressed content. It is compatible
  to the current zsync release (0.6.1).

  See :ref:`configuring_zsync_generation` for details.

  This feature is off by default, because Apache allocates large amounts of
  memory for large rows from database; this may be worked around in the future.


* Initial support for `Magnet links <http://magnet-uri.sourceforge.net/>`_.
  This largely closes `issue 38`_, but requires further testing/finetuning. See
  :ref:`magnet_links` for documentation.

* Ubuntu 10.04 (Lucid) support! (`Issue 6`_ had to be fixed for this.)


While these are the main news, there is a number of smaller feature updates to
be listed:

* :program:`mb makehashes`:

  - This is the new tool for hashing files. It supersedes the previously used
    :program:`metalink-hasher` and the external :program:`metalink` tool.
  - :program:`metalink-hasher` is a wrapper now, for backwards compatibility,
    to avoid breaking existing setups.
  - A ``--force`` option has been added to force refreshing existing hashes.
  - The usage example with ``--base-dir`` has been improved.
  
* :program:`mb list`:

  - A new option ``-N|--number-of-files`` has been added, which displays the
    number of files that a mirror is known to have.

    To achieve this, a new stored procedure :func:`mirr_get_nfiles` has been
    implemented, which retrieves this number, given either a mirror id or its
    name. It is added automatically when migrating from previous versions, and
    made available in through the :mod:`mb.core.mirror_get_nfiles` method.
  - ``mb list <mirror identifier>`` did not work due to a missing module import
    in the Python script. This has been amended.

* :program:`mb update`:

  - This command can now also update country & region info in mirror records
    (from GeoIP). Before, it updated only the network prefix and AS number, and
    geographical coordinates. But country and region assignments occasionally
    change as well.
  - A ``--dry-run`` option has been added, to allow seeing the changes before
    applying them.
  - An ``--all`` option has been added, which updates all metadata, same as when
    giving ``-c -a -p --country --region`` all at once.
  - The command now properly takes notice of hostnames that don't resolve in the
    DNS (so further action cannot be taken).

* :program:`mb db sizes`:

  - The output of this command now includes also the size of the new hashes table.

* :program:`mb db vacuum`:

  - The database cleanup now takes into account that files in the filearr table
    might not exist on any mirror, but only locally - so they could be
    referenced in the hash table.

* :program:`mod_mirrorbrain`:

  - There is an additional logging handle which provides details about the
    request and the response. The Apache module takes note in the subprocess
    environment what the client requested and which representation of the file
    was actually sent as response. Those variables can be used for logging with
    standard Apache CustomLog configuration with e.g. ``want:%{WANT}e
    give:%{GIVE}e``.

* :program:`mod_autoindex_mb`:

  - The link "Metalink" is no longer displayed. Instead, the link "Mirrors" has
    been renamed to "Details". 


.. _`issue 6`: http://mirrorbrain.org/issues/issue6
.. _`issue 14`: http://mirrorbrain.org/issues/issue14
.. _`issue 37`: http://mirrorbrain.org/issues/issue37
.. _`issue 38`: http://mirrorbrain.org/issues/issue38
.. _`issue 41`: http://mirrorbrain.org/issues/issue41
.. _`issue 42`: http://mirrorbrain.org/issues/issue42


Bug fixes:

* :program:`mod_mirrorbrain`:

  - When a client IP's network prefix did not match a mirror's network prefix
    exactly, the assignment of the client to this mirror would fail, even
    though the client IP was (also) contained in the mirror's network prefix.
    This has been rectified by properly checking for containment of the IP,
    fixing `issue 52`_.
  - Requests with PATH_INFO were not ignored, as they should be.  The default
    behaviour of Apache is to ignore such requests, and CGI or script handler
    deviate from that. :program:`mod_mirrorbrain` now also correctly returns
    ``404 Not Found`` for such requests. This fixes `issue 18`_, as well as
    `openSUSE bug #546396
    <https://bugzilla.novell.com/show_bug.cgi?id=546396>`_ (which is not
    publicly readable).
  - When the only available mirror(s) had a limitation flag set (such as
    ``region_only``), and a metalink was transparently negotiated, an empty
    metalink would result. This is now prevented, and the file delivered
    directly instead.  Other representations (mirror lists, non-negotiated
    metalinks, torrents, hashes) are generated also if there is no mirror. This
    was tracked in `openSUSE bug #602434
    <https://bugzilla.novell.com/show_bug.cgi?id=602434>`_. The mirrorlist is
    improved when there's no mirror, and can still list all hashes, and give
    the direct download URL.
  - The module now works when the path used in the Apache <Directory> block
    contains symlinks, fixing `issue 17`_.
  - Errors from the database adapter (lower DBD layer) are now resolved to
    strings, where available.
  - Some variable types have been corrected from int to ``apr_off_t``, using
    :func:`apr_atoi64` instead of :func:`atoi`. This applies to: ``min_size``,
    ``file_maxsize``, and the database identifier of a hash row. This at least
    fixes the info message given when a file is excluded from redirection due
    to its size. The checks seemed to work nevertheless, because the
    ``min_size`` numbers were small and ``file_maxsize`` numbers large, which
    helped to get the correct result when comparing.


* :program:`mb scan`:

  - Usage of FTP authentication was fixed (with credentials encoded into the
    URL). The change done in January
    http://svn.mirrorbrain.org/viewvc/mirrorbrain/trunk/tools/scanner.pl?r1=7911&r2=7945
    was incomplete in so far that the FTP client used a wrong path now when
    cd'ing into a directory (complete URL instead of only the path component).
    This may have worked with some FTP servers, but it definitely didn't work
    with vsftpd. Thanks to Deepak Gupta for raising this issue and providing
    means to analyse it.
  - When using the scanner with ``--enable``, to enable a mirror after
    scanning, it was counter-intuitive that the redirection to the mirror was
    not immediately happening. The mirrorprobe first needs to mark the mirror
    online. The scan tool now does this right away. This issue (`issue 59`_)
    had repeatedly puzzled people.

* :program:`mb edit`:

  - Problems that occurred when copying and pasting data on the editing window
    have been fixed (reported in `issue 30`_).

* :program:`mirrorprobe`:

  - A hard-to-catch exception is now handled. If Python's socket module ran
    into a timeout while reading a chunked response, the exception would not be
    passed correctly to the upper layer, so it could not be caught by its name.
    We now wrap the entire thread into another exception, which would otherwise
    be bad practice, but is probably okay here, since we already catch all
    other exceptions. This should fix `issue 46`_.
  - In case of exceptions we run into, allow logging the affected mirror's name.
  - If an unhandled exception occurs, a note is printed.

* :program:`null-rsync`:

  - Broken links that are replaced by a directory, and point outside the tree,
    are now correctly removed in the destination tree. (A very special case.)
  - Some error messages were improved.



.. _`issue 17`: http://mirrorbrain.org/issues/issue17
.. _`issue 18`: http://mirrorbrain.org/issues/issue18
.. _`issue 30`: http://mirrorbrain.org/issues/issue30
.. _`issue 46`: http://mirrorbrain.org/issues/issue46
.. _`issue 52`: http://mirrorbrain.org/issues/issue52
.. _`issue 59`: http://mirrorbrain.org/issues/issue59

Internal changes:

* :program:`mod_mirrorbrain`:

  - Code was generally cleaned up and logging improved.
  - A hex decoder for efficient handling of binary data from PostgreSQL was added.
  - Old obsolete code has been removed, which was needed before 2009 when
    mod_geoip didn't support continent codes yet. Since then, compiling with
    GeoIP support built-in was still optionally possible, but this old code is
    now removed.
  - The code path has been cleaned up a lot for easier handling of different
    representation, like hashes that are requested.
  - The message which is logged when no hashes where found in the database has
    been enhanced.
  - The obsolete support for generation of plaintext mirror lists
    (application/mirrorlist-txt) has been removed.

* :program:`mb`:

  - Interruptions by Ctrl-C and various other signals are now properly caught.
  - The error classes have been revamped and modernized for Python 2.6.
  - The script mirrordoctor.py has been renamed to mb.py, in order to avoid
    confusion. The tool should now be installed with its own name now, and no
    further symlinking is needed upon installation. 

* :program:`mb makehashes`:

  - Hashes are also stored for files which exists only locally, and not on any
    mirror (and which weren't present in the ``filearr`` table yet, therefore).
    The cleanup mechanism had to be reworked to take this into account.



Documentations improvements:

* The installation docs have been restructured: Now there's a new section
  explaining the :ref:`initial_configuration`, and this part is linked from all
  platform-specific sections as "next step" at their end. This should avoid
  some confusion. Hand in hand with this change, a cleanup of things scattered
  in all places is in progress.

* A few hints about :ref:`tuning_postgresql` were added to the :ref:`tuning`.

* :ref:`initial_configuration_logging_setup` is described in more detail.
 
* Notes about the necessity of :ref:`initial_configuration_file_tree` have been
  added, and alternatives explained.

* Reasons why or why not to use `mod_asn <http://mirrorbrain.org/mod_asn/>`_
  are discussed in :ref:`installing_mod_asn`. 
 
* Installing from Debian packages: There is now a note about expired keys, and
  how to renew them.

* The obsolete MySQL database schema has been removed, which could
  theoretically be useful for people aiming to run only mod_mirrorbrain, but
  not the rest of the framework - but is confusing and may cause people assume
  that MySQL is supported as backend.


Other improvements:

* :program:`rsyncinfo`:

  `This script
  <http://svn.mirrorbrain.org/viewvc/mirrorbrain/trunk/tools/rsyncinfo?view=markup>`_
  is easier to use now. Instead of the arkward syntax it now also takes simple
  rsync URLs. Before::

    rsyncinfo size gd.tuwien.ac.at -m openoffice

  Now::

    rsyncinfo size gd.tuwien.ac.at::openoffice
    rsyncinfo size rsync://gd.tuwien.ac.at/openoffice

* :program:`bdecode`:

  A new tool `bdecode
  <http://svn.mirrorbrain.org/viewvc/mirrorbrain/trunk/tools/bdecode?view=markup>`_
  to parse a Torrent file (or other BEncoded input), and pretty-print it.
  Useful mainly to work on the Torrent generator in mod_mirrorbrain, but also
  to compare the generated torrents with torrents that you get from other
  generators. The tool can take an argument, or read from standard input:: 
    
    bdecode foo.torrent
    curl -s <url> | bdecode


Please read the `2.13.0 upgrade notes`_ before upgrading.


Thanks for all the help!

.. _`2.13.0 upgrade notes`: http://mirrorbrain.org/docs/upgrading/#from-2-12-x-to-2-13-0




Release 2.12.0 (r7957, Feb 10, 2010)
------------------------------------

This release contains several important bug fixes, a new feature,
and documentation fixes.

The new feature is that geographical coordinates of mirrors are stored. This
affects newly created mirrors, as well as mirrors whose metadata is updated
with :program:`mb update -c`. The data are obtained from the GeoIP database, if
available. Note that only the `GeoIP city (lite)`_ database contains this kind of
data. The coordinates aren't used for anything yet, but it's easily possible
now to display mirrors on a map, or to use them to aid mirror selection (which
seems helpful in some cases; see `issue 34`_ for a proposal).

.. _`GeoIP city (lite)`: http://www.maxmind.com/app/geolitecity


For that, :program:`mb update` got a new option ``--coordinates`` to insert (or
update) geographical coordinates in the mirror's database records. The command
can be used to add the data to existing mirrors. Just use ``mb update --coordinates --asn --prefix`` to update all mirror records with the coordinates, as well as refreshing asn and prefix data.


Bug fixes:

* :program:`mb scan`

  - If :program:`rsync` is 3.0.0 or newer, :program:`mb` now uses the
    ``--contimeout`` option in addition to ``--timeout``. This fixes `issue
    12`_, where problems during opening the connection could lead to an
    infinite hang, because that period isn't covered by rsync's ``--timeout``
    option. The additional option to configure this timeout became available
    with rsync 3.0.0.
  - Scanning with FTP authentication has been implemented (URLs in the format
    `ftp://user:pass@hostname/path`).  

* :program:`mb mirrorlist`

  - When generating mirror lists, authentication data (in the form of
    `user:password@`) is now removed from URLs. The assumption is that if URLs
    contain such data, it will almost surely be not the intention to publish them.

* :program:`mod_mirrorbrain`

  - On some platforms, :program:`mod_mirrorbrain` didn't construct proper
    filenames for the metalink hash cache. The bug was reported for Debian
    Lenny, and probably also affected some version of Ubuntu (`issue 35`_). This
    is fixed by using the APR library function :func:`apr_off_t_toa` instead of
    ``%llu`` in the format string fix. Thanks Cory for reporting and tracking
    this down!
  - When Metalinks contained FTP URLs, the URL scheme (``url type`` in the XML)
    was incorrectly set to ``http``. (`issue 23`_). This has been fixed.

* :program:`mb db shell`

  - This new command to spawn a database shell turned out to work only by
    accident -- :func:`os.execlp` was used wrongly (missing its 0th argument).
    This has been correected.

* :program:`mb file ls -u`

  - When using the ``-u`` option with this command to display URLs, broken URLs
    could result if a base URL doesn't end in a slash (`issue 36`_).
    Thanks Vittorio for reporting!

* :program:`mb new` and :program:`mb update`

  - A stupid error in the selection of the best GeoIP database has been fixed.
    A forgotten `break` in the code caused the least preferable database to be
    chosen, of more than one acceptable database file was available.
  - Geographical coordinates are saved to mirror database records.
  - The readability of DNSrr warnings is improved.
  


Since when the metalink hash cache had been reimplemented with release
2.10.0 and 2.10.1, there remained a migration path in :program:`mod_mirrorbrain`
and :program:`metalink-hasher` for reusing the existing hash files. Since this
is several versions away (or 5 months), this migration path has been cleaned
up in both :program:`mod_mirrorbrain` and :program:`metalink-hasher`.

- Backward compatibility and migration support (added around r7794) for old
  filename scheme (``.inode_$INODE``) in the metalink hash cache removed.
- Backward compatibility (added in r7787) for old filename scheme
  (``.metalink-hashes``) in the metalink hash cache removed.

When updating from an installation older than 2.10.1, that is no problem -- it
just means that metalink hashes will be regenerated before they can be used
again.

The documentation was enhanced in the following places:

* A few examples for using cURL for testing have been added.
* The example for creating metalink hashes was wrong. This was fixed, and
  some more details added.
* The usage info of :program:`mb update` was improved.
* The :program:`mb update` command has been documented
  (:ref:`editing_mirrors_network_location`).

.. _`issue 12`: http://mirrorbrain.org/issues/issue12
.. _`issue 23`: http://mirrorbrain.org/issues/issue23
.. _`issue 34`: http://mirrorbrain.org/issues/issue34
.. _`issue 35`: http://mirrorbrain.org/issues/issue35
.. _`issue 36`: http://mirrorbrain.org/issues/issue36


Release 2.11.3 (r7933, Dec 16, 2009)
------------------------------------

This release contains a number of small improvements in the toolchain, plus
small documentation fixes.

* :program:`null-rsync`:
  
  - IO errors returned by rsync are handled now 
  - remote errors from rsync are ignored now, and we let rsync continue with
    dry-run deletions.

* :program:`mb db sizes`:

  - Sizes of tables from `mod_stats`_ are now shown in addition to
    MirrorBrain's own tables.

* :program:`mb db shell`:

  - The script now uses :func:`os.execlp` instead of :func:`os.system` to spawn
    the database commandline interpreter, because the latter doesn't reliably
    pass ``SIGCONT`` to the subprocess when resuming.

* :program:`mb list`:

  - New options ``-H``, ``-F``, ``-R`` to display HTTP/FTP/rsync base URLs have
    been added.

* :program:`mb mirrorlist`:

  - The script now tries harder to not leave temp files -- also in case of a
    crash (which may happen when working with templates).
  - Add a link to our project in the footer.

Changes in the documentation were: 

- The new ``MirrorBrainFallback`` directive is now documented in the example
  :file:`mod_mirrorbrain.conf`.
- The ``-t 20`` option has been removed from the :program:`mirrorprobe` call,
  since that is the default now. The scan cronjob also has been simplified.
- A hint about ulimits has been removed, which turned out to be a band-aid
  for a purely local problem.
- A hint how to load a database dump with :program:`mb db shell` has been
  added.

.. _`mod_stats`: http://mirrorbrain.org/download-statistics/


Release 2.11.2 (r7917, Dec 5, 2009)
-----------------------------------

This release improves scanning via FTP and adds a few small features:

* :program:`mb scan`:

  - When scanning via FTP, filenames containing whitespace would not be
    recognized. The regular expression that parses the FTP directory listing
    has been extended. In addition, a warning is now printed when a line can't
    be parsed. This hopefully fixes `issue 31`_. 
  - when using the FTP protocol for probing for a file or directory, the wrong
    use of a variable let the result always be negative. This affected
    subdirectory scans (using ``mb scan -d path/to/dir``), which would igore
    some mirrors.

* :program:`mb db`:

  - new command for database maintenance tasks: 

    + :program:`mb db sizes` --- shows sizes of all relations
    + :program:`mb db shell` --- conveniently open a shell for the database 
    + :program:`mb db vacuum` --- cleans up dead references (previously: 
      :program:`mb vacuum`, which still can be used for backwards
      compatibility.) 

* :program:`mirrorprobe`:

  - 60 seconds as timeout have always been a bit long. Change the default
    timeout to 20 seconds, which is also the value suggested in the
    documentation.

.. _`issue 31`: http://mirrorbrain.org/issues/issue31


Release 2.11.1 (r7899, Dec 3, 2009)
------------------------------------

This release fixes a regression in :program:`mod_mirrorbrain` that was
introduced with the 2.11.0 release. It affected Debian and Ubuntu, or more
generally all platforms where the APR (Apache Portable Runtime) is version 1.2,
not 1.3. The version detection at compile time was not working. This has been
corrected, fixing `issue 29`_. Thanks to Cory Fields in tracking down this bug!

.. _`issue 29`: http://mirrorbrain.org/issues/issue29


Release 2.11.0 (r7896, Dec 2, 2009)
------------------------------------

A new feature and lots of bug fixes and minor corrections come with this
release. 

It's now possible to configure fallback mirrors, via Apache config, in the
following form::

    MirrorBrainFallback na us ftp://linuxfreedom.com/ultimate/
    MirrorBrainFallback eu de http://www.ultimate-edition.org/~ue/

Those mirrors are used when no reachable mirror is found in the database.
Thus, these mirrors get all those requests that MirrorBrain would normally
deliver itself (you know, the default fallback behaviour).

They are also used in the mirror lists (with priority 1) and metalinks, and
country/region selection is done like for normal mirrors. They are used
blindly, without knowing their file lists.

This actually allows to run a MirrorBrain instance with a pseudo file tree
(cf.  recently added :program:`null-rsync` script.) 

A "degraded mode" that continues to work in case of database complete outages
is easily achievable now, however for now the code path is less robust in
that regard (*if* fallback mirrors are configured. Otherwise, it shouldn't).
This should be fixed later.

This new feature is still its infancy, but ready to be tested. It may be
subject to refinement, based on future discussion.
  
* Other changes in :program:`mod_mirrorbrain` are:

  - The module now automatically makes sure at compile time that its usage of
    the DBD database API fits to the APR (Apache Portable Runtime) version. The
    issue was that the semantics of reading result rows was with APR 1.3. With
    older APR, different semantics need to be used, which hits Debian and
    Ubuntu. This fixes `issue 7`_.

  - The ``MirrorBrainHandleDirectoryIndexLocally`` directive has been removed.
    It was never actually useful, because we never did (and could) redirect to
    directory listings.  For one, a listing might not be available at each URL
    that we might redirect to.  What's more, since the database only stores
    file paths and not directories, we can't actually look up directories.
    Thus, the directive is now removed, and a warning issued where it is still
    found in the config.

  - The default of ``MirrorBrainHandleHEADRequestLocally`` has been changed to
    ``Off``, and it has been made clearer (in the Apache-internal help text)
    what the default is. This change mainly has the effect that the directive
    does *not* need to be given anymore, in most scenarios.
  - The default setting of the ``MirrorBrainMinSize`` directive has been
    documented in its help text.

* The documentation for installation on Debian Lenny was tested and corrected
  where needed. Thanks, TheUni! Minor issues in the Debian packages have been
  improved, to further simplify the installation. Ubuntu benefits from this as
  well.

* :program:`mb`

  - Parse errors in the configuration file are not caught and and reported
    nicely.
  - Special characters occurring in the password are escaped before passing
    them to SQLObject/psycopg2, thus fixing `issue 27`_. A remaining issue is
    that double quotes can't be used; a warning is issued if it's attempted.

* :program:`mb scan`:

  - A warning that appeared since the last release has been removed. It was
    caused by the removal of obsolete code, and purely cosmetic.

* :program:`null-rsync`

  - An ``--exclude`` commandline option has been implemented, to be passed
    through to :program:`rsync`. 
  - Control over the program output can now be exerted by the two new options
    ``--quiet`` and ``--verbose``.
  - Usage info is implemented (``--help`` etc.).
  - Interruptions by :kbd:`Ctrl-C` and similar signals are intercepted now.

* :program:`metalink-hasher`

  - When comparing the modification time of a saved metalink hash with that of a
    source file, the sub(sub-)second portion of the value could be different
    from the value that has just been set by :func:`os.utime`. (Quite
    surprisingly.) So now, we compare only the :func:`int` portion of the
    value. This fixed `issue 24`_.

.. _`issue 7`: http://mirrorbrain.org/issues/issue7
.. _`issue 24`: http://mirrorbrain.org/issues/issue24
.. _`issue 27`: http://mirrorbrain.org/issues/issue27


Release 2.10.3 (r7871, Nov 28, 2009)
------------------------------------

This release adds a new script, which hopefully opens up interesting new use
cases, called :program:`null-rsync`. This is a special rsync wrapper which
creates a local file tree from a mirror, where all files contain only zeroes
instead of real data. The files are created as *sparse files*, so only the
metadata occupies actual space in the filesystem. Modification times and sizes
are fully copied, so that even (native) rsync thinks that the file tree is
identical. 

This script should allow to create a pseudo mirror of arbitrary size (or
several mirrors), in order to host MirrorBrain instances which run under the
precondition that they *always* redirects. (This scenario hasn't tested yet,
but should work.) At any rate, it is a good basis for experimentation.

Then, this release fixes some usability issues in the :program:`mb` tool:

* :program:`mb new`:

  - when creating a new mirror, and detecting that the hostname resolved to
    multiple addresses (round-robin DNS), a warning about this fact was issued.
    Now, (short of documentaion in the manual) a reference to
    http://mirrorbrain.org/archive/mirrorbrain/0042.html is added, where the
    issue has been discussed in depth.
  - A proper error message is now shown if an identifier is chosen that already
    exists.

* :program:`mb mirrorlist` / :program:`mb marker`:

  - The order in which mirrorlist columns are presented is now kept unchanged,
    so it appears as it was entered into the database.
  - The sort order of mirrorlist entries has been improved. Instead of the
    priority, the mirror operator name is now given precendence in order, which
    results in a mirror list that actually *looks* sorted.


Release 2.10.2 (r7853, Nov 9, 2009)
-----------------------------------

Some non-code changes that should be mentioned:

* The documentation was updated in various places. Notably, there are now
  instructions for :ref:`installation_ubuntu_debian`, which David Farning
  deserves credits for.

* Ubuntu (and Debian) packages have been created. The Ubuntu packages have been
  tested successfully. (See download page.)

* A bug tracking system has been set up: http://mirrorbrain.org/issues/

In the code, the following bugs were fixed:

* The :program:`mirrorprobe` could crash when the sender domain of a
  configured mail log handler wasn't resolvable (`issue #9`_). This has been
  fixed.

* When scanning a subdirectory, the mirror scanner (:program:`mb scan`) could
  accidentally delete files from the database outside of that directory. This
  was caused by lack of terminatation (with a slash) of the path expression
  that is used to grab the list of known files before the scan. Herewith
  fixing `issue #19`_.

* A misleading error message in the :program:`mb` tool was improved, which
  was issued when encountering config file with missing sections.


.. _`issue #9`: http://mirrorbrain.org/issues/issue9
.. _`issue #19`: http://mirrorbrain.org/issues/issue19

Release 2.10.1 (r7798, Sep 9, 2009)
-----------------------------------

* The implementation of the hash cache created by the
  :program:`metalink-hasher` tool has been revised again. The reason is that
  some filesystems (at least the VirtualBox Shared Folder) don't implement
  stable inode numbers. Instead of the inode number, now the file size (plus
  filename and modification time) is used to identify file hashes. (These are
  the same criteria that rsync uses, by the way.)

  Existing hashes are migrated, so that the files don't need to be hashed again
  (which could potentially be time-consuming).
  
  The modification time of files is now copied to the hash file, so it is
  available for comparison when checking if a hash file is up to date.

  :program:`mod_mirrorbrain` has been adapted for the new cache scheme.
  Also, it is now required that the modification time of the hash file matches
  the modification time of the file. (For backwards compability, the module
  still also checks for files matching the old scheme.)
  
  To ease the migration, and since it doesn't matter otherwise, non-existance
  of files to be unlinked is ignored now. This occurs for instance in the above
  mentioned migration scenario, where the hash files are renamed to a different
  name.
  

* New features in the :program:`metalink-hasher` tool:

  - Per-directory locking was implemented: directories where already a job is
    running will be skipped. This allows for hassle-free parallel runs of more
    than one job. 
  
    Note that simultaneous spawning of the script still needs to be controlled,
    to avoid consuming too much I/O or CPU bandwidth for a machine. 

  - Ctrl-C key presses and common interrupting signals are now handled
    properly.



Release 2.10.0 (r7789, Sep 4, 2009)
-----------------------------------

* The cache of metalink hashes, as created by the :program:`metalink-hasher`,
  was changed to more reliably detect changes in the origin files. So far, the
  file modification time was the criterion to invalidate cached hashes. When
  files were replaced with *older* versions (version with smaller mtime), this
  wasn't detected, and a cached hash would not be correctly invalidated.
  https://bugzilla.novell.com/536495 reports this of being an issue.
  
  To fix this, the cache now also uses the file inode as criterion.

  :program:`mod_mirrorbrain` was updated to use the new inode-wise metalink
  hashes. At the same time, it still knows how to use the previous scheme as
  fallback. If the new-style hash isn't found, it looks for the old-style hash
  file.
  
  Thus, the transition should be seamless, and no special steps should be
  required when upgrading. Note however that all hashes are regenerated, which
  could take a while for large file trees, and which could lead to cron jobs
  stacking up.

* There were a number of enhancements, and small bug fixes, in the
  :program:`mb` tool (and accompanying Python module):

  - :program:`mb new`:
  
    - When adding new mirrors, the hostname part in the HTTP base URL might
      contain a port number. This is now recognized correctly, so the DNS
      lookup, GeoIP lookup and ASN lookup for the hostname string can work.
    - The commandline options ``--region-only``, ``--country-only``,
      ``--as-only``, ``--prefix-only`` were added, each setting the respective
      flag.
    - The commandline options ``--operator-name`` and ``--operator-url`` were
      added.
    - The ``--score`` option is depreciated, since it has been renamed it to
      ``--prio``.
  
  - :program:`mb scan`:
  
    - The passing of arguments to the scanner script was fixed in the case
      where the ``-j`` (``--jobs``) option was used together with mirror
      identifier specified on the commandline.

  - :program:`mb list`:

    - Command line options to display the boolean flags were added:
      ``--region-only``, ``--country-only``, ``--as-only`` and
      ``--prefix-only``.

  - :program:`mb scan` and :program:`mb file ls --probe`:

    - the lookup whether the :mod:`multiprocessing` or :mod:`processing` module
      exist was fixed: it could print a false warning that none of them was
      installed.

* The :program:`mirrorprobe` program no longer logs to the console (stderr).
  This allows for running the script without redirection its output to
  :file:`/dev/null` — which could mean swallowing important errors in the end.

  A scenario was documented where the mirrorprobe could fail on machines with
  little memory and many mirrors to check. The fix is to properly set ulimits
  to allow a large enough stack size.

  Error handling was cleaned up; more errors are handled (e.g. socket timeouts
  during response reading) and logged properly; and for exceptions yet
  unhandled, info about the mirror that caused them is printed.


Release 2.9.2 (Aug 21, 2009)
----------------------------

* Most work happened on the documentation, which includes 

  - more installation instructions, 
  - directions for upgrading, 
  - some tuning hints,
  - a quite complete walkthrough through the usage of the :program:`mb`
    commandline tool to maintain the mirror database,
  - instructions how to set up change notifications (:ref:`export_subversion`)
  - list of known problems, and these release notes.

  The documentation is in the :file:`docs` subdirectory, as well as online at
  http://mirrorbrain.org/docs/.

  Notably, there is a new section :ref:`hacking_the_docs`, which explains *how*
  to work on the docs.

* New features:

  - :program:`mb export` can now generate a `mirmon
    <http://people.cs.uu.nl/henkp/mirmon/>`_ mirror list. Thus, it is easy to
    deploy mirmon, automatically scanning the mirrors that are in the database.
    See :ref:`export_mirmon` for usage info.
  - In :program:`mod_autoindex_mb`, displaying the "Mirrors" and "Metalink"
    links was implemented for configurations with Apache's ``IndexOptions
    HTMLTable`` configured.

* Two minor bugs were fixed:

  - Missing slash added in :program:`mod_autoindex_mb` to terminate the XHTML
    ``br`` element in the footer.
  - The scanner now ignores rsync temp directories (:file:`.~tmp~`) also when
    they occur at the top level of the tree, and not below.


Release 2.9.1 (Jul 30, 2009)
----------------------------

* :program:`mb new`

  - Now an understandable error message is printed when the
    geoiplookup_continent couldn't be executed. Thanks to Daniel Dawidow for
    providing helpful information to track this down.

* :program:`mod_mirrorbrain`

  - Under unusual circumstances it may happen that mod_mirrorbrain can't
    retrieve a prepared SQL statement. This occurs when an identical database
    connection string is being used in different virtual hosts. To ease
    tracking down this special case, the module now logs additional information
    that could be useful for debugging. Also, it logs a hint noting that
    connection strings defined with DBDParams must be unique, and identical
    strings cannot be used in two virtual hosts.

* The :program:`mod_mirrorbrain` example configuration files were updated to
  reflect several recent (or not so recent) changes:

  - the switch to PostgreSQL
  - the now disabled memcache support
  - the updated GeoIP database path (/var/lib/GeoIP instead of /usr/share/GeoIP)


Release 2.9.0 (Jul 28, 2009)
----------------------------

* A very hindering restriction in the :program:`mb` tool which made it require
  `mod_asn <http://mirrorbrain.org/mod_asn/>`_ to be installed alongside
  MirrorBrain has been removed. MirrorBrain can now be installed without
  installing mod_asn.

* The Subversion repository was moved to 
  http://svn.mirrorbrain.org/svn/mirrorbrain/trunk/.

* rsync authentication was fixed. Credentials given in rsync URLs in the form of
  ``rsync://<username>:<password>@<host>/<module>`` now work as expected. Patch
  by Lars Vogdt.

* The documentation has been moved into a `docs subdirectory
  <http://svn.mirrorbrain.org/svn/mirrorbrain/trunk/docs/>`_, and is rewritten
  in reStructured Text format, from which HTML is be generated via Sphinx
  (http://sphinx.pocoo.org/). Whenever the documentation is changed in
  subversion, the changes automatically get online on
  http://mirrorbrain.org/docs/

* Parallelized mirror probing.  Note: for this new feature, the Python modules
  :mod:`processing` or :mod:`multiprocessing` need to be installed.  If none of them is
  found, the fallback behaviour is to probe serially, like it was done before.
  This new feature affects the :program:`mb probefile` and :program:`mb file`
  commands, and not actually the mirrorprobe, which has always ran threaded. It
  also affects the scanner (:program:`mb scan`) to speed up the checks done
  when only a subdirectory is scanned.

* Various new features were implemented in the :program:`mb` tool:

  * :program:`mb probefile`
  
    - Implemented downloading (and displaying) of content.
    - A ``--urls`` switch was added, to select the kind of URLs to be probed.
  
      - ``--urls=scan`` probes the URLs that would be used in scanning.
      - ``--urls=http`` probes the (HTTP) base URLs used in redirection.
      - ``--urls=all`` probes all registered URLs.
  
    - The usual proxy environment variables are unset before probing
      (:envvar:`http_proxy`, :envvar:`HTTP_PROXY`, :envvar:`ftp_proxy`, :envvar:`FTP_PROXY`)
    - Report the mirror identifier for FTP socket timeouts
  
  * :program:`mb scan`
  
    - Logging output was considerably improved, avoiding lots of ugly
      messages which look like real errors (and tend to cover real ones)
    - The time that a scan took is now shown. 
  
  * :program:`mb new` 

    - while looking up a mirror's location when a new mirror is added, try
      different geoip database locations (GeoIP database was moved around on
      openSUSE...).  
    - prefer the larger city lite database, if available, and prefer updated
      copies that were fetched with the :program:`geoip-lite-update` tool.

  * :program:`mb list` 

    - add ``--other-countries`` option to allow displaying the
      countries that a mirror is configured to handle in addition to its own
      country

* :program:`mod_mirrorbrain`: in the ``generator`` tag of metalinks, include
  mod_mirrorbrain's version string

* The :program:`metalink-hasher` tool has been revised to implement a number of
  lacking features:

  - Automatic removal of old hashes, which don't have a pendant in
    the file tree anymore, is implemented now.
  - A summary of deletions is printed after a run.
  - A number of things were optimized to run more efficiently on
    huge trees, mainly by eliminating all redundant :func:`stat` calls.
  - sha256 was added to the list of digests to generated.
  - The need to specify the ``-b`` (``--base-dir``) option was eliminated,
    which makes the command easier to use.
  - The order in which the tool works through the todo list of directories
    was changed to be alphabetical.
  - Using a Python :func:`set` builtin type instead of a list can speed up finding
    obsolete files in the destination directory by 10 times, for huge
    directories.
  - The program output and program help was improved generally. 
  - Various errors are caught and/or ignored, like vanishing directories and
    exceptions encountered when recursively removing ignored directories.
  - The indentation of verification containers was corrected, so it looks sane
    in the metalink in the end.
  - The version was bumped to 1.2.


* :program:`geoip-lite-update`: This tool to fetch GeoIP databases has been
  updated to use the path that's used in the openSUSE package since recently
  (:file:`/var/lib/GeoIP`), and which complies better to the Linux Filesystem
  Hierarchy Standard. It still tries the old location (:file:`/usr/share/GeoIP`) as
  well, so to continue to work in a previous setup.


* :program:`mirrorprobe`

  - A logrotate snippet was added.
  - The mirrorprobe logfile was moved to the :file:`/var/log/mirrorbrain/` directory.

* The openSUSE RPM package now creates a user and group named `mirrorbrain`
  upon installation. Also, it packages a runtime directory
  :file:`/var/run/mirrorbrain` (which is cleaned up upon booting) and a log directory
  :file:`/var/log/mirrorbrain`. Some additional Requires have been added, on the
  perl-TimeDate, metalink and libapr-util1-dbd-pgsql packages.



Release 2.8.1 (Jun 5, 2009)
---------------------------

* Python 2.6 compatibility fixes:

  - :program:`mb file ls` ``--md5`` now uses the :mod:`hashlib` module, if
    available (this fixes a DepracationWarning given by Python 2.6 when
    importing the :mod:`md5` module).
  - :program:`mb list`: The ``--as`` option had to be renamed to ``--asn``,
    because ``as`` is a reserved keyword in Python, and Python 2.6 is more strict
    about noticing this also in cases where just used as an attribute.
  - The ``b64_md5`` function was removed, which was no longer used since a while.

* :program:`mb file ls`

  - make the ``--md5`` option imply the ``--probe`` option

* :program:`mb export`

  - when exporting metadata for import into a VCS (version control system),
    handle additions and deletions

* The docs were updated to point to new RPM packages in the openSUSE build service (in
  a repository named `Apache:MirrorBrain <http://download.opensuse.org/repositories/Apache:/MirrorBrain/>`_).
  The formerly monolithic package has been split up into subpackages.

* perl-Config-IniFiles was added to the list of perl packages required by the
  scanner (:program:`mb scan`)


Release 2.8 (Mar 31, 2009)
--------------------------

* Improvements in the scanner, mainly with regard to the definition of
  patterns for files (and directories) that are to be included from scanning.
  Old, hardcoded stuff from the scanner has been removed. Now, excludes can be
  defined in :file:`/etc/mirrorbrain.conf` by the ``scan_exclude`` and
  ``scan_exclude_rsync`` directives. 
  The former takes regular expressions and is effective for FTP and HTTP scans,
  while the latter takes rsync patterns, which are passed directly to the
  remote rsync daemon.
  See http://mirrorbrain.org/archive/mirrorbrain-commits/0140.html for details.
  This can decrease the size of the database (>20% for openSUSE), and for many
  mirrors it considerably shortens the scan time.
* Fixed a bug where the scanner aborted when encountering filenames in (valid
  or invalid) UTF-8 encoding. See https://bugzilla.novell.com/show_bug.cgi?id=490009
* Improved the implementation of exclusions as well as the top-level-inclusion
  pattern, which were not correctly implemented to work in subdir scans. 
* The documentation was enhanced in some places.
* mod_autoindex_mb (which is based on mod_autoindex) was rebased on httpd-2.2.11.
* :program:`mb dirs`: new subcommand for showing directories that the database contains,
  useful to tune scan exclude patterns.
* :program:`mb export`: implement a new output format, named ``vcs``. Can be used to commit
  changes to a subversion repository and get change notifications from it. See 
  http://mirrorbrain.org/archive/mirrorbrain-commits/0152.html
* Partial deletions (for subdir scans) have been implemented.
* :program:`mb list` accept ``--country`` ``--region`` ``--prefix`` ``--as``
  ``--prio`` options to influence which details are output by it.
* :program:`mb file`: support for probing files, with optional md5 hash check of the
  downloaded content.
* The latter three changes have already been described in more detail at
  http://mirrorbrain.org/news_items/2.7_mb_toolchain_work


Release 2.7 (Mar 4, 2009)
-------------------------

* Completely reworked the file database. It is 5x faster and one third the
  size. Instead of a potentially huge relational table including timestamps (48
  bytes per row), files and associations are now in a single table, using
  smallint arrays for the mirror ids. This makes the table 5x faster and 1/3
  the size. In addition, we need only a single index on the path, which is a
  small and very fast b-tree.  This also gives us a good search, and the chance
  to do partial deletions (e.g. for a subtree).
* With this change, MySQL is no longer supported. The core, mod_mirrorbrain,
  would still work fine, but the toolchain around is quite a bit specific to
  the PostgreSQL database scheme now. If there's interest, MySQL support in the
  toolchain can be maintained as well.
* many little improvements in the toolchain were made.
* Notably, the scanner has been improved to be more efficient and give better
  output.
* mirror choice can be influenced for testing with a query parameter (``as=``),
  specifying the autonomous system number.


Release 2.6 (Feb 13, 2009)
--------------------------

* supports additional, finer mirror selection, based on network
  topological criteria, network prefix and autonomous system number, using
  `mod_asn <http://mirrorbrain.org/mod_asn/>`_ and global routing data.
* updated database schemes and toolchain -- PostgreSQL support is solid now
* work on installation documentation for both MySQL and PostgreSQL
  (the latter is recommended now, because it allows for nifty features in the
  future. The :program:`mb` tool has an :program:`mb export` subcommand now,
  perfect to migrate the database.)
* toolchain work


Release 2.5 (Feb 3, 2009)
-------------------------

* working on PostgreSQL support
* working on the INSTALL documentation
* scanner: 0.22

  - more efficient SQL statement handling
  - output much improved
  - added SQL logging option for debugging

* :program:`mb` (mirrorbrain tool): 

  - bugfix in the :program:`mb file` command: make patterns work which have a
    wildcard as first character.
  - extend :program:`mb scan` to accept ``-v`` and ``--sql-debug`` and pass it
    to the scanner


Release 2.4 (Jan 23, 2009)
--------------------------

* rename :program:`mod_zrkadlo` to :program:`mod_mirrorbrain`
* use `mod_geoip <http://www.maxmind.com/app/mod_geoip>`_ for GeoIP lookups,
  instead of doing it ourselves. We can now use the GeoIP city database for instance
* handle satellite "country" called ``A2``
* auto-reenable dead mirrors
* :program:`geoiplookup_city` added, new tool to show details from GeoIP city databases
* :program:`geoip-lite-update` tool updated, with adjusted URL for GeoLite databases. It
  also downloads the city database now.
* deprecate ``clientip`` query parameter, which can no longer work
  once we use mod_geoip. Implement ``country`` parameter that can be used instead.
* make memcache support optional at compile time


Release 2.3 (Dec 13, 2008)
--------------------------

* add commandline tool to edit marker files. (Marker files are used to generate
  mirror lists. Each marker file is used to determine whether a mirror mirrors
  a certain subtree.)
* improvements and few features in the toolchain:

  - the mirrorprobe now does GET requests instead of HEAD requests.
  - :program:`mb`, the mirrorbrain tool, has a powerful :program:`mb
    probefile` command now that can check for existance of a file on all
    mirrors, probing all URLs. This is especially useful for checking whether
    the permission setup for staged content is correct on all mirrors.

* new database fields: ``public_notes``, ``operator_name``, ``operator_url``
* new database tables: ``country``, ``region``
* generate mirror lists


Release 2.2 (Nov 22, 2008)
--------------------------

* simplified database layout, with additional space save.


Release 2.1 (Nov 9, 2008)
-------------------------

* simplified the Apache configuration: It is no longer needed to configure a
  database query. At the same time it's less error-prone and avoids trouble
  if one forgets to update the query, when the database schema changes. 
* specific mirrors can be now configured to get only requests for files < n bytes


Release 2.0 (Nov 3, 2008)
-------------------------

* implement better fallback mirror selection
* add :program:`mb file` tool to list/add/rm files in the mirror database


Release 1.9 (Oct 26, 2008)
--------------------------

* add bittorrent links (to all .torrent files that are found) into metalinks
* embed PGP signatures (.asc files) into metalinks
* add configurable CSS stylesheet to mirror lists

* :program:`mod_zrkadlo`:

  - implement the redirection exceptions (file too small, mime type not allowed
    to be redirected etc) for transparently negotiated metalinks.
  - add ``Vary`` header on all transparently negotiated resources.
  - allow to use the apache module and all tools with multiple instances of the
    mirrorbrain. Now, one machine / one Apache can host multiple separate
    instances, each in a vhost.

* new, better implementation of rsyncusers tool
* bugfixes in the scanner, mainly for scanning via HTML
* installation instructions updated

* a number of small bugs in the tools were fixed and several improvements
  added.

* added "mirrordoctor", a commandline tool to maintain mirror entries in the
  database. Finally!


Release 1.8 (Jun 2, 2008)
-------------------------

* mod_zrkadlo now uses `mod_memcache <http://code.google.com/p/modmemcache/>`_ for
  the configuration and initialization of memcache
* :program:`metalink-hasher` script added, to prepare hashes for injection into
  metalink files
* :program:`rsyncusers` analysis tool added
* :program:`rsyncinfo` tool added
* scanner bugfix regarding following redirects for large file checks
* failover testbed for text mirrorlists implemented
* metalinks: switch back to :rfc:`822` format
* new ``ZrkadloMetalinkPublisher`` directive 
* fix issue with ``<size>`` element
* now there is another (more natural) way to request a metalink: by appending
  ``.metalink`` to the filename.
* change metalink negotiation to look for :mimetype:`application/metalink+xml` in the
  ``Accept`` header (keep ``Accept-Features`` for now, but it is going to be removed
  probably)


Release 1.7 (Apr 21, 2008)
--------------------------

* new terse text-based mirrorlist
* allow clients to use :rfc:`2295` Accept-Features header to select variants
  (metalink or mirrorlist-txt)
* metalink hash includes can now be out-of-tree
* :program:`mod_autoindex_mb` added
* adding a ``content-disposition`` header



Older changes
-------------

Please refer to the subversion changelog: http://svn.mirrorbrain.org/svn/mirrorbrain/trunk
respectively http://svn.mirrorbrain.org/viewvc/mirrorbrain/trunk/