<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Freenode Infra-Talk Channel</title>
	<atom:link href="http://infra-talk.org/feed/" rel="self" type="application/rss+xml" />
	<link>http://infra-talk.org</link>
	<description>Syndicator</description>
	<lastBuildDate>Tue, 15 May 2012 05:30:09 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.4</generator>
		<item>
		<title>Inspiration: The Water Clocks of Bernard Gitton</title>
		<link>http://spin.atomicobject.com/2012/05/15/inspiration-the-water-clocks-of-bernard-gitton/</link>
		<comments>http://spin.atomicobject.com/2012/05/15/inspiration-the-water-clocks-of-bernard-gitton/#comments</comments>
		<pubDate>Tue, 15 May 2012 05:30:09 +0000</pubDate>
		<dc:creator>Mike English</dc:creator>
				<category><![CDATA[Time]]></category>
		<category><![CDATA[art]]></category>
		<category><![CDATA[beauty]]></category>
		<category><![CDATA[bernard-gitton]]></category>
		<category><![CDATA[childhood]]></category>
		<category><![CDATA[clock]]></category>
		<category><![CDATA[culture]]></category>
		<category><![CDATA[design]]></category>
		<category><![CDATA[education]]></category>
		<category><![CDATA[fluids]]></category>
		<category><![CDATA[gitton]]></category>
		<category><![CDATA[inspiration]]></category>
		<category><![CDATA[learning]]></category>
		<category><![CDATA[physics]]></category>
		<category><![CDATA[sculpture]]></category>
		<category><![CDATA[timekeeping]]></category>
		<category><![CDATA[water]]></category>
		<category><![CDATA[water-clock]]></category>

		<guid isPermaLink="false">http://spin.atomicobject.com/?p=86177</guid>
		<description><![CDATA[Not long ago, I had an interesting lunchtime discussion with Job Vranish. I don&#8217;t recall exactly how we got on the topic, but we were discussing how mesmerizing siphons are. As the discussion progressed to imagining a fluid-based computer (that&#8217;s another story&#8230;), I remembered something I had seen as a child at the Indianapolis Children&#8217;s... <br /><br /><a href="http://spin.atomicobject.com/2012/05/15/inspiration-the-water-clocks-of-bernard-gitton/">Read More <span>&#187;</span></a>]]></description>
			<content:encoded><![CDATA[<!-- AddThis Button BEGIN -->
<div addthis:url='http://spin.atomicobject.com/2012/05/15/inspiration-the-water-clocks-of-bernard-gitton/' addthis:title='Inspiration: The Water Clocks of Bernard Gitton ' class="addthis_toolbox addthis_default_style ">
<a class="addthis_button_tweet"></a>
<a class="addthis_button_facebook_like" fb:like:layout="button_count"></a>
<a class="addthis_button_google_plusone" g:plusone:size="medium"></a>
<a class="addthis_counter addthis_pill_style"></a>
</div>

<p></p>

<!-- AddThis Button END -->	<p><a href="http://spin.atomicobject.com/2012/05/15/inspiration-the-water-clocks-of-bernard-gitton/2688908378_1e064cbbb1_b/" rel="attachment wp-att-86188"><img src="http://spin.atomicobject.com/wp-content/uploads/2688908378_1e064cbbb1_b-546x800.jpg" alt="" title="Water clock" width="546" height="800" class="size-medium wp-image-86188" /></a></p>

	<p>Not long ago, I had an interesting lunchtime discussion with <a href="http://spin.atomicobject.com/author/vranish/">Job Vranish</a>. I don&#8217;t recall exactly how we got on the topic, but we were discussing how mesmerizing <a href="http://en.wikipedia.org/wiki/Siphon">siphons</a> are. As the discussion progressed to imagining a fluid-based computer (that&#8217;s another story&#8230;), I remembered something I had seen as a child at the <a href="http://www.childrensmuseum.org/">Indianapolis Children&#8217;s museum</a>: an immense clock that kept time with the flow of water through glass tubes.</p>

	<p><span id="more-86177"></span></p>

	<p><a href="http://spin.atomicobject.com/2012/05/15/inspiration-the-water-clocks-of-bernard-gitton/2568448161_18b8ebf746_b/" rel="attachment wp-att-86183"><img src="http://spin.atomicobject.com/wp-content/uploads/2568448161_18b8ebf746_b-532x800.jpg" alt="" title="Water Clock - Indy Children&#039;s Museum" width="532" height="800" class="size-medium wp-image-86183" /></a></p>

	<p>Later I did some research into what I discovered is one of the largest water clocks ever made by the French physicist-turned-artist, <a href="http://en.wikipedia.org/wiki/Bernard_Gitton">Bernard Gitton</a>.</p>

	<p>Gitton&#8217;s water clock begins, as many clocks do, with a pendulum. This pendulum is attached to a small scoop into which a constant stream of water flows. As the pendulum swings, the scoops spills its contents into another vessel at regular intervals.</p>

	<p>These &#8220;dollops&#8221; of water must then be transformed into the displayed minute and hour values along the sides of the clock.</p>

	<p>First, the dollops drain from the collection vessel down a piece of glass tubing where they settle into the &#8220;trap&#8221; of an S-shaped siphon. The siphon is calibrated such that multiple dollops collect before the siphon triggers, suctioning the entirety of the contents down into the next component. These siphons are triggered when the fluid reaches the height of the top of the S-shaped curve and begins to be pulled downward by gravity. Once this process begins, the fluid continues to drain from the siphon until it is empty.</p>

	<p>In the case of Gitton&#8217;s water clock, the fluid drains into a series of additional siphons, calibrated to hold increasing volumes of water before triggering. These siphons act as frequency dividers for the initial signal provided by the pendulum. (i.e. If a dollop comes every two seconds, and the first siphon can hold three dollops, then the first siphon will drain only every 6 seconds, the second siphon in the series may hold several of these larger dollops, dividing the frequency still more, and so forth.)</p>

	<p>The last siphon in the series has a very interesting property &#8211; the low pressure created by draining of the vessel is &#8220;captured&#8221; by a sort of &#8220;vacuum locking&#8221; device that keeps the &#8220;vacuum&#8221; from &#8220;traveling&#8221; back up the input channel. Instead, the lower pressure is carried by another piece of tubing over to a vessel with a siphon on the brink of draining. (Just how this balance is calibrated is not clear to me.) When the &#8220;vacuum locked&#8221; siphon triggers and transfers this lower pressure to the other vessel, it triggers that siphon and drains the fluid into the minutes counter.</p>

	<p>This minutes counter is column of stacked globes that contain the colored fluid. The height of the fluid in the column fills a number of the globes corresponding to the minutes past the hour. Alongside the column of minute-globes is another S-shaped siphon that triggers just before the hour, draining the entire column and triggering another vessel to drain into the hours column. This process takes several minutes, during which the observer has the distinct impression that time itself is being lost down the drain. The Greek idiom used to refer to water clocks is &#8220;Clepsydra&#8221;, which translates more literally to &#8220;water thief&#8221;. Gitton calls these clocks (of which there are several around the world), Time-Flow Clocks or &#8220;Horloges à voir le temps couler&#8221; (roughly translated: clocks for viewing the passing of time).</p>

	<p><a href="http://spin.atomicobject.com/2012/05/15/inspiration-the-water-clocks-of-bernard-gitton/85912031_1299d2385b_b/" rel="attachment wp-att-86199"><img src="http://spin.atomicobject.com/wp-content/uploads/85912031_1299d2385b_b-590x786.jpg" alt="" title="Crazy Water Clock at the Children&#039;s Museum" width="590" height="786" class="aligncenter size-medium wp-image-86199" /></a></p>

	<p>If you&#8217;re as fascinated by this device as I am, you can read more at <a href="http://www.marcdatabase.com/~lemur/dm-gitton.html#clocktheory">this page</a>, put together by David M. MacMillan, where you can find a much more detailed technical explanation along with a number of helpful diagrams. I also recommend watching the fantastic nine minute documentary, <a href="https://vimeo.com/28461780">Bernard Gitton &#8211; Physics and Art</a>, done by <a href="http://www.magee.ch/">Michael Magee</a>. Another explanation of the water clock, produced by The Children&#8217;s Museum of Indianapolis, can be viewed <a href="http://youtu.be/tdGEVZ6zdyM">on YouTube</a>. There are a few other videos on YouTube of these water clocks in operation, but most of them are not very clear. You can get a better sense of what is happening by watching this <a href="http://www.cadrans-solaires.fr/gitton/animation-horloge-gitton.html">intricately animated illustration</a> created by Roland Barth. Additionally, Gitton&#8217;s studio has a small webpage with contact information at <a href="http://www.bernard-gitton.com">www.bernard-gitton.com</a>. (You may need to scroll sideways to reach the content in the frames on the Gitton site.)</p>

	<p>What beautiful artifacts inspire you? If you have children, do you try to expose them to things that inspire? What feats of engineering are still impressed upon your memory from childhood?</p>]]></content:encoded>
			<wfw:commentRss>http://spin.atomicobject.com/2012/05/15/inspiration-the-water-clocks-of-bernard-gitton/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Installing Windows 8 Consumer Preview</title>
		<link>http://feedproxy.google.com/~r/semicomplete/main/~3/PK2Xz8iRi08/installing-windows-8-consumer-preview.html</link>
		<comments>http://feedproxy.google.com/~r/semicomplete/main/~3/PK2Xz8iRi08/installing-windows-8-consumer-preview.html#comments</comments>
		<pubDate>Thu, 10 May 2012 06:50:00 +0000</pubDate>
		<dc:creator>semicomplete.com - Jordan Sissel</dc:creator>
				<category><![CDATA[geekery]]></category>

		<guid isPermaLink="false">http://www.semicomplete.com/blog/geekery/installing-windows-8-consumer-preview.html</guid>
		<description><![CDATA[I have a fresh workstation and am running through the windows 8 installer on USB.

When choosing the drive to install to, I get an error:


We couldn't create a new partition or locate an existing one


Lots of googling and I didn't find any hints for ...]]></description>
			<content:encoded><![CDATA[I have a fresh workstation and am running through the windows 8 installer on USB.

When choosing the drive to install to, I get an error:

<blockquote>
We couldn't create a new partition or locate an existing one
</blockquote>

Lots of googling and I didn't find any hints for windows 8, but windows 7 has a
similar error and folks pointed at diskpart nonsense to fix it. So let's do that -

<ul>
<li> At the installer, choose "Repair your computer"</li>
<li> Choose "troubleshoot" </li>
<li> Choose "advanced options" </li>
<li> Choose "command prompt"</li>
<li> Run diskpart.
</ul>

In diskpart, you'll want to make sure your target drive is formatted and active.

<pre>
list disk

# now pick your disk
select disk 0
clear
create partition
format fs=ntfs compress quick
active
</pre>

Now reboot and try the installer again, it worked for me.

<img src="http://feedproxy.google.com/images/spacer.gif?geekery/installing-windows-8-consumer-preview" width="1" height="1"><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/semicomplete/main?a=PK2Xz8iRi08:NW6osc0mv_E:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/semicomplete/main?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/semicomplete/main?a=PK2Xz8iRi08:NW6osc0mv_E:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/semicomplete/main?i=PK2Xz8iRi08:NW6osc0mv_E:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/semicomplete/main?a=PK2Xz8iRi08:NW6osc0mv_E:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/semicomplete/main?i=PK2Xz8iRi08:NW6osc0mv_E:V_sGLiPBpWU" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/semicomplete/main/~4/PK2Xz8iRi08" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://infra-talk.org/2012/05/10/installing-windows-8-consumer-preview/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Devops in Munich</title>
		<link>http://www.krisbuytaert.be/blog/devops-munich</link>
		<comments>http://www.krisbuytaert.be/blog/devops-munich#comments</comments>
		<pubDate>Tue, 01 May 2012 19:02:30 +0000</pubDate>
		<dc:creator>Kris Buytaert</dc:creator>
				<category><![CDATA[/testing]]></category>
		<category><![CDATA[Deployment]]></category>
		<category><![CDATA[Monitoring]]></category>
		<category><![CDATA[cfp]]></category>
		<category><![CDATA[configmgmt]]></category>
		<category><![CDATA[devops]]></category>
		<category><![CDATA[drupal]]></category>
		<category><![CDATA[measurement]]></category>
		<category><![CDATA[mysql]]></category>
		<category><![CDATA[puppet]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Devopsdays Mountainview sold out in a short 3 hours ..   but there's other events   that will breath devops this summer.
DrupalCon in Munich will be one of them ..
Some of you might have noticed that I`m cochairing the devops track for DrupalCon Munich...]]></description>
			<content:encoded><![CDATA[<p>Devopsdays Mountainview sold out in a short 3 hours ..   but there's other events   that will breath devops this summer.<br />
DrupalCon in Munich will be one of them ..</p>
<p>Some of you might have noticed that I`m cochairing the devops track for DrupalCon Munich,<br />
The CFP is open till the 11th of this month and we are still actively looking for speakers.</p>
<p>We're trying to bridge the gap between drupal developers and the people that put their code to production, at scale.<br />
But also enhancing the knowledge of infrastructure components Drupal developers depend on.</p>
<p>We're looking for talks both on culture (both success stories and failure) ,   automation,<br />
specifically looking for people talking about drupal deployments , eg using tools like Capistrano, Chef, Puppet,<br />
We want to hear where Continuous Integration fits in your deployment ,  do you do Continuous Delivery of a drupal environment.<br />
And how do you test ... yes we like to hear a lot about testing , performance tests, security tests, application tests and so on.<br />
...  Or have you solved the content vs code vs config  deployment problem yet ? </p>
<p>How are you measuring and monitoring these deployments and adding metrics to them  so you can get good visibility on both<br />
system and user actions of your platform.  Have you build fancy dashboards showing your whole organisation the current state of your deployment ? </p>
<p>We're also looking  for people talking about introducing different data backends,  nosql,  scaling different search backends , building your own cdn using  smart  filesystem setups.<br />
Or making smart use of existing backends, such as tuning and scaling MySQL, memcached and others.</p>
<p>So lets make it clear to the community that drupal people do care about their code after they committed it in source control ! </p>
<p>Please submit your talks <a href="http://munich2012.drupal.org/news/call-for-papers" rel="nofollow">here</a></p>
]]></content:encoded>
			<wfw:commentRss>http://infra-talk.org/2012/05/01/devops-in-munich/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Sending PGP HTML Encrypted e-mail with PHP</title>
		<link>http://wildness.espix.org/index.php?post/2012/04/30/Sending-PGP-HTML-Encrypted-e-mail-with-PHP</link>
		<comments>http://wildness.espix.org/index.php?post/2012/04/30/Sending-PGP-HTML-Encrypted-e-mail-with-PHP#comments</comments>
		<pubDate>Sun, 29 Apr 2012 22:40:00 +0000</pubDate>
		<dc:creator>wildcat</dc:creator>
				<category><![CDATA[MIME]]></category>
		<category><![CDATA[PGP]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[html]]></category>
		<category><![CDATA[mail]]></category>
		<category><![CDATA[php]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[    While adding the PGP HTML Report feature to WeSunSolve,
I first successfully crypted the content of the HTML report to be sent to the user with PGP key.
I would have thought that this was gonna be the hardest part, that was without thinking about M...]]></description>
			<content:encoded><![CDATA[    <p>While adding the PGP HTML Report feature to WeSunSolve,
I first successfully crypted the content of the HTML report to be sent to the user with PGP key.
I would have thought that this was gonna be the hardest part, that was without thinking about MIME and HTML support of PGP encrypted mails.</p>
<p>Here is how I finally ended up by creating HTML PGP encrypted Mails using PHP which can be opened using (at least) claws-mail and thunderbird with proper rendering of the HTML report:</p>
<h2>Content of the clear message</h2>
<pre>
To: test@test.com
Subject: My HTML crypted report
X-PHP-Originating-Script: 1000:mlist.obj.php
From: "We Sun Solve" <admin@wesunsolve.net>
Reply-to: admin@wesunsolve.net
X-Sender: WeSunSolve v2.0
Message-ID: <1335717276@wesunsolve.net>
Date: Sun, 29 Apr 2012 18:34:36 +0200
MIME-Version: 1.0
Content-Type: multipart/encrypted;
 protocol="application/pgp-encrypted";
 boundary="------------enig029BFFF948226050D5D90E10F"

This is an OpenPGP/MIME encrypted message (RFC 2440 and 3156)
--------------enig029BFFF948226050D5D90E10F
Content-Type: application/pgp-encrypted
Content-Description: PGP/MIME version identification

Version: 1

--------------enig029BFFF948226050D5D90E10F
Content-Type: application/octet-stream; name="encrypted.asc"
Content-Description: OpenPGP encrypted message
Content-Disposition: inline; filename="encrypted.asc"

-----BEGIN PGP MESSAGE-----
Version: GnuPG v1.4.10 (GNU/Linux)

****SNIPPED PGP CRYPTED BASE64 MESSAGE ****
-----END PGP MESSAGE-----

--------------enig029BFFF948226050D5D90E10F--
</pre>
<h2>Content of the PGP encrypted part</h2>
<pre>
Content-Type: multipart/alternative;
 boundary="------------F983FADF500537B8AFDC5E483"

This is a multi-part message in MIME format.
--------------F983FADF500537B8AFDC5E483
Content-Type: text/plain; charset=utf-8
Content-Transfer-Encoding: quoted-printable

You need to have a MUA capable of rendering HTML to read
the WeSunSolve emails.

You can consult the website http://wesunsolve.net if you
are not able to read this email, the information sent to you
should also be on the website...

--------------F983FADF500537B8AFDC5E483
Content-Type: text/html; charset="utf-8"
Content-Transfer-Encoding: quoted-printable

<html><p>This is the report in cleartext!</p></html>

--------------F983FADF500537B8AFDC5E483--
</pre>
<div><h2>Code Used</h2>
<div><code><div>$pgpmime = '';</div><div>$mime = '';</div><div>$headers = '';</div><div>$dest = 'test@test.com';</div><div>$subject = 'My HTML crypted report';</div><div>$clearContent = '&lt;html&gt;&lt;p&gt;This is the report in cleartext!&lt;/p&gt;&lt;/html&gt;';</div><div>$clearText = 'This is the text version of the report';</div><div>/* Prepare the crypted Part of the message */</div><div>$bound = '------------'.substr(strtoupper(md5(uniqid(rand()))), 0, 25);</div><div>$pgpmime .= "Content-Type: multipart/alternative;\r\n boundary=\"$bound\"\r\n\r\n";</div><div>$pgpmime .= "This is a multi-part message in MIME format.\r\n";</div><div>$pgpmime .= "--$bound\r\n";</div><div>$pgpmime .= "Content-Type: text/plain; charset=utf-8\r\n";</div><div>$pgpmime .= "Content-Transfer-Encoding: quoted-printable\r\n\r\n";</div><div>$pgpmime .= $clearText."\r\n\r\n";</div><div>$pgpmime .= "--$bound\r\n";</div><div>$pgpmime .= "Content-Type: text/html; charset=\"utf-8\"\r\n";</div><div>$pgpmime .= "Content-Transfer-Encoding: quoted-printable\r\n\r\n";</div><div>$pgpmime .= $clearContent."\r\n";</div><div>$pgpmime .= "--$bound--\r\n";</div><div>$content = GPG::cryptTxt($pgpkey, $pgpmime);</div><div>/* Make the email's headers */</div><div>$headers = '';</div><div>$headers = "From: $from\r\n";</div><div>$headers .= "Reply-to: ".$config['mailFrom']."\r\n";</div><div>$headers .= "X-Sender: WeSunSolve v2.0\r\n";</div><div>$headers .= "Message-ID: &lt;".time()."@".$_SERVER['SERVER_NAME']."&gt;\r\n";</div><div>$headers .= "Date: " . date("r") . "\r\n";</div><div>$bound = '------------enig'.substr(strtoupper(md5(uniqid(rand()))), 0, 25);</div><div>$headers .= "MIME-Version: 1.0\r\n";</div><div>$headers .= "Content-Type: multipart/encrypted;\r\n";</div><div>$headers .= " protocol=\"application/pgp-encrypted\";\r\n";</div><div>$headers .= " boundary=\"$bound\"\r\n\r\n";</div><div>/* And the cleartext body which encapsulate PGP message */</div><div>$mime = '';</div><div>$mime .= "This is an OpenPGP/MIME encrypted message (RFC 2440 and 3156)\r\n";</div><div>$mime .= "--$bound\r\n";</div><div>$mime .= "Content-Type: application/pgp-encrypted\r\n";</div><div>$mime .= "Content-Description: PGP/MIME version identification\r\n\r\n";</div><div>$mime .= "Version: 1\r\n\r\n";</div><div>$mime .= "--$bound\r\n";</div><div>$mime .= "Content-Type: application/octet-stream; name=\"encrypted.asc\"\r\n";</div><div>$mime .= "Content-Description: OpenPGP encrypted message\r\n";</div><div>$mime .= "Content-Disposition: inline; filename=\"encrypted.asc\"\r\n\r\n";</div><div>$mime .= $content."\r\n";</div><div>$mime .= "--$bound--";</div><div><div>mail($dest, $subject, $mime, $headers);</div></div></code></div>
</div>]]></content:encoded>
			<wfw:commentRss>http://wildness.espix.org/index.php?feed/atom/comments/52</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Go With The Flow – Progress Update</title>
		<link>http://www.devco.net/archives/2012/04/29/go-with-the-flow-progress-update-2.php</link>
		<comments>http://www.devco.net/archives/2012/04/29/go-with-the-flow-progress-update-2.php#comments</comments>
		<pubDate>Sun, 29 Apr 2012 08:58:53 +0000</pubDate>
		<dc:creator>R.I. Pienaar</dc:creator>
				<category><![CDATA[Code]]></category>
		<category><![CDATA[gwtf]]></category>
		<category><![CDATA[ruby]]></category>

		<guid isPermaLink="false">http://www.devco.net/?p=2568</guid>
		<description><![CDATA[A few weeks ago I blogged about my TODO / Reminder project called gwtf, I&#8217;ve done a lot since then and thought I&#8217;ll give a quick progress update. Generally I am very glad I started this process, I am actually continuing to use it today which is probably the longest I&#8217;ve ever used any TODO [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://devco.net/images/gwtf-boxcar.png" style="float:right">A few weeks ago I blogged about my <a href="http://www.devco.net/archives/2012/03/11/go-with-the-flow-task-tracking-for-the-cli.php">TODO / Reminder project called gwtf</a>, I&#8217;ve done a lot since then and thought I&#8217;ll give a quick progress update.</p>
<p>Generally I am very glad I started this process, I am actually continuing to use it today which is probably the longest I&#8217;ve ever used any TODO or reminder application. It really is good to be able to hack your own workflow and have a tool you can adapt to your needs rather than try to fit the mold of some off the shelf tool. </p>
<p>The time tracking feature has proven very valuable &#8211; as I work on my various projects I will track time worked with gwtf and review my mental estimate at the end of adding a feature. In time I am sure this will improve my ability to provide accurate time estimates while coding something for work etc.</p>
<p>The big thing I&#8217;ve added is a reminder system that can send notifications via email, <a href="http://boxcar.io/">boxcar</a> or <a href="http://notifo.com/">notifo</a> (community contributed method). The image show my iPhone receiving a push message. All items can have a reminder date and in line with the Unix CLI approach this is done using your system at(1) command. Each notification can go to multiple recipients so I get email and push notifications.</p>
<p><code></p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">% gwtf new this is a test --remind=&quot;now + 1 week&quot; --done --ifopen
Creating reminder at job for item 30: job 46 at 2012-03-13 20:09
   30                 this is a test</pre></div></div>

<p></code></p>
<p>Here I will get a reminder a week from now after reminding the item will be marked as done. The reminder will only be sent if item has not already been closed.</p>
<p>Building on this I added a special project called <em>reminders</em> that does not show up in the normal list output, this project is where simple one-off reminders (and soon repeating ones) go. Being hidden from the list output means I can have many of them without feeling like I have a huge TODO backlog since these aren&#8217;t strictly TODO items.</p>
<p><code></p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">% gwtf remind --at=&quot;now +1 hour&quot; do something
Creating reminder at job for item 84: job 66 at 2012-04-10 15:11
   103 L   2012-04-13 do something</pre></div></div>

<p></code></p>
<p>Items now have due dates and there is a notification method that will email you all due and overdue tasks.  I find if my todo list get mailed to me every day I get blind to it real quick, by only mailing due and overdue items they stand out and I pay them attention.</p>
<p>Various item list commands have been added. When I log into my shell I get the following, the colors show me that the projects have items due soon, it would go red when they are overdue.</p>
<p><center><img src="http://www.devco.net/images/gwtf-overview-list.png"></center></p>
<p>I&#8217;ve added an overview mode to the list command that shows all projects and their open items, again color coded as above.</p>
<p>I&#8217;ve also augmented all the date processing using the excellent <a href="https://github.com/mojombo/chronic">Chronic</a> gem. This means anywhere I need a date or time specification I can use natural language dates. For example the due date specification can be as simple as <em>&#8211;due=&#8221;next week&#8221;</em> which would end up being due on next Wednesday. I can be more specific like <em>&#8211;due=&#8221;7pm next tuesday&#8221;</em> etc. I really like this mode of date input since I almost never know what the date is anyway it&#8217;s a big challenge to type in full dates for this kind of system.</p>
<p>That&#8217;s the big ticket items but there has been a ton of small tweaks. Overall I&#8217;ve done 16 releases of the Gem and it&#8217;s been downloaded 1600+ times from rubygems.org. I put <a href="http://ripienaar.github.com/gwtf/">a little website up for it</a> using the new GitHub site system with full documentation etc.</p>
<p>I am not sure who the 1600 downloaders are, I am certainly not developing this with other peoples needs in mind but hopefully someone is gaining value from it.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.devco.net/archives/2012/04/29/go-with-the-flow-progress-update-2.php/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Trigger Puppet runs though Git hooks</title>
		<link>http://www.devco.net/archives/2012/04/28/trigger-puppet-runs.php</link>
		<comments>http://www.devco.net/archives/2012/04/28/trigger-puppet-runs.php#comments</comments>
		<pubDate>Sat, 28 Apr 2012 22:11:27 +0000</pubDate>
		<dc:creator>R.I. Pienaar</dc:creator>
				<category><![CDATA[Code]]></category>
		<category><![CDATA[git]]></category>
		<category><![CDATA[mcollective]]></category>
		<category><![CDATA[puppet]]></category>
		<category><![CDATA[ruby]]></category>

		<guid isPermaLink="false">http://www.devco.net/?p=2529</guid>
		<description><![CDATA[Since shutting down my business I now run a small 25 node network with no Puppet Masters and I do not schedule regular Puppet runs &#8211; I run them just when needed. Till now I&#8217;ve just done puppet runs via MCollective, basically I&#8217;d edit some puppet files and after comitting them just send off a [...]]]></description>
			<content:encoded><![CDATA[<p>Since shutting down my business I now run a small 25 node network with no Puppet Masters and I do not schedule regular Puppet runs &#8211; I run them just when needed.</p>
<p>Till now I&#8217;ve just done puppet runs via MCollective, basically I&#8217;d edit some puppet files and after comitting them just send off a puppet run with mcollective, supplying filters by hand so I only trigger runs on the appropriate nodes.</p>
<p>I started looking into git commit hooks to see if I can streamline this. I could of course just trigger a run on all nodes after a commit, there is no problem with capacity of masters etc to worry about. This is not very elegant so I thought I&#8217;d write something to parse my git push and trigger runs on just the right machines.</p>
<p>I&#8217;ll show a simplified version of the code here, the full version of the post-receive hook can be found <a href="http://devco.net/code/post-receive.rb">here</a>.  I&#8217;ve removed the <em>parse_hiera</em>, <em>parse_node</em> and <em>parse_modules</em> functions from this but you can find them in the code linked to.  To use this code you will need MCollective 2.0.0 that is due in a few days.</p>
<p><code></p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
</pre></td><td class="code"><pre class="ruby" style="font-family:monospace;"><span style="color:#008000; font-style:italic;">#!/usr/bin/env ruby</span>
&nbsp;
<span style="color:#CC0066; font-weight:bold;">require</span> <span style="color:#996600;">'rubygems'</span>
<span style="color:#CC0066; font-weight:bold;">require</span> <span style="color:#996600;">'grit'</span>
<span style="color:#CC0066; font-weight:bold;">require</span> <span style="color:#996600;">'mcollective'</span>
&nbsp;
<span style="color:#9966CC; font-weight:bold;">include</span> <span style="color:#6666ff; font-weight:bold;">MCollective::RPC</span>
&nbsp;
<span style="color:#0066ff; font-weight:bold;">@matched_modules</span> = <span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#006600; font-weight:bold;">&#93;</span>
<span style="color:#0066ff; font-weight:bold;">@matched_nodes</span> = <span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#006600; font-weight:bold;">&#93;</span>
<span style="color:#0066ff; font-weight:bold;">@matched_facts</span> = <span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#006600; font-weight:bold;">&#93;</span>
&nbsp;
<span style="color:#008000; font-style:italic;"># read each git ref in the push and process them</span>
<span style="color:#9966CC; font-weight:bold;">while</span> msg = <span style="color:#CC0066; font-weight:bold;">gets</span>
  old_sha, new_sha, ref = msg.<span style="color:#CC0066; font-weight:bold;">split</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#996600;">' '</span>, <span style="color:#006666;">3</span><span style="color:#006600; font-weight:bold;">&#41;</span>
&nbsp;
  repo = <span style="color:#6666ff; font-weight:bold;">Grit::Repo</span>.<span style="color:#9900CC;">new</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#CC00FF; font-weight:bold;">File</span>.<span style="color:#9900CC;">join</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#CC00FF; font-weight:bold;">File</span>.<span style="color:#9900CC;">dirname</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#0000FF; font-weight:bold;">__FILE__</span><span style="color:#006600; font-weight:bold;">&#41;</span>, <span style="color:#996600;">'..'</span><span style="color:#006600; font-weight:bold;">&#41;</span><span style="color:#006600; font-weight:bold;">&#41;</span>
&nbsp;
  commit = repo.<span style="color:#9900CC;">commit</span><span style="color:#006600; font-weight:bold;">&#40;</span>new_sha<span style="color:#006600; font-weight:bold;">&#41;</span>
&nbsp;
  <span style="color:#9966CC; font-weight:bold;">case</span> ref
    <span style="color:#9966CC; font-weight:bold;">when</span> <span style="color:#006600; font-weight:bold;">%</span>r<span style="color:#006600; font-weight:bold;">&#123;</span>^refs<span style="color:#006600; font-weight:bold;">/</span>heads<span style="color:#006600; font-weight:bold;">/</span><span style="color:#006600; font-weight:bold;">&#40;</span>.<span style="color:#006600; font-weight:bold;">*</span><span style="color:#006600; font-weight:bold;">&#41;</span>$<span style="color:#006600; font-weight:bold;">&#125;</span>
      branch = $~<span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#006666;">1</span><span style="color:#006600; font-weight:bold;">&#93;</span>
      <span style="color:#9966CC; font-weight:bold;">if</span> branch == <span style="color:#996600;">&quot;master&quot;</span>
        <span style="color:#CC0066; font-weight:bold;">puts</span> <span style="color:#996600;">&quot;Commit on #{branch}&quot;</span>
        commit.<span style="color:#9900CC;">diffs</span>.<span style="color:#9900CC;">each</span> <span style="color:#9966CC; font-weight:bold;">do</span> <span style="color:#006600; font-weight:bold;">|</span>diff<span style="color:#006600; font-weight:bold;">|</span>
          <span style="color:#CC0066; font-weight:bold;">puts</span> <span style="color:#996600;">&quot;    %s&quot;</span> <span style="color:#006600; font-weight:bold;">%</span> diff.<span style="color:#9900CC;">b_path</span>
&nbsp;
          <span style="color:#008000; font-style:italic;"># parse the paths and save them to the @matched_* arrays</span>
          <span style="color:#008000; font-style:italic;"># these functions are in the full code paste linked to above</span>
          <span style="color:#9966CC; font-weight:bold;">case</span> diff.<span style="color:#9900CC;">b_path</span>
            <span style="color:#9966CC; font-weight:bold;">when</span> <span style="color:#006600; font-weight:bold;">/</span>^hieradb<span style="color:#006600; font-weight:bold;">/</span>
              parse_hiera<span style="color:#006600; font-weight:bold;">&#40;</span>diff.<span style="color:#9900CC;">b_path</span><span style="color:#006600; font-weight:bold;">&#41;</span>
            <span style="color:#9966CC; font-weight:bold;">when</span> <span style="color:#006600; font-weight:bold;">/</span>^nodes<span style="color:#006600; font-weight:bold;">/</span>
              parse_node<span style="color:#006600; font-weight:bold;">&#40;</span>diff.<span style="color:#9900CC;">b_path</span><span style="color:#006600; font-weight:bold;">&#41;</span>
            <span style="color:#9966CC; font-weight:bold;">when</span> <span style="color:#006600; font-weight:bold;">/</span>^common\<span style="color:#006600; font-weight:bold;">/</span>modules<span style="color:#006600; font-weight:bold;">/</span>
              parse_modules<span style="color:#006600; font-weight:bold;">&#40;</span>diff.<span style="color:#9900CC;">b_path</span><span style="color:#006600; font-weight:bold;">&#41;</span>
            <span style="color:#9966CC; font-weight:bold;">else</span>
              <span style="color:#CC0066; font-weight:bold;">puts</span> <span style="color:#996600;">&quot;ERROR: Do not know how to parse #{diff.b_path}&quot;</span>
          <span style="color:#9966CC; font-weight:bold;">end</span>
        <span style="color:#9966CC; font-weight:bold;">end</span>
      <span style="color:#9966CC; font-weight:bold;">else</span>
        <span style="color:#CC0066; font-weight:bold;">puts</span> <span style="color:#996600;">&quot;Commit on non master branch #{branch} ignoring&quot;</span>
      <span style="color:#9966CC; font-weight:bold;">end</span>
  <span style="color:#9966CC; font-weight:bold;">end</span>
<span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
<span style="color:#9966CC; font-weight:bold;">unless</span> <span style="color:#0066ff; font-weight:bold;">@matched_modules</span>.<span style="color:#9900CC;">empty</span>? <span style="color:#006600; font-weight:bold;">&amp;&amp;</span> <span style="color:#0066ff; font-weight:bold;">@matched_nodes</span>.<span style="color:#9900CC;">empty</span>? <span style="color:#006600; font-weight:bold;">&amp;&amp;</span> <span style="color:#0066ff; font-weight:bold;">@matched_facts</span>.<span style="color:#9900CC;">empty</span>?
  puppet = rpcclient<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#996600;">&quot;puppetd&quot;</span><span style="color:#006600; font-weight:bold;">&#41;</span>
&nbsp;
  nodes = <span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#006600; font-weight:bold;">&#93;</span>
  compound_filter = <span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#006600; font-weight:bold;">&#93;</span>
&nbsp;
  nodes <span style="color:#006600; font-weight:bold;">&lt;&lt;</span> <span style="color:#0066ff; font-weight:bold;">@matched_nodes</span>
&nbsp;
  <span style="color:#008000; font-style:italic;"># if classes or facts are found then do a discover</span>
  <span style="color:#9966CC; font-weight:bold;">unless</span> <span style="color:#0066ff; font-weight:bold;">@matched_modules</span>.<span style="color:#9900CC;">empty</span>? <span style="color:#006600; font-weight:bold;">&amp;&amp;</span> <span style="color:#0066ff; font-weight:bold;">@matched_facts</span>.<span style="color:#9900CC;">empty</span>?
    compound_filter <span style="color:#006600; font-weight:bold;">&lt;&lt;</span> <span style="color:#0066ff; font-weight:bold;">@matched_modules</span> <span style="color:#006600; font-weight:bold;">&lt;&lt;</span> <span style="color:#0066ff; font-weight:bold;">@matched_facts</span>
&nbsp;
    puppet.<span style="color:#9900CC;">comound_filter</span> compound_filter.<span style="color:#9900CC;">flatten</span>.<span style="color:#9900CC;">uniq</span>.<span style="color:#9900CC;">join</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#996600;">&quot; or &quot;</span><span style="color:#006600; font-weight:bold;">&#41;</span>
&nbsp;
    nodes <span style="color:#006600; font-weight:bold;">&lt;&lt;</span> puppet.<span style="color:#9900CC;">discover</span>
  <span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
  <span style="color:#9966CC; font-weight:bold;">if</span> nodes.<span style="color:#9900CC;">flatten</span>.<span style="color:#9900CC;">uniq</span>.<span style="color:#9900CC;">empty</span>?
    <span style="color:#CC0066; font-weight:bold;">puts</span> <span style="color:#996600;">&quot;No nodes discovered via mcollective or in commits&quot;</span>
    <span style="color:#CC0066; font-weight:bold;">exit</span>
  <span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
  <span style="color:#008000; font-style:italic;"># use new mc 2.0.0 pluggable discovery to supply node list</span>
  <span style="color:#008000; font-style:italic;"># thats a combination of data discovered on the network and file named</span>
  puppet.<span style="color:#9900CC;">discover</span> <span style="color:#ff3333; font-weight:bold;">:nodes</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> nodes.<span style="color:#9900CC;">flatten</span>.<span style="color:#9900CC;">uniq</span>
&nbsp;
  <span style="color:#CC0066; font-weight:bold;">puts</span>
  <span style="color:#CC0066; font-weight:bold;">puts</span> <span style="color:#996600;">&quot;Files matched classes: %s&quot;</span> <span style="color:#006600; font-weight:bold;">%</span> <span style="color:#0066ff; font-weight:bold;">@matched_modules</span>.<span style="color:#9900CC;">join</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#996600;">&quot;, &quot;</span><span style="color:#006600; font-weight:bold;">&#41;</span> <span style="color:#9966CC; font-weight:bold;">unless</span> <span style="color:#0066ff; font-weight:bold;">@matched_modules</span>.<span style="color:#9900CC;">empty</span>?
  <span style="color:#CC0066; font-weight:bold;">puts</span> <span style="color:#996600;">&quot;Files matched nodes: %s&quot;</span> <span style="color:#006600; font-weight:bold;">%</span> <span style="color:#0066ff; font-weight:bold;">@matched_nodes</span>.<span style="color:#9900CC;">join</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#996600;">&quot;, &quot;</span><span style="color:#006600; font-weight:bold;">&#41;</span> <span style="color:#9966CC; font-weight:bold;">unless</span> <span style="color:#0066ff; font-weight:bold;">@matched_nodes</span>.<span style="color:#9900CC;">empty</span>?
  <span style="color:#CC0066; font-weight:bold;">puts</span> <span style="color:#996600;">&quot;Files matched facts: %s&quot;</span> <span style="color:#006600; font-weight:bold;">%</span> <span style="color:#0066ff; font-weight:bold;">@matched_facts</span>.<span style="color:#9900CC;">join</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#996600;">&quot;, &quot;</span><span style="color:#006600; font-weight:bold;">&#41;</span> <span style="color:#9966CC; font-weight:bold;">unless</span> <span style="color:#0066ff; font-weight:bold;">@matched_facts</span>.<span style="color:#9900CC;">empty</span>?
  <span style="color:#CC0066; font-weight:bold;">puts</span>
  <span style="color:#CC0066; font-weight:bold;">puts</span> <span style="color:#996600;">&quot;Triggering puppet runs on the following nodes:&quot;</span>
  <span style="color:#CC0066; font-weight:bold;">puts</span>
  puppet.<span style="color:#9900CC;">discover</span>.<span style="color:#9900CC;">in_groups_of</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#006666;">3</span><span style="color:#006600; font-weight:bold;">&#41;</span> <span style="color:#9966CC; font-weight:bold;">do</span> <span style="color:#006600; font-weight:bold;">|</span>nodes<span style="color:#006600; font-weight:bold;">|</span>
    <span style="color:#CC0066; font-weight:bold;">puts</span> <span style="color:#996600;">&quot;   %-20s %-20s %-20s&quot;</span> <span style="color:#006600; font-weight:bold;">%</span> nodes
  <span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
  puppet.<span style="color:#9900CC;">runonce</span>
&nbsp;
  printrpcstats
<span style="color:#9966CC; font-weight:bold;">else</span>
  <span style="color:#CC0066; font-weight:bold;">puts</span> <span style="color:#996600;">&quot;ERROR: Could not determine a list of nodes to run&quot;</span>
<span style="color:#9966CC; font-weight:bold;">end</span></pre></td></tr></table></div>

<p></code></p>
<p>The code between lines 14 and 46 just reads each line of the git post-receive hook STDIN and process them, you can read more about these hooks @ <a href="http://book.git-scm.com/5_git_hooks.html">git-scm.com</a>.</p>
<p>For each b path in the commit I parse its path based on puppet module conventions, node names, my hiera structure and some specific aspects of my file layouts.  These end up in the <em>@matched_modules</em>, <em>@matched_nodes</em> and <em>@matched_facts</em> arrays.</p>
<p>MCollective 2.0.0 will let you supply node names not just from network based discovery but from any source really.  Here I get node names from things like my node files, file names in iptables rules and such. Version 2.0.0 also supports a new query language for discovery which we use here.  The goal is to do a network discovery only when I have non specific data like class names &#8211; if I found just a list of node names I do not need to do go out to the network to do discovery thanks to the new abilities of MCollective 2.0.0 </p>
<p>In lines 48 to 90 I create a MCollective client to the puppetd agent, discover matching nodes and do the puppet runs.</p>
<p>If I found any code in the git push that matched either classes or facts I need to do a full MCollective discover based on those to get a node list. This is done using the new compound filtering language, the filter will look something like:</p>
<p><code></p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">/some_class/ or some::other::class or fact=value</pre></div></div>

<p></code></p>
<p>But this expensive network wide discovery is only run when there are facts or classes matched out of the commit.</p>
<p>Line 72 will supply the combined MCollective discovered nodes and node names discovered out of the code paths as discovery data which later in line 85 will get used to trigger the runs.</p>
<p>The end result of this can be seen here, the commit matched only 5 out of my 25 machines and only those will be run:</p>
<p><code></p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">$ git push origin master
Counting objects: 13, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (6/6), done.
Writing objects: 100% (7/7), 577 bytes, done.
Total 7 (delta 4), reused 0 (delta 0)
remote: Commit on master
remote:     common/modules/mcollective/manifests/client.pp
remote:
remote: Files matched classes: mcollective::client
remote:
remote: Triggering puppet runs on the following nodes:
remote:
remote:    node1                node2            node3
remote:    node4                node5
remote:
remote: 5 / 5
remote:
remote: Finished processing 5 / 5 hosts in 522.15 ms
To git@git:puppet.git
   7590a60..10ee4da  master -&gt; master</pre></div></div>

<p></code></p>
]]></content:encoded>
			<wfw:commentRss>http://www.devco.net/archives/2012/04/28/trigger-puppet-runs.php/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>WeSunSolve: Site News April</title>
		<link>http://wildness.espix.org/index.php?post/2012/04/27/WeSunSolve:-Site-News</link>
		<comments>http://wildness.espix.org/index.php?post/2012/04/27/WeSunSolve:-Site-News#comments</comments>
		<pubDate>Fri, 27 Apr 2012 08:00:00 +0000</pubDate>
		<dc:creator>wildcat</dc:creator>
				<category><![CDATA[bug]]></category>
		<category><![CDATA[cve]]></category>
		<category><![CDATA[oracle]]></category>
		<category><![CDATA[patch]]></category>
		<category><![CDATA[security]]></category>
		<category><![CDATA[solaris]]></category>
		<category><![CDATA[wesunsolve]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[    New Features

Added wiki to hold the documentation;
Added the monitoring of multiple IPS Repositories;
User list now allows the user to load multiple patches at once;
Added patch timeline
Added CVE list affecting Solaris packages
Added patch link t...]]></description>
			<content:encoded><![CDATA[    <h3>New Features</h3>
<ul class="toclist">
<li>Added <a href="http://wiki.wesunsolve.net">wiki</a> to hold the documentation;</li>
<li>Added the monitoring of multiple <a href="http://wesunsolve.net/lips">IPS Repositories</a>;</li>
<li>User list now allows the user to load <a href="http://wiki.wesunsolve.net/PatchesLists">multiple patches at once</a>;</li>
<li>Added patch timeline</li>
<li>Added <a href="http://wesunsolve.net/lcve">CVE list</a> affecting Solaris packages</li>
<li>Added <a href="http://wesunsolve.net/lcvep">patch link to CVE</a> when issue is fixed</li>
<li>Users can now <a href="http://wiki.wesunsolve.net/PatchesLists">download a ZIP</a> containing all README of user patch list</li>
<li>SSL Signed certificate added to <a href="https://wesunsolve.net">wesunsolve.net https</a> domain</li>
<li>User login goes over SSL by default</li>
<li>Added support for SRV4 Packages link to patches</li>
<li>Modified the structure of patch level to link SRV4 packages</li>
<li>Added user setting for API access</li>
<li>Added function to API to allow server registration and adding a patch level</li>
<li>Added patch/security report based on patch level and PCA execution</li>
<li>Added mail report for patch/security based on a patch level and patchdiag.xref automatic selection</li>
<li>We added a logo to our Wiki! (thanks to <a href="http://www.opencsw.org/maintainers/dam/">Dagobert Michelsen</a> for the logo ;-)</li>
</ul>
<p>Full listing of changes made can be found <a href="http://wesunsolve.net/changelog">here</a></p>
<h3>Patch level report (Using PCA)</h3>
<p>PCA has been integrated into WeSunSolve so you can generate patch report on any server registered into your account where at least one patch level is defined.<br />
The report which is created by WeSunSolve is based on the information you are entering when adding a server's patch level: <em>showrev-p.out</em> and <em>pkginfo-l.out</em>.<br />
Theses two files are generated while running the <em>Explorer</em> or simply gathered by hand with the two corresponding commands. (respectively: <em>/usr/bin/showrev -p</em> and <em>/usr/bin/pkginfo -l</em>).</p>
<p>You can see there a <a href="http://wesunsolve.net/static/report.html">full example</a> of such generated report.<br />
To generate a report like this, you must <em>Add a server</em> and an associated <em>patch level</em>, you can achieve this by following steps <a href="http://wiki.wesunsolve.net/ServerManagement">pointed in the documentation</a>.</p>
<p>Please, give us feedback if you feel something is missing inside this report!
</p>
<h3>Mail reports</h3>
<p>You can also get the previous report being sent to you by mail regularly, everything can be configured to fit your needs... You can:</p>
<ul>
<li>Choose the server and the patch level on which the report will be generated;</li>
<li>Choose the interval between two reports being sent to you: every day, every week, every month ?</li>
<li>You can decide which patchdiag.xref delay you want to have, this is the best if you always want to have a delay between what's out and what you will actually install.</li>
</ul>
<p>This way, you can get a report of what patches are to be installed on your server based on an up-to-date baseline every day...</p>
<p>To create a report, simply follow the steps at our <a href="http://wiki.wesunsolve.net/MailReports">documentation</a>.</p>
<h3>API Access</h3>
<p>As of now, you can enable the API access inside your panel and take advantage of the <a href="http://wiki.wesunsolve.net/API">function</a> we have recently implemented, like:
</p>
<ul>
<li>Add a server easily;</li>
<li>Upload a patch level directly from command line;</li>
</ul>
We plan to add more feature to the API very soon...
<h3>Least known features: Window size</h3>
<p>If you are browsing WeSunSolve regularly, you can greatly enhance your browsing by fitting the size of the website to your resolution. <br />
We've implemented three size of screen:
</p>
<ul>
<li>960px</li>
<li>1200px</li>
<li>1600px</li>
</ul>
By default, the website is rendering in <strong>960px</strong>, which is fine to cope with most of our visitors but certainly not the best one if you have a 22" screen ;-)<br />
See our documentation to know how to <a href="http://wiki.wesunsolve.net/SettingsManagement">change your settings</a>.
<h3>Like it? Spread it!</h3>
<p>Please, if you do like WeSunSolve, spread it over your fellow sysadmin! Write a blog post 'bout it and send it over to get a backlink :-)<br />
<br />
You found a cool way of doing something with WeSunSolve that spared you hours of work? Please, tell us how! Don't hesitate to write a Howto on our <a href="http://wiki.wesunsolve.net">wiki</a>...<br />
<br />
Finally, if you want to thank me personally, you can simply connect through <a href="http://be.linkedin.com/in/thomasgouverneur">LinkedIN</a> and let a little recommendation on the <em>WeSunSolve</em> job...</p>]]></content:encoded>
			<wfw:commentRss>http://wildness.espix.org/index.php?feed/atom/comments/51</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Speeding up Vagrant with parallel provisioning</title>
		<link>http://joemiller.me/2012/04/26/speeding-up-vagrant-with-parallel-provisioning/</link>
		<comments>http://joemiller.me/2012/04/26/speeding-up-vagrant-with-parallel-provisioning/#comments</comments>
		<pubDate>Thu, 26 Apr 2012 15:15:40 +0000</pubDate>
		<dc:creator>jmiller</dc:creator>
				<category><![CDATA[/testing]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[sensu]]></category>
		<category><![CDATA[vagrant]]></category>

		<guid isPermaLink="false">http://joemiller.me/?p=541</guid>
		<description><![CDATA[Vagrant is an amazing tool. It&#039;s quite substantially changed my workflows in a variety of areas. It&#039;s a particularly interesting tool for building packages or running tests across multiple OS&#039;s or distributions from a single set of scripts. A recent example of the usefulness of Vagrant is the new packaging and testing work undertaken in [...]]]></description>
			<content:encoded><![CDATA[<p>Vagrant is an amazing tool. It&#39;s quite substantially changed my workflows in a variety of areas. It&#39;s a particularly interesting tool for building packages or running tests across multiple OS&#39;s or distributions from a single set of scripts.</p>
<p>A recent example of the usefulness of Vagrant is the new packaging and testing work undertaken in the <a href="https://github.com/sensu/sensu">Sensu</a> project. The project set out to build a new set of native OS packages with a goal of making Sensu easy to deploy on a variety of platforms and without a lot of the friction that sometimes accompanies Ruby apps. As part of the packaging effort we needed a simple mechanism to build native packages on the relevant platforms, ie: .deb&#39;s on debian and .rpm on redhat/centos.</p>
<p>We ended up using a combination of Vagrant and some homegrown tools such as <a href="https://github.com/joemiller/bunchr">Bunchr</a>.</p>
<p>You can see the work in these 2 repos:</p>
<ul>
<li><a href="http://github.com/sensu/sensu-build">http://github.com/sensu/sensu-build</a></li>
<li><a href="http://github.com/joemiller/sensu-tests">http://github.com/joemiller/sensu-tests</a></li>
</ul>
<p>Both codebases contain a <code>para-vagrant.sh</code> script that is used in place of the normal <code>vagrant up</code> to kick off parallel provisioning tasks. <code>sensu-tests</code> is the more interesting example as it runs a set of rspec tests against Sensu across <em>14</em> VM&#39;s and this will likely grow to encompass other OS&#39;s in the future. The tests are executed as Vagrant provisioners (a combo of Chef and shell to call rspec).</p>
<p>The simplest way to use multi-VM&#39;s with Vagrant is the typical <code>vagrant up</code>. However, this will boot and run the provisioning tasks sequentially on each VM. With 14 VM&#39;s to test, this process can take a long time.</p>
<p>Can we speed this up? Yes. In fact we were able to reduce the time taken to run the <code>sensu-build</code> tasks from about 33 minutes to 12 minutes, and reduced <code>sensu-tasks</code> from almost 90 minutes to 15! </p>
<p>Here was the first attempt at a parallelization script:</p>
<p><span id="more-541"></span></p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #666666; font-style: italic;">#!/bin/sh</span>
&nbsp;
<span style="color: #666666; font-style: italic;"># concurrency is hard, let's have a beer</span>
&nbsp;
<span style="color: #007800;">MAX_PROCS</span>=<span style="color: #000000;">4</span>
&nbsp;
parallel_provision<span style="color: #7a0874; font-weight: bold;">&#40;</span><span style="color: #7a0874; font-weight: bold;">&#41;</span> <span style="color: #7a0874; font-weight: bold;">&#123;</span>
    <span style="color: #000000; font-weight: bold;">while</span> <span style="color: #c20cb9; font-weight: bold;">read</span> box; <span style="color: #000000; font-weight: bold;">do</span>
        <span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #ff0000;">&quot;Provisioning '<span style="color: #007800;">$box</span>'. Output will be in: <span style="color: #007800;">$box</span>.out.txt&quot;</span> <span style="color: #000000;">1</span><span style="color: #000000; font-weight: bold;">&gt;&amp;</span><span style="color: #000000;">2</span>
        <span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #007800;">$box</span>
    <span style="color: #000000; font-weight: bold;">done</span> <span style="color: #000000; font-weight: bold;">|</span> <span style="color: #c20cb9; font-weight: bold;">xargs</span> <span style="color: #660033;">-P</span> <span style="color: #007800;">$MAX_PROCS</span> <span style="color: #660033;">-I</span><span style="color: #ff0000;">&quot;BOXNAME&quot;</span> \
        <span style="color: #c20cb9; font-weight: bold;">sh</span> <span style="color: #660033;">-c</span> <span style="color: #ff0000;">'vagrant provision BOXNAME &gt;BOXNAME.out.txt 2&gt;&amp;1 || echo &quot;Error Occurred: BOXNAME&quot;'</span>
<span style="color: #7a0874; font-weight: bold;">&#125;</span>
&nbsp;
<span style="color: #666666; font-style: italic;">## -- main -- ##</span>
&nbsp;
<span style="color: #666666; font-style: italic;"># start boxes sequentially to avoid vbox explosions</span>
vagrant up <span style="color: #660033;">--no-provision</span>
&nbsp;
<span style="color: #666666; font-style: italic;"># but run provision tasks in parallel</span>
<span style="color: #c20cb9; font-weight: bold;">cat</span> <span style="color: #000000; font-weight: bold;">&lt;&lt;</span>EOF <span style="color: #000000; font-weight: bold;">|</span> parallel_provision
centos_5_64
centos_5_32
ubuntu_1004_32
ubuntu_1004_64
EOF</pre></div></div>

<p>There are 2 steps to the process:</p>
<ul>
<li>
<p>Sequentially boot each VM listed in the Vagrantfile, but without running provisioners (<code>vagrant up --no-provision</code>). The reason we do the bootups sequentially is to avoid potential kernel panics that VirtualBox is prone to do, at least on OSX.</p>
</li>
<li>
<p>Feed a list of VM&#39;s into <code>xargs</code> to execute $MAX_PROCS <code>vagrant provision $BOXNAME</code> processes in parallel. <code>xargs</code> will manage the concurrency for us.</p>
</li>
</ul>
<p>The final script we used with the sensu-tests repo is a little different than the above example, which can be viewed here: <a href="https://github.com/joemiller/sensu-tests/blob/master/para-vagrant.sh">para-vagrant.sh</a>. This script reduced the time it takes to run the full test suite from over 90 minutes to 15 minutes. The differences in this final version of the script:</p>
<ul>
<li>
<p>uses GNU parallel instead of xargs for better handling/grouping of the output from the <code>vagrant provision</code> processes.</p>
</li>
<li>
<p>reads the list of VM&#39;s from a JSON file (the Vagrantfile also uses this JSON file). To add/remove new VM&#39;s, you only need to edit one file now.</p>
</li>
</ul>
<h3>Future?</h3>
<p>It should be possible to make the process go even faster by parallelizing the bootup phase, but I have not tried this yet because I&#39;m worried about VirtualBox stability. </p>
<p>Also, I&#39;m sure there&#39;s a more polished script/utility that can be written to parallelize any multi-VM Vagrantfile.</p>
<h3>Alternatives?</h3>
<p>As <a href="https://twitter.com/vvuksan">@vvuksan</a> correctly points out, doing such short tasks with Vagrant is probably always going to be a little slow due to the overhead in spinning up VM&#39;s, so a possible alternative maybe LXC. There&#39;s already a Vagrant-like tool for LXC called <a href="https://github.com/exceedhl/toft">toft</a>. LXC should work fine for workflows that include only various Linux distributions, but won&#39;t help if you need to test other OS&#39;s like FreeBSD or Solaris.</p>
]]></content:encoded>
			<wfw:commentRss>http://joemiller.me/2012/04/26/speeding-up-vagrant-with-parallel-provisioning/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Logstash Debuntu Packaging and Deployment</title>
		<link>http://blog.thesilentpenguin.com/blog/2012/04/16/logstash-debuntu-packaging-and-deployment/</link>
		<comments>http://blog.thesilentpenguin.com/blog/2012/04/16/logstash-debuntu-packaging-and-deployment/#comments</comments>
		<pubDate>Mon, 16 Apr 2012 18:51:00 +0000</pubDate>
		<dc:creator>The Silent Penguin LLC</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://blog.thesilentpenguin.com/blog/2012/04/16/logstash-debuntu-packaging-and-deployment</guid>
		<description><![CDATA[Logstash is a really nifty log shipping, indexing, and searching suite. The
typical centralized setup involves running a shipper agent on all your nodes,
which are configured to ship certain log messages to a message broker. An
indexing agent consumes ...]]></description>
			<content:encoded><![CDATA[<p>Logstash is a really nifty log shipping, indexing, and searching suite. The
typical centralized setup involves running a shipper agent on all your nodes,
which are configured to ship certain log messages to a message broker. An
indexing agent consumes the log messages from the broker, and writes them to
elasticsearch. Logstash comes with a light web interface for searching this
data.</p>

<!-- more -->


<p>Unfortunately, I couldn&#8217;t find any current packaging for logstash. However,
the writer of Logstash (Jordan Sissel, aka whack) writes another utility
called FPM (F&#8217;n Package Management) which allows you to easily create OS
packages from a directory structure. So I forked the elasticsearch init
script which is included with elasticsearch&#8217;s deb package, making one init
script for each of the three moving parts in Logstash.</p>

<p>I put the default configs and /etc/default/logstash-{web,shipper,indexer} in
a directory, and a couple of pre and post install scripts. Then, I downloaded
the latest stable logstash all in one jar. I named this jar logstash.jar and
put it in logstash_packaging/usr/share/logstash/.</p>

<p>I then used fpm to build a package 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'>fpm -n logstash -v 1.1.0.1yoursite1 -d grok -d default-jre -a all -C logstash_packaging/ -m "The Systems Group systems@yoursite.com" -t deb -s dir --pre-install ./logstash.preinstall --post-install ./logstash.postinstall --description "Logstash Open Source Log Management" --url 'http://www.logstash.net/'</span></code></pre></td></tr></table></div></figure>


<p>Remember if you need to re-package, only bump the number after your sitename.</p>

<p>You can find the packaging files here: <a href="https://github.com/thesilentpenguin/logstash-packaging">GitHub</a>.</p>

<p>Now onto the actual deployment. As usual, I use Puppet for this. Basically I
have a parameterized class that you feed a &#8216;role&#8217; to. This is an array of
which logstash agents you&#8217;ll be running. Depending on this role, certain
services are enabled and started up, and their configs served out.</p>

<p>That code can be found here: <a href="https://github.com/thesilentpenguin/puppet-logstash">GitHub</a>.</p>

<p>A couple of small caveats. I put in an elasticsearch parameter, which should
work. Just be wary that if you use an external elasticsearch server, you must
use the version your logstash jar is compiled against. This is because the
REST API was not fast enough, so Jordan had to use the Java messaging.</p>

<p>Also, be wary that elasticsearch <em>discovery</em> is done using multicast. So if
you are firewalling, you may notice that changing your default policy to
ACCEPT during startup of logstash alleviates the issue, which will probably
manifest in you seeing the indexer see messages, but nothing appearing in
elastisearch.</p>
]]></content:encoded>
			<wfw:commentRss>http://infra-talk.org/2012/04/16/logstash-debuntu-packaging-and-deployment/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>SSH connection to Solaris 11 is sometimes slow&#8230;</title>
		<link>http://wildness.espix.org/index.php?post/2012/04/12/SSH-connection-to-Solaris-11-is-sometimes-slow...</link>
		<comments>http://wildness.espix.org/index.php?post/2012/04/12/SSH-connection-to-Solaris-11-is-sometimes-slow...#comments</comments>
		<pubDate>Thu, 12 Apr 2012 12:21:00 +0000</pubDate>
		<dc:creator>wildcat</dc:creator>
				<category><![CDATA[SSH2_MSG_KEXINIT]]></category>
		<category><![CDATA[cryptoadm]]></category>
		<category><![CDATA[login]]></category>
		<category><![CDATA[pkcs11]]></category>
		<category><![CDATA[problem]]></category>
		<category><![CDATA[solaris]]></category>
		<category><![CDATA[ssh]]></category>
		<category><![CDATA[tpm]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[    Today at work, we migrated the first box to Solaris 11 and we experienced the first bug as soon as we needed to log in onto the server.


As theses delays are quite common when the SSHd is configured by default, I quickly added theses lines to remo...]]></description>
			<content:encoded><![CDATA[    <p>Today at work, we migrated the first box to Solaris 11 and we experienced the first bug as soon as we needed to log in onto the server.</p>


<p>As theses delays are quite common when the SSHd is configured by default, I quickly added theses lines to remove GSSAPI and DNS common issues:</p>


<h3>/etc/ssh/sshd_config</h3>


<pre>LookupClientHostnames no
VerifyReverseMapping no
GSSAPIAuthentication no</pre>


<p>Although, theses settings didn't fixed the problem.</p>


<p>I added some verbosity to both ssh client and server and tracked down the delay to happen at this stage of the connection:</p>



<h3>On the client:</h3>


<pre>$ ssh -v -p 2222 s11box -l adminifm
 OpenSSH_5.8p1-hpn13v10lpk, OpenSSL 1.0.0c 2 Dec 2010
debug1: Reading configuration data /home/wildcat/.ssh/config
debug1: Reading configuration data /etc/ssh/ssh_config
debug1: Connecting to admblockum04 <a href="http://wildness.espix.org/index.php?post/2012/04/12/10.2.12.155" title="10.2.12.155">10.2.12.155</a> port 2222.
debug1: Connection established.
debug1: identity file /home/wildcat/.ssh/id_rsa type -1
debug1: identity file /home/wildcat/.ssh/id_rsa-cert type -1
debug1: identity file /home/wildcat/.ssh/id_dsa type 2
debug1: identity file /home/wildcat/.ssh/id_dsa-cert type -1
debug1: identity file /home/wildcat/.ssh/id_ecdsa type -1
debug1: identity file /home/wildcat/.ssh/id_ecdsa-cert type -1
debug1: Remote protocol version 2.0, remote software version Sun_SSH_2.0
debug1: no match: Sun_SSH_2.0
debug1: Enabling compatibility mode for protocol 2.0
debug1: Local version string SSH-2.0-OpenSSH_5.8p1-hpn13v10lpk
debug1: SSH2_MSG_KEXINIT sent
*** HANG ***</pre>



<h3>And on the server:</h3>


<pre> debug1: Reloading X.509 host keys to avoid PKCS#11 fork issues.monitor debug1: reading the context from the   child
 debug1: use_engine is 'no'
 
 debug1: list_hostkey_types: ssh-rsa,ssh-dss
 debug1: My KEX proposal before adding the GSS KEX algorithm:
 debug2: kex_parse_kexinit: diffie-hellman-group-exchange-sha1,diffie-hellman-group14-sha1,diffie-hellman-  group1-sha1
 debug2: kex_parse_kexinit: ssh-rsa,ssh-dss
 debug2: kex_parse_kexinit: aes128-ctr,aes192-ctr,aes256-ctr,arcfour128,arcfour256,arcfour
 debug2: kex_parse_kexinit: aes128-ctr,aes192-ctr,aes256-ctr,arcfour128,arcfour256,arcfour
 debug2: kex_parse_kexinit: hmac-md5,hmac-sha1,hmac-sha1-96,hmac-md5-96
 debug2: kex_parse_kexinit: hmac-md5,hmac-sha1,hmac-sha1-96,hmac-md5-96
 debug2: kex_parse_kexinit: none,zlib
 debug2: kex_parse_kexinit: none,zlib
 debug2: kex_parse_kexinit: de-DE,en-US,es-ES,fr-FR,it-IT,ja-JP,ko-KR,pt-BR,zh-CN,zh-TW,i-default
 debug2: kex_parse_kexinit: de-DE,en-US,es-ES,fr-FR,it-IT,ja-JP,ko-KR,pt-BR,zh-CN,zh-TW,i-default
 debug2: kex_parse_kexinit: first_kex_follows 0 
 debug2: kex_parse_kexinit: reserved 0 
 *** HANG ***</pre>


<p>Adding truss of the server process is helping us a lot:</p>


<pre>  17477:  so_socket(PF_INET, SOCK_STREAM, IPPROTO_IP, 0, SOV_DEFAULT) = 3
  17469:  pollsys(0x080451C0, 1, 0x00000000, 0x00000000) (sleeping...)
  17477:  connect(3, 0x08047030, 16, SOV_DEFAULT) (sleeping...)</pre>


<p>The lock is happening just after the connect() syscall. We can now check the pfiles of this process together with a netstat to identify which connection is causing trouble to be established:</p>


<pre>  root@admblockum04:/local/home/ucc# pfiles 16585
  16585:  /usr/lib/ssh/sshd -f /etc/ssh/sshd_config -p 2222 -ddd -D
  Current rlimit: 256 file descriptor
    0: S_IFCHR mode:0620 dev:532,0 ino:3502445063 uid:60004 gid:7 rdev:221,8
      O_RDWR|O_NOCTTY|O_LARGEFILE
     /dev/pts/8
      offset:43267
   1: S_IFCHR mode:0620 dev:532,0 ino:3502445063 uid:60004 gid:7 rdev:221,8
      O_RDWR|O_NOCTTY|O_LARGEFILE
      /dev/pts/8
      offset:43267
   2: S_IFCHR mode:0620 dev:532,0 ino:3502445063 uid:60004 gid:7 rdev:221,8
      O_RDWR|O_NOCTTY|O_LARGEFILE
      /dev/pts/8
      offset:43267
   3: S_IFSOCK mode:0666 dev:540,0 ino:34566 uid:0 gid:0 size:0
      O_RDWR
        SOCK_STREAM
        SO_SNDBUF(49152),SO_RCVBUF(131072)
        sockname: AF_INET 127.0.0.1  port: 55867
        congestion control: newreno
   4: S_IFSOCK mode:0666 dev:540,0 ino:5714 uid:0 gid:0 size:0
      O_RDWR|O_NONBLOCK
        SOCK_STREAM
        SO_REUSEADDR,SO_KEEPALIVE,SO_SNDBUF(49152),SO_RCVBUF(128872)
        sockname: AF_INET6 ::ffff:10.2.12.155  port: 2222
        peername: AF_INET6 ::ffff:10.2.60.1  port: 43575
        congestion control: newreno
   5: S_IFIFO mode:0000 dev:529,0 ino:70783 uid:0 gid:0 size:0
     O_RDWR
    6: S_IFIFO mode:0000 dev:529,0 ino:70783 uid:0 gid:0 size:0
      O_RDWR
   8: S_IFIFO mode:0000 dev:529,0 ino:70784 uid:0 gid:0 size:0
      O_RDWR FD_CLOEXEC</pre>


<pre> # netstat -an|grep 55867
 127.0.0.1.55867      127.0.0.1.30003          0      0 131072      0 SYN_SENT</pre>


<p>The port 30003 is the default port of tcsd daemon, which is managing physical cryptography (through /dev/tpm).
If there is no hardware crypto devices, this daemon is disabled.
It seems though that cryptoadm is linking tpm crypto mechanism by default, enabling ssh to trying to access this daemon.</p>


<h3>Workaround found (just to confirm slowliness is caused by tcsd):</h3>


<p>Run this command on the server:</p>


<pre> # nc -e 'cat /dev/null' localhost 30003</pre>


<p>and try to ssh the box, it should be fast.</p>


<h3>Permanent workaround:</h3>


<p>Simply remove the pcks11_tpm provider from the crypto framework:</p>

<pre>cryptoadm disable provider=/usr/lib/security/\$ISA/pkcs11_tpm.so mechanism=all
cryptoadm uninstall provider=/usr/lib/security/\$ISA/pkcs11_tpm.so</pre>


<h3>Other references:</h3>

<ul>
<li><a href="https://www.illumos.org/issues/1983" hreflang="en">Illumos Issue 1983</a></li>
<li><a href="http://java.net/jira/browse/GLASSFISH-15537" hreflang="en">Glassfish issue 1553</a></li>
</ul>]]></content:encoded>
			<wfw:commentRss>http://wildness.espix.org/index.php?feed/atom/comments/50</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

