<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet type="text/css" href="http://morison.biz/technotes/feeds/rss.css" ?>
<rss version="2.0" 
	xmlns:content="http://purl.org/rss/1.0/modules/content/" 
	xmlns:dc="http://purl.org/dc/elements/1.1/" 
	xmlns:icbm="http://postneo.com/icbm/" 
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/" 
	xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" 
	xmlns:wfw="http://wellformedweb.org/CommentAPI/" >

<channel>
	<title>Rod Morison Software</title>
	<link>http://morison.biz/</link>
	<description>Software how-tos, ideas, opinion and discussion on desktop, server, and web application development

&lt;form action=&quot;http://morison.biz/technotes/search.php&quot; method=&quot;GET&quot;&gt;&lt;input type=&quot;text&quot; name=&quot;search&quot; size=&quot;10&quot; maxlength=&quot;128&quot; /&gt;»&lt;/form&gt;</description>
	<language>en</language>
	<copyright>2006-2008, Rod Morison Software</copyright>
	<managingEditor>technotes@morison.biz</managingEditor>
	<webMaster>technotes@morison.biz</webMaster>
	<lastBuildDate>Sat, 04 Feb 2012 23:22:26 GMT</lastBuildDate>
	<generator>Yet Another Community System</generator>
	<docs>http://blogs.law.harvard.edu/tech/rss</docs>
	<ttl>70</ttl>

	<item>
		<title>I'm looking for a python/django developer. Please contact me. Phone is 310-592-1672.</title>
		<link>http://morison.biz/technotes/articles/72</link>
		<guid isPermaLink="true">http://morison.biz/technotes/articles/72</guid>
		<dc:creator>Elliott Yousefzadeh</dc:creator>
		<category>Queries</category>
		<pubDate>Sun, 10 Apr 2011 12:20:56 GMT</pubDate>
		<comments>http://morison.biz/technotes/articles/72#comments</comments>
		<slash:comments>0</slash:comments>
		<wfw:comment>http://morison.biz/technotes/comments/post.php/article/72</wfw:comment>
		<wfw:commentRss>http://morison.biz/technotes/comments/feed.php/article/72</wfw:commentRss>
		<trackback:ping>http://morison.biz/technotes/links/trackback.php?anchor=article:72</trackback:ping>
	</item>

	<item>
		<title>Introducing Cones</title>
		<link>http://morison.biz/technotes/articles/71</link>
		<guid isPermaLink="true">http://morison.biz/technotes/articles/71</guid>
		<description>It's not pylons, it's cones! Seriously, a &quot;pylons-lite&quot; webapp framework with facebook app utilities, presently targetted for GAE. See http://bitbucket.org/rmorison/cones/src/tip/README for install info. Check out the FAQ on the wiki: http://bitbucket.org/rmorison/cones/wiki/Home. Or, check out the running test app at http://apps.facebook.com/tfivesandbox/</description>
		<body xmlns="http://www.w3.org/1999/xhtml"><div class="introduction">It's not pylons, it's cones! Seriously, a "pylons-lite" webapp framework with facebook app utilities, presently targetted for GAE. See <a href="http://bitbucket.org/rmorison/cones/src/tip/README" title="Browse in a new window" class="external" onclick="window.open(this.href); return false;" onkeypress="window.open(this.href); return false;">http://bitbucket.org/rmorison/cones/src/tip/README</a> for install info. Check out the FAQ on the wiki: <a href="http://bitbucket.org/rmorison/cones/wiki/Home." title="Browse in a new window" class="external" onclick="window.open(this.href); return false;" onkeypress="window.open(this.href); return false;">http://bitbucket.org/rmorison/cones/wiki/Home.</a> Or, check out the running test app at <a href="http://apps.facebook.com/tfivesandbox/" title="Browse in a new window" class="external" onclick="window.open(this.href); return false;" onkeypress="window.open(this.href); return false;">http://apps.facebook.com/tfivesandbox/</a></div>
Cones is a python web stack, borrowing design and tools from <a href="http://pylonshq.com" title="Browse in a new window" class="external" onclick="window.open(this.href); return false;" onkeypress="window.open(this.href); return false;">pylons</a>, 
but lighter and simpler. The current target is Google App Engine. The project was inspired by
a Facebook app implemented on Google app engine. The Facebook support attempts to provide
automatic and consistent <a href="http://developers.facebook.com/docs/authentication/" title="Browse in a new window" class="external" onclick="window.open(this.href); return false;" onkeypress="window.open(this.href); return false;">OAuth</a> access
tokens somewhat transparently to webapp controllers.<br />
<br />
In addition, some pylons-ish features are provided, including <a href="http://www.makotemplates.org/" title="Browse in a new window" class="external" onclick="window.open(this.href); return false;" onkeypress="window.open(this.href); return false;">Mako</a>,
<a href="http://formencode.org/" title="Browse in a new window" class="external" onclick="window.open(this.href); return false;" onkeypress="window.open(this.href); return false;">FormEncode</a> and <a href="http://webhelpers.groovie.org/" title="Browse in a new window" class="external" onclick="window.open(this.href); return false;" onkeypress="window.open(this.href); return false;">WebHelpers</a>. 
<a href="http://beaker.groovie.org/" title="Browse in a new window" class="external" onclick="window.open(this.href); return false;" onkeypress="window.open(this.href); return false;">Beaker</a> is not presently supported, rather the more native/efficient 
<a href="https://github.com/dound/gae-sessions" title="Browse in a new window" class="external" onclick="window.open(this.href); return false;" onkeypress="window.open(this.href); return false;">gae-sessions</a> is implemented.<br />
<br />
At this time the initial code is in active development. The 0.5 label is really 0.5exp.
No version tags or <a href="http://pypi.python.org/pypi" title="Browse in a new window" class="external" onclick="window.open(this.href); return false;" onkeypress="window.open(this.href); return false;">pypi</a> have been created. An official release will
wait for external feedback and some clarity whether this needs to be a release managed project.</body>
		<dc:creator>rod</dc:creator>
		<category>Python</category>
		<pubDate>Tue, 09 Nov 2010 14:03:35 GMT</pubDate>
		<comments>http://morison.biz/technotes/articles/71#comments</comments>
		<slash:comments>0</slash:comments>
		<wfw:comment>http://morison.biz/technotes/comments/post.php/article/71</wfw:comment>
		<wfw:commentRss>http://morison.biz/technotes/comments/feed.php/article/71</wfw:commentRss>
		<trackback:ping>http://morison.biz/technotes/links/trackback.php?anchor=article:71</trackback:ping>
	</item>

	<item>
		<title>Won't get hacked again?</title>
		<link>http://morison.biz/technotes/articles/70</link>
		<guid isPermaLink="true">http://morison.biz/technotes/articles/70</guid>
		<description>See http://news.bbc.co.uk/2/hi/technology/8550219.stm</description>
		<body xmlns="http://www.w3.org/1999/xhtml"><div class="introduction">See <a href="http://news.bbc.co.uk/2/hi/technology/8550219.stm" title="Browse in a new window" class="external" onclick="window.open(this.href); return false;" onkeypress="window.open(this.href); return false;">http://news.bbc.co.uk/2/hi/technology/8550219.stm</a></div>
UPDATE: <br />
<br />
<pre>RedirectMatch 301 ^/technotes/users/edit.* /technotes/articles/69</pre><br />
<br />
is keeping the rats at bay for now.</body>
		<dc:creator>rod</dc:creator>
		<category>//</category>
		<pubDate>Thu, 11 Mar 2010 06:34:47 GMT</pubDate>
		<comments>http://morison.biz/technotes/articles/70#comments</comments>
		<slash:comments>0</slash:comments>
		<wfw:comment>http://morison.biz/technotes/comments/post.php/article/70</wfw:comment>
		<wfw:commentRss>http://morison.biz/technotes/comments/feed.php/article/70</wfw:commentRss>
		<trackback:ping>http://morison.biz/technotes/links/trackback.php?anchor=article:70</trackback:ping>
	</item>

	<item>
		<title>Sorry...</title>
		<link>http://morison.biz/technotes/articles/69</link>
		<guid isPermaLink="true">http://morison.biz/technotes/articles/69</guid>
		<description>...Due to hacking as described in http://news.bbc.co.uk/2/hi/technology/8550219.stm</description>
		<body xmlns="http://www.w3.org/1999/xhtml"><div class="introduction">...Due to hacking as described in <a href="http://news.bbc.co.uk/2/hi/technology/8550219.stm" title="Browse in a new window" class="external" onclick="window.open(this.href); return false;" onkeypress="window.open(this.href); return false;">http://news.bbc.co.uk/2/hi/technology/8550219.stm</a></div>
this url has been blocked.</body>
		<dc:creator>rod</dc:creator>
		<category>Misc</category>
		<pubDate>Mon, 08 Mar 2010 08:34:50 GMT</pubDate>
		<comments>http://morison.biz/technotes/articles/69#comments</comments>
		<slash:comments>0</slash:comments>
		<wfw:comment>http://morison.biz/technotes/comments/post.php/article/69</wfw:comment>
		<wfw:commentRss>http://morison.biz/technotes/comments/feed.php/article/69</wfw:commentRss>
		<trackback:ping>http://morison.biz/technotes/links/trackback.php?anchor=article:69</trackback:ping>
	</item>

	<item>
		<title>Hacked!</title>
		<link>http://morison.biz/technotes/articles/68</link>
		<guid isPermaLink="true">http://morison.biz/technotes/articles/68</guid>
		<description>See http://news.bbc.co.uk/2/hi/technology/8550219.stm</description>
		<body xmlns="http://www.w3.org/1999/xhtml"><div class="introduction">See <a href="http://news.bbc.co.uk/2/hi/technology/8550219.stm" title="Browse in a new window" class="external" onclick="window.open(this.href); return false;" onkeypress="window.open(this.href); return false;">http://news.bbc.co.uk/2/hi/technology/8550219.stm</a></div>
I've been nursing the yacs PHP based site *far* too long. Time to move it to some newer-tech, and definitely not PHP.<br />
<br />
Only question is what to do with all this old content and urls?</body>
		<dc:creator>rod</dc:creator>
		<category>//</category>
		<pubDate>Mon, 08 Mar 2010 07:24:44 GMT</pubDate>
		<comments>http://morison.biz/technotes/articles/68#comments</comments>
		<slash:comments>0</slash:comments>
		<wfw:comment>http://morison.biz/technotes/comments/post.php/article/68</wfw:comment>
		<wfw:commentRss>http://morison.biz/technotes/comments/feed.php/article/68</wfw:commentRss>
		<trackback:ping>http://morison.biz/technotes/links/trackback.php?anchor=article:68</trackback:ping>
	</item>

	<item>
		<title>Job inquiry, opening for Solutions Architect in Burbank</title>
		<link>http://morison.biz/technotes/articles/67</link>
		<guid isPermaLink="true">http://morison.biz/technotes/articles/67</guid>
		<description>I would like to see if are interested in a Solutions Architect job opening with Rovi in our Burbank location.  Please let me know if your interested, or feel free to forward this to others who might be.  Thanks!



Summary:



The Solutions Architect will be responsible for architecting and designing comprehensive solutions that meet with our customers’ requirements for Rovi’s Passport Interactive Programming Guide (IPG).  Working side-by-side with prospective and existing customers, the Solutions Architect plays a key role in the successful selection, purchase, installation and maintenance of IPG solutions.  In addition to demonstrated strengths in systems assessment ... more  </description>
		<body xmlns="http://www.w3.org/1999/xhtml">I would like to see if are interested in a Solutions Architect job opening with Rovi in our Burbank location.  Please let me know if your interested, or feel free to forward this to others who might be.  Thanks!<br />
