Zensursula: Teil 1 – DNS von apoc
“Sie werden sich noch wünschen wir wären Politikverdrossen” (@343max)
Ich hatte die letzen Wochen den Eindruck, als ob die gesamte Internet-Gemeinschaft in Deutschland Sturm lief, überall gab und gibt es nur ein Thema: Die Internetzensur Bestrebungen der großen Koalition. Dabei hatte man am Ende den Eindruck gegen eine Mauer von Unkenntnis, Ignoranz aber vielleicht auch einfach blanker böswilliger Berechnung einfach nichts ausrichten zu können.
Besonders Enttäuschend empfand ich die Medien, überraschend war es freilich nicht dass sie praktisch ausschließlich Parteipropaganda nachplapperten und die Mainstream Meinung nach dem Willen der Regierung formten. Von investigativem Journalismus jedenfalls war in den Holzmedien nichts zu sehen, das überlässt man offenbar anderen.
Ein wenig Ironisch ist es schon, ist doch gerade das Internet die einzige breit zugängliche alternative Informationsquelle(wie wir eindrucksvoll sehen konnten), die mit der jetzt beschlossenen Infrastruktur möglicherweise schon bald stark eingeschränkt wird. Dabei geht es auch um die Frage ob wir der Regierung soweit vertrauen, nach der Installation einer bis dato einmaligen Infrastruktur für Zensur, bei der Sperrung von Kinderpornographischen Inhalten zu bleiben. In den letzten Jahren hat uns die große Koalition keinen Grund geliefert das zu glauben.
Die eigentliche Kluft wie häufig Thematisiert, liegt nicht zwischen den Internet-Natives und den “Internet-Ausdruckern” sondern vielmehr in dem Teil der Bevölkerung der sich unabhängig Informiert und dem Teil, der den großen Medien und Agenturen(auch im Internet) blind vertaut und als einzige Informationsquelle zur eigenen Meinungsbildung heranzieht, also den überwiegenden Teil der Gesellschaft.
Gestern nun hat die EU die Zensur in China gerügt(so Merkwürdig wie das auch immer ist), demnach vergessen wir einfach alles was die EU-Länder sonst so treiben und beschäftigen uns nun, offensichtlich im Wohlwollen der EU, um die aktiven technischen Möglichkeiten der Umgehung jedweder Zensur-Infrastruktur, außerdem kann es nicht schaden die von den Zensoren eingesetzte Technologie mal etwas genauer zu beleuchten.
In diesem ersten Teil soll es um die Zensur durch DNS Manipulationen gehen.
Es ist noch die leichteste Form der Zensur, die Einstiegsdroge der Staaten sozusagen, denn DNS Manipulationen lassen sich Kinderleicht aushebeln was wohl schnell den Wunsch nach härteren Mitteln wecken dürfte. Bei dieser Form der Zensur installieren die ISP’s die Sperrlisten in ihren DNS-Servern, ist doch zumindest anzunehmen, das die Mehrheit der Internet Nutzer die Server ihres Providers verwenden, wobei das bei leibe nicht immer der Fall ist. So war und ist es schon immer möglich seinen eigenen DNS-Server zu betreiben. Jetzt wo man allen Grund hat den DNS-Servern der Provider zu misstrauen, ist das eine sehr praktikable Möglichkeit, zumindest für diejenigen die sich mit dem Internet auskennen.
Doch der Reihe nach, im Prinzip reicht es statt eines Domain-Namens in der Adresszeile die Ip-Adresse einzugeben um diese Zensur zu umgehen, besser ist es da schon einen alternativen DNS-Server zu verwenden, vorzugsweise im Ausland, aber auch der CCC und der Foebud stellen unzensierte DNS-Server (noch) frei zur Verfügung. Listen mit freien Servern gibt es z.B. bei Wikileaks, dem CCC oder die Server des Open NIC Projektes.
DNS Caching Server
Nützlich ist auch das Einrichten eines eigenen Caching DNS-Servers der zufällig aus einer Liste, öffentliche Servern abfragt. Ich verwende dafür den pdnsd, nicht zu verwechseln mit dem vollwertigen DNS-Server, PowerDNS. Je nach Distribution sollte sich die Installation einfach gestalten, z.B. reicht ein pacman -S pdnsd um mit Arch Linux den Server zu installieren. Jetzt sollte man sich die Beispiel Konfiguration kopieren und Anpassungen vornehmen. Hier eine mögliche Beispielkonfiguration, es muss nur die server_ip angepasst werden:
global { perm_cache=512000; # cache groesse in KB (hier "leicht" uebertriebene 500 MB) cache_dir="/var/cache/pdnsd"; run_as="nobody"; server_ip=10.0.0.4; # ANPASSEN status_ctl=on; paranoid=on; # prevents cache poisoning query_method=udp_tcp; min_ttl=15m; # min/max TTL max_ttl=4w; timeout=15; # global timeout 15 seconds neg_rrs_pol=auth; par_queries=2; # maximale parallele abfrage von servern } server { # ein paar oeffentliche server (alle getestet) label = "random"; randomize_servers = on; ip = 85.214.73.63, # foebud 204.152.184.76, # ISC (USA) 213.73.91.35, # CCC 194.95.202.198, # DFN 58.6.115.43, # Westnet (Australien) 82.229.244.191, # Frankreich 88.191.77.10, # Frankreich 216.87.84.209, # OpenNIC 88.191.77.10; # OpenNIC timeout=10; # 10 sekunden maximal uptest=ping; ping_timeout=400; #ms interval=30m; # uptest der server per ping } # Unveraendert aus Sample Conf: # This section is meant for resolving from root servers. server { label = "root-servers"; root_server = on; randomize_servers = on; # Give every root server an equal chance # of being queried. ip = 198.41.0.4 , 192.228.79.201 , 192.33.4.12 , 128.8.10.90 , 192.203.230.10 , 192.5.5.241 , 192.112.36.4 , 128.63.2.53 , 192.36.148.17 , 192.58.128.30 , 193.0.14.129 , 198.32.64.12 , 202.12.27.33 ; timeout = 5; uptest = query; # Test availability using empty DNS queries. interval = 30m; # Test every half hour. ping_timeout = 300; # Test should time out after 30 seconds. purge_cache = off; exclude = .localdomain; policy = included; preset = off; } # ganz praktisch, damit braucht man nur eine einzige hosts Datei im ganzen LAN zu pflegen: source { owner=localhost; serve_aliases=yes; file="/etc/hosts"; }
Ich habe alle DNS Server getestet. Eventuell die Konfiguration noch auf die eigenen Anforderungen anpassen, eine Dokumentation findet ihr hier. Die /etc/resolv.conf noch auf die lokale IP-Adresse umstellen dann den Server (neu)starten. Jetzt sollte er funktionieren, testen kann man das z.B. mit nslookup oder: dig 4poc.org [IP des DNS], dig zeigt auch wie lange er zum resolven brauchte.
Um festzustellen welche DNS-Server verwendet werden habe ich ein kleines Skript geschrieben, eigentlich passt die Thematik(siehe Anmerkung im Script) nicht direkt zum Thema aber den folgenden Artikeln sei schon mal etwas vorgegriffen: nstest.4poc.org (DNS Tester, falls jemanden einen besseren Namen dafür einfällt nur her damit.)
Kleine Ruby Logger Klasse von apoc
Normalerweise sind die Artikel hier ja ziemlich umfangreich, was ja auch gut ist schließlich geht das Sixserv Blog ja schon sehr ins technische Detail. Doch diesmal wird es eher kurz, ich möchte eine kleine Logger Klasse vorstellen die ich in Ruby geschrieben habe und seither häufiger benutze.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 | class Logger def self.init @logfile = LOG_FILE @buffer = [] # logging lines for buffering end def self.<< msg msg = format msg # append message to buffer @buffer << msg # flush the buffer if possible self.flush end def self.flush return if @buffer.empty? # try to lock the file for writing log = File.new(@logfile, 'a+') if log.flock(File::LOCK_EX | File::LOCK_NB) == false # Logfile is locked puts "Logfile is locked!" log.close return false end # ==> not locked, write buffer to logfile while @buffer.length > 0 log.puts @buffer.shift end log.flock(File::LOCK_UN) log.close end private def self.format msg time = Time.now.strftime '%H:%M:%S - %d.%m.%Y' "[#{time}] #{msg}" end end |
Nichts großes also, es gibt z.B. keine Log-Level usw. Außerdem kann man sich, wenn man etwas mehr Features braucht, auch eine Logging Bibliothek aus dem Gems bedienen. Die Anwendung ist ganz einfach:
1 2 3 4 5 6 7 8 | require '/pfad/zu/logger.rb' Logger.init # das kann man dann überall im Code verteilen: Logger << "Irgendeine Nachricht!" # hat man eine große Anwendung mit vielen Prozessen/Threads # kann man auch an strategischen Stellen ein Logger.flush # einbauen :) |
Hier noch eine kleine Erweiterung die einen Log-Server implementiert. Er öffnet einen TCP Port, jeder der sich verbindet(z.B. per Telnet/Netcat) kann daraufhin die Log-Nachrichten mitlesen:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 | class Logger def self.init ... @port = LOG_PORT @query = [] @query_mutex = nil @running = false @server = nil end def self.start_server @query_mutex = Mutex.new puts "Start logging console @ #{LOG_HOST}:#{LOG_PORT}" @server = TCPServer.new(LOG_HOST, LOG_PORT) clients = [] @running = true Thread.start do client = [] while @running do begin client = @server.accept_nonblock clients << client if client != nil rescue end begin message = nil @query_mutex.synchronize { message = @query.pop } if message != nil clients.each do |client| begin client.puts message rescue clients.delete client end end end end while not @query.empty? sleep LOG_SERVER_INTERVAL end clients.each { |client| client.close } @server.close @server = nil end end def self.destroy @running = false @fs.close # wait until server closed true while @server != nil end def self.<< msg if @query_mutex != nil @query_mutex.synchronize do @query << format(msg) end end puts ">>> #{msg}" end def self.flush # just wait until everything is sent/written if @query.length > 0 true while @query.length != 0 end end ... end |
So das wars schon, ich hoffe das ich das mit dem Mutex richtig gemacht habe und das hier überhaupt notwendig war, ich habe auf dem Gebiet nicht viel Erfahrung und würde mich über einen entsprechenden Kommentar freuen.
// I’m not sure I used the Mutex in this example correctly, I would appreciate a comment about this.
Webscripting mit Ruby und Mechanize von apoc
Praktisch jede Interaktion mit einer Website oder Webapplikation kann gescriptet, d.h. automatisiert werden. Das Abgrasen von Webseiten nach bestimmten Informationen wird auch als Scraping bezeichnet(für die nicht menschlichen Besucher dieser Seite sei das erwähnt *g*) Scripte können einem eine ganze Menge Arbeit abnehmen und sogar Dinge tun, die manuell unmöglich wären. Ich beschäftige mich mit dem Thema schon seit einer ganzen Weile und möchte hier nun die von mir favorisierte Methode dafür vorstellen, die Bibliothek Mechanize für die Scriptsprache Ruby.
Mechanize hat seinen Ursprung in Perl, mittlerweile gibt es jedoch auch Implementierungen der API für Python und eben Ruby. Für PHP gibt es mit Snoopy ein ähnliches Projekt, wenn es auch bei weitem nicht so fortgeschritten ist. Mechanize bietet die Möglichkeit mit einfachen Methoden eine art Webbrowser zu simulieren. Alle Beispiele wurden mit Mechanize Version 0.9.2 und Ruby 1.8.7 getestet.
Installation / Initialisierung
Mechanize kann mit Gems(ähnlich CPAN oder PEAR) installiert werden(# gem install mechanize --remote), einige Distributionen bieten aber auch eigene Pakete an. Ein Ruby-Script kann daraufhin Mechanize inkludieren und ein Objekt erstellen:
require 'rubygems' # ist unter Umständen notwendig require 'mechanize' agent = WWW::Mechanize.new
Jetzt ist Mechanize einsatzbereit, die folgenden Beispiele bauen darauf auf. Außerdem können mit dem agent nun noch grundlegende Einstellungen vorgenommen werden:
agent.set_proxy('localhost', '8000') agent.user_agent = 'Individueller User-Agent' agent.user_agent_alias = 'Linux Mozilla'
Die Einstellung ‘user_agent_alias‘ wählt einen User-Agent String aus dem folgenden Satz von Beispielen aus: Windows IE 6, Windows IE 7, Windows Mozilla, Mac Safari, Mac FireFox, Mac Mozilla, Linux Mozilla, Linux Konqueror, iPhone und Mechanize. Die Timing Einstellungen können ebenfalls sehr wichtig sein:
agent.open_timeout = 3 # setzt timeouts agent.read_timeout = 4 agent.keep_alive = false # default ist true
Hier folgen nun einige Beispiele, vielleicht werde ich mit der Zeit auch noch ein paar ergänzen, falls jemand Vorschläge hat, immer her damit. Ich habe auf http://apoc.sixserv.org/requestinfo ein kleines Skript am laufen das nützliche Informationen zum HTTP-Request liefert, das kann zum Experimentieren mit Mechanize sehr nützlich sein. Einige Beispiele findet man auch in den GUIDE und EXAMPLES Dateien des Mechanize Pakets. Weiterlesen »
ZDF Mediathek FAIL von nks
Bisher habe ich das Öffentlich Rechtliche Projekt ZDF Mediathek nahezu täglich benutzt. ZDF Mediathek benutzte bis vor wenigen Tagen Windows Media Streams, welche sich wunderbar mit mplayerplug-in oder mit der URL des streams auch super mit mplayer etc anschauen ließen, doch damit ist nun Schluss – die ZDF Mediathek benutzt nun Flash Streaming. Ich kann diesen Schritt nicht nachvollziehen, Flash Videos unter Linux
machen einfach keinen Spaß. Vollbild oder das schauen während dem surfen sind somit Vergangenheit. Mit einem einfachem “mplayer -dumpstream -playlist URL” ließen sich hervorragend Aufnahmen machen, der Digitale Videorecorder quasi.
Ich befürchte das genau dies die verantwortlichen des ZDF dazu bewegt hat auf Flash Basiertes Streaming umzustellen. Ich erwarte von den Öffentlich Rechtlichen allerdings das, wenn Sie schon keine offenen Standards nutzen, die zumindest zumutbar nutzbar unter allen System laufen sollten. Im ZDF Forum wird auch heftig diskutiert – ich stehe nicht alleine mit der Meinung das Flash Streams schlichtweg SCHEISSE sind.
Die Möglichkeit Videos mit externen Playern zu schauen war für mich einer der Gründe mich überhaupt näher mit dem ZDF Programm auseinanderzusetzen. Neben “heute” und dem “Auslandsjournal” habe ich mir gelegentlich einige andere Sendungen/Dokumentationen angesehen – damit ist nun Schluss. Ich werde die ZDF Mediathek ab sofort boykottieren.
ZDF schließt so nicht nur Besitzer leistungsschwacher Rechner aus, sondern evtl auch welche die über ihre Set-top Boxen die ZDF Mediathek benutzten – und das obwohl sie damit die Kompatibilität angeblich steigern wollen.
Ich habe noch nie einen Fernseher besessen und dies ist für mich ein weiterer Schritt weg von diesem Medium. Die TV Sender scheinen es einfach nicht verstanden zu haben. Wahrscheinlich wird Sie in nicht allzu ferner Zeit das selbe Schicksal treffen wie die Musik-Industrie – die Netz-Generation wird sich ihren Medienkonsum selbst gestalten, mit oder ohne Segen der TV Sender. Die MI hat es wenigstens eingesehen und bietet in ihren Onlineshops
DRM-Freie MP3-Files an. Das Fernsehen von Morgen ist Interaktiv und besteht nur noch zu
geringen Teilen aus redaktionellen Inhalten und Programmplänen – die Mediathek war ein Schritt in die richtige Richtung, doch nun hat das ZDF wieder einen Schritt zurück gemacht.
@ZDF: Shame on you!
Das war wirklich die falsche Entscheidung!
Ein User weniger…
Nachtrag aus dem ZDF Forum:
“Wir wollen ein Format verwenden, das auf allen Browsern und Betriebssystemen abspielbar ist – deshalb Flash. übrigens sind die WMV/H.264-Streams noch abrufbar. Dafür hat jeder Videobeitrag einen eigenen RSS-Feed, in dem die Links auf die Videos enthalten sind.”
- Redaktion ZDFonline (link)
Das überarbeitete ZDF Online Angebot hat scheinbar nicht viele Freunde wie man den ZDF Foren entnehmen kann.
Es bleibt abzuwarten wie das ZDF bzw der Intendant etc reagieren…
Falls es mich dennoch nach Dokumentationen lüstet werde ich wie bisher
auch das ARTE-Angebot ARTE Plus7 benutzen.
Update:
apoc hat nen tolles Script zum Downloaden/Abspielen der WMV-Streams geschrieben. Diese sind ja NOCH im RSS-Feed zu beziehen. Danke an apoc (ich war zu faul mir da was zu scripten
)
2 .Update:
Das ZDF reagiert scheinbar auf die Kritik:
…
haben Sie bitte noch etwas Geduld mit der Mediathek. In der nächsten Version läuft diese auch wieder ohne Flash. Daran, dass die Videos nicht bei allen in der gewohnten Qualität laufen, arbeiten wir gerade.
…
- Redaktion ZDFonline (link)
3. Update:
ZDF kündigt folgendes an:
Wir nehmen auch die Kritik an der Ladezeit der Seiten und an die Berichte über die Probleme mit dem Abspielen der Videos sehr ernst. Denn natürlich wollen wir schnell und einfach erreichbar sein. Ruckelnde Videos und “Stream not found”- Meldungen sind natürlich ärgerlich. Die Ursachen können aber sehr vielfältig sein. Wir arbeiten auf Hochtouren daran. Bei den technischen Fehlern merken Sie hoffentlich schon sehr bald eine Besserung. Bei den Entwicklungsprojekten dauert es in der Tat länger – wie einige User hier im Forum schon treffend angemerkt haben. Deshalb wird es eine Mediathek ohne Flash leider nicht vor Herbst geben können.
- Redaktion ZDFonline (link)
Warten bis Herbst aber immerhin…
implementing bittorrent (teil 2) von nks
Was macht ein BitTorrent-Tracker? In diesem Teil gehe ich auf die Funktion eines BitTorrent-Trackers ein. Zuerst sollte man sich den Grundsätzlichen Ablauf eines Torrent Downloads anschauen.
1. Download der .torrent-Datei
Der User sucht sich aus seiner Lieblings-Torrent-Quelle (zb TPB, Demonoid, dnbtracker.org ) einen den gewünschten Torrent heraus und lädt ihn auf Seine Festplatte oder öffnet ihn gleich mit seinem BitTorrent-Client.
2. Der Client parst die .torrent-Datei
Für die Kommunikation mit dem Tracker sind nur ein Paar Informationen aus der Metafile interessant (Metafile Infos im ersten Teil)
- der info hash
- die announce urls
3. Der Client kontaktiert den Tracker und sendet ihm den SHA Hash
Die Tracker-Kommunikation läuft über HTTP.
Der Client Schickt einen GET-Request an den Tracker.
Dieser Request besteht aus:
- announce url
- info hash – der SHA1 Hash des Info Dictionaries
- peer id
- port
- uploaded
- downloaded
- left
- compact
- event
Optional aber auch interessant ist:
- key (damit der Tracker einen Client auch nach einem reconnect mit neuer IP wiedererkennt)
Ein Request an einen Tracker könnte dann wie folgt aussehen ( der Tracker laeuft auf example.com):
- http://example.com/announceUrl+”?info_hash=”+urlencode(info)+”&peer_id=-ST-0001%29%7B%D6%40%F4%21%7B%5C%DA%05%DE&port=6881&uploaded=0&downloaded=0&left=0&compact=1&event=started”
Der Tracker erfährt damit von uns folgende Informationen:
- den Hash von der Info-Map (info_hash)
- nsere Peer-ID (peer_id) [zur ID bald mehr]
- den Port auf dem unser Client lauscht (port)
- wir haben noch 0 Pieces hochgeladen (uploaded=0)
- wir haben 0 Pieces heruntergeladen (downloaded=0)
- wir möchten eine Peer-Liste im Kompakten Format (compact=1), das ist auch üblich so. Das alte Format wird praktisch kaum noch genutzt.
- mit dem Event (event=started) teilen wir dem Tracker mit das wir gerade erst mit dem Download beginnen.
4. Tracker Antwort
Der Tracker antwortet mit einer Liste von Peers. Aus dieser Liste kann der Client entnehmen welche Peers die File besitzen. Ob Sie die ganze File besitzen oder nur Fragmente (aus dieser Information wird die obligatorische anzeige der Seeder [complete] bzw Peers [incomplete] realisiert).
Zu den Einzelnen Peers sind die Informationen die dieses bei ihrem Request an den Tracker übertragen haben enthalten, also:
- peer_id
- port
- ip
Zusätzlich teilt einem der Tracker den Intervall mit in dem man diese Informationen auffrischen sollte, bzw einen erneuten Request an den Tracker schicken sollte. Clients sollten sich daran halten um ein hämmern bzw Sinnlosen Overhead zu unterbinden.
Das war es für diesen Teil im großen und ganzen. Ein kleiner überblick auf die Tracker Kommunikation.
Ganz Informativ zu diesem Thema ist auch der Vortrag “Tracker fahrn” (@24C3 – download via http://chaosradio.ccc.de/24c3_m4v_2355.html) von Erdgeist, Denis und Cristian Yxen.
Im nächsten Teil wird es um die Kommunikation unter den Peers gehen.
vBrowseFile 0.0.08-rc2 first file release von apoc
Habe gestern das erste testing Release von vBrowseFile veröffentlicht.
Installation(auszug aus der README-Datei):
- install HTTP_Download with pear
For Debian you could do this with:
# aptitude install php-pear
# pear install --alldeps HTTP_Download
- Make sure .htaccess Files are used
Change VHost setting: "AllowOverride All"
- Download vBroweFile Files to an webroot/vhost-root:
Download an packaged vbf version.
- or -
Checkout the latest SVN version: (will create vbrowsefile/ directory)
$ svn co svn://mount.at/geekosphere/vbrowsefile/trunk vbrowsefile/
- Make sure the following Directories are writeable by Webserver:
/flatfiles
/flatfiles/cache
/flatfiles/cache/tracks
/flatfiles/userquery
/smarty/templates_c
- Go with your browser to the setup.php script:
e.g. http://example.com/vbrowsefile/setup.php
- Now you could login, change configuration, add some virtual directories
and create some normal users
PoC: Real Bandwidth Limiting with PHP von apoc
vBrowseFile uses a slightly modificated Version of HTTP_Download. HTTP_Download is a Pear-Module to send local Files to Browser:
Provides an interface to easily send hidden files or any arbitrary data to HTTP clients. HTTP_Download can gain its data from variables, files or stream resources.
It features:
- Basic caching capabilities
- Basic throttling mechanism
- On-the-fly gzip-compression
- Ranges (partial downloads and resuming)
- Delivery of on-the-fly generated archives through Archive_Tar and Archive_Zip
- Sending of PgSQL LOBs without the need to read all data in prior to sending
I added a ThrottleCallback functionality to HTTP_Download, a function that is executed after the BufferSize is transferred and the ThrottleDelay Time is waited. Modifications in HTTP/Download.php:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | var $throttleCallback = null; [...] function setThrottleCallback($callback) { $this->throttleCallback = $callback; } [...] function callThrottleCallback() { // execute callback if($this->throttleCallback != null) { $callback = $this->throttleCallback; $callback($this); } } [...] function sendChunk($chunk, $cType = null, $bound = null) { [...] // right after sleep is ex $this->callThrottleCallback(); [...] } |
This Callback could be used to track the download progress and to create a real bandwidth limitation. HTTP_Download supports a basic throttling mechanism to limit the bandwidth, but this only works for one connection, so e.g. you could limit 2 downloads to each 100 KiB/s but not all 2 downloads to each 50 KiB/s to limit the overall bandwidth to 100 KiB/s, instead it would be 200 KiB/s.
For this real bandwidth limiting you could use Apache modules like cband(seems not to work with php) or mod-bw, or you could use tc. Siyb from Geekosphere wrote an article about mod-bw: Limit Bandwidth per vHost in Apache2 (on Debian/Lenny)
Another possible way to limit the bandwidth is to implement it with HTTP_Download. The Theory is, to track all running downloads and change the BufferSize to := download limit * delay / active connections every
More detailed:
- We generate a random connection id(i call it rcid) for the tracking file.
- ThrottleDelay is set to 1 seconds.
- BufferSize is set to 100 KiB * 1 Seconds * 1024 to setup a maximum speed of 100KiB/s.
- The Callback would now be executed every 1 Seconds:
- create or overwrite our own rcid file with time() inside.
- search for other rcid files and check there time-stamp. tracking files older then 5 seconds would be deleted.
- count all rcid tracking files. e.g. 2 means there 2 open download connections.
- change the BufferSize. e.g. for 2 open connections: (100 KiB * 1 Seconds * 1024) / 2
This would limit the overall bandwidth of all active connections to a maximum of 100 KiB/s with a delay of ~ <5 Seconds. Without any Apache Modules or other standalone traffic sharping tools. For small installations this should work with no problem but for bigger installations a more efficient traffic shaping tool would be more effective.
Example Implementation: Weiterlesen »
Soup.io rbot Plugin/ ruby API von apoc
Mit Twitter kann ich sehr leicht über meinen rbot publizieren, damit ich in der selben Frequenz auch soup.io verwende, was für spezielleren Content besser geeignet ist, muss es schon ebenfalls über den rbot funktionieren. Nach langem suchen stellte ich überrascht fest das das große Web 2.0 Projekt Soup.io keine API zum leichten publizieren(außerhalb des Browsers) besitzt. Da muss also erstmal eine art API gestrickt werden. Mit Hilfe von Mechanize baute ich die Browseranfragen nach und fasste es in einer kleinen Ruby Klasse zusammen. Es wird nicht jeder Content-Typ unterstützt aber für meine Zwecke reicht dies völlig aus. Dann noch schnell eine rbot-Plugin Klasse zum bedienen der eigenen “API” und fertig war die erste Version meines soupio-Plugins.
Hier eine Liste der möglichen Befehle(Argumente in eckigen Klammern sind Optional):
1 2 3 4 5 6 7 8 9 10 11 | soup identify <username> <password> => Jeder Benutzer im Channel kann dem Bot seine Soup.io-Zugangsdaten im Query mitteilen. soup login => Neuer Login falls die gespeicherte SessionId verloren oder ungültig wird. (Normalerweise nicht notwendig.) soup link <url> [<title>] soup image <url> [<description>] soup text <text> soup quote <source>: <quote> soup video <youtube-url> [<description>] |
Die SoupIoClass-Klasse kann übrigens auch außerhalb des Plugins, in jeder Ruby-Anwendung verwendet werden. Hier eine kleine Referenz, diesmal die optionalen Argumente in spitzen Klammern:
1 2 3 4 5 6 | soup = SoupIoClass.new('[Username]', '[Password]'<, '[Domain]', '[Session-ID]'>) soup.new_link '[URL]'<, '[Title]', '[Description]'> soup.new_image '[URL]'<, '[Description]'> soup.new_text '[Text]'<, '[Title]'> soup.new_quote '[Quote]'<, '[Source]'> soup.new_video '[Youtube-URL]'<, '[Description]'> |
Die Domain und SessionId kann mit soup.sessid und soup.domain abgefragt werden. Die SessionId ist praktisch unbegrenzt lange haltbar, weshalb diese beiden Daten zwischengespeichert werden können um bei häufiger Nutzung der Klasse sich nicht ständig neu Anmelden zu müssen.
Die Version 0.1 ist bereits veröffentlicht, ich muss mich noch um die Validierung und Fehlerabfragen kümmern aber sonst sollte das Plugin schon funktionieren. Fehler bitte bei mir Melden.
Update: Version 0.2 veröffentlicht. (nur kleine Änderungen)
Update: Version 0.3 veröffentlicht. (Bugfix für eigene Domains)
Update: Version 0.4 veröffentlicht. (Änderungen an soup.io)
Google Fail von apoc
Jede Seite wird zurzeit von Google als Malware erkannt. Habe es auch von den USA aus(ivacy) getestet, das selbe Ergebnis. Updates soon
Update: Es geht wieder, dauerte ca. 40minuten nach meiner Einschätzung.
Update: Weitere Links eingefügt.
- http://digg.com/tech_news/Someone_is_about_to_get_fired_at_Google
- http://www.lookpic.com/files/googowned.png
- http://www.heise.de/newsticker/Google-warnt-bei-allen-Suchtreffern-vor-Malware–/meldung/126681
- http://blog.stopbadware.org/2009/01/31/google-glitch-causes-confusion:
“This morning, an apparent glitch at Google caused nearly every [update 11:44 am] search listing to carry the “Warning! This site may harm your computer” message. Users who attempted to click through the results saw the “interstitial” warning page that mentions the possibility of badware and refers people to StopBadware.org for more information. This led to a denial of service of our website, as millions of Google users attempted to visit our site for more information. We are working now to bring the site back up. We are also awaiting word from Google about what happened to cause the false warnings.”
- Offizielle Erklärung: http://googleblog.blogspot.com/2009/01/this-site-may-harm-your-computer-on.html:
“What happened? Very simply, human error. Google flags search results with the message “This site may harm your computer” if the site is known to install malicious software in the background or otherwise surreptitiously. We do this to protect our users against visiting sites that could harm their computers. We maintain a list of such sites through both manual and automated methods. We work with a non-profit called StopBadware.org to come up with criteria for maintaining this list, and to provide simple processes for webmasters to remove their site from the list.
We periodically update that list and released one such update to the site this morning. Unfortunately (and here’s the human error), the URL of ‘/’ was mistakenly checked in as a value to the file and ‘/’ expands to all URLs. Fortunately, our on-call site reliability team found the problem quickly and reverted the file. Since we push these updates in a staggered and rolling fashion, the errors began appearing between 6:27 a.m. and 6:40 a.m. and began disappearing between 7:10 and 7:25 a.m., so the duration of the problem for any particular user was approximately 40 minutes.”
vBrowseFile: development von apoc
Ich bin gerade dabei einen kleinen “Filebrowser” zu entwickeln. Dieser zeigt nicht zwangsläufig das reale Dateisystem an, sondern ist in der Lage mehrere real existierende Ordner zu einem virtuellen Ordner zusammen zu legen. Er ist nur zum einfachen herunterladen von Dateien gedacht, eine Upload-Funktion ist nicht geplant, eben sowenig wie das Umbenennen oder Löschen von Dateien. Zum Einsatz kommt PHP5, Smarty und das Pear-Paket HTML_Downloader.
siyb von Geekosphere(danke nochmal!) hat mir ein Redmine und Subversion eingerichtet.
Alles weitere wird es dann dort geben.
For our english speaking visitors:
Recently i began to develop a small Filebrowser. It does not necessarily show the real Filesystem but it can combine several directories to one virtual. The purpose is just to realise an easy way of downloading files, other features used in a common filemanager like the renaming or deleting of files are not planned. I use PHP5, Smarty and the Pear-Package HTTP_Download.
Thanks to siyb, now i can provide more informations at geekosphere wootcenter(redmine).





