    The big directory redo, to allow a read-only $I2P and split code, data, and temp directories. Most of this will only affect new installs; existing installs will continue to put everything in $I2P, except for a few things moved to the temp directory.

    New installs will put the data in ~/.i2p on Linux and %APPDATA%\I2P on Windows.

    There's also the move of the reseed code to the router, to make standalone routers bootstrappable.

    And some moving around of CSS files in preparation for the console redesign.

    And other miscellaneous stuff. All this was delayed by the network troubles that hopefully will be fixed by 0.7.5.

    ===================================

    2009-06-29 zzz
    * Big directory rework:
    Eliminate all uses of the current working directory, and
    set up multiple directories specified by absolute paths for various uses.

    Add a WorkingDir class to create a user config directory and
    migrate certain files to it for new installs.
    The directory will be $HOME/.i2p on linux and %APPDATA%\I2P on Windows,
    or as specified in the system property -Di2p.dir.config=/path/to/i2pdir
    All files except for the base install and temp files will be
    in the config directory by default.
    Temp files will be in a i2p-xxxxx subdirectory of the system temp directory
    specified by the system property java.io.tmpdir.

    Convert all file opens in the code to be relative to a specific directory,
    as specified in the context. Code and applications should never open
    files relative to the current working directory (e.g. new File("foo")).
    All files should be accessed in the appropriate context directory,
    e.g. new File(_context.getAppDir(), "foo").

    The router.config file location may be specified as a system property on the
    java command line with -Drouter.configLocation=/path/to/router.config
    All directories may be specified as properties in the router.config file.

    There will be no migration from an existing installation
    unless the system property -Di2p.dir.migrate=true is set.
    If there is no migration, it will continue to use $I2P for all files,
    except for temporary and PID files.

    The following linux scripts are now customized with the install path at,
    installation, and may be moved to /usr/local/bin and run from any
    working directory:
    eepget, i2prouter, runplain.sh

    For new installs, the i2p base directory ($I2P) may be read-only
    if updates are disabled. The only time i2p should write to the base directory
    is to unzip the update file. Updates are downloaded to the config dir. If, upon
    restart, the base dir is not writable, it will log a message and continue.

    Additional information, copied from I2PAppContext:
    * Directories. These are all set at instantiation and will not be changed by
    * subsequent property changes.
    * All properties, if set, should be absolute paths.
    *
    * Name Property Method Files
    * ----- -------- ----- -----
    * Base i2p.dir.base getBaseDir() lib/, webapps/, docs/, geoip/, licenses/, ...
    * Temp i2p.dir.temp getTempDir() Temporary files
    * PID i2p.dir.pid getPIDDir() router.ping
    * Config i2p.dir.config getConfigDir() *.config, hosts.txt, addressbook/, ...
    *
    * (the following all default to the same as Config)
    *
    * Router i2p.dir.router getRouterDir() netDb/, peerProfiles/, router.*, keyBackup/, ...
    * Log i2p.dir.log getLogDir() logs/
    * App i2p.dir.app getAppDir() eepsite/, ...
    *
    * Note that the router can't control where the wrapper actually puts its files.

    All these will be set appropriately in a Router Context.
    In an I2P App Context, all except Temp and PID will be the current working directory.

    Related changes:
    i2prouter:
    - Don't cd to script location, no longer required
    jbigi, cpuid:
    - Extract files from jar to temp dir, load from that dir, then
    copy to the base dir if we have permissions (and failing silently
    if we don't), so we have optimized libs and no complaints
    when we have a read-only base dir.
    logs.jsp:
    - Get wrapper log location from a property too
    - Display log file locations
    RouterLaunch:
    - If no wrapper, put wrapper.log in system temp dir
    unless specified with -Dwrapper.logfile=/path/to/wrapper.log
    or it already exists in CWD (for backward compatibility)
    - Append rather than replace wrapper.log
    - Pass wrapper log location to router as a property, so that logs.jsp can find it
    runplain.sh:
    - Add path substitution to runplain.sh on install
    - Pass I2P base dir to the router as a property
    Systray:
    - Fix NPE if no config file
    wrapper.config:
    - Put wrapper.log in system temp dir for new installs
    - Pass I2P base dir to the router as a property

    2009-06-29 zzz
    * HTTP Proxy:
    - Add simple web server for "proxy.i2p" to serve
    images and CSS for the error pages
    - Take CSS out of the error pages; use internal server
    for CSS, image, and favicon
    * i2psnark build:
    - Move FetchAndAdd to static inner class
    - Fix standalone build to include i2psnark.jar since classes
    aren't in the .war anymore
    - Have standalone jetty use I2PAppContext temp directory
    - Replace launch-i2psnark.jar with launch-i2psnark script,
    since RunStandalone is in i2p.jar
    - Clean up jetty-i2psnark.xml, turn off jetty logging
    - Remove standalone build from the pkg target in the main build.xml
    * Jbigi, CPUID:
    - Reduce memory demand on startup from 4MB to 4KB each
    * NetDb: Fix an NPE on early shutdown
    * Reseeding / NetDb:
    - Move reseeding from the routerconsole app to
    the router, so that we can bootstrap an embedded router lacking a routerconsole
    (iMule or android for example), without additional modifications.
    This allows better integration between the reseeding function
    and the netDb.
    - Call reseed from PersistentDataStore, not from the
    routerconsole init, and start seeding as soon as the netdb has read
    the netDb/ directory, not when the console starts.
    - Wake up the netdb reader as soon as reseeding is done,
    rather than waiting up to 60s.
    - Don't display the reseed button on the console until the
    netdb initialization is done.
    * RouterConsoleRunner:
    - Catch a class not found error better

    2009-06-29 zzz
    * Console: Convert table headers to  to prep for CSS changes
    * Console CSS: Move css file, make a classic theme to prep for CSS changes
    * Console: Move favicon.ico and i2plogo.png out of the .war
    so that the HTTP proxy can use them directly;
    proxy error pages must be updated next
    * NetDb stats: Normalize tunnel build stats for increased anonymity,
    effective in 0.7.6