<br />
Summary:<br />
<br />
The Solutions Architect will be responsible for architecting and designing comprehensive solutions that meet with our customers’ requirements for Rovi’s Passport Interactive Programming Guide (IPG).  Working side-by-side with prospective and existing customers, the Solutions Architect plays a key role in the successful selection, purchase, installation and maintenance of IPG solutions.  In addition to demonstrated strengths in systems assessment and design, the Solutions Architect must also possess strong interpersonal skills and be able to relate to a wide range of technical and business individuals, including managers and executives within customer environments.
 
 
Responsibilities:<br />
<br />
•	Develop and present IPG solution architectures internally and to customers and partners 
•	Perform impact and system analyses based on customer requirements.
•	Support proposal development.
•	Support the development of test architectures and technology validation strategies.
•	Develop consensus and working relationships with technical teams from other external and internal cross-functional teams to ensure coordination and scalability.
•	Collaborate with other technical teams in the exchange and transfer of technical knowledge and in the development and evolution of architecture standards, guidelines, reference architecture, and the Passport Product Roadmap. 
•	Build and deliver technical and business blueprints that map to customers’ business goals and requirements.
•	Partner across internal and external functional teams to gather facts, develop and deliver cohesive solutions that meet customer requirements.
•	Other relevant duties as assigned.<br />
<br />
Qualifications &amp; Experience:<br />
<br />
•	MUST have experience with digital video systems including architectures and equipment such as digital video set top boxes, head-ends, conditional access (security) and digital video servers.  
•	Must have experience with  Motorola and Cisco headends
•	10+ years of progressive technical and leadership experience in network engineering and design roles in the service provider or systems operator space.
•	Demonstrated knowledge of object oriented analysis and design.
•	Demonstrated knowledge of and experience with systems integration methods and technologies. 
•	Demonstrated experience in performing complex analysis, consulting and providing recommendations to customers. 
•	Demonstrated knowledge of and experience with best practices of quality management.
•	8+ years software development experience in a Unix-based environment
•	Expertise in C/C++ object oriented multithreading
•	Experience developing, analyzing, and implementing complex algorithms 
•	Experience in CORBA
•	Experience in PERL
•	Experience in SUN RPC experience required
•	BS or MS degree in Computer Science or related field,  or an equivalent combination of education, training, and work experience
 
Personal:<br />
<br />
•	Able to prepare specifications and reports, deliver oral presentations, and explain complex technical concepts in simple terms.
•	Possess strong leadership skills and the ability to providing direction to cross-functional teams responsible for resolution of complex technical challenges. 
•	Good knowledge of project management concepts. 
•	Able to quickly learn, assess, adapt and respond effectively and appropriately to changing environments.
•	Enjoys the challenges encountered in selling complex technology in a competitive environment.
•	Customer focused - understands and appropriately responds to customers' business needs. 
•	Able to interface effectively and collaborate with clients, peers, and management to develop solutions and ensure stakeholder buy- in. 
•	Able to accurately analyze information and make sound decisions.  
•	Takes initiative and accountability for achieving results.
•	Strong sense of personal ethics and values.<br />
<br />
Eric Rydingsword
Employment Specialist
 
Rovi Corporation
 PH 408-764-5402 |  C 650-218-8600  |  FAX 408-567-1806 |  EMAIL <script type="text/javascript">document.write('<a href="' + 'mailto:Eric' + '.' + 'Rydingsword' + '@' + 'RoviCorp' + '.' + 'com' + '" class="email" title="Send a message">' + 'Send a message' + '</a>')</script><noscript><p>Please enable JavaScript to see this address</p></noscript>
<a href="http://www.rovicorp.com" title="Browse in a new window" class="external" onclick="window.open(this.href); return false;" onkeypress="window.open(this.href); return false;">http://www.rovicorp.com</a>
Rovi. The new name for Macrovision.</body>
		<dc:creator>Eric Rydingsword</dc:creator>
		<category>Queries</category>
		<pubDate>Fri, 05 Feb 2010 04:33:58 GMT</pubDate>
		<comments>http://morison.biz/technotes/articles/67#comments</comments>
		<slash:comments>0</slash:comments>
		<wfw:comment>http://morison.biz/technotes/comments/post.php/article/67</wfw:comment>
		<wfw:commentRss>http://morison.biz/technotes/comments/feed.php/article/67</wfw:commentRss>
		<trackback:ping>http://morison.biz/technotes/links/trackback.php?anchor=article:67</trackback:ping>
	</item>

	<item>
		<title>Boost C++ Dev Setup</title>
		<link>http://morison.biz/technotes/articles/50</link>
		<guid isPermaLink="true">http://morison.biz/technotes/articles/50</guid>
		<description>Get Python

I use boost.python, so python must be installed before building boost. No need to build from source, just get the Windows installer from http://python.org/. I'm using python 2.6 right now, haven't tried the 3.X series yet. Add C:\Python26 to your Windows PATH environment variable. (You can do it when you modify that below.)
Boost Build

The boost windows docs has all the instructions you really need to build boost. This guide only adapts that to my local dev conventions
 Get the boost source from http://sourceforge.net/projects/boost/files/
 Also, get the Windows bjam .exe, currently ... more  </description>
		<body xmlns="http://www.w3.org/1999/xhtml"><h2 id="title_3" >Get Python</h2>
I use boost.python, so python must be installed before building boost. No need to build from source, just get the Windows installer from <a href="http://python.org/." title="Browse in a new window" class="external" onclick="window.open(this.href); return false;" onkeypress="window.open(this.href); return false;">http://python.org/.</a> I'm using python 2.6 right now, haven't tried the 3.X series yet. Add C:\Python26 to your Windows PATH environment variable. (You can do it when you modify that below.)
<h2 id="title_4" >Boost Build</h2>
The <a href="http://www.boost.org/doc/libs/1_39_0/more/getting_started/windows.html" title="Browse in a new window" class="external" onclick="window.open(this.href); return false;" onkeypress="window.open(this.href); return false;">boost windows docs</a> has all the instructions you really need to build boost. This guide only adapts that to my local dev conventions
<ul><li> Get the boost source from http://sourceforge.net/projects/boost/files/
</li><li> Also, get the Windows bjam .exe, currently rev'd at: http://sourceforge.net/projects/boost/files/boost-jam/boost-jam-3.1.17-1-ntx86.zip/download
</li><li> Make your dev dirs. I use cygwin, you can easily translate to the Windows command shell. Unless you have tar, though, make sure you download the zip distro of boost. Also, I use the cygpath of "http://morison.biz/" instead of "http://morison.biz/cygdrive", i.e., I run <code>mount -s --change-cygdrive-prefix /</code>
<pre>cd "http://morison.biz/c/Documents and Settings/Rod/My Documents"<br/>mkdir -p Devel/local<br/>cd Devel/local<br/>mkdir bin lib src tmp<br/>cd src<br/>tar jxf ~/Downloads/boost_1_39_0.tar.bz2 <br/>cd ../bin<br/>unzip ~/Downloads/boost-jam-3.1.17-1-ntx86.zip <br/>mv boost-jam-3.1.17-1-ntx86/bjam.exe  .<br/>chmod +x bjam.exe<br/>rm -rf boost-jam-3.1.17-1-ntx86/</pre>
</li><li> Add the Devel/local/bin path to your Windows path variable (Control Panel->System, Advanced Tab, Environment Variables Button):<br />
<br />
<span class="inline_image"><span><img src="http://morison.biz/technotes/images/article/50/DevelLocalBinPath.png" alt="DevelLocalBinPath.png"  title=""http://morison.biz/></span></span>
</li><li> Start a Visual C++ command shell, i.e., menu to something like: <br />
<br />
<span class="inline_image"><span><img src="http://morison.biz/technotes/images/article/50/StartVisualStudioSHell.png" alt="StartVisualStudioSHell.png"  title=""http://morison.biz/></span></span>
<pre>Setting environment for using Microsoft Visual Studio 2008 x86 tools.<br/>C:/Users/rod/KlickFu/Devel/local/src/boost_1_39_0>bjam --build-dir=../../tmp/boost --prefix=../.. --toolset=msvc --threading=multi --runtime-link=static  link=static debug release install</pre>
Actually, I'm currently building with...
<pre>C:Develboost_1_43_0>bjam --build-dir=../tmp --prefix=../boost --build-type=complete runtime-link=static --without-graph --without-graph_parallel --without-mpi --without-wave msvc install</pre></li></ul></body>
		<dc:creator>rod</dc:creator>
		<category>C++</category>
		<pubDate>Mon, 31 May 2010 14:29:36 GMT</pubDate>
		<comments>http://morison.biz/technotes/articles/50#comments</comments>
		<slash:comments>0</slash:comments>
		<wfw:comment>http://morison.biz/technotes/comments/post.php/article/50</wfw:comment>
		<wfw:commentRss>http://morison.biz/technotes/comments/feed.php/article/50</wfw:commentRss>
		<trackback:ping>http://morison.biz/technotes/links/trackback.php?anchor=article:50</trackback:ping>
	</item>

	<item>
		<title>Remount a readonly disk readwrite</title>
		<link>http://morison.biz/technotes/articles/65</link>
		<guid isPermaLink="true">http://morison.biz/technotes/articles/65</guid>
		<description>Just a reminder</description>
		<body xmlns="http://www.w3.org/1999/xhtml"><div class="introduction">Just a reminder</div>
mount -o remount,rw /dev/sda1 /</body>
		<dc:creator>rod</dc:creator>
		<category>Linux</category>
		<pubDate>Thu, 10 Dec 2009 06:59:54 GMT</pubDate>
		<comments>http://morison.biz/technotes/articles/65#comments</comments>
		<slash:comments>0</slash:comments>
		<wfw:comment>http://morison.biz/technotes/comments/post.php/article/65</wfw:comment>
		<wfw:commentRss>http://morison.biz/technotes/comments/feed.php/article/65</wfw:commentRss>
		<trackback:ping>http://morison.biz/technotes/links/trackback.php?anchor=article:65</trackback:ping>
	</item>

	<item>
		<title>How To Build a Vhosted Linux Development Server on Windows using VirtualBox</title>
		<link>http://morison.biz/technotes/articles/61</link>
		<guid isPermaLink="true">http://morison.biz/technotes/articles/61</guid>
		<description>I've been doing a fair bit of PHP and Python on Linux recently. My favorite PHP editor, PhpEd is Windows only. However, I prefer to develop LAMP code on LAMP. Here's a solution: Linux on VirtualBox, networked to the host Windows OS</description>
		<body xmlns="http://www.w3.org/1999/xhtml"><div class="introduction">I've been doing a fair bit of PHP and Python on Linux recently. My favorite PHP editor, <a href="http://www.nusphere.com/" title="Browse in a new window" class="external" onclick="window.open(this.href); return false;" onkeypress="window.open(this.href); return false;">PhpEd</a> is Windows only. However, I prefer to develop LAMP code on LAMP. Here's a solution: Linux on VirtualBox, networked to the host Windows OS.</div>
</body>
		<dc:creator>rod</dc:creator>
		<category>Sysadmin</category>
		<pubDate>Sat, 13 Nov 2010 01:21:01 GMT</pubDate>
		<comments>http://morison.biz/technotes/articles/61#comments</comments>
		<slash:comments>8</slash:comments>
		<wfw:comment>http://morison.biz/technotes/comments/post.php/article/61</wfw:comment>
		<wfw:commentRss>http://morison.biz/technotes/comments/feed.php/article/61</wfw:commentRss>
		<trackback:ping>http://morison.biz/technotes/links/trackback.php?anchor=article:61</trackback:ping>
	</item>

	<item>
		<title>Better Broadband Bandwidth Utilization Using Wondershaper on a Linux Router to Limit the Uplink</title>
		<link>http://morison.biz/technotes/articles/62</link>
		<guid isPermaLink="true">http://morison.biz/technotes/articles/62</guid>
		<description>Since I did some streaming video experiments in the early years of this century I've known that maxing both directions of an internet connection kills throughput. I did some experiments, initially to improve my SIP Phone performance (when my son is playing online games, TBH) and came up with a &quot;low-hanging fruit&quot; solution</description>
		<body xmlns="http://www.w3.org/1999/xhtml"><div class="introduction">Since I did some streaming video experiments in the early years of this century I've known that maxing both directions of an internet connection kills throughput. I did some experiments, initially to improve my SIP Phone performance (when my son is playing online games, TBH) and came up with a "low-hanging fruit" solution.</div>
