user-avatar
Today is Monday
21 May, 2012

7 September, 2011

Apache Include directive & wildcards in directory names

by Wes — Categories: Apache, Linux — Tags: , , , , , , Leave a comment

Overview

What apache is happy to do:

Include /etc/http.d/conf.d/*.conf

As you know this includes every *.conf file in the /etc/httpd/conf.d directory, which is fine but it would make more sense for it to be able to do this.

Include /var/sites/*/vhost-staging*.conf

This would then look in each web app directory and find out if there was a conf file that matches vhost-staging*.conf, this would then match.

/var/sites/app1/vhost-staging-app1.conf
/var/sites/monkeys/vhost-staging-monkeys.conf
/var/sites/badger/vhost-staging-badger.conf

Which would mean that we would no longer have to maintain the /etc/httpd/conf.d/ files manually, which would not only be easier from a maintenance point of view but would mean the config stays with the project which is really where it belongs.

Unfortunately apache doesn’t do this, but after a lot of creative solutions, I found others had this problem and there’s a patch to just make apache do it.  It does mean compiling apache from source, but it’s not at all difficult.

Solution

  1. Dowload the apache source
  2. Untar the tarball
  3. Download the 2 patches to the appropriate location
  4. Apply the patches
  5. Compile the apache source as normal
lynx -source http://www.mirrorservice.org/sites/ftp.apache.org/httpd/httpd-2.2.19.tar.bz2 > /opt/apache/building/downloads/httpd-2.2.19.tar.bz2
tar jxvf /opt/apache/building/downloads/httpd-2.2.19.tar.bz2 -C /opt/apache/building/source

lynx -source 'https://issues.apache.org/bugzilla/attachment.cgi?id=22328' > /opt/apache/building/source/httpd-2.2.19/server/Includes.diff
patch -p0 -d /opt/apache/building/source/httpd-2.2.19 -i /opt/apache/building/source/httpd-2.2.19/server/Includes.diff

lynx -source 'https://issues.apache.org/bugzilla/attachment.cgi?id=22325' > /opt/apache/building/source/httpd-2.2.19/srclib/apr/strings/Apr.diff
patch -p0 -d /opt/apache/building/source/httpd-2.2.19/srclib/apr -i /opt/apache/building/source/httpd-2.2.19/srclib/apr/strings/Apr.diff

cd /opt/apache/building/source/httpd-2.2.19
./configure
...

I’m going to follow up this post with a series of posts on how we now manage apache confs, especially with Symfony2 projects.

31 May, 2011

Fedora 14 to 15 upgrade guide

by Wes — Categories: Fedora, KDE, Linux — Tags: , , , , Leave a comment

Introduction

Well, it’s that time again. Despite it being possible to do a straight upgrade using yum, it’s currently not supported by Fedora, I have tried it before and it has left me with headaches on more than one occasion. So this is my upgrade procedure for Fedora.

Overview

  1. Perform housekeeping tasks on /home/Wes
  2. Back up /home/Wes to safe location
  3. Record packages currently installed by yum
  4. Back up /etc/ to safe location
  5. Install a fresh, bare setup of Fedora
  6. Restore yum packages
  7. Restore backed up files

Perform Housekeeping Tasks

This is exactly what it sounds like.   Over the course of a year, a lot of cruft gets, extracted, downloaded, exported and generally left about the place.  Delete it all, take 20 minutes to identify the easy wins (downloaded iso’s, old cachegrind files etc) and delete as appropriate.

Back up /home/Wes to safe location

When all that is complete, back up your home directory, I use the following method to rsync the files to a mounted nas device. It’s much faster if you have a directly connected USB Hard drive, or a spare partition to do this. Obviously backing something up to another partition is not really backing something up but it’s fine for this operation.

rsync -P -v -r /home/Wes/ /mnt/cifs/nas/Fedora/

