File: //opt/alt/python27/lib/python2.7/site-packages/paste/debug/watchthreads.pyo
�
a�Nc @ s d Z d d l Z d d l Z d d l Z d d l Z d d l m Z d d l m Z d d l m
Z
d d l m Z m
Z
d d l m Z m Z e d d d
�Z d e f d � � YZ d
� Z d g Z d � Z d � Z d � Z e d � Z e j e _ d d � Z d S( sv
Watches the key ``paste.httpserver.thread_pool`` to see how many
threads there are and report on any wedged threads.
i����N( t StringIO( t get_ident( t httpexceptions( t
construct_urlt parse_formvars( t HTMLTemplatet bunchsv
<html>
<head>
<style type="text/css">
body {
font-family: sans-serif;
}
table.environ tr td {
border-bottom: #bbb 1px solid;
}
table.environ tr td.bottom {
border-bottom: none;
}
table.thread {
border: 1px solid #000;
margin-bottom: 1em;
}
table.thread tr td {
border-bottom: #999 1px solid;
padding-right: 1em;
}
table.thread tr td.bottom {
border-bottom: none;
}
table.thread tr.this_thread td {
background-color: #006;
color: #fff;
}
a.button {
background-color: #ddd;
border: #aaa outset 2px;
text-decoration: none;
margin-top: 10px;
font-size: 80%;
color: #000;
}
a.button:hover {
background-color: #eee;
border: #bbb outset 2px;
}
a.button:active {
border: #bbb inset 2px;
}
</style>
<title>{{title}}</title>
</head>
<body>
<h1>{{title}}</h1>
{{if kill_thread_id}}
<div style="background-color: #060; color: #fff;
border: 2px solid #000;">
Thread {{kill_thread_id}} killed
</div>
{{endif}}
<div>Pool size: {{nworkers}}
{{if actual_workers > nworkers}}
+ {{actual_workers-nworkers}} extra
{{endif}}
({{nworkers_used}} used including current request)<br>
idle: {{len(track_threads["idle"])}},
busy: {{len(track_threads["busy"])}},
hung: {{len(track_threads["hung"])}},
dying: {{len(track_threads["dying"])}},
zombie: {{len(track_threads["zombie"])}}</div>
{{for thread in threads}}
<table class="thread">
<tr {{if thread.thread_id == this_thread_id}}class="this_thread"{{endif}}>
<td>
<b>Thread</b>
{{if thread.thread_id == this_thread_id}}
(<i>this</i> request)
{{endif}}</td>
<td>
<b>{{thread.thread_id}}
{{if allow_kill}}
<form action="{{script_name}}/kill" method="POST"
style="display: inline">
<input type="hidden" name="thread_id" value="{{thread.thread_id}}">
<input type="submit" value="kill">
</form>
{{endif}}
</b>
</td>
</tr>
<tr>
<td>Time processing request</td>
<td>{{thread.time_html|html}}</td>
</tr>
<tr>
<td>URI</td>
<td>{{if thread.uri == 'unknown'}}
unknown
{{else}}<a href="{{thread.uri}}">{{thread.uri_short}}</a>
{{endif}}
</td>
<tr>
<td colspan="2" class="bottom">
<a href="#" class="button" style="width: 9em; display: block"
onclick="
var el = document.getElementById('environ-{{thread.thread_id}}');
if (el.style.display) {
el.style.display = '';
this.innerHTML = '▾ Hide environ';
} else {
el.style.display = 'none';
this.innerHTML = '▸ Show environ';
}
return false
">▸ Show environ</a>
<div id="environ-{{thread.thread_id}}" style="display: none">
{{if thread.environ:}}
<table class="environ">
{{for loop, item in looper(sorted(thread.environ.items()))}}
{{py:key, value=item}}
<tr>
<td {{if loop.last}}class="bottom"{{endif}}>{{key}}</td>
<td {{if loop.last}}class="bottom"{{endif}}>{{value}}</td>
</tr>
{{endfor}}
</table>
{{else}}
Thread is in process of starting
{{endif}}
</div>
{{if thread.traceback}}
<a href="#" class="button" style="width: 9em; display: block"
onclick="
var el = document.getElementById('traceback-{{thread.thread_id}}');
if (el.style.display) {
el.style.display = '';
this.innerHTML = '▾ Hide traceback';
} else {
el.style.display = 'none';
this.innerHTML = '▸ Show traceback';
}
return false
">▸ Show traceback</a>
<div id="traceback-{{thread.thread_id}}" style="display: none">
<pre class="traceback">{{thread.traceback}}</pre>
</div>
{{endif}}
</td>
</tr>
</table>
{{endfor}}
</body>
</html>
t names watchthreads.page_templatet WatchThreadsc B s5 e Z d Z e d � Z d � Z d � Z d � Z RS( si
Application that watches the threads in ``paste.httpserver``,
showing the length each thread has been working on a request.
If allow_kill is true, then you can kill errant threads through
this application.
This application can expose private information (specifically in
the environment, like cookies), so it should be protected.
c C s
| | _ d S( N( t
allow_kill( t selfR ( ( sI /opt/alt/python27/lib/python2.7/site-packages/paste/debug/watchthreads.pyt __init__� s c C s\ d | k r# | d d g � d g S| j d � d k rH | j | | � S| j | | � Sd S( Ns paste.httpserver.thread_pools
403 Forbiddens Content-types
text/plainsC You must use the threaded Paste HTTP server to use this applicationt PATH_INFOs /kill( s Content-types
text/plain( t gett killt show( R
t environt start_response( ( sI /opt/alt/python27/lib/python2.7/site-packages/paste/debug/watchthreads.pyt __call__� s c C s� | d d g � t | � } | j d � r8 | d } n d } | d } | j } t j � } | j j � } | j d d � � g } x� | D]� \ }
\ } } t � }
| j |
� | r� t
| � |
_ n d |
_ |
|
_ t
| | � |
_ t |
j � |
_ | |
_ t |
� |
_ q� Wt j d d
d | d t | j � d
t | � d | d d | d | j d | d t � d | j � �
} | g S( Ns 200 OKs Content-types text/htmlR s paste.httpserver.thread_poolt keyc S s | d d S( Ni i ( ( t v( ( sI /opt/alt/python27/lib/python2.7/site-packages/paste/debug/watchthreads.pyt <lambda>� s t unknownt titles Thread Pool Worker Trackert nworkerst actual_workerst
nworkers_usedt script_namet SCRIPT_NAMEt kill_thread_idR t threadst this_thread_idt
track_threads( s Content-types text/html( R R
t NoneR t timet worker_trackert itemst sortR t appendR t urit thread_idt format_timet time_htmlt shortent uri_shortR t traceback_threadt tracebackt
page_templatet
substitutet lent workersR R R ( R
R R t formR t thread_poolR t nowR2 R R( t time_startedt worker_environt threadt page( ( sI /opt/alt/python27/lib/python2.7/site-packages/paste/debug/watchthreads.pyR � sD
c C s� | j s% t j d � } | | | � St | � } t | d � } | d } | | j k rz t j d | � } | | | � S| j | � | d p� d } t j d d | d | f g � } | | | � S(
Ns? Killing threads has not been enabled. Shame on you for trying!R( s paste.httpserver.thread_poolsB You tried to kill thread %s, but it is not working on any requestsR t /t headerst Locations ?kill=%s( R R t
HTTPForbiddenR t intR# t PreconditionFailedt kill_workert HTTPFound( R
R R t exct varsR( R4 R ( ( sI /opt/alt/python27/lib/python2.7/site-packages/paste/debug/watchthreads.pyR � s"