Version 1.52 (Released 20150711) Core: * Allow torrent files to be up to 32MB in size BitTorrent: * Blacklisted ut_metadata support of Deluge * Increase size of ut_metadata dummy-container Version 1.51 (Released 20140302) Core: * Changed some code parts to avoid warnings if running under Perl >= 5.16 BitTorrent: * Crashfix: Bitflu could panic if the last file in a download had a size of zero bytes AND was hitting a piece boundary Version 1.50 (Released 20120711) Core: * Implement 'vfs_datafsync' option: Bitflu will call fsync() after writing metadata to disk (this is and was enabled by default) Setting it to '0' skips the fsync() call. This can speedup slow disks but can cause data corruption during power outtages or kernel crashes * Workaround for FreeBSD bug/feature in the socket implementation BitTorrent: * Support for uTorrent ratings (stars) Version 1.43 (Released 20120501) Core: * Bugfix: Bitflu used to autopause all torrents if 'min_free_mb' was set to > 0 on a system that does not support statfs() * statfs (aka: 'df' and 'autopause') support for FreeBSD BitTorrent: * Bugfix: Fixed crashbug triggered by the 'verifiy' task: The verify task used to mark 'lost' pieces as done, but this messed up our internal have-state. Kademlia: * Workaround for perl 5.12 (?) bug - bitflu (ehr perl) could silently exit Telnet: * Bugfix: Escape 'tab' and 'grep' user input correctly: Bitflu could be crashed if someone entered '[' on the telnet prompt Version 1.42 (Released 20120408) BitTorrent: * 'files $sha preview' has been replaced with 'files $sha priority' Setting the priority flag on a download causes bitflu to download the needed pieces as soon as possible. The command will still favour the first+last few MB (just like the old command did) * Bugfix: 'tracker $queueid set default' was broken * Bitflu will now respect tracker urls in magnet links * Autoadjust retry timeout for broken trackers WebUI: * Upgraded to YUI 2.9 * Autoresize tables in dialog windows while resizing Version 1.41 (Released 20120211) Core: * The Bencoding decoder has been rewritten from scratch. The new implementation is 3x faster :-) Telnet: * Fixed old authentication bug where bitflu would refuse to accept a login if the input stream was sent too fast * Variable length output in 'vd', 'peerlist' and 'files' output. Also note that the 'telnet_view' configuration option has been removed. BitTorrent: * Drop connection if we have more than 512KB of unparsed data * Establish less new (outgoing) connections if we are seeding * Fixed two crashbugs while loading dht:// links Version 1.40 (Released 20111218) Core: * Autopause faster if running out of space * Allow completed_downloads == unshared_downloads Bitflu will no longer add a .1 to canceled downloads if both directories are the same BitTorrent: * 'Pessimistic' pipelining: only use pipelining if the client is known to be 'fast' Kademlia: * Optimize blacklisting * Be more sceptic while receiving sha+ip pairs from other nodes (some clients seem to send outdated + unverified data to other clients) Version 1.39 (Released 20111022) Core: * Bitflu will not check for storage locks if BITFLU_FORCE_START is set in ENV * The RSS-Plugin has been removed - bitflu will not startup if the file plugins/Bitflu/99_Rss.pm is present. (just remove it) * Tweaked bitflu's upload throttling: the new code should use less CPU time and downloading via the Webinterface will be much faster. BitTorrent: * Fixed an off-by-one error that could have caused bitflu to crash while importing a torrent with empty files HTTP: * The http client was rewritten from scratch. HTTP is still a 2nd class protocol in Bitflu but the new version of the plugin is able to handle downloads with unknown size (up to 5MB) Version 1.38 (Released 20110823) Core: * Complain at startup if we are started as root while the configuration file is writable by other users * New config option: pidfile * Easier chroot: No need to copy .so files into bitflu's jail anymore. However: You'll have to supply $chroot/etc/protocols if you are using IPv6 WebUI: * Add 'hover' in /browse/ mode Cron: * Stop autoload if we blocked for more than 1 second. (The default was to load 10 torrents at a time) Version 1.37 (Released 20110626) BitTorrent: * Use more randomness in PeerID Kademlia: * Accept smaller token values * Learn tockens faster due to more random node selection * Tuning: Ping good (but failing) nodes more often and recover slowly WebUI: * Support for desktop notifications (currently only supported by google-chrome) Note: chrome seems to 'forget' the desktop notification permission after a restart if bitflu is not running on port 80. This means that you'll have to re-click the permission button after each restart of chrome if you are running bitflu on the default port 4081 Version 1.36 (Released 20110508) Core: * New feature: 'preview' download: The command > files queue_id preview 3 6 will instruct bitflu to download the first few (and the last few) Megabytes of file 3 6 first. Bitflu will still download other pieces (of these or other files) but it will give the start and end blocks a higher priority. * Bencoding: Corretly encode negative integers (bitflu never has to, but it's good to have) * Do not load torrents > 8MB BitTorrent: * Added an workaround to 'create_torrent' for 'transmission' Telnet: * Better (readline-like) history handling WebUI: * Added Disk-Usage bar Version 1.35 (Released 20110308) Core: * Setting upspeed to 0 now disables any upload throttling (like 'downspeed' does it) * Do not re-shuffle file-layout BitTorrent: * Tracker-Plugin: Be extra-picky while parsing the announce list. (This fixes a crashbug) Version 1.34 (Released 20110227) Core: * Workaround for perl 5.8.8 bug (1.33 will not startup using perl 5.8.8) Version 1.33 (Released 20110227) StorageVFS: * Improved detection (and auto-removal) of broken metadata * Autodisable fallocate at creation time if we would run out of space anyway (helps ext[34]) WebUI: * Add UTF8-Hint to 'browse' view (helps Chrome) * Fix scrolling problem in main window Core: * Optimize call to _GetAddrFoo somewhat for IPv4 * New option 'downspeed' Use 'config set downspeed 0' to disable it (default) 'config set downspeed 300' would limit your download speed to ~300 KB/s. Cron: * Commit completed downloads even if there are excluded (but downloaded) files * Fix broken 'df' output Rss: * Fixed a crashbug Version 1.32 (Released 20110128) Cron: * Never autoload more than 10 files per run BitTorrent: * Support for dht:// links * Fixed a crash-bug in the bt_connect command Kademlia: * Do not complain about 'vote' RPC calls WebUI: * Complete rewrite using YUI2 javascript library Version 1.31 (Released 20101228) Core: * The 'StorageFarabDB' plugin has been removed and is not supported anymore. * The 'quota' command has been removed / replaced with min_free_mb * New config option: min_free_mb : Bitflu will stop all active downloads (using sparsefiles) if the free disk space drops below 'min_free_mb', example: bitflu> config set min_free_mb 8000 (Stop if free disk space drops below 8GiB) Setting this option to 0 (default), disables this feature BitTorrent: * fixed a very stupid (and old) bug that caused bitflu to misparse handshake messages. * the tracker-plugin will now only do one auto-udp query This should improve 'start-times' for trackers that still do not support UDP. StorageVFS: * call fsync() on _WriteFile * check if some other instance of bitflu is using the same storage directory and refuse to startup if this is the case. * run a 'background verify' if the old bitflu instance crashed * the old allocator (vfs_use_allocator) has been replaced with fallocate() * support for fallocate (disabled by default, can be enabled via config option 'vfs_use_fallocate'). Without fallocate, bitflu creates sparsefiles. While this saves some space (unwritten data does not use up any diskspace), it will also lead to fragmentation. With fallocate() enabled, the filesystem will try to allocate space for the full file in advance. This will help reducing fragmentation. But keep in mind that fallocate() has a few downsides: - (currently) only i386 and x86_64 linux are supported - only works on some filesystems (eg. ext4 and btrfs). fallocate() is *not* supported on ext3! - fallocate'd files are not sparsefiles: they will not grow. Enabling vfs_use_fallocate should be safe even if your operatingsystem or filesystem does not support fallocate(): In this case bitflu will silently continue using sparsefiles. Version 1.30 (Released: 20101127) Core: * Convert :ffff: style IPs into old-style ASAP * Internal support to disable IPv4 (See README_IPV6.txt) * Refuse to startup if Danga::Socket is <= 1.51 Kademlia: * Ping good nodes more often (even if they are 'unused') BitTorrent: * Workaround for broken trackers: do not send empty 'event' values. (BEP-0003 allows this, but some trackers don't like such requests) * The tracker plugin failed to accept some (valid) tracker URIs Telnet: * Better UTF8-Support in 'vd' (Still has problems with CJK) StorageVFS: * Refuse to create filenames > 255 chars * Refuse to create paths longer than 1024 chars Version 1.22 (Released: 20101011) Kademlia: * Send plain version string (older versions used the packed APIVER) * Bugfix: Refuse to add own id as a torrent (this would cause some panics due to assert checks) * Use larger and random transaction-id values * Fix 'kdebug[46] -v $sha': older versions always used the 'own-id' instead of the provided argument * Less noise: Remove the 'ignoring malformed query' message BitTorrent: * Disconnect from peers who ask for unadvertised data * Smarter Endgame mode: dispatch freed pieces to faster clients StorageVFS: * Bugfix: ->OpenStorage might trigger an assert check if the storage id was invalid Version 1.21 (Released: 20100909) Core: * New feature: disk quotas Use 'quota show' to display your current usage Use 'quota set 4096' to set the quota to 4GB Use 'quota set off' to disable it (default) StorageVFS: * Keep a copy of the 'clipboard' in Memory (Kademlia uses the clipboard each X seconds, so it doesn't make much sense to store->load->store it often) WebUI: * Create correct paths to /browse/ icons if we are behind a reverse proxy Version 1.20 (Released: 20100815) BitTorrent: * Refuse to connect to ports <= 1024 * Ask 'slow clients' less often for new data * Ask for more metadata ASAP while downloading ut_metadata Core: * Do not panic if socket() fails to create a new sock. (Seems to be 'normal' while running in a Linux-VM) * Added option to *remove* data for completed download: Use as 'cancel --wipe queue_id' ..or hit the 'delete' button in the webui HTTP: * Accept malformed load command: 'load http:/single-slash.com/foo' (Useful if we are running behind nginx) WebUI: * Relaxed parsing: Accept requests to //foo (instead of /foo) * Support for file-list in JSON (needed for Transdroid) * Fix some JSON errors (also for Transdroid) Version 1.10 (Released: 20100615) BitTorrent: * Performance: return early if the buffer is empty (saves some cpu time) * The torrent created by create_torrent includes the sha1-sum in its filename * Changed piece selection: Bitflu will now try to finish partial completed chunks faster StorageVFS: * Try to remove corrupted storages * New options to the 'files' command: files $sha list-included | list-excluded Core: * ETA: return seconds as integer (1.3521523 seconds doesn't make sense) * API: The 'tempdir' setting got removed Telnet: * Implemented 'head' and 'tail' commands Rss: * Accept larger RSS feeds (> 256KB) Version 1.00 (Released: 20100505) Telnet: * Change the 'details' output to use localtime (old version used gmtime) * Added 'ETA' information BitTorrent: * Autoadjust torrent_gcpriority if we are under pressure (many clients) * Fixed a very rare crash bug: Bitflu could panic if: - there are less than 3 connected peers - and a torrent is near completition... - ..while the GC kicks in. Version 0.99 (Released: 20100329) BitTorrent: * Do not complain if we receive old/invalid Metadata Kademlia: * Bugfix: An invalid getpeers reply could have caused bitflu to panic WebUI: * Add a close-button to the Notification!-Element Version 0.98 (Released: 20100308) Kademlia: * Fixed broken node_id generator Version 0.97 (Released: 20100222) WebUI: * Bugfix: Browsing a torrent with zero-sized files crashed bitflu (division by zero) Core: * New configuration option: 'chdir': If this option is set, bitflu will change into this directory after loading all plugins. An example: plugins = ./plugins chdir = /tmp/foo incomplete_downloads = ./workdir/unfinished - Bitflu will load all plugins from './plugins' - change into /tmp/foo -> incomplete_downloads would then be at /tmp/foo/workdir/unfinished Kademlia: * Use less CPU (about -15% on my 800Mhz PC!) * Never use more than 5kbps for outgoing traffic Version 0.96 (Released: 20100111) Core: * Complain if IO::Socket::INET6 version is < 2.56 * Do not even try to parse strings that appear to be non-bencoded BitTorrent * Rewrote HuntPiece * Printout tracker 'failure reason' message. * Bugfix: Bitflu would panic (bugcheck) if a non-ut_meta peer would send us a reject message. ouch! Telnet interface: * Line editing support (CTRL+A and CTRL+E also works!) Version 0.95 (Released: 20091129) Internal: * Make use of 'fields' in some plugins to save memory + cpu BitTorrent: * Optimized magnet-links usage: Received metadata is now swapped ASAP. Kademlia: * Support for BEP-32 (Kademlia over IPv6). Bitflu <= 0.94 included experimental IPv6-Kademlia support and is not compatible with BEP-32. Upgrading to 0.95 is recommended for all people using bitflu with IPv6 BEP-32 specs are at: http://www.bittorrent.org/beps/bep_0032.html * Fixed stupid ping-bug (introduced in 0.94). Bitflu would stop pinging valid DHT-Nodes. * General Kademlia optimizations Version 0.94 (Released: 20091114) WebUi: * Added 'browse' button to view torrent in an apache-like dirlisting (or just enter: http://localhost:4081/browse/ in your browser) * Support for HTTP HEAD Requests (needed by crazy wget) Internal: * Moved all Bencoding stuff to Bitflu::Tools->Benc* The bencoder isn't really bittorrent specific, so it can be used by other plugins. * Bugfix: Removing an SxTask could have crashed bitflu * VeryInternal: Make _Runners a Hashref ( < 0.94 used to use an arrayref ) * Fixed rare socket leakage due to failed writes (Only affected plugins that do not timeout established connections such as AdminTelnet and AdminHTTP) StorageVFS: * Fixed filehandle leak: Bitflu forgot to flush its own filehandle cache while removing a completed download from it's own queue. BitTorrent: * Added tracker editor: Bitlu can now edit/set/replace existing trackers. Example 1: Set 2 trackers bitflu> tracker df18859fa3c1840967523254e9d37cf1754aaef3 set http://tracker1.com/announce,http://tracker2.com/announce (Note: ',' seperates trackers, '!' forms groups) Example 2: Restore default bitflu> tracker df18859fa3c1840967523254e9d37cf1754aaef3 set default * Changed create_torrent syntax to be consistent with 'tracker set' * Fixed perl warning (Use of uninitialized...) while running the 'peerlist' command. (This bug was old, sorry! ;-) ) * Fixed a small memory leak in the torrent module (Bitflu still used memory for unlocked piece. Not a big leak but it was still a bug) * ENDGAME: Better 'endgame' detection. Before this release bitflu would enter the endgame mode if $pieces_left was below 30. Bitflu will now activate the endgame mode if it detects that all free pieces have been queued/locked. * ENDGAME: Kick locked pieces while entering endgame mode. Otherwise a slow peer could queue up all remaining pieces for a long time * Support for invalid (non-base32-encoded) magnet links Kademlia: * Fixed timing issue with bootstrap * AliveHunter() should scale better even when working with big routing tables. The old version used to re-shuffle a list of nodes on each run. This list will now be keept in a cache. * Improved kdebug output: Better statistics Cron: * Run 'history cleanup' each 5 hours to keep it 'small' Version 0.93 (Released: 20091026) WebUi: * Some cosmetic fixes Kademlia: * Strict response checking: Do not accept a 'values' reply if we did not ask for it. BitTorrent: * Bitflu understands the (unused but handy?) torrent://info_hash format. Example: bitflu> load torrent://640fe84c613c17f663551d218689a64e8aebeabe (Note: This is Slackware 12.2) Magnet-Links are still supported (torrent:// links are actually converted into a magnet link internally) Version 0.92 (Released: 20090816) Rss: * Fixed help text ('see rss help' -> 'see help rss') * Bugfix: Avoid stuck rss downloads BitTorrent: * Speedup verify command * Added 'verify progress' command Telnet: * New Pipe-Command: sort Example: vd | grep Foo | sort * Removed compact-download-view command ('l' command) * Added new option telnet_view telnet_view can be used to alter the output of the 'vd' command. The option takes a line in this format: field1[=max_length],field2[=max_length] The default value is: type,name=25,hash,peers,pieces,bytes,percent,ratio,up,down,note This means that 'vd' will display the download-type, the name (limited to 25 chars), the queue_id, number of peers, etc... The value of telnet_view can be altered at runtime. An example: bitflu> config set telnet_view name=10,hash=10,pieces,percent,up,down The default value can be restored by setting telnet_view to "" : bitflu> config set telnet_view "" Internal: * Plugins can now create some sort of threads (Called SxTasks) The API might (will?) change as this is a first bare-bones implementation that doesn't do any cleanups (Killing an SxTask doesn't cleanup Sockets) Currently this is only used by the verify command but might find use for the Rss/Cron plugins (and maybe the BitTorrent GC?) Version 0.91 (Released: 20090621) Rss: * This is a new plugin: Bitflu can handle RSS feeds and download all (whitelisted) content Example: bitflu> rss add http://rss.a.scarywater.net/ rss-job http://rss.a.scarywater.net/ has been added bitflu> rss list Registered RSS feeds: rss-e0a453c7d0b483f7bfa2d52b0e5debfa0b18b7a2 : http://rss.a.scarywater.net/ bitflu> rss rss-e0a453c7d0b483f7bfa2d52b0e5debfa0b18b7a2 whitelist haruhi rss-e0a453c7d0b483f7bfa2d52b0e5debfa0b18b7a2: whitelist set to 'haruhi' WebUi: * Limit download name to 180 chars in display Telnet: * New shortcuts: CTRL+D quits the current session CTRL+L clear screen * Better tab-completion: TAB will complete as much as possible Bitflu will show multiple hits (if any) StorageVFS: * Try to re-create missing dataroot-directories Internal: * Reduced DNS-Lookup timeout (via RES_OPTIONS) * Remember 'bad' DNS-Names and skip them for a while if resolving failed * Implemented ->GetCompletion and ->RegisterCompletion The 'tab completion' isn't hardcoded anymore: plugins can provide their own suggestions Version 0.90 (Released: 20090501) Core: * Bitflu::Network has been rewritten and uses Danga::Socked instead of IO::Select So this means that bitflu can use epoll() on Linux and kqueue on *BSD. Please note that version >= 1.61 is highly recommended and even required if you are using IPv6 (FreeBSD ports includes a very old version. Just use CPAN and you are done :-) ) BitTorrent: * Bugfix: Fixed IPv6-PEX bug * Bugfix: Do not work-around bitflu's bandwith scheduler (->WriteDataNow misuse) * Performance: Do not re-parse databuffers if we know that they are not yet fully received * Tracker: Accept broken HTTP-Responses (\n\n instead of \r\n) * Tracker: Do not accept responses >~ 256Kb Kademlia: * Bugfix: Use correct handle while writing/reading to blacklists HTTP * Display download speed for each queue entry (Finally) Version 0.81 (Released: 20090412) Network: * Fixed IPv6 resolver on FreeBSD (and others?) * Increased network buffer-size to 32kb (old: 8kb on Linux, 1kb on FreeBSD) This should fix speed issues on *BSD BitTorrent: * Bugfix: Fixed broken 'tracker show' output (broke in 0.80 due to IPv6) Kademlia: * IPv6 Support (Experimental: Bitflu is currently the only implementation that supports IPv6-Kad) StorageVFS: * New configuration option vfs_use_allocator Turns bitflus internal pre-allocator on or off Setting this to 1 causes bitflu to pre-allocate data. This results in more disc activity but can help to avoid fragmentation on some filesystems. Setting this to 0 turns the pre-allocation off The default is '0' (= Disabled). (Note: Bitflu <= 0.80 had this on and you couldn't turn it off) Version 0.80 (Released: 20090209) This might be the worst or the best bitflu release ever: You decide (and i don't care :-p ) Bitflu 0.80 brings you (almost) full IPv6 support. yeah! Core: * Support for binding an OUTGOING connection to a specific (non-standard) Interface has been dropped. * Network: IPv6 support! * Network: API-Change: Use of IPv4 has been replaced by RemoteIp * Config: Bitflu will now create a backup of your configuration file while starting up StorageVFS: * Bugfix: _WriteFile failed to check the return code of print() and close(), this could have caused a corrupted clipboard file if you ran out of diskspace BitTorrent: * Bugfix: analyze_torrent and verify would cause a panic if the specified queue_id string did not exist. Oops. * Outgoing connections are (again) established less aggressive. Bitflu ~0.62 tried very hard to create outgoing connections but this would only reward people who are unable to receive incoming connections. * Tracker: Support IPv6 responses (TCP and UDP!) * PEX: Bitflu cann receive IPv6 Peers and will use them .. maybe :-) * New command: seedprio: Tells bitflu to reserve X upload slots for a specific torrent * New command: seedhide: Tells bitflu to hide X % while seeding a torrent. So bitflu will look like a normal downloader and leechers won't be able to get the full torrent from just a single peer. Version 0.70 (Released: 20090102) BitTorrent: * The tracker plugin can now handle udp:// trackers We also use auto-udp (= try to contact a tracker via udp even if there is no udp:// uri for it) New config options: -> torrent_tracker_udpport (Port used for UDP, must not be forwarded) -> torrent_tracker_autoudp ('Guess' udp capability) * Disable 'pipelining' (reqq) if torrent is in 'AlmostDone' state. This reduces the feasibility that a slow/broken peer can pile-up all remaining piece requests. * Bugfix: Bitflu will now always send NOT_INTERESTED messages after completing the download (not a big problem but it was still a bug) * Disconnect from other seeders while seeding a torrent (Bitflu used to wait until the connection times out due to no activity) * Internal: Removed multilock feature (Wasn't used anyway) Core: * Beautified 'config show' output (locked values are yellow) * Added a '--quiet' option * Beautified '--help' output * Bitflu will not print anything to STDOUT if started with --daemon Version 0.62 (Released: 20081222) StorageVFS: * Implemented a filedescriptor cache to reduce the number of open()/close() calls. Core: * Removed the (unimplemented) echo command that caused bitflu to panic. Uups... Telnet: * Added 'clear' command to clear the screen * Added 'repeat' command that repeats a command each second. Example: foo@bitflu> repeat clear ; date ; vd (Hit CTRL+C to stop) BitTorrent: * Remember received peers (via Tracker, Kademlia or ut_pex) and try to contact them in small steps. This will/should result in more peers * Removed torrent_minpeers setting * Do not blacklist peer if first chunk was bad (Added MIN_HASHFAILS) WebUI: * Bugfix: The upload function forgot to remove tempfiles. oops. Version 0.61 (Released: 20081112) StorageVFS: * Bitflu 0.60 used to crash often on *bsd and OSX due to my misuse of seek() :-) . This release fixes this annoying bug. Core: * The networking layer now detects fast senders and requeues recv() calls if needed. This can reduce CPU load while increasing the download speed. * Implemented '--all' keyword for pause, resume, cancel and commit. So you can type 'pause --all' to pause all downloads. * Added 'history drop' to delete bitflus download history with a single command. BitTorrent: * Delay writing 'piece request' results. Bitflu used to respond to piece-requests ASAP. This caused some ugly 'buffer overrun' messages to appear if the remote client did ignore the 'reqq' value sent during handshake. Bitflu now has an internal buffer for all piece request and only writes a response if the buffer won't get 'overflowed' by this. WebUI: * Implemented torrent-uploading via HTTP. Thanks to Pedro Melo for sending me this patch. Version 0.60 (Released: 20081009) Cron: * Added version check: Bitflu checks if your version is up-to-date and sends you a note (via 'notify') if it isn't. > Note: This 'phone home' check does NOT transmit any personal data or/and replace any files itself! The check just lookups the A-Record of 'version.bitflu.org' > You can set 'checkversion = 0' in .bitflu.config to DISABLE this feature. (default is: enabled) > Implementation details: - Bitflu does an A-Record lookup for 'version.bitflu.org' and will receive something such as: '1.0.60.0' 1 = Unused 0 = Major version 60 = Minor version 0 = Unused - Have a look at 'sub _VersionScan' * Blacklisted IPs are now expired after 1 hour. Kademlia: * Removed 'own' blacklisting code: The kademlia plugin will now use the Network-Blacklist API BitTorrent: * Include User-Agent string in Tracker requests * Do not schedule/throttle tracker writes (avoiding some timeout issues) * The tracker plugin no longer destroys bencoded data with linebreaks ("\n") .. d'uh! Version 0.52 Core: * Implemented 'log': This command returns the last X log messages from bitflu's internal buffer * Bugfix/Workaround: Bitflu assumed that the system clock would never step backwards. This is true on systems that use ntpd/chrony/clockspeed to adjust clock drifts. But if something such as ntpdate is used we would run into much trouble. (The BitTorrent plugin could even cause bitflu to crash due to a division by zero). SetTime will now no longer accept timestamps from the past. This avoids Possible crashes but calculations (Download speed) will still suffer. BitTorrent: * Blacklist 'own' IP if detected (connecting to ourself doesn't make any sense) StorageVFS: * Implemented a simple 'allocator' to avoid fragmentation * Renamed default Storage-Directory names Core: * Moved the pause/resume commands into QueueMGR (This was implemented by the BitTorrent plugin itself) WebUI: * Added History dialog * Added a Notifications! button Cron: * Complain (via notify) if autoload failed for some reason Version 0.51 BitTorrent: * create_torrent will not create torrents with piece-size < 32kb (would confuse uTorrent) * import_torrent: Skip incomplete files instead of panicing * Removed the old ranking-system with a fairer version (The old version discriminate fresh connections) StorageVFS: * Improved the 'cancel' command: -> Canceling an unfished/uncommitted downloads removes all traces -> Canceling a committed download moves it into $unshared_downloads WebUI: * Made the '/getfile' link relative to avoid problems behind an apache proxy * Added Include/Exclude buttons Version 0.50 (Released: 20080531) BitTorrent: * Replaced some substr() calls with unpack(). This is less ugly to read and might be somewhat faster. * Fixed some import_torrent bugs: - The imported data is now added to the uploaded counter to keep your ratio 'in-sync' - We'll disable autocommit/autocancel after importing data * Tracker-Plugin will now also bind to torrent_bind * Added create_torrent command. Kademlia: * Bugfix: Flush _knownbad each hour * Use torrent_bind (= Do not listen on all interfaces if set) Cron: * Bugfix: 100% completed downloads WITH excluded files would cause cron to do an endless-autocommit. Bitflu will now not try to autocommit files that have excluded files. (Wouldn't make much sense anyway...) Core: * bind() outgoing TCP connections to the same interface as the listening socket. * New configuration option: 'default_bind' bind outgoing/incoming connections to this interface if the plugin doesn't have its own *_bind value. default_bind is currently only used by the HTTP-Plugin. * New configuration option: history history = 1 : Use / update the download history (Default) history = 0 : Do not use or write to the history StorageFarabDb: * _WriteFile will now use rename() to do an atomic write StorageVFS: * New storage plugin: The old/current FarabDb-Storage plugin needs a lengthy commit after a download has been finished because the whole 'stream' is stored within small chunks. This made it easy to ensure integrity (because it can use rename() to change a pieces state and it uses fsync() before moving a file into .done) but is very unhandy because commiting a download requires a LOT of space (it doubles the space usage). The new VFS plugin stores downloads the way it's done by 'all other' clients such as Azureus or uTorrent. Give it a try if you feel brave: (Note: This is alpha/beta code) 1: Stop bitflu 2: Edit .bitflu.config and set/replace 'storage = StorageVFS' 3: Start bitflu The download list will now be empty because the VFS plugin is not 'compatible' with FarabDb. -> Unfinished downloads are stored at ./workdir/unfinished/$SHA1 -> Finished downloads are stored at ./workdir/finished/$NAME The plugin still has some known bugs/missing features: -> Moving/deleting files within ./workdir/(un)finished will cause bitflu to panic. You must 'cancel' a download before touching any files -> Canceling an unfinished download does not remove any files -> The plugin does not try to 'repair' a 'broken' download directory Btw: Switching back to the FarabDb plugin is easy: Just delete the 'storage = ...' line and start bitflu again. Version 0.45 (Released: 20080421) Core: * Implemented download-history: Bitflu will now remember what you've downloaded and refuses to download the same item twice. Use the 'history' command to view and edit the internal history Cron: * Implemented 'schedule' command: The schedule command can be used to change configuration values at a given time. An example: > schedule set upspeed 20 80@2200-2300 90@0100-0500 This would cause bitflu to set the value of 'upspeed' to: 80 from 22:00 until 23:00 90 from 01:00 until 05:00 20 otherwise (= Default value) Note that there is no 'weekday' support yet. So you cannot have a 'Sunday' rule. I'll implement it if there is demand for such an option. StorageFarabDb: * Added 'sprofile' command (Storage 'Profiler', used for performance debugging) * Fixed a typo that caused some unneeded printf() calls during startup * Moved Config-Proto from Bitflu::Configuration to StorageFarabDb Kademlia: * Save good nodes each 15 min. and boot from them at startup (if needed). The old behaviour was to boot using router.utorrent.com:6881 and router.bittorrent.com:6881. Both nodes will still be used if your routing table is empty. If you are running bitflu on a static ip, feel free to drop me a note and i'll add your ip/host to the hardcoded bootstrap list :-) Telnet: * Added 'l' command: This command outputs a compact (small screen) version of the 'vd' output * Log ip of connecting peer instead of the sockref on console WebUI: * Added Pause/Resume buttons to each download Version 0.44 (Released: 20080229) Core: * New option: --daemon (fork into background after startup) * New configuration file option: logfile * Check 'APIVERSION' while loading plugins StorageFarabDb: * Dump bitfield on exit and slurp it while starting up. Doing this improves startup time while running on filesystems with slow metadata performance (Such as Ext3) * Executing 'files 0 list' triggered a panic, this has been fixed. * Do not try to 'fix up' the StorageId, this caused certain plugins to panic BitTorrent: * Keep one PPL-Piece until it's done. This helps to 'bootstrap' a torrent. Kademlia: * Removed 'kademlia_enabled' setting. You can disable the kademlia plugin via 'pluginexclude' AdminTelnet: * You can now specify multiple commands on a line using ';', Example: bitflu> config show upspeed ; netstat * Support for pseudo-pipes and grep, Example: bitflu> files 1234567890abcdef1234567890abcdef12345678 list | grep Foo WebUI: * Do not use absolute links, making the WebUI useable behind an Apache-Proxy * Display 'ratio' Version 0.43 (Released: 20080117) BitTorrent: * Support for MAGNET links * Added 'pause' and 'resume' commands. * Only keep needed information form the torrent in memory * Removed partial FastPeers support: Mainline dropped support in version 6.x (also known as uTorrent) * Delay ReleasePiece calls after receiving a CHOKE message. This helps to work around some obscure uTorrent UNCHOKE->CHOKE->UNCHOKE tactic. * Bugfix: import_torrent can now correctly slurp torrents that include zero-sized files. WebUI: * Added a (bare-bones) WebUI: http://127.0.0.1:4081/ StorageFarabDb: * Added 'files .. include' and 'files .. exclude' (for selective downloads!) * Fixed 'files .. list' percent calculation to be more accurate :-) * Replaced the 'pcommit' command with 'files queue_id commit 1 2 3' * Display percentage while verifing storage * Do not cache more than 256 bytes per setting (Caching _torrent doesn't make much sense) * Cache Free/Inwork/Done data using a bitfield * (Try to) fsync() file before moving it to .done Core: * API-Change: Changed how ->ExecuteCommand works: Plugins can now return 'leftovers' (SCRAP) that we'll pass to the remaining plugins. This makes it possible pass torrent and http-urls to a single 'load' command. * Added 'pluginexclude' setting: pluginexclude = 10_AdminTelnet.pm;99_Cron.pm would disable the telnet + cron plugin Version 0.42 (Released: 20071226) Core: * Enhancement: Run out-of-the-box on Perl 5.10 by using Digest::SHA if installed (and fallback to Digest::SHA1 if it isn't) * Bugfix: Check for EWOULDBLOCK and EAGAIN if syswrite() failed. This fix makes bitflu a much better uploader :-) * Bugfix: Reject incoming connection if $sock->peername; fails * API-Change: Callbacks are now registered while creating the socket. * API-Change: Throttle is depricated. Use WriteDataNow() instead. * Many netiolib changes (This release includes version 20071220_1) * Use /dev/null instead of /dev/zero to test file descriptors. * Try to read() multiple times from a socket while in _IOread(); BitTorrent: * Bugfix: Release locked pieces on unchoke. * Bugfix: Do not crash if torrent has an empty info=>{} hash * Removed torrent_huntpriority and torrent_slowspread settings. * Added torrent_upslots setting. (Configures how many peers can be unchoked) * Run an unchoke round each 30sec+skew (not each 20sec like 0.41 did), optimistinc unchoking has also been implemented (we are unchoking 1 GLOBAL peer) * Rewrote mainloop: The 'GarbageCollector' runs now each second but does only work on a small subset of peers. * Try (even more) to avoid calls to $self->Hunt; (they can be very expensive) * Do not accept more than 30 peers per ut_pex message. * DebugPeer (the 'x' command) does now display the name (+ version) of some well known clients such as uTorrent, Azureus, BitComet.. etc.. * Trackerblacklist matches are now caseINsensitive AdminTelnet: * Removed the flags column and replaced it by colors + text * Added command 'details' Kademlia: * Do not accept malformed kademlia nodes ($port == 1) in response to get_peers/find_nodes as this will just trigger a bugcheck/panic. StorageFarabDb: * Check storage directory on first ->OpenStorage call * Security fix: A malicious .torrent could have caused bitflu to either append data to existing files or create new files (overwriting files was not possible) 'outside' it's own workdir while committing the download. The storage driver will now try to sanitize filenames and refuses to append data to existing files. Well.. fixing this was on my todo list for 0.40 but i forgot to implement it... Remember: Always run bitflu inside a chroot jail ;-) Version 0.41 (Released: 20071213) Core: * Added 'pcommit' command * Mark broken commits wit a 'INCOMPLETE_' prefix * Advertise MAX_OUTSTANDING_REQUESTS via EPROTO-Handshake * Added 'useradmin' command (Authentication) * Fixed some perl warnings and adjusted loglevel * Bugfix: StorageFarabDb: OpenStorage does now cache (and more important) share the storage object globally. This fixes a rare 'race condition'. BitTorrent: * Added Kademlia Support * Downloading a .torrent file using the 'load' command will now trigger an auto-import (= Bitflu will start load the torrent itself) * Implemented PPL-Hunting: Bitflu will now try to get some complete pieces ASAP Version 0.40 * This is a complete rewrite