I'll spare the gory details, but if you study "canonical" TCP congestion algorithms and experiment on how they behave, you quickly find that maxing out both directions of a full duplex TCP pipe just kills performance all around. If you're interested in the ground up details, the best place to start is the classic work, <a href="http://www.kohala.com/start/tcpipiv1.html" title="Browse in a new window" class="external" onclick="window.open(this.href); return false;" onkeypress="window.open(this.href); return false;">TCP/IP Illustrated Vol 1</a>. Much of this book's lore was woven into early network devices (and drivers) and remains much intact, afaict. <br />
<br />
<p class="caution"><img src="http://morison.biz/technotes/skins/technotes2/icons/codes/caution.gif" width="10" height="10" alt="!!!" /> To use Wondershaper, you'll have to use a Linux computer as your router. Afaik, most basic broadband routers don't provide traffic limiting features. Setting up a Linux router for your broadband is not a good first-time Linux project. For more info, perhaps look at <a href="http://en.wikipedia.org/wiki/List_of_router_or_firewall_distributions" title="Browse in a new window" class="external" onclick="window.open(this.href); return false;" onkeypress="window.open(this.href); return false;">http://en.wikipedia.org/wiki/List_of_router_or_firewall_distributions</a> or <a href="http://www.stanford.edu/~fenn/linux/" title="Browse in a new window" class="external" onclick="window.open(this.href); return false;" onkeypress="window.open(this.href); return false;">http://www.stanford.edu/~fenn/linux/</a> . It's not terribly difficult to do with a standard <a href="http://www.ubuntu.com/products/whatIsubuntu/serveredition" title="Browse in a new window" class="external" onclick="window.open(this.href); return false;" onkeypress="window.open(this.href); return false;">Ubuntu Server</a> distro, which is what I use.</p>If you want to cut to the chase, and improve your internet connection bandwidth, here's how I finagled the problem. First, I went to my ISPs bandwidth testing site late at night, when I knew not much else was happening on my connection. This effect can be had by shutting down everything except one bandwidth testing computer and your router. Better is to take that computer straight into the internet connection, but that was way too much work for my purposes. (And, would have involved way too much time in my basement!)<br />
<br />
For me <a href="http://www.speakeasy.net" title="Browse in a new window" class="external" onclick="window.open(this.href); return false;" onkeypress="window.open(this.href); return false;">www.speakeasy.net</a> provides a nice testing service at <a href="http://www.speakeasy.net/speedtest/" title="Browse in a new window" class="external" onclick="window.open(this.href); return false;" onkeypress="window.open(this.href); return false;">http://www.speakeasy.net/speedtest/</a> . I can't say whether this will suffice for non-speakeasy users. However, after running this test several times, I settled on a 3621 kbits/sec downlink and a 630 kbits/sec uplink as a baseline.<br />
<br />
Then, use whatever traffic shaping tool you have to experiment with throughput at and below those values. The easiest, admittedly blunt knife, tool that I've found is <a href="http://lartc.org/wondershaper/" title="Browse in a new window" class="external" onclick="window.open(this.href); return false;" onkeypress="window.open(this.href); return false;">Wondershaper</a>. Wondershaper is available in Ubuntu, i.e.
<pre>sudo apt-get install wondershaper</pre>
Also, in the Ubuntu docs, you may find <a href="http://ubuntuforums.org/archive/index.php/t-25911.html" title="Browse in a new window" class="external" onclick="window.open(this.href); return false;" onkeypress="window.open(this.href); return false;">http://ubuntuforums.org/archive/index.php/t-25911.html</a> useful...I certainly did.<br />
<br />
In my case, with the 3621/630 profile, I tried Wondershaper at 3500/650, 4000/650, 4000/625 and 4000/600. To stress the connection, I tried a series of tests with 1-2 downloads and 0-2 uploads. I used <a href="http://www.eos.ncsu.edu/remoteaccess/man/scp.html" title="Browse in a new window" class="external" onclick="window.open(this.href); return false;" onkeypress="window.open(this.href); return false;">scp</a> to a hosted server of mine that can reliably max out my connection. Scp is nice because it prints out its bandwidth when it's done, or ^C'd. Yes, scp introduces some overhead, and it doesn't measure true "line" bits. The Flash based Speakeasy test uses the Flash plugin, but this isn't rocket science, right? Suffice it to say, there are far bigger holes in my methodology...but time is money, as they say, and I declared "victory" without having to be more precise.<br />
<br />
Without getting into details (you can back my inference out of the graphs below) I concluded that my connection is insensitive to downlink shaping, but terribly sensitive to uplink shaping. Without shaping, whenever an upload was going full-bore, I lost 80-90% of my download bandwidth. By throttling uplink to 90-95% of the max, I got a big chunk of that back. With the throttled uplink my downloads only lost 10-30% of their speed, quite an improvement.<br />
<br />
No time or space for the rationale, but anyone familiar with the term "TCP Round Trip ACK" can quickly imagine why. See <a href="http://en.wikipedia.org/wiki/Transmission_Control_Protocol_" title="Browse in a new window" class="external" onclick="window.open(this.href); return false;" onkeypress="window.open(this.href); return false;">Wikipedia's TCP entry</a>. Better yet, get the <a href="http://www.kohala.com/start/tcpipiv1.html" title="Browse in a new window" class="external" onclick="window.open(this.href); return false;" onkeypress="window.open(this.href); return false;">Steven's Book</a>, it's one of the best technical books every written, IMHO.<br />
<br />
So here's the pretty picture. Bandwidth on the Y axis. My 5 traffic scenarios on the X. And a differently colored line for each shaping scenario. Which would you rather have? <br />
<br />
<span class="inline_image"><span><img src="http://morison.biz/technotes/images/article/62/TrafficShapingChart.png" alt="TrafficShapingChart.png"  title=""http://morison.biz/></span></span><br />
<br />
And, even if you don't want to shape your traffic, when your teenager's Youtube upload brings everyones browsing in the house to a crawl, at least you'll know why. Which begs the question: why aren't these features built into home broadband routers or, better yet, into the TCP framework of broadband service providers!?<br />
<br />
<p class="note"><img src="http://morison.biz/technotes/skins/technotes2/icons/codes/note.gif" width="10" height="10" alt="" /> Postscript: For those interested, a good bit of research has been done on this problem, particularly under the name of <a href="http://en.wikipedia.org/wiki/FAST_TCP" title="Browse in a new window" class="external" onclick="window.open(this.href); return false;" onkeypress="window.open(this.href); return false;">FastTCP</a>. <a href="http://fastsoft.com" title="Browse in a new window" class="external" onclick="window.open(this.href); return false;" onkeypress="window.open(this.href); return false;">http://fastsoft.com</a> is commercial spinoff of that project and has some <a href="http://fastsoft.com/white-papers/" title="Browse in a new window" class="external" onclick="window.open(this.href); return false;" onkeypress="window.open(this.href); return false;">pertinent white papers</a> on the subject.</p></body>
		<dc:creator>rod</dc:creator>
		<category>Sysadmin</category>
		<pubDate>Fri, 07 Aug 2009 04:43:00 GMT</pubDate>
		<comments>http://morison.biz/technotes/articles/62#comments</comments>
		<slash:comments>0</slash:comments>
		<wfw:comment>http://morison.biz/technotes/comments/post.php/article/62</wfw:comment>
		<wfw:commentRss>http://morison.biz/technotes/comments/feed.php/article/62</wfw:commentRss>
		<trackback:ping>http://morison.biz/technotes/links/trackback.php?anchor=article:62</trackback:ping>
	</item>

	<item>
		<title>Convert a .crt Certificate to a .pem file</title>
		<link>http://morison.biz/technotes/articles/60</link>
		<guid isPermaLink="true">http://morison.biz/technotes/articles/60</guid>
		<description>Every year or so I update CA'd certs and usually forget that my mailserver (cyrus+postfix) needs a PEM format file. Then, I have to fish around for the openssl commands that do the job</description>
		<body xmlns="http://www.w3.org/1999/xhtml"><div class="introduction">Every year or so I update CA'd certs and usually forget that my mailserver (cyrus+postfix) needs a PEM format file. Then, I have to fish around for the openssl commands that do the job.</div>
<pre>openssl x509 -in morison.org.crt -out morison.org.der -outform DER<br/>openssl x509 -in morison.org.der -inform DER -out morison.org.pem -outform PEM<br/>sudo cp ./morison.org.pem /etc/ssl/certs/<br/>sudo /etc/init.d/cyrus2.2 restart<br/>sudo /etc/init.d/postfix restart</pre>
Thanks for <a href="http://moze.koze.net/?p=81" title="Browse in a new window" class="external" onclick="window.open(this.href); return false;" onkeypress="window.open(this.href); return false;">http://moze.koze.net/?p=81</a> for the reminder this time.</body>
		<dc:creator>rod</dc:creator>
		<category>Sysadmin</category>
		<pubDate>Thu, 23 Apr 2009 00:13:59 GMT</pubDate>
		<comments>http://morison.biz/technotes/articles/60#comments</comments>
		<slash:comments>0</slash:comments>
		<wfw:comment>http://morison.biz/technotes/comments/post.php/article/60</wfw:comment>
		<wfw:commentRss>http://morison.biz/technotes/comments/feed.php/article/60</wfw:commentRss>
		<trackback:ping>http://morison.biz/technotes/links/trackback.php?anchor=article:60</trackback:ping>
	</item>

	<item>
		<title>VirtualBox for Ubuntu on Vista 64 (The VMWare Killer for Developer VMs?)</title>
		<link>http://morison.biz/technotes/articles/58</link>
		<guid isPermaLink="true">http://morison.biz/technotes/articles/58</guid>
		<description>Ok, that's an overstatement. I used VMWare Workstation successfully for a year to develop for Win2k web servers on my XP desktop. However, when I needed an Ubuntu guest on Windows Vista host (for Python/TurboGears dev), VMWare got ugly with various host apps.
I searched...and I found...VirtualBox.

This doc is a loose how-to, because some steps were poorly documented</description>
		<body xmlns="http://www.w3.org/1999/xhtml"><div class="introduction">Ok, that's an overstatement. I used VMWare Workstation successfully for a year to develop for Win2k web servers on my XP desktop. However, when I needed an Ubuntu guest on Windows Vista host (for Python/TurboGears dev), VMWare got ugly with <a href="http://communities.vmware.com/message/1062725;jsessionid=A1A01540B8DEAF31480E239DCDB63395" title="Browse in a new window" class="external" onclick="window.open(this.href); return false;" onkeypress="window.open(this.href); return false;">various host apps</a>.
