<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Python on bramp.net</title>
    <link>https://blog.bramp.net/</link>
    <description>Recent content in Python on bramp.net</description>
    <generator>Hugo -- gohugo.io</generator>
    <language>en-GB</language>
    <lastBuildDate>Mon, 24 Jan 2011 00:00:00 +0000</lastBuildDate>
    <atom:link href="https://blog.bramp.net/tags/python/" rel="self" type="application/rss+xml" />
    
    <item>
      <title>Intel ucode firmware version parser</title>
      <link>https://blog.bramp.net/post/2011/01/24/intel-ucode-firmware-version-parser/</link>
      <pubDate>Mon, 24 Jan 2011 00:00:00 +0000</pubDate>
      
      <guid>https://blog.bramp.net/post/2011/01/24/intel-ucode-firmware-version-parser/</guid>
      <description><p>Out of fun I wrote a simple Python script to pull the version number out of Intel’s ucode firmware, for example, the firmware used by my wifi driver. I needed this so I could see what version I was running versus a new version I had downloaded from <a href="http://intellinuxwireless.org/?n=Downloads">Intel’s Linux Wireless site</a>.</p>
<p>So here is the code if anyone finds it interesting:</p>
<p>and example of using it is:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">$ ./ucode.py /lib/firmware/*.ucode
</span></span><span class="line"><span class="cl">iwlwifi-1000-3.ucode    : ver 128.50.3.1
</span></span><span class="line"><span class="cl">iwlwifi-3945-1.ucode    : ver 15.28.1.6
</span></span><span class="line"><span class="cl">iwlwifi-3945-2.ucode    : ver 15.32.2.9
</span></span><span class="line"><span class="cl">iwlwifi-4965-1.ucode    : ver 228.57.1.21
</span></span><span class="line"><span class="cl">iwlwifi-4965-2.ucode    : ver 228.61.2.24
</span></span><span class="line"><span class="cl">iwlwifi-5000-1.ucode    : ver 5.4.1.16
</span></span><span class="line"><span class="cl">iwlwifi-5000-2.ucode    : ver 8.24.2.12
</span></span><span class="line"><span class="cl">iwlwifi-5150-2.ucode    : ver 8.24.2.2
</span></span><span class="line"><span class="cl">iwlwifi-6000-4.ucode    : ver 9.221.4.1
</span></span><span class="line"><span class="cl">iwlwifi-6000g2a-5.ucode : ver 17.168.5.1 <span class="o">(</span>6000g2a fw v17.168.5.1 build 33993<span class="o">)</span>
</span></span><span class="line"><span class="cl">iwlwifi-6000g2b-5.ucode : ver 17.168.5.1 <span class="o">(</span>6000g2b fw v17.168.5.1 build 33993<span class="o">)</span>
</span></span><span class="line"><span class="cl">iwlwifi-6050-4.ucode    : ver 9.201.4.1
</span></span><span class="line"><span class="cl">iwlwifi-6050-5.ucode    : ver 41.28.5.1 <span class="o">(</span><span class="m">6050</span> fw v41.28.5.1 build 33926<span class="o">)</span>
</span></span></code></pre></div></description>
    </item>
    
    <item>
      <title>UTF-8 Directory Listing</title>
      <link>https://blog.bramp.net/post/2010/09/23/utf-8-directory-listing/</link>
      <pubDate>Thu, 23 Sep 2010 00:00:00 +0000</pubDate>
      
      <guid>https://blog.bramp.net/post/2010/09/23/utf-8-directory-listing/</guid>
      <description><p>I had a need to create a directory listing with all the UTF-8 characters intact. This seems quite a chore on Windows, as doing anything via the shell seems to mangle the characters and show ???? instead of the real characters. For example, both the built in <strong>dir</strong> and Cygwin <strong>ls</strong> or <strong>find</strong> seemed affected. This turns out to be a <a href="http://stackoverflow.com/questions/379240/is-there-a-windows-command-shell-that-will-display-unicode-characters">limitation in the windows shell</a>.</p>