Conventional wisdom suggests that you shouldn’t need to overwrite your /home partition when doing an install.  However I have found that starting a new version of KDE with an old /home/Wes/.kde is really more trouble than it’s worth.  Besides which, it never hurts to backup your /home directories ;)

Record packages currently installed by yum

While the backup is happening, now is the time to record all the installed yum packages to a text file that will be parsed later to get all the same packages back.

rpm -qa | sed 's/\-[0-9].*//' > /mnt/cifs/nas/Dump/installed_yum_packages.txt

Back up /etc to safe location

It’s really worth backing up your conf files, the filesize is really not that large and they can come in really useful ;)

tar cjfv /mnt/cifs/nas/Dump/etc_files.tar.bz2 /etc

Install Fedora

Install Fedora with whatever settings your heart desires.   I have created this partitioning layout with a backups partition to make this procedure easier when fedora 16 comes along.

Restore Yum Packages

Log into Fedora and then open a Konsole to recover the /etc files archive and the list of installed packages

scp wes@nas:/Dump/installed_yum_packages.txt ~

Restore access to any repositories that you had before

su -c 'yum localinstall --nogpgcheck http://download1.rpmfusion.org/free/fedora/rpmfusion-free-release-stable.noarch.rpm http://download1.rpmfusion.org/nonfree/fedora/rpmfusion-nonfree-release-stable.noarch.rpm'

And then run the script to install the rpms which should restore your system to it’s previous package level