I searched...and I found...VirtualBox.<br />
<br />
This doc is a loose how-to, because some steps were poorly documented.</div>
<br />
<img src="http://morison.biz/technotes/skins/technotes2/icons/bullet.gif" width="7" height="7" alt="-" />  Go to the <a href="http://www.virtualbox.org/wiki/Downloads" title="Browse in a new window" class="external" onclick="window.open(this.href); return false;" onkeypress="window.open(this.href); return false;">VirtualBox download site</a> and get the appropriate Windows host installer (x86 or AMD64). Install VirtualBox.<br />
<img src="http://morison.biz/technotes/skins/technotes2/icons/bullet.gif" width="7" height="7" alt="-" />  Go get the <a href="http://www.ubuntu.com/getubuntu/download" title="Browse in a new window" class="external" onclick="window.open(this.href); return false;" onkeypress="window.open(this.href); return false;">install iso for your guest OS</a>.<br />
<img src="http://morison.biz/technotes/skins/technotes2/icons/bullet.gif" width="7" height="7" alt="-" />  Start VirtualBox, and click the "New" tool. The wizard is straightforward. Before starting the VM, be sure to mount your installer .iso as the CD.<br />
<br />
<span class="inline_image"><span><img src="http://morison.biz/technotes/images/article/58/VirtualBoxNew.png" alt="VirtualBoxNew.png"  title=""http://morison.biz/></span></span><br />
<img src="http://morison.biz/technotes/skins/technotes2/icons/bullet.gif" width="7" height="7" alt="-" />  Powerup and install. The VM will capture the mouse when you click in it, and you'll need the "uncapture" key to get it back, right ctrl by default, I recall. I remap to the "Left Windows" key (personal preference.) However, once you install the guest and install the VBoxGuestAdditions on top, your VM can "play nice" with the host for mouse capture, copy/paste, etc.<br />
<img src="http://morison.biz/technotes/skins/technotes2/icons/bullet.gif" width="7" height="7" alt="-" />  Therein lies the rub: the VBoxGuestAdditions install was _not_ that clearly documented. Even finding it was a bit tricky. By following the url of an older version from an <a href="http://ubuntuforums.org/showthread.php?p=6633107" title="Browse in a new window" class="external" onclick="window.open(this.href); return false;" onkeypress="window.open(this.href); return false;">ubuntu forums thread</a> I backed out that I should look under <a href="http://download.virtualbox.org/virtualbox/" title="Browse in a new window" class="external" onclick="window.open(this.href); return false;" onkeypress="window.open(this.href); return false;">http://download.virtualbox.org/virtualbox/</a> , or specifically <a href="http://download.virtualbox.org/virtualbox/2.1.2/VBoxGuestAdditions_2.1.2.iso" title="Browse in a new window" class="external" onclick="window.open(this.href); return false;" onkeypress="window.open(this.href); return false;">the 2.1.2 VBoxGuestAdditions download</a> from <a href="http://download.virtualbox.org/virtualbox/2.1.2/" title="Browse in a new window" class="external" onclick="window.open(this.href); return false;" onkeypress="window.open(this.href); return false;">this webdir</a>.<br />
<img src="http://morison.biz/technotes/skins/technotes2/icons/bullet.gif" width="7" height="7" alt="-" />  To install the guest additions, I actually had to <a href="http://download.virtualbox.org/virtualbox/2.1.2/UserManual.pdf" title="Browse in a new window" class="external" onclick="window.open(this.href); return false;" onkeypress="window.open(this.href); return false;">RTFM</a>, particularly section "4.3.1 Installing the Linux Guest Additions"<br />
<img src="http://morison.biz/technotes/skins/technotes2/icons/bullet.gif" width="7" height="7" alt="-" />  Add, then mount the VBoxGuestAdditions.iso (from the Devices menu of the VM). <br />
<br />
<span class="inline_image"><span><img src="http://morison.biz/technotes/images/article/58/VirtualBoxMountIso.png" alt="VirtualBoxMountIso.png"  title=""http://morison.biz/></span></span><br />
<img src="http://morison.biz/technotes/skins/technotes2/icons/bullet.gif" width="7" height="7" alt="-" />  If/when a popup in the guest OS asks to automatically run software, say "Cancel"<br />
<img src="http://morison.biz/technotes/skins/technotes2/icons/bullet.gif" width="7" height="7" alt="-" />  Open a shell on the guest (Applications->Accessories->Terminal, for Ubuntu Desktop). You'll need to install DKMS, then run the guest additions script, and reboot.
<pre>$ sudo apt-get install dkms<br/>$ sudo sh /cdrom/VBoxLinuxAdditions-x86.run #look for the amd64 if that's your linux guest install<br/>$ sudo reboot</pre><br />
<img src="http://morison.biz/technotes/skins/technotes2/icons/bullet.gif" width="7" height="7" alt="-" />  ...And presto, your Ubuntu (or other linux) should come up, nicely sharing the mouse point with Vista, auto-resizing the guest desktop when the host window changes, and so on.<br />
<img src="http://morison.biz/technotes/skins/technotes2/icons/bullet.gif" width="7" height="7" alt="-" />  Proceed to bring your guest OS up to date, and do watchya do.<br />
<br />
<span class="inline_image"><span><img src="http://morison.biz/technotes/images/article/58/UbuntuInVirtualBox.png" alt="UbuntuInVirtualBox.png"  title=""http://morison.biz/></span></span></body>
		<dc:creator>rod</dc:creator>
		<category>Sysadmin</category>
		<pubDate>Fri, 13 Feb 2009 15:23:59 GMT</pubDate>
		<comments>http://morison.biz/technotes/articles/58#comments</comments>
		<slash:comments>0</slash:comments>
		<wfw:comment>http://morison.biz/technotes/comments/post.php/article/58</wfw:comment>
		<wfw:commentRss>http://morison.biz/technotes/comments/feed.php/article/58</wfw:commentRss>
		<trackback:ping>http://morison.biz/technotes/links/trackback.php?anchor=article:58</trackback:ping>
	</item>

	<item>
		<title>My Choice: Best IPTables Tutorial</title>
		<link>http://morison.biz/technotes/articles/57</link>
		<guid isPermaLink="true">http://morison.biz/technotes/articles/57</guid>
		<description>This link is hands down the best tutorial of IpTables I've come across</description>
		<body xmlns="http://www.w3.org/1999/xhtml"><div class="introduction">This link is hands down the best tutorial of IpTables I've come across.</div>
Linux IpTables can be confounding. I usually create a rule and try it out with tcpdumps running on both sides, sort of a "hail Mary" approach. A <i>careful</i> read-through of <a href="http://iptables-tutorial.frozentux.net/iptables-tutorial.html" title="Browse in a new window" class="external" onclick="window.open(this.href); return false;" onkeypress="window.open(this.href); return false;">Iptables Tutorial 1.2.2</a> really straightened me out. <br />
<br />
In particular, the <a href="http://iptables-tutorial.frozentux.net/iptables-tutorial.html#DNATTARGET" title="Browse in a new window" class="external" onclick="window.open(this.href); return false;" onkeypress="window.open(this.href); return false;">DNAT Target</a> section finally answered my questions, and fixed the issue, with my port forwarded servers not responding to clients from within their masqueraded network.<br />
<br />
A very good read, especially if you've "kinda" figured out IpTables, just enough to be dangerous, but are missing some key points to get rules to do what you want.<br />
<br />
(You can skip the lengthy SCTP coverage, unless that's something you're working with.)<br />
<br />
Once again: <a href="http://iptables-tutorial.frozentux.net/iptables-tutorial.html" title="Browse in a new window" class="external" onclick="window.open(this.href); return false;" onkeypress="window.open(this.href); return false;">http://iptables-tutorial.frozentux.net/iptables-tutorial.html</a></body>
		<dc:creator>rod</dc:creator>
		<category>Linux</category>
		<pubDate>Tue, 10 Feb 2009 11:48:06 GMT</pubDate>
		<comments>http://morison.biz/technotes/articles/57#comments</comments>
		<slash:comments>0</slash:comments>
		<wfw:comment>http://morison.biz/technotes/comments/post.php/article/57</wfw:comment>
		<wfw:commentRss>http://morison.biz/technotes/comments/feed.php/article/57</wfw:commentRss>
		<trackback:ping>http://morison.biz/technotes/links/trackback.php?anchor=article:57</trackback:ping>
	</item>

	<item>
		<title>PostgreSQL 1A</title>
		<link>http://morison.biz/technotes/articles/56</link>
		<guid isPermaLink="true">http://morison.biz/technotes/articles/56</guid>
		<description>I spent the last 8 years on a lot of MySQL and little MSSQL. Now, I'm on a PostgreSQL project. Here's my cheat sheet of DBMS specific commands I needed to figure out right away</description>
		<body xmlns="http://www.w3.org/1999/xhtml"><div class="introduction">I spent the last 8 years on a lot of MySQL and little MSSQL. Now, I'm on a <a href="http://www.postgresql.org" title="Browse in a new window" class="external" onclick="window.open(this.href); return false;" onkeypress="window.open(this.href); return false;">PostgreSQL</a> project. Here's my cheat sheet of DBMS specific commands I needed to figure out right away.</div>
<ul><li>Install on Ubuntu 8.10</li></ul>
<pre>$ sudo apt-get install postgresql-8.3 postgresql-server-dev-8.3<br/>$ sudo vi /etc/postgresql/8.3/main/postgresql.conf <br/># uncomment the listen_addresses = 'localhost' line<br/># optional: change localhost to machine hostaddr if you want outside access<br/>$ sudo /etc/init.d/postgresql-8.3 restart</pre>
<ul><li>Give the "root" db user a password, create a new dbuser and a database with access privs for that new dbuser. Also, give the new dbuser perms to create more databases.</li></ul>
<pre>$ sudo -u postgres psql template1<br/>template1=# ALTER USER postgres WITH UNENCRYPTED PASSWORD 'P8ss';<br/>ALTER ROLE<br/>template1=# CREATE USER user1 CREATEDB;<br/>CREATE ROLE<br/>template1=# ALTER USER user1 WITH UNENCRYPTED PASSWORD 'P9ss';<br/>ALTER ROLE<br/>template1=# CREATE DATABASE db1 WITH OWNER user1;<br/>CREATE DATABASE<br/>template1=# q</pre>
<ul><li>To suck a sqldump into that database</li></ul>
<pre>$ zcat /PathToDbDump/DbDump.sql.gz | psql -h localhost -U postgres -d user1</pre>
<ul><li>Logging in as non-postgres user (this bit baffled me originally, until I decoded the postgres init settings): /etc/postgresql/8.3/main/pg_hba.conf has security settings that say, "If connected via unix socket then require the db username match the process owner name." By default psql uses the unix socket. That's fine for the "root" db user (postgres), but not how you want access other dbs. However, for network socket connections pg_hba.conf is set to use only password check against it's user table. Yay. So access through the socket, which is the general case in production systems anyway, as the db is on a dedicated machine.</li><li>Log in as the user1 and create a db.</li></ul>
<pre>psql --username user1 --password -h localhost template1<br/>CREATE DATABASE db2 WITH OWNER user1;</pre>
<p class="note"><img src="http://morison.biz/technotes/skins/technotes2/icons/codes/note.gif" width="10" height="10" alt="" /> 
<ul><li>if you don't put a db name on the psql command line, it will assume the db name is the same as the user</li><li>postgres provides an easily scripted command, createdb, that does most of what the CREATE DATABASE command does.</li><li>read the postgres docs for encrypted passwords, recommended for production</li></ul>
</p></body>
		<dc:creator>rod</dc:creator>
		<pubDate>Wed, 28 Jan 2009 09:44:28 GMT</pubDate>
		<comments>http://morison.biz/technotes/articles/56#comments</comments>
		<slash:comments>0</slash:comments>
		<wfw:comment>http://morison.biz/technotes/comments/post.php/article/56</wfw:comment>
		<wfw:commentRss>http://morison.biz/technotes/comments/feed.php/article/56</wfw:commentRss>
		<trackback:ping>http://morison.biz/technotes/links/trackback.php?anchor=article:56</trackback:ping>
	</item>

	<item>
		<title>WxPython 2.8 Vista 64 bit crash - workaround found</title>
		<link>http://morison.biz/technotes/articles/55</link>
		<guid isPermaLink="true">http://morison.biz/technotes/articles/55</guid>
		<description>Originally posted on the wxpython-users list</description>
		<body xmlns="http://www.w3.org/1999/xhtml"><div class="introduction">Originally posted on the wxpython-users list</div>