<p>To solve this problem I wrote a bit of python to read the file names in full UTF-8 and output the results directly to a file (and not via a pipe, which would again be via the shell). The resulting very simple script is as follows:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="kn">import</span> <span class="nn">os</span>
</span></span><span class="line"><span class="cl"><span class="kn">import</span> <span class="nn">codecs</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">log</span> <span class="o">=</span> <span class="n">codecs</span><span class="o">.</span><span class="n">open</span><span class="p">(</span><span class="s1">&#39;listing&#39;</span><span class="p">,</span> <span class="n">mode</span><span class="o">=</span><span class="s1">&#39;w&#39;</span><span class="p">,</span> <span class="n">encoding</span><span class="o">=</span><span class="s2">&#34;utf-8&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="k">for</span> <span class="n">root</span><span class="p">,</span> <span class="n">dirs</span><span class="p">,</span> <span class="n">files</span> <span class="ow">in</span> <span class="n">os</span><span class="o">.</span><span class="n">walk</span><span class="p">(</span><span class="sa">u</span><span class="s1">&#39;.&#39;</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">	<span class="n">log</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="n">root</span> <span class="o">+</span> <span class="sa">u</span><span class="s2">&#34;</span><span class="se">\n</span><span class="s2">&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">	<span class="k">for</span> <span class="n">file</span> <span class="ow">in</span> <span class="nb">sorted</span><span class="p">(</span><span class="n">files</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">		<span class="n">log</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">root</span><span class="p">,</span> <span class="n">file</span><span class="p">)</span> <span class="o">+</span> <span class="sa">u</span><span class="s2">&#34;</span><span class="se">\n</span><span class="s2">&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">log</span><span class="o">.</span><span class="n">close</span><span class="p">()</span>
</span></span></code></pre></div></description>
    </item>
    
    <item>
      <title>Persec python script</title>
      <link>https://blog.bramp.net/post/2010/08/31/persec-python-script/</link>
      <pubDate>Tue, 31 Aug 2010 00:00:00 +0000</pubDate>
      
      <guid>https://blog.bramp.net/post/2010/08/31/persec-python-script/</guid>
      <description><p>A while ago I wrote a python script that does a similar job to GNU’s <a href="http://linux.die.net/man/1/watch">watch</a> command. You use it like so:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">./persec.py <span class="o">[</span>--interval<span class="o">=</span><span class="p">&amp;</span>lt<span class="p">;</span>n<span class="p">&amp;</span>gt<span class="p">;</span><span class="o">]</span> <span class="p">&amp;</span>lt<span class="p">;</span>command<span class="p">&amp;</span>gt<span class="p">;</span>
</span></span></code></pre></div><p>so for example</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">./persec.py ifconfig
</span></span></code></pre></div><p>Now in a similar way to watch, it executes the command every second, and highlights the differences between each execution. However, in addition to this it finds any numbers that have changed and works out the rate at which they are changing. So for example, ifconfig would typically output this:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">usb0      Link encap:Ethernet  HWaddr 02:04:4b:00:d3:cf
</span></span><span class="line"><span class="cl">          inet addr:10.0.0.2  Bcast:10.0.0.255  Mask:255.255.255.0
</span></span><span class="line"><span class="cl">          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
</span></span><span class="line"><span class="cl">          RX packets:1017422291 errors:0 dropped:0 overruns:0 frame:0
</span></span><span class="line"><span class="cl">          TX packets:549382406 errors:0 dropped:0 overruns:0 carrier:0
</span></span><span class="line"><span class="cl">          collisions:0 txqueuelen:1000
</span></span><span class="line"><span class="cl">          RX bytes:1910704266 (1.9 GB)  TX bytes:1834667124 (1.8 GB)
</span></span></code></pre></div><p>but now outputs something like:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">usb0      Link encap:Ethernet  HWaddr 02:04:4b:00:d3:cf
</span></span><span class="line"><span class="cl">          inet addr:10.0.0.2  Bcast:10.0.0.255  Mask:255.255.255.0
</span></span><span class="line"><span class="cl">          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
</span></span><span class="line"><span class="cl">          RX packets:&lt;b&gt;2001/s&lt;/b&gt; errors:0 dropped:0 overruns:0 frame:0
</span></span><span class="line"><span class="cl">          TX packets:&lt;b&gt;2002/s&lt;/b&gt; errors:0 dropped:0 overruns:0 carrier:0
</span></span><span class="line"><span class="cl">          collisions:0 txqueuelen:1000
</span></span><span class="line"><span class="cl">          RX bytes:&lt;b&gt;168120/s&lt;/b&gt; (1.9 GB)  TX bytes:&lt;b&gt;217144/s&lt;/b&gt; (1.8 GB)
</span></span></code></pre></div><p>Notice the per second (/s) values for RX/TX packets and RX/TX bytes. I have found this quite useful many times in the past, on commands such as:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">./persec.py cat /proc/interrupts
</span></span><span class="line"><span class="cl">./persec.py df
</span></span><span class="line"><span class="cl">./persec.py ls -l somefile
</span></span></code></pre></div><p><a href="https://raw.githubusercontent.com/bramp/handy-tools/master/persec.py">Download version 1.1</a> or <a href="https://github.com/bramp/handy-tools/blob/master/persec.py">View on Github</a></p>
</description>
    </item>
    
    <item>
      <title>Python close_fds issue</title>
      <link>https://blog.bramp.net/post/2010/05/11/python-close_fds-issue/</link>
      <pubDate>Tue, 11 May 2010 00:00:00 +0000</pubDate>
      
      <guid>https://blog.bramp.net/post/2010/05/11/python-close_fds-issue/</guid>
      <description><p>So I spent the better part of my evening trying to track down a bug, which turns out to be a “feature” of python.</p>
