<?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>Create Blog &#187; Comet</title>
	<atom:link href="http://create.tpsitulsa.com/blog/category/comet/feed/" rel="self" type="application/rss+xml" />
	<link>http://create.tpsitulsa.com/blog</link>
	<description>the create framework blog</description>
	<lastBuildDate>Sat, 30 Jan 2010 20:08:19 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0</generator>
		<item>
		<title>Roots Deliver Nutrients</title>
		<link>http://create.tpsitulsa.com/blog/2009/12/07/roots-deliver-nutrients/</link>
		<comments>http://create.tpsitulsa.com/blog/2009/12/07/roots-deliver-nutrients/#comments</comments>
		<pubDate>Mon, 07 Dec 2009 21:14:06 +0000</pubDate>
		<dc:creator>Alex Iskander</dc:creator>
				<category><![CDATA[Code]]></category>
		<category><![CDATA[Comet]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[Script]]></category>
		<category><![CDATA[SproutCore]]></category>

		<guid isPermaLink="false">http://create.tpsitulsa.com/blog/?p=245</guid>
		<description><![CDATA[Push is complex. I tried to figure it out with ActiveMQ, Orbited, and friends awhile back, but it just seemed too complicated. It made me feel like I was not very smart—obviously, some people understand this thing, but I don&#8217;t. I am a bit too prideful, and do not like feeling unintelligent. But I need [...]]]></description>
			<content:encoded><![CDATA[<p>Push is complex. I tried to figure it out with ActiveMQ, Orbited, and friends awhile back, but it just seemed too complicated. It made me feel like I was not very smart—obviously, some people understand this thing, but I don&#8217;t. I am a bit too prideful, and do not like feeling unintelligent.</p>

<p>But I need messaging.</p>

<p>I don&#8217;t care about queuing or persistence. For web applications (what I work on) messages should be delivered as quickly as possible. Any &#8220;queues&#8221; can be in-memory, and any message should not remain in a queue for more than a minute—if the client was disconnected for any duration, it would likely be better off re-downloading that receiving incremental updates.</p>

<p>So, whatever these <em>systems</em> do, they seem too complicated (I could be wrong—as I said, I have trouble understanding them).</p>

<p>My requirements:</p>

<ul>
    <li><strong>Normal Authentication</strong>. Clients should go through the &#8220;normal&#8221; web app to subscribe to events.</li>
    <li><strong>Easy</strong>. It should be very simple and easy to understand.</li>
    <li><strong>Quick</strong>. I should be able to add Comet to an app in ten to fifteen minutes, maximum.</li>
</ul>

<p>I found out that it is not only possible to write messaging servers on one&#8217;s own—it is relatively easy. So I wrote one.</p>

<p>I&#8217;ll stop the backstory here, though there is plenty more—tell me if you want any of the boring details about Dolores and the rest.</p>

<h3>Roots</h3>

<p>Roots—codenamed Dobby after the Harry Potter character—is a messaging server that has a built-in long-polling server (among several other things).</p>

<p>Roots is made up of many small message-passing pieces. They plug together, just like Lego pieces. Each piece is simple, and the connection between the pieces are even simpler: a single function, called &#8220;update.&#8221;</p>

<p>If you are interested, I&#8217;ll go over that more thoroughly in &#8220;Implementation.&#8221;</p>

<h3>How Roots is Used</h3>

<p><strong>Above All, Roots is Easy.</strong></p>

<p>It takes me about fifteen minutes to use Roots to add push to a SproutCore application (starting with a fresh clone of Roots—which, by the way, does not need any configuration for testing). It <em>should</em> only take me five minutes, but I am often a bit slow of a coder.</p>

<p><strong>There is a brief semi-tutorial <a href="http://github.com/ialexi/dobby">on GitHub</a>.</strong> The following is based on that tutorial, but has some extra background information.</p>

<p>So, a bird&#8217;s-eye view: unless you implement the server-side <em>in</em> Roots itself, you will have three components in any application: <strong>back-end</strong> (Rails, Django, etc.), <strong>front-end</strong> (SproutCore), and Roots.</p>

<ul>
    <li>Client—such as Pomona, the SproutCore framework for Roots) connects to a Roots server.</li>
    <li>Roots sends the client (Pomona) an id.</li>
    <li>
        The client calls predefined URL to connect to events.
        <ul>
            <li>The URLs are part of the back-end (Django, etc.)</li>
            <li>The ID is sent with these requests.</li>
            <li>Clients (Pomona) usually will keep track of what server-side events you are listening to and can reconnect automatically if the Dobby connection is interrupted—you just provide the client with the URLs and the events to listen to.</li>
        </ul>
    </li>
    <li>Back-end tells Roots to connect client to events—and can perform any authorization it wishes.</li>
    <li>Back-end sends updates to Roots.</li>
    <li>Client receives notifications—everyone&#8217;s Happy!!!</li>
</ul>

<h3>What You Do (for SproutCore)</h3>

<p>You don&#8217;t have to do much:</p>

<ol>
    <li>Add <a href="http://github.com/ialexi/pomona">Pomona</a> to your SproutCore project.</li>
    <li>Add a Roots connector to your server-side project:
        <ul>
        <li><a href="http://github.com/ialexi/cornelius">Cornelius for Python</a></li>
        <li>Others as I add them (I plan Ruby and PHP)</li>
        <li>Implement your own (the Python version of the better protocol—Dudley—is 45 lines counting whitespace and comments).</li>
        </ul>
    </li>
    <li>&#8220;Update&#8221; Roots (call update(path, message) from your back-end—Django has handy model post-save signals you can use).</li>
    <li>Add some URLs to your back-end that connect clients.
        <ul>
        <li>URLs accept client ID in them (/my/connect/AN_ID_HERE or /my/connect.src?id=AN_ID_HERE)</li>
        <li>URLs should accept POST of a simple JSON array of path/event names.</li>
        <li>For each path/event/whatever you want to call it, call connect(id, path) on your Roots connector.</li>
    </li>
    <li>Initialize Pomona and connect to Roots in your SproutCore Data Source.</li>
    <li>Accept incoming data!</li>
</ol>

<p>A more detailed tutorial is <a href="http://github.com/ialexi/dobby">here on GitHub</a> with the rest of Dobby (Roots).</p>

<p><del datetime="2009-12-16T22:53:44+00:00"><strong>Open Question</strong>: Would anyone like a tutorial on setting up a Django back-end for the SproutCore <a href="http://wiki.sproutcore.com/Todos%C2%A0Intro">Todos</a> tutorial, with an extra step of adding Comet at the end?</del> <a href="http://create.tpsitulsa.com/blog/2009/12/11/sc-todos-django-comet/">Done!</a></p>

<h4>Implementation</h4>

<p>Roots/Dobby is currently written in Python. I am working on a rewrite in <a href="http://nodejs.org/">node.js</a>, because node.js is <em>super cool</em>—and, secondarily, it means that some of the same code used in the server (for instance, the message dispatch code) could be used on the client.</p>

<p>Roots has many small parts that hook together in a very simple way. At Roots&#8217;s core is Thestral, a simple interface that requires implementors to do two things: have an id and implement a single method: update(sender, path, message)—where sender is an originator, path is an event name, and message is some data to send.</p>

<p>Here are some of the components:</p>

<ul>
<li><strong>Dolores</strong>: This is the main controller. It assigns IDs to all Thestral instances. It itself is a Thestral instance, and sends its updates to &#8220;delegates&#8221;.</li>
<li><strong>Pig</strong>: An &#8220;Owl,&#8221; or, really, a dispatcher; it knows who receives what message. It is often one of Dolores&#8217;s delegates. Specially-formed messages, tell it to connect certain Thestral ids with certain events—for instance, the event &#8220;::connect&#8221; with message &#8220;12345->my/data&#8221; would connect Thestral &#8220;12345&#8243; to &#8220;my/data&#8221;.</li>
<li><strong>Imperio</strong>. A somewhat pathetic text-based protocol, with accompanying receiver server (a bit like Dudley, which should be used instead). In addition to reading from a server, Imperio supports writing to anything with a write() method, and as such, is used for logging as a delegate of Dolores.</li>
<li><strong>Dudley</strong>. Dudley is not a delegate of Dolores. Rather, Dolores can be its &#8220;delegate&#8221; (or, in this case, &#8220;receiver&#8221;). Dudley is an HTTP server, and receives messages over HTTP and funnels them to a receivers (Thestral implementation), and Dolores is its default receiver.</li>
<li><strong>Firenze.</strong> Firenze, like Dudley, is an HTTP server; but instead of being a receiving server, it is a long-polling push server. It is not usually Dolores&#8217;s delegate—you don&#8217;t want every client to get every message. Instead, Firenze merely registers itself with Dolores to get an ID, and lets others register it (for instance, a client could send Dudley a message, which, through Dolores, would be received by Pig to make the connection).</li>
</ul>

<p>Above all, it is simple. The longest of these pieces is Firenze, at 280 lines of code (50 of which are intro comments I used to explain it to myself and spec it while planning).</p>

<h3>That&#8217;s All!</h3>

<p>I hope you find this helpful. I am excited about porting Roots to node.js; progress is somewhat slow, as I am quite busy (I am a student, and finals for all four classes tomorrow!)</p>

<p>What I am most looking forward to is how Pig (the dispatcher) could use the same code in both the client (Pomona) and the server—the routing is quite similar; in one case, you want to route to handlers/callbacks, in the other, to update functions on Thestral instances—pretty similar; even identical.</p>

<p>I am also looking forward to experimenting with two-way push, where all data is transferred through push—completely eradicating the expectation of a response to a request, and providing only a single receive/send code path on both client and server.</p>

<p>Anyway, I think this is all super cool. :)</p>

<p><strong><em>Thanks to Endash for the nice title. :)</em></strong>
<strong>Roots (called Dobby in development) is <a href="http://github.com/ialexi/dobby">available on GitHub.</a></strong></p>

<p><strong>P.S. I like the name Dobby, but Roots is better P.R.</strong></p>
]]></content:encoded>
			<wfw:commentRss>http://create.tpsitulsa.com/blog/2009/12/07/roots-deliver-nutrients/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>Running Orbited (or other Twisted Services) as a Windows Service</title>
		<link>http://create.tpsitulsa.com/blog/2009/08/04/running-orbited-or-other-twisted-services-as-a-service/</link>
		<comments>http://create.tpsitulsa.com/blog/2009/08/04/running-orbited-or-other-twisted-services-as-a-service/#comments</comments>
		<pubDate>Tue, 04 Aug 2009 14:47:15 +0000</pubDate>
		<dc:creator>Alex Iskander</dc:creator>
				<category><![CDATA[Code]]></category>
		<category><![CDATA[Comet]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[Script]]></category>
		<category><![CDATA[Web]]></category>

		<guid isPermaLink="false">http://create.tpsitulsa.com/blog/?p=185</guid>
		<description><![CDATA[It took me awhile to figure out how to run Orbited and Dolores as Windows Services. Unfortunately, while I love Mac, almost every other computer at my workplace is Windows, including the servers. When deploying my web application, I can&#8217;t really just leave instructions like: &#8220;When you restart the server, please run these two scripts.&#8221; [...]]]></description>
			<content:encoded><![CDATA[<p>It took me awhile to figure out how to run <a href="http://orbited.org">Orbited</a> and <a href="http://create.tpsitulsa.com/blog/2009/08/04/dolores/">Dolores</a> as Windows Services. Unfortunately, while I love Mac, almost every other computer at my workplace is Windows, including the servers. When deploying my web application, I can&#8217;t really just leave instructions like: &#8220;When you restart the server, please run these two scripts.&#8221;</p>

<p>They need to be Windows Services.</p>

<p>Thankfully, it isn&#8217;t actually too hard. You just need a couple of Python packages (which I actually don&#8217;t remember installing, so they may have come with Twisted or Python), and then all you have to do is write a couple of very simple scripts. Here are mine:</p>

<p><strong>Orbited Service</strong></p>


<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #ff7700;font-weight:bold;">import</span> OrbitedManager <span style="color: #808080; font-style: italic;"># a copy of orbited.start with some very minor modifications, which I'll include after the break</span>
<span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #dc143c;">time</span>
&nbsp;
<span style="color: #808080; font-style: italic;"># Service Utilities</span>
<span style="color: #ff7700;font-weight:bold;">import</span> win32serviceutil
<span style="color: #ff7700;font-weight:bold;">import</span> win32service
<span style="color: #ff7700;font-weight:bold;">import</span> win32event
&nbsp;
<span style="color: #ff7700;font-weight:bold;">class</span> WindowsService<span style="color: black;">&#40;</span>win32serviceutil.<span style="color: black;">ServiceFramework</span><span style="color: black;">&#41;</span>:
	_svc_name_ = <span style="color: #483d8b;">&quot;Orbited&quot;</span>
	_svc_display_name_ = <span style="color: #483d8b;">&quot;Orbited Server&quot;</span>
&nbsp;
	<span style="color: #ff7700;font-weight:bold;">def</span> <span style="color: #0000cd;">__init__</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, args<span style="color: black;">&#41;</span>:
		win32serviceutil.<span style="color: black;">ServiceFramework</span>.<span style="color: #0000cd;">__init__</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, args<span style="color: black;">&#41;</span>
		<span style="color: #008000;">self</span>.<span style="color: black;">hWaitStop</span> = win32event.<span style="color: black;">CreateEvent</span><span style="color: black;">&#40;</span><span style="color: #008000;">None</span>, <span style="color: #ff4500;">0</span>, <span style="color: #ff4500;">0</span>, <span style="color: #008000;">None</span><span style="color: black;">&#41;</span>
&nbsp;
	<span style="color: #ff7700;font-weight:bold;">def</span> SvcStop<span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:
		<span style="color: #008000;">self</span>.<span style="color: black;">ReportServiceStatus</span><span style="color: black;">&#40;</span>win32service.<span style="color: black;">SERVICE_STOP_PENDING</span><span style="color: black;">&#41;</span>
		win32event.<span style="color: black;">SetEvent</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>.<span style="color: black;">hWaitStop</span><span style="color: black;">&#41;</span>
&nbsp;
	<span style="color: #ff7700;font-weight:bold;">def</span> SvcDoRun<span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:
		<span style="color: #ff7700;font-weight:bold;">import</span> servicemanager
		OrbitedManager.<span style="color: black;">start</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
		<span style="color: #ff7700;font-weight:bold;">while</span> <span style="color: #008000;">True</span>:
			retval = win32event.<span style="color: black;">WaitForSingleObject</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>.<span style="color: black;">hWaitStop</span>, <span style="color: #ff4500;">10</span><span style="color: black;">&#41;</span>
			<span style="color: #ff7700;font-weight:bold;">if</span> <span style="color: #ff7700;font-weight:bold;">not</span> retval == win32event.<span style="color: black;">WAIT_TIMEOUT</span>:
				OrbitedManager.<span style="color: black;">stop</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
				<span style="color: #ff7700;font-weight:bold;">break</span>
				<span style="color: #dc143c;">time</span>.<span style="color: black;">sleep</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">5.0</span><span style="color: black;">&#41;</span>
&nbsp;
&nbsp;
<span style="color: #ff7700;font-weight:bold;">if</span> __name__==<span style="color: #483d8b;">'__main__'</span>:
	win32serviceutil.<span style="color: black;">HandleCommandLine</span><span style="color: black;">&#40;</span>WindowsService<span style="color: black;">&#41;</span></pre></div></div>


<p><strong>Dolores Service</strong></p>


<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #ff7700;font-weight:bold;">import</span> Dolores
<span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #dc143c;">time</span>
&nbsp;
<span style="color: #808080; font-style: italic;"># Service Utilities</span>
<span style="color: #ff7700;font-weight:bold;">import</span> win32serviceutil
<span style="color: #ff7700;font-weight:bold;">import</span> win32service
<span style="color: #ff7700;font-weight:bold;">import</span> win32event
&nbsp;
<span style="color: #ff7700;font-weight:bold;">class</span> WindowsService<span style="color: black;">&#40;</span>win32serviceutil.<span style="color: black;">ServiceFramework</span><span style="color: black;">&#41;</span>:
	_svc_name_ = <span style="color: #483d8b;">&quot;Dolores&quot;</span>
	_svc_display_name_ = <span style="color: #483d8b;">&quot;Dolores Server&quot;</span>
&nbsp;
	<span style="color: #ff7700;font-weight:bold;">def</span> <span style="color: #0000cd;">__init__</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, args<span style="color: black;">&#41;</span>:
		win32serviceutil.<span style="color: black;">ServiceFramework</span>.<span style="color: #0000cd;">__init__</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, args<span style="color: black;">&#41;</span>
		<span style="color: #008000;">self</span>.<span style="color: black;">hWaitStop</span> = win32event.<span style="color: black;">CreateEvent</span><span style="color: black;">&#40;</span><span style="color: #008000;">None</span>, <span style="color: #ff4500;">0</span>, <span style="color: #ff4500;">0</span>, <span style="color: #008000;">None</span><span style="color: black;">&#41;</span>
&nbsp;
	<span style="color: #ff7700;font-weight:bold;">def</span> SvcStop<span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:
		<span style="color: #008000;">self</span>.<span style="color: black;">ReportServiceStatus</span><span style="color: black;">&#40;</span>win32service.<span style="color: black;">SERVICE_STOP_PENDING</span><span style="color: black;">&#41;</span>
		win32event.<span style="color: black;">SetEvent</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>.<span style="color: black;">hWaitStop</span><span style="color: black;">&#41;</span>
&nbsp;
	<span style="color: #ff7700;font-weight:bold;">def</span> SvcDoRun<span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:
		<span style="color: #ff7700;font-weight:bold;">import</span> servicemanager
		Dolores.<span style="color: black;">start</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
		<span style="color: #ff7700;font-weight:bold;">while</span> <span style="color: #008000;">True</span>:
			retval = win32event.<span style="color: black;">WaitForSingleObject</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>.<span style="color: black;">hWaitStop</span>, <span style="color: #ff4500;">10</span><span style="color: black;">&#41;</span>
			<span style="color: #ff7700;font-weight:bold;">if</span> <span style="color: #ff7700;font-weight:bold;">not</span> retval == win32event.<span style="color: black;">WAIT_TIMEOUT</span>:
				Dolores.<span style="color: black;">stop</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
				<span style="color: #ff7700;font-weight:bold;">break</span>
				<span style="color: #dc143c;">time</span>.<span style="color: black;">sleep</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">5.0</span><span style="color: black;">&#41;</span>
&nbsp;
&nbsp;
<span style="color: #ff7700;font-weight:bold;">if</span> __name__==<span style="color: #483d8b;">'__main__'</span>:
	win32serviceutil.<span style="color: black;">HandleCommandLine</span><span style="color: black;">&#40;</span>WindowsService<span style="color: black;">&#41;</span></pre></div></div>


<p>That&#8217;s the basics, but as you may have noticed, I also changed Orbited&#8217;s start script. I did this because the original did not play nicely with threads.</p>

<p>Instead of changing it in its original location in the filesystem, I created a copy of it in the local directory (as you can see, I&#8217;m <em>not</em> importing Orbited.OrbitedManager).</p>

<p><span id="more-185"></span>
Before overwhelming you with a wall of code, I&#8217;ll explain what I changed. It is actually quite simple:</p>

<ol>
    <li>First, some imports at the top:


<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #ff7700;font-weight:bold;">import</span> orbited
<span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #dc143c;">threading</span>
<span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #dc143c;">time</span></pre></div></div>


</li>
    <li>Since the file is no longer &#8220;start.py&#8221; in the Orbited package directory, the static files path needs changing (just find the line and change it):


<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;">static_files = static.<span style="color: black;">File</span><span style="color: black;">&#40;</span><span style="color: #dc143c;">os</span>.<span style="color: black;">path</span>.<span style="color: black;">join</span><span style="color: black;">&#40;</span><span style="color: #dc143c;">os</span>.<span style="color: black;">path</span>.<span style="color: black;">dirname</span><span style="color: black;">&#40;</span>orbited.__path__<span style="color: black;">&#91;</span><span style="color: #ff4500;">0</span><span style="color: black;">&#93;</span><span style="color: black;">&#41;</span>, <span style="color: #483d8b;">'orbited/static'</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span></pre></div></div>



</li>
<li>And, since we&#8217;re going to start the reactor manually, we need to <strong>remove</strong> the auto-start portion:


<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #808080; font-style: italic;"># REMOVE THIS PART:</span>
    <span style="color: #ff7700;font-weight:bold;">if</span> options.<span style="color: #dc143c;">profile</span>:
        <span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #dc143c;">hotshot</span>
        prof = <span style="color: #dc143c;">hotshot</span>.<span style="color: black;">Profile</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;orbited.profile&quot;</span><span style="color: black;">&#41;</span>
        logger.<span style="color: black;">info</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;running Orbited in profile mode&quot;</span><span style="color: black;">&#41;</span>
        logger.<span style="color: black;">info</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;for information on profiler, see http://orbited.org/wiki/Profiler&quot;</span><span style="color: black;">&#41;</span>
        prof.<span style="color: black;">runcall</span><span style="color: black;">&#40;</span>reactor.<span style="color: black;">run</span><span style="color: black;">&#41;</span>
        prof.<span style="color: black;">close</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
    <span style="color: #ff7700;font-weight:bold;">else</span>:
        reactor.<span style="color: black;">run</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span></pre></div></div>



</li>

    <li>Finally, I added a bit to the bottom, replacing the lines that call &#8220;main()&#8221;. It arranges to run Orbited (or any Twisted service) in a separate thread:


<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #ff7700;font-weight:bold;">def</span> thread_start<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>:
	main<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span> <span style="color: #808080; font-style: italic;"># initializes the reactor</span>
	<span style="color: #ff7700;font-weight:bold;">from</span> twisted.<span style="color: black;">internet</span> <span style="color: #ff7700;font-weight:bold;">import</span> reactor
	reactor.<span style="color: black;">run</span><span style="color: black;">&#40;</span>installSignalHandlers=<span style="color: #ff4500;">0</span><span style="color: black;">&#41;</span>
	<span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #483d8b;">&quot;Crashed into Earth's Surface.&quot;</span>
&nbsp;
orbited_thread = <span style="color: #008000;">None</span>
<span style="color: #ff7700;font-weight:bold;">def</span> start<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>:
	<span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #483d8b;">&quot;Starting Orbited...&quot;</span>
	orbited_thread = <span style="color: #dc143c;">threading</span>.<span style="color: black;">Thread</span><span style="color: black;">&#40;</span>target=thread_start<span style="color: black;">&#41;</span>
	orbited_thread.<span style="color: black;">start</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
	<span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #483d8b;">&quot;In Orbit.&quot;</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">def</span> stop_reactor<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>:
	reactor.<span style="color: black;">stop</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">def</span> stop<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>:
	reactor.<span style="color: black;">callFromThread</span><span style="color: black;">&#40;</span>stop_reactor<span style="color: black;">&#41;</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">if</span> __name__ == <span style="color: #483d8b;">&quot;__main__&quot;</span>:
	start<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
	run = <span style="color: #008000;">True</span>
	<span style="color: #ff7700;font-weight:bold;">while</span> run:
		<span style="color: #ff7700;font-weight:bold;">try</span>:
			<span style="color: #dc143c;">time</span>.<span style="color: black;">sleep</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">5</span><span style="color: black;">&#41;</span>
		<span style="color: #ff7700;font-weight:bold;">except</span> <span style="color: #008000;">KeyboardInterrupt</span>:
			<span style="color: #ff7700;font-weight:bold;">from</span> twisted.<span style="color: black;">internet</span> <span style="color: #ff7700;font-weight:bold;">import</span> reactor
			stop<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
			run = <span style="color: #008000;">False</span></pre></div></div>



</li></ol>

<p><strong>The Raw OrbitedManager.py File</strong></p>


<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #dc143c;">os</span>
<span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #dc143c;">sys</span>
<span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #dc143c;">urlparse</span>
<span style="color: #ff7700;font-weight:bold;">from</span> orbited <span style="color: #ff7700;font-weight:bold;">import</span> __version__ <span style="color: #ff7700;font-weight:bold;">as</span> version
<span style="color: #ff7700;font-weight:bold;">from</span> orbited <span style="color: #ff7700;font-weight:bold;">import</span> config
<span style="color: #ff7700;font-weight:bold;">from</span> orbited <span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #dc143c;">logging</span>
<span style="color: #ff7700;font-weight:bold;">import</span> orbited
<span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #dc143c;">threading</span>
<span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #dc143c;">time</span>
&nbsp;
<span style="color: #808080; font-style: italic;"># NB: this is set after we load the configuration at &quot;main&quot;.</span>
logger = <span style="color: #008000;">None</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">def</span> _import<span style="color: black;">&#40;</span>name<span style="color: black;">&#41;</span>:
    module_import = name.<span style="color: black;">rsplit</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'.'</span>, <span style="color: #ff4500;">1</span><span style="color: black;">&#41;</span><span style="color: black;">&#91;</span><span style="color: #ff4500;">0</span><span style="color: black;">&#93;</span>
    <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #008000;">reduce</span><span style="color: black;">&#40;</span><span style="color: #008000;">getattr</span>, name.<span style="color: black;">split</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'.'</span><span style="color: black;">&#41;</span><span style="color: black;">&#91;</span><span style="color: #ff4500;">1</span>:<span style="color: black;">&#93;</span>, <span style="color: #008000;">__import__</span><span style="color: black;">&#40;</span>module_import<span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">def</span> _setup_protocols<span style="color: black;">&#40;</span>root<span style="color: black;">&#41;</span>:
    <span style="color: #ff7700;font-weight:bold;">from</span> twisted.<span style="color: black;">internet</span> <span style="color: #ff7700;font-weight:bold;">import</span> reactor
    protocols = <span style="color: black;">&#91;</span>
        <span style="color: #808080; font-style: italic;">#child_path config_key  port_class_import,              factory_class_import</span>
        <span style="color: black;">&#40;</span><span style="color: #483d8b;">'tcp'</span>,     <span style="color: #483d8b;">'proxy'</span>,    <span style="color: #483d8b;">'orbited.cometsession.Port'</span>,    <span style="color: #483d8b;">'orbited.proxy.ProxyFactory'</span><span style="color: black;">&#41;</span>,
    <span style="color: black;">&#93;</span>
    <span style="color: #ff7700;font-weight:bold;">for</span> child_path, config_key, port_class_import, factory_class_import <span style="color: #ff7700;font-weight:bold;">in</span> protocols:
        <span style="color: #ff7700;font-weight:bold;">if</span> config.<span style="color: #008000;">map</span><span style="color: black;">&#91;</span><span style="color: #483d8b;">'[global]'</span><span style="color: black;">&#93;</span>.<span style="color: black;">get</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'%s.enabled'</span> <span style="color: #66cc66;">%</span> config_key<span style="color: black;">&#41;</span> == <span style="color: #483d8b;">'1'</span>:
            port_class = _import<span style="color: black;">&#40;</span>port_class_import<span style="color: black;">&#41;</span>
            factory_class = _import<span style="color: black;">&#40;</span>factory_class_import<span style="color: black;">&#41;</span>
            reactor.<span style="color: black;">listenWith</span><span style="color: black;">&#40;</span>port_class, factory=factory_class<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>, <span style="color: #dc143c;">resource</span>=root, childName=child_path<span style="color: black;">&#41;</span>
            logger.<span style="color: black;">info</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'%s protocol active'</span> <span style="color: #66cc66;">%</span> config_key<span style="color: black;">&#41;</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">def</span> _setup_static<span style="color: black;">&#40;</span>root, config<span style="color: black;">&#41;</span>:
    <span style="color: #ff7700;font-weight:bold;">from</span> twisted.<span style="color: black;">web</span> <span style="color: #ff7700;font-weight:bold;">import</span> static
    <span style="color: #ff7700;font-weight:bold;">for</span> key, val <span style="color: #ff7700;font-weight:bold;">in</span> config<span style="color: black;">&#91;</span><span style="color: #483d8b;">'[static]'</span><span style="color: black;">&#93;</span>.<span style="color: black;">items</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>:
        <span style="color: #ff7700;font-weight:bold;">if</span> key == <span style="color: #483d8b;">'INDEX'</span>:
            key = <span style="color: #483d8b;">''</span>
        <span style="color: #ff7700;font-weight:bold;">if</span> root.<span style="color: black;">getStaticEntity</span><span style="color: black;">&#40;</span>key<span style="color: black;">&#41;</span>:
            logger.<span style="color: black;">error</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;cannot mount static directory with reserved name %s&quot;</span> <span style="color: #66cc66;">%</span> key<span style="color: black;">&#41;</span>
            <span style="color: #dc143c;">sys</span>.<span style="color: black;">exit</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">1</span><span style="color: black;">&#41;</span>
        root.<span style="color: black;">putChild</span><span style="color: black;">&#40;</span>key, static.<span style="color: black;">File</span><span style="color: black;">&#40;</span>val<span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">def</span> main<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>:
    <span style="color: #ff7700;font-weight:bold;">try</span>:
        <span style="color: #ff7700;font-weight:bold;">import</span> twisted
    <span style="color: #ff7700;font-weight:bold;">except</span> <span style="color: #008000;">ImportError</span>:
        <span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #483d8b;">&quot;Orbited requires Twisted, which is not installed. See http://twistedmatrix.com/trac/ for installation instructions.&quot;</span>
        <span style="color: #dc143c;">sys</span>.<span style="color: black;">exit</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">1</span><span style="color: black;">&#41;</span>
&nbsp;
    <span style="color: #808080; font-style: italic;">#################</span>
    <span style="color: #808080; font-style: italic;"># This corrects a bug in Twisted 8.2.0 for certain Python 2.6 builds on Windows</span>
    <span style="color: #808080; font-style: italic;">#   Twisted ticket: http://twistedmatrix.com/trac/ticket/3868</span>
    <span style="color: #808080; font-style: italic;">#     -mario</span>
    <span style="color: #ff7700;font-weight:bold;">try</span>:
        <span style="color: #ff7700;font-weight:bold;">from</span> twisted.<span style="color: black;">python</span> <span style="color: #ff7700;font-weight:bold;">import</span> lockfile
    <span style="color: #ff7700;font-weight:bold;">except</span> <span style="color: #008000;">ImportError</span>:
        <span style="color: #ff7700;font-weight:bold;">from</span> orbited <span style="color: #ff7700;font-weight:bold;">import</span> __path__ <span style="color: #ff7700;font-weight:bold;">as</span> orbited_path
        <span style="color: #dc143c;">sys</span>.<span style="color: black;">path</span>.<span style="color: black;">append</span><span style="color: black;">&#40;</span><span style="color: #dc143c;">os</span>.<span style="color: black;">path</span>.<span style="color: black;">join</span><span style="color: black;">&#40;</span>orbited_path<span style="color: black;">&#91;</span><span style="color: #ff4500;">0</span><span style="color: black;">&#93;</span>,<span style="color: #483d8b;">&quot;hotfixes&quot;</span>,<span style="color: #483d8b;">&quot;win32api&quot;</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
        <span style="color: #ff7700;font-weight:bold;">from</span> twisted.<span style="color: black;">python</span> <span style="color: #ff7700;font-weight:bold;">import</span> lockfile
        lockfile.<span style="color: black;">kill</span> = <span style="color: #008000;">None</span>
    <span style="color: #808080; font-style: italic;">#################</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">from</span> <span style="color: #dc143c;">optparse</span> <span style="color: #ff7700;font-weight:bold;">import</span> OptionParser
    <span style="color: #dc143c;">parser</span> = OptionParser<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
    <span style="color: #dc143c;">parser</span>.<span style="color: black;">add_option</span><span style="color: black;">&#40;</span>
        <span style="color: #483d8b;">&quot;-c&quot;</span>,
        <span style="color: #483d8b;">&quot;--config&quot;</span>,
        dest=<span style="color: #483d8b;">&quot;config&quot;</span>,
        default=<span style="color: #008000;">None</span>,
        <span style="color: #008000;">help</span>=<span style="color: #483d8b;">&quot;path to configuration file&quot;</span>
    <span style="color: black;">&#41;</span>
    <span style="color: #dc143c;">parser</span>.<span style="color: black;">add_option</span><span style="color: black;">&#40;</span>
        <span style="color: #483d8b;">&quot;-v&quot;</span>,
        <span style="color: #483d8b;">&quot;--version&quot;</span>,
        dest=<span style="color: #483d8b;">&quot;version&quot;</span>,
        action=<span style="color: #483d8b;">&quot;store_true&quot;</span>,
        default=<span style="color: #008000;">False</span>,
        <span style="color: #008000;">help</span>=<span style="color: #483d8b;">&quot;print Orbited version&quot;</span>
    <span style="color: black;">&#41;</span>
    <span style="color: #dc143c;">parser</span>.<span style="color: black;">add_option</span><span style="color: black;">&#40;</span>
        <span style="color: #483d8b;">&quot;-p&quot;</span>,
        <span style="color: #483d8b;">&quot;--profile&quot;</span>,
        dest=<span style="color: #483d8b;">&quot;profile&quot;</span>,
        action=<span style="color: #483d8b;">&quot;store_true&quot;</span>,
        default=<span style="color: #008000;">False</span>,
        <span style="color: #008000;">help</span>=<span style="color: #483d8b;">&quot;run Orbited with a profiler&quot;</span>
    <span style="color: black;">&#41;</span>
    <span style="color: #dc143c;">parser</span>.<span style="color: black;">add_option</span><span style="color: black;">&#40;</span>
        <span style="color: #483d8b;">&quot;-q&quot;</span>,
        <span style="color: #483d8b;">&quot;--quickstart&quot;</span>,
        dest=<span style="color: #483d8b;">&quot;quickstart&quot;</span>,
        action=<span style="color: #483d8b;">&quot;store_true&quot;</span>,
        default=<span style="color: #008000;">False</span>,
        <span style="color: #008000;">help</span>=<span style="color: #483d8b;">&quot;run Orbited on port 8000 and MorbidQ on port 61613&quot;</span>
    <span style="color: black;">&#41;</span>
&nbsp;
    <span style="color: black;">&#40;</span>options, args<span style="color: black;">&#41;</span> = <span style="color: #dc143c;">parser</span>.<span style="color: black;">parse_args</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">if</span> args:
        <span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #483d8b;">'the &quot;orbited&quot; command does not accept positional arguments. type &quot;orbited -h&quot; for options.'</span>
        <span style="color: #dc143c;">sys</span>.<span style="color: black;">exit</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">1</span><span style="color: black;">&#41;</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">if</span> options.<span style="color: black;">version</span>:
        <span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #483d8b;">&quot;Orbited version: %s&quot;</span> <span style="color: #66cc66;">%</span> <span style="color: black;">&#40;</span>version,<span style="color: black;">&#41;</span>
        <span style="color: #dc143c;">sys</span>.<span style="color: black;">exit</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">0</span><span style="color: black;">&#41;</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">if</span> options.<span style="color: black;">quickstart</span>:
        config.<span style="color: #008000;">map</span><span style="color: black;">&#91;</span><span style="color: #483d8b;">'[listen]'</span><span style="color: black;">&#93;</span>.<span style="color: black;">append</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'http://:8000'</span><span style="color: black;">&#41;</span>
        config.<span style="color: #008000;">map</span><span style="color: black;">&#91;</span><span style="color: #483d8b;">'[listen]'</span><span style="color: black;">&#93;</span>.<span style="color: black;">append</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'stomp://:61613'</span><span style="color: black;">&#41;</span>
        config.<span style="color: #008000;">map</span><span style="color: black;">&#91;</span><span style="color: #483d8b;">'[access]'</span><span style="color: black;">&#93;</span><span style="color: black;">&#91;</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'localhost'</span>,<span style="color: #ff4500;">61613</span><span style="color: black;">&#41;</span><span style="color: black;">&#93;</span> = <span style="color: black;">&#91;</span><span style="color: #483d8b;">'*'</span><span style="color: black;">&#93;</span>
        <span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #483d8b;">&quot;Quickstarting Orbited&quot;</span>
    <span style="color: #ff7700;font-weight:bold;">else</span>:
        <span style="color: #808080; font-style: italic;"># load configuration from configuration</span>
        <span style="color: #808080; font-style: italic;"># file and from command line arguments.</span>
        config.<span style="color: black;">setup</span><span style="color: black;">&#40;</span>options=options<span style="color: black;">&#41;</span>
&nbsp;
    <span style="color: #dc143c;">logging</span>.<span style="color: black;">setup</span><span style="color: black;">&#40;</span>config.<span style="color: #008000;">map</span><span style="color: black;">&#41;</span>
&nbsp;
    <span style="color: #808080; font-style: italic;"># we can now safely get loggers.</span>
    <span style="color: #ff7700;font-weight:bold;">global</span> logger<span style="color: #66cc66;">;</span> logger = <span style="color: #dc143c;">logging</span>.<span style="color: black;">get_logger</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'orbited.start'</span><span style="color: black;">&#41;</span>
&nbsp;
&nbsp;
    <span style="color: #808080; font-style: italic;"># NB: we need to install the reactor before using twisted.</span>
    reactor_name = config.<span style="color: #008000;">map</span><span style="color: black;">&#91;</span><span style="color: #483d8b;">'[global]'</span><span style="color: black;">&#93;</span>.<span style="color: black;">get</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'reactor'</span><span style="color: black;">&#41;</span>
    <span style="color: #ff7700;font-weight:bold;">if</span> reactor_name:
        install = _import<span style="color: black;">&#40;</span><span style="color: #483d8b;">'twisted.internet.%sreactor.install'</span> <span style="color: #66cc66;">%</span> reactor_name<span style="color: black;">&#41;</span>
        install<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
        logger.<span style="color: black;">info</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'using %s reactor'</span> <span style="color: #66cc66;">%</span> reactor_name<span style="color: black;">&#41;</span>
&nbsp;
    <span style="color: #808080; font-style: italic;">############</span>
    <span style="color: #808080; font-style: italic;"># This crude garbage corrects a bug in twisted</span>
    <span style="color: #808080; font-style: italic;">#   Orbited ticket: http://orbited.org/ticket/111</span>
    <span style="color: #808080; font-style: italic;">#   Twisted ticket: http://twistedmatrix.com/trac/ticket/2447</span>
    <span style="color: #ff7700;font-weight:bold;">import</span> twisted.<span style="color: black;">web</span>.<span style="color: black;">http</span>
    twisted.<span style="color: black;">web</span>.<span style="color: black;">http</span>.<span style="color: black;">HTTPChannel</span>.<span style="color: black;">setTimeout</span> = <span style="color: #ff7700;font-weight:bold;">lambda</span> <span style="color: #008000;">self</span>, arg: <span style="color: #008000;">None</span>
    twisted.<span style="color: black;">web</span>.<span style="color: black;">http</span>.<span style="color: black;">HTTPChannel</span>.<span style="color: black;">resetTimeout</span> = <span style="color: #ff7700;font-weight:bold;">lambda</span> <span style="color: #008000;">self</span>: <span style="color: #008000;">None</span>
    <span style="color: #808080; font-style: italic;">############</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">from</span> twisted.<span style="color: black;">internet</span> <span style="color: #ff7700;font-weight:bold;">import</span> reactor
    <span style="color: #ff7700;font-weight:bold;">from</span> twisted.<span style="color: black;">web</span> <span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #dc143c;">resource</span>
    <span style="color: #ff7700;font-weight:bold;">from</span> twisted.<span style="color: black;">web</span> <span style="color: #ff7700;font-weight:bold;">import</span> server
    <span style="color: #ff7700;font-weight:bold;">from</span> twisted.<span style="color: black;">web</span> <span style="color: #ff7700;font-weight:bold;">import</span> static
    <span style="color: #ff7700;font-weight:bold;">import</span> orbited.<span style="color: black;">system</span>
&nbsp;
    root = <span style="color: #dc143c;">resource</span>.<span style="color: black;">Resource</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
    static_files = static.<span style="color: black;">File</span><span style="color: black;">&#40;</span><span style="color: #dc143c;">os</span>.<span style="color: black;">path</span>.<span style="color: black;">join</span><span style="color: black;">&#40;</span><span style="color: #dc143c;">os</span>.<span style="color: black;">path</span>.<span style="color: black;">dirname</span><span style="color: black;">&#40;</span>orbited.__path__<span style="color: black;">&#91;</span><span style="color: #ff4500;">0</span><span style="color: black;">&#93;</span><span style="color: black;">&#41;</span>, <span style="color: #483d8b;">'orbited/static'</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
    root.<span style="color: black;">putChild</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'static'</span>, static_files<span style="color: black;">&#41;</span>
    root.<span style="color: black;">putChild</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'system'</span>, orbited.<span style="color: black;">system</span>.<span style="color: black;">SystemResource</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">if</span> config.<span style="color: #008000;">map</span><span style="color: black;">&#91;</span><span style="color: #483d8b;">'[test]'</span><span style="color: black;">&#93;</span><span style="color: black;">&#91;</span><span style="color: #483d8b;">'stompdispatcher.enabled'</span><span style="color: black;">&#93;</span> == <span style="color: #483d8b;">'1'</span>:
        logger.<span style="color: black;">info</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'stompdispatcher enabled'</span><span style="color: black;">&#41;</span>
&nbsp;
    <span style="color: #808080; font-style: italic;">#static_files.putChild('orbited.swf', static.File(os.path.join(os.path.dirname(__file__), 'flash', 'orbited.swf')))</span>
    <span style="color: #dc143c;">site</span> = server.<span style="color: black;">Site</span><span style="color: black;">&#40;</span>root<span style="color: black;">&#41;</span>
&nbsp;
    _setup_protocols<span style="color: black;">&#40;</span>root<span style="color: black;">&#41;</span>
    _setup_static<span style="color: black;">&#40;</span>root, config.<span style="color: #008000;">map</span><span style="color: black;">&#41;</span>
    start_listening<span style="color: black;">&#40;</span><span style="color: #dc143c;">site</span>, config.<span style="color: #008000;">map</span>, logger<span style="color: black;">&#41;</span>
&nbsp;
    <span style="color: #808080; font-style: italic;"># switch uid and gid to configured user and group.</span>
    <span style="color: #ff7700;font-weight:bold;">if</span> <span style="color: #dc143c;">os</span>.<span style="color: black;">name</span> == <span style="color: #483d8b;">'posix'</span> <span style="color: #ff7700;font-weight:bold;">and</span> <span style="color: #dc143c;">os</span>.<span style="color: black;">getuid</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span> == <span style="color: #ff4500;">0</span>:
        <span style="color: #dc143c;">user</span> = config.<span style="color: #008000;">map</span><span style="color: black;">&#91;</span><span style="color: #483d8b;">'[global]'</span><span style="color: black;">&#93;</span>.<span style="color: black;">get</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'user'</span><span style="color: black;">&#41;</span>
        group = config.<span style="color: #008000;">map</span><span style="color: black;">&#91;</span><span style="color: #483d8b;">'[global]'</span><span style="color: black;">&#93;</span>.<span style="color: black;">get</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'group'</span><span style="color: black;">&#41;</span>
        <span style="color: #ff7700;font-weight:bold;">if</span> <span style="color: #dc143c;">user</span>:
            <span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #dc143c;">pwd</span>
            <span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #dc143c;">grp</span>
            <span style="color: #ff7700;font-weight:bold;">try</span>:
                pw = <span style="color: #dc143c;">pwd</span>.<span style="color: black;">getpwnam</span><span style="color: black;">&#40;</span><span style="color: #dc143c;">user</span><span style="color: black;">&#41;</span>
                uid = pw.<span style="color: black;">pw_uid</span>
                <span style="color: #ff7700;font-weight:bold;">if</span> group:
                    gr = <span style="color: #dc143c;">grp</span>.<span style="color: black;">getgrnam</span><span style="color: black;">&#40;</span>group<span style="color: black;">&#41;</span>
                    gid = gr.<span style="color: black;">gr_gid</span>
                <span style="color: #ff7700;font-weight:bold;">else</span>:
                    gid = pw.<span style="color: black;">pw_gid</span>
                    gr = <span style="color: #dc143c;">grp</span>.<span style="color: black;">getgrgid</span><span style="color: black;">&#40;</span>gid<span style="color: black;">&#41;</span>
                    group = gr.<span style="color: black;">gr_name</span>
            <span style="color: #ff7700;font-weight:bold;">except</span> <span style="color: #008000;">Exception</span>, e:
                logger.<span style="color: black;">error</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'Aborting; Unknown user or group: %s'</span> <span style="color: #66cc66;">%</span> e<span style="color: black;">&#41;</span>
                <span style="color: #dc143c;">sys</span>.<span style="color: black;">exit</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">1</span><span style="color: black;">&#41;</span>
            logger.<span style="color: black;">info</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'switching to user %s (uid=%d) and group %s (gid=%d)'</span> <span style="color: #66cc66;">%</span> <span style="color: black;">&#40;</span><span style="color: #dc143c;">user</span>, uid, group, gid<span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
            <span style="color: #dc143c;">os</span>.<span style="color: black;">setgid</span><span style="color: black;">&#40;</span>gid<span style="color: black;">&#41;</span>
            <span style="color: #dc143c;">os</span>.<span style="color: black;">setuid</span><span style="color: black;">&#40;</span>uid<span style="color: black;">&#41;</span>
        <span style="color: #ff7700;font-weight:bold;">else</span>:
            logger.<span style="color: black;">error</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'Aborting; You must define a user (and optionally a group) in the configuration file.'</span><span style="color: black;">&#41;</span>
            <span style="color: #dc143c;">sys</span>.<span style="color: black;">exit</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">1</span><span style="color: black;">&#41;</span>
&nbsp;
&nbsp;
<span style="color: #ff7700;font-weight:bold;">def</span> start_listening<span style="color: black;">&#40;</span><span style="color: #dc143c;">site</span>, config, logger<span style="color: black;">&#41;</span>:
    <span style="color: #ff7700;font-weight:bold;">from</span> twisted.<span style="color: black;">internet</span> <span style="color: #ff7700;font-weight:bold;">import</span> reactor
    <span style="color: #ff7700;font-weight:bold;">from</span> twisted.<span style="color: black;">internet</span> <span style="color: #ff7700;font-weight:bold;">import</span> protocol <span style="color: #ff7700;font-weight:bold;">as</span> protocol_module
    <span style="color: #808080; font-style: italic;"># allow stomp:// URIs to be parsed by urlparse</span>
    <span style="color: #dc143c;">urlparse</span>.<span style="color: black;">uses_netloc</span>.<span style="color: black;">append</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;stomp&quot;</span><span style="color: black;">&#41;</span>
    <span style="color: #808080; font-style: italic;"># allow test server URIs to be parsed by urlparse</span>
    <span style="color: #ff7700;font-weight:bold;">from</span> orbited.<span style="color: black;">servers</span> <span style="color: #ff7700;font-weight:bold;">import</span> test_servers
    <span style="color: #ff7700;font-weight:bold;">for</span> protocol <span style="color: #ff7700;font-weight:bold;">in</span> test_servers:
        <span style="color: #dc143c;">urlparse</span>.<span style="color: black;">uses_netloc</span>.<span style="color: black;">append</span><span style="color: black;">&#40;</span>protocol<span style="color: black;">&#41;</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">for</span> addr <span style="color: #ff7700;font-weight:bold;">in</span> config<span style="color: black;">&#91;</span><span style="color: #483d8b;">'[listen]'</span><span style="color: black;">&#93;</span>:
        <span style="color: #ff7700;font-weight:bold;">if</span> addr.<span style="color: black;">startswith</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;stomp&quot;</span><span style="color: black;">&#41;</span>:
            stompConfig = <span style="color: #483d8b;">&quot;&quot;</span>
            <span style="color: #ff7700;font-weight:bold;">if</span> <span style="color: #483d8b;">&quot; &quot;</span> <span style="color: #ff7700;font-weight:bold;">in</span> addr:
                addr, stompConfig = addr.<span style="color: black;">split</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot; &quot;</span>,<span style="color: #ff4500;">1</span><span style="color: black;">&#41;</span>
        url = <span style="color: #dc143c;">urlparse</span>.<span style="color: #dc143c;">urlparse</span><span style="color: black;">&#40;</span>addr<span style="color: black;">&#41;</span>
        hostname = url.<span style="color: black;">hostname</span> <span style="color: #ff7700;font-weight:bold;">or</span> <span style="color: #483d8b;">''</span>
        <span style="color: #ff7700;font-weight:bold;">if</span> url.<span style="color: black;">scheme</span> == <span style="color: #483d8b;">'stomp'</span>:
            logger.<span style="color: black;">info</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'Listening stomp@%s'</span> <span style="color: #66cc66;">%</span> url.<span style="color: black;">port</span><span style="color: black;">&#41;</span>
            <span style="color: #ff7700;font-weight:bold;">from</span> morbid <span style="color: #ff7700;font-weight:bold;">import</span> get_stomp_factory
            morbid_instance = get_stomp_factory<span style="color: black;">&#40;</span>stompConfig<span style="color: black;">&#41;</span>
            config<span style="color: black;">&#91;</span><span style="color: #483d8b;">'morbid_instance'</span><span style="color: black;">&#93;</span> = morbid_instance
            reactor.<span style="color: black;">listenTCP</span><span style="color: black;">&#40;</span>url.<span style="color: black;">port</span>, morbid_instance, interface=hostname<span style="color: black;">&#41;</span>
        <span style="color: #ff7700;font-weight:bold;">elif</span> url.<span style="color: black;">scheme</span> == <span style="color: #483d8b;">'http'</span>:
            logger.<span style="color: black;">info</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'Listening http@%s'</span> <span style="color: #66cc66;">%</span> url.<span style="color: black;">port</span><span style="color: black;">&#41;</span>
            reactor.<span style="color: black;">listenTCP</span><span style="color: black;">&#40;</span>url.<span style="color: black;">port</span>, <span style="color: #dc143c;">site</span>, interface=hostname<span style="color: black;">&#41;</span>
        <span style="color: #ff7700;font-weight:bold;">elif</span> url.<span style="color: black;">scheme</span> == <span style="color: #483d8b;">'https'</span>:
            <span style="color: #ff7700;font-weight:bold;">from</span> twisted.<span style="color: black;">internet</span> <span style="color: #ff7700;font-weight:bold;">import</span> ssl
            crt = config<span style="color: black;">&#91;</span><span style="color: #483d8b;">'[ssl]'</span><span style="color: black;">&#93;</span><span style="color: black;">&#91;</span><span style="color: #483d8b;">'crt'</span><span style="color: black;">&#93;</span>
            key = config<span style="color: black;">&#91;</span><span style="color: #483d8b;">'[ssl]'</span><span style="color: black;">&#93;</span><span style="color: black;">&#91;</span><span style="color: #483d8b;">'key'</span><span style="color: black;">&#93;</span>
            <span style="color: #ff7700;font-weight:bold;">try</span>:
                ssl_context = ssl.<span style="color: black;">DefaultOpenSSLContextFactory</span><span style="color: black;">&#40;</span>key, crt<span style="color: black;">&#41;</span>
            <span style="color: #ff7700;font-weight:bold;">except</span> <span style="color: #008000;">ImportError</span>:
                <span style="color: #ff7700;font-weight:bold;">raise</span>
            <span style="color: #ff7700;font-weight:bold;">except</span>:
                logger.<span style="color: black;">error</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;Error opening key or crt file: %s, %s&quot;</span> <span style="color: #66cc66;">%</span> <span style="color: black;">&#40;</span>key, crt<span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
                <span style="color: #dc143c;">sys</span>.<span style="color: black;">exit</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">1</span><span style="color: black;">&#41;</span>
            logger.<span style="color: black;">info</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'Listening https@%s (%s, %s)'</span> <span style="color: #66cc66;">%</span> <span style="color: black;">&#40;</span>url.<span style="color: black;">port</span>, key, crt<span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
            reactor.<span style="color: black;">listenSSL</span><span style="color: black;">&#40;</span>url.<span style="color: black;">port</span>, <span style="color: #dc143c;">site</span>, ssl_context, interface=hostname<span style="color: black;">&#41;</span>
        <span style="color: #ff7700;font-weight:bold;">elif</span> url.<span style="color: black;">scheme</span> <span style="color: #ff7700;font-weight:bold;">in</span> test_servers:
            test_factory = protocol_module.<span style="color: black;">ServerFactory</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
            test_factory.<span style="color: black;">protocol</span> = test_servers<span style="color: black;">&#91;</span>url.<span style="color: black;">scheme</span><span style="color: black;">&#93;</span>
            logger.<span style="color: black;">info</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;Listening %s@%s&quot;</span><span style="color: #66cc66;">%</span><span style="color: black;">&#40;</span>url.<span style="color: black;">scheme</span>, url.<span style="color: black;">port</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
            reactor.<span style="color: black;">listenTCP</span><span style="color: black;">&#40;</span>url.<span style="color: black;">port</span>, test_factory<span style="color: black;">&#41;</span>
            <span style="color: #ff7700;font-weight:bold;">if</span> url.<span style="color: black;">scheme</span> == <span style="color: #483d8b;">'monitor'</span>:
                config<span style="color: black;">&#91;</span><span style="color: #483d8b;">'globalVars'</span><span style="color: black;">&#93;</span><span style="color: black;">&#91;</span><span style="color: #483d8b;">'monitoring'</span><span style="color: black;">&#93;</span> = url.<span style="color: black;">port</span>
        <span style="color: #ff7700;font-weight:bold;">else</span>:
            logger.<span style="color: black;">error</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;Invalid Listen URI: %s&quot;</span> <span style="color: #66cc66;">%</span> addr<span style="color: black;">&#41;</span>
            <span style="color: #dc143c;">sys</span>.<span style="color: black;">exit</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">1</span><span style="color: black;">&#41;</span>
&nbsp;
&nbsp;
<span style="color: #ff7700;font-weight:bold;">def</span> thread_start<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>:
	main<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
	<span style="color: #ff7700;font-weight:bold;">from</span> twisted.<span style="color: black;">internet</span> <span style="color: #ff7700;font-weight:bold;">import</span> reactor
	reactor.<span style="color: black;">run</span><span style="color: black;">&#40;</span>installSignalHandlers=<span style="color: #ff4500;">0</span><span style="color: black;">&#41;</span>
	<span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #483d8b;">&quot;Crashed into Earth's Surface.&quot;</span>
&nbsp;
&nbsp;
orbited_thread = <span style="color: #008000;">None</span>
<span style="color: #ff7700;font-weight:bold;">def</span> start<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>:
	<span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #483d8b;">&quot;Starting Orbited...&quot;</span>
	dolores_thread = <span style="color: #dc143c;">threading</span>.<span style="color: black;">Thread</span><span style="color: black;">&#40;</span>target=thread_start<span style="color: black;">&#41;</span>
	dolores_thread.<span style="color: black;">start</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
	<span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #483d8b;">&quot;In Orbit.&quot;</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">def</span> stop_reactor<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>:
	reactor.<span style="color: black;">stop</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">def</span> stop<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>:
	reactor.<span style="color: black;">callFromThread</span><span style="color: black;">&#40;</span>stop_reactor<span style="color: black;">&#41;</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">if</span> __name__ == <span style="color: #483d8b;">&quot;__main__&quot;</span>:
	start<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
	run = <span style="color: #008000;">True</span>
	<span style="color: #ff7700;font-weight:bold;">while</span> run:
		<span style="color: #ff7700;font-weight:bold;">try</span>:
			<span style="color: #dc143c;">time</span>.<span style="color: black;">sleep</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">5</span><span style="color: black;">&#41;</span>
		<span style="color: #ff7700;font-weight:bold;">except</span> <span style="color: #008000;">KeyboardInterrupt</span>:
			<span style="color: #ff7700;font-weight:bold;">from</span> twisted.<span style="color: black;">internet</span> <span style="color: #ff7700;font-weight:bold;">import</span> reactor
			stop<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
			run = <span style="color: #008000;">False</span></pre></div></div>


<h3>So, What Do I Do?</h3>

<p>You should just need to put the windows service script and the OrbitedManager.py script in the same directory, and then run the windows service script from the command line. If you run it with no arguments, I <em>believe</em> it will give you an overview of available options, including the option to install.</p>

<p>I hope someone can find this helpful.</p>

<p><strong>Update: </strong> I added some clarification in the middle, discussing high-level about the replacement of Orbited&#8217;s <em>start</em> module, and a bit at the end about <em>what to do</em>.</p>
]]></content:encoded>
			<wfw:commentRss>http://create.tpsitulsa.com/blog/2009/08/04/running-orbited-or-other-twisted-services-as-a-service/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Dolores &amp; Cornelius, Sitting in a Tree. Of Comet, Orbited and Python.</title>
		<link>http://create.tpsitulsa.com/blog/2009/08/04/dolores/</link>
		<comments>http://create.tpsitulsa.com/blog/2009/08/04/dolores/#comments</comments>
		<pubDate>Tue, 04 Aug 2009 14:27:59 +0000</pubDate>
		<dc:creator>Alex Iskander</dc:creator>
				<category><![CDATA[Code]]></category>
		<category><![CDATA[Comet]]></category>
		<category><![CDATA[Script]]></category>
		<category><![CDATA[Web]]></category>

		<guid isPermaLink="false">http://create.tpsitulsa.com/blog/?p=175</guid>
		<description><![CDATA[I&#8217;ll give you a moment to allow you to get that disturbing image out of your head. I have been working on a web application. I&#8217;ll hopefully be able to post the application soon. I needed the server to be able to send updates to the client via Comet. I&#8217;d never done any Comet before, [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;ll give you a moment to allow you to get that disturbing image out of your head.</p>

<p>I have been working on a web application. I&#8217;ll hopefully be able to post the application soon.</p>

<p>I needed the server to be able to send updates to the client via Comet. I&#8217;d never done any Comet before, so I wasn&#8217;t sure what to do.</p>

<p>A lot of articles had examples making use of message queues and who knows what else. They were a tad overwhelming. While a message queue of some sort may eventually be a good idea, for now, all I needed to do was push a non-vital progress indicator for a job (15%, 20%, 30%, and so on) to the client so the user could see what was happening. I wanted more than one job to be supported, and the overall system should eventually allow sending updates when elements in the user&#8217;s filesystem are updated.</p>

<p>So, I&#8217;d like to be able to send:</p>


<div class="wp_syntax"><div class="code"><pre class="none" style="font-family:monospace;">UPDATE process/at/my/process/path; {progress:.5}
UPDATE file/at/my/file/path.txt</pre></div></div>


<p>In short, I&#8217;d like to send paths, along (sometimes) with little tiny messages.</p>

<p>Also, each instance of the web app should only receive updates to paths they are listening to, and they should only be <em>allowed</em> to listen to paths they actually have access to. Or, at least, that should be the case <em>once I implement permission management in the app</em> &emdash; right now, anything goes, which is fine for the moment because it is limited to test use on our local network.</p>

<p>So, I made a little script, called Dolores, which handles all of this, and another script, named Cornelius, which connects to it (incidentally, there are two Corneliuses: a Python one, and a JavaScript one).</p>

<p>I have posted it here in case anyone is interested. I used <a href = 'http://orbited.org/'>Orbited</a> in JavaScript to connect to the server. In a separate post in just a few moments, I&#8217;ll write about something a tad more useful than the Dolores &amp; Cornelius code I&#8217;m writing about here: how to run the Orbited (and, actually, Dolores) as a Windows service.</p>

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

<p><strong>Disclaimer: </strong> This is for interest only. I&#8217;m proud of it because I managed to make it, not because I actually think it is wonderful.</p>

<p>Before getting to the code, let me explain the API, which, if you have the server running, you can access manually using telnet:</p>

<p>You connect, and immediately receive:</p>


<div class="wp_syntax"><div class="code"><pre class="none" style="font-family:monospace;">I, Dolores, High Inquisitor, Hogwarts.
{A-THREAD-ID-HERE}</pre></div></div>


<p>That thread ID can then be used by a controller thread to connect you to paths.</p>

<p>Speaking of controllers, to control, you&#8217;d just make a file named &#8220;control-{THREAD-ID}&#8221; in a folder named &#8220;threads&#8221; relative to Dolores.py. Then, you&#8217;d send:</p>


<div class="wp_syntax"><div class="code"><pre class="none" style="font-family:monospace;">CONTROL</pre></div></div>


<p>Now, to connect or disconnect a thread to a path:</p>


<div class="wp_syntax"><div class="code"><pre class="none" style="font-family:monospace;">CONNECT {THREAD-ID} some/path/or/another
DISCONNECT {THREAD-ID} some/path/or/another</pre></div></div>


<p>In the web application, a django view handles the connection of a client (who sends its thread id along with the connection request). By only allowing controllers to create the connections, the client is not able to listen in to places it isn&#8217;t allowed.</p>

<p>And to send an update to a path:</p>


<div class="wp_syntax"><div class="code"><pre class="none" style="font-family:monospace;">UPDATE some/path/or/another; {some: message, may: go, right: here, format: &quot;any&quot;}</pre></div></div>


<p>Any listening thread will immediately receive:</p>


<div class="wp_syntax"><div class="code"><pre class="none" style="font-family:monospace;">UPDATE some/path/or/another; {some: message, may: go, right: here, format: &quot;any&quot;}</pre></div></div>


<p>Just as you sent it.</p>

<p>And yes, part of the reason it is named Dolores (the name of a particularly nasty character in the Harry Potter universe) is because I believe it to be a somewhat ugly solution. But unlike the HP character, it works. The HP character&emdash;let&#8217;s not go there.</p>

<p>Now, without further ado:</p>


<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #ff7700;font-weight:bold;">from</span> twisted.<span style="color: black;">internet</span>.<span style="color: black;">protocol</span> <span style="color: #ff7700;font-weight:bold;">import</span> Protocol, Factory
<span style="color: #ff7700;font-weight:bold;">from</span> twisted.<span style="color: black;">internet</span> <span style="color: #ff7700;font-weight:bold;">import</span> reactor
<span style="color: #ff7700;font-weight:bold;">from</span> twisted.<span style="color: black;">protocols</span>.<span style="color: black;">basic</span> <span style="color: #ff7700;font-weight:bold;">import</span> LineReceiver
<span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #dc143c;">random</span>, <span style="color: #dc143c;">string</span>
<span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #dc143c;">os</span>, <span style="color: #dc143c;">os</span>.<span style="color: black;">path</span>
<span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #dc143c;">threading</span>
<span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #dc143c;">time</span>
&nbsp;
<span style="color: #808080; font-style: italic;"># This is Delores the High Inquisitor.</span>
&nbsp;
<span style="color: #808080; font-style: italic;"># Dolores is a series of tubes. To prevent clogging, there are separate tubes,</span>
<span style="color: #808080; font-style: italic;"># rather than one big pipe everyone might get stuck in.</span>
&nbsp;
<span style="color: #808080; font-style: italic;"># A user can be connected to a tube. This allows the user to receive notifications</span>
<span style="color: #808080; font-style: italic;"># through said tubes.</span>
&nbsp;
<span style="color: #808080; font-style: italic;"># The pipe server is not made for actual COMET, believe it or not. There is no</span>
<span style="color: #808080; font-style: italic;"># persistence or anything. It is as simple as possible. Instead, we will try to</span>
<span style="color: #808080; font-style: italic;"># use Orbited to make a nice connection between Dolores and the client.</span>
&nbsp;
<span style="color: #808080; font-style: italic;"># I don't know how this will hold up performance-wise, but it is simple enough</span>
<span style="color: #808080; font-style: italic;"># that I think it will work for now.</span>
&nbsp;
<span style="color: #808080; font-style: italic;"># API:</span>
<span style="color: #808080; font-style: italic;"># There are two kinds of connections: control and client. The api </span>
<span style="color: #808080; font-style: italic;"># Creating a connection immediately results in a response with a thread id. Thread</span>
<span style="color: #808080; font-style: italic;"># ids consist of a few main parts: IPADDRESS-THREAD#-SECRET</span>
<span style="color: #808080; font-style: italic;"># Where thread# is a sequential thread number, IPADDRESS is the address of the client,</span>
<span style="color: #808080; font-style: italic;"># and SECRET is a random string of bytes made for the thread.</span>
&nbsp;
<span style="color: #808080; font-style: italic;"># Clients connecting should check first for a string starting with &quot;I,&quot;, which means they</span>
<span style="color: #808080; font-style: italic;"># successfully connected. They should then read another string with their thread id.</span>
&nbsp;
<span style="color: #808080; font-style: italic;">#	CONTROL</span>
<span style="color: #808080; font-style: italic;">#			Attempts to make the thread a controller. This only works if a file</span>
<span style="color: #808080; font-style: italic;">#			named &quot;control-&quot; and the thread id is in the &quot;threads&quot; folder (relative</span>
<span style="color: #808080; font-style: italic;">#			to the Dolores.py file -- messy, I know)</span>
<span style="color: #808080; font-style: italic;">#</span>
<span style="color: #808080; font-style: italic;">#	CONNECT UID PATH 			(controller only)</span>
<span style="color: #808080; font-style: italic;">#			Connects the thread with id UID to the specified path.</span>
<span style="color: #808080; font-style: italic;">#</span>
<span style="color: #808080; font-style: italic;">#	DISCONNECT UID PATH			(controller only)</span>
<span style="color: #808080; font-style: italic;">#			Disconnects the thread with id UID from the specified path.</span>
<span style="color: #808080; font-style: italic;">#</span>
<span style="color: #808080; font-style: italic;">#	UPDATE PATH MESSAGE 		(controller only)</span>
<span style="color: #808080; font-style: italic;">#			Sens a message regarding the path. Please keep the message twitter length.</span>
<span style="color: #808080; font-style: italic;">#</span>
<span style="color: #808080; font-style: italic;">#	CRASH UID					(controller only)</span>
<span style="color: #808080; font-style: italic;">#			Aborts a thread. Could be used for testing whole (un-optimized/cometized) reload.</span>
<span style="color: #808080; font-style: italic;">#</span>
&nbsp;
&nbsp;
<span style="color: #ff7700;font-weight:bold;">class</span> Comet<span style="color: black;">&#40;</span>LineReceiver<span style="color: black;">&#41;</span>:
	<span style="color: #ff7700;font-weight:bold;">def</span> <span style="color: #0000cd;">__init__</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:
		<span style="color: #008000;">self</span>.<span style="color: black;">listening</span> = <span style="color: #008000;">set</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
		<span style="color: #008000;">self</span>.<span style="color: black;">controls</span> = <span style="color: #008000;">False</span>
&nbsp;
	<span style="color: #ff7700;font-weight:bold;">def</span> connectionMade<span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:
		<span style="color: #008000;">self</span>.<span style="color: black;">transport</span>.<span style="color: black;">write</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;I, Dolores, High Inquisitor, Hogwarts.<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: black;">&#41;</span>
&nbsp;
		secret = <span style="color: #483d8b;">&quot;&quot;</span>
		<span style="color: #ff7700;font-weight:bold;">for</span> i <span style="color: #ff7700;font-weight:bold;">in</span> <span style="color: #008000;">range</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">32</span><span style="color: black;">&#41;</span>:
			secret += <span style="color: #dc143c;">random</span>.<span style="color: black;">choice</span><span style="color: black;">&#40;</span><span style="color: #dc143c;">string</span>.<span style="color: black;">ascii_letters</span> + <span style="color: #dc143c;">string</span>.<span style="color: black;">digits</span><span style="color: black;">&#41;</span>
&nbsp;
		<span style="color: #008000;">self</span>.<span style="color: #008000;">id</span> = <span style="color: #008000;">str</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>.<span style="color: black;">transport</span>.<span style="color: black;">getPeer</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>.<span style="color: black;">host</span><span style="color: black;">&#41;</span> + <span style="color: #483d8b;">&quot;-&quot;</span> + <span style="color: #008000;">str</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>.<span style="color: black;">factory</span>.<span style="color: black;">nextThreadNumber</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span> + <span style="color: #483d8b;">&quot;-&quot;</span> + secret
		<span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #483d8b;">&quot;New Thread &quot;</span> + <span style="color: #008000;">self</span>.<span style="color: #008000;">id</span>
&nbsp;
		<span style="color: #008000;">self</span>.<span style="color: black;">transport</span>.<span style="color: black;">write</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>.<span style="color: #008000;">id</span> + <span style="color: #483d8b;">&quot;<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: black;">&#41;</span>
		<span style="color: #008000;">self</span>.<span style="color: black;">factory</span>.<span style="color: black;">comets</span><span style="color: black;">&#91;</span><span style="color: #008000;">self</span>.<span style="color: #008000;">id</span><span style="color: black;">&#93;</span> = <span style="color: #008000;">self</span><span style="color: #66cc66;">;</span>
&nbsp;
	<span style="color: #ff7700;font-weight:bold;">def</span> control<span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:
		<span style="color: #808080; font-style: italic;"># if the file exists, do it.</span>
		<span style="color: #ff7700;font-weight:bold;">if</span> <span style="color: #dc143c;">os</span>.<span style="color: black;">path</span>.<span style="color: black;">exists</span><span style="color: black;">&#40;</span><span style="color: #dc143c;">os</span>.<span style="color: black;">path</span>.<span style="color: black;">join</span><span style="color: black;">&#40;</span><span style="color: #dc143c;">os</span>.<span style="color: black;">path</span>.<span style="color: black;">dirname</span><span style="color: black;">&#40;</span>__file__<span style="color: black;">&#41;</span>, <span style="color: #483d8b;">&quot;threads&quot;</span>, <span style="color: #483d8b;">&quot;control-&quot;</span> + <span style="color: #008000;">self</span>.<span style="color: #008000;">id</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>:
			<span style="color: #008000;">self</span>.<span style="color: black;">controls</span> = <span style="color: #008000;">True</span>
			<span style="color: #dc143c;">os</span>.<span style="color: black;">remove</span><span style="color: black;">&#40;</span><span style="color: #dc143c;">os</span>.<span style="color: black;">path</span>.<span style="color: black;">join</span><span style="color: black;">&#40;</span><span style="color: #dc143c;">os</span>.<span style="color: black;">path</span>.<span style="color: black;">dirname</span><span style="color: black;">&#40;</span>__file__<span style="color: black;">&#41;</span>, <span style="color: #483d8b;">&quot;threads&quot;</span>, <span style="color: #483d8b;">&quot;control-&quot;</span> + <span style="color: #008000;">self</span>.<span style="color: #008000;">id</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
		<span style="color: #ff7700;font-weight:bold;">else</span>:
			<span style="color: #008000;">self</span>.<span style="color: black;">controls</span> = <span style="color: #008000;">False</span>
&nbsp;
	<span style="color: #ff7700;font-weight:bold;">def</span> connectionLost<span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, reason<span style="color: black;">&#41;</span>:
		<span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #483d8b;">&quot;Closed Thread &quot;</span> + <span style="color: #008000;">self</span>.<span style="color: #008000;">id</span>
		<span style="color: #ff7700;font-weight:bold;">del</span> <span style="color: #008000;">self</span>.<span style="color: black;">factory</span>.<span style="color: black;">comets</span><span style="color: black;">&#91;</span><span style="color: #008000;">self</span>.<span style="color: #008000;">id</span><span style="color: black;">&#93;</span>
		<span style="color: #ff7700;font-weight:bold;">for</span> listen <span style="color: #ff7700;font-weight:bold;">in</span> <span style="color: #008000;">self</span>.<span style="color: black;">listening</span>:
			<span style="color: #008000;">self</span>.<span style="color: black;">factory</span>.<span style="color: black;">deregister</span><span style="color: black;">&#40;</span>listen, <span style="color: #008000;">self</span><span style="color: black;">&#41;</span>
&nbsp;
	<span style="color: #ff7700;font-weight:bold;">def</span> listen<span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, path<span style="color: black;">&#41;</span>:
		<span style="color: #008000;">self</span>.<span style="color: black;">factory</span>.<span style="color: black;">register</span><span style="color: black;">&#40;</span>path.<span style="color: black;">strip</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>, <span style="color: #008000;">self</span><span style="color: black;">&#41;</span>
		<span style="color: #008000;">self</span>.<span style="color: black;">listening</span>.<span style="color: black;">add</span><span style="color: black;">&#40;</span>path.<span style="color: black;">strip</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
&nbsp;
	<span style="color: #ff7700;font-weight:bold;">def</span> ignore<span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, path<span style="color: black;">&#41;</span>:
		<span style="color: #008000;">self</span>.<span style="color: black;">factory</span>.<span style="color: black;">deregister</span><span style="color: black;">&#40;</span>path.<span style="color: black;">strip</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>, <span style="color: #008000;">self</span><span style="color: black;">&#41;</span>
		<span style="color: #ff7700;font-weight:bold;">if</span> path.<span style="color: black;">strip</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span> <span style="color: #ff7700;font-weight:bold;">in</span> <span style="color: #008000;">self</span>.<span style="color: black;">listening</span>:
				<span style="color: #008000;">self</span>.<span style="color: black;">listening</span>.<span style="color: black;">remove</span><span style="color: black;">&#40;</span>path.<span style="color: black;">strip</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
&nbsp;
	<span style="color: #ff7700;font-weight:bold;">def</span> lineReceived<span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, data<span style="color: black;">&#41;</span>:
		<span style="color: #ff7700;font-weight:bold;">if</span> data.<span style="color: black;">startswith</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;CONNECT&quot;</span><span style="color: black;">&#41;</span>:
			<span style="color: #ff7700;font-weight:bold;">if</span> <span style="color: #ff7700;font-weight:bold;">not</span> <span style="color: #008000;">self</span>.<span style="color: black;">controls</span>:
				<span style="color: #008000;">self</span>.<span style="color: black;">transport</span>.<span style="color: black;">write</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;NOALLOW<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: black;">&#41;</span>
				<span style="color: #ff7700;font-weight:bold;">return</span>
			<span style="color: #ff7700;font-weight:bold;">try</span>:
				uid, path = data<span style="color: black;">&#91;</span><span style="color: #ff4500;">7</span>:<span style="color: black;">&#93;</span>.<span style="color: black;">strip</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>.<span style="color: black;">split</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot; &quot;</span>, <span style="color: #ff4500;">1</span><span style="color: black;">&#41;</span>
				uid = uid.<span style="color: black;">strip</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
				path = path.<span style="color: black;">strip</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
				<span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #483d8b;">&quot;Connect &quot;</span> + uid + <span style="color: #483d8b;">&quot; to &quot;</span> + path
&nbsp;
				<span style="color: #008000;">self</span>.<span style="color: black;">factory</span>.<span style="color: black;">comets</span><span style="color: black;">&#91;</span>uid<span style="color: black;">&#93;</span>.<span style="color: black;">listen</span><span style="color: black;">&#40;</span>path<span style="color: black;">&#41;</span>
				<span style="color: #008000;">self</span>.<span style="color: black;">listening</span>.<span style="color: black;">add</span><span style="color: black;">&#40;</span>data<span style="color: black;">&#91;</span><span style="color: #ff4500;">6</span>:<span style="color: black;">&#93;</span>.<span style="color: black;">strip</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
				<span style="color: #008000;">self</span>.<span style="color: black;">transport</span>.<span style="color: black;">write</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;SUCCESS<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: black;">&#41;</span>
			<span style="color: #ff7700;font-weight:bold;">except</span>:
				<span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #483d8b;">&quot;Failed a connect attempt.&quot;</span>
				<span style="color: #008000;">self</span>.<span style="color: black;">transport</span>.<span style="color: black;">write</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;FAIL<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: black;">&#41;</span>
&nbsp;
		<span style="color: #ff7700;font-weight:bold;">elif</span> data.<span style="color: black;">startswith</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;DISCONNECT&quot;</span><span style="color: black;">&#41;</span>:
			<span style="color: #ff7700;font-weight:bold;">if</span> <span style="color: #ff7700;font-weight:bold;">not</span> <span style="color: #008000;">self</span>.<span style="color: black;">controls</span>:
				<span style="color: #008000;">self</span>.<span style="color: black;">transport</span>.<span style="color: black;">write</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;NOALLOW<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: black;">&#41;</span>
				<span style="color: #ff7700;font-weight:bold;">return</span>
			<span style="color: #ff7700;font-weight:bold;">try</span>:
				uid, path = data<span style="color: black;">&#91;</span><span style="color: #ff4500;">10</span>:<span style="color: black;">&#93;</span>.<span style="color: black;">strip</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>.<span style="color: black;">split</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot; &quot;</span>, <span style="color: #ff4500;">1</span><span style="color: black;">&#41;</span>
				uid = uid.<span style="color: black;">strip</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
				path = path.<span style="color: black;">strip</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
				<span style="color: #ff7700;font-weight:bold;">if</span> uid <span style="color: #ff7700;font-weight:bold;">in</span> <span style="color: #008000;">self</span>.<span style="color: black;">factory</span>.<span style="color: black;">comets</span>:
					<span style="color: #008000;">self</span>.<span style="color: black;">factory</span>.<span style="color: black;">comets</span><span style="color: black;">&#91;</span>uid<span style="color: black;">&#93;</span>.<span style="color: black;">ignore</span><span style="color: black;">&#40;</span>path<span style="color: black;">&#41;</span>
					<span style="color: #008000;">self</span>.<span style="color: black;">transport</span>.<span style="color: black;">write</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;SUCCESS&quot;</span><span style="color: black;">&#41;</span>
					<span style="color: #ff7700;font-weight:bold;">return</span>
			<span style="color: #ff7700;font-weight:bold;">except</span>:
				<span style="color: #ff7700;font-weight:bold;">pass</span>
			<span style="color: #008000;">self</span>.<span style="color: black;">transport</span>.<span style="color: black;">write</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;FAIL&quot;</span><span style="color: black;">&#41;</span>
&nbsp;
		<span style="color: #ff7700;font-weight:bold;">elif</span> data.<span style="color: black;">startswith</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;CRASH&quot;</span><span style="color: black;">&#41;</span>:
			<span style="color: #ff7700;font-weight:bold;">if</span> <span style="color: #ff7700;font-weight:bold;">not</span> <span style="color: #008000;">self</span>.<span style="color: black;">controls</span>:
				<span style="color: #008000;">self</span>.<span style="color: black;">transport</span>.<span style="color: black;">write</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;NOALLOW<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: black;">&#41;</span>
				<span style="color: #ff7700;font-weight:bold;">return</span>
			<span style="color: #ff7700;font-weight:bold;">try</span>:
				uid = data<span style="color: black;">&#91;</span><span style="color: #ff4500;">5</span>:<span style="color: black;">&#93;</span>.<span style="color: black;">strip</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
				<span style="color: #ff7700;font-weight:bold;">if</span> uid <span style="color: #ff7700;font-weight:bold;">in</span> <span style="color: #008000;">self</span>.<span style="color: black;">factory</span>.<span style="color: black;">comets</span>:
					<span style="color: #008000;">self</span>.<span style="color: black;">factory</span>.<span style="color: black;">comets</span><span style="color: black;">&#91;</span>uid<span style="color: black;">&#93;</span>.<span style="color: black;">transport</span>.<span style="color: black;">loseConnection</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
				<span style="color: #008000;">self</span>.<span style="color: black;">transport</span>.<span style="color: black;">write</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;SUCCESS&quot;</span><span style="color: black;">&#41;</span>
			<span style="color: #ff7700;font-weight:bold;">except</span>:
				<span style="color: #008000;">self</span>.<span style="color: black;">transport</span>.<span style="color: black;">write</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;FAIL&quot;</span><span style="color: black;">&#41;</span>
&nbsp;
		<span style="color: #ff7700;font-weight:bold;">elif</span> data.<span style="color: black;">startswith</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;EXIT&quot;</span><span style="color: black;">&#41;</span>:
			<span style="color: #008000;">self</span>.<span style="color: black;">transport</span>.<span style="color: black;">loseConnection</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
&nbsp;
		<span style="color: #ff7700;font-weight:bold;">elif</span> data.<span style="color: black;">startswith</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;UPDATE&quot;</span><span style="color: black;">&#41;</span>:
			<span style="color: #ff7700;font-weight:bold;">if</span> <span style="color: #ff7700;font-weight:bold;">not</span> <span style="color: #008000;">self</span>.<span style="color: black;">controls</span>:
				<span style="color: #008000;">self</span>.<span style="color: black;">transport</span>.<span style="color: black;">write</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;NOALLOW<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: black;">&#41;</span>
				<span style="color: #ff7700;font-weight:bold;">return</span>
			<span style="color: #ff7700;font-weight:bold;">try</span>:
				pieces = data<span style="color: black;">&#91;</span><span style="color: #ff4500;">6</span>:<span style="color: black;">&#93;</span>.<span style="color: black;">split</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;;&quot;</span>,<span style="color: #ff4500;">1</span><span style="color: black;">&#41;</span>
				path = pieces<span style="color: black;">&#91;</span><span style="color: #ff4500;">0</span><span style="color: black;">&#93;</span>
				message = <span style="color: #483d8b;">&quot;&quot;</span>
				<span style="color: #ff7700;font-weight:bold;">if</span> <span style="color: #008000;">len</span><span style="color: black;">&#40;</span>pieces<span style="color: black;">&#41;</span> <span style="color: #66cc66;">&gt;</span> <span style="color: #ff4500;">1</span>:
					message = pieces<span style="color: black;">&#91;</span><span style="color: #ff4500;">1</span><span style="color: black;">&#93;</span>
				<span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #483d8b;">&quot;UPDATE &quot;</span> + path.<span style="color: black;">strip</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span> + <span style="color: #483d8b;">&quot;: &quot;</span> + message.<span style="color: black;">strip</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
				<span style="color: #008000;">self</span>.<span style="color: black;">factory</span>.<span style="color: black;">message</span><span style="color: black;">&#40;</span>path.<span style="color: black;">strip</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>, message.<span style="color: black;">strip</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
				<span style="color: #008000;">self</span>.<span style="color: black;">transport</span>.<span style="color: black;">write</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;SUCCESS&quot;</span><span style="color: black;">&#41;</span>
			<span style="color: #ff7700;font-weight:bold;">except</span>:
				<span style="color: #008000;">self</span>.<span style="color: black;">transport</span>.<span style="color: black;">write</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;FAIL<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: black;">&#41;</span>
&nbsp;
		<span style="color: #ff7700;font-weight:bold;">elif</span> data.<span style="color: black;">startswith</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;ALL&quot;</span><span style="color: black;">&#41;</span>:
			<span style="color: #ff7700;font-weight:bold;">if</span> <span style="color: #ff7700;font-weight:bold;">not</span> <span style="color: #008000;">self</span>.<span style="color: black;">controls</span>:
				<span style="color: #008000;">self</span>.<span style="color: black;">transport</span>.<span style="color: black;">write</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;NOALLOW<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: black;">&#41;</span>
				<span style="color: #ff7700;font-weight:bold;">return</span>
			<span style="color: #ff7700;font-weight:bold;">try</span>:
				path = data<span style="color: black;">&#91;</span><span style="color: #ff4500;">3</span>:<span style="color: black;">&#93;</span>
				<span style="color: #ff7700;font-weight:bold;">for</span> i <span style="color: #ff7700;font-weight:bold;">in</span> <span style="color: #008000;">self</span>.<span style="color: black;">factory</span>.<span style="color: black;">comets</span>:
					<span style="color: #008000;">self</span>.<span style="color: black;">factory</span>.<span style="color: black;">comets</span><span style="color: black;">&#91;</span>i<span style="color: black;">&#93;</span>.<span style="color: black;">sendMessage</span><span style="color: black;">&#40;</span>path<span style="color: black;">&#41;</span>
				<span style="color: #008000;">self</span>.<span style="color: black;">transport</span>.<span style="color: black;">write</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;SUCCESS&quot;</span><span style="color: black;">&#41;</span>
			<span style="color: #ff7700;font-weight:bold;">except</span>:
				<span style="color: #008000;">self</span>.<span style="color: black;">transport</span>.<span style="color: black;">write</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;FAIL&quot;</span><span style="color: black;">&#41;</span>
&nbsp;
		<span style="color: #ff7700;font-weight:bold;">elif</span> data.<span style="color: black;">startswith</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;CONTROL&quot;</span><span style="color: black;">&#41;</span>:
			<span style="color: #008000;">self</span>.<span style="color: black;">control</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
			<span style="color: #ff7700;font-weight:bold;">if</span> <span style="color: #ff7700;font-weight:bold;">not</span> <span style="color: #008000;">self</span>.<span style="color: black;">controls</span>:
				<span style="color: #008000;">self</span>.<span style="color: black;">transport</span>.<span style="color: black;">write</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;NOALLOW<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: black;">&#41;</span>
				<span style="color: #ff7700;font-weight:bold;">return</span>
&nbsp;
	<span style="color: #ff7700;font-weight:bold;">def</span> sendMessage<span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, path, message<span style="color: black;">&#41;</span>:
		<span style="color: #008000;">self</span>.<span style="color: black;">transport</span>.<span style="color: black;">write</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;UPDATE &quot;</span> + path + <span style="color: #483d8b;">&quot;;&quot;</span> + message + <span style="color: #483d8b;">&quot;<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: black;">&#41;</span>
&nbsp;
<span style="color: #808080; font-style: italic;"># Factory</span>
<span style="color: #ff7700;font-weight:bold;">class</span> Manager<span style="color: black;">&#40;</span>Factory<span style="color: black;">&#41;</span>:
	<span style="color: #ff7700;font-weight:bold;">def</span> <span style="color: #0000cd;">__init__</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:
		<span style="color: #008000;">self</span>.<span style="color: black;">protocol</span> = Comet
		<span style="color: #008000;">self</span>.<span style="color: black;">comets</span> = <span style="color: black;">&#123;</span><span style="color: black;">&#125;</span>
		<span style="color: #008000;">self</span>.<span style="color: black;">lookup</span> = <span style="color: black;">&#123;</span><span style="color: black;">&#125;</span>
		<span style="color: #008000;">self</span>.<span style="color: black;">threadCount</span> = <span style="color: #ff4500;">0</span>
&nbsp;
	<span style="color: #ff7700;font-weight:bold;">def</span> startFactory<span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:
		<span style="color: #ff7700;font-weight:bold;">pass</span>
&nbsp;
	<span style="color: #ff7700;font-weight:bold;">def</span> stopFactory<span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:
		<span style="color: #ff7700;font-weight:bold;">pass</span>
&nbsp;
	<span style="color: #ff7700;font-weight:bold;">def</span> register<span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, path, comet<span style="color: black;">&#41;</span>:
		<span style="color: #ff7700;font-weight:bold;">if</span> path <span style="color: #ff7700;font-weight:bold;">not</span> <span style="color: #ff7700;font-weight:bold;">in</span> <span style="color: #008000;">self</span>.<span style="color: black;">lookup</span>:
			<span style="color: #008000;">self</span>.<span style="color: black;">lookup</span><span style="color: black;">&#91;</span>path<span style="color: black;">&#93;</span> = <span style="color: #008000;">set</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
&nbsp;
		<span style="color: #008000;">self</span>.<span style="color: black;">lookup</span><span style="color: black;">&#91;</span>path<span style="color: black;">&#93;</span>.<span style="color: black;">add</span><span style="color: black;">&#40;</span>comet<span style="color: black;">&#41;</span>
&nbsp;
	<span style="color: #ff7700;font-weight:bold;">def</span> deregister<span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, path, comet<span style="color: black;">&#41;</span>:
		<span style="color: #ff7700;font-weight:bold;">if</span> path <span style="color: #ff7700;font-weight:bold;">not</span> <span style="color: #ff7700;font-weight:bold;">in</span> <span style="color: #008000;">self</span>.<span style="color: black;">lookup</span>:
			<span style="color: #ff7700;font-weight:bold;">return</span>
&nbsp;
		<span style="color: #ff7700;font-weight:bold;">if</span> comet <span style="color: #ff7700;font-weight:bold;">not</span> <span style="color: #ff7700;font-weight:bold;">in</span> <span style="color: #008000;">self</span>.<span style="color: black;">lookup</span><span style="color: black;">&#91;</span>path<span style="color: black;">&#93;</span>:
			<span style="color: #ff7700;font-weight:bold;">return</span>
&nbsp;
		<span style="color: #008000;">self</span>.<span style="color: black;">lookup</span><span style="color: black;">&#91;</span>path<span style="color: black;">&#93;</span>.<span style="color: black;">remove</span><span style="color: black;">&#40;</span>comet<span style="color: black;">&#41;</span>
&nbsp;
		<span style="color: #ff7700;font-weight:bold;">if</span> <span style="color: #008000;">len</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>.<span style="color: black;">lookup</span><span style="color: black;">&#91;</span>path<span style="color: black;">&#93;</span><span style="color: black;">&#41;</span> == <span style="color: #ff4500;">0</span>:
			<span style="color: #ff7700;font-weight:bold;">del</span> <span style="color: #008000;">self</span>.<span style="color: black;">lookup</span><span style="color: black;">&#91;</span>path<span style="color: black;">&#93;</span>
&nbsp;
	<span style="color: #ff7700;font-weight:bold;">def</span> message<span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, path, message<span style="color: black;">&#41;</span>:
		<span style="color: #ff7700;font-weight:bold;">if</span> path <span style="color: #ff7700;font-weight:bold;">not</span> <span style="color: #ff7700;font-weight:bold;">in</span> <span style="color: #008000;">self</span>.<span style="color: black;">lookup</span>:
			<span style="color: #ff7700;font-weight:bold;">return</span>
&nbsp;
		<span style="color: #ff7700;font-weight:bold;">for</span> i <span style="color: #ff7700;font-weight:bold;">in</span> <span style="color: #008000;">self</span>.<span style="color: black;">lookup</span><span style="color: black;">&#91;</span>path<span style="color: black;">&#93;</span>:
			i.<span style="color: black;">sendMessage</span><span style="color: black;">&#40;</span>path, message<span style="color: black;">&#41;</span>
&nbsp;
	<span style="color: #ff7700;font-weight:bold;">def</span> nextThreadNumber<span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:
		<span style="color: #008000;">self</span>.<span style="color: black;">threadCount</span> = <span style="color: #008000;">self</span>.<span style="color: black;">threadCount</span> + <span style="color: #ff4500;">1</span>
		<span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #008000;">self</span>.<span style="color: black;">threadCount</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">def</span> thread_start<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>:
	<span style="color: #ff7700;font-weight:bold;">global</span> dolores_reactor
	factory = Manager<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
	reactor.<span style="color: black;">listenTCP</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">8007</span>, factory<span style="color: black;">&#41;</span>
	reactor.<span style="color: black;">run</span><span style="color: black;">&#40;</span>installSignalHandlers=<span style="color: #ff4500;">0</span><span style="color: black;">&#41;</span>
	<span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #483d8b;">&quot;Dolores has been taken by the Centaurs. Clip clop.&quot;</span>
&nbsp;
&nbsp;
dolores_thread = <span style="color: #008000;">None</span>
<span style="color: #ff7700;font-weight:bold;">def</span> start<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>:
	<span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #483d8b;">&quot;Starting Dolores...&quot;</span>
	<span style="color: #ff7700;font-weight:bold;">global</span> dolores_thread
	dolores_thread = <span style="color: #dc143c;">threading</span>.<span style="color: black;">Thread</span><span style="color: black;">&#40;</span>target=thread_start<span style="color: black;">&#41;</span>
	dolores_thread.<span style="color: black;">start</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
	<span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #483d8b;">&quot;Dolores has  now been appointed High Inquisitor.&quot;</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">def</span> stop_reactor<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>:
	reactor.<span style="color: black;">stop</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">def</span> stop<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>:
	reactor.<span style="color: black;">callFromThread</span><span style="color: black;">&#40;</span>stop_reactor<span style="color: black;">&#41;</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">if</span> __name__ == <span style="color: #483d8b;">&quot;__main__&quot;</span>:
    start<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
    run = <span style="color: #008000;">True</span>
    <span style="color: #ff7700;font-weight:bold;">while</span> run:
    	<span style="color: #ff7700;font-weight:bold;">try</span>:
    		<span style="color: #dc143c;">time</span>.<span style="color: black;">sleep</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">5</span><span style="color: black;">&#41;</span>
    	<span style="color: #ff7700;font-weight:bold;">except</span> <span style="color: #008000;">KeyboardInterrupt</span>:
    		stop<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
    		run = <span style="color: #008000;">False</span></pre></div></div>


<p>And, the arguably even uglier Cornelius, with raw socket communication:</p>


<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;">cornelius_connection = <span style="color: #008000;">None</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #dc143c;">socket</span>
<span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #dc143c;">time</span>
<span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #dc143c;">os</span>, <span style="color: #dc143c;">os</span>.<span style="color: black;">path</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">class</span> CorneliusFault<span style="color: black;">&#40;</span><span style="color: #008000;">Exception</span><span style="color: black;">&#41;</span>:
	<span style="color: #ff7700;font-weight:bold;">def</span> <span style="color: #0000cd;">__init__</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, value<span style="color: black;">&#41;</span>:
		<span style="color: #008000;">self</span>.<span style="color: black;">value</span> = value
	<span style="color: #ff7700;font-weight:bold;">def</span> <span style="color: #0000cd;">__str__</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:
		<span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #dc143c;">repr</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>.<span style="color: black;">value</span><span style="color: black;">&#41;</span>
&nbsp;
&nbsp;
<span style="color: #ff7700;font-weight:bold;">def</span> _connect<span style="color: black;">&#40;</span>reconnect = <span style="color: #008000;">False</span><span style="color: black;">&#41;</span>:
	<span style="color: #ff7700;font-weight:bold;">global</span> cornelius_connection
	<span style="color: #ff7700;font-weight:bold;">if</span> cornelius_connection <span style="color: #ff7700;font-weight:bold;">and</span> reconnect:
		<span style="color: #ff7700;font-weight:bold;">try</span>:
			cornelius_connection.<span style="color: black;">shutdown</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
		<span style="color: #ff7700;font-weight:bold;">except</span>:
			<span style="color: #ff7700;font-weight:bold;">pass</span>
		cornelius_connection = <span style="color: #008000;">None</span>
&nbsp;
	<span style="color: #ff7700;font-weight:bold;">if</span> <span style="color: #ff7700;font-weight:bold;">not</span> cornelius_connection:
		cornelius_connection = <span style="color: #dc143c;">socket</span>.<span style="color: #dc143c;">socket</span><span style="color: black;">&#40;</span><span style="color: #dc143c;">socket</span>.<span style="color: black;">AF_INET</span>, <span style="color: #dc143c;">socket</span>.<span style="color: black;">SOCK_STREAM</span><span style="color: black;">&#41;</span>
		cornelius_connection.<span style="color: black;">connect</span><span style="color: black;">&#40;</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;localhost&quot;</span>, <span style="color: #ff4500;">8007</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
		cornelius_connection.<span style="color: black;">settimeout</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">1</span><span style="color: black;">&#41;</span> <span style="color: #808080; font-style: italic;"># wait one second for response if needed. Hopefully won't be that long.</span>
&nbsp;
		buffer = read<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
		<span style="color: #ff7700;font-weight:bold;">if</span> <span style="color: #008000;">len</span><span style="color: black;">&#40;</span>buffer<span style="color: black;">&#41;</span> <span style="color: #66cc66;">&lt;</span> <span style="color: #ff4500;">2</span>:
			<span style="color: #ff7700;font-weight:bold;">raise</span> CorneliusFault<span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;He's Not Back!&quot;</span><span style="color: black;">&#41;</span>
&nbsp;
		verify_dolores = buffer<span style="color: black;">&#91;</span><span style="color: #ff4500;">0</span><span style="color: black;">&#93;</span>.<span style="color: black;">strip</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
		<span style="color: #ff7700;font-weight:bold;">if</span> verify_dolores.<span style="color: black;">strip</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span> <span style="color: #66cc66;">!</span>= <span style="color: #483d8b;">&quot;I, Dolores, High Inquisitor, Hogwarts.&quot;</span>:
			<span style="color: #ff7700;font-weight:bold;">raise</span> CorneliusFault<span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;Lord Thingy! Lord Thingy! Dolores, why have you turned into Lord Thingy?&quot;</span><span style="color: black;">&#41;</span>
&nbsp;
		cornelius_thread_id = buffer<span style="color: black;">&#91;</span><span style="color: #ff4500;">1</span><span style="color: black;">&#93;</span>.<span style="color: black;">strip</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
		f = <span style="color: #008000;">open</span><span style="color: black;">&#40;</span><span style="color: #dc143c;">os</span>.<span style="color: black;">path</span>.<span style="color: black;">dirname</span><span style="color: black;">&#40;</span><span style="color: #dc143c;">os</span>.<span style="color: black;">path</span>.<span style="color: black;">abspath</span><span style="color: black;">&#40;</span>__file__<span style="color: black;">&#41;</span><span style="color: black;">&#41;</span> + <span style="color: #483d8b;">&quot;/threads/control-&quot;</span> + cornelius_thread_id, <span style="color: #483d8b;">&quot;w&quot;</span><span style="color: black;">&#41;</span>
		f.<span style="color: black;">write</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;you big dummy.&quot;</span><span style="color: black;">&#41;</span>
		f.<span style="color: black;">close</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
		send<span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;CONTROL<span style="color: #000099; font-weight: bold;">\n</span><span style="color: #000099; font-weight: bold;">\n</span>&quot;</span>, <span style="color: #008000;">True</span><span style="color: black;">&#41;</span>
		read<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">def</span> read<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>:
	<span style="color: #ff7700;font-weight:bold;">try</span>:
		buffer = cornelius_connection.<span style="color: black;">recv</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">4096</span><span style="color: black;">&#41;</span>
		<span style="color: #ff7700;font-weight:bold;">return</span> buffer.<span style="color: black;">split</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: black;">&#41;</span>
	<span style="color: #ff7700;font-weight:bold;">except</span>:
		<span style="color: #ff7700;font-weight:bold;">pass</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">def</span> send<span style="color: black;">&#40;</span>what, noconnect = <span style="color: #008000;">False</span><span style="color: black;">&#41;</span>:
	<span style="color: #ff7700;font-weight:bold;">if</span> <span style="color: #ff7700;font-weight:bold;">not</span> noconnect:
		_connect<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
	<span style="color: #ff7700;font-weight:bold;">global</span> cornelius_connection
	<span style="color: #ff7700;font-weight:bold;">try</span>:
		cornelius_connection.<span style="color: black;">sendall</span><span style="color: black;">&#40;</span>what + <span style="color: #483d8b;">&quot;<span style="color: #000099; font-weight: bold;">\r</span><span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: black;">&#41;</span>
	<span style="color: #ff7700;font-weight:bold;">except</span>:
		<span style="color: #ff7700;font-weight:bold;">if</span> <span style="color: #ff7700;font-weight:bold;">not</span> noconnect:
			_connect<span style="color: black;">&#40;</span><span style="color: #008000;">True</span><span style="color: black;">&#41;</span>
		cornelius_connection.<span style="color: black;">sendall</span><span style="color: black;">&#40;</span>what + <span style="color: #483d8b;">&quot;<span style="color: #000099; font-weight: bold;">\r</span><span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: black;">&#41;</span>
&nbsp;
	<span style="color: #ff7700;font-weight:bold;">try</span>:
		read<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span> <span style="color: #808080; font-style: italic;"># don't do anythin' with output yet. Just get rid of it... so it doesn't sit in some buffer</span>
	<span style="color: #ff7700;font-weight:bold;">except</span>:
		<span style="color: #ff7700;font-weight:bold;">pass</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">def</span> update<span style="color: black;">&#40;</span>path, message = <span style="color: #483d8b;">&quot;&quot;</span><span style="color: black;">&#41;</span>:
	send<span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;UPDATE &quot;</span> + path + <span style="color: #483d8b;">&quot;; &quot;</span> + message<span style="color: black;">&#41;</span>
&nbsp;
&nbsp;
<span style="color: #ff7700;font-weight:bold;">def</span> connect<span style="color: black;">&#40;</span>uid, path<span style="color: black;">&#41;</span>:
	send<span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;CONNECT &quot;</span> + uid + <span style="color: #483d8b;">&quot; &quot;</span> + path<span style="color: black;">&#41;</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">def</span> disconnect<span style="color: black;">&#40;</span>uid, path<span style="color: black;">&#41;</span>:
	send<span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;DISCONNECT &quot;</span> + uid + <span style="color: #483d8b;">&quot; &quot;</span> + path<span style="color: black;">&#41;</span>
&nbsp;
&nbsp;
<span style="color: #ff7700;font-weight:bold;">def</span> crash<span style="color: black;">&#40;</span>uid<span style="color: black;">&#41;</span>:
	send<span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;CRASH &quot;</span> + uid<span style="color: black;">&#41;</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">def</span> log<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>:
	<span style="color: #ff7700;font-weight:bold;">global</span> cornelius_connection
	<span style="color: #ff7700;font-weight:bold;">print</span> cornelius_connection.<span style="color: black;">read_very_eager</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span></pre></div></div>


<p>Well, again, at least they work. And they are quite simple.</p>
]]></content:encoded>
			<wfw:commentRss>http://create.tpsitulsa.com/blog/2009/08/04/dolores/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>