yum -y install $(cat ~/installed_yum_packages.txt

This may take a while!

Restore Backed Up Files

Get your home directory back.

rsync -P -v -r /mnt/cifs/nas/Fedora/ /backups/

When everything’s restored (to a location that’s not /home/Wes) I then selectively drag across what I need into my new /home/Wes directory as and when I need it. (It’s another great way to essentially “delete” unnecessary files)

Epilogue

I know that it’s not perfect, and some may even say unnecessarily long winded but I have found that even a small problem with upgrade conflicts can eat up a day! I have found that this gives me the cleanest install for Fedora/KDE with the least headaches when it comes to conf file version changes and other issues that sometimes arise with old versions of libraries.  I would love to hear your thoughts on your methods, or even criticisms of mine.

17 May, 2011

PHP Using Zend framework to display new tweets as KDE notifications

by Wes — Categories: Fedora, Linux, PHP — Tags: , , , , , Leave a comment

Concept

I love following people on twitter, but I sometimes forget to check for new messages. I decided the best way to alert me of new tweets would be to have them appear as KDE notifications as shown below. In order to complete this I make use of the Zend framework, and Derick Rethans’ pecl library for DBUS interactionto display the tweets as notifications.

Alert showing a new tweet in KDE notifier

Connecting to Twitter with PHP

The first step was to investigate how to connect to Twitter, which is not as simple as sending a username & password and seeing if they like it. Twitter announced that basic authentication was going to be closed down in August 2010 as they migrated to OAuth login. Thankfully the Zend framework now has Oauth built into their Twitter classes which makes this very easy.

Tokens & Keys

First of all, log into twitter.com and then go to the twitter development portal and click on 2. Register an app. After filling in the form you will be provided with 4 essential items.

  1. Consumer Key
  2. Consumer Secret
  3. Oauth Token (under “My Access Token”)
  4. Oauth Token Secret (under “My Access Token”)

PHP Code

Bare minimum php to get the twitter feed

This will retrieve your twitter feed as a simple XML object.

< ?php

set_include_path('../../Includes/');
require_once '../../Includes/Zend/Loader/Autoloader.php';
$loader = Zend_Loader_Autoloader::getInstance();

$token = new Zend_Oauth_Token_Access;
$oathParams = array();
$oathParams['oauth_token'] = 'insert your appropriate details from twitter here';
$oathParams['oauth_token_secret'] = 'insert your appropriate details from twitter here';
$token->setParams($oathParams);

$twitterParams = array();
$twitterParams['consumerKey'] = 'insert your appropriate details from twitter here';
$twitterParams['consumerSecret'] = 'insert your appropriate details from twitter here';
$twitterParams['accessToken'] = $token;
$twitter = new Zend_Service_Twitter($twitterParams);

$timeline = $twitter->statusFriendsTimeline($timelineParams);
var_dump($timeline);

?>

Bare minimum php dbus code to display a desktop notification

The first part makes use of Derick’s PECL extension to connect to the DBUS messaging system. The second part sets up the parameters to pass to the method. Of course I could just enter these parameters directly into the method call, but having them in this array makes it much easier for me to see what each parameter represents as it’s passed through to dbus.

&lt; ?php

$DBus = new Dbus( Dbus::BUS_SESSION );
$DBusProxy = $DBus-&gt;createProxy
(
"org.freedesktop.Notifications", // connection name
"/org/freedesktop/Notifications", // object
"org.freedesktop.Notifications" // interface
);

$notifyParams = array();
$notifyParams['app_name'] = 'Twitter';
$notifyParams['replaces_id'] = new DBusUInt32(0);
$notifyParams['app_icon'] = '';
$notifyParams['summary'] = $title;
$notifyParams['body'] = '<a href="http://twitter.com/">'.$message.'</a>';
$notifyParams['actions'] = new DBusArray(DBus::STRING, array());
$notifyParams['hints'] = new DBusDict( DBus::VARIANT, array());
$notifyParams['timeout'] = 9000;

$returnId = $DBusProxy-&gt;Notify
(
$notifyParams['app_name'],
$notifyParams['replaces_id'],
$notifyParams['app_icon'],
$notifyParams['summary'],
$notifyParams['body'],
$notifyParams['actions'],
$notifyParams['hints'],
$notifyParams['timeout']
);

?&gt;

Putting it to use

Lines 3 to 5 This first section is the code necessary to include the Zend Framework files. Setting the timezone prevents warnings appearing in the console about strtotime.
Lines 7 to 17 This next section sets up the objects for creating an oauth token and using that object to connect to Twitter
Line 20 By setting the post count parameter to 1, it ensures we only retrieve one post
Lines 24 to 36 The procedure starts and builds a console message. The first time the feed is retrieved, the id of the tweet is also collected. Subsequent calls pass this id to make sure you don’t receive the same tweet twice.
Line 40 to 80 statusFriendsTimeline is the method for retrieving the time-line as a simple XML object. The object is traversed with a foreach and the parameters for the DBUS Notify method are built from the details of the tweet, the messages appear in the KDE window as pictured above.
Line 83 There is a catch loop in the event that Twitter returns an error. The exception is caught to prevent php exiting
&lt; ?php

set_include_path('../../Includes/');
require_once '../../Includes/Zend/Loader/Autoloader.php';
$loader = Zend_Loader_Autoloader::getInstance();

$token = new Zend_Oauth_Token_Access;
$oathParams = array();
$oathParams['oauth_token'] = 'insert your appropriate details from twitter here';
$oathParams['oauth_token_secret'] = 'insert your appropriate details from twitter here';
$token-&gt;setParams($oathParams);

$twitterParams = array();
$twitterParams['consumerKey'] = 'insert your appropriate details from twitter here';
$twitterParams['consumerSecret'] = 'insert your appropriate details from twitter here';
$twitterParams['accessToken'] = $token;
$twitter = new Zend_Service_Twitter($twitterParams);

$timelineParams = array();
$timelineParams['count'] = 1;

while (true)
{
$consoleMessage = 'Checking for tweets';
if (isset ($lastTweetID))
{
$consoleMessage .= ' since tweet #' . $lastTweetID;
$consoleMessage .= ' by ' . $lastTweetName;
$consoleMessage .= ' created on ' . $lastTweetTime;
$timelineParams['since_id'] = $lastTweetID;
}
else
{
$consoleMessage .= ' for the first time';
}
echo $consoleMessage . "\n";

try
{
$timeline = $twitter-&gt;statusFriendsTimeline($timelineParams);
foreach ($timeline as $status)
{
$title = '"' . 'New tweet by '. $status-&gt;user-&gt;name . '"';
$message = str_replace('"', '\"', $status-&gt;text);
$lastTweetName = (string)$status-&gt;user-&gt;name;
$lastTweetID = (string)$status-&gt;id;
$lastTweetTime = (string)$status-&gt;created_at;

$DBus = new Dbus( Dbus::BUS_SESSION );
$DBusProxy = $DBus-&gt;createProxy
(
"org.freedesktop.Notifications", // connection name
"/org/freedesktop/Notifications", // object
"org.freedesktop.Notifications" // interface
);

$notifyParams = array();
$notifyParams['app_name'] = 'Twitter';
$notifyParams['replaces_id'] = new DBusUInt32(0);
$notifyParams['app_icon'] = '';
$notifyParams['summary'] = $title;
$notifyParams['body'] = '<a href="http://twitter.com/">'.$message.'</a>';
$notifyParams['actions'] = new DBusArray(DBus::STRING, array());
$notifyParams['hints'] = new DBusDict( DBus::VARIANT, array());
$notifyParams['timeout'] = 9000;

$returnId = $DBusProxy-&gt;Notify
(
$notifyParams['app_name'],
$notifyParams['replaces_id'],
$notifyParams['app_icon'],
$notifyParams['summary'],
$notifyParams['body'],
$notifyParams['actions'],
$notifyParams['hints'],
$notifyParams['timeout']
);
}

}
catch (Exception $e)
{
echo 'Caught exception: Restarting in 30 seconds', $e-&gt;getMessage(), "\n";
}

echo 'Sleeping for 30 seconds' . "\n\n";
sleep(30);
}
?&gt;

Execution

Open a konsole and execute the php file and you should see the results…

php ./GetTwitterFeed.php
Checking for tweets for the first time
Executing kdialog --title "New tweet by Derick Rethans" --passivepopup "Done with my \"Profiling PHP Applications\" talk at #4developers If you were there, please rate at http://joind.in/3200" 15
Sleeping for 30 seconds

Checking for tweets since tweet #54887445040332800 by Derick Rethans created on Mon Apr 04 12:46:01 +0000 2011
Sleeping for 30 seconds

Quite simple really, please comment if you found this useful. Next will be something similar but for RSS feeds.

29 March, 2011

Ssh-askpass, KDE wallet & passwordless key unlocking

by Wes — Categories: Linux, SSH — Tags: , , , , 3 Comments

If you are using KDE, then you can use ksshaskpass, which is a KDE version of ssh-askpass which works with your passwords in KDE Wallet. Here are the steps to get this up and running.

  1. Uninstall Install ksshaskpass
    sudo yum install ksshaskpass
    
  2. Create a startup script as to change the SSH_ASKPASS environment variables. Enter the following command to create the script file.
    cat >~/.kde/Autostart/ssh-add.sh < <_EOT_
    #!/bin/sh
    export SSH_ASKPASS=/usr/bin/ksshaskpass
    ssh-add 
    
  3. Make the file executable
    chmod +x ~/.kde/Autostart/ssh-add.sh
    
  4. The script will run automatically at logon, but run it manually to get the process started
    ~/.kde/Autostart/ssh-add.sh
    

Edit:

If you are not seeing SSH_ASKPASS properly set by the script, it’s probably being overwritten somewhere else. I looked into SChee’s problem where it was set to /usr/libexec/openssh/gnome-ssh-askpass.

First of all, I found out what package provides that file.

[root@laptop Wes]# yum provides /usr/libexec/openssh/gnome-ssh-askpass
Loaded plugins: langpacks, presto, refresh-packagekit
Adding en_US to language list
rpmfusion-free-updates/filelists_db                | 148 kB     00:00
rpmfusion-nonfree-updates/filelists_db             |  48 kB     00:00  

openssh-askpass-5.5p1-21.fc14.2.x86_64 : A passphrase dialog for OpenSSH and X
Repo        : fedora
Matched from:
Filename    : /usr/libexec/openssh/gnome-ssh-askpass

openssh-askpass-5.5p1-24.fc14.2.x86_64 : A passphrase dialog for OpenSSH and X
Repo        : updates
Matched from:
Filename    : /usr/libexec/openssh/gnome-ssh-askpass

This shows us that openssh-askpass is providing that file, let’s see what other files come with that binary that might make it work…

[root@laptop Wes]# repoquery --list openssh-askpass
/etc/profile.d/gnome-ssh-askpass.csh
/etc/profile.d/gnome-ssh-askpass.sh
/usr/libexec/openssh/gnome-ssh-askpass
/usr/libexec/openssh/ssh-askpass

Well, we can see that files being executed that are probably setting the environment variables are in /etc/profile.d and it will probably be safe to just erase the package, but lets have a look at the files just out of curiosity.

[root@laptop profile.d]# cat /etc/profile.d/gnome-ssh-askpass.sh
SSH_ASKPASS=/usr/libexec/openssh/gnome-ssh-askpass
export SSH_ASKPASS

That’s the culprit!, so we can erase that package and hopefully see that dissapear…

[root@laptop profile.d]# yum erase openssh-askpass
Loaded plugins: langpacks, presto, refresh-packagekit
Adding en_US to language list
Setting up Remove Process
Resolving Dependencies
--> Running transaction check
---> Package openssh-askpass.x86_64 0:5.5p1-24.fc14.2 set to be erased
--> Finished Dependency Resolution

Dependencies Resolved

==================================================================================
 Package             Arch         Version                 Repository          Size
==================================================================================
Removing:
 openssh-askpass     x86_64       5.5p1-24.fc14.2         @updates            13 k

Transaction Summary
==================================================================================
Remove        1 Package(s)

Installed size: 13 k
Is this ok [y/N]: y
Downloading Packages:
Running rpm_check_debug
Running Transaction Test
Transaction Test Succeeded
Running Transaction
  Erasing        : openssh-askpass-5.5p1-24.fc14.2.x86_64           1/1 

Removed:
  openssh-askpass.x86_64 0:5.5p1-24.fc14.2
Complete!

Let me know if that sorts your problems :)

