<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
     xmlns:content="http://purl.org/rss/1.0/modules/content/"
     xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
     xmlns:atom="http://www.w3.org/2005/Atom"
     xmlns:dc="http://purl.org/dc/elements/1.1/"
     xmlns:wfw="http://wellformedweb.org/CommentAPI/"
     >
  <channel>
    <title>Topdog.za.net</title>
    <link>http://www.topdog.za.net</link>
    <description>A bored sysadmin</description>
    <pubDate>Fri, 26 Feb 2016 10:06:56 GMT</pubDate>
    <generator>Blogofile</generator>
    <sy:updatePeriod>hourly</sy:updatePeriod>
    <sy:updateFrequency>1</sy:updateFrequency>
    <item>
      <title>Mac OSX IPSEC VPN via command line using builtin Racoon client</title>
      <link>http://www.topdog.za.net/2012/09/19/mac-osx-ipsec-vpn-via-command-line-using-builtin-racoon-client</link>
      <pubDate>Wed, 19 Sep 2012 07:30:00 SAST</pubDate>
      <category><![CDATA[Mac OS X]]></category>
      <category><![CDATA[Howto]]></category>
      <category><![CDATA[Sysadmin]]></category>
      <category><![CDATA[Linux]]></category>
      <category><![CDATA[Tips]]></category>
      <category><![CDATA[Security]]></category>
      <category><![CDATA[IPSEC]]></category>
      <guid isPermaLink="true">http://www.topdog.za.net/2012/09/19/mac-osx-ipsec-vpn-via-command-line-using-builtin-racoon-client</guid>
      <description>Mac OSX IPSEC VPN via command line using builtin Racoon client</description>
      <content:encoded><![CDATA[<h2>Introduction</h2>
<p>The Mac OSX IPSEC VPN client setup via "System preferences" only supports
IPSEC/XAUTH and IPSEC/L2TP both of which give you a different IP address for
your tunnel interface. System preferences on the backend uses Racoon
so it is possible via the command line to setup a pure IPSEC connection.</p>
<p>In my <a href="http://bit.ly/WABVAZ">previous post</a> i described how to configure a Strongswan server for
use with Mac OSX, Ipad, Iphone clients. For the sake of brevity i will not
repeat that in this post.</p>
<p>This scenario assumes you are connected to a lan 10.128.1.0/24 and your
IP address is 10.128.1.2 and you are connecting to a remote network 
192.168.1.0/24 protected by an IPSEC VPN running Strongswan on a gateway with
a dynamic address being resolved via dynamic DNS.
IPSEC Authentication is done using Certificates.</p>
<h2>Configuration</h2>
<h3>Client configuration.</h3>
<p>Edit /etc/racoon/racoon.conf and add the following to the bottom.</p>
<div class="pygments_murphy"><pre>include &quot;/opt/local/etc/cmdline-ipsec.conf&quot; ;
</pre></div>

<p>Create a configuration template file /opt/local/etc/cmdline-ipsec.conf.tmpl. I am using
a template because the remote side has a dynamic ip address and racoon does
not support DNS names only IP addresses, a custom script resolves the hostname
and then generates an updated racoon configuration from this template file with the
resolved IP address.</p>
<div class="pygments_murphy"><pre>remote %SERVERIP% {
        exchange_mode main;
        ca_type x509 &quot;/opt/local/etc/pki/cacert.pem&quot;;
        certificate_type x509 &quot;/opt/local/etc/pki/example.pem&quot; &quot;/opt/local/etc/pki/example.key.pem&quot;;
        proposal_check obey;
        mode_cfg off;
        dpd_delay 360;
        nat_traversal on;
        my_identifier asn1dn;
        ike_frag on;
        script &quot;/opt/local/bin/phase1-up.sh&quot; phase1_up;
        script &quot;/opt/local/bin/phase1-down.sh&quot; phase1_down;
        lifetime time 24 hour;
        passive off;
        proposal {
                encryption_algorithm aes256;
                hash_algorithm sha512;
                authentication_method rsasig;
                dh_group 2;
       }
}

sainfo anonymous {
        lifetime time 24 hour;
        pfs_group modp2048;
        encryption_algorithm aes256;
        authentication_algorithm hmac_sha1, hmac_sha256, hmac_sha512;
        compression_algorithm deflate ;
}
</pre></div>

<p>Create the phase1 up script /opt/local/bin/phase1-up.sh</p>
<div class="pygments_murphy"><pre><span class="c">#!/bin/sh</span>

<span class="c">#</span>
<span class="c"># sa-up.sh local configuration for a new SA</span>
<span class="c">#</span>
<span class="nv">PATH</span><span class="o">=</span>/bin:/sbin:/usr/bin:/usr/sbin:/opt/local/bin:/opt/local/sbin
<span class="nv">MYIP</span><span class="o">=</span>10.128.1.2
<span class="nv">PROTECTEDNET</span><span class="o">=</span>192.168.1.0/24

<span class="nb">echo</span> <span class="nv">$@</span>
<span class="nb">echo</span> <span class="s2">&quot;LOCAL_ADDR = ${LOCAL_ADDR}&quot;</span>
<span class="nb">echo</span> <span class="s2">&quot;LOCAL_PORT = ${LOCAL_PORT}&quot;</span>
<span class="nb">echo</span> <span class="s2">&quot;REMOTE_ADDR = ${REMOTE_ADDR}&quot;</span>
<span class="nb">echo</span> <span class="s2">&quot;REMOTE_PORT = ${REMOTE_PORT}&quot;</span>

<span class="nv">LOCAL</span><span class="o">=</span><span class="s2">&quot;${LOCAL_ADDR}[${LOCAL_PORT}]&quot;</span>
<span class="nv">REMOTE</span><span class="o">=</span><span class="s2">&quot;${REMOTE_ADDR}[${REMOTE_PORT}]&quot;</span>

<span class="nb">echo</span> <span class="s2">&quot;</span>
<span class="s2">spdadd ${MYIP}/32[any] ${PROTECTEDNET}[any] any</span>
<span class="s2">       -P out ipsec esp/tunnel/${LOCAL}-${REMOTE}/require;</span>
<span class="s2">spdadd ${PROTECTEDNET} ${MYIP}[any] any</span>
<span class="s2">       -P in ipsec esp/tunnel/${REMOTE}-${LOCAL}/require;</span>
<span class="s2">&quot;</span> | setkey -c
</pre></div>

<p>Create the phase1 down script /opt/local/bin/phase1-down.sh</p>
<div class="pygments_murphy"><pre><span class="c">#!/bin/sh</span>

<span class="c">#</span>
<span class="c"># sa-down.sh local remove SA</span>
<span class="c">#</span>

<span class="nv">PATH</span><span class="o">=</span>/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin
<span class="nv">MYIP</span><span class="o">=</span>10.128.1.2
<span class="nv">PROTECTEDNET</span><span class="o">=</span>192.168.1.0/24

<span class="nb">echo</span> <span class="nv">$@</span>
<span class="nb">echo</span> <span class="s2">&quot;LOCAL_ADDR = ${LOCAL_ADDR}&quot;</span>
<span class="nb">echo</span> <span class="s2">&quot;LOCAL_PORT = ${LOCAL_PORT}&quot;</span>
<span class="nb">echo</span> <span class="s2">&quot;REMOTE_ADDR = ${REMOTE_ADDR}&quot;</span>
<span class="nb">echo</span> <span class="s2">&quot;REMOTE_PORT = ${REMOTE_PORT}&quot;</span>

<span class="nv">LOCAL</span><span class="o">=</span><span class="s2">&quot;${LOCAL_ADDR}[${LOCAL_PORT}]&quot;</span>
<span class="nv">REMOTE</span><span class="o">=</span><span class="s2">&quot;${REMOTE_ADDR}[${REMOTE_PORT}]&quot;</span>

<span class="nb">echo</span> <span class="s2">&quot;</span>
<span class="s2">deleteall ${REMOTE_ADDR} ${LOCAL_ADDR} esp;</span>
<span class="s2">deleteall ${LOCAL_ADDR} ${REMOTE_ADDR} esp; </span>
<span class="s2">spddelete ${MYIP}/32[any] ${PROTECTEDNET}[any] any</span>
<span class="s2">        -P out ipsec esp/tunnel/${LOCAL}-${REMOTE}/require;</span>
<span class="s2">spddelete ${PROTECTEDNET}[any] ${MYIP}[any] any</span>
<span class="s2">        -P in ipsec esp/tunnel/${REMOTE}-${LOCAL}/require;</span>
<span class="s2">&quot;</span> | setkey -c
</pre></div>

<p>Create the custom start script /opt/local/sbin/start-vpn</p>
<div class="pygments_murphy"><pre><span class="c">#!/bin/bash</span>
<span class="c">#</span>
<span class="c">#</span>
<span class="nv">SERVERNAME</span><span class="o">=</span><span class="s2">&quot;strongswan-example.dyndns.org&quot;</span>
<span class="nv">SERVERIP</span><span class="o">=</span><span class="k">$(</span>host <span class="nv">$SERVERNAME</span>|awk <span class="s1">&#39;{print $4}&#39;</span><span class="k">)</span>
<span class="nv">status</span><span class="o">=</span><span class="k">$(</span>racoonctl show-sa isakmp|wc -l|awk <span class="s1">&#39;{print $1}&#39;</span><span class="k">)</span>
<span class="k">if</span> <span class="o">[</span> <span class="s2">&quot;$status&quot;</span> !<span class="o">=</span> <span class="s2">&quot;2&quot;</span> <span class="o">]</span>; <span class="k">then</span>
<span class="k">   </span><span class="nb">echo</span> <span class="s2">&quot;Not connected, starting conn&quot;</span>
   sed -e <span class="s2">&quot;s:%SERVERIP%:${SERVERIP}:&quot;</span> <span class="se">\</span>
   /opt/local/etc/cmdline-ipsec.conf.tmpl &gt; /opt/local/etc/cmdline-ipsec.conf
   racoonctl reload-config
   racoonctl vpn-connect <span class="nv">$SERVERIP</span>
<span class="k">else</span>
<span class="k">   </span>racoonctl show-sa isakmp
   <span class="nb">echo</span> <span class="s2">&quot;Already connect, exiting&quot;</span>
<span class="k">fi</span>
</pre></div>

<p>Make the script executable</p>
<pre><code>chmod +x /opt/local/sbin/start-vpn
</code></pre>
<h3>Server configuration</h3>
<p>Update the ipsec.conf configuration from my previous post to add the following
conn</p>
<div class="pygments_murphy"><pre>conn rw
        leftcert=vpn.example.org.pem
        leftid=@vpn.example.org
        leftfirewall=yes
        right=%any
        rightsubnet=0.0.0.0/0
        rekey=yes
</pre></div>

<h2>Testing</h2>
<p>Open a command prompt and run the command, as root or using sudo.</p>
<pre><code>start-vpn
</code></pre>
<p>You should be able to connect to hosts on the protected network (192.168.1.0/24)</p>
<p>To stop the connection run the command.</p>
<pre><code>racoonctl vpn-disconnect strongswan-example.dyndns.org
</code></pre>
<h2>Related articles</h2>
<ul>
<li><a href="http://bit.ly/SN5z1k">IPSEC split tunneling VPN with Mac OSX and Strongswan 5 on Centos/RHEL 6</a></li>
<li><a href="http://bit.ly/WABVAZ">Iphone/Ipad/Mac OSX IPSEC VPN with Strongswan 5 on Centos/RHEL 6</a></li>
</ul>]]></content:encoded>
    </item>
    <item>
      <title>IPSEC split tunneling VPN with Mac OSX and Strongswan 5 on Centos/RHEL 6</title>
      <link>http://www.topdog.za.net/2012/09/01/ipsec-split-tunneling-vpn-with-mac-osx-and-strongswan-5-on-centos-rhel-6</link>
      <pubDate>Sat, 01 Sep 2012 10:08:00 SAST</pubDate>
      <category><![CDATA[Centos]]></category>
      <category><![CDATA[Mac OS X]]></category>
      <category><![CDATA[Howto]]></category>
      <category><![CDATA[Sysadmin]]></category>
      <category><![CDATA[RHEL]]></category>
      <category><![CDATA[Linux]]></category>
      <category><![CDATA[Tips]]></category>
      <category><![CDATA[Security]]></category>
      <category><![CDATA[IPSEC]]></category>
      <guid isPermaLink="true">http://www.topdog.za.net/2012/09/01/ipsec-split-tunneling-vpn-with-mac-osx-and-strongswan-5-on-centos-rhel-6</guid>
      <description>IPSEC split tunneling VPN with Mac OSX and Strongswan 5 on Centos/RHEL 6</description>
      <content:encoded><![CDATA[<h2>Introduction</h2>
<p>In my <a href="http://bit.ly/WABVAZ">previous post</a> i described how to setup an IPSEC VPN for use with Iphone,
Ipad and Mac OSX IPSEC VPN clients.</p>
<p>This post describes how to enable split tunneling which is supported by the
Mac OSX IPSEC client. Although split tunneling is considered insecure there
are cases where it is ideal to run split tunnels.</p>
<p>The scenario for this post is that you are connected to a LAN (10.128.0.0/24) with
internet access via a gateway on the LAN, you want to connect to a different
network 192.168.1.0/24 which is only accessible via VPN, but you want to retain
access to resources on the LAN while accessing the remote 192.168.1.0/24 network.</p>
<p>To follow this howto you need to have strongswan rpm with the <a href="http://bit.ly/NI7Mpx">attr-sql plugin</a>
enabled with a <a href="http://bit.ly/R5d4f8">sqlite</a> or <a href="http://bit.ly/R5d4f8">mysql</a> backed plugin enabled.
The <a href="http://bit.ly/NCWf0x">EPEL rpm</a> does not support these features at the time of writing. You need to build your own
custom strongswan rpm. You can download my <a href="http://bit.ly/OP75xw">spec file</a> and use it to build 
yourself the rpm.</p>
<h2>Installation</h2>
<p>Install the rpm</p>
<pre><code>rpm -Uvh strongswan-5.0.0-5.el6.x86_64.rpm
</code></pre>
<h2>Configuration</h2>
<p>Use the following configuration files, if you installation is new refer to
my <a href="http://bit.ly/WABVAZ">previous post</a> on how to create the certificates</p>
<h3>Create strongswan configuration</h3>
<p>This strongswan configuration allows you to use both certificates and pre shared
keys.</p>
<p>Add the username and password to /etc/strongswan/ipsec.secrets</p>
<div class="pygments_murphy"><pre>andrew : XAUTH &quot;5tr0ngp4ss0rd&quot;
</pre></div>

<p>Add the preshared key to /etc/strongswan/ipsec.secrets</p>
<div class="pygments_murphy"><pre>: PSK &quot;very long pre shared key difficlult to guess&quot;
</pre></div>

<p>Edit /etc/strongswan/ipsec.conf with the following content.</p>
<div class="pygments_murphy"><pre>config setup

conn %default
        ikelifetime=60m
        keylife=20m
        rekeymargin=3m
        keyingtries=1
        keyexchange=ikev1
        left=%defaultroute
        leftsubnet=192.168.1.0/24
        esp=aes256-sha256-modp2048,aes256-sha1!
        ike=aes256-sha1-modp1536,aes256-sha512-modp1024,aes256-sha1-modp1024!
        auto=add

conn rw-xauth
        leftcert=vpn.example.org.pem
        leftid=@vpn.example.org
        leftauth=pubkey
        leftfirewall=yes
        right=%any
        rightauth=pubkey
        rightauth2=xauth
        rightsourceip=%vpnclients
        rekey=yes

conn rw-xauth-psk
        leftfirewall=yes
        leftauth=psk
        right=%any
        rightauth=psk
        rightauth2=xauth
        rightsourceip=%vpnclients
        rekey=yes
</pre></div>

<p>Add the attr-sql plugin configuration to /etc/strongswan/strongswan.conf</p>
<div class="pygments_murphy"><pre>libhydra {
        plugins {
                attr-sql {
                        database = sqlite:///var/lib/strongswan/ipsec.db
                }
        }
}
</pre></div>

<h3>Restart the service</h3>
<p>Restart the service for the configurations to take effect.</p>
<pre><code>service strongswan restart
</code></pre>
<h3>Create sql attr Database</h3>
<p>Create a sqlite database to store the pool information.</p>
<pre><code>wget http://bit.ly/PyMe08
cat sqlite.sql | sqlite3 /var/lib/strongswan/ipsec.db
</code></pre>
<h3>Create a database based pool</h3>
<p>The pool will store the address range, the split tunnel network (192.168.1.0/24),
dns server to assign and a banner.</p>
<pre><code>strongswan pool --add vpnclients --start 192.168.2.0 --end 192.168.2.254 --timeout 48
strongswan pool --addattr dns --server 192.168.1.1 --pool vpnclients
strongswan pool --addattr unity_def_domain --string "example.org" --pool vpnclients
strongswan pool --addattr banner --string "example.org - all activity is monitored" --pool vpnclients
strongswan pool --addattr unity_split_include --subnet "192.168.1.0/255.255.255.0" --pool vpnclients
</code></pre>
<h2>Testing</h2>
<p>Configure your Mac OSX VPN client.</p>
<ul>
<li>Launch System preferences then select <strong>Network</strong> &gt; <strong>+</strong> &gt; <strong>Interface &gt; VPN</strong> &gt; <strong>VPN Type &gt; Cisco IPSEC</strong> &gt; <strong>Create</strong></li>
</ul>
<p>Set the Fields</p>
<pre><code>Description      Strongswan-IPSEC
Server           vpn.example.org
Account          andrew
Password         5tr0ngp4ss0rd
Use Certificate  ON
Certificate      name.example.org
</code></pre>
<p>Now when you connect, you will remain connected to your LAN as well as the remote network 10.128.0.0/24
if you run netstat -rn you will see the 10.128.0.0/24 network being routed via the tunnel interface.</p>
<h2>Related articles</h2>
<ul>
<li><a href="http://bit.ly/WABVAZ">Iphone/Ipad/Mac OSX IPSEC VPN with Strongswan 5 on Centos/RHEL 6</a></li>
<li><a href="http://bit.ly/Ujih5I">Mac OSX IPSEC VPN via command line using builtin Racoon client</a></li>
</ul>]]></content:encoded>
    </item>
    <item>
      <title>Iphone/Ipad/Mac OSX IPSEC VPN with Strongswan 5 on Centos/RHEL 6</title>
      <link>http://www.topdog.za.net/2012/08/23/iphone-ipad-mac-osx-ipsec-vpn-with-strongswan-5-on-centos-rhel-6</link>
      <pubDate>Thu, 23 Aug 2012 10:21:00 SAST</pubDate>
      <category><![CDATA[Centos]]></category>
      <category><![CDATA[Mac OS X]]></category>
      <category><![CDATA[Howto]]></category>
      <category><![CDATA[Sysadmin]]></category>
      <category><![CDATA[RHEL]]></category>
      <category><![CDATA[Linux]]></category>
      <category><![CDATA[Tips]]></category>
      <category><![CDATA[Security]]></category>
      <category><![CDATA[IPSEC]]></category>
      <guid isPermaLink="true">http://www.topdog.za.net/2012/08/23/iphone-ipad-mac-osx-ipsec-vpn-with-strongswan-5-on-centos-rhel-6</guid>
      <description>Iphone/Ipad/Mac OSX IPSEC VPN with Strongswan 5 on Centos/RHEL 6</description>
      <content:encoded><![CDATA[<h2>Introduction</h2>
<p>This howto describes setting up an IPSEC VPN for use with the Iphone, Ipad and
Mac OSX VPN clients on Centos/RHEL 6. I am using the 5.x branch of Strongswan
which is now the mainline actively maintained branch. At the time of writing the
5.x EPEL package was only available in the testing repo.</p>
<p>The configuration should work both with NAT and without NAT on both sides, if
you are NATing on the server side make sure your forward UDP 500 and 4500 to
the machine running strongswan.</p>
<p>This howto uses example.org and 192.168.1.0/24 and 192.168.2.0/24 networks for
illustration purposes, you need to change these to suit your own setup.</p>
<h2>Install</h2>
<p>To access the EPEL packages you need to <a href="https://fedoraproject.org/wiki/EPEL/FAQ#howtouse">enable</a> the EPEL repo.
You are then able to install the strongswan package.</p>
<pre><code>yum install --enablerepo=epel-testing strongswan
</code></pre>
<p>Create the required configuration directories</p>
<pre><code>mkdir -p /etc/strongswan/ipsec.d/{aacerts,acerts,cacerts,certs,crls,ocspcerts,private}
</code></pre>
<h2>Configuration</h2>
<h3>Create a CA</h3>
<p>For RSA authentication you need to setup a CA which will issue the certificates to be
used by the server and the clients.</p>
<pre><code>cd /etc/pki/tls/misc
./CA -newca
echo 00 &gt; /etc/pki/CA/crlnumber
openssl ca -gencrl -out /etc/pki/CA/crl.pem
</code></pre>
<p>Install to strongswan directories</p>
<pre><code>ln -s /etc/pki/CA/cacert.pem /etc/strongswan/ipsec.d/cacerts/
ln -s /etc/pki/CA/crl.pem /etc/strongswan/ipsec.d/crls/
</code></pre>
<h3>Create the server certificate</h3>
<p>Apple clients require that the servers certificate subjectAltName attribute contain either
the server IP address or server DNS name. To ensure the server certificate contains the
subjectAltName attribute edit the openssl.cnf and set it under the [ usr_cert ] section</p>
<p>For DNS name set it to</p>
<div class="pygments_murphy"><pre>subjectAltName=DNS:vpn.example.org
</pre></div>

<p>For IP address set it to</p>
<div class="pygments_murphy"><pre>subjectAltName=IP:192.168.1.1
</pre></div>

<p>Now generate and sign the server certitifcate</p>
<pre><code>./CA -newreq
./CA -sign
</code></pre>
<p>Install to strongswan directories.</p>
<pre><code>mv newcert.pem /etc/strongswan/ipsec.d/certs/vpn.example.org.pem
mv newkey.pem /etc/strongswan/ipsec.d/private/vpn.example.org.key
</code></pre>
<p>Add the private key password to /etc/strongswan/ipsec.secrets</p>
<div class="pygments_murphy"><pre>: RSA vpn.example.org.key &quot;p4ssw0rd&quot;
</pre></div>

<h3>Create the client certificate</h3>
<p>This is the certificate that will be used by you VPN clients ie Ipad/Iphone, edit the openssl.cnf
and comment out the subjectAltName attribute setting.</p>
<p>Now generate and sign the client certificate, do this for all the clients you expect to use.</p>
<pre><code>./CA -newreq
./CA -sign
openssl pkcs12 -export -in ipad.example.org.pem -inkey ipad.example.org.key \
 -certfile /etc/pki/CA/cacert.pem -out ipad.p12
</code></pre>
<p>You now need to import the CA certificate and the client p12 certificate on to the device. You
need to download the <a href="https://support.apple.com/kb/DL1465">Iphone configuration utility</a> and
use it to import the certificates to your device.</p>
<p><img alt="Iphone configuration utility;" src="/imgs/iphone-config.png" /></p>
<p>Add the username and password to /etc/strongswan/ipsec.secrets</p>
<div class="pygments_murphy"><pre>andrew : XAUTH &quot;5tr0ngp4ss0rd&quot;
</pre></div>

<h3>Create strongswan configuration</h3>
<p>Edit /etc/strongswan/ipsec.conf with the following content.</p>
<div class="pygments_murphy"><pre>config setup

conn %default
        ikelifetime=60m
        keylife=20m
        rekeymargin=3m
        keyingtries=1
        keyexchange=ikev1
        left=%defaultroute
        leftsubnet=192.168.1.0/24
        auto=add

conn rw-xauth
        leftcert=vpn.example.org.pem
        leftid=@vpn.example.org
        leftauth=pubkey
        leftfirewall=yes
        right=%any
        rightauth=pubkey
        rightauth2=xauth
        rightsourceip=192.168.2.0/24
</pre></div>

<p>The above setup assumes the network behind the vpn is 192.168.1.0/24 and virtual IP addresses will
be assigned to VPN clients from the 192.168.2.0/24 network block.</p>
<h3>Enable packet forwarding</h3>
<p>If your system is not setup for packet forwarding enable it.</p>
<pre><code>echo 1 &gt; /proc/sys/net/ipv4/ip_forward
</code></pre>
<p>Edit /etc/sysctl.conf and set</p>
<div class="pygments_murphy"><pre>net.ipv4.ip_forward = 1
</pre></div>

<h2>Testing</h2>
<p>Start strongswan.</p>
<pre><code>service strongswan start
</code></pre>
<p>Check /var/log/messages and /var/log/secure for any errors.</p>
<h3>Ipad configuration</h3>
<ul>
<li>Launch Settings then select <strong>General</strong> &gt; <strong>Network</strong> &gt; <strong>VPN</strong> &gt; <strong>Add VPN Configuration</strong></li>
<li>Toggle <strong>VPN</strong> type to <strong>IPSec</strong></li>
</ul>
<p>Set the Fields</p>
<pre><code>Description      Strongswan-IPSEC
Server           vpn.example.org
Account          andrew
Password         5tr0ngp4ss0rd
Use Certificate  ON
Certificate      ipad.example.org
</code></pre>
<p>A VPN connection should now be possible by toggling <strong>VPN</strong> to <strong>ON</strong> under <strong>Settings</strong> &gt; <strong>VPN</strong>.</p>
<h2>Related articles</h2>
<ul>
<li><a href="http://bit.ly/SN5z1k">IPSEC split tunneling VPN with Mac OSX and Strongswan 5 on Centos/RHEL 6</a></li>
<li><a href="http://bit.ly/Ujih5I">Mac OSX IPSEC VPN via command line using builtin Racoon client</a></li>
</ul>]]></content:encoded>
    </item>
    <item>
      <title>Python modules you should know: PyGPGME</title>
      <link>http://www.topdog.za.net/2012/05/23/python-modules-you-should-know:-pygpgme</link>
      <pubDate>Wed, 23 May 2012 07:40:00 SAST</pubDate>
      <category><![CDATA[Python]]></category>
      <category><![CDATA[PyMYSK]]></category>
      <category><![CDATA[Howto]]></category>
      <guid isPermaLink="true">http://www.topdog.za.net/2012/05/23/python-modules-you-should-know:-pygpgme</guid>
      <description>Python modules you should know: PyGPGME</description>
      <content:encoded><![CDATA[<p>Next in our series of <a href="http://www.topdog.za.net/category/pymysk/"><em>Python modules you should know</em></a>
is PyGPGME. This package lets you sign, verify, encrypt and decrypt messages
using the OpenPGP format. It is built on top of the GNU Privacy Guard and the
<a href="http://www.gnupg.org/related_software/gpgme/index.en.html">GPGME</a> library.</p>
<h2>Home page</h2>
<ul>
<li><a href="https://launchpad.net/pygpgme">https://launchpad.net/pygpgme</a></li>
</ul>
<h2>Use</h2>
<p>PyGPGME is a Python module that lets you sign, verify, encrypt and decrypt messages
using the OpenPGP format.</p>
<h2>Installation</h2>
<p>You need the GPGME library and header files installed to successfully install PyGPGME</p>
<pre><code>pip install PyGPGME
</code></pre>
<h2>Usage</h2>
<p>The documentation for this package is almost non existent i hope my examples will
be able to help at least with getting users started</p>
<h3>Creating a key</h3>
<p>This is similar to running the following command:</p>
<pre><code>gpg --gen-key
</code></pre>
<div class="pygments_murphy"><pre><span class="kn">import</span> <span class="nn">os</span>
<span class="kn">import</span> <span class="nn">gpgme</span>

<span class="n">key_params</span> <span class="o">=</span> <span class="s">&quot;&quot;&quot;</span>
<span class="s">&lt;GnupgKeyParms format=&quot;internal&quot;&gt;</span>
<span class="s">Key-Type: RSA</span>
<span class="s">Key-Length: 2048</span>
<span class="s">Name-Real: Jaja of Opobo</span>
<span class="s">Name-Email: jaja@example.com</span>
<span class="s">Expire-Date: 0</span>
<span class="s">Passphrase: secret</span>
<span class="s">&lt;/GnupgKeyParms&gt;</span>
<span class="s">&quot;&quot;&quot;</span>

<span class="c"># create custom gpg directory</span>
<span class="n">gpghome</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">expanduser</span><span class="p">(</span><span class="s">&#39;~/gpghome&#39;</span><span class="p">)</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">exists</span><span class="p">(</span><span class="n">gpghome</span><span class="p">):</span>
    <span class="n">os</span><span class="o">.</span><span class="n">mkdir</span><span class="p">(</span><span class="n">gpghome</span><span class="p">,</span> <span class="mo">0700</span><span class="p">)</span>

<span class="c"># set the environment to custom gpg directory</span>
<span class="n">os</span><span class="o">.</span><span class="n">environ</span><span class="p">[</span><span class="s">&#39;GNUPGHOME&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="n">gpghome</span>
<span class="c"># create a blank configuration file</span>
<span class="k">with</span> <span class="nb">open</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">gpghome</span><span class="p">,</span> <span class="s">&#39;gpg.conf&#39;</span><span class="p">),</span> <span class="s">&#39;wv&#39;</span><span class="p">)</span> <span class="k">as</span> <span class="n">handle</span><span class="p">:</span>
    <span class="n">handle</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="s">&#39;&#39;</span><span class="p">)</span>

<span class="c"># create a context</span>
<span class="n">ctx</span> <span class="o">=</span> <span class="n">gpgme</span><span class="o">.</span><span class="n">Context</span><span class="p">()</span>
<span class="c"># create the key using key_params</span>
<span class="n">result</span> <span class="o">=</span> <span class="n">ctx</span><span class="o">.</span><span class="n">genkey</span><span class="p">(</span><span class="n">key_params</span><span class="p">)</span>
<span class="c"># get the key</span>
<span class="n">key</span> <span class="o">=</span> <span class="n">ctx</span><span class="o">.</span><span class="n">get_key</span><span class="p">(</span><span class="n">result</span><span class="o">.</span><span class="n">fpr</span><span class="p">,</span> <span class="bp">True</span><span class="p">)</span>
<span class="p">[</span><span class="n">uid</span><span class="p">]</span> <span class="o">=</span> <span class="n">key</span><span class="o">.</span><span class="n">uids</span>
<span class="c"># print key name and email</span>
<span class="k">print</span> <span class="n">uid</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="n">uid</span><span class="o">.</span><span class="n">email</span>
</pre></div>

<h3>Exporting a key</h3>
<p>This is similar to running the following command:</p>
<pre><code>gpg --export [UID]
</code></pre>
<div class="pygments_murphy"><pre><span class="kn">import</span> <span class="nn">os</span>
<span class="kn">import</span> <span class="nn">gpgme</span>
<span class="kn">from</span> <span class="nn">io</span> <span class="kn">import</span> <span class="n">BytesIO</span>

<span class="c"># set the environment to custom gpg directory</span>
<span class="n">gpghome</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">expanduser</span><span class="p">(</span><span class="s">&#39;~/gpghome&#39;</span><span class="p">)</span>
<span class="n">os</span><span class="o">.</span><span class="n">environ</span><span class="p">[</span><span class="s">&#39;GNUPGHOME&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="n">gpghome</span>

<span class="c"># create a context</span>
<span class="n">ctx</span> <span class="o">=</span> <span class="n">gpgme</span><span class="o">.</span><span class="n">Context</span><span class="p">()</span>
<span class="n">ctx</span><span class="o">.</span><span class="n">armor</span> <span class="o">=</span> <span class="bp">True</span>
<span class="n">keydata</span> <span class="o">=</span> <span class="n">BytesIO</span><span class="p">()</span>
<span class="p">[</span><span class="n">key</span><span class="p">]</span> <span class="o">=</span> <span class="n">ctx</span><span class="o">.</span><span class="n">keylist</span><span class="p">()</span>
<span class="n">ctx</span><span class="o">.</span><span class="n">export</span><span class="p">(</span><span class="n">key</span><span class="o">.</span><span class="n">subkeys</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">.</span><span class="n">keyid</span><span class="p">,</span> <span class="n">keydata</span><span class="p">)</span>
<span class="k">print</span> <span class="n">keydata</span><span class="o">.</span><span class="n">getvalue</span><span class="p">()</span>
</pre></div>

<h3>Importing a key</h3>
<p>This is similar to running the following command:</p>
<pre><code>gpg --import [Filename]
</code></pre>
<div class="pygments_murphy"><pre><span class="kn">import</span> <span class="nn">os</span>
<span class="kn">import</span> <span class="nn">gpgme</span>
<span class="kn">import</span> <span class="nn">urllib2</span>

<span class="c"># set the environment to custom gpg directory</span>
<span class="n">gpghome</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">expanduser</span><span class="p">(</span><span class="s">&#39;~/gpghome&#39;</span><span class="p">)</span>
<span class="n">os</span><span class="o">.</span><span class="n">environ</span><span class="p">[</span><span class="s">&#39;GNUPGHOME&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="n">gpghome</span>

<span class="c"># create a context</span>
<span class="n">ctx</span> <span class="o">=</span> <span class="n">gpgme</span><span class="o">.</span><span class="n">Context</span><span class="p">()</span>
<span class="c"># Download a public key</span>
<span class="n">handle</span> <span class="o">=</span> <span class="n">urllib2</span><span class="o">.</span><span class="n">urlopen</span><span class="p">(</span><span class="s">&#39;http://repo.baruwa.org/RPM-GPG-KEY-BARUWA&#39;</span><span class="p">)</span>
<span class="c"># Import the key</span>
<span class="n">_</span> <span class="o">=</span> <span class="n">ctx</span><span class="o">.</span><span class="n">import_</span><span class="p">(</span><span class="n">handle</span><span class="p">)</span>
<span class="c"># Get key and print out keyID</span>
<span class="n">key</span> <span class="o">=</span> <span class="n">ctx</span><span class="o">.</span><span class="n">get_key</span><span class="p">(</span><span class="s">&#39;4BA17AC7&#39;</span><span class="p">)</span>
<span class="k">print</span> <span class="s">&quot;Imported key ID: &quot;</span><span class="p">,</span> <span class="n">key</span><span class="o">.</span><span class="n">uids</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">.</span><span class="n">uid</span>
</pre></div>

<h3>Delete a key</h3>
<p>This is similar to running the following command:</p>
<pre><code>gpg --delete-key UID
</code></pre>
<div class="pygments_murphy"><pre><span class="kn">import</span> <span class="nn">os</span>
<span class="kn">import</span> <span class="nn">gpgme</span>

<span class="c"># set the environment to custom gpg directory</span>
<span class="n">gpghome</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">expanduser</span><span class="p">(</span><span class="s">&#39;~/gpghome&#39;</span><span class="p">)</span>
<span class="n">os</span><span class="o">.</span><span class="n">environ</span><span class="p">[</span><span class="s">&#39;GNUPGHOME&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="n">gpghome</span>

<span class="c"># create a context</span>
<span class="n">ctx</span> <span class="o">=</span> <span class="n">gpgme</span><span class="o">.</span><span class="n">Context</span><span class="p">()</span>
<span class="c"># Get the public key we just imported</span>
<span class="n">key</span> <span class="o">=</span> <span class="n">ctx</span><span class="o">.</span><span class="n">get_key</span><span class="p">(</span><span class="s">&#39;4BA17AC7&#39;</span><span class="p">)</span>
<span class="c"># Delete the key</span>
<span class="n">ctx</span><span class="o">.</span><span class="n">delete</span><span class="p">(</span><span class="n">key</span><span class="p">)</span>
</pre></div>

<h3>Sign and verify text</h3>
<p>This is similar to running the following commands:</p>
<pre><code>gpg -s (or --sign) [Data]
gpg [--verify] [Data]
</code></pre>
<div class="pygments_murphy"><pre><span class="kn">import</span> <span class="nn">os</span>
<span class="kn">import</span> <span class="nn">gpgme</span>
<span class="kn">from</span> <span class="nn">io</span> <span class="kn">import</span> <span class="n">BytesIO</span>

<span class="c"># set the environment to custom gpg directory</span>
<span class="n">gpghome</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">expanduser</span><span class="p">(</span><span class="s">&#39;~/gpghome&#39;</span><span class="p">)</span>
<span class="n">os</span><span class="o">.</span><span class="n">environ</span><span class="p">[</span><span class="s">&#39;GNUPGHOME&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="n">gpghome</span>
<span class="c"># allow our passphrase callback to work</span>
<span class="k">del</span> <span class="n">os</span><span class="o">.</span><span class="n">environ</span><span class="p">[</span><span class="s">&#39;GPG_AGENT_INFO&#39;</span><span class="p">]</span>

<span class="c"># passphrase callback function</span>
<span class="k">def</span> <span class="nf">passphrase_cb</span><span class="p">(</span><span class="n">uid_hint</span><span class="p">,</span> <span class="n">passphrase_info</span><span class="p">,</span> <span class="n">prev_was_bad</span><span class="p">,</span> <span class="n">fd</span><span class="p">):</span>
    <span class="s">&quot;pass phrase callback&quot;</span>
    <span class="n">os</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="n">fd</span><span class="p">,</span> <span class="n">b</span><span class="s">&#39;secret</span><span class="se">\\</span><span class="s">n&#39;</span><span class="p">)</span>

<span class="c"># create a context</span>
<span class="n">ctx</span> <span class="o">=</span> <span class="n">gpgme</span><span class="o">.</span><span class="n">Context</span><span class="p">()</span>
<span class="n">ctx</span><span class="o">.</span><span class="n">armor</span> <span class="o">=</span> <span class="bp">True</span>
<span class="p">[</span><span class="n">key</span><span class="p">]</span> <span class="o">=</span> <span class="n">ctx</span><span class="o">.</span><span class="n">keylist</span><span class="p">()</span>
<span class="n">ctx</span><span class="o">.</span><span class="n">signers</span> <span class="o">=</span> <span class="p">[</span><span class="n">key</span><span class="p">]</span>
<span class="n">ctx</span><span class="o">.</span><span class="n">passphrase_cb</span> <span class="o">=</span> <span class="n">passphrase_cb</span>

<span class="c"># sign the data</span>
<span class="n">plaintext</span> <span class="o">=</span> <span class="n">BytesIO</span><span class="p">(</span><span class="n">b</span><span class="s">&#39;Text to be signed</span><span class="se">\\</span><span class="s">n&#39;</span><span class="p">)</span>
<span class="n">signature</span> <span class="o">=</span> <span class="n">BytesIO</span><span class="p">()</span>
<span class="n">signed</span> <span class="o">=</span> <span class="n">ctx</span><span class="o">.</span><span class="n">sign</span><span class="p">(</span><span class="n">plaintext</span><span class="p">,</span> <span class="n">signature</span><span class="p">,</span> <span class="n">gpgme</span><span class="o">.</span><span class="n">SIG_MODE_DETACH</span><span class="p">)</span>

<span class="c"># rewind files</span>
<span class="n">_</span> <span class="o">=</span> <span class="n">signature</span><span class="o">.</span><span class="n">seek</span><span class="p">(</span><span class="mi">0</span><span class="p">)</span>
<span class="n">_</span> <span class="o">=</span> <span class="n">plaintext</span><span class="o">.</span><span class="n">seek</span><span class="p">(</span><span class="mi">0</span><span class="p">)</span>

<span class="c"># Verify signature</span>
<span class="n">sigs</span> <span class="o">=</span> <span class="n">ctx</span><span class="o">.</span><span class="n">verify</span><span class="p">(</span><span class="n">signature</span><span class="p">,</span> <span class="n">plaintext</span><span class="p">,</span> <span class="bp">None</span><span class="p">)</span>
<span class="k">if</span> <span class="n">sigs</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">.</span><span class="n">fpr</span> <span class="o">==</span> <span class="n">key</span><span class="o">.</span><span class="n">subkeys</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">.</span><span class="n">fpr</span><span class="p">:</span>
    <span class="k">print</span> <span class="s">&quot;Signature verified&quot;</span>
    <span class="k">print</span> <span class="n">sigs</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">.</span><span class="n">fpr</span><span class="p">,</span> <span class="n">key</span><span class="o">.</span><span class="n">subkeys</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">.</span><span class="n">fpr</span>
<span class="k">else</span><span class="p">:</span>
    <span class="k">print</span> <span class="s">&quot;Signature verification failed&quot;</span>
</pre></div>

<h3>Encrypt and Decrypt text</h3>
<p>This is similar to running the following commands:</p>
<pre><code>gpg -e Recipient [Data]
gpg [-d] [Data]
</code></pre>
<div class="pygments_murphy"><pre><span class="kn">import</span> <span class="nn">os</span>
<span class="kn">import</span> <span class="nn">gpgme</span>
<span class="kn">from</span> <span class="nn">io</span> <span class="kn">import</span> <span class="n">BytesIO</span>

<span class="c"># set the environment to custom gpg directory</span>
<span class="n">gpghome</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">expanduser</span><span class="p">(</span><span class="s">&#39;~/gpghome&#39;</span><span class="p">)</span>
<span class="n">os</span><span class="o">.</span><span class="n">environ</span><span class="p">[</span><span class="s">&#39;GNUPGHOME&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="n">gpghome</span>
<span class="c"># allow our passphrase callback to work</span>
<span class="k">del</span> <span class="n">os</span><span class="o">.</span><span class="n">environ</span><span class="p">[</span><span class="s">&#39;GPG_AGENT_INFO&#39;</span><span class="p">]</span>

<span class="n">recipient_params</span> <span class="o">=</span> <span class="s">&quot;&quot;&quot;</span>
<span class="s">&lt;GnupgKeyParms format=&quot;internal&quot;&gt;</span>
<span class="s">Key-Type: RSA</span>
<span class="s">Key-Length: 2048</span>
<span class="s">Name-Real: Nana of itsikiri</span>
<span class="s">Name-Email: nana@example.com</span>
<span class="s">Expire-Date: 0</span>
<span class="s">Passphrase: secret</span>
<span class="s">&lt;/GnupgKeyParms&gt;</span>
<span class="s">&quot;&quot;&quot;</span>

<span class="c"># passphrase callback function</span>
<span class="k">def</span> <span class="nf">passphrase_cb</span><span class="p">(</span><span class="n">uid_hint</span><span class="p">,</span> <span class="n">passphrase_info</span><span class="p">,</span> <span class="n">prev_was_bad</span><span class="p">,</span> <span class="n">fd</span><span class="p">):</span>
    <span class="s">&quot;pass phrase callback&quot;</span>
    <span class="n">os</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="n">fd</span><span class="p">,</span> <span class="n">b</span><span class="s">&#39;secret</span><span class="se">\\</span><span class="s">n&#39;</span><span class="p">)</span>

<span class="c"># create a context</span>
<span class="n">ctx</span> <span class="o">=</span> <span class="n">gpgme</span><span class="o">.</span><span class="n">Context</span><span class="p">()</span>
<span class="n">ctx</span><span class="o">.</span><span class="n">armor</span> <span class="o">=</span> <span class="bp">True</span>
<span class="c"># create a recipient&#39;s key</span>
<span class="n">result</span> <span class="o">=</span> <span class="n">ctx</span><span class="o">.</span><span class="n">genkey</span><span class="p">(</span><span class="n">recipient_params</span><span class="p">)</span>
<span class="n">recipient</span> <span class="o">=</span> <span class="n">ctx</span><span class="o">.</span><span class="n">get_key</span><span class="p">(</span><span class="n">result</span><span class="o">.</span><span class="n">fpr</span><span class="p">,</span> <span class="bp">True</span><span class="p">)</span>

<span class="n">plaintext</span> <span class="o">=</span> <span class="n">BytesIO</span><span class="p">(</span><span class="n">b</span><span class="s">&#39;Very Secret text</span><span class="se">\\</span><span class="s">n&#39;</span><span class="p">)</span>
<span class="n">ciphertext</span> <span class="o">=</span> <span class="n">BytesIO</span><span class="p">()</span>
<span class="n">ctx</span><span class="o">.</span><span class="n">encrypt</span><span class="p">([</span><span class="n">recipient</span><span class="p">],</span> <span class="n">gpgme</span><span class="o">.</span><span class="n">ENCRYPT_ALWAYS_TRUST</span><span class="p">,</span> <span class="n">plaintext</span><span class="p">,</span> <span class="n">ciphertext</span><span class="p">)</span>

<span class="c"># rewind files</span>
<span class="n">_</span> <span class="o">=</span> <span class="n">ciphertext</span><span class="o">.</span><span class="n">seek</span><span class="p">(</span><span class="mi">0</span><span class="p">)</span>
<span class="n">_</span> <span class="o">=</span> <span class="n">plaintext</span> <span class="o">=</span> <span class="n">BytesIO</span><span class="p">()</span>
<span class="n">ctx</span><span class="o">.</span><span class="n">passphrase_cb</span> <span class="o">=</span> <span class="n">passphrase_cb</span>
<span class="n">ctx</span><span class="o">.</span><span class="n">decrypt</span><span class="p">(</span><span class="n">ciphertext</span><span class="p">,</span> <span class="n">plaintext</span><span class="p">)</span>
<span class="k">print</span> <span class="s">&quot;The decrypted text is: &quot;</span><span class="p">,</span> <span class="n">plaintext</span><span class="o">.</span><span class="n">getvalue</span><span class="p">()</span>
</pre></div>

<h3>List keys</h3>
<p>This is similar to running the following command:</p>
<pre><code>gpg --list-keys
</code></pre>
<div class="pygments_murphy"><pre><span class="kn">import</span> <span class="nn">os</span>
<span class="kn">import</span> <span class="nn">gpgme</span>

<span class="c"># set the environment to custom gpg directory</span>
<span class="n">gpghome</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">expanduser</span><span class="p">(</span><span class="s">&#39;~/gpghome&#39;</span><span class="p">)</span>
<span class="n">os</span><span class="o">.</span><span class="n">environ</span><span class="p">[</span><span class="s">&#39;GNUPGHOME&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="n">gpghome</span>

<span class="c"># create a context</span>
<span class="n">ctx</span> <span class="o">=</span> <span class="n">gpgme</span><span class="o">.</span><span class="n">Context</span><span class="p">()</span>
<span class="c"># iterate key list</span>
<span class="k">for</span> <span class="n">key</span> <span class="ow">in</span> <span class="n">ctx</span><span class="o">.</span><span class="n">keylist</span><span class="p">():</span>
    <span class="k">for</span> <span class="n">uid</span> <span class="ow">in</span> <span class="n">key</span><span class="o">.</span><span class="n">uids</span><span class="p">:</span>
        <span class="k">print</span> <span class="n">uid</span><span class="o">.</span><span class="n">uid</span>
</pre></div>

<h3>List secret keys</h3>
<p>This is similar to running the following command:</p>
<pre><code>gpg --list-secret-keys
</code></pre>
<div class="pygments_murphy"><pre><span class="kn">import</span> <span class="nn">os</span>
<span class="kn">import</span> <span class="nn">gpgme</span>

<span class="c"># set the environment to custom gpg directory</span>
<span class="n">gpghome</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">expanduser</span><span class="p">(</span><span class="s">&#39;~/gpghome&#39;</span><span class="p">)</span>
<span class="n">os</span><span class="o">.</span><span class="n">environ</span><span class="p">[</span><span class="s">&#39;GNUPGHOME&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="n">gpghome</span>

<span class="c"># create a context</span>
<span class="n">ctx</span> <span class="o">=</span> <span class="n">gpgme</span><span class="o">.</span><span class="n">Context</span><span class="p">()</span>
<span class="c"># iterate secret key list</span>
<span class="k">for</span> <span class="n">key</span> <span class="ow">in</span> <span class="n">ctx</span><span class="o">.</span><span class="n">keylist</span><span class="p">(</span><span class="bp">None</span><span class="p">,</span> <span class="bp">True</span><span class="p">):</span>
    <span class="k">for</span> <span class="n">uid</span> <span class="ow">in</span> <span class="n">key</span><span class="o">.</span><span class="n">uids</span><span class="p">:</span>
        <span class="k">print</span> <span class="n">uid</span><span class="o">.</span><span class="n">uid</span>
</pre></div>

<h2>And there is more.</h2>
<p>For more GPG operations you can perform look at the API</p>
<div class="pygments_murphy"><pre><span class="kn">import</span> <span class="nn">gpgme</span>
<span class="n">help</span><span class="p">(</span><span class="n">gpgme</span><span class="p">)</span>
</pre></div>]]></content:encoded>
    </item>
    <item>
      <title>Python modules you should know: pydkim</title>
      <link>http://www.topdog.za.net/2012/05/08/python-modules-you-should-know:-pydkim</link>
      <pubDate>Tue, 08 May 2012 16:40:00 SAST</pubDate>
      <category><![CDATA[Python]]></category>
      <category><![CDATA[PyMYSK]]></category>
      <category><![CDATA[Howto]]></category>
      <guid isPermaLink="true">http://www.topdog.za.net/2012/05/08/python-modules-you-should-know:-pydkim</guid>
      <description>Python modules you should know: pydkim</description>
      <content:encoded><![CDATA[<p>Next in our series of <a href="http://www.topdog.za.net/category/pymysk/"><em>Python modules you should know</em></a>
is pydkim. This package is used to sign and verify email according to the <a href="http://dkim.org/">DKIM</a>
standards from within Python programs.</p>
<h2>Home page</h2>
<ul>
<li><a href="http://hewgill.com/pydkim/">http://hewgill.com/pydkim/</a></li>
</ul>
<h2>Use</h2>
<p>The pydkim module is a Python module that implements DKIM (DomainKeys Identified Mail) email signing
and verification.</p>
<p>DomainKeys Identified Mail (DKIM) lets an organization take responsibility for a message that is in
transit. Technically DKIM provides a method for validating a domain name identity that is associated
with a message through cryptographic authentication.</p>
<p>Although DKIM is implemented in most MTA's, in some cases you have a setup where you do not want to
run and manage an SMTP server yourself say for example if your Python application uses <a href="http://docs.amazonwebservices.com/ses/latest/DeveloperGuide/DKIM.html">Amazon SES</a> to send out email. So you
can use pydkim within your email generation code to sign your messages before passing them to SES.</p>
<h2>Installation</h2>
<pre><code>pip install pydkim
</code></pre>
<h2>Usage</h2>
<p>The package provides a command line interface as well as a Python Class.</p>
<h3>Python Class</h3>
<p>Sign a message</p>
<div class="pygments_murphy"><pre><span class="kn">from</span> <span class="nn">email.message</span> <span class="kn">import</span> <span class="n">Message</span>

<span class="kn">from</span> <span class="nn">dkim</span> <span class="kn">import</span> <span class="n">sign</span>

<span class="n">body</span> <span class="o">=</span> <span class="s">&quot;&quot;&quot;Hi There,</span>

<span class="s">This is a simple message that will be signed by pydkim</span>

<span class="s">--The signer</span>
<span class="s">&quot;&quot;&quot;</span>
<span class="c"># compose a simple message</span>
<span class="n">msg</span> <span class="o">=</span> <span class="n">Message</span><span class="p">()</span>
<span class="n">msg</span><span class="p">[</span><span class="s">&#39;From&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="s">&#39;Sender &lt;sender@topdog-software.com&gt;&#39;</span>
<span class="n">msg</span><span class="p">[</span><span class="s">&#39;To&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="s">&#39;Recipient &lt;recipient@example.com&gt;&#39;</span>
<span class="n">msg</span><span class="p">[</span><span class="s">&#39;Subject&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="s">&#39;Test message&#39;</span>
<span class="n">msg</span><span class="o">.</span><span class="n">set_payload</span><span class="p">(</span><span class="n">body</span><span class="p">)</span>

<span class="c"># sign the message</span>
<span class="n">private_key</span> <span class="o">=</span> <span class="nb">open</span><span class="p">(</span><span class="s">&#39;default.pem&#39;</span><span class="p">)</span><span class="o">.</span><span class="n">read</span><span class="p">()</span>
<span class="n">headers</span> <span class="o">=</span> <span class="p">[</span><span class="s">&#39;To&#39;</span><span class="p">,</span> <span class="s">&#39;From&#39;</span><span class="p">,</span> <span class="s">&#39;Subject&#39;</span><span class="p">]</span>
<span class="n">email</span> <span class="o">=</span> <span class="n">msg</span><span class="o">.</span><span class="n">as_string</span><span class="p">()</span>
<span class="n">sig</span> <span class="o">=</span> <span class="n">sign</span><span class="p">(</span><span class="n">email</span><span class="p">,</span> <span class="s">&#39;default&#39;</span><span class="p">,</span> <span class="s">&#39;topdog-software.com&#39;</span><span class="p">,</span> <span class="n">private_key</span><span class="p">,</span> <span class="n">include_headers</span><span class="o">=</span><span class="n">headers</span><span class="p">)</span>
<span class="k">print</span> <span class="n">sig</span><span class="p">,</span> <span class="n">email</span>
</pre></div>

<p>Output:</p>
<pre><code>DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple;
 d=topdog-software.com; i=@topdog-software.com; q=dns/txt; s=default;
 t=1336488625; h=From : To : Subject;
 bh=skd2vA1wrCEzamCzKOvVKCaVhhpP1ihoQgGldgTSVUE=; b=vGQgSjJxkTZe+NZZl
lqszgxGshTcixlcfFos+XpLnAj1fnhA5SuBASoB4dVQUlVW76U5s9Dn1zSSsKH
6bCahl4oPqZaE5t6Ke5wpGwA+cBWZRrSuDDD/L8g9nYi04SVb+lMF9mJyQCeZj
pBtMomaOvGF8GNXsiKTFZR9RDv0wWw=
From: Sender &lt;sender@topdog-software.com&gt;
To: Recipient &lt;recipient@example.com&gt;
Subject: Test message

Hi There,

This is a simple message that will be signed by pydkim

--The signer
</code></pre>
<p>Verify a message (I use the same message signed above)</p>
<div class="pygments_murphy"><pre><span class="kn">from</span> <span class="nn">dkim</span> <span class="kn">import</span> <span class="n">verify</span>

<span class="k">if</span> <span class="n">verify</span><span class="p">(</span><span class="nb">open</span><span class="p">(</span><span class="s">&#39;email.txt&#39;</span><span class="p">)</span><span class="o">.</span><span class="n">read</span><span class="p">()):</span>
    <span class="k">print</span> <span class="s">&quot;Email verified successfully&quot;</span>
</pre></div>

<pre><code>True
</code></pre>
<h3>Command line</h3>
<p>Sign a message</p>
<pre><code>dkimsign.py selector domain privatekeyfile [identity]
</code></pre>
<p>Verify a message</p>
<pre><code>cat email.txt | dkimverify.py
echo $?
</code></pre>
<h2>And there is more.</h2>
<p>For details of the API please refer to the <a href="http://hewgill.com/pydkim/html/">documentation</a>.
Happy DKIMing</p>]]></content:encoded>
    </item>
    <item>
      <title>Python modules you should know: dnspython</title>
      <link>http://www.topdog.za.net/2012/05/07/python-modules-you-should-know:-dnspython</link>
      <pubDate>Mon, 07 May 2012 16:40:00 SAST</pubDate>
      <category><![CDATA[Python]]></category>
      <category><![CDATA[PyMYSK]]></category>
      <category><![CDATA[Howto]]></category>
      <guid isPermaLink="true">http://www.topdog.za.net/2012/05/07/python-modules-you-should-know:-dnspython</guid>
      <description>Python modules you should know: dnspython</description>
      <content:encoded><![CDATA[<p>Next in our series of <a href="http://www.topdog.za.net/category/pymysk/"><em>Python modules you should know</em></a>
is dnspython. This package is a DNS toolkit, you can use it to perform
DNS queries, Zone transfers and Dynamic Updates in Python programs.</p>
<h2>Home page</h2>
<ul>
<li><a href="http://www.dnspython.org/">http://www.dnspython.org/</a></li>
</ul>
<h2>Use</h2>
<p>dnspython is a DNS toolkit for Python. It supports almost all record types.
It can be used for queries, zone transfers, and dynamic updates. It supports
TSIG authenticated messages and EDNS0.</p>
<p>dnspython provides both high and low level access to DNS. The high level
classes perform queries for data of a given name, type, and class, and
return an answer set. The low level classes allow direct manipulation of
DNS zones, messages, names, and records.</p>
<h2>Installation</h2>
<pre><code>pip install dnspython
</code></pre>
<h2>Usage</h2>
<p>Lookup DNS records (A, AAAA, MX, NS)</p>
<p><strong>A Records</strong></p>
<div class="pygments_murphy"><pre><span class="kn">import</span> <span class="nn">dns.resolver</span>
<span class="n">answers</span> <span class="o">=</span> <span class="n">dns</span><span class="o">.</span><span class="n">resolver</span><span class="o">.</span><span class="n">query</span><span class="p">(</span><span class="s">&#39;topdog.za.net&#39;</span><span class="p">,</span> <span class="s">&#39;A&#39;</span><span class="p">)</span>
<span class="k">for</span> <span class="n">rdata</span> <span class="ow">in</span> <span class="n">answers</span><span class="p">:</span>
    <span class="k">print</span> <span class="n">rdata</span><span class="o">.</span><span class="n">address</span>
</pre></div>

<p><strong>AAAA Records</strong></p>
<div class="pygments_murphy"><pre><span class="kn">import</span> <span class="nn">dns.resolver</span>
<span class="n">answers</span> <span class="o">=</span> <span class="n">dns</span><span class="o">.</span><span class="n">resolver</span><span class="o">.</span><span class="n">query</span><span class="p">(</span><span class="s">&#39;topdog.za.net&#39;</span><span class="p">,</span> <span class="s">&#39;AAAA&#39;</span><span class="p">)</span>
<span class="k">for</span> <span class="n">rdata</span> <span class="ow">in</span> <span class="n">answers</span><span class="p">:</span>
    <span class="k">print</span> <span class="n">rdata</span><span class="o">.</span><span class="n">address</span>
</pre></div>

<p><strong>MX Records</strong></p>
<div class="pygments_murphy"><pre><span class="kn">import</span> <span class="nn">dns.resolver</span>
<span class="n">answers</span> <span class="o">=</span> <span class="n">dns</span><span class="o">.</span><span class="n">resolver</span><span class="o">.</span><span class="n">query</span><span class="p">(</span><span class="s">&#39;topdog.za.net&#39;</span><span class="p">,</span> <span class="s">&#39;MX&#39;</span><span class="p">)</span>
<span class="k">for</span> <span class="n">rdata</span> <span class="ow">in</span> <span class="n">answers</span><span class="p">:</span>
    <span class="k">print</span> <span class="s">&#39;host&#39;</span><span class="p">,</span> <span class="n">rdata</span><span class="o">.</span><span class="n">exchange</span><span class="p">,</span> <span class="s">&#39;has preference&#39;</span><span class="p">,</span> <span class="n">rdata</span><span class="o">.</span><span class="n">preference</span>
</pre></div>

<p><strong>NS Records</strong></p>
<div class="pygments_murphy"><pre><span class="kn">import</span> <span class="nn">dns.resolver</span>
<span class="n">answers</span> <span class="o">=</span> <span class="n">dns</span><span class="o">.</span><span class="n">resolver</span><span class="o">.</span><span class="n">query</span><span class="p">(</span><span class="s">&#39;topdog.za.net&#39;</span><span class="p">,</span> <span class="s">&#39;NS&#39;</span><span class="p">)</span>
<span class="k">for</span> <span class="n">rdata</span> <span class="ow">in</span> <span class="n">answers</span><span class="p">:</span>
    <span class="k">print</span> <span class="n">rdata</span><span class="o">.</span><span class="n">to_text</span><span class="p">()</span>
</pre></div>

<p>Transfer a Zone from a server.</p>
<div class="pygments_murphy"><pre><span class="kn">import</span> <span class="nn">dns.zone</span>
<span class="kn">import</span> <span class="nn">dns.query</span>
<span class="n">zone</span> <span class="o">=</span> <span class="n">dns</span><span class="o">.</span><span class="n">zone</span><span class="o">.</span><span class="n">from_xfr</span><span class="p">(</span><span class="n">dns</span><span class="o">.</span><span class="n">query</span><span class="o">.</span><span class="n">xfr</span><span class="p">(</span><span class="s">&#39;174.136.108.83&#39;</span><span class="p">,</span> <span class="s">&#39;topdog.za.net&#39;</span><span class="p">))</span>
<span class="k">print</span> <span class="s">&quot;*&quot;</span> <span class="o">*</span> <span class="mi">10</span><span class="p">,</span> <span class="s">&quot;A records&quot;</span><span class="p">,</span> <span class="s">&quot;*&quot;</span> <span class="o">*</span> <span class="mi">10</span>
<span class="k">for</span> <span class="p">(</span><span class="n">name</span><span class="p">,</span> <span class="n">ttl</span><span class="p">,</span> <span class="n">rdata</span><span class="p">)</span> <span class="ow">in</span> <span class="n">zone</span><span class="o">.</span><span class="n">iterate_rdatas</span><span class="p">(</span><span class="s">&#39;A&#39;</span><span class="p">):</span>
    <span class="k">print</span> <span class="n">name</span><span class="p">,</span> <span class="s">&quot;with TTL&quot;</span><span class="p">,</span> <span class="n">ttl</span><span class="p">,</span> <span class="s">&quot;points to&quot;</span><span class="p">,</span> <span class="n">rdata</span>
<span class="k">print</span> <span class="s">&quot;*&quot;</span> <span class="o">*</span> <span class="mi">10</span><span class="p">,</span> <span class="s">&quot;MX records&quot;</span><span class="p">,</span> <span class="s">&quot;*&quot;</span> <span class="o">*</span> <span class="mi">10</span>
<span class="k">for</span> <span class="p">(</span><span class="n">name</span><span class="p">,</span> <span class="n">ttl</span><span class="p">,</span> <span class="n">rdata</span><span class="p">)</span> <span class="ow">in</span> <span class="n">zone</span><span class="o">.</span><span class="n">iterate_rdatas</span><span class="p">(</span><span class="s">&#39;MX&#39;</span><span class="p">):</span>
    <span class="k">print</span> <span class="n">name</span><span class="p">,</span> <span class="s">&quot;with TTL&quot;</span><span class="p">,</span> <span class="n">ttl</span><span class="p">,</span> <span class="s">&quot;points to&quot;</span><span class="p">,</span> <span class="n">rdata</span>
<span class="k">print</span> <span class="s">&quot;*&quot;</span> <span class="o">*</span> <span class="mi">10</span><span class="p">,</span> <span class="s">&quot;NS records&quot;</span><span class="p">,</span> <span class="s">&quot;*&quot;</span> <span class="o">*</span> <span class="mi">10</span>
<span class="k">for</span> <span class="p">(</span><span class="n">name</span><span class="p">,</span> <span class="n">ttl</span><span class="p">,</span> <span class="n">rdata</span><span class="p">)</span> <span class="ow">in</span> <span class="n">zone</span><span class="o">.</span><span class="n">iterate_rdatas</span><span class="p">(</span><span class="s">&#39;NS&#39;</span><span class="p">):</span>
    <span class="k">print</span> <span class="n">name</span><span class="p">,</span> <span class="s">&quot;with TTL&quot;</span><span class="p">,</span> <span class="n">ttl</span><span class="p">,</span> <span class="s">&quot;points to&quot;</span><span class="p">,</span> <span class="n">rdata</span>
</pre></div>

<p>Generate reverse names</p>
<div class="pygments_murphy"><pre><span class="kn">import</span> <span class="nn">dns.reversename</span>
<span class="k">print</span> <span class="n">dns</span><span class="o">.</span><span class="n">reversename</span><span class="o">.</span><span class="n">from_address</span><span class="p">(</span><span class="s">&#39;174.136.108.83&#39;</span><span class="p">)</span>
</pre></div>

<p>Perform a Dynamic record update (example from documentation modified)</p>
<div class="pygments_murphy"><pre><span class="kn">import</span> <span class="nn">dns.query</span>
<span class="kn">import</span> <span class="nn">dns.tsigkeyring</span>
<span class="kn">import</span> <span class="nn">dns.update</span>
<span class="kn">import</span> <span class="nn">sys</span>

<span class="k">if</span> <span class="n">__name__</span> <span class="o">==</span> <span class="s">&#39;__main__&#39;</span><span class="p">:</span>
    <span class="n">keyring</span> <span class="o">=</span> <span class="n">dns</span><span class="o">.</span><span class="n">tsigkeyring</span><span class="o">.</span><span class="n">from_text</span><span class="p">({</span>
        <span class="s">&#39;host-example.&#39;</span> <span class="p">:</span> <span class="s">&#39;XXXXXXXXXXXXXXXXXXXXXX==&#39;</span>
    <span class="p">})</span>
    <span class="c"># Replace an A record</span>
    <span class="n">update</span> <span class="o">=</span> <span class="n">dns</span><span class="o">.</span><span class="n">update</span><span class="o">.</span><span class="n">Update</span><span class="p">(</span><span class="s">&#39;example.com&#39;</span><span class="p">,</span> <span class="n">keyring</span><span class="o">=</span><span class="n">keyring</span><span class="p">)</span>
    <span class="n">update</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s">&#39;host&#39;</span><span class="p">,</span> <span class="mi">300</span><span class="p">,</span> <span class="s">&#39;a&#39;</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 class="n">response</span> <span class="o">=</span> <span class="n">dns</span><span class="o">.</span><span class="n">query</span><span class="o">.</span><span class="n">tcp</span><span class="p">(</span><span class="n">update</span><span class="p">,</span> <span class="s">&#39;10.0.0.1&#39;</span><span class="p">)</span>
</pre></div>

<h2>And there is more</h2>
<p>There is more that can be done using this package please refer to
the <a href="http://www.dnspython.org/docs/1.10.0/html/">documentation</a>.</p>]]></content:encoded>
    </item>
    <item>
      <title>Python modules you should know: IPy</title>
      <link>http://www.topdog.za.net/2012/05/06/python-modules-you-should-know:-ipy</link>
      <pubDate>Sun, 06 May 2012 16:40:00 SAST</pubDate>
      <category><![CDATA[Python]]></category>
      <category><![CDATA[PyMYSK]]></category>
      <category><![CDATA[Howto]]></category>
      <guid isPermaLink="true">http://www.topdog.za.net/2012/05/06/python-modules-you-should-know:-ipy</guid>
      <description>Python modules you should know: IPy</description>
      <content:encoded><![CDATA[<p>Next in our series of <a href="http://www.topdog.za.net/category/pymysk/"><em>Python modules you should know</em></a>
is IPy. This package is used to manipulate IPv4 and IPv6 addresses in Python programs.</p>
<h2>Home page</h2>
<ul>
<li><a href="https://github.com/haypo/python-ipy/">https://github.com/haypo/python-ipy/</a></li>
</ul>
<h2>Use</h2>
<p>The IP class allows a comfortable parsing and handling for most
notations in use for IPv4 and IPv6 addresses and networks. It was
greatly inspired by RIPE's Perl module NET::IP's interface but
doesn't share the implementation.</p>
<h2>Installation</h2>
<pre><code>pip install IPy
</code></pre>
<h2>Usage</h2>
<p>Print IP addresses in an IP range</p>
<div class="pygments_murphy"><pre><span class="kn">from</span> <span class="nn">IPy</span> <span class="kn">import</span> <span class="n">IP</span>
<span class="n">network</span> <span class="o">=</span> <span class="n">IP</span><span class="p">(</span><span class="s">&#39;192.168.0.0/30&#39;</span><span class="p">)</span>
<span class="k">for</span> <span class="n">ip</span> <span class="ow">in</span> <span class="n">network</span><span class="p">:</span>
    <span class="k">print</span> <span class="n">ip</span>
</pre></div>

<p>Output:</p>
<pre><code>192.168.0.0
192.168.0.1
192.168.0.2
192.168.0.3
</code></pre>
<p>Generate Reverse names for reverse lookup/PTR records</p>
<div class="pygments_murphy"><pre><span class="kn">from</span> <span class="nn">IPy</span> <span class="kn">import</span> <span class="n">IP</span>
<span class="n">network</span> <span class="o">=</span> <span class="n">IP</span><span class="p">(</span><span class="s">&#39;192.168.0.0/30&#39;</span><span class="p">)</span>
<span class="k">for</span> <span class="n">ip</span> <span class="ow">in</span> <span class="n">network</span><span class="p">:</span>
    <span class="k">print</span> <span class="n">ip</span><span class="o">.</span><span class="n">reverseName</span><span class="p">()</span>
</pre></div>

<div class="pygments_murphy"><pre><span class="kn">from</span> <span class="nn">IPy</span> <span class="kn">import</span> <span class="n">IP</span>
<span class="n">network</span> <span class="o">=</span> <span class="n">IP</span><span class="p">(</span><span class="s">&#39;192.168.0.0/30&#39;</span><span class="p">)</span><span class="o">.</span><span class="n">reverseNames</span><span class="p">()</span>
<span class="k">for</span> <span class="n">ip</span> <span class="ow">in</span> <span class="n">network</span><span class="p">:</span>
    <span class="k">print</span> <span class="n">ip</span>
</pre></div>

<p>Output:</p>
<pre><code>0.0.168.192.in-addr.arpa.
1.0.168.192.in-addr.arpa.
2.0.168.192.in-addr.arpa.
3.0.168.192.in-addr.arpa.
</code></pre>
<p>Check IP version:</p>
<div class="pygments_murphy"><pre><span class="kn">from</span> <span class="nn">IPy</span> <span class="kn">import</span> <span class="n">IP</span>
<span class="k">print</span> <span class="n">IP</span><span class="p">(</span><span class="s">&#39;192.168.0.0/30&#39;</span><span class="p">)</span><span class="o">.</span><span class="n">version</span><span class="p">()</span>
<span class="k">print</span> <span class="n">IP</span><span class="p">(</span><span class="s">&#39;::1&#39;</span><span class="p">)</span><span class="o">.</span><span class="n">version</span><span class="p">()</span>
</pre></div>

<p>Output:</p>
<pre><code>4
6
</code></pre>
<p>Get network prefixes</p>
<div class="pygments_murphy"><pre><span class="kn">from</span> <span class="nn">IPy</span> <span class="kn">import</span> <span class="n">IP</span>
<span class="k">print</span> <span class="n">IP</span><span class="p">(</span><span class="s">&#39;192.168.0.0/30&#39;</span><span class="p">)</span>
<span class="k">print</span> <span class="n">IP</span><span class="p">(</span><span class="s">&#39;192.168.0.0/255.255.255.252&#39;</span><span class="p">)</span>
<span class="k">print</span> <span class="n">IP</span><span class="p">(</span><span class="s">&#39;192.168.0.0-192.168.0.3)</span>
</pre></div>

<p>Output:</p>
<pre><code>192.168.0.0/30
192.168.0.0/30
192.168.0.0/30
</code></pre>
<p>Get the broadcast address</p>
<div class="pygments_murphy"><pre><span class="kn">from</span> <span class="nn">IPy</span> <span class="kn">import</span> <span class="n">IP</span>
<span class="k">print</span> <span class="n">IP</span><span class="p">(</span><span class="s">&#39;192.168.0.0/30&#39;</span><span class="p">)</span><span class="o">.</span><span class="n">broadcast</span><span class="p">()</span>
</pre></div>

<p>Output:</p>
<pre><code>192.168.0.3
</code></pre>
<p>Get the network mask</p>
<div class="pygments_murphy"><pre><span class="kn">from</span> <span class="nn">IPy</span> <span class="kn">import</span> <span class="n">IP</span>
<span class="k">print</span> <span class="n">IP</span><span class="p">(</span><span class="s">&#39;192.168.0.0/30&#39;</span><span class="p">)</span><span class="o">.</span><span class="n">netmask</span><span class="p">()</span>
</pre></div>

<p>Output:</p>
<pre><code>255.255.255.252
</code></pre>
<p>Check if an IP address is within a network</p>
<div class="pygments_murphy"><pre><span class="kn">from</span> <span class="nn">IPy</span> <span class="kn">import</span> <span class="n">IP</span>
<span class="s">&#39;192.168.0.1&#39;</span> <span class="ow">in</span> <span class="n">IP</span><span class="p">(</span><span class="s">&#39;192.168.0.0/30&#39;</span><span class="p">)</span>
</pre></div>

<p>Check a network type LOOPBACK, PRIVATE, PUBLIC, RESERVED</p>
<div class="pygments_murphy"><pre><span class="kn">from</span> <span class="nn">IPy</span> <span class="kn">import</span> <span class="n">IP</span>
<span class="k">print</span> <span class="n">IP</span><span class="p">(</span><span class="s">&#39;192.168.0.1&#39;</span><span class="p">)</span><span class="o">.</span><span class="n">iptype</span><span class="p">()</span>
</pre></div>

<p>Output:</p>
<pre><code>PRIVATE
</code></pre>
<h2>And there is more</h2>
<p>There is more that can be done using this package please refer to
the documentation or run.</p>
<div class="pygments_murphy"><pre><span class="kn">import</span> <span class="nn">IPy</span>
<span class="n">help</span><span class="p">(</span><span class="n">IPy</span><span class="p">)</span>
</pre></div>]]></content:encoded>
    </item>
    <item>
      <title>Python modules you should know: PyClamd</title>
      <link>http://www.topdog.za.net/2012/05/02/python-modules-you-should-know:-pyclamd</link>
      <pubDate>Wed, 02 May 2012 12:39:00 SAST</pubDate>
      <category><![CDATA[Python]]></category>
      <category><![CDATA[PyMYSK]]></category>
      <category><![CDATA[Howto]]></category>
      <guid isPermaLink="true">http://www.topdog.za.net/2012/05/02/python-modules-you-should-know:-pyclamd</guid>
      <description>Python modules you should know: PyClamd</description>
      <content:encoded><![CDATA[<p>Next in our series of <a href="http://www.topdog.za.net/category/pymysk/"><em>Python modules you should know</em></a>
is PyClamd. This package is used integrate Clamav Virus detection in Python programs.</p>
<h2>Home page</h2>
<ul>
<li><a href="http://xael.org/norman/python/pyclamd/">http://xael.org/norman/python/pyclamd/</a></li>
</ul>
<h2>Use</h2>
<p>pyClamd is a python interface to Clamd (Clamav daemon). By using pyClamd, you can add
virus detection capabilities to your python software in an efficient and easy way.</p>
<p>pyClamd may be used by a closed source product, as it does not link with the GPL licensed
libclamav.</p>
<h2>Installation</h2>
<p>This package is not available on the cheeseshop (PYPI) so you need to install it by
downloading the module.</p>
<pre><code>wget http://xael.org/norman/python/pyclamd/pyclamd.py
mv pyclamd.py $(python -c "from distutils.sysconfig import get_python_lib; print get_python_lib()")/
</code></pre>
<h2>Usage</h2>
<p>pyClamd supports connections to clamd using both TCP and UNIX sockets.</p>
<p><strong>TCP</strong></p>
<div class="pygments_murphy"><pre><span class="kn">import</span> <span class="nn">pyclamd</span>
<span class="n">pyclamd</span><span class="o">.</span><span class="n">init_network_socket</span><span class="p">(</span><span class="s">&#39;localhost&#39;</span><span class="p">,</span> <span class="mi">3310</span><span class="p">)</span>
<span class="k">print</span> <span class="n">pyclamd</span><span class="o">.</span><span class="n">version</span><span class="p">()</span>
</pre></div>

<p>Output:</p>
<pre><code>ClamAV 0.97.4/14869/Tue May  1 22:38:26 2012
</code></pre>
<p><strong>Unix socket</strong></p>
<div class="pygments_murphy"><pre><span class="kn">import</span> <span class="nn">pyclamd</span>
<span class="n">pyclamd</span><span class="o">.</span><span class="n">init_unix_socket</span><span class="p">(</span><span class="s">&#39;/tmp/clamd.socket&#39;</span><span class="p">)</span>
<span class="k">print</span> <span class="n">pyclamd</span><span class="o">.</span><span class="n">version</span><span class="p">()</span>
</pre></div>

<p>Output:</p>
<pre><code>ClamAV 0.97.4/14869/Tue May  1 22:38:26 2012
</code></pre>
<p><strong>Scan files</strong></p>
<div class="pygments_murphy"><pre><span class="kn">import</span> <span class="nn">pyclamd</span>
<span class="n">pyclamd</span><span class="o">.</span><span class="n">init_unix_socket</span><span class="p">(</span><span class="s">&#39;/tmp/clamd.socket&#39;</span><span class="p">)</span>
<span class="n">pyclamd</span><span class="o">.</span><span class="n">contscan_file</span><span class="p">(</span><span class="s">&#39;/tmp&#39;</span><span class="p">)</span>
</pre></div>

<p><strong>Scan and stop if virus detected</strong></p>
<div class="pygments_murphy"><pre><span class="kn">import</span> <span class="nn">pyclamd</span>
<span class="n">pyclamd</span><span class="o">.</span><span class="n">init_unix_socket</span><span class="p">(</span><span class="s">&#39;/tmp/clamd.socket&#39;</span><span class="p">)</span>
<span class="n">pyclamd</span><span class="o">.</span><span class="n">scan_file</span><span class="p">(</span><span class="s">&#39;/tmp&#39;</span><span class="p">)</span>
</pre></div>

<p><strong>Ping server to check if still alive</strong></p>
<div class="pygments_murphy"><pre><span class="kn">import</span> <span class="nn">pyclamd</span>
<span class="n">pyclamd</span><span class="o">.</span><span class="n">init_unix_socket</span><span class="p">(</span><span class="s">&#39;/tmp/clamd.socket&#39;</span><span class="p">)</span>
<span class="n">pyclamd</span><span class="o">.</span><span class="n">ping</span><span class="p">()</span>
</pre></div>

<p><strong>Scan a stream</strong></p>
<div class="pygments_murphy"><pre><span class="kn">import</span> <span class="nn">pyclamd</span>
<span class="n">pyclamd</span><span class="o">.</span><span class="n">init_unix_socket</span><span class="p">(</span><span class="s">&#39;/tmp/clamd.socket&#39;</span><span class="p">)</span>
<span class="n">mystring</span> <span class="o">=</span> <span class="s">&#39;X5O!P%@AP[4\PZX54(P^)7CC)7}$EICAR-STANDARD-ANTIVIRUS-TEST-FILE!$H+H*&#39;</span>
<span class="n">pyclamd</span><span class="o">.</span><span class="n">scan_stream</span><span class="p">(</span><span class="n">mystring</span><span class="p">)</span>
</pre></div>

<p>Output:</p>
<pre><code>{'stream': 'Eicar-Test-Signature'}
</code></pre>
<p><strong>Reload clamd</strong></p>
<div class="pygments_murphy"><pre><span class="kn">import</span> <span class="nn">pyclamd</span>
<span class="n">pyclamd</span><span class="o">.</span><span class="n">init_unix_socket</span><span class="p">(</span><span class="s">&#39;/tmp/clamd.socket&#39;</span><span class="p">)</span>
<span class="n">pyclamd</span><span class="o">.</span><span class="n">reload</span><span class="p">()</span>
</pre></div>

<p>Output:</p>
<pre><code>'RELOADING'
</code></pre>
<p><strong>Shutdown clamd</strong></p>
<div class="pygments_murphy"><pre><span class="kn">import</span> <span class="nn">pyclamd</span>
<span class="n">pyclamd</span><span class="o">.</span><span class="n">init_unix_socket</span><span class="p">(</span><span class="s">&#39;/tmp/clamd.socket&#39;</span><span class="p">)</span>
<span class="n">pyclamd</span><span class="o">.</span><span class="n">shutdown</span><span class="p">()</span>
</pre></div>

<p>The module raises various exceptions that you will need to catch, please refer to the
<a href="http://xael.org/norman/python/pyclamd/">documentation</a> for details.</p>]]></content:encoded>
    </item>
    <item>
      <title>Python modules you should know: Pwtools</title>
      <link>http://www.topdog.za.net/2012/05/01/python-modules-you-should-know:-pwtools</link>
      <pubDate>Tue, 01 May 2012 12:39:00 SAST</pubDate>
      <category><![CDATA[Python]]></category>
      <category><![CDATA[PyMYSK]]></category>
      <category><![CDATA[Howto]]></category>
      <guid isPermaLink="true">http://www.topdog.za.net/2012/05/01/python-modules-you-should-know:-pwtools</guid>
      <description>Python modules you should know: Pwtools</description>
      <content:encoded><![CDATA[<p>Next in our series of <a href="http://www.topdog.za.net/category/pymysk/"><em>Python modules you should know</em></a>
is Pwtools. This package is used to generate and test passwords in Python programs.</p>
<h2>Home page</h2>
<ul>
<li><a href="http://alastairs-place.net/projects/pwtools/">http://alastairs-place.net/projects/pwtools/</a></li>
</ul>
<h2>Use</h2>
<p>pwtools is a Python package that provides the ability to generate passwords, and
also allows you to test them to ensure that they are reasonably secure.</p>
<p>The algorithms used were borrowed from the <a href="http://www.openwall.com/">Openwall</a> Project’s
<a href="http://www.openwall.com/passwdqc">passwdqc</a> project, but have been re-implemented in Python
for increased portability.</p>
<h2>Installation</h2>
<p>This package is not available on the cheeseshop (PYPI) so you need to install it from the
Mercurial repository.</p>
<pre><code>pip install hg+http://alastairs-place.net/hg/pwtools
</code></pre>
<h2>Usage</h2>
<p>Generate a strong password:</p>
<div class="pygments_murphy"><pre><span class="kn">from</span> <span class="nn">pwtools</span> <span class="kn">import</span> <span class="n">PasswordGenerator</span>
<span class="n">pwgen</span> <span class="o">=</span> <span class="n">PasswordGenerator</span><span class="p">()</span>
<span class="n">pwgen</span><span class="o">.</span><span class="n">generate</span><span class="p">()</span>
</pre></div>

<p>Output:</p>
<pre><code>'amaze*Period&amp;Thirst'
</code></pre>
<p>Check password strength:</p>
<div class="pygments_murphy"><pre><span class="kn">from</span> <span class="nn">pwtools</span> <span class="kn">import</span> <span class="n">PasswordChecker</span>
<span class="n">pwchecker</span> <span class="o">=</span> <span class="n">PasswordChecker</span><span class="p">(</span><span class="s">&#39;/usr/share/dict/words&#39;</span><span class="p">)</span>
<span class="n">pwchecker</span><span class="o">.</span><span class="n">checkPassword</span><span class="p">(</span><span class="s">&#39;password&#39;</span><span class="p">)</span>
<span class="n">pwchecker</span><span class="o">.</span><span class="n">checkPassword</span><span class="p">(</span><span class="s">&#39;zxcvbnm&#39;</span><span class="p">)</span>
<span class="n">pwchecker</span><span class="o">.</span><span class="n">checkPassword</span><span class="p">(</span><span class="s">&#39;123456abcdef&#39;</span><span class="p">)</span>
<span class="n">pwchecker</span><span class="o">.</span><span class="n">checkPassword</span><span class="p">(</span><span class="s">&#39;m1ll10n&#39;</span><span class="p">)</span>
<span class="n">pwchecker</span><span class="o">.</span><span class="n">checkPassword</span><span class="p">(</span><span class="s">&#39;amaze*Period&amp;Thirst&#39;</span><span class="p">)</span>
</pre></div>

<p>Output:</p>
<pre><code>'too simple (not enough different kinds of character)'
'too simple (not enough different kinds of character)'
'based on a common sequence of characters'
'too simple (not enough different kinds of character)'
False
</code></pre>]]></content:encoded>
    </item>
    <item>
      <title>Python modules you should know: SlimIt</title>
      <link>http://www.topdog.za.net/2012/04/30/python-modules-you-should-know:-slimit</link>
      <pubDate>Mon, 30 Apr 2012 07:10:00 SAST</pubDate>
      <category><![CDATA[Python]]></category>
      <category><![CDATA[PyMYSK]]></category>
      <category><![CDATA[Howto]]></category>
      <guid isPermaLink="true">http://www.topdog.za.net/2012/04/30/python-modules-you-should-know:-slimit</guid>
      <description>Python modules you should know: SlimIt</description>
      <content:encoded><![CDATA[<p>Next in our series of <a href="http://www.topdog.za.net/category/pymysk/"><em>Python modules you should know</em></a>
is SlimIt. I previously <a href="http://www.topdog.za.net/2012/04/29/python-modules-you-should-know:-cssmin/">wrote</a>
about the minification of CSS files, the Slimit package is used for minification of Javascript files.</p>
<h2>Home page</h2>
<ul>
<li><a href="http://slimit.org/">http://slimit.org/</a></li>
</ul>
<h2>Use</h2>
<p>SlimIt is a JavaScript minifier written in Python. It compiles JavaScript into more compact
code so that it downloads and runs faster.</p>
<p>SlimIt also provides a library that includes a JavaScript parser, lexer, pretty printer and
a tree visitor.</p>
<h2>Installation</h2>
<pre><code>pip install slimit
</code></pre>
<h2>Usage</h2>
<p>The package provides a command line interface as well as Python functions.</p>
<h3>Python functions</h3>
<h4>Minify Javascript</h4>
<div class="pygments_murphy"><pre><span class="kn">from</span> <span class="nn">slimit</span> <span class="kn">import</span> <span class="n">minify</span>
<span class="n">minified</span> <span class="o">=</span> <span class="n">minify</span><span class="p">(</span><span class="nb">open</span><span class="p">(</span><span class="s">&#39;jquery-1.7.2.js&#39;</span><span class="p">)</span><span class="o">.</span><span class="n">read</span><span class="p">(),</span> <span class="n">mangle</span><span class="o">=</span><span class="bp">True</span><span class="p">,</span> <span class="n">mangle_toplevel</span><span class="o">=</span><span class="bp">True</span><span class="p">)</span>
<span class="k">print</span> <span class="n">minified</span>
</pre></div>

<h4>Modify Javascript within Python and beautify it</h4>
<p>This example is taken directly from the documentation. It modifies the counter variable
changing it from <strong>"i"</strong> to <strong>"hello"</strong> and formats it in a more readable style.</p>
<div class="pygments_murphy"><pre><span class="kn">from</span> <span class="nn">slimit.parser</span> <span class="kn">import</span> <span class="n">Parser</span>
<span class="kn">from</span> <span class="nn">slimit.visitors</span> <span class="kn">import</span> <span class="n">nodevisitor</span>
<span class="kn">from</span> <span class="nn">slimit</span> <span class="kn">import</span> <span class="n">ast</span>

<span class="n">parser</span> <span class="o">=</span> <span class="n">Parser</span><span class="p">()</span>
<span class="n">tree</span> <span class="o">=</span> <span class="n">parser</span><span class="o">.</span><span class="n">parse</span><span class="p">(</span><span class="s">&#39;for(var i=0; i&lt;10; i++) {var x=5+i;}&#39;</span><span class="p">)</span>
<span class="k">for</span> <span class="n">node</span> <span class="ow">in</span> <span class="n">nodevisitor</span><span class="o">.</span><span class="n">visit</span><span class="p">(</span><span class="n">tree</span><span class="p">):</span>
    <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">node</span><span class="p">,</span> <span class="n">ast</span><span class="o">.</span><span class="n">Identifier</span><span class="p">)</span> <span class="ow">and</span> <span class="n">node</span><span class="o">.</span><span class="n">value</span> <span class="o">==</span> <span class="s">&#39;i&#39;</span><span class="p">:</span>
        <span class="n">node</span><span class="o">.</span><span class="n">value</span> <span class="o">=</span> <span class="s">&#39;hello&#39;</span>
<span class="k">print</span> <span class="n">tree</span><span class="o">.</span><span class="n">to_ecma</span><span class="p">()</span>
</pre></div>

<p>Output:</p>
<pre><code>for (var hello = 0; hello &lt; 10; hello++) {
  var x = 5 + hello;
}
</code></pre>
<h3>Command line</h3>
<pre><code>slimit --mangle &lt; jquery-1.7.2.js &gt; jquery-1.7.2.slimit.default.js
</code></pre>
<h4>Performance</h4>
<p>The performance is very good, most times it creates smaller files than the <a href="http://developer.yahoo.com/yui/compressor/">YUI compresser</a>.
I tested minifying Jquery using 3 javascript minification tools:</p>
<ul>
<li>jsmin</li>
<li>yuicompressor</li>
<li>slimit</li>
</ul>
<p>The results are below.</p>
<pre><code>-rw-r--r--  1 andrew  staff   247K Mar 21 21:46 jquery-1.7.2.js
-rw-r--r--  1 andrew  staff   138K Apr 30 08:26 jquery-1.7.2.jsmin.js
-rw-r--r--  1 andrew  staff    96K Apr 30 08:22 jquery-1.7.2.slimit.js
-rw-r--r--  1 andrew  staff   103K Apr 30 08:19 jquery-1.7.2.yui.js
</code></pre>
<h2>And there is more</h2>
<p>Slimit also exposes JavaScript <a href="https://en.wikipedia.org/wiki/Parser">parser</a> and
<a href="https://en.wikipedia.org/wiki/Lexical_analysis">lexer</a> functions which you can use within your code,
please refer to the <a href="http://slimit.readthedocs.org/en/latest/index.html#using-lexer-in-your-project">documentation</a> for usage information.</p>]]></content:encoded>
    </item>
  </channel>
</rss>
