<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">

  <title><![CDATA[Jackl0phty's Blog]]></title>
  <link href="http://jackl0phty.org/atom.xml" rel="self"/>
  <link href="http://jackl0phty.org/"/>
  <updated>2016-05-24T20:54:16-04:00</updated>
  <id>http://jackl0phty.org/</id>
  <author>
    <name><![CDATA[Gerald L. Hevener Jr., M.S.]]></name>
    
  </author>
  <generator uri="http://octopress.org/">Octopress</generator>

  
  <entry>
    <title type="html"><![CDATA[How to Back Files up to S3 DevOPS Style With OpsChef]]></title>
    <link href="http://jackl0phty.org/2013/09/19/how-to-back-files-up-to-s3-devops-style-with-opschef/"/>
    <updated>2013-09-19T19:43:00-04:00</updated>
    <id>http://jackl0phty.org/2013/09/19/how-to-back-files-up-to-s3-devops-style-with-opschef</id>
    <content type="html"><![CDATA[<p>This blog post will discuss how to copy files to Amazon&#8217;s <a href="http://aws.amazon.com/s3/">simple storage service (S3)</a> using
<a href="http://www.getchef.com/">Opscode Chef</a>.&nbsp;&nbsp;Awright, let&#8217;s get krack-a-lackin!</p>

<h2>This Blog Post Makes the Following Assumptions</h2>

<p>&nbsp;&nbsp;&nbsp;1.  You have successfully installed <a href="http://www.opscode.com/chef/install/">chef-client</a>.</p>

<p>&nbsp;&nbsp;&nbsp;2.  You have a working <a href="http://docs.opscode.com/knife_configure.html">knife config</a>.</p>

<p>&nbsp;&nbsp;&nbsp;3.  You have either a working <a href="http://docs.opscode.com/install_server.html">open source chef server</a> or you&#8217;re using <a href="http://www.opscode.com/enterprise-chef/">enterprise chef</a>.</p>

<p>&nbsp;&nbsp;&nbsp; Note: Enterprise Chef comes with <strong>5 free nodes</strong>!</p>

<!-- more -->


<p>So let&#8217;s start off by installing my <a href="http://community.opscode.com/cookbooks/amazon_s3cmd">amazon_s3cmd cookbook</a> like so:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>luke@alderaan:~ $ knife cookbook site install amazon_s3cmd</span></code></pre></td></tr></table></div></figure>


<p>Next you&#8217;ll need a secret key for your databag.</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>luke@alderaan:~ $ openssl rand -base64 512 > data_bag_secret_key</span></code></pre></td></tr></table></div></figure>


<p>Now create a new data bag item that will be used.</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>skywalker@alderaan:~/your/chef-repo$ knife data bag create  --secret-file ~/data_bag_secret_key s3cmd s3cfg 
</span><span class='line'>Created data_bag[s3cmd] 
</span><span class='line'>Created data_bag_item[s3cfg]</span></code></pre></td></tr></table></div></figure>


<p>If you get the following error below&#8230;</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>ERROR: RuntimeError: Please set EDITOR environment variable</span></code></pre></td></tr></table></div></figure>


<p>..make sure you export your editor as EDITOR</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>export EDITOR=vim</span></code></pre></td></tr></table></div></figure>


<p>Verify your encrypted data bag items.</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>skywaler@alderaan:~/your/chef-repo$ knife data bag show s3cmd s3cfg 
</span><span class='line'>id:            s3cfg 
</span><span class='line'>s3_access_key: 
</span><span class='line'>  cipher:         aes-256-cbc 
</span><span class='line'>  encrypted_data:  BUNCH_OF_RANDOM_CHARS_HERE
</span><span class='line'>
</span><span class='line'>iv: RANDOM_CHARS_HERE
</span><span class='line'>
</span><span class='line'>version: 1 s3_secret_key: cipher: aes-256-cbc encrypted_data: BUNCH_OF_RANDOM_CHARS_HERE
</span><span class='line'>
</span><span class='line'>iv: RANDOM_CHARS_HERE
</span><span class='line'>
</span><span class='line'>version: 1 skywaler@alderaan:~/your/chef-repo$</span></code></pre></td></tr></table></div></figure>


<p>Now check your decrypted data bag items</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>skywaler@alderaan:~/your/chef-repo$ knife data bag show –secret-file=/home/you/data_bag_secret_key s3cmd s3cfg 
</span><span class='line'>id:            s3cfg 
</span><span class='line'>s3_access_key: YOUR_ACCESS_KEY_HERE
</span><span class='line'>s3_secret_key: YOUR_SECRET_KEY_HERE</span></code></pre></td></tr></table></div></figure>


<p>Copy your secret key to your node.</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>skywalker@alderaan:~ $ scp /home/you/data_bag_secret_key skywalker@alderaan: 
</span><span class='line'>skywalker@alderaan's password: 
</span><span class='line'>data_bag_secret_key</span></code></pre></td></tr></table></div></figure>


<p>Move your key to /etc/chef.</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>skywalker@alderaan:~ $ sudo mv /home/skywalker/data_bag_secret_key /etc/chef/</span></code></pre></td></tr></table></div></figure>


<p>Include the <code>amazon_s3cmd::source</code> recipe in your node&#8217;s run_list if you want the latest beta version which supports adavnced features:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>{
</span><span class='line'>  "name":"my_node",
</span><span class='line'>  "run_list": [
</span><span class='line'>    "recipe[amazon_s3cmd::source]"
</span><span class='line'>  ]
</span><span class='line'>}</span></code></pre></td></tr></table></div></figure>


<p>Run chef-client on your node to update it&#8217;s configuration and install &amp; configure s3cmd like so:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>skywalker@alderaan:~ $ sudo chef-client</span></code></pre></td></tr></table></div></figure>


<h1>Confirm your s3cmd configuration</h1>

<p>If you took the defaults, your s3cmd&#8217;s config file will be located at <code>/root/.s3cfg</code> and should look something like the following:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
<span class='line-number'>32</span>
<span class='line-number'>33</span>
<span class='line-number'>34</span>
<span class='line-number'>35</span>
<span class='line-number'>36</span>
<span class='line-number'>37</span>
<span class='line-number'>38</span>
<span class='line-number'>39</span>
<span class='line-number'>40</span>
<span class='line-number'>41</span>
<span class='line-number'>42</span>
<span class='line-number'>43</span>
<span class='line-number'>44</span>
<span class='line-number'>45</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>skywalker@alderaan:~# sudo cat /root/.s3cfg 
</span><span class='line'>[default]
</span><span class='line'>access_key = YOUR_ACCESS_KEY_HERE!
</span><span class='line'>bucket_location = US
</span><span class='line'>cloudfront_host = cloudfront.amazonaws.com
</span><span class='line'>default_mime_type = binary/octet-stream
</span><span class='line'>delete_removed = False
</span><span class='line'>dry_run = False
</span><span class='line'>enable_multipart = True
</span><span class='line'>encoding = UTF-8
</span><span class='line'>encrypt = False
</span><span class='line'>follow_symlinks = False
</span><span class='line'>force = False
</span><span class='line'>get_continue = False
</span><span class='line'>gpg_command = /usr/bin/gpg
</span><span class='line'>gpg_decrypt = %(gpg_command)s -d --verbose --no-use-agent --batch --yes --passphrase-fd %(passphrase_fd)s -o %(output_file)s %(input_file)s
</span><span class='line'>gpg_encrypt = %(gpg_command)s -c --verbose --no-use-agent --batch --yes --passphrase-fd %(passphrase_fd)s -o %(output_file)s %(input_file)s
</span><span class='line'>gpg_passphrase =
</span><span class='line'>guess_mime_type = True
</span><span class='line'>host_base = s3.amazonaws.com
</span><span class='line'>host_bucket = %(bucket)s.s3.amazonaws.com
</span><span class='line'>human_readable_sizes = False
</span><span class='line'>invalidate_on_cf = False
</span><span class='line'>list_md5 = False
</span><span class='line'>log_target_prefix =
</span><span class='line'>mime_type =
</span><span class='line'>multipart_chunk_size_mb = 15
</span><span class='line'>preserve_attrs = True
</span><span class='line'>progress_meter = True
</span><span class='line'>proxy_host =
</span><span class='line'>proxy_port = 0
</span><span class='line'>recursive = False
</span><span class='line'>recv_chunk = 4096
</span><span class='line'>reduced_redundancy = False
</span><span class='line'>secret_key = YOUR_SECRET_KEY_HERE!
</span><span class='line'>send_chunk = 4096
</span><span class='line'>simpledb_host = sdb.amazonaws.com
</span><span class='line'>skip_existing = False
</span><span class='line'>socket_timeout = 300
</span><span class='line'>urlencoding_mode = normal
</span><span class='line'>use_https = True
</span><span class='line'>verbosity = WARNING
</span><span class='line'>website_endpoint = http://%(bucket)s.s3-website-%(location)s.amazonaws.com/
</span><span class='line'>website_error =
</span><span class='line'>website_index = index.html</span></code></pre></td></tr></table></div></figure>


<h2>BACK YO STUFF UP</h2>

<p>If you made it this far; CONGRATS! You should now be ready to back files up to S3.</p>

<p>So, for example, let&#8217;s say you have some backups in /mnt/backups you&#8217;d like to tar up and copy to S3.</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>skywalker@alderaan:~# ls /mnt/backups/
</span><span class='line'>backup1.tar.gz    backup2.tar.gz</span></code></pre></td></tr></table></div></figure>


<p>You can tar up your backups like so:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>skywalker@alderaan:~# tar zcvhf /tmp/backups.tar.gz /mnt/backups
</span><span class='line'>tar: Removing leading `/' from member names
</span><span class='line'>/mnt/backups/
</span><span class='line'>/mnt/backups/backup1.tar.gz
</span><span class='line'>/mnt/backups/backup2.tar.gz
</span><span class='line'>jackl0phty:~# ls -alh /tmp/backups.tar.gz 
</span><span class='line'>-rw-r--r-- 1 root root 167 Dec 19 19:05 /tmp/backups.tar.gz</span></code></pre></td></tr></table></div></figure>


<p>As you can see above, this will create a tar archive of the /mnt/backups directory and save it as /tmp/backups.tar.gz.</p>

<p>Next, let&#8217;s create an S3 bucket that we can use to copy our backups to like so:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>skywalker@alderaan:~# s3cmd mb s3://jackl0phty-backups</span></code></pre></td></tr></table></div></figure>


<p>Now, copy your backup to your S3 bucket:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>skywalker@alderaan:~# s3cmd put /tmp/backups.tar.gz s3://jackl0phty-backups</span></code></pre></td></tr></table></div></figure>


<p>Finally, you should now be able to display the contents of your bucket like so:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>skywalker@alderaan:~# s3cmd ls /tmp/backups.tar.gz s3://jackl0phty-backups</span></code></pre></td></tr></table></div></figure>


<h1>Contributing</h1>

<p>You&#8217;d like to contribute? That&#8217;s freaking awesome! Here&#8217;s how.</p>

<ol>
<li>Fork the repository on Github by clicking <a href="https://github.com/jackl0phty/opschef-cookbook-amazon_s3cmd/fork">here</a>.</li>
<li>Create a topic branch (like <code>yourname-add-awesomeness</code>).</li>
<li>Write you change.</li>
<li>Write tests for your change (if applicable).</li>
<li>Run the tests, ensuring they all pass.</li>
<li>Submit a Pull Request using Github <a href="https://github.com/jackl0phty/opschef-cookbook-amazon_s3cmd">here</a>.</li>
</ol>

]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Jackl0phty's Raspberry Pi Adventures Part 1: Format SDCARD and Write Raspbian Image]]></title>
    <link href="http://jackl0phty.org/2013/08/29/jackl0phtys-raspberry-pi-adventures-part-1-format-sdcard-and-write-raspbian-image/"/>
    <updated>2013-08-29T18:44:00-04:00</updated>
    <id>http://jackl0phty.org/2013/08/29/jackl0phtys-raspberry-pi-adventures-part-1-format-sdcard-and-write-raspbian-image</id>
    <content type="html"><![CDATA[<p>This blog post will discuss how to get started using your <a href="http://www.raspberrypi.org/">Raspberry Pi</a>.
Hopefully, this will be the first of many Raspberry Pi related posts to come.
This post will focus on how to format your SDCARD and write the Raspbian image to it.
This blog post will assume that you&#8217;re using either a UNIX or Linux based system.</p>

<p>Awright, let&#8217;s get crackin&#8217; and hopefully learn some stuff! :).</p>

<p>First, <code>tail -f</code> whatever log you&#8217;re writing kernel messages to. For most people this is either /var/log/messages or /var/log/kern.log.</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>skywalker@thedeathstar ~ # tail -f /var/log/kern.log</span></code></pre></td></tr></table></div></figure>




<!-- more -->


<p>Second insert your SDCARD in whatever device you&#8217;re using to do the formatting with.
You should now see similar output in your terminal running <code>tail -f</code> like below:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>skywalker@thedeathstar ~ # tail -f /var/log/kern.log
</span><span class='line'>Aug  9 18:26:18 glh-laptop3 kernel: [ 1490.840220] mmc0: new high speed SDXC card at address b368 
</span><span class='line'>Aug  9 18:26:18 glh-laptop3 kernel: [ 1490.874698] mmcblk0: mmc0:b368       59.6 GiB 
</span><span class='line'>Aug  9 18:26:18 glh-laptop3 kernel: [ 1490.882594]  mmcblk0: p1</span></code></pre></td></tr></table></div></figure>


<p>As you can see from above device mmcblk0 is the device name of my SDCARD. This will probably be different for you.
Let&#8217;s use <code>fdisk -l</code> to make sure we&#8217;ve identified the right device.</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>root@glh-laptop3:~# fdisk -l /dev/mmcblk0
</span><span class='line'>
</span><span class='line'>Disk /dev/mmcblk0: 64.1 GB, 64054362112 bytes 
</span><span class='line'>255 heads, 63 sectors/track, 7787 cylinders, total 125106176 sectors 
</span><span class='line'>Units = sectors of 1 * 512 = 512 bytes 
</span><span class='line'>Sector size (logical/physical): 512 bytes / 512 bytes 
</span><span class='line'>I/O size (minimum/optimal): 512 bytes / 512 bytes 
</span><span class='line'>Disk identifier: 0x00000000 
</span><span class='line'>
</span><span class='line'>        Device Boot      Start         End      Blocks   Id  System 
</span><span class='line'>/dev/mmcblk0p1           32768   125106175    62536704    7  HPFS/NTFS/exFAT</span></code></pre></td></tr></table></div></figure>


<p>Since I know my SDCARD is 64GB in size I&#8217;m pretty confident I&#8217;ve got the right device.
Now let&#8217;s <code>wget</code> our <a href="http://www.raspbian.org/">Raspbian</a> image like so:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>skywalker@thedeathstar:/mnt/usb/iso# wget -c http://files.velocix.com/c1410/images/raspbian/2013-07-26-wheezy-raspbian/2013-07-26-wheezy-raspbian.zip 
</span><span class='line'>--2013-08-09 21:35:06--  http://files.velocix.com/c1410/images/raspbian/2013-07-26-wheezy-raspbian/2013-07-26-wheezy-raspbian.zip 
</span><span class='line'>Resolving files.velocix.com (files.velocix.com)... 212.187.212.226 
</span><span class='line'>Connecting to files.velocix.com (files.velocix.com)|212.187.212.226|:80... connected. 
</span><span class='line'>HTTP request sent, awaiting response... 302 Found 
</span><span class='line'>Location: http://212.187.212.153/bt/3edc0f51c47c6283ec08c37913fb56e1eddaeaeb/data/2013-07-26-wheezy-raspbian.zip [following] 
</span><span class='line'>--2013-08-09 21:35:06--  http://212.187.212.153/bt/3edc0f51c47c6283ec08c37913fb56e1eddaeaeb/data/2013-07-26-wheezy-raspbian.zip 
</span><span class='line'>Connecting to 212.187.212.153:80... connected. 
</span><span class='line'>HTTP request sent, awaiting response... 200 OK 
</span><span class='line'>Length: 518475358 (494M) [application/zip] 
</span><span class='line'>Saving to: `2013-07-26-wheezy-raspbian.zip' 
</span><span class='line'>
</span><span class='line'>100%[==========================================================================================================================================================================>] 518,475,358 1.10M/s   in 7m 18s  
</span><span class='line'>
</span><span class='line'>2013-08-09 21:42:25 (1.13 MB/s) - `2013-07-26-wheezy-raspbian.zip' saved [518475358/518475358] 
</span><span class='line'>
</span><span class='line'>skywalker@thedeathstar:/mnt/usb/iso#</span></code></pre></td></tr></table></div></figure>


<p>Next use <code>unzip</code> to unzip the Raspbian disk image like so:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>skywalker@thedeathstar:/mnt/usb/iso# unzip 2013-07-26-wheezy-raspbian.zip 
</span><span class='line'>Archive:  2013-07-26-wheezy-raspbian.zip 
</span><span class='line'>  inflating: 2013-07-26-wheezy-raspbian.img</span></code></pre></td></tr></table></div></figure>


<p>Now use <code>dd</code>to write the Raspbian disk image to your SDCARD like so:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>skywalker@thedeathstar:/mnt/usb/iso# dd bs=4M if=2013-07-26-wheezy-raspbian.img of=/dev/mmcblk0 
</span><span class='line'>mmcblk0 
</span><span class='line'>root@glh-laptop3:/mnt/usb/iso# dd bs=4M if=2013-07-26-wheezy-raspbian.img of=/dev/mmcblk0 
</span><span class='line'>462+1 records in 
</span><span class='line'>462+1 records out 
</span><span class='line'>1939865600 bytes (1.9 GB) copied, 261.699 s, 7.4 MB/s</span></code></pre></td></tr></table></div></figure>


<p>If you made it this far congrats! You should be ready to insert you SDCARD into your pi, hook things up, plugin the power adapter, and boot up Raspbian.</p>

<p>However, I had an issue in which I simply had no video what so ever. If you experience the same, and you&#8217;re using HDMI, you may need to do the
following to get video working on your pi. This assumes you have your SDCARD mounted at /media.</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>skywalker@thedeathstar: ~ # cat /media/boot/config.txt |grep safe 
</span><span class='line'># uncomment if you get no picture on HDMI for a default "safe" mode 
</span><span class='line'>hdmi_safe=1</span></code></pre></td></tr></table></div></figure>


<p>Uncomment the above line in config.txt to enable hdmi_safe mode.</p>

<p>Well that&#8217;s it. Hopefully at this point you can at least boot up your pi running Raspbian!</p>

<p>Stay tuned to my blog for future posts on the Raspberry Pi!</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Deploy a caching Bind9 CHROOTed DNS server with Opscode Chef]]></title>
    <link href="http://jackl0phty.org/2013/05/24/deploy-a-caching-bind9-chrooted-dns-server-with-opscode-chef/"/>
    <updated>2013-05-24T19:53:00-04:00</updated>
    <id>http://jackl0phty.org/2013/05/24/deploy-a-caching-bind9-chrooted-dns-server-with-opscode-chef</id>
    <content type="html"><![CDATA[<p>This blog post will discuss how to use the industry leading configuration management tool <a href="https://learnchef.opscode.com/">Chef</a>, from <a href="http://www.opscode.com/">Opscode</a>, to deploy a caching Bind9
DNS server installed in a CHROOT jail environment.</p>

<p>First download and install my bind-chroot cookbook from within your main chef-repo like so:</p>

<figure class='code'><figcaption><span>Install my bind-chroot cookbook from the community site </span></figcaption>
<div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>skywalker@laptop ~/chef-repo/ $ knife cookbook site install bind-chroot</span></code></pre></td></tr></table></div></figure>




<!-- more -->


<p>Include the bind-chroot::chroot recipe in your node&#8217;s runlist like so:</p>

<figure class='code'><figcaption><span>Add bind-chroot::chroot recipe to your node&#8217;s runlist </span></figcaption>
<div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>{
</span><span class='line'>    "normal": {
</span><span class='line'>    },
</span><span class='line'>    "name": "dns1",
</span><span class='line'>    "chef_environment": "production",
</span><span class='line'>    "override": {
</span><span class='line'>    },
</span><span class='line'>  "production": {
</span><span class='line'>    },
</span><span class='line'>    "json_class": "Chef::Node",
</span><span class='line'>    "automatic": {
</span><span class='line'>    },
</span><span class='line'>    "run_list": [
</span><span class='line'>  "recipe[bind-chroot::chroot]"
</span><span class='line'>
</span><span class='line'>    ],
</span><span class='line'>    "chef_type": "node"
</span><span class='line'>}</span></code></pre></td></tr></table></div></figure>


<p>Update your node&#8217;s definition like so:</p>

<figure class='code'><figcaption><span>Update your node&#8217;s definition </span></figcaption>
<div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>skywaler@laptop ~/chef-repo/ $ knife node from file nodes/dns1.json
</span><span class='line'>Updated Node dns1!
</span><span class='line'>skywalker@laptop ~/chef-repo/ $</span></code></pre></td></tr></table></div></figure>


<p>Now run chef-client on the node you want to deploy bind9 to like so:</p>

<figure class='code'><figcaption><span>Run chef-client on node you want to install bind9 on </span></figcaption>
<div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>dns1 ~ # chef-client
</span><span class='line'>Starting Chef Client, version 11.4.4
</span><span class='line'>[2013-05-28T13:02:51-04:00] INFO: *** Chef 11.4.4 ***</span></code></pre></td></tr></table></div></figure>


<p>If all went well named should now be installed in a CHROOT, jailed to /var/bind9/chroot, &amp; listening.
We can check if named is listening with netstat like so:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>glh-laptop2 etc # netstat -nlp |grep named
</span><span class='line'>tcp        0      0 10.102.180.85:53        0.0.0.0:*               LISTEN      6057/named      
</span><span class='line'>tcp        0      0 127.0.0.1:53            0.0.0.0:*               LISTEN      6057/named      
</span><span class='line'>tcp        0      0 127.0.0.1:953           0.0.0.0:*               LISTEN      6057/named      
</span><span class='line'>tcp6       0      0 :::53                   :::*                    LISTEN      6057/named      
</span><span class='line'>tcp6       0      0 ::1:953                 :::*                    LISTEN      6057/named      
</span><span class='line'>udp        0      0 10.102.180.85:53        0.0.0.0:*                           6057/named      
</span><span class='line'>udp        0      0 127.0.0.1:53            0.0.0.0:*                           6057/named      
</span><span class='line'>udp6       0      0 :::53                   :::*                                6057/named</span></code></pre></td></tr></table></div></figure>


<p>As you can see from the netstat output above, named is listening on TCP and UDP ports 53.</p>

<p>By default Bind9, on Debian &amp; derivatives, is already configured as a &#8220;caching only&#8221; name server.</p>

<p>Let&#8217;s test Bind9&#8217;s caching by looking up a domain, say google.com, with our dns client dig like so</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
<span class='line-number'>32</span>
<span class='line-number'>33</span>
<span class='line-number'>34</span>
<span class='line-number'>35</span>
<span class='line-number'>36</span>
<span class='line-number'>37</span>
<span class='line-number'>38</span>
<span class='line-number'>39</span>
<span class='line-number'>40</span>
<span class='line-number'>41</span>
<span class='line-number'>42</span>
<span class='line-number'>43</span>
<span class='line-number'>44</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>dns1 ~ # dig google.com @localhost
</span><span class='line'>
</span><span class='line'>; &lt;&lt;>> DiG 9.9.2-P1 &lt;&lt;>> google.com @localhost
</span><span class='line'>;; global options: +cmd
</span><span class='line'>;; Got answer:
</span><span class='line'>;; ->>HEADER&lt;&lt;- opcode: QUERY, status: NOERROR, id: 53144
</span><span class='line'>;; flags: qr rd ra; QUERY: 1, ANSWER: 11, AUTHORITY: 4, ADDITIONAL: 5
</span><span class='line'>
</span><span class='line'>;; OPT PSEUDOSECTION:
</span><span class='line'>; EDNS: version: 0, flags:; udp: 4096
</span><span class='line'>;; QUESTION SECTION:
</span><span class='line'>;google.com.          IN  A
</span><span class='line'>
</span><span class='line'>;; ANSWER SECTION:
</span><span class='line'>google.com.       46  IN  A   74.125.228.98
</span><span class='line'>google.com.       46  IN  A   74.125.228.97
</span><span class='line'>google.com.       46  IN  A   74.125.228.104
</span><span class='line'>google.com.       46  IN  A   74.125.228.96
</span><span class='line'>google.com.       46  IN  A   74.125.228.110
</span><span class='line'>google.com.       46  IN  A   74.125.228.100
</span><span class='line'>google.com.       46  IN  A   74.125.228.105
</span><span class='line'>google.com.       46  IN  A   74.125.228.103
</span><span class='line'>google.com.       46  IN  A   74.125.228.102
</span><span class='line'>google.com.       46  IN  A   74.125.228.101
</span><span class='line'>google.com.       46  IN  A   74.125.228.99
</span><span class='line'>
</span><span class='line'>;; AUTHORITY SECTION:
</span><span class='line'>google.com.       4587    IN  NS  ns3.google.com.
</span><span class='line'>google.com.       4587    IN  NS  ns4.google.com.
</span><span class='line'>google.com.       4587    IN  NS  ns2.google.com.
</span><span class='line'>google.com.       4587    IN  NS  ns1.google.com.
</span><span class='line'>
</span><span class='line'>;; ADDITIONAL SECTION:
</span><span class='line'>ns2.google.com.       69375   IN  A   216.239.34.10
</span><span class='line'>ns1.google.com.       69375   IN  A   216.239.32.10
</span><span class='line'>ns3.google.com.       75822   IN  A   216.239.36.10
</span><span class='line'>ns4.google.com.       69375   IN  A   216.239.38.10
</span><span class='line'>
</span><span class='line'>;; Query time: 26 msec
</span><span class='line'>;; SERVER: 10.101.4.36#53(10.101.4.36)
</span><span class='line'>;; WHEN: Tue May 28 15:45:38 2013
</span><span class='line'>;; MSG SIZE  rcvd: 351
</span><span class='line'>
</span><span class='line'>dns1 ~ #</span></code></pre></td></tr></table></div></figure>


<p>Note the line containing &#8220;Query time&#8221; shows our query took 26 milliseconds to complete.
Now the domain google.com should be cached so let&#8217;s do another query and see if our time improves.</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
<span class='line-number'>32</span>
<span class='line-number'>33</span>
<span class='line-number'>34</span>
<span class='line-number'>35</span>
<span class='line-number'>36</span>
<span class='line-number'>37</span>
<span class='line-number'>38</span>
<span class='line-number'>39</span>
<span class='line-number'>40</span>
<span class='line-number'>41</span>
<span class='line-number'>42</span>
<span class='line-number'>43</span>
<span class='line-number'>44</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>dns1 ~ # dig google.com @localhost
</span><span class='line'>
</span><span class='line'>; &lt;&lt;>> DiG 9.9.2-P1 &lt;&lt;>> google.com @localhost
</span><span class='line'>;; global options: +cmd
</span><span class='line'>;; Got answer:
</span><span class='line'>;; ->>HEADER&lt;&lt;- opcode: QUERY, status: NOERROR, id: 18367
</span><span class='line'>;; flags: qr rd ra; QUERY: 1, ANSWER: 11, AUTHORITY: 4, ADDITIONAL: 5
</span><span class='line'>
</span><span class='line'>;; OPT PSEUDOSECTION:
</span><span class='line'>; EDNS: version: 0, flags:; udp: 4096
</span><span class='line'>;; QUESTION SECTION:
</span><span class='line'>;google.com.          IN  A
</span><span class='line'>
</span><span class='line'>;; ANSWER SECTION:
</span><span class='line'>google.com.       251 IN  A   74.125.228.105
</span><span class='line'>google.com.       251 IN  A   74.125.228.99
</span><span class='line'>google.com.       251 IN  A   74.125.228.96
</span><span class='line'>google.com.       251 IN  A   74.125.228.102
</span><span class='line'>google.com.       251 IN  A   74.125.228.98
</span><span class='line'>google.com.       251 IN  A   74.125.228.97
</span><span class='line'>google.com.       251 IN  A   74.125.228.101
</span><span class='line'>google.com.       251 IN  A   74.125.228.110
</span><span class='line'>google.com.       251 IN  A   74.125.228.103
</span><span class='line'>google.com.       251 IN  A   74.125.228.100
</span><span class='line'>google.com.       251 IN  A   74.125.228.104
</span><span class='line'>
</span><span class='line'>;; AUTHORITY SECTION:
</span><span class='line'>google.com.       11118   IN  NS  ns3.google.com.
</span><span class='line'>google.com.       11118   IN  NS  ns1.google.com.
</span><span class='line'>google.com.       11118   IN  NS  ns4.google.com.
</span><span class='line'>google.com.       11118   IN  NS  ns2.google.com.
</span><span class='line'>
</span><span class='line'>;; ADDITIONAL SECTION:
</span><span class='line'>ns2.google.com.       75906   IN  A   216.239.34.10
</span><span class='line'>ns1.google.com.       75906   IN  A   216.239.32.10
</span><span class='line'>ns3.google.com.       82353   IN  A   216.239.36.10
</span><span class='line'>ns4.google.com.       75906   IN  A   216.239.38.10
</span><span class='line'>
</span><span class='line'>__;; Query time: 0 msec__
</span><span class='line'>;; SERVER: 10.101.4.36#53(10.101.4.36)
</span><span class='line'>;; WHEN: Tue May 28 13:56:48 2013
</span><span class='line'>;; MSG SIZE  rcvd: 351
</span><span class='line'>
</span><span class='line'>dns1 ~ etc #</span></code></pre></td></tr></table></div></figure>


<p>As you can see above our query took 0 milliseconds! That&#8217;s obviously an improvement from our original query time of 26 milliseconds.</p>

<p>This record will be cached according to the TTL (Time To Live) of the zone record.</p>

<p>Let&#8217;s do another query and suppress some of dig&#8217;s output like so:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>dns1 ~ # dig +noauthority +noquestion +noadditional +nostats google.com @localhost
</span><span class='line'>
</span><span class='line'>; &lt;&lt;>> DiG 9.9.2-P1 &lt;&lt;>> +noauthority +noquestion +noadditional +nostats google.com @localhost
</span><span class='line'>;; global options: +cmd
</span><span class='line'>;; Got answer:
</span><span class='line'>;; ->>HEADER&lt;&lt;- opcode: QUERY, status: NOERROR, id: 48993
</span><span class='line'>;; flags: qr rd ra; QUERY: 1, ANSWER: 11, AUTHORITY: 4, ADDITIONAL: 5
</span><span class='line'>
</span><span class='line'>;; OPT PSEUDOSECTION:
</span><span class='line'>; EDNS: version: 0, flags:; udp: 4096
</span><span class='line'>;; ANSWER SECTION:
</span><span class='line'>google.com.       300 IN  A   173.194.43.5
</span><span class='line'>google.com.       300 IN  A   173.194.43.9
</span><span class='line'>google.com.       300 IN  A   173.194.43.14
</span><span class='line'>google.com.       300 IN  A   173.194.43.8
</span><span class='line'>google.com.       300 IN  A   173.194.43.0
</span><span class='line'>google.com.       300 IN  A   173.194.43.4
</span><span class='line'>google.com.       300 IN  A   173.194.43.2
</span><span class='line'>google.com.       300 IN  A   173.194.43.3
</span><span class='line'>google.com.       300 IN  A   173.194.43.1
</span><span class='line'>google.com.       300 IN  A   173.194.43.7
</span><span class='line'>google.com.       300 IN  A   173.194.43.6</span></code></pre></td></tr></table></div></figure>


<p>The number 300 from the above dig output is the <strong>time remaining until the DNS cache will be updated</strong> in seconds.  Since this is our caching nameserver if we wait a few seconds/minutes and do another query this number should decrease like in the output below:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>dns1 1 # dig +noauthority +noquestion +noadditional +nostats google.com @localhost
</span><span class='line'>
</span><span class='line'>; &lt;&lt;>> DiG 9.9.2-P1 &lt;&lt;>> +noauthority +noquestion +noadditional +nostats google.com @localhost
</span><span class='line'>;; global options: +cmd
</span><span class='line'>;; Got answer:
</span><span class='line'>;; ->>HEADER&lt;&lt;- opcode: QUERY, status: NOERROR, id: 18942
</span><span class='line'>;; flags: qr rd ra; QUERY: 1, ANSWER: 11, AUTHORITY: 4, ADDITIONAL: 5
</span><span class='line'>
</span><span class='line'>;; OPT PSEUDOSECTION:
</span><span class='line'>; EDNS: version: 0, flags:; udp: 4096
</span><span class='line'>;; ANSWER SECTION:
</span><span class='line'>google.com.       47  IN  A   173.194.43.3
</span><span class='line'>google.com.       47  IN  A   173.194.43.4
</span><span class='line'>google.com.       47  IN  A   173.194.43.1
</span><span class='line'>google.com.       47  IN  A   173.194.43.6
</span><span class='line'>google.com.       47  IN  A   173.194.43.8
</span><span class='line'>google.com.       47  IN  A   173.194.43.7
</span><span class='line'>google.com.       47  IN  A   173.194.43.0
</span><span class='line'>google.com.       47  IN  A   173.194.43.14
</span><span class='line'>google.com.       47  IN  A   173.194.43.9
</span><span class='line'>google.com.       47  IN  A   173.194.43.5
</span><span class='line'>google.com.       47  IN  A   173.194.43.2</span></code></pre></td></tr></table></div></figure>


<p>Notice time remaining until cache will be updated on our caching bind9 name server has now decreased from 300 seconds to 47 seconds.
So if we wait more then 47 seconds and do another query we should see a number much greater then 47.</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>dns1 ~ # dig +noauthority +noquestion +noadditional +nostats google.com @localhost
</span><span class='line'>
</span><span class='line'>; &lt;&lt;>> DiG 9.9.2-P1 &lt;&lt;>> +noauthority +noquestion +noadditional +nostats google.com @localhost
</span><span class='line'>;; global options: +cmd
</span><span class='line'>;; Got answer:
</span><span class='line'>;; ->>HEADER&lt;&lt;- opcode: QUERY, status: NOERROR, id: 43033
</span><span class='line'>;; flags: qr rd ra; QUERY: 1, ANSWER: 11, AUTHORITY: 4, ADDITIONAL: 5
</span><span class='line'>
</span><span class='line'>;; OPT PSEUDOSECTION:
</span><span class='line'>; EDNS: version: 0, flags:; udp: 4096
</span><span class='line'>;; ANSWER SECTION:
</span><span class='line'>google.com.       300 IN  A   173.194.43.5
</span><span class='line'>google.com.       300 IN  A   173.194.43.14
</span><span class='line'>google.com.       300 IN  A   173.194.43.6
</span><span class='line'>google.com.       300 IN  A   173.194.43.3
</span><span class='line'>google.com.       300 IN  A   173.194.43.2
</span><span class='line'>google.com.       300 IN  A   173.194.43.8
</span><span class='line'>google.com.       300 IN  A   173.194.43.0
</span><span class='line'>google.com.       300 IN  A   173.194.43.9
</span><span class='line'>google.com.       300 IN  A   173.194.43.4
</span><span class='line'>google.com.       300 IN  A   173.194.43.7
</span><span class='line'>google.com.       300 IN  A   173.194.43.1</span></code></pre></td></tr></table></div></figure>


<p>As you can see time until cache will be updated is back up to 300 seconds or 5 minutes.</p>

<p>If we want to find the actuall TTL for google.com we&#8217;ll need to query an authorative name server for google.com.
Let&#8217;s get a list of authorative name servers with the following dig command like so:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>dns1 ~ # dig +authority +noquestion +noadditional +nostats +noanswer google.com @localhost
</span><span class='line'>
</span><span class='line'>; &lt;&lt;>> DiG 9.9.2-P1 &lt;&lt;>> +authority +noquestion +noadditional +nostats +noanswer google.com @localhost
</span><span class='line'>;; global options: +cmd
</span><span class='line'>;; Got answer:
</span><span class='line'>;; ->>HEADER&lt;&lt;- opcode: QUERY, status: NOERROR, id: 18393
</span><span class='line'>;; flags: qr rd ra; QUERY: 1, ANSWER: 11, AUTHORITY: 4, ADDITIONAL: 5
</span><span class='line'>
</span><span class='line'>;; OPT PSEUDOSECTION:
</span><span class='line'>; EDNS: version: 0, flags:; udp: 4096
</span><span class='line'>;; AUTHORITY SECTION:
</span><span class='line'>google.com.       166915  IN  NS  ns4.google.com.
</span><span class='line'>google.com.       166915  IN  NS  ns2.google.com.
</span><span class='line'>google.com.       166915  IN  NS  ns3.google.com.
</span><span class='line'>google.com.       166915  IN  NS  ns1.google.com.
</span><span class='line'>
</span><span class='line'>dns1 ~ #</span></code></pre></td></tr></table></div></figure>


<p>So from the above output we see that name server ns1.google.com is authorative for google.com.</p>

<p>If we query ns1.google.com we can get the actual TTL like so:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>skywalker@laptop ~ $ dig google.com @ns1.google.com
</span><span class='line'>
</span><span class='line'>; &lt;&lt;>> DiG 9.9.2-P1 &lt;&lt;>> google.com @ns1.google.com
</span><span class='line'>;; global options: +cmd
</span><span class='line'>;; Got answer:
</span><span class='line'>;; ->>HEADER&lt;&lt;- opcode: QUERY, status: NOERROR, id: 57411
</span><span class='line'>;; flags: qr aa rd; QUERY: 1, ANSWER: 11, AUTHORITY: 0, ADDITIONAL: 0
</span><span class='line'>;; WARNING: recursion requested but not available
</span><span class='line'>
</span><span class='line'>;; QUESTION SECTION:
</span><span class='line'>;google.com.          IN  A
</span><span class='line'>
</span><span class='line'>;; ANSWER SECTION:
</span><span class='line'>google.com.       300 IN  A   173.194.43.14
</span><span class='line'>google.com.       300 IN  A   173.194.43.8
</span><span class='line'>google.com.       300 IN  A   173.194.43.3
</span><span class='line'>google.com.       300 IN  A   173.194.43.4
</span><span class='line'>google.com.       300 IN  A   173.194.43.6
</span><span class='line'>google.com.       300 IN  A   173.194.43.5
</span><span class='line'>google.com.       300 IN  A   173.194.43.7
</span><span class='line'>google.com.       300 IN  A   173.194.43.9
</span><span class='line'>google.com.       300 IN  A   173.194.43.2
</span><span class='line'>google.com.       300 IN  A   173.194.43.1
</span><span class='line'>google.com.       300 IN  A   173.194.43.0
</span><span class='line'>
</span><span class='line'>;; Query time: 31 msec
</span><span class='line'>;; SERVER: 216.239.32.10#53(216.239.32.10)
</span><span class='line'>;; WHEN: Tue May 28 17:23:38 2013
</span><span class='line'>;; MSG SIZE  rcvd: 204
</span><span class='line'>
</span><span class='line'>skywalker@laptop ~ $</span></code></pre></td></tr></table></div></figure>


<p>Notice the TTL is 300.  Also notice the line containing &#8220;aa&#8221; following the line containing &#8220;HEADER&#8221; as shown below:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>;; flags: qr aa rd; QUERY: 1, ANSWER: 11, AUTHORITY: 0, ADDITIONAL: 0</span></code></pre></td></tr></table></div></figure>


<p>Notice the &#8220;aa&#8221;.  This means this is an authorative answer for the domain google.com.</p>

<p>If we do another query you&#8217;ll see the TTL remains 300 and doesn&#8217;t change like it did against our own local bind9 server.
This is the actual TTL (Time To Live) for domain google.com since we queried an authorative name server.</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>skywalker@laptop ~ $ dig google.com @ns1.google.com
</span><span class='line'>
</span><span class='line'>; &lt;&lt;>> DiG 9.9.2-P1 &lt;&lt;>> google.com @ns1.google.com
</span><span class='line'>;; global options: +cmd
</span><span class='line'>;; Got answer:
</span><span class='line'>;; ->>HEADER&lt;&lt;- opcode: QUERY, status: NOERROR, id: 14944
</span><span class='line'>;; flags: qr aa rd; QUERY: 1, ANSWER: 11, AUTHORITY: 0, ADDITIONAL: 0
</span><span class='line'>;; WARNING: recursion requested but not available
</span><span class='line'>
</span><span class='line'>;; QUESTION SECTION:
</span><span class='line'>;google.com.          IN  A
</span><span class='line'>
</span><span class='line'>;; ANSWER SECTION:
</span><span class='line'>google.com.       300 IN  A   173.194.43.6
</span><span class='line'>google.com.       300 IN  A   173.194.43.9
</span><span class='line'>google.com.       300 IN  A   173.194.43.3
</span><span class='line'>google.com.       300 IN  A   173.194.43.1
</span><span class='line'>google.com.       300 IN  A   173.194.43.8
</span><span class='line'>google.com.       300 IN  A   173.194.43.0
</span><span class='line'>google.com.       300 IN  A   173.194.43.7
</span><span class='line'>google.com.       300 IN  A   173.194.43.4
</span><span class='line'>google.com.       300 IN  A   173.194.43.2
</span><span class='line'>google.com.       300 IN  A   173.194.43.5
</span><span class='line'>google.com.       300 IN  A   173.194.43.14
</span><span class='line'>
</span><span class='line'>;; Query time: 56 msec
</span><span class='line'>;; SERVER: 216.239.32.10#53(216.239.32.10)
</span><span class='line'>;; WHEN: Tue May 28 17:23:50 2013
</span><span class='line'>;; MSG SIZE  rcvd: 204
</span><span class='line'>
</span><span class='line'>skywaler@laptop ~ $</span></code></pre></td></tr></table></div></figure>


<p>We can now dump our DNS cache to file with the command below.  If you&#8217;re using my <a href="http://community.opscode.com/cookbooks/bind-chroot">bind-chroot</a> cookbook your cache file should be located at /var/bind9/chroot/var/cache/bind/named_dump.db.</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>rndc dumpdb -cache</span></code></pre></td></tr></table></div></figure>


<p>We can now view the contents of our cache and look for google.com like so:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>cat /var/bind9/chroot/var/cache/bind/named_dump.db |grep google.com
</span><span class='line'>google.com.       172385  NS  ns1.google.com.
</span><span class='line'>          172385  NS  ns2.google.com.
</span><span class='line'>          172385  NS  ns3.google.com.
</span><span class='line'>          172385  NS  ns4.google.com.
</span><span class='line'>ns1.google.com.       172385  A   216.239.32.10
</span><span class='line'>ns2.google.com.       172385  A   216.239.34.10
</span><span class='line'>ns3.google.com.       172385  A   216.239.36.10
</span><span class='line'>ns4.google.com.       172385  A   216.239.38.10
</span><span class='line'>skywalker@laptop ~ # rndc dumpdb -cache</span></code></pre></td></tr></table></div></figure>


<p>You can see, by default, bind9 cached google.com for ~172385 seconds or ~47 hours!</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Howto: Upgrade from Debian squeeze to wheezy]]></title>
    <link href="http://jackl0phty.org/2013/05/23/howto-upgrade-from-debian-squeeze-to-wheezy/"/>
    <updated>2013-05-23T10:46:00-04:00</updated>
    <id>http://jackl0phty.org/2013/05/23/howto-upgrade-from-debian-squeeze-to-wheezy</id>
    <content type="html"><![CDATA[<p>This blog post will discuss how to upgrade from Debian squeeze to wheezy.</p>

<p>We&#8217;ll start by cleaning a few things up.</p>

<figure class='code'><figcaption><span>Clear out local repository of retrieved package files no longer needed </span></figcaption>
<div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>apt-get autoclean</span></code></pre></td></tr></table></div></figure>




<figure class='code'><figcaption><span>Remove packages no longer needed </span></figcaption>
<div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>apt-get autoremove</span></code></pre></td></tr></table></div></figure>




<!-- more -->


<p>Now let&#8217;s search for packages that have been installed only partially and fix them.</p>

<figure class='code'><figcaption><span>Fix any packages in the output of the dpkg cmd below </span></figcaption>
<div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>dpkg --audit</span></code></pre></td></tr></table></div></figure>


<p>Now make sure no packages are on hold like so:</p>

<figure class='code'><figcaption><span>Fix any packages that may be on hold </span></figcaption>
<div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>dpkg --get-selections | grep hold</span></code></pre></td></tr></table></div></figure>


<p>If you receive no output from the two dpkg commands above it should be safe to start the upgrade.</p>

<p>Update your source list located at /etc/apt/sources.list. If you&#8217;re not on squeeze then substitute &#8216;squeeze&#8217; with the version you&#8217;re on.</p>

<figure class='code'><figcaption><span>Use sed to edit your list of sources </span></figcaption>
<div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>sed -i 's/squeeze/wheezy/g' /etc/apt/sources.list</span></code></pre></td></tr></table></div></figure>


<p>Your source list at /etc/apt/sources.list should now look something like the following:</p>

<figure class='code'><figcaption><span>New source list pointing at wheezy repos </span></figcaption>
<div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>server1:~# cat /etc/apt/sources.list
</span><span class='line'>deb http://ftp.us.debian.org/debian/ squeeze main contrib non-free
</span><span class='line'>deb-src http://ftp.us.debian.org/debian/ squeeze main contrib non-free
</span><span class='line'>
</span><span class='line'>deb http://security.debian.org/ squeeze/updates main contrib non-free
</span><span class='line'>deb-src http://security.debian.org/ squeeze/updates main contrib non-free
</span><span class='line'>
</span><span class='line'># squeeze-updates, previously known as 'volatile'
</span><span class='line'>deb http://ftp.us.debian.org/debian/ squeeze-updates main contrib non-free
</span><span class='line'>deb-src http://ftp.us.debian.org/debian/ squeeze-updates main contrib non-free
</span><span class='line'>server1:~#</span></code></pre></td></tr></table></div></figure>


<p>Note: Your URLs will likely differ from mine; especially if you don&#8217;t live in the US.</p>

<p>Now let&#8217;s resynchronize your package index files from the new sources that point to Wheezy.</p>

<figure class='code'><figcaption><span>Resynchronize package index files via apt-get update </span></figcaption>
<div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>server1:~# apt-get update</span></code></pre></td></tr></table></div></figure>


<p>Next install the newest versions of all packages currently installed on the system according to /etc/apt/sources.list.<br/>
Note: This is pretty much the point of no return!</p>

<figure class='code'><figcaption><span>Install the newest versions of all packages currently installed </span></figcaption>
<div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>server1:~# apt-get upgrade</span></code></pre></td></tr></table></div></figure>


<p>Now actually upgrade your current Debian distribution. Apt-get dist-upgrade will perform the same as upgrade and intelligently handle changing dependencies
with new versions of packages.</p>

<figure class='code'><figcaption><span>Upgrade your Debian distribution </span></figcaption>
<div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>server1:~# apt-get dist-upgrade</span></code></pre></td></tr></table></div></figure>


<p>Now reboot.</p>

<figure class='code'><figcaption><span>Reboot into your new Debian distribution Wheezy </span></figcaption>
<div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>server1:~# init 6</span></code></pre></td></tr></table></div></figure>


<p>After logging back into your Debian box let&#8217;s check for package issues like we did before.</p>

<figure class='code'><figcaption><span>Fix any packages these two commands output </span></figcaption>
<div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>server1:~# dpkg --audit 
</span><span class='line'>server1:~# dpkg --get-selections | grep hold</span></code></pre></td></tr></table></div></figure>


<p>You may need to do the upgrade dist-upgrade song-and-dance one final time.</p>

<figure class='code'><figcaption><span>Do a final upgrade </span></figcaption>
<div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>server1:~# apt-get upgrade 
</span><span class='line'>server1:~# apt-get dist-upgrade</span></code></pre></td></tr></table></div></figure>


<p>Finally check what Debian version you&#8217;re currently on.</p>

<figure class='code'><figcaption><span>Check your Debian version </span></figcaption>
<div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>server1:~# cat /etc/debian_version 
</span><span class='line'>7.0
</span><span class='line'>server1:~#</span></code></pre></td></tr></table></div></figure>


<p>If the output of the above command is 7.0 you are now running Debian Wheezy!</p>

<p>Now go have a beer or three!</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Using Perl to Print Avery Labels]]></title>
    <link href="http://jackl0phty.org/2013/01/18/using-perl-to-print-avery-labels/"/>
    <updated>2013-01-18T23:41:00-05:00</updated>
    <id>http://jackl0phty.org/2013/01/18/using-perl-to-print-avery-labels</id>
    <content type="html"><![CDATA[<p>This blog will discuss how to use the Perl module PostScript::MailLabels to print Avery labels.</p>

<p>The basic design is to have your user(s) run the following BASH shell script, which will then call a Perl script that builds a postscript file, then the BASH script will send the postscript file to the printer.</p>

<p>Here is the shell script your user(s) will run.</p>

<!-- more -->




<figure class='code'><figcaption><span>Set Linux Environment to Print Avery Labels </span><a href='https://gist.github.com/jackl0phty/4247878/raw/be2223e3cf561c4db010a30fc95de558291df5fa/perl-avery-labels'>link</a></figcaption> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
<span class='line-number'>32</span>
<span class='line-number'>33</span>
<span class='line-number'>34</span>
<span class='line-number'>35</span>
<span class='line-number'>36</span>
<span class='line-number'>37</span>
<span class='line-number'>38</span>
<span class='line-number'>39</span>
<span class='line-number'>40</span>
<span class='line-number'>41</span>
<span class='line-number'>42</span>
<span class='line-number'>43</span>
<span class='line-number'>44</span>
<span class='line-number'>45</span>
<span class='line-number'>46</span>
<span class='line-number'>47</span>
<span class='line-number'>48</span>
<span class='line-number'>49</span>
<span class='line-number'>50</span>
<span class='line-number'>51</span>
<span class='line-number'>52</span>
<span class='line-number'>53</span>
<span class='line-number'>54</span>
<span class='line-number'>55</span>
<span class='line-number'>56</span>
<span class='line-number'>57</span>
</pre></td><td class='code'><pre><code class='bash'><span class='line'><span class="c">#!/bin/bash</span>
</span><span class='line'>
</span><span class='line'><span class="c">###############################################################################</span>
</span><span class='line'><span class="c"># This shell script can be used to print Avery                                #</span>
</span><span class='line'><span class="c"># address labels.                                                             #</span>
</span><span class='line'><span class="c">###############################################################################</span>
</span><span class='line'><span class="c"># Licensed under the Apache License, Version 2.0 (the &quot;License&quot;),             #</span>
</span><span class='line'><span class="c"># For any questions regarding the license of this software, please refer to   #</span>
</span><span class='line'><span class="c"># the actual license at http://www.apache.org/licenses/LICENSE-2.0.txt.       #</span>
</span><span class='line'><span class="c">###############################################################################</span>
</span><span class='line'><span class="c">#                      DISCLAIMER OF WARRENTY                                 #</span>
</span><span class='line'><span class="c"># BECAUSE THIS SOFTWARE IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR  #</span>
</span><span class='line'><span class="c"># THE SOFTWARE, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN        #</span>
</span><span class='line'><span class="c"># OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES      #</span>
</span><span class='line'><span class="c"># PROVIDE THE SOFTWARE &quot;AS IS&quot; WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED #</span>
</span><span class='line'><span class="c"># OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF        #</span>
</span><span class='line'><span class="c"># MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO #</span>
</span><span class='line'><span class="c"># THE QUALITY AND PERFORMANCE OF THE SOFTWARE IS WITH YOU. SHOULD THE         #</span>
</span><span class='line'><span class="c"># SOFTWARE PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,   #</span>
</span><span class='line'><span class="c"># REPAIR, OR CORRECTION. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR     #</span>
</span><span class='line'><span class="c"># AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY  #</span>
</span><span class='line'><span class="c"># MODIFY AND/OR REDISTRIBUTE THE SOFTWARE AS PERMITTED BY THE ABOVE LICENCE,  #</span>
</span><span class='line'><span class="c"># BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL,   #</span>
</span><span class='line'><span class="c"># OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE     #</span>
</span><span class='line'><span class="c"># SOFTWARE (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED  #</span>
</span><span class='line'><span class="c"># INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIESOR A FAILURE OF THE   #</span>
</span><span class='line'><span class="c"># SOFTWARE TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF SUCH HOLDER OR OTHER  #</span>
</span><span class='line'><span class="c"># PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.                  #</span>
</span><span class='line'><span class="c">###############################################################################</span>
</span><span class='line'>
</span><span class='line'><span class="c"># Must export default printer environment variable</span>
</span><span class='line'><span class="c"># in order for lpr to function correctly. The rest</span>
</span><span class='line'><span class="c"># will be executed from a Perl script.</span>
</span><span class='line'>
</span><span class='line'><span class="c">#declare variables</span>
</span><span class='line'><span class="nv">FILEPATH</span><span class="o">=</span><span class="s2">&quot;/home/user1/&quot;</span>
</span><span class='line'><span class="nv">DATE</span><span class="o">=</span><span class="sb">`</span>date +%m%d%y<span class="sb">`</span>
</span><span class='line'><span class="nv">MYPERL</span><span class="o">=</span><span class="sb">`</span>which perl<span class="sb">`</span>
</span><span class='line'><span class="nv">SCRIPT</span><span class="o">=</span><span class="k">${</span><span class="nv">FILEPATH</span><span class="k">}</span><span class="s1">&#39;print_addresses.pl&#39;</span>
</span><span class='line'>
</span><span class='line'><span class="c"># Get name of file user wants to process</span>
</span><span class='line'><span class="nb">echo</span> <span class="s2">&quot;What printer do you want to print to?&quot;</span>
</span><span class='line'><span class="nb">read </span>PRINTER
</span><span class='line'>
</span><span class='line'><span class="c">#echo &quot;Going to process: $DEFAULTPRINTER&quot;</span>
</span><span class='line'>
</span><span class='line'><span class="c"># Set default printer to DEFAULTPRINTER</span>
</span><span class='line'><span class="nb">export </span><span class="nv">PRINTER</span><span class="o">=</span><span class="nv">$PRINTER</span>
</span><span class='line'>
</span><span class='line'><span class="c"># Call perl script which builds a postscript</span>
</span><span class='line'><span class="c"># file and sends it to user&#39;s printer.</span>
</span><span class='line'>perl <span class="nv">$SCRIPT</span>
</span><span class='line'>
</span><span class='line'><span class="c"># Send postscript file to the printer</span>
</span><span class='line'><span class="sb">`</span>cat <span class="k">${</span><span class="nv">FILEPATH</span><span class="k">}</span><span class="nv">$DATE</span> | lpr -P <span class="nv">$PRINTER</span><span class="sb">`</span>
</span><span class='line'>
</span><span class='line'><span class="nb">exit </span>0
</span></code></pre></td></tr></table></div></figure>


<p>The BASH script basically asks the user what printer they want to print to,  set&#8217;s the user&#8217;s DEFAULT printer, then calls your Perl script using the module PostScript::MailLabels to build a postscript file, then the BASH script  sends it to the user&#8217;s printer.</p>

<p>Here is the Perl script which does most of the heavy lifting.</p>

<figure class='code'><figcaption><span>Print Avery Labels </span><a href='https://gist.github.com/jackl0phty/4247908/raw/e408e56504ec079bf7975e504a43bdaa37c720b3/Perl-Print-Avery-Labels'>link</a></figcaption> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
<span class='line-number'>32</span>
<span class='line-number'>33</span>
<span class='line-number'>34</span>
<span class='line-number'>35</span>
<span class='line-number'>36</span>
<span class='line-number'>37</span>
<span class='line-number'>38</span>
<span class='line-number'>39</span>
<span class='line-number'>40</span>
<span class='line-number'>41</span>
<span class='line-number'>42</span>
<span class='line-number'>43</span>
<span class='line-number'>44</span>
<span class='line-number'>45</span>
<span class='line-number'>46</span>
<span class='line-number'>47</span>
<span class='line-number'>48</span>
<span class='line-number'>49</span>
<span class='line-number'>50</span>
<span class='line-number'>51</span>
<span class='line-number'>52</span>
<span class='line-number'>53</span>
<span class='line-number'>54</span>
<span class='line-number'>55</span>
<span class='line-number'>56</span>
<span class='line-number'>57</span>
<span class='line-number'>58</span>
<span class='line-number'>59</span>
<span class='line-number'>60</span>
<span class='line-number'>61</span>
<span class='line-number'>62</span>
<span class='line-number'>63</span>
<span class='line-number'>64</span>
<span class='line-number'>65</span>
<span class='line-number'>66</span>
<span class='line-number'>67</span>
<span class='line-number'>68</span>
<span class='line-number'>69</span>
<span class='line-number'>70</span>
<span class='line-number'>71</span>
<span class='line-number'>72</span>
<span class='line-number'>73</span>
<span class='line-number'>74</span>
<span class='line-number'>75</span>
<span class='line-number'>76</span>
<span class='line-number'>77</span>
<span class='line-number'>78</span>
<span class='line-number'>79</span>
<span class='line-number'>80</span>
<span class='line-number'>81</span>
<span class='line-number'>82</span>
<span class='line-number'>83</span>
<span class='line-number'>84</span>
<span class='line-number'>85</span>
<span class='line-number'>86</span>
<span class='line-number'>87</span>
<span class='line-number'>88</span>
<span class='line-number'>89</span>
<span class='line-number'>90</span>
<span class='line-number'>91</span>
<span class='line-number'>92</span>
<span class='line-number'>93</span>
<span class='line-number'>94</span>
<span class='line-number'>95</span>
<span class='line-number'>96</span>
<span class='line-number'>97</span>
<span class='line-number'>98</span>
<span class='line-number'>99</span>
<span class='line-number'>100</span>
<span class='line-number'>101</span>
<span class='line-number'>102</span>
<span class='line-number'>103</span>
<span class='line-number'>104</span>
<span class='line-number'>105</span>
<span class='line-number'>106</span>
<span class='line-number'>107</span>
<span class='line-number'>108</span>
<span class='line-number'>109</span>
<span class='line-number'>110</span>
<span class='line-number'>111</span>
<span class='line-number'>112</span>
<span class='line-number'>113</span>
<span class='line-number'>114</span>
<span class='line-number'>115</span>
<span class='line-number'>116</span>
<span class='line-number'>117</span>
<span class='line-number'>118</span>
<span class='line-number'>119</span>
<span class='line-number'>120</span>
<span class='line-number'>121</span>
<span class='line-number'>122</span>
<span class='line-number'>123</span>
</pre></td><td class='code'><pre><code class='perl'><span class='line'><span class="c1">#!/usr/bin/perl -w</span>
</span><span class='line'>
</span><span class='line'><span class="c1">###############################################################################</span>
</span><span class='line'><span class="c1">#This script will open a file containing a list of                            #</span>
</span><span class='line'><span class="c1">##addresses, use the addresses to build a postscript file,                    #</span>
</span><span class='line'><span class="c1">##and send that file to a printer.                                            #</span>
</span><span class='line'><span class="c1">###############################################################################</span>
</span><span class='line'><span class="c1"># Licensed under the Apache License, Version 2.0 (the &quot;License&quot;),             # </span>
</span><span class='line'><span class="c1"># For any questions regarding the license of this software, please refer to   #</span>
</span><span class='line'><span class="c1"># the actual license at http://www.apache.org/licenses/LICENSE-2.0.txt.       #</span>
</span><span class='line'><span class="c1">###############################################################################</span>
</span><span class='line'><span class="c1">#                        DISCLAIMER OF WARRENTY                               #</span>
</span><span class='line'><span class="c1"># BECAUSE THIS SOFTWARE IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR  #</span>
</span><span class='line'><span class="c1"># THE SOFTWARE, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN        #</span>
</span><span class='line'><span class="c1"># OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES      #</span>
</span><span class='line'><span class="c1"># PROVIDE THE SOFTWARE &quot;AS IS&quot; WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED #</span>
</span><span class='line'><span class="c1"># OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF        #</span>
</span><span class='line'><span class="c1"># MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO #</span>
</span><span class='line'><span class="c1"># THE QUALITY AND PERFORMANCE OF THE SOFTWARE IS WITH YOU. SHOULD THE         #</span>
</span><span class='line'><span class="c1"># SOFTWARE PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,   #</span>
</span><span class='line'><span class="c1"># REPAIR, OR CORRECTION. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR     #</span>
</span><span class='line'><span class="c1"># AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY  #</span>
</span><span class='line'><span class="c1"># MODIFY AND/OR REDISTRIBUTE THE SOFTWARE AS PERMITTED BY THE ABOVE LICENCE,  #</span>
</span><span class='line'><span class="c1"># BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL,   #</span>
</span><span class='line'><span class="c1"># OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE     #</span>
</span><span class='line'><span class="c1"># SOFTWARE (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED  #</span>
</span><span class='line'><span class="c1"># INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIESOR A FAILURE OF THE   #</span>
</span><span class='line'><span class="c1"># SOFTWARE TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF SUCH HOLDER OR OTHER  #</span>
</span><span class='line'><span class="c1"># PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.                  #</span>
</span><span class='line'><span class="c1">###############################################################################</span>
</span><span class='line'>
</span><span class='line'><span class="c1"># Import required modules</span>
</span><span class='line'><span class="k">use</span> <span class="n">strict</span><span class="p">;</span>
</span><span class='line'><span class="k">use</span> <span class="nn">PostScript::</span><span class="n">MailLabels</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'><span class="c1"># Declare local variables</span>
</span><span class='line'><span class="k">my</span> <span class="nv">$labels</span><span class="p">;</span>
</span><span class='line'><span class="k">my</span> <span class="nv">@addresses</span><span class="p">;</span>
</span><span class='line'><span class="k">my</span> <span class="nv">$filename</span><span class="p">;</span>
</span><span class='line'><span class="k">my</span> <span class="nv">$filepath</span> <span class="o">=</span> <span class="s">&#39;/home/user1/&#39;</span><span class="p">;</span>
</span><span class='line'><span class="k">my</span> <span class="nv">$date</span> <span class="o">=</span> <span class="sb">`date +%m%d%y`</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'><span class="c1"># Get name of file from user</span>
</span><span class='line'><span class="k">print</span> <span class="s">&quot;Enter name of file you would like to process:  &quot;</span><span class="p">;</span>
</span><span class='line'><span class="nv">$filename</span> <span class="o">=</span> <span class="o">&lt;&gt;</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'><span class="c1"># Inform user of progress</span>
</span><span class='line'><span class="k">print</span> <span class="s">&quot;Creating postscript file ...\n\n&quot;</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'><span class="nv">$labels</span> <span class="o">=</span> <span class="nn">PostScript::</span><span class="n">MailLabels</span><span class="o">-&gt;</span><span class="k">new</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'><span class="c1"># Create file handle for reading</span>
</span><span class='line'><span class="nb">open</span><span class="p">(</span><span class="n">NEWADDRESSES</span><span class="p">,</span> <span class="s">&quot;$filepath$filename&quot;</span><span class="p">)</span> <span class="ow">or</span> <span class="nb">die</span><span class="p">(</span><span class="s">&quot;Unable to open file: $!&quot;</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'><span class="c1"># Read file one line at a time</span>
</span><span class='line'><span class="k">while</span> <span class="p">()</span> <span class="p">{</span>
</span><span class='line'>
</span><span class='line'>    <span class="c1">#delete first line containing name;street1;street2;citystzip$</span>
</span><span class='line'>    <span class="k">next</span> <span class="k">if</span> <span class="sr">/^name;/</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'>    <span class="nv">$labels</span><span class="o">-&gt;</span><span class="n">labelsetup</span><span class="p">(</span>
</span><span class='line'>        <span class="n">Avery</span>       <span class="o">=&gt;</span> <span class="nv">$labels</span><span class="o">-&gt;</span><span class="n">averycode</span><span class="p">(</span><span class="mi">5961</span><span class="p">),</span>
</span><span class='line'>        <span class="n">PaperSize</span>   <span class="o">=&gt;</span> <span class="s">&#39;letter&#39;</span><span class="p">,</span>
</span><span class='line'>        <span class="n">postnet</span>     <span class="o">=&gt;</span> <span class="s">&#39;no&#39;</span>
</span><span class='line'>    <span class="p">);</span>
</span><span class='line'>
</span><span class='line'>    <span class="nv">$labels</span><span class="o">-&gt;</span><span class="n">definelabel</span><span class="p">(</span><span class="s">&#39;clear&#39;</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'>    <span class="nv">$labels</span><span class="o">-&gt;</span><span class="n">definelabel</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span><span class="s">&#39;fname&#39;</span><span class="p">,</span><span class="s">&#39;lname&#39;</span><span class="p">);</span>
</span><span class='line'>    <span class="nv">$labels</span><span class="o">-&gt;</span><span class="n">definelabel</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span><span class="s">&#39;street&#39;</span><span class="p">);</span>
</span><span class='line'>    <span class="nv">$labels</span><span class="o">-&gt;</span><span class="n">definelabel</span><span class="p">(</span><span class="mi">2</span><span class="p">,</span><span class="s">&#39;city&#39;</span><span class="p">,</span><span class="s">&#39;state&#39;</span><span class="p">,</span><span class="s">&#39;zip&#39;</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'>
</span><span class='line'>    <span class="c1"># Match lastname, firstname, and address.</span>
</span><span class='line'>    <span class="k">my</span> <span class="nv">$pattern</span> <span class="o">=</span> <span class="s">&#39;^(.+),\s+(.+);(.+);(.*);(.+),\s+(\w{2})\s+(\d{5}|\d{5}-\d{4})&#39;</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'>    <span class="nv">$_</span> <span class="o">=~</span><span class="sr"> /$pattern/</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">my</span> <span class="nv">$lname</span> <span class="o">=</span> <span class="nv">$1</span><span class="p">;</span>
</span><span class='line'>    <span class="k">my</span> <span class="nv">$fname</span> <span class="o">=</span> <span class="nv">$2</span><span class="p">;</span>
</span><span class='line'>    <span class="k">my</span> <span class="nv">$address1</span> <span class="o">=</span> <span class="nv">$3</span><span class="p">;</span>
</span><span class='line'>    <span class="k">my</span> <span class="nv">$address2</span> <span class="o">=</span> <span class="nv">$4</span><span class="p">;</span>
</span><span class='line'>    <span class="k">my</span> <span class="nv">$city</span> <span class="o">=</span> <span class="nv">$5</span><span class="p">;</span>
</span><span class='line'>    <span class="k">my</span> <span class="nv">$state</span> <span class="o">=</span> <span class="nv">$6</span><span class="p">;</span>
</span><span class='line'>    <span class="k">my</span> <span class="nv">$zip</span> <span class="o">=</span> <span class="nv">$7</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">my</span> <span class="nv">@record</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'>    <span class="nb">push</span> <span class="nv">@record</span><span class="p">,</span> <span class="nv">$fname</span><span class="p">;</span>
</span><span class='line'>    <span class="nb">push</span> <span class="nv">@record</span><span class="p">,</span> <span class="nv">$lname</span><span class="p">;</span>
</span><span class='line'>    <span class="k">if</span> <span class="p">(</span> <span class="nv">$address2</span> <span class="o">!~</span> <span class="sr">/^$/</span> <span class="p">)</span> <span class="p">{</span>
</span><span class='line'>        <span class="nb">push</span> <span class="nv">@record</span><span class="p">,</span> <span class="s">&quot;$address1, $address2&quot;</span><span class="p">;</span>
</span><span class='line'>    <span class="p">}</span> <span class="k">else</span> <span class="p">{</span>
</span><span class='line'>        <span class="nb">push</span> <span class="nv">@record</span><span class="p">,</span> <span class="nv">$address1</span><span class="p">;</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>    <span class="nb">push</span> <span class="nv">@record</span><span class="p">,</span> <span class="s">&quot;$city,&quot;</span><span class="p">;</span>
</span><span class='line'>    <span class="nb">push</span> <span class="nv">@record</span><span class="p">,</span> <span class="nv">$state</span><span class="p">;</span>
</span><span class='line'>    <span class="nb">push</span> <span class="nv">@record</span><span class="p">,</span> <span class="nv">$zip</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'>    <span class="c1"># Uncomment line below to debug.</span>
</span><span class='line'>    <span class="c1">#print $labels-&gt;makelabels( $addresses );</span>
</span><span class='line'>    <span class="nb">push</span> <span class="p">(</span><span class="nv">@addresses</span><span class="p">,</span> <span class="o">\</span><span class="nv">@record</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'><span class="c1"># Close while loop</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="c1"># Open file handle for writing</span>
</span><span class='line'><span class="nb">open</span><span class="p">(</span><span class="n">PRINTADDRESSES</span><span class="p">,</span> <span class="s">&quot;&gt;$filepath$date&quot;</span><span class="p">)</span> <span class="ow">or</span> <span class="nb">die</span><span class="p">(</span><span class="s">&quot;Unable to write file: $!&quot;</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'><span class="c1"># Write postscript file</span>
</span><span class='line'><span class="k">print</span> <span class="n">PRINTADDRESSES</span> <span class="nv">$labels</span><span class="o">-&gt;</span><span class="n">makelabels</span><span class="p">(</span> <span class="o">\</span><span class="nv">@addresses</span> <span class="p">);</span>
</span><span class='line'>
</span><span class='line'><span class="c1"># Close filehandle</span>
</span><span class='line'><span class="nb">close</span><span class="p">(</span><span class="n">PRINTADDRESSES</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'><span class="c1"># Close filehandle</span>
</span><span class='line'><span class="nb">close</span><span class="p">(</span><span class="n">NEWADDRESSES</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'><span class="c1"># Notify user of file completion and get printer name</span>
</span><span class='line'><span class="k">print</span> <span class="s">&quot;Postscript file named $date has been created successfully.\n&quot;</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'><span class="c1"># Exit cleanly</span>
</span><span class='line'><span class="nb">exit</span> <span class="mi">0</span><span class="p">;</span>
</span></code></pre></td></tr></table></div></figure>


<p>The Perl script basically asks the user what&#8217;s the name of the file they want to print, reads in the file (; delimited in this case), &amp; outputs a postscript file.</p>

<p>Obviously you will have to make some changes in order to get these scripts to work in YOUR environment!</p>

<p><strong>Note:</strong> This is for Avery labels with Avery code 5961.  Please review  PostScript::MailLabels&#8217;s documentation on CPAN to see if the module supports your particular labels or not.  You will also probably have to tweak the  &#8220;labelsetup&#8221; and &#8220;definelabel&#8221; parts to fit your needs.  Also note that the file this script reads is in the format of name;strete1;street2;city;st;zip$ semicolon delimited with a trailing $.  You will have to tweak the regex if your file is in a differet format.</p>

<p><strong>Disclaimer:  This blog entry comes with NO expressed warranty, guarantee, support, or maintenance of any kind!  Use at your own risk!</strong></p>

<p>Good luck and happy printing!</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[How to Recover the Password for the Cisco ASA 5505 Adaptive Security Appliance]]></title>
    <link href="http://jackl0phty.org/2013/01/18/how-to-recover-the-password-for-the-cisco-asa-5505-adaptive-security-appliance/"/>
    <updated>2013-01-18T23:13:00-05:00</updated>
    <id>http://jackl0phty.org/2013/01/18/how-to-recover-the-password-for-the-cisco-asa-5505-adaptive-security-appliance</id>
    <content type="html"><![CDATA[<p>This blog will discuss how to reset the password on Cisco&#8217;s ASA 5505 Adaptive Security Appliance.  First I will assume you are using Cisco&#8217;s gudie for recovering your password located at http://www.cisco.com/en/US/docs/security/asa/asa71/configuration/guide/trouble.pdf .  Start at page 7 entited &#8220;Performing password Recovery for the ASA 5500 Series Adaptive Security Appliance.</p>

<!-- more -->


<p>I won&#8217;t copy what&#8217;s in Cisco&#8217;s guide but I&#8217;ll add the following:</p>

<ol>
<li>Below is what steps 4 - 8 actually look like on Cisco&#8217;s ASA 5505:</li>
</ol>


<figure class='code'><figcaption><span>Output from Cisco ASA 5505 </span></figcaption>
<div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
<span class='line-number'>32</span>
<span class='line-number'>33</span>
<span class='line-number'>34</span>
<span class='line-number'>35</span>
<span class='line-number'>36</span>
<span class='line-number'>37</span>
<span class='line-number'>38</span>
<span class='line-number'>39</span>
<span class='line-number'>40</span>
<span class='line-number'>41</span>
<span class='line-number'>42</span>
<span class='line-number'>43</span>
<span class='line-number'>44</span>
<span class='line-number'>45</span>
<span class='line-number'>46</span>
<span class='line-number'>47</span>
<span class='line-number'>48</span>
<span class='line-number'>49</span>
<span class='line-number'>50</span>
<span class='line-number'>51</span>
<span class='line-number'>52</span>
<span class='line-number'>53</span>
<span class='line-number'>54</span>
<span class='line-number'>55</span>
<span class='line-number'>56</span>
<span class='line-number'>57</span>
<span class='line-number'>58</span>
<span class='line-number'>59</span>
<span class='line-number'>60</span>
<span class='line-number'>61</span>
<span class='line-number'>62</span>
<span class='line-number'>63</span>
<span class='line-number'>64</span>
<span class='line-number'>65</span>
<span class='line-number'>66</span>
<span class='line-number'>67</span>
<span class='line-number'>68</span>
<span class='line-number'>69</span>
<span class='line-number'>70</span>
<span class='line-number'>71</span>
<span class='line-number'>72</span>
<span class='line-number'>73</span>
<span class='line-number'>74</span>
<span class='line-number'>75</span>
<span class='line-number'>76</span>
<span class='line-number'>77</span>
<span class='line-number'>78</span>
<span class='line-number'>79</span>
<span class='line-number'>80</span>
<span class='line-number'>81</span>
<span class='line-number'>82</span>
<span class='line-number'>83</span>
<span class='line-number'>84</span>
<span class='line-number'>85</span>
<span class='line-number'>86</span>
<span class='line-number'>87</span>
<span class='line-number'>88</span>
<span class='line-number'>89</span>
<span class='line-number'>90</span>
<span class='line-number'>91</span>
<span class='line-number'>92</span>
<span class='line-number'>93</span>
<span class='line-number'>94</span>
<span class='line-number'>95</span>
<span class='line-number'>96</span>
<span class='line-number'>97</span>
<span class='line-number'>98</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>rommon #1> confreg
</span><span class='line'>Current Configuration Register: 0x00000000
</span><span class='line'>Configuration Summary:
</span><span class='line'>boot ROMMON
</span><span class='line'>Do you wish to change this configuration? y/n [n]: y
</span><span class='line'>enable boot to ROMMON prompt? y/n [n]:
</span><span class='line'>enable TFTP netboot? y/n [n]:
</span><span class='line'>enable Flash boot? y/n [n]:
</span><span class='line'>select specific Flash image index? y/n [n]:
</span><span class='line'>disable system configuration? y/n [n]: y
</span><span class='line'>go to ROMMON prompt if netboot fails? y/n [n]:
</span><span class='line'>enable passing NVRAM file specs in auto-boot mode? y/n [n]:
</span><span class='line'>disable display of BREAK or ESC key prompt during auto-boot? y/n [n]:
</span><span class='line'>Current Configuration Register: 0x00000040
</span><span class='line'>Configuration Summary:
</span><span class='line'>boot ROMMON
</span><span class='line'>ignore system configuration
</span><span class='line'>Update Config Register (0x40) in NVRAM...
</span><span class='line'>rommon #2>
</span><span class='line'>Next reload the ASA by typing boot.
</span><span class='line'>rommon #2> boot
</span><span class='line'>Launching BootLoader...
</span><span class='line'>Default configuration file contains 1 entry.
</span><span class='line'>Searching / for images to boot.
</span><span class='line'>Loading /asa722-k8.bin... Booting...
</span><span class='line'>###############################################################################################################################################################################################
</span><span class='line'>256MB RAM
</span><span class='line'>Total SSMs found: 0
</span><span class='line'>Total NICs found: 10
</span><span class='line'>88E6095 rev 2 Gigabit Ethernet @ index 09 MAC:
</span><span class='line'>88E6095 rev 2 Ethernet @ index 08 MAC:
</span><span class='line'>88E6095 rev 2 Ethernet @ index 07 MAC:
</span><span class='line'>88E6095 rev 2 Ethernet @ index 06 MAC:
</span><span class='line'>88E6095 rev 2 Ethernet @ index 05 MAC: 
</span><span class='line'>88E6095 rev 2 Ethernet @ index 04 MAC: 
</span><span class='line'>88E6095 rev 2 Ethernet @ index 03 MAC: 
</span><span class='line'>88E6095 rev 2 Ethernet @ index 02 MAC: 
</span><span class='line'>88E6095 rev 2 Ethernet @ index 01 MAC: 
</span><span class='line'>y88acs06 rev16 Gigabit Ethernet @ index 00 MAC:
</span><span class='line'>Licensed features for this platform:
</span><span class='line'>Maximum Physical Interfaces : 8
</span><span class='line'>VLANs : 3, DMZ Restricted
</span><span class='line'>Inside Hosts : 10
</span><span class='line'>Failover : Disabled
</span><span class='line'>VPN-DES : Enabled
</span><span class='line'>VPN-3DES-AES : Enabled
</span><span class='line'>VPN Peers : 10
</span><span class='line'>WebVPN Peers : 2
</span><span class='line'>Dual ISPs : Disabled
</span><span class='line'>VLAN Trunk Ports : 0
</span><span class='line'>This platform has a Base license.
</span><span class='line'>Encryption hardware device : Cisco ASA-5505 on-board accelerator (revision 0x0)
</span><span class='line'>Boot microcode : #CNlite-MC-Boot-Cisco-1.2
</span><span class='line'>SSL/IKE microcode: #CNlite-MC-IPSEC-Admin-3.03
</span><span class='line'>IPSec microcode : #CNlite-MC-IPSECm-MAIN-2.04
</span><span class='line'>--------------------------------------------------------------------------
</span><span class='line'>. .
</span><span class='line'>| |
</span><span class='line'>||| |||
</span><span class='line'>.|| ||. .|| ||.
</span><span class='line'>.:||| | |||:..:||| | |||:.
</span><span class='line'>C i s c o S y s t e m s
</span><span class='line'>--------------------------------------------------------------------------
</span><span class='line'>Cisco Adaptive Security Appliance Software Version )
</span><span class='line'> 
</span><span class='line'>****************************** Warning *******************************
</span><span class='line'>This product contains cryptographic features and is
</span><span class='line'>subject to United States and local country laws
</span><span class='line'>governing, import, export, transfer, and use.
</span><span class='line'>Delivery of Cisco cryptographic products does not
</span><span class='line'>imply third-party authority to import, export,
</span><span class='line'>distribute, or use encryption. Importers, exporters,
</span><span class='line'>distributors and users are responsible for compliance
</span><span class='line'>with U.S. and local country laws. By using this
</span><span class='line'>product you agree to comply with applicable laws and
</span><span class='line'>regulations. If you are unable to comply with U.S.
</span><span class='line'>and local laws, return the enclosed items immediately.
</span><span class='line'>A summary of U.S. laws governing Cisco cryptographic
</span><span class='line'>products may be found at:
</span><span class='line'>http://www.cisco.com/wwl/export/crypto/tool/stqrg.html
</span><span class='line'>If you require further assistance please contact us by
</span><span class='line'>sending email to export@cisco.com.
</span><span class='line'>******************************* Warning *******************************
</span><span class='line'>Copyright (c) 1996-2006 by Cisco Systems, Inc.
</span><span class='line'>Restricted Rights Legend
</span><span class='line'>Use, duplication, or disclosure by the Government is
</span><span class='line'>subject to restrictions as set forth in subparagraph
</span><span class='line'>(c) of the Commercial Computer Software - Restricted
</span><span class='line'>Rights clause at FAR sec. 52.227-19 and subparagraph
</span><span class='line'>(c) (1) (ii) of the Rights in Technical Data and Computer
</span><span class='line'>Software clause at DFARS sec. 252.227-7013.
</span><span class='line'>Cisco Systems, Inc.
</span><span class='line'>170 West Tasman Drive
</span><span class='line'>San Jose, California 95134-1706
</span><span class='line'>Ignoring startup configuration as instructed by configuration register.
</span><span class='line'>INFO: Converting to disk0:/
</span><span class='line'>Type help or '?' for a list of available commands.
</span><span class='line'>ciscoasa></span></code></pre></td></tr></table></div></figure>


<ol>
<li>You should follow steps 9 - 12 exactly as in Cisco&#8217;s guide.</li>
<li>I would like to add to Cisco&#8217;s step 13.  Cisco uses the command &#8220;password password&#8221; which should actually be &#8220;passwd password&#8221;.</li>
<li>Cisco&#8217;s step 14 is where the fun begins!  Cisco says to type the command &#8220;config-register value&#8221; where value is the number you recorded in step 5.  THIS IS WRONG WRONG WRONG!!!!!.   If you follow Cisco&#8217;s step 14 and then step 15, yes you will have successfully reset your password, but if you reboot your ASA or loose power your ASA will stop at the ROMMON prompt (i.e. rommon #1>).  Instead, in step 14 you should type &#8220;config-register 0x10011&#8221; and then precede to step 15.  Then, if you ever reboot you ASA or loose power, it should fully reboot and not be stuck at the rommon #1> prompt.</li>
</ol>

]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Using Perl to Execute Remote Commands]]></title>
    <link href="http://jackl0phty.org/2013/01/18/using-perl-to-execute-remote-commands/"/>
    <updated>2013-01-18T22:23:00-05:00</updated>
    <id>http://jackl0phty.org/2013/01/18/using-perl-to-execute-remote-commands</id>
    <content type="html"><![CDATA[<p>This blog will discuss how to both securely execute a command on a remote server and securely copy a file from that server.</p>

<p>Here is the Perl script that can securely execute commands on as well as securely copy files from a server.</p>

<!-- more -->




<figure class='code'><figcaption><span>Scp Files With Perl </span><a href='https://raw.github.com/jackl0phty/misc-scripts/6570cb69fba6e0b0bc71a1fc433a13ede21788c9/scpfile.pl'>Download From Github </a></figcaption> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
<span class='line-number'>32</span>
<span class='line-number'>33</span>
<span class='line-number'>34</span>
<span class='line-number'>35</span>
<span class='line-number'>36</span>
<span class='line-number'>37</span>
<span class='line-number'>38</span>
<span class='line-number'>39</span>
<span class='line-number'>40</span>
<span class='line-number'>41</span>
<span class='line-number'>42</span>
<span class='line-number'>43</span>
<span class='line-number'>44</span>
<span class='line-number'>45</span>
<span class='line-number'>46</span>
<span class='line-number'>47</span>
<span class='line-number'>48</span>
<span class='line-number'>49</span>
<span class='line-number'>50</span>
<span class='line-number'>51</span>
<span class='line-number'>52</span>
<span class='line-number'>53</span>
<span class='line-number'>54</span>
<span class='line-number'>55</span>
<span class='line-number'>56</span>
<span class='line-number'>57</span>
<span class='line-number'>58</span>
<span class='line-number'>59</span>
<span class='line-number'>60</span>
<span class='line-number'>61</span>
<span class='line-number'>62</span>
<span class='line-number'>63</span>
<span class='line-number'>64</span>
<span class='line-number'>65</span>
<span class='line-number'>66</span>
<span class='line-number'>67</span>
<span class='line-number'>68</span>
<span class='line-number'>69</span>
<span class='line-number'>70</span>
<span class='line-number'>71</span>
<span class='line-number'>72</span>
<span class='line-number'>73</span>
<span class='line-number'>74</span>
<span class='line-number'>75</span>
</pre></td><td class='code'><pre><code class='perl'><span class='line'><span class="c1">#!/usr/bin/perl</span>
</span><span class='line'><span class="c1">##################################################</span>
</span><span class='line'><span class="c1">#This script is responsible for making a secure  #</span>
</span><span class='line'><span class="c1">#connection via ssh to server1 and executing the #</span>
</span><span class='line'><span class="c1">#commaned ls .                                   #</span>
</span><span class='line'><span class="c1">#This script is also responsible for making a    #</span>
</span><span class='line'><span class="c1">#a secure connection via ssh to server1 and then #</span>
</span><span class='line'><span class="c1">#scp the file test.txt.                          #</span>
</span><span class='line'><span class="c1">##################################################</span>
</span><span class='line'>
</span><span class='line'><span class="c1">#import required modules</span>
</span><span class='line'><span class="k">use</span> <span class="n">strict</span><span class="p">;</span>
</span><span class='line'><span class="k">use</span> <span class="n">warnings</span><span class="p">;</span>
</span><span class='line'><span class="k">use</span> <span class="nn">Net::</span><span class="n">SCP</span> <span class="sx">qw(scp iscp)</span><span class="p">;</span>
</span><span class='line'><span class="k">use</span> <span class="nn">Net::</span><span class="n">SSH</span> <span class="sx">qw(ssh)</span><span class="p">;</span>
</span><span class='line'><span class="k">use</span> <span class="nn">Log::Dispatch::</span><span class="n">Syslog</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'><span class="c1">#declare local variables</span>
</span><span class='line'><span class="k">my</span> <span class="nv">$scp</span><span class="p">;</span>
</span><span class='line'><span class="k">my</span> <span class="nv">$host</span> <span class="o">=</span> <span class="s">&quot;server1.domain.com&quot;</span><span class="p">;</span>
</span><span class='line'><span class="k">my</span> <span class="nv">$user</span> <span class="o">=</span> <span class="s">&quot;user1&quot;</span><span class="p">;</span>
</span><span class='line'><span class="k">my</span> <span class="nv">$remotedir</span> <span class="o">=</span> <span class="s">&quot;/home/user1/&quot;</span><span class="p">;</span>
</span><span class='line'><span class="k">my</span> <span class="nv">$file</span> <span class="o">=</span> <span class="s">&quot;test.txt&quot;</span><span class="p">;</span>
</span><span class='line'><span class="k">my</span> <span class="nv">$cmd</span> <span class="o">=</span> <span class="s">&quot;/bin/ls&quot;</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'><span class="c1">####################Log::Dispatch::Syslog#######################################</span>
</span><span class='line'><span class="c1"># Define our pid for use in the log message</span>
</span><span class='line'><span class="k">my</span> <span class="nv">$pid</span> <span class="o">=</span> <span class="nb">getppid</span><span class="p">();</span>
</span><span class='line'><span class="c1"># Define our logfile object</span>
</span><span class='line'><span class="k">my</span> <span class="nv">$logfile</span> <span class="o">=</span> <span class="nn">Log::Dispatch::</span><span class="n">Syslog</span><span class="o">-&gt;</span><span class="k">new</span><span class="p">(</span> <span class="n">name</span> <span class="o">=&gt;</span> <span class="s">&#39;logfile&#39;</span><span class="p">,</span>
</span><span class='line'>                                          <span class="n">min_level</span> <span class="o">=&gt;</span> <span class="s">&#39;info&#39;</span><span class="p">,</span>
</span><span class='line'>                                          <span class="n">ident</span> <span class="o">=&gt;</span> <span class="s">&quot;running_list_cmd[$pid]&quot;</span> <span class="p">);</span>
</span><span class='line'><span class="c1">####################Log::Dispatch::Syslog#######################################</span>
</span><span class='line'>
</span><span class='line'><span class="c1">######first connect to $host via Net::SSH and run /bin/ls###########</span>
</span><span class='line'><span class="nv">$logfile</span><span class="o">-&gt;</span><span class="nb">log</span><span class="p">(</span> <span class="n">level</span> <span class="o">=&gt;</span> <span class="s">&#39;info&#39;</span><span class="p">,</span> <span class="n">message</span> <span class="o">=&gt;</span> <span class="s">&quot;Connecting to $host as $user and running /bin/ls ...&quot;</span> <span class="p">);</span>
</span><span class='line'><span class="n">ssh</span><span class="p">(</span><span class="s">&quot;$user\@$host&quot;</span><span class="p">,</span> <span class="nv">$cmd</span><span class="p">);</span>
</span><span class='line'><span class="nv">$logfile</span><span class="o">-&gt;</span><span class="nb">log</span><span class="p">(</span> <span class="n">level</span> <span class="o">=&gt;</span> <span class="s">&#39;info&#39;</span><span class="p">,</span> <span class="n">message</span> <span class="o">=&gt;</span> <span class="s">&quot;ls completed successfully!&quot;</span> <span class="p">);</span>
</span><span class='line'><span class="c1">######first connect to $host via Net::SSH and copy file $file###########</span>
</span><span class='line'>
</span><span class='line'><span class="c1">#initialize Net::SCP object and send credentials</span>
</span><span class='line'><span class="nv">$scp</span> <span class="o">=</span> <span class="nn">Net::</span><span class="n">SCP</span><span class="o">-&gt;</span><span class="k">new</span><span class="p">(</span><span class="nv">$host</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'><span class="c1">#notify user we&#39;re logging into $host</span>
</span><span class='line'><span class="k">print</span> <span class="s">&quot;Logging into $host ...\n&quot;</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'><span class="c1">#write &quot;connected to $host&quot; to $file</span>
</span><span class='line'><span class="nv">$logfile</span><span class="o">-&gt;</span><span class="nb">log</span><span class="p">(</span> <span class="n">level</span> <span class="o">=&gt;</span> <span class="s">&#39;info&#39;</span><span class="p">,</span> <span class="n">message</span> <span class="o">=&gt;</span> <span class="s">&quot;Connected to $host successfully.&quot;</span> <span class="p">);</span>
</span><span class='line'>
</span><span class='line'><span class="c1">#log into $host as $user</span>
</span><span class='line'><span class="nv">$scp</span><span class="o">-&gt;</span><span class="n">login</span><span class="p">(</span><span class="nv">$user</span><span class="p">)</span> <span class="ow">or</span> <span class="nb">die</span> <span class="nv">$scp</span><span class="o">-&gt;</span><span class="p">{</span><span class="n">errstr</span><span class="p">};</span>
</span><span class='line'>
</span><span class='line'><span class="c1">#write &quot;connected to $host&quot; to $file</span>
</span><span class='line'><span class="nv">$logfile</span><span class="o">-&gt;</span><span class="nb">log</span><span class="p">(</span> <span class="n">level</span> <span class="o">=&gt;</span> <span class="s">&#39;info&#39;</span><span class="p">,</span> <span class="n">message</span> <span class="o">=&gt;</span> <span class="s">&quot;Logged into $host successfully.&quot;</span> <span class="p">);</span>
</span><span class='line'>
</span><span class='line'><span class="c1">#notify user of changing working directory to $remotedir</span>
</span><span class='line'><span class="k">print</span> <span class="s">&quot;Chaging working directory to $remotedir\n&quot;</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'><span class="c1">#change working directory to $remotedir</span>
</span><span class='line'><span class="nv">$scp</span><span class="o">-&gt;</span><span class="n">cwd</span><span class="p">(</span><span class="nv">$remotedir</span><span class="p">)</span> <span class="ow">or</span> <span class="nb">die</span> <span class="nv">$scp</span><span class="o">-&gt;</span><span class="p">{</span><span class="n">errstr</span><span class="p">};</span>
</span><span class='line'>
</span><span class='line'><span class="c1">#Write Changed working directory (CWD) to $remotedir</span>
</span><span class='line'><span class="nv">$logfile</span><span class="o">-&gt;</span><span class="nb">log</span><span class="p">(</span> <span class="n">level</span> <span class="o">=&gt;</span> <span class="s">&#39;info&#39;</span><span class="p">,</span> <span class="n">message</span> <span class="o">=&gt;</span> <span class="s">&quot;CWD to $remotedir successfully.&quot;</span> <span class="p">);</span>
</span><span class='line'>
</span><span class='line'><span class="c1">#display file size of $file</span>
</span><span class='line'><span class="nv">$scp</span><span class="o">-&gt;</span><span class="n">size</span><span class="p">(</span><span class="nv">$file</span><span class="p">)</span> <span class="ow">or</span> <span class="nb">die</span> <span class="nv">$scp</span><span class="o">-&gt;</span><span class="p">{</span><span class="n">errstr</span><span class="p">};</span>
</span><span class='line'>
</span><span class='line'><span class="c1">#notify user scp of $file has started</span>
</span><span class='line'><span class="k">print</span> <span class="s">&quot;SCPing $remotedir$file from $host ...\n&quot;</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'><span class="c1">#scp $file from $host</span>
</span><span class='line'><span class="nv">$scp</span><span class="o">-&gt;</span><span class="n">get</span><span class="p">(</span><span class="nv">$file</span><span class="p">)</span> <span class="ow">or</span> <span class="nb">die</span> <span class="nv">$scp</span><span class="o">-&gt;</span><span class="p">{</span><span class="n">errstr</span><span class="p">};</span>
</span><span class='line'>
</span><span class='line'><span class="c1">#notify user scp of $file from $host was successful</span>
</span><span class='line'><span class="k">print</span> <span class="s">&quot;$remotedir$file copied from $host successfully!\n&quot;</span><span class="p">;</span>
</span></code></pre></td></tr></table></div></figure>



]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Net::Hulu Perl Module on CPAN]]></title>
    <link href="http://jackl0phty.org/2013/01/18/net-hulu-perl-module-on-cpan/"/>
    <updated>2013-01-18T21:48:00-05:00</updated>
    <id>http://jackl0phty.org/2013/01/18/net-hulu-perl-module-on-cpan</id>
    <content type="html"><![CDATA[<p>I wrote a Perl CPAN module Net::Hulu a while back.  You can install it like so:</p>

<pre><code>
perl -MCPAN -e 'install Net::Hulu' 
</code></pre>


<p>Net::Hulu provides methods to download all XML-formatted RSS feeds provided by hulu.com and return a data structure to the user containing the Data from the RSS feeds.</p>

<p>The following methods will download RSS feeds from hulu.com to directory where Hulu.pm is installed.</p>

<!-- more -->


<p>Method download_recent_videos_xml will download RSS feed for recent videos.</p>

<p>Method download_recent_shows_xml will download RSS feed for recent shows.</p>

<p>Method download_recent_movies_xml will download RSS feed for recent movies.</p>

<p>Method download_highest_rated_videos_xml will download RSS feed for highest rated videos.</p>

<p>Method download_popular_videos_today_xml will download RSS feed for today&#8217;s popular videos.</p>

<p>Method download_popular_videos_this_week_xml will download RSS feed for this week&#8217;s popular videos.</p>

<p>Method download_popular_videos_all_time_xml will download RSS feed for most popular videos of all time.</p>

<p>Method download_soon_to_expire_videos_xml will download RSS feed for soon to expire videos.</p>

<p>Method download_recent_blog_postings_xml will download RSS feed for recent blog postings to hulu.com.</p>

<p>The following methods will process all RSS feeds provided by hulu.com.</p>

<p>Method get_recent_videos returns a list of recently added videos to the user.</p>

<p>Method get_recent_shows returns a list of recently added shows to the user.</p>

<p>Method get_recent_movies returns a list of recently added movies to the user.</p>

<p>Method get_highest_rated_videos returns a list of highest rated videos to the user.</p>

<p>Method get_popular_videos_today returns a list of most popular videos today to the user.</p>

<p>Method get_popular_videos_this_week returns a list of most popular videos this week to the user.</p>

<p>Nethod get_popular_videos_all_time returns a list of most popular videos of all time to the user.</p>

<p>Method get_soon_to_expire_videos returns a list of soon to expire videos to the user.</p>

<p>Method get_recent_blog_postings returns recent blog postings for hulu.com to the user.</p>

<p>For detailed information on the Perl Module Net::Hulu, please visit the project&#8217;s home page on CPAN at http://search.cpan.org/~jlophty/Net-Hulu-0.02/lib/Net/Hulu.pm.</p>

<pre><code>
h2xs -b 5.6.0 -XA -n Net::Hulu
</code></pre>


<p>This will remove all autoload and XS portions of the module, adding backwards compatibility with Perl versions >= 5.6.0, and making it a &#8216;Pure Perl&#8217; implementation.</p>

<p>Disclaimer:  This blog entry comes with NO expressed warranty, guarantee, support, or maintenance of any kind.  Use at your own risk!</p>
]]></content>
  </entry>
  
</feed>