22 March, 2011

How to set up passwordless ssh login

by Wes — Categories: Linux, SSH — Tags: , Leave a comment

I have made a series of posts about the various issues with regards to setting up passwordless SSH login. I have put all the steps in order below. Open each step, follow and when tick it off when it’s complete – your browser should remember the check boxes while you navigate backwards and forwards :)

  1. Install ssh client packages (if you don’t already have them)
  2. Generate DSA keys -OR- Add passwords to your existing keys
  3. Copy your SSH id to your remote systems
  4. Set up ssh-agent
  5. Add keys to your ssh-agent & test

Please comment if this was useful for you.

22 March, 2011

Add keys to ssh-agent

by Wes — Categories: Linux, SSH — Tags: , , , 1 Comment
  • The SSH Agent acts as a keysafe.
  • You can add your ssh keys to it.
  • When you add a key, you are asked for the key’s pass-phrase.
  • Keys are added to the agent unlocked.
  • Once the safe is opened, you have access to all unlocked keys inside.

When you have ssh agent running and configured adding a key to the agent is a very simple process. You use the ssh-agent command with the key you want to add to the agent and then enter the key’s password when asked.

[romeo@laptop ~]$ ssh-add ~/.ssh/id_dsa
Enter passphrase for /home/romeo/.ssh/id_dsa:
Identity added: /home/romeo/.ssh/id_dsa (/home/romeo/.ssh/id_dsa)
[romeo@laptop ~]$