I've puzzled over the Vista 64 crashes this past week, and the reports similar to my problem:<br />
<br />
<img src="http://morison.biz/technotes/skins/technotes2/icons/bullet.gif" width="7" height="7" alt="-" />  <a href="http://www.nabble.com/wxPython-Crash-td20605396.html" title="Browse in a new window" class="external" onclick="window.open(this.href); return false;" onkeypress="window.open(this.href); return false;">http://www.nabble.com/wxPython-Crash-td20605396.html</a><br />
<img src="http://morison.biz/technotes/skins/technotes2/icons/bullet.gif" width="7" height="7" alt="-" />  <a href="http://trac.wxwidgets.org/ticket/10203" title="Browse in a new window" class="external" onclick="window.open(this.href); return false;" onkeypress="window.open(this.href); return false;">http://trac.wxwidgets.org/ticket/10203</a><br />
<img src="http://morison.biz/technotes/skins/technotes2/icons/bullet.gif" width="7" height="7" alt="-" />  <a href="http://trac.wxwidgets.org/ticket/10082" title="Browse in a new window" class="external" onclick="window.open(this.href); return false;" onkeypress="window.open(this.href); return false;">http://trac.wxwidgets.org/ticket/10082</a><br />
<img src="http://morison.biz/technotes/skins/technotes2/icons/bullet.gif" width="7" height="7" alt="-" />  <a href="http://www.python-forum.org/pythonforum/viewtopic.php?f=4&amp;p=46918" title="Browse in a new window" class="external" onclick="window.open(this.href); return false;" onkeypress="window.open(this.href); return false;">http://www.python-forum.org/pythonforum/viewtopic.php?f=4&amp;p=46918</a><br />
<br />
I tried hand patching the supposed fix, <a href="http://trac.wxwidgets.org/changeset/56863," title="Browse in a new window" class="external" onclick="window.open(this.href); return false;" onkeypress="window.open(this.href); return false;">http://trac.wxwidgets.org/changeset/56863,</a> from the trunk into WX_2_8_BRANCH, but no joy.<br />
<br />
Finally, after going back to wxWidgets C++ apps to see why they didn't crash, I realized wxWidgets apps get built with a different manifest than the python.exe. The diff between the two manifests is in the Common Controls DLL. wxWidgets apps specifically call out the 6.0.0.0 common controls. Common controls is not in the python manifest.<br />
<br />
However, running my debug python, I can see that python.exe loads the 5.82 common controls, and assumed that mismatch was the source of the problem. So, I backed up my c:\Python26\python.exe, merged a manifest with 6.0 common controls into the python.exe and there was rejoicing, i.e., no crash.<br />
<br />
Here's the trick (you'll need the msft manifest tool, mt.exe, comes with visual studio, plus a manifest file with common controls 6.0.0.0, like the one out of the wxPython src distro):<br />
<br />
<pre>cd c:\Python26<br/>copy python.exe python-backup.exe<br/>copy pythonw.exe pythonw-backup.exe<br/>mt -inputresource:python.exe;#1 -manifest \PathToWxPySrc\src\winxp.vc9.manifest  -outputresource:python.exe;#1<br/>mt -inputresource:pythonw.exe;#1 -manifest \PathToWxPySrc\src\winxp.vc9.manifest  -outputresource:pythonw.exe;#1</pre><br />
<br />
The fix <a href="http://trac.wxwidgets.org/changeset/56863" title="Browse in a new window" class="external" onclick="window.open(this.href); return false;" onkeypress="window.open(this.href); return false;">http://trac.wxwidgets.org/changeset/56863</a> in the wxWidgets trunk (2.9 release, I expect) is reported to solve the problem, but I wonder whether it really pulls in the 6.0 common controls dll (for wxPython, that is).</body>
		<dc:creator>rod</dc:creator>
		<pubDate>Fri, 16 Jan 2009 05:23:44 GMT</pubDate>
		<comments>http://morison.biz/technotes/articles/55#comments</comments>
		<slash:comments>1</slash:comments>
		<wfw:comment>http://morison.biz/technotes/comments/post.php/article/55</wfw:comment>
		<wfw:commentRss>http://morison.biz/technotes/comments/feed.php/article/55</wfw:commentRss>
		<trackback:ping>http://morison.biz/technotes/links/trackback.php?anchor=article:55</trackback:ping>
	</item>

	<item>
		<title>References, FAQs, Debug &amp; Test Tips</title>
		<link>http://morison.biz/technotes/articles/48</link>
		<guid isPermaLink="true">http://morison.biz/technotes/articles/48</guid>
		<description>Other How-Tos, FAQs &amp; Ideas for mail system debug</description>
		<body xmlns="http://www.w3.org/1999/xhtml"><div class="introduction">Other How-Tos, FAQs &amp; Ideas for mail system debug</div>
<h2 id="title_1" >References</h2><br />
<img src="http://morison.biz/technotes/skins/technotes2/icons/bullet.gif" width="7" height="7" alt="-" />  <a href="https://help.ubuntu.com/community/Cyrus" title="Browse in a new window" class="external" onclick="window.open(this.href); return false;" onkeypress="window.open(this.href); return false;">https://help.ubuntu.com/community/Cyrus</a><br />
<img src="http://morison.biz/technotes/skins/technotes2/icons/bullet.gif" width="7" height="7" alt="-" />  <a href="http://www.postfix.org/SASL_README.html#server_cyrus" title="Browse in a new window" class="external" onclick="window.open(this.href); return false;" onkeypress="window.open(this.href); return false;">http://www.postfix.org/SASL_README.html#server_cyrus</a><br />
<img src="http://morison.biz/technotes/skins/technotes2/icons/bullet.gif" width="7" height="7" alt="-" />  <a href="http://tldp.org/HOWTO/Postfix-Cyrus-Web-cyradm-HOWTO/" title="Browse in a new window" class="external" onclick="window.open(this.href); return false;" onkeypress="window.open(this.href); return false;">http://tldp.org/HOWTO/Postfix-Cyrus-Web-cyradm-HOWTO/</a><br />
<img src="http://morison.biz/technotes/skins/technotes2/icons/bullet.gif" width="7" height="7" alt="-" />  <a href="http://www.delouw.ch/linux/Postfix-Cyrus-Web-cyradm-HOWTO/html/" title="Browse in a new window" class="external" onclick="window.open(this.href); return false;" onkeypress="window.open(this.href); return false;">http://www.delouw.ch/linux/Postfix-Cyrus-Web-cyradm-HOWTO/html/</a><br />
<img src="http://morison.biz/technotes/skins/technotes2/icons/bullet.gif" width="7" height="7" alt="-" />  <a href="http://manpages.ubuntu.com/manpages/hardy/man1/policyd-spf.html" title="Browse in a new window" class="external" onclick="window.open(this.href); return false;" onkeypress="window.open(this.href); return false;">http://manpages.ubuntu.com/manpages/hardy/man1/policyd-spf.html</a><br />
<img src="http://morison.biz/technotes/skins/technotes2/icons/bullet.gif" width="7" height="7" alt="-" />  <a href="http://doc.ubuntu.com/ubuntu/serverguide/C/" title="Browse in a new window" class="external" onclick="window.open(this.href); return false;" onkeypress="window.open(this.href); return false;">http://doc.ubuntu.com/ubuntu/serverguide/C/</a>
<h2 id="title_2" >Tips &amp; Tricks</h2><br />
<img src="http://morison.biz/technotes/skins/technotes2/icons/bullet.gif" width="7" height="7" alt="-" />  Send mails locally with the Linux command line mail program
<pre>sudo apt-get install mailutils<br/>mail rod@moleculemedia.net -s test<br/>Cc: rod@morison.org<br/>test<br/>^D</pre><br />
<img src="http://morison.biz/technotes/skins/technotes2/icons/bullet.gif" width="7" height="7" alt="-" />  Can't create Sieve files
<pre>sudo bash<br/>cd /var/spool/cyrus/sieve<br/>ls domain<br/>mkdir domain<br/>cp -a [a-z] domain/<br/>chown cyrus:mail domain<br/>chmod o-rwx domain</pre></body>
		<dc:creator>rod</dc:creator>
		<pubDate>Tue, 30 Sep 2008 04:42:14 GMT</pubDate>
		<comments>http://morison.biz/technotes/articles/48#comments</comments>
		<slash:comments>0</slash:comments>
		<wfw:comment>http://morison.biz/technotes/comments/post.php/article/48</wfw:comment>
		<wfw:commentRss>http://morison.biz/technotes/comments/feed.php/article/48</wfw:commentRss>
		<trackback:ping>http://morison.biz/technotes/links/trackback.php?anchor=article:48</trackback:ping>
	</item>

	<item>
		<title>Lockdown</title>
		<link>http://morison.biz/technotes/articles/47</link>
		<guid isPermaLink="true">http://morison.biz/technotes/articles/47</guid>
		<description>Security Considerations</description>
		<body xmlns="http://www.w3.org/1999/xhtml"><div class="introduction">Security Considerations</div>
Under Constrution   <img src="http://morison.biz/technotes/skins/images/smileys/winkgrin.gif" alt="" /></body>
		<dc:creator>rod</dc:creator>
		<pubDate>Tue, 30 Sep 2008 04:42:33 GMT</pubDate>
		<comments>http://morison.biz/technotes/articles/47#comments</comments>
		<slash:comments>0</slash:comments>
		<wfw:comment>http://morison.biz/technotes/comments/post.php/article/47</wfw:comment>
		<wfw:commentRss>http://morison.biz/technotes/comments/feed.php/article/47</wfw:commentRss>
		<trackback:ping>http://morison.biz/technotes/links/trackback.php?anchor=article:47</trackback:ping>
	</item>

	<item>
		<title>DNS Preliminaries</title>
		<link>http://morison.biz/technotes/articles/42</link>
		<guid isPermaLink="true">http://morison.biz/technotes/articles/42</guid>
		<description>Public mail service requires a static IP and DNS support. Here is a quick list of what you need</description>
		<body xmlns="http://www.w3.org/1999/xhtml"><div class="introduction">Public mail service requires a static IP and DNS support. Here is a quick list of what you need.</div>
<h2 id="title_2" >IP &amp; DNS Setup</h2>
You'll need a static IP and access to the DNS config for you domain. For the static, it's a matter of requesting the static IP from your access provider...if your service supports such...if not, read the commentary at <a href="http://morison.biz/technotes/articles/37" title="Read the article" class="article">The Internet Server Project - Part II - Planning<br />
<br />
</a>.<br />
<br />
For DNS, most likely the registrar for your domain has a web interface for making changes.
<h3 id="title_1" >Checklist</h3>
<ol class="1"><li> A static IP, from your access or hosting provider
</li><li> An 'A' record pointing to a name to your static ip, using a name something like "mailserver.example.domain". In this guide we'll use <i>example.domain</i> as a placeholder for your own domain.
</li><li> An MX record for <i>example.domain</i> which points at <i>mailserver.example.domain</i>
</li><li> CNAME or A records for <i>mail.example.domain</i>, <i>smtp.example.domain</i> and <i>webmail.example.domain</i>. If you use CNAME's, point them at <i>mailserver.example.domain</i>, if A use your static IP.</li></ol>
<h2 id="title_3" >Next Step: <a href="http://morison.biz/technotes/articles/43" title="Read the article" class="article">Ubuntu Install</a></h2></body>
		<dc:creator>rod</dc:creator>
		<category>Sysadmin</category>
		<pubDate>Thu, 01 Sep 2011 15:04:42 GMT</pubDate>
		<comments>http://morison.biz/technotes/articles/42#comments</comments>
		<slash:comments>0</slash:comments>
		<wfw:comment>http://morison.biz/technotes/comments/post.php/article/42</wfw:comment>
		<wfw:commentRss>http://morison.biz/technotes/comments/feed.php/article/42</wfw:commentRss>
		<trackback:ping>http://morison.biz/technotes/links/trackback.php?anchor=article:42</trackback:ping>
	</item>

	<item>
		<title>Anti-Spam &amp; Anti-Virus Install</title>
		<link>http://morison.biz/technotes/articles/46</link>
		<guid isPermaLink="true">http://morison.biz/technotes/articles/46</guid>
		<description>Some of the best mail filtering technology the world has to offer...Most of this &quot;just works&quot; out of the Ubuntu installations. We'll add SPF checking directly info Postfix, too</description>
		<body xmlns="http://www.w3.org/1999/xhtml"><div class="introduction">Some of the best mail filtering technology the world has to offer...Most of this "just works" out of the Ubuntu installations. We'll add SPF checking directly info Postfix, too.</div>