<p>I had just installed the <a href="http://trac-hacks.org/wiki/GitPlugin">GitPlugin</a> for <a href="http://trac.edgewall.org/">trac</a> but I started to experience problems. When browsing the source inside trac it was taking over 30seconds to load the page and sometimes it would fail completely. A lot of searching didn’t help much, so I attempted to debug the problem myself. The first thing I noticed was Apache was taking 100% of the processor for a good 30seconds. I attached <a href="http://en.wikipedia.org/wiki/Strace">strace</a> to it and saw something like this:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">[pid 22682] close(43029)                = -1 EBADF (Bad file descriptor)
</span></span><span class="line"><span class="cl">[pid 22682] close(43030)                = -1 EBADF (Bad file descriptor)
</span></span><span class="line"><span class="cl">[pid 22682] close(43031)                = -1 EBADF (Bad file descriptor)
</span></span><span class="line"><span class="cl">[pid 22682] close(43032)                = -1 EBADF (Bad file descriptor)
</span></span><span class="line"><span class="cl">[pid 22682] close(43033)                = -1 EBADF (Bad file descriptor)
</span></span><span class="line"><span class="cl">[pid 22682] close(43034)                = -1 EBADF (Bad file descriptor)
</span></span><span class="line"><span class="cl">[pid 22682] close(43035)                = -1 EBADF (Bad file descriptor)
</span></span><span class="line"><span class="cl">[pid 22682] close(43036)                = -1 EBADF (Bad file descriptor)
</span></span></code></pre></div><p>This obviously didn’t look good! After some tinkering I found the problem went away when I ran trac <a href="http://trac.edgewall.org/wiki/TracStandalone">standalone</a>, instead of using <a href="http://www.modpython.org/">mod_python</a> or <a href="http://en.wikipedia.org/wiki/FastCGI">fcgi</a>. This turned out to be a bit of a red herring because I spent my time trying to figure out what was different between a standalone executable and one being run inside Apache.</p>
<p>After playing around with environment variables, I gave up and attempted to printf debug the trac git plugin. I found that the actual call to git was taking on the order of seconds, whereas calling it myself from the command took milliseconds. The line of code (in PyGIT.py) looked a bit like this:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="n">p</span> <span class="o">=</span> <span class="n">Popen</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__build_git_cmd</span><span class="p">(</span><span class="n">git_cmd</span><span class="p">,</span> <span class="o">*</span><span class="n">cmd_args</span><span class="p">),</span> <span class="n">stdin</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">stdout</span><span class="o">=</span><span class="n">PIPE</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">			                                        <span class="n">stderr</span><span class="o">=</span><span class="n">PIPE</span><span class="p">,</span> <span class="n">close_fds</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
</span></span></code></pre></div><p>Now, when I removed the close_fds argument the problems went away! After some more digging I found this <a href="http://bugs.python.org/issue8052">bug report</a> which describes the behaviour of close_fds. Python will spin in a tight loop calling close for all possible valid fd number just incase it was previously used. WTF! You can see the python <a href="http://svn.python.org/projects/python/tags/r311/Lib/subprocess.py">code here</a>:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="k">def</span> <span class="nf">_close_fds</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">but</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">    <span class="n">os</span><span class="o">.</span><span class="n">closerange</span><span class="p">(</span><span class="mi">3</span><span class="p">,</span> <span class="n">but</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="n">os</span><span class="o">.</span><span class="n">closerange</span><span class="p">(</span><span class="n">but</span> <span class="o">+</span> <span class="mi">1</span><span class="p">,</span> <span class="n">MAXFD</span><span class="p">)</span>
</span></span></code></pre></div><p>So the simple fix to this was to remove the close_fds, so that Python doesn’t stupidly spin calling close(). I suspect the reason I only noticed this when running inside Apache, is because Apache must have a larger MAXFD. Hopefully in the future Python will change this behaviour and find a more sensible way to close all file descriptors, especially when I read this <a href="http://bugs.python.org/issue7213">bug report</a> which advises changing close_fds default to true.</p>
</description>
    </item>
    
    <item>
      <title>Follow HTTP Stream (with decompression)</title>
      <link>https://blog.bramp.net/post/2010/01/10/follow-http-stream-with-decompression/</link>
      <pubDate>Sun, 10 Jan 2010 00:00:00 +0000</pubDate>
      
      <guid>https://blog.bramp.net/post/2010/01/10/follow-http-stream-with-decompression/</guid>
      <description><p>I was using <a href="http://www.wireshark.org/">Wireshark</a> to capture an exchange of HTTP packets, however, some of the HTTP responses were using “content-encoding: gzip”, which meant I couldn’t view them decompressed in the “Follow TCP Stream”. Wireshark does decompress them in Packet Details view, but it is hard to follow the full stream like this.</p>
<p>The solution was to write some <a href="http://www.python.org/">Python</a> which made use of the <a href="http://code.google.com/p/dpkt/">dpkt library</a>. My code naively reassembles the TCP flow and then assumes traffic on port 80 is HTTP. Therefore there is much room for improvement, but here is the code anyway.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="ch">#!/usr/bin/env python</span>
</span></span><span class="line"><span class="cl"><span class="c1"># Turns a pcap file with http gzip compressed data into plain text, making it</span>
</span></span><span class="line"><span class="cl"><span class="c1"># easier to follow.</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kn">import</span> <span class="nn">dpkt</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="k">def</span> <span class="nf">tcp_flags</span><span class="p">(</span><span class="n">flags</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">	<span class="n">ret</span> <span class="o">=</span> <span class="s1">&#39;&#39;</span>
</span></span><span class="line"><span class="cl">	<span class="k">if</span> <span class="n">flags</span> <span class="o">&amp;</span> <span class="n">dpkt</span><span class="o">.</span><span class="n">tcp</span><span class="o">.</span><span class="n">TH_FIN</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">		<span class="n">ret</span> <span class="o">=</span> <span class="n">ret</span> <span class="o">+</span> <span class="s1">&#39;F&#39;</span>
</span></span><span class="line"><span class="cl">	<span class="k">if</span> <span class="n">flags</span> <span class="o">&amp;</span> <span class="n">dpkt</span><span class="o">.</span><span class="n">tcp</span><span class="o">.</span><span class="n">TH_SYN</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">		<span class="n">ret</span> <span class="o">=</span> <span class="n">ret</span> <span class="o">+</span> <span class="s1">&#39;S&#39;</span>
</span></span><span class="line"><span class="cl">	<span class="k">if</span> <span class="n">flags</span> <span class="o">&amp;</span> <span class="n">dpkt</span><span class="o">.</span><span class="n">tcp</span><span class="o">.</span><span class="n">TH_RST</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">		<span class="n">ret</span> <span class="o">=</span> <span class="n">ret</span> <span class="o">+</span> <span class="s1">&#39;R&#39;</span>
</span></span><span class="line"><span class="cl">	<span class="k">if</span> <span class="n">flags</span> <span class="o">&amp;</span> <span class="n">dpkt</span><span class="o">.</span><span class="n">tcp</span><span class="o">.</span><span class="n">TH_PUSH</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">		<span class="n">ret</span> <span class="o">=</span> <span class="n">ret</span> <span class="o">+</span> <span class="s1">&#39;P&#39;</span>
</span></span><span class="line"><span class="cl">	<span class="k">if</span> <span class="n">flags</span> <span class="o">&amp;</span> <span class="n">dpkt</span><span class="o">.</span><span class="n">tcp</span><span class="o">.</span><span class="n">TH_ACK</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">		<span class="n">ret</span> <span class="o">=</span> <span class="n">ret</span> <span class="o">+</span> <span class="s1">&#39;A&#39;</span>
</span></span><span class="line"><span class="cl">	<span class="k">if</span> <span class="n">flags</span> <span class="o">&amp;</span> <span class="n">dpkt</span><span class="o">.</span><span class="n">tcp</span><span class="o">.</span><span class="n">TH_URG</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">		<span class="n">ret</span> <span class="o">=</span> <span class="n">ret</span> <span class="o">+</span> <span class="s1">&#39;U&#39;</span>
</span></span><span class="line"><span class="cl">	<span class="k">if</span> <span class="n">flags</span> <span class="o">&amp;</span> <span class="n">dpkt</span><span class="o">.</span><span class="n">tcp</span><span class="o">.</span><span class="n">TH_ECE</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">		<span class="n">ret</span> <span class="o">=</span> <span class="n">ret</span> <span class="o">+</span> <span class="s1">&#39;E&#39;</span>
</span></span><span class="line"><span class="cl">	<span class="k">if</span> <span class="n">flags</span> <span class="o">&amp;</span> <span class="n">dpkt</span><span class="o">.</span><span class="n">tcp</span><span class="o">.</span><span class="n">TH_CWR</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">		<span class="n">ret</span> <span class="o">=</span> <span class="n">ret</span> <span class="o">+</span> <span class="s1">&#39;C&#39;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">	<span class="k">return</span> <span class="n">ret</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="k">def</span> <span class="nf">parse_http_stream</span><span class="p">(</span><span class="n">stream</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">	<span class="k">while</span> <span class="nb">len</span><span class="p">(</span><span class="n">stream</span><span class="p">)</span> <span class="o">&amp;</span><span class="n">gt</span><span class="p">;</span> <span class="mi">0</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">		<span class="k">if</span> <span class="n">stream</span><span class="p">[:</span><span class="mi">4</span><span class="p">]</span> <span class="o">==</span> <span class="s1">&#39;HTTP&#39;</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">			<span class="n">http</span> <span class="o">=</span> <span class="n">dpkt</span><span class="o">.</span><span class="n">http</span><span class="o">.</span><span class="n">Response</span><span class="p">(</span><span class="n">stream</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">			<span class="nb">print</span> <span class="n">http</span><span class="o">.</span><span class="n">status</span>
</span></span><span class="line"><span class="cl">		<span class="k">else</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">			<span class="n">http</span> <span class="o">=</span> <span class="n">dpkt</span><span class="o">.</span><span class="n">http</span><span class="o">.</span><span class="n">Request</span><span class="p">(</span><span class="n">stream</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">			<span class="nb">print</span> <span class="n">http</span><span class="o">.</span><span class="n">method</span><span class="p">,</span> <span class="n">http</span><span class="o">.</span><span class="n">uri</span>
</span></span><span class="line"><span class="cl">		<span class="n">stream</span> <span class="o">=</span> <span class="n">stream</span><span class="p">[</span><span class="nb">len</span><span class="p">(</span><span class="n">http</span><span class="p">):]</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="k">def</span> <span class="nf">parse_pcap_file</span><span class="p">(</span><span class="n">filename</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">	<span class="c1"># Open the pcap file</span>
</span></span><span class="line"><span class="cl">	<span class="n">f</span> <span class="o">=</span> <span class="nb">open</span><span class="p">(</span><span class="s1">&#39;market.pcap&#39;</span><span class="p">,</span> <span class="s1">&#39;rb&#39;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">	<span class="n">pcap</span> <span class="o">=</span> <span class="n">dpkt</span><span class="o">.</span><span class="n">pcap</span><span class="o">.</span><span class="n">Reader</span><span class="p">(</span><span class="n">f</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">	
</span></span><span class="line"><span class="cl">	<span class="c1"># I need to reassmble the TCP flows before decoding the HTTP</span>
</span></span><span class="line"><span class="cl">	<span class="n">conn</span> <span class="o">=</span> <span class="nb">dict</span><span class="p">()</span> <span class="c1"># Connections with current buffer</span>
</span></span><span class="line"><span class="cl">	<span class="k">for</span> <span class="n">ts</span><span class="p">,</span> <span class="n">buf</span> <span class="ow">in</span> <span class="n">pcap</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">		<span class="n">eth</span> <span class="o">=</span> <span class="n">dpkt</span><span class="o">.</span><span class="n">ethernet</span><span class="o">.</span><span class="n">Ethernet</span><span class="p">(</span><span class="n">buf</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">		<span class="k">if</span> <span class="n">eth</span><span class="o">.</span><span class="n">type</span> <span class="o">!=</span> <span class="n">dpkt</span><span class="o">.</span><span class="n">ethernet</span><span class="o">.</span><span class="n">ETH_TYPE_IP</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">			<span class="k">continue</span>
</span></span><span class="line"><span class="cl">	
</span></span><span class="line"><span class="cl">		<span class="n">ip</span> <span class="o">=</span> <span class="n">eth</span><span class="o">.</span><span class="n">data</span>
</span></span><span class="line"><span class="cl">		<span class="k">if</span> <span class="n">ip</span><span class="o">.</span><span class="n">p</span> <span class="o">!=</span> <span class="n">dpkt</span><span class="o">.</span><span class="n">ip</span><span class="o">.</span><span class="n">IP_PROTO_TCP</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">			<span class="k">continue</span>
</span></span><span class="line"><span class="cl">	
</span></span><span class="line"><span class="cl">		<span class="n">tcp</span> <span class="o">=</span> <span class="n">ip</span><span class="o">.</span><span class="n">data</span>
</span></span><span class="line"><span class="cl">	
</span></span><span class="line"><span class="cl">		<span class="n">tupl</span> <span class="o">=</span> <span class="p">(</span><span class="n">ip</span><span class="o">.</span><span class="n">src</span><span class="p">,</span> <span class="n">ip</span><span class="o">.</span><span class="n">dst</span><span class="p">,</span> <span class="n">tcp</span><span class="o">.</span><span class="n">sport</span><span class="p">,</span> <span class="n">tcp</span><span class="o">.</span><span class="n">dport</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">		<span class="c1">#print tupl, tcp_flags(tcp.flags)</span>
</span></span><span class="line"><span class="cl">	
</span></span><span class="line"><span class="cl">		<span class="c1"># Ensure these are in order! TODO change to a defaultdict</span>
</span></span><span class="line"><span class="cl">		<span class="k">if</span> <span class="n">tupl</span> <span class="ow">in</span> <span class="n">conn</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">			<span class="n">conn</span><span class="p">[</span> <span class="n">tupl</span> <span class="p">]</span> <span class="o">=</span> <span class="n">conn</span><span class="p">[</span> <span class="n">tupl</span> <span class="p">]</span> <span class="o">+</span> <span class="n">tcp</span><span class="o">.</span><span class="n">data</span>
</span></span><span class="line"><span class="cl">		<span class="k">else</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">			<span class="n">conn</span><span class="p">[</span> <span class="n">tupl</span> <span class="p">]</span> <span class="o">=</span> <span class="n">tcp</span><span class="o">.</span><span class="n">data</span>
</span></span><span class="line"><span class="cl">	
</span></span><span class="line"><span class="cl">		<span class="c1"># TODO Check if it is a FIN, if so end the connection</span>
</span></span><span class="line"><span class="cl">	
</span></span><span class="line"><span class="cl">		<span class="c1"># Try and parse what we have</span>
</span></span><span class="line"><span class="cl">		<span class="k">try</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">			<span class="n">stream</span> <span class="o">=</span> <span class="n">conn</span><span class="p">[</span> <span class="n">tupl</span> <span class="p">]</span>
</span></span><span class="line"><span class="cl">			<span class="k">if</span> <span class="n">stream</span><span class="p">[:</span><span class="mi">4</span><span class="p">]</span> <span class="o">==</span> <span class="s1">&#39;HTTP&#39;</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">				<span class="n">http</span> <span class="o">=</span> <span class="n">dpkt</span><span class="o">.</span><span class="n">http</span><span class="o">.</span><span class="n">Response</span><span class="p">(</span><span class="n">stream</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">				<span class="c1">#print http.status</span>
</span></span><span class="line"><span class="cl">			<span class="k">else</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">				<span class="n">http</span> <span class="o">=</span> <span class="n">dpkt</span><span class="o">.</span><span class="n">http</span><span class="o">.</span><span class="n">Request</span><span class="p">(</span><span class="n">stream</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">				<span class="c1">#print http.method, http.uri</span>
</span></span><span class="line"><span class="cl">	
</span></span><span class="line"><span class="cl">			<span class="nb">print</span> <span class="n">http</span>
</span></span><span class="line"><span class="cl">			<span class="nb">print</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">			<span class="c1"># If we reached this part an exception hasn&#39;t been thrown</span>
</span></span><span class="line"><span class="cl">			<span class="n">stream</span> <span class="o">=</span> <span class="n">stream</span><span class="p">[</span><span class="nb">len</span><span class="p">(</span><span class="n">http</span><span class="p">):]</span>
</span></span><span class="line"><span class="cl">			<span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">stream</span><span class="p">)</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">				<span class="k">del</span> <span class="n">conn</span><span class="p">[</span> <span class="n">tupl</span> <span class="p">]</span>
</span></span><span class="line"><span class="cl">			<span class="k">else</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">				<span class="n">conn</span><span class="p">[</span> <span class="n">tupl</span> <span class="p">]</span> <span class="o">=</span> <span class="n">stream</span>
</span></span><span class="line"><span class="cl">		<span class="k">except</span> <span class="n">dpkt</span><span class="o">.</span><span class="n">UnpackError</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">			<span class="k">pass</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">	<span class="n">f</span><span class="o">.</span><span class="n">close</span><span class="p">()</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="k">if</span> <span class="vm">__name__</span> <span class="o">==</span> <span class="s1">&#39;__main__&#39;</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">	<span class="kn">import</span> <span class="nn">sys</span>
</span></span><span class="line"><span class="cl">	<span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">sys</span><span class="o">.</span><span class="n">argv</span><span class="p">)</span> <span class="o">&amp;</span><span class="n">lt</span><span class="p">;</span><span class="o">=</span> <span class="mi">1</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">		<span class="nb">print</span> <span class="s2">&#34;</span><span class="si">%s</span><span class="s2"> &amp;lt;pcap filename&amp;gt;&#34;</span> <span class="o">%</span> <span class="n">sys</span><span class="o">.</span><span class="n">argv</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>
</span></span><span class="line"><span class="cl">		<span class="n">sys</span><span class="o">.</span><span class="n">exit</span><span class="p">(</span><span class="mi">2</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">	<span class="n">parse_pcap_file</span><span class="p">(</span><span class="n">sys</span><span class="o">.</span><span class="n">argv</span><span class="p">[</span><span class="mi">1</span><span class="p">])</span>
</span></span></code></pre></div><p><strong>Please note</strong>, I had to make a couple of changes to the dpkt library, which I have submitted <a href="http://groups.google.com/group/dpkt/browse_thread/thread/5315199f9749b91a">back for review</a>. Those changes can be found in the following patches <a href="/patches/dpkt-pcap-snaplen.patch">1</a> <a href="/patches/dpkt-http-len.patch">2</a> <a href="/patches/dpkt-http-gz.patch">3</a>. I will update this code if/when the patches get accepted.</p>
</description>
    </item>
    
    <item>
      <title>Autoload symbols for FreeBSD kernel module</title>
      <link>https://blog.bramp.net/post/2009/01/11/autoload-symbols-for-freebsd-kernel-module/</link>
      <pubDate>Sun, 11 Jan 2009 00:00:00 +0000</pubDate>
      
      <guid>https://blog.bramp.net/post/2009/01/11/autoload-symbols-for-freebsd-kernel-module/</guid>
      <description><p>When debugging FreeBSD kernel modules with GDB, you have to tell GDB the correct symbols for the module, and the location the module is loaded in RAM. This is helpfully explained in the <a href="http://www.freebsd.org/doc/en/books/developers-handbook/kerneldebug-kld.html">FreeBSD Developers’ Handbook</a>. First you must load the module, then run kldstat, note down the address the module is loaded at, and finally execute a command in GDB that looks like the following.</p>
<pre tabindex="0"><code>add-symbol-file /sys/modules/linux/linux.ko 0xc0ae22d0
</code></pre><p>However, I find this process tedious, so instead I wrote a quick python script which can be used with an <a href="http://sourceware.org/gdb/wiki/PythonGdb">experimental gdb built with python scripting support</a>.</p>
<p>So here is the script:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="kn">import</span> <span class="nn">gdb</span>
</span></span><span class="line"><span class="cl"><span class="k">class</span> <span class="nc">FreeBSD_ReloadModuleSymbols</span> <span class="p">(</span><span class="n">gdb</span><span class="o">.</span><span class="n">Command</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">	<span class="s2">&#34;Reloads the symbol files for all loaded kernel modules&#34;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">	<span class="k">def</span> <span class="fm">__init__</span> <span class="p">(</span><span class="bp">self</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">		<span class="nb">super</span> <span class="p">(</span><span class="n">FreeBSD_ReloadModuleSymbols</span><span class="p">,</span> <span class="bp">self</span><span class="p">)</span><span class="o">.</span><span class="fm">__init__</span> <span class="p">(</span><span class="s2">&#34;reload-freebsd-module-symbols&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">			<span class="n">gdb</span><span class="o">.</span><span class="n">COMMAND_FILES</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">			<span class="n">gdb</span><span class="o">.</span><span class="n">COMPLETE_NONE</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">	<span class="k">def</span> <span class="nf">invoke</span> <span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">arg</span><span class="p">,</span> <span class="n">from_tty</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">		<span class="n">link</span> <span class="o">=</span> <span class="n">gdb</span><span class="o">.</span><span class="n">parse_and_eval</span><span class="p">(</span><span class="s2">&#34;linker_files-&amp;gt;tqh_first&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">		<span class="k">while</span> <span class="n">link</span> <span class="o">!=</span> <span class="mi">0</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">			<span class="nb">print</span> <span class="n">link</span><span class="p">[</span><span class="s1">&#39;filename&#39;</span><span class="p">]</span><span class="o">.</span><span class="n">string</span><span class="p">()</span>
</span></span><span class="line"><span class="cl">			<span class="k">if</span> <span class="n">link</span><span class="p">[</span><span class="s1">&#39;filename&#39;</span><span class="p">]</span><span class="o">.</span><span class="n">string</span><span class="p">()</span> <span class="o">!=</span> <span class="s2">&#34;kernel&#34;</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">				<span class="n">gdb</span><span class="o">.</span><span class="n">execute</span><span class="p">(</span> <span class="s2">&#34;add-symbol-file &#34;</span> <span class="o">+</span> 
</span></span><span class="line"><span class="cl">					<span class="n">link</span><span class="p">[</span><span class="s1">&#39;pathname&#39;</span><span class="p">]</span><span class="o">.</span><span class="n">string</span><span class="p">()</span> <span class="o">+</span> <span class="s2">&#34; &#34;</span> <span class="o">+</span>  
</span></span><span class="line"><span class="cl">					<span class="nb">str</span><span class="p">(</span><span class="n">link</span><span class="p">[</span><span class="s1">&#39;address&#39;</span><span class="p">]</span><span class="o">.</span><span class="n">address</span><span class="p">())</span> <span class="p">)</span>
</span></span><span class="line"><span class="cl">			<span class="n">link</span> <span class="o">=</span> <span class="n">link</span><span class="p">[</span><span class="s1">&#39;link&#39;</span><span class="p">][</span><span class="s1">&#39;tqe_next&#39;</span><span class="p">]</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">FreeBSD_ReloadModuleSymbols</span> <span class="p">()</span>
</span></span></code></pre></div><p>You load this by running the following command in GDB:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="nb">source</span> freebsd_load_modules.py
</span></span></code></pre></div><p>Then the command <code>reload-freebsd-module-symbols</code> is magically added to GDB. Running this command will parse the linker table inside the FreeBSD kernel, determine which modules are loaded, and attempt to load their symbols.</p>
</description>
    </item>
    
  </channel>
</rss>