When the keys have been added to the agent, it will keep the password you entered meaning you will no longer have to enter the password to connect to any remote systems.

11 March, 2011

Setting up ssh-agent

by Wes — Categories: Linux, SSH — Tags: , , , , , 2 Comments

Installing ssh-agent

Most systems come with ssh-agent as part of an SSH client package. This page will show you how to install SSH clients on many platforms

Configuring ssh-agent

If you have a modern Linux system, chances are that you will already have ssh-agent running. To see if it’s running enter this command.

[Wes@laptop ~]$ pgrep ssh-agent
2013

If the above command returns a number (such as 2013 above) then you have the agent running. To find which process started the ssh-agent you can use pstree to find out the parent process(es)

[Wes@laptop ~]$ pstree
...
     ├─kdm─┬─X
     │     └─kdm───startkde─┬─kwrapper4
     │                      └─ssh-agent
...

As you can see in this example, ssh-agent is started on my system by the KDE login interface kdm. GDM does the same thing if you are a gnome user.

While there are other window managers and even hardcore users that don’t use one at all, I’m not going to cover launching the ssh-agent automatically for those cases in this post, please comment if you are interested in seeing how that’s done.

28 February, 2011

How to add a password to a passwordless SSH key

by Wes — Categories: Linux, SSH — Tags: , 1 Comment