<a href="http://www.ijs.si/software/amavisd/" title="Browse in a new window" class="external" onclick="window.open(this.href); return false;" onkeypress="window.open(this.href); return false;">Amavisd</a> acts as a "master" daemon to pluggable mail scanning modules. We'll install <a href="http://www.clamav.net/" title="Browse in a new window" class="external" onclick="window.open(this.href); return false;" onkeypress="window.open(this.href); return false;">ClamAV</a> anti-virus and <a href="http://spamassassin.apache.org/" title="Browse in a new window" class="external" onclick="window.open(this.href); return false;" onkeypress="window.open(this.href); return false;">SpamAssassin</a> anti-spam. The SpamAssassin install will include several powerful spam detection tools, e.g., <a href="http://pyzor.sourceforge.net/" title="Browse in a new window" class="external" onclick="window.open(this.href); return false;" onkeypress="window.open(this.href); return false;">pyzor</a>, <a href="http://razor.sourceforge.net/" title="Browse in a new window" class="external" onclick="window.open(this.href); return false;" onkeypress="window.open(this.href); return false;">razor</a>, and others.
<ol class="1"><li> <b>Install the Goods</b>
<pre>sudo apt-get install amavisd-new spamassassin clamav-daemon<br/>sudo apt-get install pyzor razor python-policyd-spf<br/>sudo apt-get install arj cabextract cpio lha nomarch pax rar unrar unzip unzoo zip zoo</pre>
</li><li> <b>Add clamav to amavis group</b>
<pre>sudo adduser clamav amavis</pre>
</li><li> <b>Enable SpamAssassin</b> - 
<pre>sudo vi /etc/default/spamassassin</pre>
and change line 8 to <code>ENABLED=1</code>
</li><li> <b>Tell Amavis to Virus &amp; Spam Check</b>
<pre>sudo vi /etc/amavis/conf.d/15-content_filter_mode</pre>
and uncomment the virus &amp; spam check lines as shown:
<pre>@bypass_virus_checks_maps = (<br/>   %bypass_virus_checks, @bypass_virus_checks_acl, $bypass_virus_checks_re);</pre>
...
<pre>@bypass_spam_checks_maps = (<br/>   %bypass_spam_checks, @bypass_spam_checks_acl, $bypass_spam_checks_re);</pre>
</li><li> <b>Set Local Policy Prefs</b>
<pre>sudo vi /etc/amavis/conf.d/50-user</pre>
My policy is to tag, but pass all spam. Viruses are not delivered, but the postmaster is notified and the email is quarantined, such that it can be recovered if need be. You may want to study the Amavis docs and customize here.<br />
<br />
Change <code>example.domain</code> to yours. My <code>50-user</code> reads
<pre>use strict;<br/><br/>#<br/># Place your configuration directives here.  They will override those in<br/># earlier files.<br/>#<br/># See /usr/share/doc/amavisd-new/ for documentation and examples of<br/># the directives you can use in this file<br/>#<br/><br/>$log_level = 0;<br/><br/>@local_domains_maps =<br/>   ( [ ".$mydomain", 'example.domain' ] ); <br/><br/>$sa_spam_subject_tag = '<b>*SPAM</b>* ';<br/>$sa_tag_level_deflt  = -999;  # add spam info headers if at, or above that level<br/>$sa_tag2_level_deflt = 5.0; # add 'spam detected' headers at that level<br/>$sa_kill_level_deflt = 999; # triggers spam evasive actions<br/>$sa_dsn_cutoff_level = 10;   # spam level beyond which a DSN is not sent<br/><br/>$virus_admin = "postmaster@$mydomain"; # due to D_DISCARD default<br/>$spam_admin = "postmaster@$mydomain";<br/>$dsn_bcc = "maildebug@$mydomain";<br/><br/>$mailfrom_notify_admin     = "virusalert@$mydomain";<br/>$mailfrom_notify_recip     = "virusalert@$mydomain";<br/>$mailfrom_notify_spamadmin = "spamalert@$mydomain";<br/><br/>$final_virus_destiny      = D_DISCARD;  # (data not lost, see virus quarantine)<br/>$final_banned_destiny     = D_REJECT;   # D_REJECT when front-end MTA<br/>$final_spam_destiny       = D_PASS;<br/>$final_bad_header_destiny = D_PASS;     # False-positive prone (for spam)<br/><br/>#------------ Do not modify anything below this line -------------<br/>1;  # ensure a defined return</pre>
</li><li> <b>Integrate Amavisd into Postfix</b>
<pre>sudo vi /etc/postfix/main.cf</pre>
Add the following to the bottom of <code>/etc/postfix/main.cf</code>
<pre># Amavis ClamAV+SpamAssassin<br/>content_filter = smtp-amavis:[127.0.0.1]:10024<br/><br/># Postfix behavior/content controls<br/>#body_checks = regexp:/etc/postfix/body_checks<br/>#header_checks = regexp:/etc/postfix/header_checks<br/>smtpd_helo_required = yes<br/>disable_vrfy_command = yes<br/>smtpd_delay_reject = yes<br/>smtpd_helo_required = yes<br/>smtpd_error_sleep_time = 15s<br/>smtpd_soft_error_limit = 10<br/>smtpd_hard_error_limit = 20</pre>
</li><li> <b><code>/etc/postfix/master.cf</code></b>
<pre>sudo vi /etc/postfix/master.cf</pre>
Add the two "-o" lines shown under the line beginning with "pickup", to read:
<pre>pickup    fifo  n       -       -       60      1       pickup<br/>         -o content_filter=<br/>         -o receive_override_options=no_header_body_checks</pre>
Then add the following to the bottom of <code>/etc/postfix/master.cf</code>
<pre>smtp-amavis     unix    -       -       -       -       2       smtp<br/>        -o smtp_data_done_timeout=1200<br/>        -o smtp_send_xforward_command=yes<br/>        -o disable_dns_lookups=yes<br/>        -o max_use=20<br/><br/>127.0.0.1:10025 inet    n       -       -       -       -       smtpd<br/>        -o content_filter=<br/>        -o local_recipient_maps=<br/>        -o relay_recipient_maps=<br/>        -o smtpd_restriction_classes=<br/>        -o smtpd_delay_reject=no<br/>        -o smtpd_client_restrictions=permit_mynetworks,reject<br/>        -o smtpd_helo_restrictions=<br/>        -o smtpd_sender_restrictions=<br/>        -o smtpd_recipient_restrictions=permit_mynetworks,reject<br/>        -o smtpd_data_restrictions=reject_unauth_pipelining<br/>        -o smtpd_end_of_data_restrictions=<br/>        -o mynetworks=127.0.0.0/8<br/>        -o smtpd_error_sleep_time=0<br/>        -o smtpd_soft_error_limit=1001<br/>        -o smtpd_hard_error_limit=1000<br/>        -o smtpd_client_connection_count_limit=0<br/>        -o smtpd_client_connection_rate_limit=0<br/>        -o receive_override_options=no_header_body_checks,no_unknown_recipient_checks</pre>
</li><li> <b><a href="http://www.openspf.org/" title="Browse in a new window" class="external" onclick="window.open(this.href); return false;" onkeypress="window.open(this.href); return false;">SPF</a> in Postfix</b> - SPF is already a part of SpamAssassin's scoring scheme. We can further utilize SPF in Postfix to reflect sites that disapprove certain usage and reject those messages outright. I recommend a read through of materials on the SPF site and relevant discussion lists. <br />
<br />
You can omit this step if you choose.
<pre>sudo vi /etc/postfix/main.cf</pre>
Add a comma to the end of the last line of the <code>smtpd_recipient_restrictions</code> settings and on a new line add
<pre>check_policy_service unix:private/policyd-spf</pre>
followed by
<pre>policyd-spf_time_limit = 3600</pre>
This section of your <code>main.cf</code> should look something like
<pre>smtpd_recipient_restrictions =<br/>        permit_sasl_authenticated,<br/>        permit_mynetworks,<br/>        reject_unauth_destination,<br/>        reject_invalid_hostname,<br/>        reject_non_fqdn_hostname,<br/>        reject_non_fqdn_sender,<br/>        reject_non_fqdn_recipient,<br/>        reject_unknown_sender_domain,<br/>        reject_unknown_recipient_domain,<br/>        reject_unauth_pipelining<br/>        reject_rbl_client bl.spamcop.net,<br/>        reject_rbl_client sbl-xbl.spamhaus.org,<br/>        reject_rbl_client list.dsbl.org,<br/>        check_policy_service unix:private/policyd-spf<br/>policyd-spf_time_limit = 3600</pre>
In master.cf:
<pre>sudo vi /etc/postfix/master.cf</pre>
At the bottom, add
<pre>policyd-spf  unix  -       n       n       -       0 spawn<br/>        user=nobody argv=/usr/bin/python /usr/bin/policyd-spf</pre>
</li><li> <b>Start/Restart All Concerned</b>
<pre>sudo /etc/init.d/postfix restart<br/>sudo /etc/init.d/amavis restart<br/>sudo /etc/init.d/clamav-daemon restart<br/>sudo /etc/init.d/spamassassin start</pre>
</li><li> <b>Test and Check</b> - Try another mail send and watch the log.
<pre>tail -f /var/log/mail.log</pre>
Look for the logfile line
<pre>Sep 29 13:50:25 mailserver amavis[8449]: (08449-01) Passed CLEAN, LOCAL [192.168.66.194] [192.168.66.194] &amp;lt;test@mailserver.morison.org> -> &amp;lt;test@mailserver.morison.org>, Message-ID: &amp;lt;48E13F6D.1010202@mailserver.morison.org>, mail_id: 8HLb1RzoY+ZW, Hits: -1.44, size: 564, queued_as: EC77724624, 3852 ms</pre>
for anti-spam action. Try it with a spam file (I'm sure you can find one.) You'll see
<pre>Sep 29 13:52:55 mailserver amavis[8454]: (08454-01) Passed SPAMMY, LOCAL [192.168.66.194] [192.168.66.194] &amp;lt;test@mailserver.morison.org> -> &amp;lt;test@mailserver.morison.org>, Message-ID: &amp;lt;48E13FFB.7000908@mailserver.morison.org>, mail_id: moC25mDhimPK, Hits: 8.824, size: 649, queued_as: 4B5E624624, 12174 ms</pre>
and look at the mail headers in your mail client:
<pre>X-Virus-Scanned: Debian amavisd-new at mailserver.morison.org<br/>X-Spam-Flag: YES<br/>X-Spam-Score: 8.824<br/>X-Spam-Level: <b>*</b>***<br/>X-Spam-Status: Yes, score=8.824 tagged_above=-999 required=5<br/>	tests=[ALL_TRUSTED=-1.44, AWL=-10.264, DIGEST_MULTIPLE=0.001,<br/>	PYZOR_CHECK=2.834, RAZOR2_CF_RANGE_51_100=0.5,<br/>	RAZOR2_CF_RANGE_E4_51_100=1.5, RAZOR2_CF_RANGE_E8_51_100=1.5,<br/>	RAZOR2_CHECK=0.5, URIBL_AB_SURBL=1.613, URIBL_JP_SURBL=2.857,<br/>	URIBL_OB_SURBL=2.132, URIBL_SBL=2.468, URIBL_SC_SURBL=2.523,<br/>	URIBL_WS_SURBL=2.1]</pre>
Finally, try sending a test virus from (the virus is dead, of course, but it triggers a ClamAV find):<br />
<br />
<a href="http://www.eicar.org/download/eicar.com" title="Browse in a new window" class="external" onclick="window.open(this.href); return false;" onkeypress="window.open(this.href); return false;">http://www.eicar.org/download/eicar.com</a> 
<a href="http://www.eicar.org/download/eicar_com.zip" title="Browse in a new window" class="external" onclick="window.open(this.href); return false;" onkeypress="window.open(this.href); return false;">http://www.eicar.org/download/eicar_com.zip</a>
<a href="http://www.eicar.org/download/eicarcom2.zip" title="Browse in a new window" class="external" onclick="window.open(this.href); return false;" onkeypress="window.open(this.href); return false;">http://www.eicar.org/download/eicarcom2.zip</a><br />
<br />
Look for
<pre>Sep 29 14:07:56 mailserver amavis[8449]: (08449-02) Blocked INFECTED (Eicar-Test-Signature), LOCAL [192.168.66.194] [192.168.66.194] &amp;lt;test@mailserver.morison.org> -> &amp;lt;test@mailserver.morison.org>, quarantine: J/virus-JfYri+IcyuAB, Message-ID: &amp;lt;48E1438B.5060502@mailserver.morison.org>, mail_id: JfYri+IcyuAB, Hits: -, size: 1062, 934 ms</pre>
and check your postmaster email.</li></ol><br />
<br />
<h2 id="title_1" >Epilogue</h2>
You're done, really. There are some security issues that could be better, discussed further in <a href="http://morison.biz/technotes/articles/47" title="Read the article" class="article">Lockdown</a>. (Yes, I know, passwords sitting the in filesystem plain readable, but they gotta get in, first.)</body>
		<dc:creator>rod</dc:creator>
		<pubDate>Tue, 30 Sep 2008 04:43:12 GMT</pubDate>
		<comments>http://morison.biz/technotes/articles/46#comments</comments>
		<slash:comments>0</slash:comments>
		<wfw:comment>http://morison.biz/technotes/comments/post.php/article/46</wfw:comment>
		<wfw:commentRss>http://morison.biz/technotes/comments/feed.php/article/46</wfw:commentRss>
		<trackback:ping>http://morison.biz/technotes/links/trackback.php?anchor=article:46</trackback:ping>
	</item>

	<item>
		<title>Web-Cyradm Install</title>
		<link>http://morison.biz/technotes/articles/45</link>
		<guid isPermaLink="true">http://morison.biz/technotes/articles/45</guid>
		<description>Web-Cyradm provides web based admin of accounts, quotas and domains, along with domain level admins. Installation is not difficult...as long as you use the right version and settings</description>
		<body xmlns="http://www.w3.org/1999/xhtml"><div class="introduction">Web-Cyradm provides web based admin of accounts, quotas and domains, along with domain level admins. Installation is not difficult...as long as you use the right version and settings.</div>
<h2 id="title_1" >Preliminaries</h2>
You'll need to come up with 4 passwords for this section. The first 3 are entirely internal. Once configured, the passwords should be tucked away and not needed, except in an emergency debug of some kind.
<ol class="1"><li> <b>MySQL "root" user</b> - Don't run MySQL without a root user password. The installer will ask for it. Note that this is a database user, internal to MySQL and having nothing to do with login users or mail users.
</li><li> <b>MySQL "mail" user</b> - Another MySQL user, for accessing the soon to be created mail database.
</li><li> <b>Web-Cyradm "cyrus" user</b> - When we configured /etc/cyrus.conf we designated "cyrus" as an admin user. Web-Cyradm will need this user, and we'll set the password when we configure Web-Cyradm. This user is internal to the Web-Cyradm app.
</li><li> <b>Web-Cyradm "admin" user</b> - This is the initial admin user once the website is up and running.</li></ol>
Jot those passwords down in a safe place.
<h2 id="title_2" >Apache + PHP</h2>
Web-Cyradm is a PHP app that uses a MySQL db. Let's start with Apache &amp; PHP.
<ol class="1"><li> <b>Install apache2 with php</b>
<pre>sudo apt-get install apache2 php5 libapache2-mod-php5 php5-cli php5-mysql</pre>
</li><li> <b>PEAR &amp; imap support</b> - Used by Web-Cyradm &amp; webmail apps
<pre>sudo apt-get install php-db php5-imap</pre>
</li><li> <b>Open Port 80</b>
<pre>sudo ufw allow http</pre>
</li><li> <b>Test Apache+PHP</b>
<pre><code><span style="color: #000000">
echo "<br /><span style="color: #0000BB">&amp;lt;?php<br />print_r </span><span style="color: #007700">(</span><span style="color: #0000BB">phpinfo</span><span style="color: #007700">());<br /></span><span style="color: #0000BB">?&amp;gt;</span>" &amp;gt;/tmp/phpinfo.php<br />sudo mv /tmp/phpinfo.php /var/www<br />sudo /etc/init.d/apache2 restart</span></code>
</pre>
Browse to <code>http://mailserver.example.domain/phpinfo.php</code>
</li><li> <b>Clean up</b>
<pre>sudo rm /var/www/phpinfo.php</pre></li></ol>
<h2 id="title_3" >MySQL with PAM &amp; Postfix Config</h2>
<ol class="1"><li> <b>Install MySQL Server</b> - The installer will ask for that MySQL root password.
<pre>sudo apt-get install mysql-server</pre>
</li><li> <b>Relocate MySQL Socket to Postfix Chroot</b> - Just like we tweaked the saslauthd socket, we need the same for Postfix to access MySQL. Stop MySQL first, as it gets confused when these files change underneath it.
<pre>sudo /etc/init.d/mysql stop<br/>sudo vi /etc/mysql/my.cnf</pre>
and prepend all of the references to <code>/var/run/mysqld</code> to read <code>/var/spool/postfix/var/run/mysqld</code>. In the current config that affects lines 21, 28, 43 &amp; 44. Lines 19-44 should look like
<pre>[client]<br/>port            = 3306<br/>socket          = /var/spool/postfix/var/run/mysqld/mysqld.sock<br/><br/># Here is entries for some specific programs<br/># The following values assume you have at least 32M ram<br/><br/># This was formally known as [safe_mysqld]. Both versions are currently parsed.<br/>[mysqld_safe]<br/>socket          = /var/spool/postfix/var/run/mysqld/mysqld.sock<br/>nice            = 0<br/><br/>[mysqld]<br/>#<br/># * Basic Settings<br/>#<br/><br/>#<br/># * IMPORTANT<br/>#   If you make changes to these settings and your system uses apparmor, you may<br/>#   also need to also adjust /etc/apparmor.d/usr.sbin.mysqld.<br/>#<br/><br/>user            = mysql<br/>pid-file        = /var/spool/postfix/var/run/mysqld/mysqld.pid<br/>socket          = /var/spool/postfix/var/run/mysqld/mysqld.sock</pre>
</li><li> <b>Update <code>/etc/mysql/debian.cnf</code></b>
<pre>sudo vi /etc/mysql/debian.cnf</pre>
and change the "socket" lines to the new location, e.g.,
<pre># Automatically generated for Debian scripts. DO NOT TOUCH!<br/>[client]<br/>host     = localhost<br/>user     = debian-sys-maint<br/>password = 8JCDXsC4cUmDn8Pm<br/>socket   = /var/spool/postfix/var/run/mysqld/mysqld.sock<br/>[mysql_upgrade]<br/>user     = debian-sys-maint<br/>password = 8JCDXsC4cUmDn8Pm<br/>socket   = /var/spool/postfix/var/run/mysqld/mysqld.sock<br/>basedir  = /usr</pre>
</li><li> <b>Update <a href="http://en.wikipedia.org/wiki/Apparmor" title="Browse in a new window" class="external" onclick="window.open(this.href); return false;" onkeypress="window.open(this.href); return false;">apparmor</a></b>
<pre>sudo vi /etc/apparmor.d/usr.sbin.mysqld</pre>
and make the appropriate mods to the /var/run/mysqld lines at the bottom:
<pre>/var/spool/postfix/var/run/mysqld/mysqld.pid w,<br/>  /var/spool/postfix/var/run/mysqld/mysqld.sock w,<br/>}</pre>
Then reload the apparmor profile
<pre>sudo /etc/init.d/apparmor restart</pre>
</li><li> <b>Start MySQL and Fix Sockets</b> - Remember that <code>/etc/init.d/fix-postfix-chroot</code> init script we installed? MySQL wasn't running when we ran it, so after MySQL starts, we need to run it again.
<pre>sudo /etc/init.d/mysql restart<br/>sudo /etc/init.d/fix-postfix-chroot start<br/>sudo ls -l /var/run/saslauthd /var/run/mysqld</pre>
should give you
<pre>lrwxrwxrwx 1 root root 33 2008-09-29 12:55 /var/run/mysqld -> /var/spool/postfix/var/run/mysqld<br/>lrwxrwxrwx 1 root root 36 2008-09-29 12:55 /var/run/saslauthd -> /var/spool/postfix/var/run/saslauthd</pre>
</li><li> <b>Configure PAM for mail DB</b> - /etc/pam.d/common-mysqlmail is a new PAM file, to include in other service files.
<pre>sudo apt-get install libpam-mysql<br/>sudo vi /etc/pam.d/common-mysqlmail</pre>
Then copy the following into this new file, updating the mysql mail user password from changeme:
<pre>#<br/># MySQL Web-Cyradm mail database authorization<br/>#<br/>auth sufficient pam_mysql.so user=mail passwd=changeme host=localhost db=mail table=accountuser usercolumn=username passwdcolumn=password crypt=1 logtable=log logmsgcolumn=msg logusercolumn=user loghostcolumn=host logpidcolumn=pid logtimecolumn=time<br/><br/>account required pam_mysql.so user=mail passwd=changeme host=localhost db=mail table=accountuser usercolumn=username passwdcolumn=password crypt=1 logtable=log logmsgcolumn=msg logusercolumn=user loghostcolumn=host logpidcolumn=pid logtimecolumn=time</pre>
</li><li> <b>Update PAM services</b> - To use the MySQL mail auth
<pre>sudo vi /etc/pam.d/imap /etc/pam.d/pop /etc/pam.d/sieve</pre>
In each of these files, comment out the <code>@include common-auth</code> and <code>@include common-account</code> lines. Add a <code>@include common-mysqlmail</code> below them. The last 3 lines should read
<pre>#@include common-auth<br/>#@include common-account<br/>@include common-mysqlmail</pre>
Add those same 3 lines to a new PAM file, <code>/etc/pam.d/smtp</code>
<pre>sudo vi /etc/pam.d/smtp</pre>
</li><li> <b>Configure Postfix for mail DB</b>
<pre>sudo apt-get install postfix-mysql</pre>
</li><li> <b>Update main.cf</b>
<pre>sudo vi /etc/postfix/main.cf</pre>
<p class="note"><img src="http://morison.biz/technotes/skins/technotes2/icons/codes/note.gif" width="10" height="10" alt="" /> The setting for <code>virtual_mailbox_maps</code> below is <b>critical</b> to avoid getting tagged as a spammer due to <a href="http://en.wikipedia.org/wiki/Outscatter" title="Browse in a new window" class="external" onclick="window.open(this.href); return false;" onkeypress="window.open(this.href); return false;">backscatter spam</a>.</p>
and at the bottom add the lines
<pre># Mysql glue<br/>virtual_alias_maps =<br/>        mysql:/etc/postfix/mysql-virtual.cf<br/>virtual_mailbox_maps = <br/>        mysql:/etc/postfix/mysql-virtual.cf<br/>virtual_mailbox_domains =<br/>        mysql:/etc/postfix/mysql-mydestination.cf<br/>sender_canonical_maps =<br/>        mysql:/etc/postfix/mysql-canonical.cf</pre>
<p class="note"><img src="http://morison.biz/technotes/skins/technotes2/icons/codes/note.gif" width="10" height="10" alt="" /> The following 3 MySQL scripts are from <a href="http://www.delouw.ch/linux/Postfix-Cyrus-Web-cyradm-HOWTO/html/postfix-config.html" title="Browse in a new window" class="external" onclick="window.open(this.href); return false;" onkeypress="window.open(this.href); return false;">http://www.delouw.ch/linux/Postfix-Cyrus-Web-cyradm-HOWTO/html/postfix-config.html</a> here.</p>
</li><li> <b>Create <code>/etc/postfix/mysql-virtual.cf</code> </b>
<pre>sudo vi /etc/postfix/mysql-virtual.cf</pre>
...adding the following and setting "changeme" to the MySQL mail user password:
<pre>#<br/># mysql config file for alias lookups on postfix<br/># comments are ok.<br/>#<br/><br/># the user name and password to log into the mysql server<br/>hosts = localhost<br/>user = mail<br/>password = changeme<br/><br/># the database name on the servers<br/>dbname = mail<br/><br/># the table name<br/>table = virtual<br/><br/>#<br/>select_field = dest<br/>where_field = alias<br/>additional_conditions = and status = '1'</pre>
</li><li> <b>Create <code>/etc/postfix/mysql-mydestination.cf</code> </b>
<pre>sudo vi /etc/postfix/mysql-mydestination.cf</pre>
...adding the following and setting "changeme" to the MySQL mail user password:
<pre># mysql config file for local domain (like sendmail's sendmail.cw) lookups on postfix<br/># comments are ok.<br/>#<br/><br/># the user name and password to log into the mysql server<br/>hosts = localhost<br/>user = mail<br/>password = changeme<br/><br/># the database name on the servers<br/>dbname = mail<br/><br/># the table name<br/>table = domain<br/>#<br/>select_field = domain_name<br/>where_field = domain_name</pre>
</li><li> <b>Create <code>/etc/postfix/mysql-canonical.cf</code> </b>
<pre>sudo vi /etc/postfix/mysql-canonical.cf</pre>
...adding the following and setting "changeme" to the MySQL mail user password:
<pre># mysql config file for canonical lookups on postfix<br/># comments are ok.<br/>#<br/><br/># the user name and password to log into the mysql server<br/>hosts = localhost<br/>user = mail<br/>password = changeme<br/><br/># the database name on the servers<br/>dbname = mail<br/><br/># the table name<br/>table = virtual<br/>#<br/>select_field = alias<br/>where_field = username<br/># Return the first match only<br/>additional_conditions = and status = '1' limit 1</pre>
</li><li> <b>Restart postfix</b> - ...and make sure it started clean.
<pre>sudo /etc/init.d/postfix restart<br/>tail /var/log/mail.log</pre></li></ol>
<h2 id="title_4" >Update Cyrus &amp; Saslauthd configs</h2>
As presently configured, Cyrys &amp; Saslauthd expect to work with simple usernames, not <script type="text/javascript">document.write('<a href="' + 'mailto:user' + '@' + 'domain' + '" class="email" title="Send a message">' + 'Send a message' + '</a>')</script><noscript><p>Please enable JavaScript to see this address</p></noscript> type addresses. For them to work together, and with the PAM to mail db link, the following is needed:
<ol class="1"><li> <b>/etc/default/saslauthd</b> - Add a -r flag to the last line, so that it reads:
<pre>OPTIONS="-r -c -m /var/spool/postfix/var/run/saslauthd"</pre>
</li><li> <b>/etc/imapd.conf</b> - Scroll down to the <code>virtdomains</code> setting and uncomment the line so it reads
<pre>virtdomains: userid</pre>
</li><li> Restart cyrus &amp; saslauthd
<pre>sudo /etc/init.d/saslauthd restart<br/>sudo /etc/init.d/cyrus2.2 restart</pre></li></ol>
<h2 id="title_5" >Web-Cyradm</h2>
Finally, install and config the webapp. <b>You will need the 0.5.5 version</b> as of this writing. Only this (and perhaps upcoming) versions work correctly with Cyrus's virtdomain feature. Get it from <a href="http://www.web-cyradm.org/web-cyradm-svn-0.5.5.tar.gz_" title="Browse in a new window" class="external" onclick="window.open(this.href); return false;" onkeypress="window.open(this.href); return false;">the source</a>, or there's a copy here: <a href="http://morison.biz/technotes/files/6-web-cyradm-svn-0-5-5-tar.gz" title="View file details" class="file">Web-Cyradm 0.5.5 tarball</a>
<ol class="1"><li> <b>Place Web-Cyradm</b>
<pre>wget http://www.web-cyradm.org/web-cyradm-svn-0.5.5.tar.gz<br/>cd /var/www<br/>sudo tar xzf ~/web-cyradm-svn-0.5.5.tar.gz</pre>
</li><li> <b>Put Passwords in SQL Init Scripts</b>
<pre>cd web-cyradm-svn-0.5.5/<br/>sudo vi scripts/insertuser_mysql.sql<br/>sudo vi scripts/create_mysql.sql</pre>
</li><li> <b><code>insertuser_mysql.sql</code>, line 2</b> - change the 'secret' text on line 2 to the password for the MySQL mail db user. This line creates that user with that password.
</li><li> <b><code>create_mysql.sql</code>, line 135</b> - change 'test' at line 135 to the password for the Web-Cyradm admin account (not the cyrus account, btw.) This will be your first login id for Web-Cyradm when you browse to it, i.e., admin/adminpassword. This line creates that user with that password.
</li><li> <b><code>create_mysql.sql</code>, line 137</b> - change 'secret' to the password for the cyrus user in the Web-Cyradm 'mail' database. This password will be used in the Web-Cyradm config (covered later.) This line creates that user with that password.
</li><li> <b>Run SQL init scripts</b> - You'll need your MySQL root password for the first command, and your MySQL mail db password for the second.
<pre>mysql -u root -p &amp;lt;scripts/insertuser_mysql.sql<br/>mysql mail -u mail -p &amp;lt;scripts/create_mysql.sql</pre>
</li><li> <b>Web-Cyradm App Config</b>
<pre>cd /var/www/web-cyradm-svn-0.5.5/config<br/>sudo cp conf.php.dist conf.php<br/>sudo vi conf.php</pre>
and edit the following
</li><li> <b><code>conf.php</code>, line 19</b> - replace <code>secret</code> with the cyrus password (see <code>create_mysql.sql</code>, line 137).
</li><li> <b><code>conf.php</code>, line 37</b> - replace <code>secret</code> with the mysql mail password (see <code>insertuser_mysql.sql</code>, line 2).
</li><li> <b><code>conf.php</code>, line 89</b>, set <code>$DOMAIN_AS_PREFIX = 1</code>
</li><li> <b><code>conf.php</code>, line 100</b>, set <code>$FQUN = 1</code></li></ol>
<h2 id="title_6" >Mailadmin Site Config</h2>
Almost ready to browse. We just need to tell Apache some things about the site and turn it on.
<ol class="1"><li> <b>Get the <a href="http://morison.biz/technotes/files/7-mailadmin.conf" title="View file details" class="file">Apache mailadmin config file</a> File</b> - ...install and enable
<pre>sudo wget http://morison.biz/technotes/file-fetch/7-mailadmin.conf<br/>sudo cp 7-mailadmin.conf /etc/apache2/sites-available/mailadmin<br/>sudo a2ensite mailadmin<br/>sudo /etc/init.d/apache2 restart</pre>
</li><li> <b>Browse and Login</b> - with the admin password (from <code>create_mysql.sql</code>, line 135) to <a href="http://mailserver.example.domain/mailadmin" title="Browse in a new window" class="external" onclick="window.open(this.href); return false;" onkeypress="window.open(this.href); return false;">http://mailserver.example.domain/mailadmin</a></li></ol>
<h2 id="title_7" >Create a Domain, Email Account &amp; Test</h2>
If you've successfully browsed and logged in to your mailadmin site you should be looking at:<br />
<br />
<span class="frame_image"><span><img src="http://morison.biz/technotes/images/article/45/Web-CyradmInstall-02.png" alt="Web-Cyradm Browse Domains Screen"  title="Web-Cyradm Browse Domains Screen"http://morison.biz/></span><span class="image_caption">Web-Cyradm Browse Domains Screen</span></span>
<ol class="1"><li> <b>Add a Domain</b> - Click on the "Add New Domain" link. In this form be sure to update "Domainname", "Maximum Accounts" (or your account limit for the domain will be zero) and "Standard Folders". "Standard Folders is important, to create the default folders most mail clients expect. This field should read
<pre>Drafts,Sent,Junk,Trash</pre><br />
<br />
Set the "Default Quota" up or down, as you require and submit the form. Your form should look something like (modified fields circled in red)<br />
<br />
<span class="frame_image"><span><img src="http://morison.biz/technotes/images/article/45/Web-CyradmInstall-03.png" alt="Web-Cyradm Add New Domain Screen"  title="Web-Cyradm Add New Domain Screen"http://morison.biz/></span><span class="image_caption">Web-Cyradm Add New Domain Screen</span></span>
</li><li> <b>Create an Account</b> - from the Browse Domains screen, click "accounts" in the domain list.
</li><li> <b>Test</b> - Tail the mail log, send email to/from the account, retrieve it via imap and/or pop, and reply (with your favorite mail client.) Try with and without TLS.
<pre>tail -f /var/log/mail.log</pre>
you should see something like
<pre>Sep 29 13:03:07 mailserver postfix/smtpd[5639]: connect from unknown[192.168.66.194]<br/>Sep 29 13:03:07 mailserver postfix/smtpd[5639]: 8BB0B245F2: client=unknown[192.168.66.194], sasl_method=PLAIN, sasl_username=test@mailserver.morison.org<br/>Sep 29 13:03:07 mailserver postfix/cleanup[5645]: 8BB0B245F2: message-id=&amp;lt;48E1345C.7020804@mailserver.morison.org><br/>Sep 29 13:03:07 mailserver postfix/qmgr[4654]: 8BB0B245F2: from=&amp;lt;test@mailserver.morison.org>, size=564, nrcpt=1 (queue active)<br/>Sep 29 13:03:07 mailserver cyrus/lmtpunix[5657]: accepted connection<br/>Sep 29 13:03:07 mailserver cyrus/lmtpunix[5657]: lmtp connection preauth'd as postman<br/>Sep 29 13:03:07 mailserver cyrus/lmtpunix[5657]: WARNING: sieve script /var/spool/cyrus/sieve/domain/m/mailserver.morison.org/t/test/defaultbc doesn't exist: No such file or directory<br/>Sep 29 13:03:07 mailserver cyrus/lmtpunix[5657]: duplicate_check: &amp;lt;48E1345C.7020804@mailserver.morison.org> mailserver.morison.org!user.test 0<br/>Sep 29 13:03:07 mailserver postfix/smtpd[5639]: disconnect from unknown[192.168.66.194]<br/>Sep 29 13:03:07 mailserver cyrus/lmtpunix[5657]: duplicate_check: &amp;lt;48E1345C.7020804@mailserver.morison.org> mailserver.morison.org!user.test 0<br/>Sep 29 13:03:07 mailserver cyrus/lmtpunix[5657]: mystore: starting txn 2147483660<br/>Sep 29 13:03:07 mailserver cyrus/lmtpunix[5657]: mystore: committing txn 2147483660<br/>Sep 29 13:03:07 mailserver cyrus/lmtpunix[5657]: duplicate_mark: &amp;lt;48E1345C.7020804@mailserver.morison.org> mailserver.morison.org!user.test 1222718587 2<br/>Sep 29 13:03:07 mailserver cyrus/lmtpunix[5657]: Delivered: &amp;lt;48E1345C.7020804@mailserver.morison.org> to mailbox: mailserver.morison.org!user.test<br/>Sep 29 13:03:07 mailserver postfix/lmtp[5649]: 8BB0B245F2: to=&amp;lt;test@mailserver.morison.org>, relay=mailserver.morison.org[/var/run/cyrus/socket/lmtp], delay=0.2, delays=0.09/0/0.01/0.1, dsn=2.1.5, status=sent (250 2.1.5 Ok)<br/>Sep 29 13:03:07 mailserver postfix/qmgr[4654]: 8BB0B245F2: removed</pre></li></ol>
<h2 id="title_8" >You're Up and Running!</h2>
Next up, <a href="http://morison.biz/technotes/articles/46" title="Read the article" class="article">Anti-Spam &amp; Anti-Virus Install</a></body>
		<dc:creator>rod</dc:creator>
		<pubDate>Mon, 18 Oct 2010 15:54:20 GMT</pubDate>
		<comments>http://morison.biz/technotes/articles/45#comments</comments>
		<slash:comments>3</slash:comments>
		<wfw:comment>http://morison.biz/technotes/comments/post.php/article/45</wfw:comment>
		<wfw:commentRss>http://morison.biz/technotes/comments/feed.php/article/45</wfw:commentRss>
		<trackback:ping>http://morison.biz/technotes/links/trackback.php?anchor=article:45</trackback:ping>
	</item>

</channel>
</rss>
