terminator/doc/apidoc/_build/html/_modules/terminatorlib/debugserver.html

397 lines
40 KiB
HTML

<!DOCTYPE html>
<!--[if IE 8]><html class="no-js lt-ie9" lang="en" > <![endif]-->
<!--[if gt IE 8]><!--> <html class="no-js" lang="en" > <!--<![endif]-->
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>terminatorlib.debugserver &mdash; terminatorlib 0.98 documentation</title>
<link rel="stylesheet" href="../../_static/css/theme.css" type="text/css" />
<link rel="top" title="terminatorlib 0.98 documentation" href="../../index.html"/>
<link rel="up" title="Module code" href="../index.html"/>
<script src="_static/js/modernizr.min.js"></script>
</head>
<body class="wy-body-for-nav" role="document">
<div class="wy-grid-for-nav">
<nav data-toggle="wy-nav-shift" class="wy-nav-side">
<div class="wy-side-nav-search">
<a href="../../index.html" class="icon icon-home"> terminatorlib
</a>
<div role="search">
<form id="rtd-search-form" class="wy-form" action="../../search.html" method="get">
<input type="text" name="q" placeholder="Search docs" />
<input type="hidden" name="check_keywords" value="yes" />
<input type="hidden" name="area" value="default" />
</form>
</div>
</div>
<div class="wy-menu wy-menu-vertical" data-spy="affix" role="navigation" aria-label="main navigation">
<ul>
<li class="toctree-l1"><a class="reference internal" href="../../terminatorlib.html">terminatorlib package</a><ul>
<li class="toctree-l2"><a class="reference internal" href="../../terminatorlib.html#subpackages">Subpackages</a><ul>
<li class="toctree-l3"><a class="reference internal" href="../../terminatorlib.configobj.html">terminatorlib.configobj package</a><ul>
<li class="toctree-l4"><a class="reference internal" href="../../terminatorlib.configobj.html#submodules">Submodules</a></li>
<li class="toctree-l4"><a class="reference internal" href="../../terminatorlib.configobj.html#module-terminatorlib.configobj.configobj">terminatorlib.configobj.configobj module</a></li>
<li class="toctree-l4"><a class="reference internal" href="../../terminatorlib.configobj.html#module-terminatorlib.configobj.validate">terminatorlib.configobj.validate module</a></li>
<li class="toctree-l4"><a class="reference internal" href="../../terminatorlib.configobj.html#module-terminatorlib.configobj">Module contents</a></li>
</ul>
</li>
<li class="toctree-l3"><a class="reference internal" href="../../terminatorlib.plugins.html">terminatorlib.plugins package</a><ul>
<li class="toctree-l4"><a class="reference internal" href="../../terminatorlib.plugins.html#submodules">Submodules</a></li>
<li class="toctree-l4"><a class="reference internal" href="../../terminatorlib.plugins.html#module-terminatorlib.plugins.activitywatch">terminatorlib.plugins.activitywatch module</a></li>
<li class="toctree-l4"><a class="reference internal" href="../../terminatorlib.plugins.html#module-terminatorlib.plugins.custom_commands">terminatorlib.plugins.custom_commands module</a></li>
<li class="toctree-l4"><a class="reference internal" href="../../terminatorlib.plugins.html#module-terminatorlib.plugins.logger">terminatorlib.plugins.logger module</a></li>
<li class="toctree-l4"><a class="reference internal" href="../../terminatorlib.plugins.html#module-terminatorlib.plugins.maven">terminatorlib.plugins.maven module</a></li>
<li class="toctree-l4"><a class="reference internal" href="../../terminatorlib.plugins.html#module-terminatorlib.plugins.terminalshot">terminatorlib.plugins.terminalshot module</a></li>
<li class="toctree-l4"><a class="reference internal" href="../../terminatorlib.plugins.html#module-terminatorlib.plugins.testplugin">terminatorlib.plugins.testplugin module</a></li>
<li class="toctree-l4"><a class="reference internal" href="../../terminatorlib.plugins.html#module-terminatorlib.plugins.url_handlers">terminatorlib.plugins.url_handlers module</a></li>
<li class="toctree-l4"><a class="reference internal" href="../../terminatorlib.plugins.html#module-terminatorlib.plugins">Module contents</a></li>
</ul>
</li>
</ul>
</li>
<li class="toctree-l2"><a class="reference internal" href="../../terminatorlib.html#submodules">Submodules</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../terminatorlib.html#module-terminatorlib.borg">terminatorlib.borg module</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../terminatorlib.html#module-terminatorlib.config">terminatorlib.config module</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../terminatorlib.html#module-terminatorlib.container">terminatorlib.container module</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../terminatorlib.html#module-terminatorlib.cwd">terminatorlib.cwd module</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../terminatorlib.html#module-terminatorlib.debugserver">terminatorlib.debugserver module</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../terminatorlib.html#module-terminatorlib.editablelabel">terminatorlib.editablelabel module</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../terminatorlib.html#module-terminatorlib.encoding">terminatorlib.encoding module</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../terminatorlib.html#module-terminatorlib.factory">terminatorlib.factory module</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../terminatorlib.html#module-terminatorlib.freebsd">terminatorlib.freebsd module</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../terminatorlib.html#module-terminatorlib.ipc">terminatorlib.ipc module</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../terminatorlib.html#module-terminatorlib.keybindings">terminatorlib.keybindings module</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../terminatorlib.html#module-terminatorlib.layoutlauncher">terminatorlib.layoutlauncher module</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../terminatorlib.html#module-terminatorlib.notebook">terminatorlib.notebook module</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../terminatorlib.html#module-terminatorlib.optionparse">terminatorlib.optionparse module</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../terminatorlib.html#module-terminatorlib.paned">terminatorlib.paned module</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../terminatorlib.html#module-terminatorlib.plugin">terminatorlib.plugin module</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../terminatorlib.html#module-terminatorlib.prefseditor">terminatorlib.prefseditor module</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../terminatorlib.html#module-terminatorlib.searchbar">terminatorlib.searchbar module</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../terminatorlib.html#module-terminatorlib.signalman">terminatorlib.signalman module</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../terminatorlib.html#module-terminatorlib.terminal">terminatorlib.terminal module</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../terminatorlib.html#module-terminatorlib.terminal_popup_menu">terminatorlib.terminal_popup_menu module</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../terminatorlib.html#module-terminatorlib.terminator">terminatorlib.terminator module</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../terminatorlib.html#module-terminatorlib.titlebar">terminatorlib.titlebar module</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../terminatorlib.html#module-terminatorlib.translation">terminatorlib.translation module</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../terminatorlib.html#module-terminatorlib.util">terminatorlib.util module</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../terminatorlib.html#module-terminatorlib.version">terminatorlib.version module</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../terminatorlib.html#module-terminatorlib.window">terminatorlib.window module</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../terminatorlib.html#module-terminatorlib">Module contents</a></li>
</ul>
</li>
</ul>
</div>
&nbsp;
</nav>
<section data-toggle="wy-nav-shift" class="wy-nav-content-wrap">
<nav class="wy-nav-top" role="navigation" aria-label="top navigation">
<i data-toggle="wy-nav-top" class="fa fa-bars"></i>
<a href="../../index.html">terminatorlib</a>
</nav>
<div class="wy-nav-content">
<div class="rst-content">
<div role="navigation" aria-label="breadcrumbs navigation">
<ul class="wy-breadcrumbs">
<li><a href="../../index.html">Docs</a> &raquo;</li>
<li><a href="../index.html">Module code</a> &raquo;</li>
<li>terminatorlib.debugserver</li>
<li class="wy-breadcrumbs-aside">
</li>
</ul>
<hr/>
</div>
<div role="main" class="document">
<h1>Source code for terminatorlib.debugserver</h1><div class="highlight"><pre>
<span class="c">#!/usr/bin/python</span>
<span class="c">#</span>
<span class="c"># Copyright (c) 2008, Thomas Hurst &lt;tom@hur.st&gt;</span>
<span class="c">#</span>
<span class="c"># Use of this file is unrestricted provided this notice is retained.</span>
<span class="c"># If you use it, it&#39;d be nice if you dropped me a note. Also beer.</span>
<span class="kn">from</span> <span class="nn">terminatorlib.util</span> <span class="kn">import</span> <span class="n">dbg</span><span class="p">,</span> <span class="n">err</span>
<span class="kn">from</span> <span class="nn">terminatorlib.version</span> <span class="kn">import</span> <span class="n">APP_NAME</span><span class="p">,</span> <span class="n">APP_VERSION</span>
<span class="kn">import</span> <span class="nn">socket</span>
<span class="kn">import</span> <span class="nn">threading</span>
<span class="kn">import</span> <span class="nn">SocketServer</span>
<span class="kn">import</span> <span class="nn">code</span>
<span class="kn">import</span> <span class="nn">sys</span>
<span class="kn">import</span> <span class="nn">readline</span>
<span class="kn">import</span> <span class="nn">rlcompleter</span>
<span class="kn">import</span> <span class="nn">re</span>
<div class="viewcode-block" id="ddbg"><a class="viewcode-back" href="../../terminatorlib.html#terminatorlib.debugserver.ddbg">[docs]</a><span class="k">def</span> <span class="nf">ddbg</span><span class="p">(</span><span class="n">msg</span><span class="p">):</span>
<span class="c"># uncomment this to get lots of spam from debugserver</span>
<span class="k">return</span>
<span class="n">dbg</span><span class="p">(</span><span class="n">msg</span><span class="p">)</span>
</div>
<div class="viewcode-block" id="PythonConsoleServer"><a class="viewcode-back" href="../../terminatorlib.html#terminatorlib.debugserver.PythonConsoleServer">[docs]</a><span class="k">class</span> <span class="nc">PythonConsoleServer</span><span class="p">(</span><span class="n">SocketServer</span><span class="o">.</span><span class="n">BaseRequestHandler</span><span class="p">):</span>
<span class="n">env</span> <span class="o">=</span> <span class="bp">None</span>
<div class="viewcode-block" id="PythonConsoleServer.setup"><a class="viewcode-back" href="../../terminatorlib.html#terminatorlib.debugserver.PythonConsoleServer.setup">[docs]</a> <span class="k">def</span> <span class="nf">setup</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="n">dbg</span><span class="p">(</span><span class="s">&#39;debugserver: connect from </span><span class="si">%s</span><span class="s">&#39;</span> <span class="o">%</span> <span class="nb">str</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">client_address</span><span class="p">))</span>
<span class="n">ddbg</span><span class="p">(</span><span class="s">&#39;debugserver: env=</span><span class="si">%r</span><span class="s">&#39;</span> <span class="o">%</span> <span class="n">PythonConsoleServer</span><span class="o">.</span><span class="n">env</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">console</span> <span class="o">=</span> <span class="n">TerminatorConsole</span><span class="p">(</span><span class="n">PythonConsoleServer</span><span class="o">.</span><span class="n">env</span><span class="p">)</span>
</div>
<div class="viewcode-block" id="PythonConsoleServer.handle"><a class="viewcode-back" href="../../terminatorlib.html#terminatorlib.debugserver.PythonConsoleServer.handle">[docs]</a> <span class="k">def</span> <span class="nf">handle</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="n">ddbg</span><span class="p">(</span><span class="s">&quot;debugserver: handling&quot;</span><span class="p">)</span>
<span class="k">try</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">socketio</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">request</span><span class="o">.</span><span class="n">makefile</span><span class="p">()</span>
<span class="n">sys</span><span class="o">.</span><span class="n">stdout</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">socketio</span>
<span class="n">sys</span><span class="o">.</span><span class="n">stdin</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">socketio</span>
<span class="n">sys</span><span class="o">.</span><span class="n">stderr</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">socketio</span>
<span class="bp">self</span><span class="o">.</span><span class="n">console</span><span class="o">.</span><span class="n">run</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
<span class="k">finally</span><span class="p">:</span>
<span class="n">sys</span><span class="o">.</span><span class="n">stdout</span> <span class="o">=</span> <span class="n">sys</span><span class="o">.</span><span class="n">__stdout__</span>
<span class="n">sys</span><span class="o">.</span><span class="n">stdin</span> <span class="o">=</span> <span class="n">sys</span><span class="o">.</span><span class="n">__stdin__</span>
<span class="n">sys</span><span class="o">.</span><span class="n">stderr</span> <span class="o">=</span> <span class="n">sys</span><span class="o">.</span><span class="n">__stderr__</span>
<span class="bp">self</span><span class="o">.</span><span class="n">socketio</span><span class="o">.</span><span class="n">close</span><span class="p">()</span>
<span class="n">ddbg</span><span class="p">(</span><span class="s">&quot;debugserver: done handling&quot;</span><span class="p">)</span>
</div>
<div class="viewcode-block" id="PythonConsoleServer.verify_request"><a class="viewcode-back" href="../../terminatorlib.html#terminatorlib.debugserver.PythonConsoleServer.verify_request">[docs]</a> <span class="k">def</span> <span class="nf">verify_request</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">request</span><span class="p">,</span> <span class="n">client_address</span><span class="p">):</span>
<span class="k">return</span> <span class="bp">True</span>
</div>
<div class="viewcode-block" id="PythonConsoleServer.finish"><a class="viewcode-back" href="../../terminatorlib.html#terminatorlib.debugserver.PythonConsoleServer.finish">[docs]</a> <span class="k">def</span> <span class="nf">finish</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="n">ddbg</span><span class="p">(</span><span class="s">&#39;debugserver: disconnect from </span><span class="si">%s</span><span class="s">&#39;</span> <span class="o">%</span> <span class="nb">str</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">client_address</span><span class="p">))</span>
<span class="c"># rfc1116/rfc1184</span></div></div>
<span class="n">LINEMODE</span> <span class="o">=</span> <span class="nb">chr</span><span class="p">(</span><span class="mi">34</span><span class="p">)</span> <span class="c"># Linemode negotiation</span>
<span class="n">NULL</span> <span class="o">=</span> <span class="nb">chr</span><span class="p">(</span><span class="mi">0</span><span class="p">)</span>
<span class="n">ECHO</span> <span class="o">=</span> <span class="nb">chr</span><span class="p">(</span><span class="mi">1</span><span class="p">)</span>
<span class="n">CR</span> <span class="o">=</span> <span class="nb">chr</span><span class="p">(</span><span class="mi">13</span><span class="p">)</span>
<span class="n">LF</span> <span class="o">=</span> <span class="nb">chr</span><span class="p">(</span><span class="mi">10</span><span class="p">)</span>
<span class="n">SE</span> <span class="o">=</span> <span class="nb">chr</span><span class="p">(</span><span class="mi">240</span><span class="p">)</span> <span class="c"># End subnegotiation</span>
<span class="n">NOP</span> <span class="o">=</span> <span class="nb">chr</span><span class="p">(</span><span class="mi">241</span><span class="p">)</span>
<span class="n">DM</span> <span class="o">=</span> <span class="nb">chr</span><span class="p">(</span><span class="mi">242</span><span class="p">)</span> <span class="c"># Data Mark</span>
<span class="n">BRK</span> <span class="o">=</span> <span class="nb">chr</span><span class="p">(</span><span class="mi">243</span><span class="p">)</span> <span class="c"># Break</span>
<span class="n">IP</span> <span class="o">=</span> <span class="nb">chr</span><span class="p">(</span><span class="mi">244</span><span class="p">)</span> <span class="c"># Interrupt Process</span>
<span class="n">AO</span> <span class="o">=</span> <span class="nb">chr</span><span class="p">(</span><span class="mi">245</span><span class="p">)</span> <span class="c"># Abort Output</span>
<span class="n">AYT</span> <span class="o">=</span> <span class="nb">chr</span><span class="p">(</span><span class="mi">246</span><span class="p">)</span> <span class="c"># Are You There</span>
<span class="n">EC</span> <span class="o">=</span> <span class="nb">chr</span><span class="p">(</span><span class="mi">247</span><span class="p">)</span> <span class="c"># Erase Character</span>
<span class="n">EL</span> <span class="o">=</span> <span class="nb">chr</span><span class="p">(</span><span class="mi">248</span><span class="p">)</span> <span class="c"># Erase Line</span>
<span class="n">GA</span> <span class="o">=</span> <span class="nb">chr</span><span class="p">(</span><span class="mi">249</span><span class="p">)</span> <span class="c"># Go Ahead</span>
<span class="n">SB</span> <span class="o">=</span> <span class="nb">chr</span><span class="p">(</span><span class="mi">250</span><span class="p">)</span> <span class="c"># Subnegotiation follows</span>
<span class="n">WILL</span> <span class="o">=</span> <span class="nb">chr</span><span class="p">(</span><span class="mi">251</span><span class="p">)</span> <span class="c"># Subnegotiation commands</span>
<span class="n">WONT</span> <span class="o">=</span> <span class="nb">chr</span><span class="p">(</span><span class="mi">252</span><span class="p">)</span>
<span class="n">DO</span> <span class="o">=</span> <span class="nb">chr</span><span class="p">(</span><span class="mi">253</span><span class="p">)</span>
<span class="n">DONT</span> <span class="o">=</span> <span class="nb">chr</span><span class="p">(</span><span class="mi">254</span><span class="p">)</span>
<span class="n">IAC</span> <span class="o">=</span> <span class="nb">chr</span><span class="p">(</span><span class="mi">255</span><span class="p">)</span> <span class="c"># Interpret As Command</span>
<span class="n">UIAC</span> <span class="o">=</span> <span class="s">&#39;(^|[^&#39;</span> <span class="o">+</span> <span class="n">IAC</span> <span class="o">+</span> <span class="s">&#39;])&#39;</span> <span class="o">+</span> <span class="n">IAC</span> <span class="c"># Unescaped IAC</span>
<span class="n">BareLF</span> <span class="o">=</span> <span class="n">re</span><span class="o">.</span><span class="n">compile</span><span class="p">(</span><span class="s">&#39;([^&#39;</span> <span class="o">+</span> <span class="n">CR</span> <span class="o">+</span> <span class="s">&#39;])&#39;</span> <span class="o">+</span> <span class="n">CR</span><span class="p">)</span>
<span class="n">DoDont</span> <span class="o">=</span> <span class="n">re</span><span class="o">.</span><span class="n">compile</span><span class="p">(</span><span class="n">UIAC</span> <span class="o">+</span><span class="s">&#39;[&#39;</span> <span class="o">+</span> <span class="n">DO</span> <span class="o">+</span> <span class="n">DONT</span> <span class="o">+</span> <span class="s">&#39;](.)&#39;</span><span class="p">)</span>
<span class="n">WillWont</span> <span class="o">=</span> <span class="n">re</span><span class="o">.</span><span class="n">compile</span><span class="p">(</span><span class="n">UIAC</span> <span class="o">+</span> <span class="s">&#39;[&#39;</span> <span class="o">+</span> <span class="n">WILL</span> <span class="o">+</span> <span class="n">WONT</span> <span class="o">+</span> <span class="s">&#39;](.)&#39;</span><span class="p">)</span>
<span class="n">AreYouThere</span> <span class="o">=</span> <span class="n">re</span><span class="o">.</span><span class="n">compile</span><span class="p">(</span><span class="n">UIAC</span> <span class="o">+</span> <span class="n">AYT</span><span class="p">)</span>
<span class="n">IpTelnet</span> <span class="o">=</span> <span class="n">re</span><span class="o">.</span><span class="n">compile</span><span class="p">(</span><span class="n">UIAC</span> <span class="o">+</span> <span class="n">IP</span><span class="p">)</span>
<span class="n">OtherTelnet</span> <span class="o">=</span> <span class="n">re</span><span class="o">.</span><span class="n">compile</span><span class="p">(</span><span class="n">UIAC</span> <span class="o">+</span> <span class="s">&#39;[^&#39;</span> <span class="o">+</span> <span class="n">IAC</span> <span class="o">+</span> <span class="s">&#39;]&#39;</span><span class="p">)</span>
<span class="c"># See http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-talk/205335 for telnet bits</span>
<span class="c"># Python doesn&#39;t make this an especially neat conversion :(</span>
<div class="viewcode-block" id="TerminatorConsole"><a class="viewcode-back" href="../../terminatorlib.html#terminatorlib.debugserver.TerminatorConsole">[docs]</a><span class="k">class</span> <span class="nc">TerminatorConsole</span><span class="p">(</span><span class="n">code</span><span class="o">.</span><span class="n">InteractiveConsole</span><span class="p">):</span>
<div class="viewcode-block" id="TerminatorConsole.parse_telnet"><a class="viewcode-back" href="../../terminatorlib.html#terminatorlib.debugserver.TerminatorConsole.parse_telnet">[docs]</a> <span class="k">def</span> <span class="nf">parse_telnet</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">data</span><span class="p">):</span>
<span class="n">odata</span> <span class="o">=</span> <span class="n">data</span>
<span class="n">data</span> <span class="o">=</span> <span class="n">re</span><span class="o">.</span><span class="n">sub</span><span class="p">(</span><span class="n">BareLF</span><span class="p">,</span> <span class="s">&#39;</span><span class="se">\\</span><span class="s">1&#39;</span><span class="p">,</span> <span class="n">data</span><span class="p">)</span>
<span class="n">data</span> <span class="o">=</span> <span class="n">data</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="n">CR</span> <span class="o">+</span> <span class="n">NULL</span><span class="p">,</span> <span class="s">&#39;&#39;</span><span class="p">)</span>
<span class="n">data</span> <span class="o">=</span> <span class="n">data</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="n">NULL</span><span class="p">,</span> <span class="s">&#39;&#39;</span><span class="p">)</span>
<span class="n">bits</span> <span class="o">=</span> <span class="n">re</span><span class="o">.</span><span class="n">findall</span><span class="p">(</span><span class="n">DoDont</span><span class="p">,</span> <span class="n">data</span><span class="p">)</span>
<span class="n">ddbg</span><span class="p">(</span><span class="s">&quot;bits = </span><span class="si">%r</span><span class="s">&quot;</span> <span class="o">%</span> <span class="n">bits</span><span class="p">)</span>
<span class="k">if</span> <span class="n">bits</span><span class="p">:</span>
<span class="n">data</span> <span class="o">=</span> <span class="n">re</span><span class="o">.</span><span class="n">sub</span><span class="p">(</span><span class="n">DoDont</span><span class="p">,</span> <span class="s">&#39;</span><span class="se">\\</span><span class="s">1&#39;</span><span class="p">,</span> <span class="n">data</span><span class="p">)</span>
<span class="n">ddbg</span><span class="p">(</span><span class="s">&quot;telnet: DO/DON&#39;T answer&quot;</span><span class="p">)</span>
<span class="c"># answer DO and DON&#39;T with WON&#39;T</span>
<span class="k">for</span> <span class="n">bit</span> <span class="ow">in</span> <span class="n">bits</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="n">IAC</span> <span class="o">+</span> <span class="n">WONT</span> <span class="o">+</span> <span class="n">bit</span><span class="p">[</span><span class="mi">1</span><span class="p">])</span>
<span class="n">bits</span> <span class="o">=</span> <span class="n">re</span><span class="o">.</span><span class="n">findall</span><span class="p">(</span><span class="n">WillWont</span><span class="p">,</span> <span class="n">data</span><span class="p">)</span>
<span class="k">if</span> <span class="n">bits</span><span class="p">:</span>
<span class="n">data</span> <span class="o">=</span> <span class="n">re</span><span class="o">.</span><span class="n">sub</span><span class="p">(</span><span class="n">WillWont</span><span class="p">,</span> <span class="s">&#39;</span><span class="se">\\</span><span class="s">1&#39;</span><span class="p">,</span> <span class="n">data</span><span class="p">)</span>
<span class="n">ddbg</span><span class="p">(</span><span class="s">&quot;telnet: WILL/WON&#39;T answer&quot;</span><span class="p">)</span>
<span class="k">for</span> <span class="n">bit</span> <span class="ow">in</span> <span class="n">bits</span><span class="p">:</span>
<span class="c"># answer WILLs and WON&#39;T with DON&#39;Ts</span>
<span class="bp">self</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="n">IAC</span> <span class="o">+</span> <span class="n">DONT</span> <span class="o">+</span> <span class="n">bit</span><span class="p">[</span><span class="mi">1</span><span class="p">])</span>
<span class="n">bits</span> <span class="o">=</span> <span class="n">re</span><span class="o">.</span><span class="n">findall</span><span class="p">(</span><span class="n">AreYouThere</span><span class="p">,</span> <span class="n">data</span><span class="p">)</span>
<span class="k">if</span> <span class="n">bits</span><span class="p">:</span>
<span class="n">ddbg</span><span class="p">(</span><span class="s">&quot;telnet: am I there answer&quot;</span><span class="p">)</span>
<span class="n">data</span> <span class="o">=</span> <span class="n">re</span><span class="o">.</span><span class="n">sub</span><span class="p">(</span><span class="n">AreYouThere</span><span class="p">,</span> <span class="s">&#39;</span><span class="se">\\</span><span class="s">1&#39;</span><span class="p">,</span> <span class="n">data</span><span class="p">)</span>
<span class="k">for</span> <span class="n">bit</span> <span class="ow">in</span> <span class="n">bits</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="s">&quot;Yes, I&#39;m still here, I think.</span><span class="se">\n</span><span class="s">&quot;</span><span class="p">)</span>
<span class="p">(</span><span class="n">data</span><span class="p">,</span> <span class="n">interrupts</span><span class="p">)</span> <span class="o">=</span> <span class="n">re</span><span class="o">.</span><span class="n">subn</span><span class="p">(</span><span class="n">IpTelnet</span><span class="p">,</span> <span class="s">&#39;</span><span class="se">\\</span><span class="s">1&#39;</span><span class="p">,</span> <span class="n">data</span><span class="p">)</span>
<span class="k">if</span> <span class="n">interrupts</span><span class="p">:</span>
<span class="n">ddbg</span><span class="p">(</span><span class="s">&quot;debugserver: Ctrl-C detected&quot;</span><span class="p">)</span>
<span class="k">raise</span> <span class="ne">KeyboardInterrupt</span>
<span class="n">data</span> <span class="o">=</span> <span class="n">re</span><span class="o">.</span><span class="n">sub</span><span class="p">(</span><span class="n">OtherTelnet</span><span class="p">,</span> <span class="s">&#39;</span><span class="se">\\</span><span class="s">1&#39;</span><span class="p">,</span> <span class="n">data</span><span class="p">)</span> <span class="c"># and any other Telnet codes</span>
<span class="n">data</span> <span class="o">=</span> <span class="n">data</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="n">IAC</span> <span class="o">+</span> <span class="n">IAC</span><span class="p">,</span> <span class="n">IAC</span><span class="p">)</span> <span class="c"># and handle escapes</span>
<span class="k">if</span> <span class="n">data</span> <span class="o">!=</span> <span class="n">odata</span><span class="p">:</span>
<span class="n">ddbg</span><span class="p">(</span><span class="s">&quot;debugserver: Replaced </span><span class="si">%r</span><span class="s"> with </span><span class="si">%r</span><span class="s">&quot;</span> <span class="o">%</span> <span class="p">(</span><span class="n">odata</span><span class="p">,</span> <span class="n">data</span><span class="p">))</span>
<span class="k">return</span> <span class="n">data</span>
</div>
<div class="viewcode-block" id="TerminatorConsole.raw_input"><a class="viewcode-back" href="../../terminatorlib.html#terminatorlib.debugserver.TerminatorConsole.raw_input">[docs]</a> <span class="k">def</span> <span class="nf">raw_input</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">prompt</span> <span class="o">=</span> <span class="bp">None</span><span class="p">):</span>
<span class="n">ddbg</span><span class="p">(</span><span class="s">&quot;debugserver: raw_input prompt = </span><span class="si">%r</span><span class="s">&quot;</span> <span class="o">%</span> <span class="n">prompt</span><span class="p">)</span>
<span class="k">if</span> <span class="n">prompt</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="n">prompt</span><span class="p">)</span>
<span class="n">buf</span> <span class="o">=</span> <span class="s">&#39;&#39;</span>
<span class="n">compstate</span> <span class="o">=</span> <span class="mi">0</span>
<span class="k">while</span> <span class="bp">True</span><span class="p">:</span>
<span class="n">data</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">server</span><span class="o">.</span><span class="n">socketio</span><span class="o">.</span><span class="n">read</span><span class="p">(</span><span class="mi">1</span><span class="p">)</span>
<span class="n">ddbg</span><span class="p">(</span><span class="s">&#39;raw_input: char=</span><span class="si">%r</span><span class="s">&#39;</span> <span class="o">%</span> <span class="n">data</span><span class="p">)</span>
<span class="k">if</span> <span class="n">data</span> <span class="o">==</span> <span class="n">LF</span> <span class="ow">or</span> <span class="n">data</span> <span class="o">==</span> <span class="s">&#39;</span><span class="se">\006</span><span class="s">&#39;</span><span class="p">:</span>
<span class="n">buf</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">parse_telnet</span><span class="p">(</span><span class="n">buf</span> <span class="o">+</span> <span class="n">data</span><span class="p">)</span>
<span class="k">if</span> <span class="n">buf</span> <span class="o">!=</span> <span class="s">&#39;&#39;</span><span class="p">:</span>
<span class="k">return</span> <span class="n">buf</span>
<span class="k">elif</span> <span class="n">data</span> <span class="o">==</span> <span class="s">&#39;</span><span class="se">\004</span><span class="s">&#39;</span> <span class="ow">or</span> <span class="n">data</span> <span class="o">==</span> <span class="s">&#39;&#39;</span><span class="p">:</span> <span class="c"># ^D</span>
<span class="k">raise</span> <span class="ne">EOFError</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">buf</span> <span class="o">+=</span> <span class="n">data</span>
</div>
<div class="viewcode-block" id="TerminatorConsole.write"><a class="viewcode-back" href="../../terminatorlib.html#terminatorlib.debugserver.TerminatorConsole.write">[docs]</a> <span class="k">def</span> <span class="nf">write</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">data</span><span class="p">):</span>
<span class="n">ddbg</span><span class="p">(</span><span class="s">&quot;debugserver: write </span><span class="si">%r</span><span class="s">&quot;</span> <span class="o">%</span> <span class="n">data</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">server</span><span class="o">.</span><span class="n">socketio</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="n">data</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">server</span><span class="o">.</span><span class="n">socketio</span><span class="o">.</span><span class="n">flush</span><span class="p">()</span>
</div>
<div class="viewcode-block" id="TerminatorConsole.run"><a class="viewcode-back" href="../../terminatorlib.html#terminatorlib.debugserver.TerminatorConsole.run">[docs]</a> <span class="k">def</span> <span class="nf">run</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">server</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">server</span> <span class="o">=</span> <span class="n">server</span>
<span class="bp">self</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="s">&quot;Welcome to the </span><span class="si">%s</span><span class="s">-</span><span class="si">%s</span><span class="s"> debug server, have a nice stay</span><span class="se">\n</span><span class="s">&quot;</span> <span class="o">%</span> <span class="p">(</span><span class="n">APP_NAME</span><span class="p">,</span> <span class="n">APP_VERSION</span><span class="p">))</span>
<span class="bp">self</span><span class="o">.</span><span class="n">interact</span><span class="p">()</span>
<span class="k">try</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="s">&quot;Time to go. Bye!</span><span class="se">\n</span><span class="s">&quot;</span><span class="p">)</span>
<span class="k">except</span><span class="p">:</span>
<span class="k">pass</span>
</div></div>
<div class="viewcode-block" id="spawn"><a class="viewcode-back" href="../../terminatorlib.html#terminatorlib.debugserver.spawn">[docs]</a><span class="k">def</span> <span class="nf">spawn</span><span class="p">(</span><span class="n">env</span><span class="p">):</span>
<span class="n">PythonConsoleServer</span><span class="o">.</span><span class="n">env</span> <span class="o">=</span> <span class="n">env</span>
<span class="n">tcpserver</span> <span class="o">=</span> <span class="n">SocketServer</span><span class="o">.</span><span class="n">TCPServer</span><span class="p">((</span><span class="s">&#39;127.0.0.1&#39;</span><span class="p">,</span> <span class="mi">0</span><span class="p">),</span> <span class="n">PythonConsoleServer</span><span class="p">)</span>
<span class="n">dbg</span><span class="p">(</span><span class="s">&quot;debugserver: listening on </span><span class="si">%s</span><span class="s">&quot;</span> <span class="o">%</span> <span class="nb">str</span><span class="p">(</span><span class="n">tcpserver</span><span class="o">.</span><span class="n">server_address</span><span class="p">))</span>
<span class="n">debugserver</span> <span class="o">=</span> <span class="n">threading</span><span class="o">.</span><span class="n">Thread</span><span class="p">(</span><span class="n">target</span><span class="o">=</span><span class="n">tcpserver</span><span class="o">.</span><span class="n">serve_forever</span><span class="p">,</span> <span class="n">name</span><span class="o">=</span><span class="s">&quot;DebugServer&quot;</span><span class="p">)</span>
<span class="n">debugserver</span><span class="o">.</span><span class="n">setDaemon</span><span class="p">(</span><span class="bp">True</span><span class="p">)</span>
<span class="n">debugserver</span><span class="o">.</span><span class="n">start</span><span class="p">()</span>
<span class="k">return</span><span class="p">(</span><span class="n">debugserver</span><span class="p">,</span> <span class="n">tcpserver</span><span class="p">)</span>
</pre></div></div>
</div>
<footer>
<hr/>
<div role="contentinfo">
<p>
&copy; Copyright 2015, Stephen Boddy, licensed under the CC-BY-SA..
</p>
</div>
Built with <a href="http://sphinx-doc.org/">Sphinx</a> using a <a href="https://github.com/snide/sphinx_rtd_theme">theme</a> provided by <a href="https://readthedocs.org">Read the Docs</a>.
</footer>
</div>
</div>
</section>
</div>
<script type="text/javascript">
var DOCUMENTATION_OPTIONS = {
URL_ROOT:'../../',
VERSION:'0.98',
COLLAPSE_INDEX:false,
FILE_SUFFIX:'.html',
HAS_SOURCE: true
};
</script>
<script type="text/javascript" src="../../_static/jquery.js"></script>
<script type="text/javascript" src="../../_static/underscore.js"></script>
<script type="text/javascript" src="../../_static/doctools.js"></script>
<script type="text/javascript" src="../../_static/js/theme.js"></script>
<script type="text/javascript">
jQuery(function () {
SphinxRtdTheme.StickyNav.enable();
});
</script>
</body>
</html>