In the event that you have made some passwordless keys (e.g. to remotely login to a system without a password) and now you want to add a password, the following command takes care of that. Many re-generate the keys and assign a password to the new keys only to have to go through the process of exchanging SSH keys all over again. This way you can avoid that whole process.

ssh-keygen -f ~/.ssh/id_dsa -p

So What’s Happening Here?

ssh-keygen Command to work with SSH keys
-i ~/.ssh/id_dsa.pub Specify the key file that you want to assign a password to
-p Flag to prompt password changing.

Hope this helps!

17 February, 2011

How to install SSH clients

by Wes — Categories: Linux, SSH — Tags: Leave a comment

It’s very rare that a modern system comes without an SSH client pre-installed, here are a few ways of getting it online.

Fedora

yum install openssh-clients

Centos

yum install openssh-clients

Note, I am a Fedora user and I can’t vouch for any of these below, please feel free to add corrections in the comments section :)

Ubuntu

apt-get install openssh-client

Suse

yast -i openssh

Debian

apt-get install ssh 

Windows

Download and install PuTTY or better still cygwin

OSX

There’s one installed from the DVD by default, just open a terminal and type ssh :)

17 February, 2011

How to generate SSH2 DSA keys

by Wes — Categories: Linux, SSH — Tags: , , , , 3 Comments

As SSH1 has been superseded with the more robust and secure SSH2, this post covers how to generate keys in order to use them for logging into remote systems (input entered is in red, pressing enter is represented by a )

  1. First make sure you have OpenSSH installed, this comes on nearly all grown up operating systems, here’s a quick way to install ssh clients on some systems
  2. Generate SSH keys specifying the key type as dsa (SSH2)
    [romeo@laptop ~]$ ssh-keygen -t dsa
    Generating public/private dsa key pair.
  3. The command will then ask you where to save the keys, the default location is usually fine, so just press Enter.
    Enter file in which to save the key (/home/romeo/.ssh/id_dsa):
    Created directory '/home/romeo/.ssh'.
  4. You will then be asked to enter a passphrase. If you want to use these keys unattended (i.e. as part of a cron job) then hit enter. Don’t hit enter if you are looking to perform password-less logins, there are more secure ways to do that, which I’ll cover later!
    Enter passphrase (empty for no passphrase):c0mpl3x!
    Enter same passphrase again:c0mpl3x!
    Your identification has been saved in /home/romeo/.ssh/id_dsa.
    Your public key has been saved in /home/romeo/.ssh/id_dsa.pub.
    The key fingerprint is:
    45:d5:9f:54:77:95:3e:5d:3d:70:39:1b:c1:52:c4:c6 romeo@laptop.local
    The key's randomart image is:
    +--[ DSA 1024]----+
    |          ...oB=%|
    |         .   .oE=|
    |          .   =.O|
    |         .     =o|
    |        S       .|
    |                 |
    |                 |
    |                 |
    |                 |
    +-----------------+
  5. That’s it, the SSH2 keypair is now generated, the files are placed inside the ~/.ssh folder
    [romeo@laptop ~]$ tree .ssh/
    .ssh/
    ├── id_dsa
    └── id_dsa.pub
    0 directories, 2 files
  6. The public key file [~/.ssh/id_dsa.pub] looks like this (it’s all on one line)
    [romeo@laptop ~]$ cat .ssh/id_dsa.pub
    ssh-dss AAAAB3NzaC1kc3MAAACBAMyS3yNdLYLoV4upJ8HtCbUzVll1XVYeVik1LXfu/lGwwQ7oZqyytf2LzwGX1VExNkoLm+mpNqCo2qwJ9tYnuww1yUjcBtB223DYX7w03S087AXNeYHf9FCv0G4CdmmQMunhrfz5LziaEkjq92lRMtf27IyiwTW0aZJtXv+VEhAAAAFQCOpEZIShk3bNFehMxNKNYHBTvVCQAAAIEAlOr0wOshO6yqkP02MecgYyXjFH2eGiam6+coGi3pdfSpLEXYuROxdQU58Kdvr32GkWOujunXuSSx2siTnSftxqwCeCPXK8NXK6auIwiNxHU4HRBPcsD2gvyEBZrxAChdlgK0+exCXM5ZEW9ZsDuyIGJ0bKm2yTzebuavIpQkAAACAQ3R8mccEb2gBNGo90e7a0DK++CFOIbRfingOmQZ8vJ1H99nLh6pXU7mKOMYuKp5MMjnFoyRWOnNjTC5wtFwpiGfCnzc+Ujw3XV9WQHdlER6Qk1MZj+M9gziMZ1QZTFsBuvF1VWdZkxjlgAxggjKvhIMQa3xrs26DGY4Q+6 romeo@laptop.local
  7. The private key file [ ~/.ssh/id_dsa] looks like this
    [romeo@laptop ~]$ cat .ssh/id_dsa
    ssh-dss -----BEGIN DSA PRIVATE KEY-----
    MIIBvAIBAAKBgQDMkt8jXS2C6FeLqSfB7Qm1M1ZZdV1WHlYpNS137v5RsMEO6Gas
    srX9i88Bl9VRMTZKC5vpqTagqNqsCfbWJ7sMNclI3AbQdttw2BF+8NN0tPO/wFzX
    mB3/RQr9BuAnZpkDLp4a38+S84mhJI6vdpUTLX9uyMosE1tGmSbV7/lRIQIVAI6k
    RkhKGTds0V6EzE0o1gcFO9UJAoGBAJTq9MCvzrITusqpD9NjHnIGMl4xR9nhompu
    vnKBot6XX0qSxF2LkTsXUFOfCnb699hpFjro7p17kksdrIk50n7casAngj1yvDVy
    umriMIjcR1OB0QT3LA9oL8hAWa8QHgoXZYCtPnsQlzOWRFvWbA7siBidGyptsk83
    m7mryKUJAoGAQ3R8mccEb2gBNGo90/e7a0DK++CFOIbRfingOmQZ8vJ1H99nLh6p
    XU7mK0/OMYuKp5MMjnFoyRWOnNjTC5wtFwpi/GfCnzc+Ujw3XV9WQHdlER6Qk1MZ
    j+M9gziMZ1QZTFsBuvF1VWdZkxjlgAxggjKvhIMQa3xrs26DGY4Q+6oCFQCM6WiS
    zJ5YXDYT1OHNRimUeGm/Fw==
    -----END DSA PRIVATE KEY-----
    
© 2012 Wes Thompson All rights reserved - Wallow theme v0.46.4 by ([][]) TwoBeers - Powered by WordPress - Have fun!